(svn r22563) -Codechange: Use a function for storing values inside the persistent storage.

pull/155/head
terkhen 13 years ago
parent 713acf1ad3
commit ac4f4447e0

@ -184,6 +184,19 @@ static void AirportSetTriggers(const ResolverObject *object, int triggers)
{ {
} }
/**
* Store a value into the object's persistent storage.
* @param object Object that we want to query.
* @param pos Position in the persistent storage to use.
* @param value Value to store.
*/
void AirportStorePSA(ResolverObject *object, uint pos, int32 value)
{
Station *st = object->u.airport.st;
if (object->scope != VSG_SCOPE_SELF || st == NULL) return;
st->airport.psa.Store(pos, value);
}
static void NewAirportResolver(ResolverObject *res, TileIndex tile, Station *st, byte airport_id, byte layout) static void NewAirportResolver(ResolverObject *res, TileIndex tile, Station *st, byte airport_id, byte layout)
{ {
res->GetRandomBits = AirportGetRandomBits; res->GetRandomBits = AirportGetRandomBits;
@ -191,8 +204,8 @@ static void NewAirportResolver(ResolverObject *res, TileIndex tile, Station *st,
res->SetTriggers = AirportSetTriggers; res->SetTriggers = AirportSetTriggers;
res->GetVariable = AirportGetVariable; res->GetVariable = AirportGetVariable;
res->ResolveReal = AirportResolveReal; res->ResolveReal = AirportResolveReal;
res->StorePSA = AirportStorePSA;
res->psa = st != NULL ? &st->airport.psa : NULL;
res->u.airport.st = st; res->u.airport.st = st;
res->u.airport.airport_id = airport_id; res->u.airport.airport_id = airport_id;
res->u.airport.layout = layout; res->u.airport.layout = layout;

@ -228,9 +228,9 @@ static void AirportTileResolver(ResolverObject *res, const AirportTileSpec *ats,
res->SetTriggers = NULL; res->SetTriggers = NULL;
res->GetVariable = AirportTileGetVariable; res->GetVariable = AirportTileGetVariable;
res->ResolveReal = AirportTileResolveReal; res->ResolveReal = AirportTileResolveReal;
res->StorePSA = NULL;
assert(st != NULL); assert(st != NULL);
res->psa = NULL;
res->u.airport.airport_id = st->airport.type; res->u.airport.airport_id = st->airport.type;
res->u.airport.st = st; res->u.airport.st = st;
res->u.airport.tile = tile; res->u.airport.tile = tile;

@ -376,6 +376,19 @@ static void IndustrySetTriggers(const ResolverObject *object, int triggers)
ind->random_triggers = triggers; ind->random_triggers = triggers;
} }
/**
* Store a value into the object's persistent storage.
* @param object Object that we want to query.
* @param pos Position in the persistent storage to use.
* @param value Value to store.
*/
void IndustryStorePSA(ResolverObject *object, uint pos, int32 value)
{
Industry *ind = object->u.industry.ind;
if (object->scope != VSG_SCOPE_SELF || ind->index == INVALID_INDUSTRY) return;
ind->psa.Store(pos, value);
}
static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *indus, IndustryType type) static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *indus, IndustryType type)
{ {
res->GetRandomBits = IndustryGetRandomBits; res->GetRandomBits = IndustryGetRandomBits;
@ -383,8 +396,8 @@ static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *i
res->SetTriggers = IndustrySetTriggers; res->SetTriggers = IndustrySetTriggers;
res->GetVariable = IndustryGetVariable; res->GetVariable = IndustryGetVariable;
res->ResolveReal = IndustryResolveReal; res->ResolveReal = IndustryResolveReal;
res->StorePSA = IndustryStorePSA;
res->psa = &indus->psa;
res->u.industry.tile = tile; res->u.industry.tile = tile;
res->u.industry.ind = indus; res->u.industry.ind = indus;
res->u.industry.gfx = INVALID_INDUSTRYTILE; res->u.industry.gfx = INVALID_INDUSTRYTILE;

@ -148,6 +148,19 @@ static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
} }
} }
/**
* Store a value into the persistent storage of the object's parent.
* @param object Object that we want to query.
* @param pos Position in the persistent storage to use.
* @param value Value to store.
*/
void IndustryTileStorePSA(ResolverObject *object, uint pos, int32 value)
{
Industry *ind = object->u.industry.ind;
if (object->scope != VSG_SCOPE_PARENT || ind->index == INVALID_INDUSTRY) return;
ind->psa.Store(pos, value);
}
static void NewIndustryTileResolver(ResolverObject *res, IndustryGfx gfx, TileIndex tile, Industry *indus) static void NewIndustryTileResolver(ResolverObject *res, IndustryGfx gfx, TileIndex tile, Industry *indus)
{ {
res->GetRandomBits = IndustryTileGetRandomBits; res->GetRandomBits = IndustryTileGetRandomBits;
@ -155,8 +168,8 @@ static void NewIndustryTileResolver(ResolverObject *res, IndustryGfx gfx, TileIn
res->SetTriggers = IndustryTileSetTriggers; res->SetTriggers = IndustryTileSetTriggers;
res->GetVariable = IndustryTileGetVariable; res->GetVariable = IndustryTileGetVariable;
res->ResolveReal = IndustryTileResolveReal; res->ResolveReal = IndustryTileResolveReal;
res->StorePSA = IndustryTileStorePSA;
res->psa = &indus->psa;
res->u.industry.tile = tile; res->u.industry.tile = tile;
res->u.industry.ind = indus; res->u.industry.ind = indus;
res->u.industry.gfx = gfx; res->u.industry.gfx = gfx;

@ -113,7 +113,7 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ResolverObjec
case DSGA_OP_XOR: return last_value ^ value; case DSGA_OP_XOR: return last_value ^ value;
case DSGA_OP_STO: _temp_store.Store((U)value, (S)last_value); return last_value; case DSGA_OP_STO: _temp_store.Store((U)value, (S)last_value); return last_value;
case DSGA_OP_RST: return value; case DSGA_OP_RST: return value;
case DSGA_OP_STOP: if (object->psa != NULL) object->psa->Store((U)value, (S)last_value); return last_value; case DSGA_OP_STOP: if (object->StorePSA != NULL) object->StorePSA(object, (U)value, (S)last_value); return last_value;
case DSGA_OP_ROR: return RotateRight(last_value, value); case DSGA_OP_ROR: return RotateRight(last_value, value);
case DSGA_OP_SCMP: return ((S)last_value == (S)value) ? 1 : ((S)last_value < (S)value ? 0 : 2); case DSGA_OP_SCMP: return ((S)last_value == (S)value) ? 1 : ((S)last_value < (S)value ? 0 : 2);
case DSGA_OP_UCMP: return ((U)last_value == (U)value) ? 1 : ((U)last_value < (U)value ? 0 : 2); case DSGA_OP_UCMP: return ((U)last_value == (U)value) ? 1 : ((U)last_value < (U)value ? 0 : 2);

@ -314,8 +314,6 @@ struct ResolverObject {
VarSpriteGroupScope scope; ///< Scope of currently resolved DeterministicSpriteGroup resp. RandomizedSpriteGroup VarSpriteGroupScope scope; ///< Scope of currently resolved DeterministicSpriteGroup resp. RandomizedSpriteGroup
byte count; ///< Additional scope for RandomizedSpriteGroup byte count; ///< Additional scope for RandomizedSpriteGroup
BaseStorageArray *psa; ///< The persistent storage array of this resolved object.
const GRFFile *grffile; ///< GRFFile the resolved SpriteGroup belongs to const GRFFile *grffile; ///< GRFFile the resolved SpriteGroup belongs to
union { union {
@ -382,6 +380,7 @@ struct ResolverObject {
void (*SetTriggers)(const struct ResolverObject*, int); void (*SetTriggers)(const struct ResolverObject*, int);
uint32 (*GetVariable)(const struct ResolverObject*, byte, byte, bool*); uint32 (*GetVariable)(const struct ResolverObject*, byte, byte, bool*);
const SpriteGroup *(*ResolveReal)(const struct ResolverObject*, const RealSpriteGroup*); const SpriteGroup *(*ResolveReal)(const struct ResolverObject*, const RealSpriteGroup*);
void (*StorePSA)(struct ResolverObject*, uint, int32);
}; };
#endif /* NEWGRF_SPRITEGROUP_H */ #endif /* NEWGRF_SPRITEGROUP_H */

Loading…
Cancel
Save