summaryrefslogtreecommitdiff
path: root/sprite.c
diff options
context:
space:
mode:
authortron <tron@openttd.org>2004-11-17 08:52:47 +0000
committertron <tron@openttd.org>2004-11-17 08:52:47 +0000
commit13f0b6c0cf754184cfef8645e709f10240da5f98 (patch)
tree71bd164389e546b1a8a5c1c879b57c1574cb95d2 /sprite.c
parent0086bb9d0678876e2e3e9b4002a0f44af2c45ee4 (diff)
downloadopenttd-13f0b6c0cf754184cfef8645e709f10240da5f98.tar.xz
(svn r654) Hopefully complete support for randomized variational spritegroups (i.e. the cars transporter in DBSetXL gets different cars each time) (pasky)
Diffstat (limited to 'sprite.c')
-rw-r--r--sprite.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/sprite.c b/sprite.c
index 23a21f1b1..2bad7fcfd 100644
--- a/sprite.c
+++ b/sprite.c
@@ -60,3 +60,40 @@ int GetDeterministicSpriteValue(byte var)
return -1;
}
}
+
+struct SpriteGroup *
+EvalRandomizedSpriteGroup(struct RandomizedSpriteGroup *rsg, byte random_bits)
+{
+ byte mask;
+ byte index;
+
+ /* Noone likes mangling with bits, but you don't get around it here.
+ * Sorry. --pasky */
+ // rsg->num_groups is always power of 2
+ mask = (rsg->num_groups - 1) << rsg->lowest_randbit;
+ index = (random_bits & mask) >> rsg->lowest_randbit;
+ assert(index < rsg->num_groups);
+ return &rsg->groups[index];
+}
+
+byte RandomizedSpriteGroupTriggeredBits(struct RandomizedSpriteGroup *rsg, byte triggers,
+ byte *waiting_triggers)
+{
+ byte match = rsg->triggers & (*waiting_triggers | triggers);
+ bool res;
+
+ if (rsg->cmp_mode == RSG_CMP_ANY) {
+ res = (match != 0);
+ } else { /* RSG_CMP_ALL */
+ res = (match == rsg->triggers);
+ }
+
+ if (!res) {
+ *waiting_triggers |= triggers;
+ return 0;
+ }
+
+ *waiting_triggers &= ~match;
+
+ return (rsg->num_groups - 1) << rsg->lowest_randbit;
+}