darkvater@414: #include "stdafx.h" darkvater@414: darkvater@414: #include darkvater@414: darkvater@414: #include "ttd.h" darkvater@414: #include "sprite.h" darkvater@414: darkvater@414: darkvater@414: struct SpriteGroup *EvalDeterministicSpriteGroup(struct 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++) { darkvater@414: struct 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: }