mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r22784) -Fix: Move Action 2 references from GRFFile to GrfProcessingState, and reset them after each loading stage.
This commit is contained in:
parent
bb57e0934a
commit
236075e944
|
@ -78,6 +78,8 @@ enum GrfDataType {
|
|||
GDT_SOUND,
|
||||
};
|
||||
|
||||
static const uint MAX_SPRITEGROUP = UINT8_MAX; ///< Maximum GRF-local ID for a spritegroup.
|
||||
|
||||
/** Temporary data during loading of GRFs */
|
||||
struct GrfProcessingState {
|
||||
/* Global state */
|
||||
|
@ -101,6 +103,9 @@ struct GrfProcessingState {
|
|||
int spriteset_numents; ///< Number of sprites per set.
|
||||
int spriteset_feature; ///< GrfSpecFeature of the spriteset.
|
||||
|
||||
/* Currently referenceable spritegroups */
|
||||
SpriteGroup *spritegroups[MAX_SPRITEGROUP + 1];
|
||||
|
||||
/** Clear temporary data before processing the next file in the current loading stage */
|
||||
void ClearDataForNextFile()
|
||||
{
|
||||
|
@ -112,6 +117,8 @@ struct GrfProcessingState {
|
|||
spriteset_numsets = 0;
|
||||
spriteset_numents = 0;
|
||||
spriteset_feature = GSF_INVALID;
|
||||
|
||||
memset(spritegroups, 0, sizeof(spritegroups));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -302,11 +309,6 @@ static void ClearTemporaryNewGRFData(GRFFile *gf)
|
|||
l = l2;
|
||||
}
|
||||
gf->label = NULL;
|
||||
|
||||
/* Clear the list of spritegroups */
|
||||
free(gf->spritegroups);
|
||||
gf->spritegroups = NULL;
|
||||
gf->spritegroups_count = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -3932,12 +3934,12 @@ static const SpriteGroup *GetGroupFromGroupID(byte setid, byte type, uint16 grou
|
|||
return new CallbackResultSpriteGroup(groupid);
|
||||
}
|
||||
|
||||
if (groupid >= _cur.grffile->spritegroups_count || _cur.grffile->spritegroups[groupid] == NULL) {
|
||||
if (groupid > MAX_SPRITEGROUP || _cur.spritegroups[groupid] == NULL) {
|
||||
grfmsg(1, "GetGroupFromGroupID(0x%02X:0x%02X): Groupid 0x%04X does not exist, leaving empty", setid, type, groupid);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _cur.grffile->spritegroups[groupid];
|
||||
return _cur.spritegroups[groupid];
|
||||
}
|
||||
|
||||
/* Helper function to either create a callback or a result sprite group. */
|
||||
|
@ -3994,15 +3996,6 @@ static void NewSpriteGroup(ByteReader *buf)
|
|||
uint8 setid = buf->ReadByte();
|
||||
uint8 type = buf->ReadByte();
|
||||
|
||||
if (setid >= _cur.grffile->spritegroups_count) {
|
||||
/* Allocate memory for new sprite group references. */
|
||||
_cur.grffile->spritegroups = ReallocT(_cur.grffile->spritegroups, setid + 1);
|
||||
/* Initialise new space to NULL */
|
||||
for (; _cur.grffile->spritegroups_count < (setid + 1); _cur.grffile->spritegroups_count++) {
|
||||
_cur.grffile->spritegroups[_cur.grffile->spritegroups_count] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Sprite Groups are created here but they are allocated from a pool, so
|
||||
* we do not need to delete anything if there is an exception from the
|
||||
* ByteReader. */
|
||||
|
@ -4216,7 +4209,7 @@ static void NewSpriteGroup(ByteReader *buf)
|
|||
}
|
||||
}
|
||||
|
||||
_cur.grffile->spritegroups[setid] = act_group;
|
||||
_cur.spritegroups[setid] = act_group;
|
||||
}
|
||||
|
||||
static CargoID TranslateCargo(uint8 feature, uint8 ctype)
|
||||
|
@ -4279,8 +4272,8 @@ static CargoID TranslateCargo(uint8 feature, uint8 ctype)
|
|||
|
||||
static bool IsValidGroupID(uint16 groupid, const char *function)
|
||||
{
|
||||
if (groupid >= _cur.grffile->spritegroups_count || _cur.grffile->spritegroups[groupid] == NULL) {
|
||||
grfmsg(1, "%s: Spriteset 0x%04X out of range (maximum 0x%02X) or empty, skipping.", function, groupid, _cur.grffile->spritegroups_count - 1);
|
||||
if (groupid > MAX_SPRITEGROUP || _cur.spritegroups[groupid] == NULL) {
|
||||
grfmsg(1, "%s: Spriteset 0x%04X out of range or empty, skipping.", function, groupid);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -4345,9 +4338,9 @@ static void VehicleMapSpriteGroup(ByteReader *buf, byte feature, uint8 idcount)
|
|||
grfmsg(7, "VehicleMapSpriteGroup: [%d] Engine %d...", i, engine);
|
||||
|
||||
if (wagover) {
|
||||
SetWagonOverrideSprites(engine, ctype, _cur.grffile->spritegroups[groupid], last_engines, last_engines_count);
|
||||
SetWagonOverrideSprites(engine, ctype, _cur.spritegroups[groupid], last_engines, last_engines_count);
|
||||
} else {
|
||||
SetCustomEngineSprites(engine, ctype, _cur.grffile->spritegroups[groupid]);
|
||||
SetCustomEngineSprites(engine, ctype, _cur.spritegroups[groupid]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4361,9 +4354,9 @@ static void VehicleMapSpriteGroup(ByteReader *buf, byte feature, uint8 idcount)
|
|||
EngineID engine = engines[i];
|
||||
|
||||
if (wagover) {
|
||||
SetWagonOverrideSprites(engine, CT_DEFAULT, _cur.grffile->spritegroups[groupid], last_engines, last_engines_count);
|
||||
SetWagonOverrideSprites(engine, CT_DEFAULT, _cur.spritegroups[groupid], last_engines, last_engines_count);
|
||||
} else {
|
||||
SetCustomEngineSprites(engine, CT_DEFAULT, _cur.grffile->spritegroups[groupid]);
|
||||
SetCustomEngineSprites(engine, CT_DEFAULT, _cur.spritegroups[groupid]);
|
||||
SetEngineGRF(engine, _cur.grffile);
|
||||
}
|
||||
}
|
||||
|
@ -4392,7 +4385,7 @@ static void CanalMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
}
|
||||
|
||||
_water_feature[cf].grffile = _cur.grffile;
|
||||
_water_feature[cf].group = _cur.grffile->spritegroups[groupid];
|
||||
_water_feature[cf].group = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4421,7 +4414,7 @@ static void StationMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
statspec->grf_prop.spritegroup[ctype] = _cur.grffile->spritegroups[groupid];
|
||||
statspec->grf_prop.spritegroup[ctype] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4441,7 +4434,7 @@ static void StationMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
statspec->grf_prop.spritegroup[CT_DEFAULT] = _cur.grffile->spritegroups[groupid];
|
||||
statspec->grf_prop.spritegroup[CT_DEFAULT] = _cur.spritegroups[groupid];
|
||||
statspec->grf_prop.grffile = _cur.grffile;
|
||||
statspec->grf_prop.local_id = stations[i];
|
||||
StationClass::Assign(statspec);
|
||||
|
@ -4476,7 +4469,7 @@ static void TownHouseMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
hs->grf_prop.spritegroup[0] = _cur.grffile->spritegroups[groupid];
|
||||
hs->grf_prop.spritegroup[0] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4507,7 +4500,7 @@ static void IndustryMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
indsp->grf_prop.spritegroup[0] = _cur.grffile->spritegroups[groupid];
|
||||
indsp->grf_prop.spritegroup[0] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4538,7 +4531,7 @@ static void IndustrytileMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
indtsp->grf_prop.spritegroup[0] = _cur.grffile->spritegroups[groupid];
|
||||
indtsp->grf_prop.spritegroup[0] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4566,7 +4559,7 @@ static void CargoMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
|
||||
CargoSpec *cs = CargoSpec::Get(cid);
|
||||
cs->grffile = _cur.grffile;
|
||||
cs->group = _cur.grffile->spritegroups[groupid];
|
||||
cs->group = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4599,7 +4592,7 @@ static void ObjectMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
spec->grf_prop.spritegroup[ctype] = _cur.grffile->spritegroups[groupid];
|
||||
spec->grf_prop.spritegroup[ctype] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4619,7 +4612,7 @@ static void ObjectMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
spec->grf_prop.spritegroup[0] = _cur.grffile->spritegroups[groupid];
|
||||
spec->grf_prop.spritegroup[0] = _cur.spritegroups[groupid];
|
||||
spec->grf_prop.grffile = _cur.grffile;
|
||||
spec->grf_prop.local_id = objects[i];
|
||||
}
|
||||
|
@ -4646,7 +4639,7 @@ static void RailTypeMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
RailtypeInfo *rti = &_railtypes[railtypes[i]];
|
||||
|
||||
rti->grffile[ctype] = _cur.grffile;
|
||||
rti->group[ctype] = _cur.grffile->spritegroups[groupid];
|
||||
rti->group[ctype] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4682,7 +4675,7 @@ static void AirportMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
as->grf_prop.spritegroup[0] = _cur.grffile->spritegroups[groupid];
|
||||
as->grf_prop.spritegroup[0] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4713,7 +4706,7 @@ static void AirportTileMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||
continue;
|
||||
}
|
||||
|
||||
airtsp->grf_prop.spritegroup[0] = _cur.grffile->spritegroups[groupid];
|
||||
airtsp->grf_prop.spritegroup[0] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4735,11 +4728,6 @@ static void FeatureMapSpriteGroup(ByteReader *buf)
|
|||
* W cid cargo ID (sprite group ID) for this type of cargo
|
||||
* W def-cid default cargo ID (sprite group ID) */
|
||||
|
||||
if (_cur.grffile->spritegroups == NULL) {
|
||||
grfmsg(1, "FeatureMapSpriteGroup: No sprite groups to work on! Skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
uint8 feature = buf->ReadByte();
|
||||
uint8 idcount = buf->ReadByte();
|
||||
|
||||
|
@ -4752,7 +4740,7 @@ static void FeatureMapSpriteGroup(ByteReader *buf)
|
|||
|
||||
grfmsg(6, "FeatureMapSpriteGroup: Adding generic feature callback for feature %d", feature);
|
||||
|
||||
AddGenericCallback(feature, _cur.grffile, _cur.grffile->spritegroups[groupid]);
|
||||
AddGenericCallback(feature, _cur.grffile, _cur.spritegroups[groupid]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,9 +79,6 @@ struct GRFFile {
|
|||
uint32 grfid;
|
||||
byte grf_version;
|
||||
|
||||
int spritegroups_count;
|
||||
struct SpriteGroup **spritegroups;
|
||||
|
||||
uint sound_offset;
|
||||
uint16 num_sounds;
|
||||
|
||||
|
|
Loading…
Reference in New Issue