darkvater@414: #include "stdafx.h" darkvater@414: darkvater@414: #include darkvater@414: Darkvater@1891: #include "openttd.h" darkvater@414: #include "sprite.h" darkvater@414: darkvater@414: tron@1477: SpriteGroup *EvalDeterministicSpriteGroup(DeterministicSpriteGroup *dsg, int value) darkvater@414: { darkvater@414: int i; darkvater@414: darkvater@414: value >>= dsg->shift_num; // This should bring us to the byte range. darkvater@414: value &= dsg->and_mask; darkvater@414: darkvater@414: if (dsg->operation != DSG_OP_NONE) darkvater@414: value += (signed char) dsg->add_val; darkvater@414: darkvater@414: switch (dsg->operation) { darkvater@414: case DSG_OP_DIV: darkvater@414: value /= (signed char) dsg->divmod_val; darkvater@414: break; darkvater@414: case DSG_OP_MOD: darkvater@414: value %= (signed char) dsg->divmod_val; darkvater@414: break; darkvater@414: case DSG_OP_NONE: darkvater@414: break; darkvater@414: } darkvater@414: darkvater@414: for (i = 0; i < dsg->num_ranges; i++) { tron@1477: DeterministicSpriteGroupRange *range = &dsg->ranges[i]; darkvater@414: darkvater@414: if (range->low <= value && value <= range->high) darkvater@414: return &range->group; darkvater@414: } darkvater@414: darkvater@414: return dsg->default_group; darkvater@414: } darkvater@414: darkvater@414: int GetDeterministicSpriteValue(byte var) darkvater@414: { darkvater@414: switch (var) { darkvater@414: case 0x00: darkvater@414: return _date; darkvater@414: case 0x01: darkvater@414: return _cur_year; darkvater@414: case 0x02: darkvater@414: return _cur_month; darkvater@414: case 0x03: darkvater@414: return _opt.landscape; darkvater@414: case 0x09: darkvater@414: return _date_fract; darkvater@414: case 0x0A: darkvater@414: return _tick_counter; darkvater@414: case 0x0C: darkvater@414: /* If we got here, it means there was no callback or darkvater@414: * callbacks aren't supported on our callpath. */ darkvater@414: return 0; darkvater@414: default: darkvater@414: return -1; darkvater@414: } darkvater@414: } tron@445: tron@1477: SpriteGroup *EvalRandomizedSpriteGroup(RandomizedSpriteGroup *rsg, byte random_bits) tron@445: { tron@445: byte mask; tron@445: byte index; tron@445: tron@445: /* Noone likes mangling with bits, but you don't get around it here. tron@445: * Sorry. --pasky */ tron@445: // rsg->num_groups is always power of 2 tron@445: mask = (rsg->num_groups - 1) << rsg->lowest_randbit; tron@445: index = (random_bits & mask) >> rsg->lowest_randbit; tron@445: assert(index < rsg->num_groups); tron@445: return &rsg->groups[index]; tron@445: } tron@445: tron@1477: byte RandomizedSpriteGroupTriggeredBits(RandomizedSpriteGroup *rsg, tron@1477: byte triggers, byte *waiting_triggers) tron@445: { tron@445: byte match = rsg->triggers & (*waiting_triggers | triggers); tron@445: bool res; tron@445: tron@445: if (rsg->cmp_mode == RSG_CMP_ANY) { tron@445: res = (match != 0); tron@445: } else { /* RSG_CMP_ALL */ tron@445: res = (match == rsg->triggers); tron@445: } tron@445: tron@445: if (!res) { tron@445: *waiting_triggers |= triggers; tron@445: return 0; tron@445: } tron@445: tron@445: *waiting_triggers &= ~match; tron@445: tron@445: return (rsg->num_groups - 1) << rsg->lowest_randbit; tron@445: }