Codechange: Use unique ptrs for NewGRF specs.

pull/544/head
Peter Nelson 1 year ago committed by PeterN
parent ef6b307465
commit 7b0797d1cd

@ -1925,7 +1925,7 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
if (_cur.grffile->stations.size() < stid + numinfo) _cur.grffile->stations.resize(stid + numinfo);
for (int i = 0; i < numinfo; i++) {
StationSpec *statspec = _cur.grffile->stations[stid + i];
StationSpec *statspec = _cur.grffile->stations[stid + i].get();
/* Check that the station we are modifying is defined. */
if (statspec == nullptr && prop != 0x08) {
@ -1935,14 +1935,15 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
switch (prop) {
case 0x08: { // Class ID
StationSpec **spec = &_cur.grffile->stations[stid + i];
/* Property 0x08 is special; it is where the station is allocated */
if (*spec == nullptr) *spec = new StationSpec();
if (statspec == nullptr) {
_cur.grffile->stations[stid + i] = std::make_unique<StationSpec>();
statspec = _cur.grffile->stations[stid + i].get();
}
/* Swap classid because we read it in BE meaning WAYP or DFLT */
uint32 classid = buf->ReadDWord();
(*spec)->cls_id = StationClass::Allocate(BSWAP32(classid));
statspec->cls_id = StationClass::Allocate(BSWAP32(classid));
break;
}
@ -1998,7 +1999,7 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
case 0x0A: { // Copy sprite layout
byte srcid = buf->ReadByte();
const StationSpec *srcstatspec = srcid >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[srcid];
const StationSpec *srcstatspec = srcid >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[srcid].get();
if (srcstatspec == nullptr) {
grfmsg(1, "StationChangeInfo: Station %u is not defined, cannot copy sprite layout to %u.", srcid, stid + i);
@ -2052,7 +2053,7 @@ static ChangeInfoResult StationChangeInfo(uint stid, int numinfo, int prop, Byte
case 0x0F: { // Copy custom layout
byte srcid = buf->ReadByte();
const StationSpec *srcstatspec = srcid >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[srcid];
const StationSpec *srcstatspec = srcid >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[srcid].get();
if (srcstatspec == nullptr) {
grfmsg(1, "StationChangeInfo: Station %u is not defined, cannot copy tile layout to %u.", srcid, stid + i);
@ -2370,7 +2371,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
if (_cur.grffile->housespec.size() < hid + numinfo) _cur.grffile->housespec.resize(hid + numinfo);
for (int i = 0; i < numinfo; i++) {
HouseSpec *housespec = _cur.grffile->housespec[hid + i];
HouseSpec *housespec = _cur.grffile->housespec[hid + i].get();
if (prop != 0x08 && housespec == nullptr) {
/* If the house property 08 is not yet set, ignore this property */
@ -2381,13 +2382,11 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
switch (prop) {
case 0x08: { // Substitute building type, and definition of a new house
HouseSpec **house = &_cur.grffile->housespec[hid + i];
byte subs_id = buf->ReadByte();
if (subs_id == 0xFF) {
/* Instead of defining a new house, a substitute house id
* of 0xFF disables the old house with the current id. */
HouseSpec::Get(hid + i)->enabled = false;
if (hid + i < NEW_HOUSE_OFFSET) HouseSpec::Get(hid + i)->enabled = false;
continue;
} else if (subs_id >= NEW_HOUSE_OFFSET) {
/* The substitute id must be one of the original houses. */
@ -2396,11 +2395,10 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
}
/* Allocate space for this house. */
if (*house == nullptr) *house = CallocT<HouseSpec>(1);
housespec = *house;
MemCpyT(housespec, HouseSpec::Get(subs_id));
if (housespec == nullptr) {
_cur.grffile->housespec[hid + i] = std::make_unique<HouseSpec>(*HouseSpec::Get(subs_id));
housespec = _cur.grffile->housespec[hid + i].get();
}
housespec->enabled = true;
housespec->grf_prop.local_id = hid + i;
@ -3207,7 +3205,7 @@ static ChangeInfoResult IndustrytilesChangeInfo(uint indtid, int numinfo, int pr
if (_cur.grffile->indtspec.size() < indtid + numinfo) _cur.grffile->indtspec.resize(indtid + numinfo);
for (int i = 0; i < numinfo; i++) {
IndustryTileSpec *tsp = _cur.grffile->indtspec[indtid + i];
IndustryTileSpec *tsp = _cur.grffile->indtspec[indtid + i].get();
if (prop != 0x08 && tsp == nullptr) {
ChangeInfoResult cir = IgnoreIndustryTileProperty(prop, buf);
@ -3217,9 +3215,7 @@ static ChangeInfoResult IndustrytilesChangeInfo(uint indtid, int numinfo, int pr
switch (prop) {
case 0x08: { // Substitute industry tile type
IndustryTileSpec **tilespec = &_cur.grffile->indtspec[indtid + i];
byte subs_id = buf->ReadByte();
if (subs_id >= NEW_INDUSTRYTILEOFFSET) {
/* The substitute id must be one of the original industry tile. */
grfmsg(2, "IndustryTilesChangeInfo: Attempt to use new industry tile %u as substitute industry tile for %u. Ignoring.", subs_id, indtid + i);
@ -3227,11 +3223,10 @@ static ChangeInfoResult IndustrytilesChangeInfo(uint indtid, int numinfo, int pr
}
/* Allocate space for this industry. */
if (*tilespec == nullptr) {
*tilespec = CallocT<IndustryTileSpec>(1);
tsp = *tilespec;
if (tsp == nullptr) {
_cur.grffile->indtspec[indtid + i] = std::make_unique<IndustryTileSpec>(_industry_tile_specs[subs_id]);
tsp = _cur.grffile->indtspec[indtid + i].get();
memcpy(tsp, &_industry_tile_specs[subs_id], sizeof(_industry_tile_specs[subs_id]));
tsp->enabled = true;
/* A copied tile should not have the animation infos copied too.
@ -3466,7 +3461,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
if (_cur.grffile->industryspec.size() < indid + numinfo) _cur.grffile->industryspec.resize(indid + numinfo);
for (int i = 0; i < numinfo; i++) {
IndustrySpec *indsp = _cur.grffile->industryspec[indid + i];
IndustrySpec *indsp = _cur.grffile->industryspec[indid + i].get();
if (prop != 0x08 && indsp == nullptr) {
ChangeInfoResult cir = IgnoreIndustryProperty(prop, buf);
@ -3476,9 +3471,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
switch (prop) {
case 0x08: { // Substitute industry type
IndustrySpec **indspec = &_cur.grffile->industryspec[indid + i];
byte subs_id = buf->ReadByte();
if (subs_id == 0xFF) {
/* Instead of defining a new industry, a substitute industry id
* of 0xFF disables the old industry with the current id. */
@ -3493,11 +3486,10 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop,
/* Allocate space for this industry.
* Only need to do it once. If ever it is called again, it should not
* do anything */
if (*indspec == nullptr) {
*indspec = new IndustrySpec;
indsp = *indspec;
if (indsp == nullptr) {
_cur.grffile->industryspec[indid + i] = std::make_unique<IndustrySpec>(_origin_industry_specs[subs_id]);
indsp = _cur.grffile->industryspec[indid + i].get();
*indsp = _origin_industry_specs[subs_id];
indsp->enabled = true;
indsp->grf_prop.local_id = indid + i;
indsp->grf_prop.subst_id = subs_id;
@ -3873,7 +3865,7 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B
if (_cur.grffile->airportspec.size() < airport + numinfo) _cur.grffile->airportspec.resize(airport + numinfo);
for (int i = 0; i < numinfo; i++) {
AirportSpec *as = _cur.grffile->airportspec[airport + i];
AirportSpec *as = _cur.grffile->airportspec[airport + i].get();
if (as == nullptr && prop != 0x08 && prop != 0x09) {
grfmsg(2, "AirportChangeInfo: Attempt to modify undefined airport %u, ignoring", airport + i);
@ -3883,7 +3875,6 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B
switch (prop) {
case 0x08: { // Modify original airport
byte subs_id = buf->ReadByte();
if (subs_id == 0xFF) {
/* Instead of defining a new airport, an airport id
* of 0xFF disables the old airport with the current id. */
@ -3895,15 +3886,13 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B
continue;
}
AirportSpec **spec = &_cur.grffile->airportspec[airport + i];
/* Allocate space for this airport.
* Only need to do it once. If ever it is called again, it should not
* do anything */
if (*spec == nullptr) {
*spec = MallocT<AirportSpec>(1);
as = *spec;
if (as == nullptr) {
_cur.grffile->airportspec[airport + i] = std::make_unique<AirportSpec>(*AirportSpec::GetWithoutOverride(subs_id));
as = _cur.grffile->airportspec[airport + i].get();
memcpy(as, AirportSpec::GetWithoutOverride(subs_id), sizeof(*as));
as->enabled = true;
as->grf_prop.local_id = airport + i;
as->grf_prop.subst_id = subs_id;
@ -4097,7 +4086,7 @@ static ChangeInfoResult ObjectChangeInfo(uint id, int numinfo, int prop, ByteRea
if (_cur.grffile->objectspec.size() < id + numinfo) _cur.grffile->objectspec.resize(id + numinfo);
for (int i = 0; i < numinfo; i++) {
ObjectSpec *spec = _cur.grffile->objectspec[id + i];
ObjectSpec *spec = _cur.grffile->objectspec[id + i].get();
if (prop != 0x08 && spec == nullptr) {
/* If the object property 08 is not yet set, ignore this property */
@ -4108,18 +4097,17 @@ static ChangeInfoResult ObjectChangeInfo(uint id, int numinfo, int prop, ByteRea
switch (prop) {
case 0x08: { // Class ID
ObjectSpec **ospec = &_cur.grffile->objectspec[id + i];
/* Allocate space for this object. */
if (*ospec == nullptr) {
*ospec = CallocT<ObjectSpec>(1);
(*ospec)->views = 1; // Default for NewGRFs that don't set it.
(*ospec)->size = OBJECT_SIZE_1X1; // Default for NewGRFs that manage to not set it (1x1)
if (spec == nullptr) {
_cur.grffile->objectspec[id + i] = std::make_unique<ObjectSpec>();
spec = _cur.grffile->objectspec[id + i].get();
spec->views = 1; // Default for NewGRFs that don't set it.
spec->size = OBJECT_SIZE_1X1; // Default for NewGRFs that manage to not set it (1x1)
}
/* Swap classid because we read it in BE. */
uint32 classid = buf->ReadDWord();
(*ospec)->cls_id = ObjectClass::Allocate(BSWAP32(classid));
spec->cls_id = ObjectClass::Allocate(BSWAP32(classid));
break;
}
@ -4660,7 +4648,7 @@ static ChangeInfoResult AirportTilesChangeInfo(uint airtid, int numinfo, int pro
if (_cur.grffile->airtspec.size() < airtid + numinfo) _cur.grffile->airtspec.resize(airtid + numinfo);
for (int i = 0; i < numinfo; i++) {
AirportTileSpec *tsp = _cur.grffile->airtspec[airtid + i];
AirportTileSpec *tsp = _cur.grffile->airtspec[airtid + i].get();
if (prop != 0x08 && tsp == nullptr) {
grfmsg(2, "AirportTileChangeInfo: Attempt to modify undefined airport tile %u. Ignoring.", airtid + i);
@ -4669,9 +4657,7 @@ static ChangeInfoResult AirportTilesChangeInfo(uint airtid, int numinfo, int pro
switch (prop) {
case 0x08: { // Substitute airport tile type
AirportTileSpec **tilespec = &_cur.grffile->airtspec[airtid + i];
byte subs_id = buf->ReadByte();
if (subs_id >= NEW_AIRPORTTILE_OFFSET) {
/* The substitute id must be one of the original airport tiles. */
grfmsg(2, "AirportTileChangeInfo: Attempt to use new airport tile %u as substitute airport tile for %u. Ignoring.", subs_id, airtid + i);
@ -4679,11 +4665,10 @@ static ChangeInfoResult AirportTilesChangeInfo(uint airtid, int numinfo, int pro
}
/* Allocate space for this airport tile. */
if (*tilespec == nullptr) {
*tilespec = CallocT<AirportTileSpec>(1);
tsp = *tilespec;
if (tsp == nullptr) {
_cur.grffile->airtspec[airtid + i] = std::make_unique<AirportTileSpec>(*AirportTileSpec::Get(subs_id));
tsp = _cur.grffile->airtspec[airtid + i].get();
memcpy(tsp, AirportTileSpec::Get(subs_id), sizeof(AirportTileSpec));
tsp->enabled = true;
tsp->animation.status = ANIM_STATUS_NO_ANIMATION;
@ -4787,7 +4772,7 @@ static ChangeInfoResult RoadStopChangeInfo(uint id, int numinfo, int prop, ByteR
if (_cur.grffile->roadstops.size() < id + numinfo) _cur.grffile->roadstops.resize(id + numinfo);
for (int i = 0; i < numinfo; i++) {
RoadStopSpec *rs = _cur.grffile->roadstops[id + i];
RoadStopSpec *rs = _cur.grffile->roadstops[id + i].get();
if (rs == nullptr && prop != 0x08) {
grfmsg(1, "RoadStopChangeInfo: Attempt to modify undefined road stop %u, ignoring", id + i);
@ -4798,16 +4783,14 @@ static ChangeInfoResult RoadStopChangeInfo(uint id, int numinfo, int prop, ByteR
switch (prop) {
case 0x08: { // Road Stop Class ID
RoadStopSpec **spec = &_cur.grffile->roadstops[id + i];
if (*spec == nullptr) {
*spec = CallocT<RoadStopSpec>(1);
new (*spec) RoadStopSpec();
if (rs == nullptr) {
_cur.grffile->roadstops[id + i] = std::make_unique<RoadStopSpec>();
rs = _cur.grffile->roadstops[id + i].get();
}
uint32 classid = buf->ReadDWord();
(*spec)->cls_id = RoadStopClass::Allocate(BSWAP32(classid));
(*spec)->spec_id = id + i;
rs->cls_id = RoadStopClass::Allocate(BSWAP32(classid));
rs->spec_id = id + i;
break;
}
@ -5712,7 +5695,7 @@ static void StationMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (ctype == CT_INVALID) continue;
for (auto &station : stations) {
StationSpec *statspec = station >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[station];
StationSpec *statspec = station >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[station].get();
if (statspec == nullptr) {
grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", station);
@ -5727,7 +5710,7 @@ static void StationMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "StationMapSpriteGroup")) return;
for (auto &station : stations) {
StationSpec *statspec = station >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[station];
StationSpec *statspec = station >= _cur.grffile->stations.size() ? nullptr : _cur.grffile->stations[station].get();
if (statspec == nullptr) {
grfmsg(1, "StationMapSpriteGroup: Station with ID 0x%02X does not exist, skipping", station);
@ -5768,7 +5751,7 @@ static void TownHouseMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "TownHouseMapSpriteGroup")) return;
for (auto &house : houses) {
HouseSpec *hs = house >= _cur.grffile->housespec.size() ? nullptr : _cur.grffile->housespec[house];
HouseSpec *hs = house >= _cur.grffile->housespec.size() ? nullptr : _cur.grffile->housespec[house].get();
if (hs == nullptr) {
grfmsg(1, "TownHouseMapSpriteGroup: House %d undefined, skipping.", house);
@ -5800,7 +5783,7 @@ static void IndustryMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "IndustryMapSpriteGroup")) return;
for (auto &industry : industries) {
IndustrySpec *indsp = industry >= _cur.grffile->industryspec.size() ? nullptr : _cur.grffile->industryspec[industry];
IndustrySpec *indsp = industry >= _cur.grffile->industryspec.size() ? nullptr : _cur.grffile->industryspec[industry].get();
if (indsp == nullptr) {
grfmsg(1, "IndustryMapSpriteGroup: Industry %d undefined, skipping", industry);
@ -5832,7 +5815,7 @@ static void IndustrytileMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "IndustrytileMapSpriteGroup")) return;
for (auto &indtile : indtiles) {
IndustryTileSpec *indtsp = indtile >= _cur.grffile->indtspec.size() ? nullptr : _cur.grffile->indtspec[indtile];
IndustryTileSpec *indtsp = indtile >= _cur.grffile->indtspec.size() ? nullptr : _cur.grffile->indtspec[indtile].get();
if (indtsp == nullptr) {
grfmsg(1, "IndustrytileMapSpriteGroup: Industry tile %d undefined, skipping", indtile);
@ -5893,7 +5876,7 @@ static void ObjectMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (ctype == CT_INVALID) continue;
for (auto &object : objects) {
ObjectSpec *spec = object >= _cur.grffile->objectspec.size() ? nullptr : _cur.grffile->objectspec[object];
ObjectSpec *spec = object >= _cur.grffile->objectspec.size() ? nullptr : _cur.grffile->objectspec[object].get();
if (spec == nullptr) {
grfmsg(1, "ObjectMapSpriteGroup: Object with ID 0x%02X undefined, skipping", object);
@ -5908,7 +5891,7 @@ static void ObjectMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "ObjectMapSpriteGroup")) return;
for (auto &object : objects) {
ObjectSpec *spec = object >= _cur.grffile->objectspec.size() ? nullptr : _cur.grffile->objectspec[object];
ObjectSpec *spec = object >= _cur.grffile->objectspec.size() ? nullptr : _cur.grffile->objectspec[object].get();
if (spec == nullptr) {
grfmsg(1, "ObjectMapSpriteGroup: Object with ID 0x%02X undefined, skipping", object);
@ -6013,7 +5996,7 @@ static void AirportMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "AirportMapSpriteGroup")) return;
for (auto &airport : airports) {
AirportSpec *as = airport >= _cur.grffile->airportspec.size() ? nullptr : _cur.grffile->airportspec[airport];
AirportSpec *as = airport >= _cur.grffile->airportspec.size() ? nullptr : _cur.grffile->airportspec[airport].get();
if (as == nullptr) {
grfmsg(1, "AirportMapSpriteGroup: Airport %d undefined, skipping", airport);
@ -6045,7 +6028,7 @@ static void AirportTileMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "AirportTileMapSpriteGroup")) return;
for (auto &airptile : airptiles) {
AirportTileSpec *airtsp = airptile >= _cur.grffile->airtspec.size() ? nullptr : _cur.grffile->airtspec[airptile];
AirportTileSpec *airtsp = airptile >= _cur.grffile->airtspec.size() ? nullptr : _cur.grffile->airtspec[airptile].get();
if (airtsp == nullptr) {
grfmsg(1, "AirportTileMapSpriteGroup: Airport tile %d undefined, skipping", airptile);
@ -6079,7 +6062,7 @@ static void RoadStopMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (ctype == CT_INVALID) continue;
for (auto &roadstop : roadstops) {
RoadStopSpec *roadstopspec = roadstop >= _cur.grffile->roadstops.size() ? nullptr : _cur.grffile->roadstops[roadstop];
RoadStopSpec *roadstopspec = roadstop >= _cur.grffile->roadstops.size() ? nullptr : _cur.grffile->roadstops[roadstop].get();
if (roadstopspec == nullptr) {
grfmsg(1, "RoadStopMapSpriteGroup: Road stop with ID 0x%02X does not exist, skipping", roadstop);
@ -6094,7 +6077,7 @@ static void RoadStopMapSpriteGroup(ByteReader *buf, uint8 idcount)
if (!IsValidGroupID(groupid, "RoadStopMapSpriteGroup")) return;
for (auto &roadstop : roadstops) {
RoadStopSpec *roadstopspec = roadstop >= _cur.grffile->roadstops.size() ? nullptr : _cur.grffile->roadstops[roadstop];
RoadStopSpec *roadstopspec = roadstop >= _cur.grffile->roadstops.size() ? nullptr : _cur.grffile->roadstops[roadstop].get();
if (roadstopspec == nullptr) {
grfmsg(1, "RoadStopMapSpriteGroup: Road stop with ID 0x%02X does not exist, skipping.", roadstop);
@ -8682,10 +8665,6 @@ static void InitializeGRFSpecial()
static void ResetCustomStations()
{
for (GRFFile * const file : _grf_files) {
for (auto statspec : file->stations) {
delete statspec;
}
/* Free and reset the station data */
file->stations.clear();
}
}
@ -8694,9 +8673,6 @@ static void ResetCustomStations()
static void ResetCustomHouses()
{
for (GRFFile * const file : _grf_files) {
for (auto housespec : file->housespec) {
free(housespec);
}
file->housespec.clear();
}
}
@ -8705,7 +8681,7 @@ static void ResetCustomHouses()
static void ResetCustomAirports()
{
for (GRFFile * const file : _grf_files) {
for (auto as : file->airportspec) {
for (auto &as : file->airportspec) {
if (as != nullptr) {
/* We need to remove the tiles layouts */
for (int j = 0; j < as->num_table; j++) {
@ -8715,15 +8691,9 @@ static void ResetCustomAirports()
free(as->table);
free(as->depot_table);
free(as->rotation);
free(as);
}
}
file->airportspec.clear();
for (auto ats : file->airtspec) {
free(ats);
}
file->airtspec.clear();
}
}
@ -8732,16 +8702,7 @@ static void ResetCustomAirports()
static void ResetCustomIndustries()
{
for (GRFFile * const file : _grf_files) {
/* We are verifiying both tiles and industries specs loaded from the grf file
* First, let's deal with industryspec */
for (auto indsp : file->industryspec) {
delete indsp;
}
file->industryspec.clear();
for (auto indtsp : file->indtspec) {
free(indtsp);
}
file->indtspec.clear();
}
}
@ -8750,9 +8711,6 @@ static void ResetCustomIndustries()
static void ResetCustomObjects()
{
for (GRFFile * const file : _grf_files) {
for (auto objectspec : file->objectspec) {
free(objectspec);
}
file->objectspec.clear();
}
}
@ -8760,9 +8718,6 @@ static void ResetCustomObjects()
static void ResetCustomRoadStops()
{
for (auto file : _grf_files) {
for (auto roadstopspec : file->roadstops) {
free(roadstopspec);
}
file->roadstops.clear();
}
}
@ -9340,13 +9295,13 @@ static void FinaliseHouseArray()
size_t num_houses = file->housespec.size();
for (size_t i = 0; i < num_houses; i++) {
HouseSpec *hs = file->housespec[i];
HouseSpec *hs = file->housespec[i].get();
if (hs == nullptr) continue;
const HouseSpec *next1 = (i + 1 < num_houses ? file->housespec[i + 1] : nullptr);
const HouseSpec *next2 = (i + 2 < num_houses ? file->housespec[i + 2] : nullptr);
const HouseSpec *next3 = (i + 3 < num_houses ? file->housespec[i + 3] : nullptr);
const HouseSpec *next1 = (i + 1 < num_houses ? file->housespec[i + 1].get() : nullptr);
const HouseSpec *next2 = (i + 2 < num_houses ? file->housespec[i + 2].get() : nullptr);
const HouseSpec *next3 = (i + 3 < num_houses ? file->housespec[i + 3].get() : nullptr);
if (!IsHouseSpecValid(hs, next1, next2, next3, file->filename)) continue;
@ -9398,7 +9353,7 @@ static void FinaliseHouseArray()
static void FinaliseIndustriesArray()
{
for (GRFFile * const file : _grf_files) {
for (auto indsp : file->industryspec) {
for (const auto &indsp : file->industryspec) {
if (indsp == nullptr || !indsp->enabled) continue;
StringID strid;
@ -9427,12 +9382,12 @@ static void FinaliseIndustriesArray()
if (strid != STR_UNDEFINED) indsp->station_name = strid;
}
_industry_mngr.SetEntitySpec(indsp);
_industry_mngr.SetEntitySpec(indsp.get());
}
for (auto indtsp : file->indtspec) {
for (const auto &indtsp : file->indtspec) {
if (indtsp != nullptr) {
_industile_mngr.SetEntitySpec(indtsp);
_industile_mngr.SetEntitySpec(indtsp.get());
}
}
}
@ -9458,9 +9413,9 @@ static void FinaliseIndustriesArray()
static void FinaliseObjectsArray()
{
for (GRFFile * const file : _grf_files) {
for (auto objectspec : file->objectspec) {
for (auto &objectspec : file->objectspec) {
if (objectspec != nullptr && objectspec->grf_prop.grffile != nullptr && objectspec->IsEnabled()) {
_object_mngr.SetEntitySpec(objectspec);
_object_mngr.SetEntitySpec(objectspec.get());
}
}
}
@ -9476,15 +9431,15 @@ static void FinaliseObjectsArray()
static void FinaliseAirportsArray()
{
for (GRFFile * const file : _grf_files) {
for (auto as : file->airportspec) {
for (auto &as : file->airportspec) {
if (as != nullptr && as->enabled) {
_airport_mngr.SetEntitySpec(as);
_airport_mngr.SetEntitySpec(as.get());
}
}
for (auto ats : file->airtspec) {
for (auto &ats : file->airtspec) {
if (ats != nullptr && ats->enabled) {
_airporttile_mngr.SetEntitySpec(ats);
_airporttile_mngr.SetEntitySpec(ats.get());
}
}
}

@ -112,14 +112,14 @@ struct GRFFile : ZeroedMemoryAllocator {
uint sound_offset;
uint16 num_sounds;
std::vector<struct StationSpec *> stations;
std::vector<struct HouseSpec *> housespec;
std::vector<struct IndustrySpec *> industryspec;
std::vector<struct IndustryTileSpec *> indtspec;
std::vector<struct ObjectSpec *> objectspec;
std::vector<struct AirportSpec *> airportspec;
std::vector<struct AirportTileSpec *> airtspec;
std::vector<struct RoadStopSpec *> roadstops;
std::vector<std::unique_ptr<struct StationSpec>> stations;
std::vector<std::unique_ptr<struct HouseSpec>> housespec;
std::vector<std::unique_ptr<struct IndustrySpec>> industryspec;
std::vector<std::unique_ptr<struct IndustryTileSpec>> indtspec;
std::vector<std::unique_ptr<struct ObjectSpec>> objectspec;
std::vector<std::unique_ptr<struct AirportSpec>> airportspec;
std::vector<std::unique_ptr<struct AirportTileSpec>> airtspec;
std::vector<std::unique_ptr<struct RoadStopSpec>> roadstops;
uint32 param[0x80];
uint param_end; ///< one more than the highest set parameter

Loading…
Cancel
Save