diff options
author | tron <tron@openttd.org> | 2004-11-17 08:52:47 +0000 |
---|---|---|
committer | tron <tron@openttd.org> | 2004-11-17 08:52:47 +0000 |
commit | 13f0b6c0cf754184cfef8645e709f10240da5f98 (patch) | |
tree | 71bd164389e546b1a8a5c1c879b57c1574cb95d2 /sprite.c | |
parent | 0086bb9d0678876e2e3e9b4002a0f44af2c45ee4 (diff) | |
download | openttd-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.c | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -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; +} |