diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -76,6 +76,8 @@ void InitializeSpriteGroupPool() _spritegroup_count = 0; } +static uint32 _temp_store[0x110]; + static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) { @@ -96,6 +98,8 @@ static inline uint32 GetVariable(const R case 0x1C: return object->last_value; case 0x20: return _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF; + case 0x7D: return _temp_store[parameter]; + /* Not a common variable, so evalute the feature specific variables */ default: return object->GetVariable(object, variable, parameter, available); } @@ -133,6 +137,10 @@ static U EvalAdjustT(const Deterministic case DSGA_OP_AND: return last_value & value; case DSGA_OP_OR: return last_value | value; case DSGA_OP_XOR: return last_value ^ value; + case DSGA_OP_STO: + if (value < lengthof(_temp_store)) _temp_store[value] = last_value; + return last_value; + case DSGA_OP_RST: return value; default: return value; } } diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -60,6 +60,8 @@ enum DeterministicSpriteGroupAdjustOpera DSGA_OP_AND, ///< a & b DSGA_OP_OR, ///< a | b DSGA_OP_XOR, ///< a ^ b + DSGA_OP_STO, ///< store a into temporary storage, indexed by b. return a + DSGA_OP_RST, ///< return b };