diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index e3f7d197b2..56dfcbc430 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -483,8 +483,8 @@ static void GetTileDesc_Industry(TileIndex tile, TileDesc *td) td->str = STR_LAI_TOWN_INDUSTRY_DESCRIPTION_UNDER_CONSTRUCTION; } - if (is->grf_prop.grffile != nullptr) { - td->grf = GetGRFConfig(is->grf_prop.grffile->grfid)->GetName(); + if (is->grf_prop.HasGrfFile()) { + td->grf = GetGRFConfig(is->grf_prop.grfid)->GetName(); } } @@ -1826,7 +1826,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, uint16_t res = GetIndustryCallback(CBID_INDUSTRY_PROD_CHANGE_BUILD, 0, Random(), i, type, INVALID_TILE); if (res != CALLBACK_FAILED) { if (res < PRODLEVEL_MINIMUM || res > PRODLEVEL_MAXIMUM) { - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_PROD_CHANGE_BUILD, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_PROD_CHANGE_BUILD, res); } else { i->prod_level = res; i->RecomputeProductionMultipliers(); @@ -1851,7 +1851,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, if (HasBit(indspec->callback_mask, CBM_IND_DECIDE_COLOUR)) { uint16_t res = GetIndustryCallback(CBID_INDUSTRY_DECIDE_COLOUR, 0, 0, i, type, INVALID_TILE); if (res != CALLBACK_FAILED) { - if (GB(res, 4, 11) != 0) ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_DECIDE_COLOUR, res); + if (GB(res, 4, 11) != 0) ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_DECIDE_COLOUR, res); i->random_colour = static_cast(GB(res, 0, 4)); } } @@ -1865,7 +1865,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, uint16_t res = GetIndustryCallback(CBID_INDUSTRY_INPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE); if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break; if (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) { - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); break; } CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); @@ -1881,12 +1881,12 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, /* Verify valid cargo */ if (std::ranges::find(indspec->accepts_cargo, cargo) == std::end(indspec->accepts_cargo)) { /* Cargo not in spec, error in NewGRF */ - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); break; } if (std::any_of(std::begin(i->accepted), std::begin(i->accepted) + j, [&cargo](const auto &a) { return a.cargo == cargo; })) { /* Duplicate cargo */ - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); break; } Industry::AcceptedCargo &a = i->accepted.emplace_back(); @@ -1903,7 +1903,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, uint16_t res = GetIndustryCallback(CBID_INDUSTRY_OUTPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE); if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break; if (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) { - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res); break; } CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); @@ -1917,12 +1917,12 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, /* Verify valid cargo */ if (std::ranges::find(indspec->produced_cargo, cargo) == std::end(indspec->produced_cargo)) { /* Cargo not in spec, error in NewGRF */ - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res); break; } if (std::any_of(std::begin(i->produced), std::begin(i->produced) + j, [&cargo](const auto &p) { return p.cargo == cargo; })) { /* Duplicate cargo */ - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res); break; } Industry::ProducedCargo &p = i->produced.emplace_back(); @@ -2812,7 +2812,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) if (res != CALLBACK_FAILED) { // failed callback means "do nothing" suppress_message = HasBit(res, 7); /* Get the custom message if any */ - if (HasBit(res, 8)) str = MapGRFStringID(indspec->grf_prop.grffile->grfid, GB(GetRegister(0x100), 0, 16)); + if (HasBit(res, 8)) str = MapGRFStringID(indspec->grf_prop.grfid, GB(GetRegister(0x100), 0, 16)); res = GB(res, 0, 4); switch (res) { default: NOT_REACHED(); diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index ef584464bb..ac984b1a9f 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -104,12 +104,12 @@ static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind, if (GB(callback, 0, 8) == 0xFF) return; if (callback < 0x400) { StartTextRefStackUsage(indspec->grf_prop.grffile, 6); - suffix.text = GetString(GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback)); + suffix.text = GetString(GetGRFStringID(indspec->grf_prop.grfid, 0xD000 + callback)); StopTextRefStackUsage(); suffix.display = CSD_CARGO_AMOUNT_TEXT; return; } - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback); return; } else { // GRF version 8 or higher. @@ -120,19 +120,19 @@ static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind, } if (callback < 0x400) { StartTextRefStackUsage(indspec->grf_prop.grffile, 6); - suffix.text = GetString(GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback)); + suffix.text = GetString(GetGRFStringID(indspec->grf_prop.grfid, 0xD000 + callback)); StopTextRefStackUsage(); suffix.display = CSD_CARGO_AMOUNT_TEXT; return; } if (callback >= 0x800 && callback < 0xC00) { StartTextRefStackUsage(indspec->grf_prop.grffile, 6); - suffix.text = GetString(GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 - 0x800 + callback)); + suffix.text = GetString(GetGRFStringID(indspec->grf_prop.grfid, 0xD000 - 0x800 + callback)); StopTextRefStackUsage(); suffix.display = CSD_CARGO_TEXT; return; } - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback); return; } } @@ -477,7 +477,7 @@ public: } d = maxdim(d, strdim); - if (indsp->grf_prop.grffile != nullptr) { + if (indsp->grf_prop.HasGrfFile()) { /* Reserve a few extra lines for text from an industry NewGRF. */ extra_lines_newgrf = 4; } @@ -588,9 +588,9 @@ public: uint16_t callback_res = GetIndustryCallback(CBID_INDUSTRY_FUND_MORE_TEXT, 0, 0, nullptr, this->selected_type, INVALID_TILE); if (callback_res != CALLBACK_FAILED && callback_res != 0x400) { if (callback_res > 0x400) { - ErrorUnknownCallbackResult(indsp->grf_prop.grffile->grfid, CBID_INDUSTRY_FUND_MORE_TEXT, callback_res); + ErrorUnknownCallbackResult(indsp->grf_prop.grfid, CBID_INDUSTRY_FUND_MORE_TEXT, callback_res); } else { - StringID str = GetGRFStringID(indsp->grf_prop.grffile->grfid, 0xD000 + callback_res); // No. here's the new string + StringID str = GetGRFStringID(indsp->grf_prop.grfid, 0xD000 + callback_res); // No. here's the new string if (str != STR_UNDEFINED) { StartTextRefStackUsage(indsp->grf_prop.grffile, 6); DrawStringMultiLine(ir, str, TC_YELLOW); @@ -981,9 +981,9 @@ public: uint16_t callback_res = GetIndustryCallback(CBID_INDUSTRY_WINDOW_MORE_TEXT, 0, 0, i, i->type, i->location.tile); if (callback_res != CALLBACK_FAILED && callback_res != 0x400) { if (callback_res > 0x400) { - ErrorUnknownCallbackResult(ind->grf_prop.grffile->grfid, CBID_INDUSTRY_WINDOW_MORE_TEXT, callback_res); + ErrorUnknownCallbackResult(ind->grf_prop.grfid, CBID_INDUSTRY_WINDOW_MORE_TEXT, callback_res); } else { - StringID message = GetGRFStringID(ind->grf_prop.grffile->grfid, 0xD000 + callback_res); + StringID message = GetGRFStringID(ind->grf_prop.grfid, 0xD000 + callback_res); if (message != STR_NULL && message != STR_UNDEFINED) { ir.top += WidgetDimensions::scaled.vsep_wide; diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 1978e0ca6a..2a4449fd19 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -632,7 +632,10 @@ static Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t inte EngineID engine = _engine_mngr.GetID(type, internal_id, scope_grfid); if (engine != INVALID_ENGINE) { Engine *e = Engine::Get(engine); - if (e->grf_prop.grffile == nullptr) e->grf_prop.grffile = file; + if (!e->grf_prop.HasGrfFile()) { + e->grf_prop.grfid = file->grfid; + e->grf_prop.grffile = file; + } return e; } } @@ -642,7 +645,8 @@ static Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t inte if (engine != INVALID_ENGINE) { Engine *e = Engine::Get(engine); - if (e->grf_prop.grffile == nullptr) { + if (!e->grf_prop.HasGrfFile()) { + e->grf_prop.grfid = file->grfid; e->grf_prop.grffile = file; GrfMsg(5, "Replaced engine at index {} for GRFID {:x}, type {}, index {}", e->index, BSWAP32(file->grfid), type, internal_id); } @@ -667,6 +671,7 @@ static Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t inte /* ... it's not, so create a new one based off an existing engine */ Engine *e = new Engine(type, internal_id); + e->grf_prop.grfid = file->grfid; e->grf_prop.grffile = file; /* Reserve the engine slot */ @@ -2463,6 +2468,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt housespec->enabled = true; housespec->grf_prop.local_id = hid + i; housespec->grf_prop.subst_id = subs_id; + housespec->grf_prop.grfid = _cur.grffile->grfid; housespec->grf_prop.grffile = _cur.grffile; /* Set default colours for randomization, used if not overridden. */ housespec->random_colour[0] = COLOUR_RED; @@ -3327,6 +3333,7 @@ static ChangeInfoResult IndustrytilesChangeInfo(uint indtid, int numinfo, int pr tsp->grf_prop.local_id = indtid + i; tsp->grf_prop.subst_id = subs_id; + tsp->grf_prop.grfid = _cur.grffile->grfid; tsp->grf_prop.grffile = _cur.grffile; _industile_mngr.AddEntityID(indtid + i, _cur.grffile->grfid, subs_id); // pre-reserve the tile slot } @@ -3584,6 +3591,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop, indsp->enabled = true; indsp->grf_prop.local_id = indid + i; indsp->grf_prop.subst_id = subs_id; + indsp->grf_prop.grfid = _cur.grffile->grfid; indsp->grf_prop.grffile = _cur.grffile; /* If the grf industry needs to check its surrounding upon creation, it should * rely on callbacks, not on the original placement functions */ @@ -3956,6 +3964,7 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B as->enabled = true; as->grf_prop.local_id = airport + i; as->grf_prop.subst_id = subs_id; + as->grf_prop.grfid = _cur.grffile->grfid; as->grf_prop.grffile = _cur.grffile; /* override the default airport */ _airport_mngr.Add(airport + i, _cur.grffile->grfid, subs_id); @@ -4717,6 +4726,7 @@ static ChangeInfoResult AirportTilesChangeInfo(uint airtid, int numinfo, int pro tsp->grf_prop.local_id = airtid + i; tsp->grf_prop.subst_id = subs_id; + tsp->grf_prop.grfid = _cur.grffile->grfid; tsp->grf_prop.grffile = _cur.grffile; _airporttile_mngr.AddEntityID(airtid + i, _cur.grffile->grfid, subs_id); // pre-reserve the tile slot } @@ -5771,12 +5781,13 @@ static void StationMapSpriteGroup(ByteReader &buf, uint8_t idcount) continue; } - if (statspec->grf_prop.grffile != nullptr) { + if (statspec->grf_prop.HasGrfFile()) { GrfMsg(1, "StationMapSpriteGroup: Station {} mapped multiple times, skipping", station); continue; } statspec->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT] = _cur.spritegroups[groupid]; + statspec->grf_prop.grfid = _cur.grffile->grfid; statspec->grf_prop.grffile = _cur.grffile; statspec->grf_prop.local_id = station; StationClass::Assign(statspec); @@ -5955,12 +5966,13 @@ static void ObjectMapSpriteGroup(ByteReader &buf, uint8_t idcount) continue; } - if (spec->grf_prop.grffile != nullptr) { + if (spec->grf_prop.HasGrfFile()) { GrfMsg(1, "ObjectMapSpriteGroup: Object {} mapped multiple times, skipping", object); continue; } spec->grf_prop.spritegroup[OBJECT_SPRITE_GROUP_DEFAULT] = _cur.spritegroups[groupid]; + spec->grf_prop.grfid = _cur.grffile->grfid; spec->grf_prop.grffile = _cur.grffile; spec->grf_prop.local_id = object; } @@ -6141,12 +6153,13 @@ static void RoadStopMapSpriteGroup(ByteReader &buf, uint8_t idcount) continue; } - if (roadstopspec->grf_prop.grffile != nullptr) { + if (roadstopspec->grf_prop.HasGrfFile()) { GrfMsg(1, "RoadStopMapSpriteGroup: Road stop {} mapped multiple times, skipping", roadstop); continue; } roadstopspec->grf_prop.spritegroup[SpriteGroupCargo::SG_DEFAULT] = _cur.spritegroups[groupid]; + roadstopspec->grf_prop.grfid = _cur.grffile->grfid; roadstopspec->grf_prop.grffile = _cur.grffile; roadstopspec->grf_prop.local_id = roadstop; RoadStopClass::Assign(roadstopspec); @@ -9489,25 +9502,25 @@ static void FinaliseIndustriesArray() /* process the conversion of text at the end, so to be sure everything will be fine * and available. Check if it does not return undefind marker, which is a very good sign of a * substitute industry who has not changed the string been examined, thus using it as such */ - strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->name); + strid = GetGRFStringID(indsp->grf_prop.grfid, indsp->name); if (strid != STR_UNDEFINED) indsp->name = strid; - strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->closure_text); + strid = GetGRFStringID(indsp->grf_prop.grfid, indsp->closure_text); if (strid != STR_UNDEFINED) indsp->closure_text = strid; - strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->production_up_text); + strid = GetGRFStringID(indsp->grf_prop.grfid, indsp->production_up_text); if (strid != STR_UNDEFINED) indsp->production_up_text = strid; - strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->production_down_text); + strid = GetGRFStringID(indsp->grf_prop.grfid, indsp->production_down_text); if (strid != STR_UNDEFINED) indsp->production_down_text = strid; - strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->new_industry_text); + strid = GetGRFStringID(indsp->grf_prop.grfid, indsp->new_industry_text); if (strid != STR_UNDEFINED) indsp->new_industry_text = strid; if (indsp->station_name != STR_NULL) { /* STR_NULL (0) can be set by grf. It has a meaning regarding assignation of the * station's name. Don't want to lose the value, therefore, do not process. */ - strid = GetGRFStringID(indsp->grf_prop.grffile->grfid, indsp->station_name); + strid = GetGRFStringID(indsp->grf_prop.grfid, indsp->station_name); if (strid != STR_UNDEFINED) indsp->station_name = strid; } @@ -9522,9 +9535,9 @@ static void FinaliseIndustriesArray() } for (auto &indsp : _industry_specs) { - if (indsp.enabled && indsp.grf_prop.grffile != nullptr) { + if (indsp.enabled && indsp.grf_prop.HasGrfFile()) { for (auto &conflicting : indsp.conflicting) { - conflicting = MapNewGRFIndustryType(conflicting, indsp.grf_prop.grffile->grfid); + conflicting = MapNewGRFIndustryType(conflicting, indsp.grf_prop.grfid); } } if (!indsp.enabled) { @@ -9557,7 +9570,7 @@ static void FinaliseObjectsArray() { for (GRFFile * const file : _grf_files) { for (auto &objectspec : file->objectspec) { - if (objectspec != nullptr && objectspec->grf_prop.grffile != nullptr && objectspec->IsEnabled()) { + if (objectspec != nullptr && objectspec->grf_prop.HasGrfFile() && objectspec->IsEnabled()) { _object_mngr.SetEntitySpec(objectspec.get()); } } diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp index 0d90c0adad..e1b974432a 100644 --- a/src/newgrf_airport.cpp +++ b/src/newgrf_airport.cpp @@ -132,7 +132,7 @@ void BindAirportSpecs() void AirportOverrideManager::SetEntitySpec(AirportSpec *as) { - uint8_t airport_id = this->AddEntityID(as->grf_prop.local_id, as->grf_prop.grffile->grfid, as->grf_prop.subst_id); + uint8_t airport_id = this->AddEntityID(as->grf_prop.local_id, as->grf_prop.grfid, as->grf_prop.subst_id); if (airport_id == this->invalid_id) { GrfMsg(1, "Airport.SetEntitySpec: Too many airports allocated. Ignoring."); @@ -145,7 +145,7 @@ void AirportOverrideManager::SetEntitySpec(AirportSpec *as) for (int i = 0; i < this->max_offset; i++) { AirportSpec *overridden_as = AirportSpec::GetWithoutOverride(i); - if (this->entity_overrides[i] != as->grf_prop.local_id || this->grfid_overrides[i] != as->grf_prop.grffile->grfid) continue; + if (this->entity_overrides[i] != as->grf_prop.local_id || this->grfid_overrides[i] != as->grf_prop.grfid) continue; overridden_as->grf_prop.override = airport_id; overridden_as->enabled = false; @@ -277,9 +277,9 @@ StringID GetAirportTextCallback(const AirportSpec *as, uint8_t layout, uint16_t uint16_t cb_res = object.ResolveCallback(); if (cb_res == CALLBACK_FAILED || cb_res == 0x400) return STR_UNDEFINED; if (cb_res > 0x400) { - ErrorUnknownCallbackResult(as->grf_prop.grffile->grfid, callback, cb_res); + ErrorUnknownCallbackResult(as->grf_prop.grfid, callback, cb_res); return STR_UNDEFINED; } - return GetGRFStringID(as->grf_prop.grffile->grfid, 0xD000 + cb_res); + return GetGRFStringID(as->grf_prop.grfid, 0xD000 + cb_res); } diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index 8cd6123182..a5c28ec502 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -66,7 +66,7 @@ void AirportTileSpec::ResetAirportTiles() void AirportTileOverrideManager::SetEntitySpec(const AirportTileSpec *airpts) { - StationGfx airpt_id = this->AddEntityID(airpts->grf_prop.local_id, airpts->grf_prop.grffile->grfid, airpts->grf_prop.subst_id); + StationGfx airpt_id = this->AddEntityID(airpts->grf_prop.local_id, airpts->grf_prop.grfid, airpts->grf_prop.subst_id); if (airpt_id == this->invalid_id) { GrfMsg(1, "AirportTile.SetEntitySpec: Too many airport tiles allocated. Ignoring."); @@ -79,7 +79,7 @@ void AirportTileOverrideManager::SetEntitySpec(const AirportTileSpec *airpts) for (int i = 0; i < this->max_offset; i++) { AirportTileSpec *overridden_airpts = &AirportTileSpec::tiles[i]; - if (this->entity_overrides[i] != airpts->grf_prop.local_id || this->grfid_overrides[i] != airpts->grf_prop.grffile->grfid) continue; + if (this->entity_overrides[i] != airpts->grf_prop.local_id || this->grfid_overrides[i] != airpts->grf_prop.grfid) continue; overridden_airpts->grf_prop.override = airpt_id; overridden_airpts->enabled = false; @@ -141,7 +141,7 @@ static uint32_t GetAirportTileIDAtOffset(TileIndex tile, const Station *st, uint /* Overridden */ const AirportTileSpec *tile_ovr = AirportTileSpec::Get(ats->grf_prop.override); - if (tile_ovr->grf_prop.grffile->grfid == cur_grfid) { + if (tile_ovr->grf_prop.grfid == cur_grfid) { return tile_ovr->grf_prop.local_id; // same grf file } else { return 0xFFFE; // not the same grf file @@ -149,7 +149,7 @@ static uint32_t GetAirportTileIDAtOffset(TileIndex tile, const Station *st, uint } /* Not an 'old type' tile */ if (ats->grf_prop.spritegroup[0] != nullptr) { // tile has a spritegroup ? - if (ats->grf_prop.grffile->grfid == cur_grfid) { // same airport, same grf ? + if (ats->grf_prop.grfid == cur_grfid) { // same airport, same grf ? return ats->grf_prop.local_id; } else { return 0xFFFE; // Defined in another grf file diff --git a/src/newgrf_animation_base.h b/src/newgrf_animation_base.h index ab919e2e84..3352f7705a 100644 --- a/src/newgrf_animation_base.h +++ b/src/newgrf_animation_base.h @@ -58,7 +58,7 @@ struct AnimationBase { if (HasBit(spec->callback_mask, Tbase::cbm_animation_speed)) { uint16_t callback = GetCallback(Tbase::cb_animation_speed, 0, 0, spec, obj, tile, extra_data); if (callback != CALLBACK_FAILED) { - if (callback >= 0x100 && spec->grf_prop.grffile->grf_version >= 8) ErrorUnknownCallbackResult(spec->grf_prop.grffile->grfid, Tbase::cb_animation_speed, callback); + if (callback >= 0x100 && spec->grf_prop.grffile->grf_version >= 8) ErrorUnknownCallbackResult(spec->grf_prop.grfid, Tbase::cb_animation_speed, callback); animation_speed = Clamp(callback & 0xFF, 0, 16); } } diff --git a/src/newgrf_class_func.h b/src/newgrf_class_func.h index 57c2dda438..783bb99a3d 100644 --- a/src/newgrf_class_func.h +++ b/src/newgrf_class_func.h @@ -131,7 +131,7 @@ const Tspec *NewGRFClass::GetByGrf(uint32_t grfid, uint16_t for (const auto &spec : cls.spec) { if (spec == nullptr) continue; if (spec->grf_prop.local_id != local_id) continue; - if ((spec->grf_prop.grffile == nullptr ? 0 : spec->grf_prop.grffile->grfid) == grfid) return spec; + if (spec->grf_prop.grfid == grfid) return spec; } } diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index 822b641cbe..e9298790b8 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -158,7 +158,7 @@ uint16_t OverrideManagerBase::GetSubstituteID(uint16_t entity_id) const */ void HouseOverrideManager::SetEntitySpec(const HouseSpec *hs) { - HouseID house_id = this->AddEntityID(hs->grf_prop.local_id, hs->grf_prop.grffile->grfid, hs->grf_prop.subst_id); + HouseID house_id = this->AddEntityID(hs->grf_prop.local_id, hs->grf_prop.grfid, hs->grf_prop.subst_id); if (house_id == this->invalid_id) { GrfMsg(1, "House.SetEntitySpec: Too many houses allocated. Ignoring."); @@ -175,7 +175,7 @@ void HouseOverrideManager::SetEntitySpec(const HouseSpec *hs) for (int i = 0; i < this->max_offset; i++) { HouseSpec *overridden_hs = HouseSpec::Get(i); - if (this->entity_overrides[i] != hs->grf_prop.local_id || this->grfid_overrides[i] != hs->grf_prop.grffile->grfid) continue; + if (this->entity_overrides[i] != hs->grf_prop.local_id || this->grfid_overrides[i] != hs->grf_prop.grfid) continue; overridden_hs->grf_prop.override = house_id; this->entity_overrides[i] = this->invalid_id; @@ -222,7 +222,7 @@ uint16_t IndustryOverrideManager::AddEntityID(uint16_t grf_local_id, uint32_t gr /* This industry must be one that is not available(enabled), mostly because of climate. * And it must not already be used by a grf (grffile == nullptr). * So reserve this slot here, as it is the chosen one */ - if (!inds->enabled && inds->grf_prop.grffile == nullptr) { + if (!inds->enabled && !inds->grf_prop.HasGrfFile()) { EntityIDMapping *map = &this->mappings[id]; if (map->entity_id == 0 && map->grfid == 0) { @@ -247,14 +247,14 @@ uint16_t IndustryOverrideManager::AddEntityID(uint16_t grf_local_id, uint32_t gr void IndustryOverrideManager::SetEntitySpec(IndustrySpec *inds) { /* First step : We need to find if this industry is already specified in the savegame data. */ - IndustryType ind_id = this->GetID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid); + IndustryType ind_id = this->GetID(inds->grf_prop.local_id, inds->grf_prop.grfid); if (ind_id == this->invalid_id) { /* Not found. * Or it has already been overridden, so you've lost your place. * Or it is a simple substitute. * We need to find a free available slot */ - ind_id = this->AddEntityID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid, inds->grf_prop.subst_id); + ind_id = this->AddEntityID(inds->grf_prop.local_id, inds->grf_prop.grfid, inds->grf_prop.subst_id); inds->grf_prop.override = this->invalid_id; // make sure it will not be detected as overridden } @@ -271,7 +271,7 @@ void IndustryOverrideManager::SetEntitySpec(IndustrySpec *inds) void IndustryTileOverrideManager::SetEntitySpec(const IndustryTileSpec *its) { - IndustryGfx indt_id = this->AddEntityID(its->grf_prop.local_id, its->grf_prop.grffile->grfid, its->grf_prop.subst_id); + IndustryGfx indt_id = this->AddEntityID(its->grf_prop.local_id, its->grf_prop.grfid, its->grf_prop.subst_id); if (indt_id == this->invalid_id) { GrfMsg(1, "IndustryTile.SetEntitySpec: Too many industry tiles allocated. Ignoring."); @@ -284,7 +284,7 @@ void IndustryTileOverrideManager::SetEntitySpec(const IndustryTileSpec *its) for (int i = 0; i < this->max_offset; i++) { IndustryTileSpec *overridden_its = &_industry_tile_specs[i]; - if (this->entity_overrides[i] != its->grf_prop.local_id || this->grfid_overrides[i] != its->grf_prop.grffile->grfid) continue; + if (this->entity_overrides[i] != its->grf_prop.local_id || this->grfid_overrides[i] != its->grf_prop.grfid) continue; overridden_its->grf_prop.override = indt_id; overridden_its->enabled = false; @@ -302,14 +302,14 @@ void IndustryTileOverrideManager::SetEntitySpec(const IndustryTileSpec *its) void ObjectOverrideManager::SetEntitySpec(ObjectSpec *spec) { /* First step : We need to find if this object is already specified in the savegame data. */ - ObjectType type = this->GetID(spec->grf_prop.local_id, spec->grf_prop.grffile->grfid); + ObjectType type = this->GetID(spec->grf_prop.local_id, spec->grf_prop.grfid); if (type == this->invalid_id) { /* Not found. * Or it has already been overridden, so you've lost your place. * Or it is a simple substitute. * We need to find a free available slot */ - type = this->AddEntityID(spec->grf_prop.local_id, spec->grf_prop.grffile->grfid, OBJECT_TRANSMITTER); + type = this->AddEntityID(spec->grf_prop.local_id, spec->grf_prop.grfid, OBJECT_TRANSMITTER); } if (type == this->invalid_id) { diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index a45fcdf592..0c82254e80 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -309,8 +309,15 @@ bool Convert8bitBooleanCallback(const struct GRFFile *grffile, uint16_t cbid, ui template struct GRFFilePropsBase { uint16_t local_id = 0; ///< id defined by the grf file for this entity + uint32_t grfid = 0; ///< grfid that introduced this entity. const struct GRFFile *grffile = nullptr; ///< grf file that introduced this entity std::array spritegroup{}; ///< pointers to the different sprites of the entity + + /** + * Test if this entity was introduced by NewGRF. + * @returns true iff the grfid property is set. + */ + inline bool HasGrfFile() const { return this->grffile != nullptr; } }; /** Data related to the handling of grf files. */ diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 73713c9cce..f74f53dda4 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -71,6 +71,7 @@ void SetCustomEngineSprites(EngineID engine, uint8_t cargo, const SpriteGroup *g void SetEngineGRF(EngineID engine, const GRFFile *file) { Engine *e = Engine::Get(engine); + e->grf_prop.grfid = file->grfid; e->grf_prop.grffile = file; } diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index ee166c84ff..b87aaa63a5 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -273,14 +273,14 @@ static bool SearchNearbyHouseID(TileIndex tile, void *user_data) if (IsTileType(tile, MP_HOUSE)) { HouseID house = GetHouseType(tile); // tile been examined const HouseSpec *hs = HouseSpec::Get(house); - if (hs->grf_prop.grffile != nullptr) { // must be one from a grf file + if (hs->grf_prop.HasGrfFile()) { // must be one from a grf file SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data; TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'! if (north_tile == nbhd->north_tile) return false; // Always ignore origin house return hs->grf_prop.local_id == nbhd->hs->grf_prop.local_id && // same local id as the one requested - hs->grf_prop.grffile->grfid == nbhd->hs->grf_prop.grffile->grfid; // from the same grf + hs->grf_prop.grfid == nbhd->hs->grf_prop.grfid; // from the same grf } } return false; @@ -297,14 +297,14 @@ static bool SearchNearbyHouseClass(TileIndex tile, void *user_data) if (IsTileType(tile, MP_HOUSE)) { HouseID house = GetHouseType(tile); // tile been examined const HouseSpec *hs = HouseSpec::Get(house); - if (hs->grf_prop.grffile != nullptr) { // must be one from a grf file + if (hs->grf_prop.HasGrfFile()) { // must be one from a grf file SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data; TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'! if (north_tile == nbhd->north_tile) return false; // Always ignore origin house return hs->class_id == nbhd->hs->class_id && // same classid as the one requested - hs->grf_prop.grffile->grfid == nbhd->hs->grf_prop.grffile->grfid; // from the same grf + hs->grf_prop.grfid == nbhd->hs->grf_prop.grfid; // from the same grf } } return false; @@ -321,13 +321,13 @@ static bool SearchNearbyHouseGRFID(TileIndex tile, void *user_data) if (IsTileType(tile, MP_HOUSE)) { HouseID house = GetHouseType(tile); // tile been examined const HouseSpec *hs = HouseSpec::Get(house); - if (hs->grf_prop.grffile != nullptr) { // must be one from a grf file + if (hs->grf_prop.HasGrfFile()) { // must be one from a grf file SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data; TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'! if (north_tile == nbhd->north_tile) return false; // Always ignore origin house - return hs->grf_prop.grffile->grfid == nbhd->hs->grf_prop.grffile->grfid; // from the same grf + return hs->grf_prop.grfid == nbhd->hs->grf_prop.grfid; // from the same grf } } return false; @@ -429,9 +429,9 @@ static uint32_t GetDistanceFromNearbyHouse(uint8_t parameter, TileIndex tile, Ho /* Building counts for new houses with id = parameter. */ case 0x61: { const HouseSpec *hs = HouseSpec::Get(this->house_id); - if (hs->grf_prop.grffile == nullptr) return 0; + if (!hs->grf_prop.HasGrfFile()) return 0; - HouseID new_house = _house_mngr.GetID(parameter, hs->grf_prop.grffile->grfid); + HouseID new_house = _house_mngr.GetID(parameter, hs->grf_prop.grfid); return new_house == INVALID_HOUSE_ID ? 0 : GetNumHouses(new_house, this->town); } diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index 221c224922..0fcb9dcde7 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -71,7 +71,7 @@ uint32_t GetIndustryIDAtOffset(TileIndex tile, const Industry *i, uint32_t cur_g /* Overridden */ const IndustryTileSpec *tile_ovr = GetIndustryTileSpec(indtsp->grf_prop.override); - if (tile_ovr->grf_prop.grffile->grfid == cur_grfid) { + if (tile_ovr->grf_prop.grfid == cur_grfid) { return tile_ovr->grf_prop.local_id; // same grf file } else { return 0xFFFE; // not the same grf file @@ -79,7 +79,7 @@ uint32_t GetIndustryIDAtOffset(TileIndex tile, const Industry *i, uint32_t cur_g } /* Not an 'old type' tile */ if (indtsp->grf_prop.spritegroup[0] != nullptr) { // tile has a spritegroup ? - if (indtsp->grf_prop.grffile->grfid == cur_grfid) { // same industry, same grf ? + if (indtsp->grf_prop.grfid == cur_grfid) { // same industry, same grf ? return indtsp->grf_prop.local_id; } else { return 0xFFFE; // Defined in another grf file @@ -126,7 +126,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(uint8_t param_setID, uint8_ break; case 0xFFFFFFFF: // current grf - GrfID = GetIndustrySpec(current->type)->grf_prop.grffile->grfid; + GrfID = GetIndustrySpec(current->type)->grf_prop.grfid; [[fallthrough]]; default: // use the grfid specified in register 100h @@ -284,7 +284,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(uint8_t param_setID, uint8_ /* Distance of nearest industry of given type */ case 0x64: { if (this->tile == INVALID_TILE) break; - IndustryType type = MapNewGRFIndustryType(parameter, indspec->grf_prop.grffile->grfid); + IndustryType type = MapNewGRFIndustryType(parameter, indspec->grf_prop.grfid); if (type >= NUM_INDUSTRYTYPES) return UINT32_MAX; return GetClosestIndustry(this->tile, type, this->industry); } @@ -443,9 +443,8 @@ static uint32_t GetCountAndDistanceOfClosestInstance(uint8_t param_setID, uint8_ /* Create storage on first modification. */ const IndustrySpec *indsp = GetIndustrySpec(this->industry->type); - uint32_t grfid = (indsp->grf_prop.grffile != nullptr) ? indsp->grf_prop.grffile->grfid : 0; assert(PersistentStorage::CanAllocateItem()); - this->industry->psa = new PersistentStorage(grfid, GSF_INDUSTRIES, this->industry->location.tile); + this->industry->psa = new PersistentStorage(indsp->grf_prop.grfid, GSF_INDUSTRIES, this->industry->location.tile); } this->industry->psa->StoreValue(pos, value); @@ -584,7 +583,7 @@ uint32_t GetIndustryProbabilityCallback(IndustryType type, IndustryAvailabilityC if (res < 0x100) { default_prob = res; } else if (res > 0x100) { - ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_PROBABILITY, res); + ErrorUnknownCallbackResult(indspec->grf_prop.grfid, CBID_INDUSTRY_PROBABILITY, res); } } } diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index 14046a469b..832f9769ae 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -173,11 +173,11 @@ static uint32_t GetObjectIDAtOffset(TileIndex tile, uint32_t cur_grfid) const ObjectSpec *spec = ObjectSpec::Get(o->type); /* Default objects have no associated NewGRF file */ - if (spec->grf_prop.grffile == nullptr) { + if (!spec->grf_prop.HasGrfFile()) { return 0xFFFE; // Defined in another grf file } - if (spec->grf_prop.grffile->grfid == cur_grfid) { // same object, same grf ? + if (spec->grf_prop.grfid == cur_grfid) { // same object, same grf ? return spec->grf_prop.local_id | o->view << 16; } diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index 66c818c5f1..b2d949b6fc 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -570,7 +570,7 @@ int AllocateSpecToRoadStop(const RoadStopSpec *statspec, BaseStation *st, bool e if (exec) { if (i >= st->roadstop_speclist.size()) st->roadstop_speclist.resize(i + 1); st->roadstop_speclist[i].spec = statspec; - st->roadstop_speclist[i].grfid = statspec->grf_prop.grffile->grfid; + st->roadstop_speclist[i].grfid = statspec->grf_prop.grfid; st->roadstop_speclist[i].localidx = statspec->grf_prop.local_id; RoadStopUpdateCachedTriggers(st); diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 86dbe8bf32..a1caf62e40 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -708,7 +708,7 @@ int AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exe if (exec) { if (i >= st->speclist.size()) st->speclist.resize(i + 1); st->speclist[i].spec = statspec; - st->speclist[i].grfid = statspec->grf_prop.grffile->grfid; + st->speclist[i].grfid = statspec->grf_prop.grfid; st->speclist[i].localidx = statspec->grf_prop.local_id; StationUpdateCachedTriggers(st); diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 3c7bfa1432..5338fe5036 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -112,7 +112,7 @@ void BuildObject(ObjectType type, TileIndex tile, CompanyID owner, Town *town, u if (HasBit(spec->callback_mask, CBM_OBJ_COLOUR)) { uint16_t res = GetObjectCallback(CBID_OBJECT_COLOUR, o->colour, 0, spec, o, tile); if (res != CALLBACK_FAILED) { - if (res >= 0x100) ErrorUnknownCallbackResult(spec->grf_prop.grffile->grfid, CBID_OBJECT_COLOUR, res); + if (res >= 0x100) ErrorUnknownCallbackResult(spec->grf_prop.grfid, CBID_OBJECT_COLOUR, res); o->colour = GB(res, 0, 8); } } @@ -665,8 +665,8 @@ static void GetTileDesc_Object(TileIndex tile, TileDesc *td) td->owner[0] = GetTileOwner(tile); td->build_date = Object::GetByTile(tile)->build_date; - if (spec->grf_prop.grffile != nullptr) { - td->grf = GetGRFConfig(spec->grf_prop.grffile->grfid)->GetName(); + if (spec->grf_prop.HasGrfFile()) { + td->grf = GetGRFConfig(spec->grf_prop.grfid)->GetName(); } } diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 8bc2e98d4c..59003e1928 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -86,7 +86,7 @@ public: void DrawType(int x, int y, int cls_id, int id) const override { const auto *spec = this->GetSpec(cls_id, id); - if (spec->grf_prop.grffile == nullptr) { + if (!spec->grf_prop.HasGrfFile()) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; DrawOrigTileSeqInGUI(x, y, dts, PAL_NONE); @@ -207,7 +207,7 @@ public: int x = (ir.Width() - ScaleSpriteTrad(PREVIEW_WIDTH)) / 2 + ScaleSpriteTrad(PREVIEW_LEFT); int y = (ir.Height() + ScaleSpriteTrad(PREVIEW_HEIGHT)) / 2 - ScaleSpriteTrad(PREVIEW_BOTTOM); - if (spec->grf_prop.grffile == nullptr) { + if (!spec->grf_prop.HasGrfFile()) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; DrawOrigTileSeqInGUI(x, y, dts, PAL_NONE); @@ -228,9 +228,9 @@ public: uint16_t callback_res = GetObjectCallback(CBID_OBJECT_FUND_MORE_TEXT, 0, 0, spec, nullptr, INVALID_TILE, _object_gui.sel_view); if (callback_res != CALLBACK_FAILED && callback_res != 0x400) { if (callback_res > 0x400) { - ErrorUnknownCallbackResult(spec->grf_prop.grffile->grfid, CBID_OBJECT_FUND_MORE_TEXT, callback_res); + ErrorUnknownCallbackResult(spec->grf_prop.grfid, CBID_OBJECT_FUND_MORE_TEXT, callback_res); } else { - StringID message = GetGRFStringID(spec->grf_prop.grffile->grfid, 0xD000 + callback_res); + StringID message = GetGRFStringID(spec->grf_prop.grfid, 0xD000 + callback_res); if (message != STR_NULL && message != STR_UNDEFINED) { StartTextRefStackUsage(spec->grf_prop.grffile, 6); /* Use all the available space left from where we stand up to the diff --git a/src/picker_gui.h b/src/picker_gui.h index 3ff9e2f314..41fbd48f03 100644 --- a/src/picker_gui.h +++ b/src/picker_gui.h @@ -113,7 +113,7 @@ public: PickerItem GetPickerItem(const typename T::spec_type *spec, int cls_id = -1, int id = -1) const { if (spec == nullptr) return {0, 0, cls_id, id}; - return {spec->grf_prop.grffile == nullptr ? 0 : spec->grf_prop.grffile->grfid, spec->grf_prop.local_id, spec->class_index, spec->index}; + return {spec->grf_prop.grfid, spec->grf_prop.local_id, spec->class_index, spec->index}; } PickerItem GetPickerItem(int cls_id, int id) const override diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index 733561a58d..fdce9cb265 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -87,7 +87,7 @@ void MoveWaypointsToBaseStations() * from the GRF ID / station index. */ for (OldWaypoint &wp : _old_waypoints) { const auto specs = StationClass::Get(STAT_CLASS_WAYP)->Specs(); - auto found = std::ranges::find_if(specs, [&wp](const StationSpec *spec) { return spec != nullptr && spec->grf_prop.grffile->grfid == wp.grfid && spec->grf_prop.local_id == wp.localidx; }); + auto found = std::ranges::find_if(specs, [&wp](const StationSpec *spec) { return spec != nullptr && spec->grf_prop.grfid == wp.grfid && spec->grf_prop.local_id == wp.localidx; }); if (found != std::end(specs)) wp.spec = *found; } } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 7dac954c89..8a49d61864 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1479,7 +1479,7 @@ CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailTyp if (callback <= UINT8_MAX) { SetStationGfx(tile, (callback & ~1) + axis); } else { - ErrorUnknownCallbackResult(statspec->grf_prop.grffile->grfid, CBID_STATION_BUILD_TILE_LAYOUT, callback); + ErrorUnknownCallbackResult(statspec->grf_prop.grfid, CBID_STATION_BUILD_TILE_LAYOUT, callback); } } @@ -3503,8 +3503,8 @@ void FillTileDescRailStation(TileIndex tile, TileDesc *td) td->station_class = StationClass::Get(spec->class_index)->name; td->station_name = spec->name; - if (spec->grf_prop.grffile != nullptr) { - const GRFConfig *gc = GetGRFConfig(spec->grf_prop.grffile->grfid); + if (spec->grf_prop.HasGrfFile()) { + const GRFConfig *gc = GetGRFConfig(spec->grf_prop.grfid); td->grf = gc->GetName(); } } @@ -3523,11 +3523,11 @@ void FillTileDescAirport(TileIndex tile, TileDesc *td) const AirportTileSpec *ats = AirportTileSpec::GetByTile(tile); td->airport_tile_name = ats->name; - if (as->grf_prop.grffile != nullptr) { - const GRFConfig *gc = GetGRFConfig(as->grf_prop.grffile->grfid); + if (as->grf_prop.HasGrfFile()) { + const GRFConfig *gc = GetGRFConfig(as->grf_prop.grfid); td->grf = gc->GetName(); - } else if (ats->grf_prop.grffile != nullptr) { - const GRFConfig *gc = GetGRFConfig(ats->grf_prop.grffile->grfid); + } else if (ats->grf_prop.HasGrfFile()) { + const GRFConfig *gc = GetGRFConfig(ats->grf_prop.grfid); td->grf = gc->GetName(); } } @@ -3555,7 +3555,7 @@ static void GetTileDesc_Station(TileIndex tile, TileDesc *td) const IndustrySpec *is = GetIndustrySpec(i->type); td->owner[0] = i->owner; str = is->name; - if (is->grf_prop.grffile != nullptr) td->grf = GetGRFConfig(is->grf_prop.grffile->grfid)->GetName(); + if (is->grf_prop.HasGrfFile()) td->grf = GetGRFConfig(is->grf_prop.grfid)->GetName(); break; } case STATION_DOCK: str = STR_LAI_STATION_DESCRIPTION_SHIP_DOCK; break; diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 6f4f9eb486..aa4b4e9ba6 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -141,7 +141,7 @@ class NIHStation : public NIHelper { const void *GetInstance(uint ) const override { return nullptr; } const void *GetSpec(uint index) const override { return GetStationSpec(index); } void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), index); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetStationSpec(index)->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetStationSpec(index)->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint param, bool &avail) const override { @@ -201,12 +201,12 @@ static const NIVariable _niv_house[] = { }; class NIHHouse : public NIHelper { - bool IsInspectable(uint index) const override { return HouseSpec::Get(GetHouseType(index))->grf_prop.grffile != nullptr; } + bool IsInspectable(uint index) const override { return HouseSpec::Get(GetHouseType(index))->grf_prop.HasGrfFile(); } uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, GetTownIndex(index)); } const void *GetInstance(uint)const override { return nullptr; } const void *GetSpec(uint index) const override { return HouseSpec::Get(GetHouseType(index)); } void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_TOWN_NAME, GetTownIndex(index), index); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? HouseSpec::Get(GetHouseType(index))->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? HouseSpec::Get(GetHouseType(index))->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint param, bool &avail) const override { @@ -251,12 +251,12 @@ static const NIVariable _niv_industrytiles[] = { }; class NIHIndustryTile : public NIHelper { - bool IsInspectable(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grffile != nullptr; } + bool IsInspectable(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.HasGrfFile(); } uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_INDUSTRIES, GetIndustryIndex(index)); } const void *GetInstance(uint)const override { return nullptr; } const void *GetSpec(uint index) const override { return GetIndustryTileSpec(GetIndustryGfx(index)); } void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_INDUSTRY_NAME, GetIndustryIndex(index), index); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustryTileSpec(GetIndustryGfx(index))->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint param, bool &avail) const override { @@ -364,12 +364,12 @@ static const NIVariable _niv_industries[] = { }; class NIHIndustry : public NIHelper { - bool IsInspectable(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile != nullptr; } + bool IsInspectable(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type)->grf_prop.HasGrfFile(); } uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Industry::Get(index)->town->index); } const void *GetInstance(uint index)const override { return Industry::Get(index); } const void *GetSpec(uint index) const override { return GetIndustrySpec(Industry::Get(index)->type); } void SetStringParameters(uint index) const override { this->SetSimpleStringParameters(STR_INDUSTRY_NAME, index); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint param, bool &avail) const override { @@ -427,12 +427,12 @@ static const NIVariable _niv_objects[] = { }; class NIHObject : public NIHelper { - bool IsInspectable(uint index) const override { return ObjectSpec::GetByTile(index)->grf_prop.grffile != nullptr; } + bool IsInspectable(uint index) const override { return ObjectSpec::GetByTile(index)->grf_prop.HasGrfFile(); } uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Object::GetByTile(index)->town->index); } const void *GetInstance(uint index)const override { return Object::GetByTile(index); } const void *GetSpec(uint index) const override { return ObjectSpec::GetByTile(index); } void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT, INVALID_STRING_ID, index); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? ObjectSpec::GetByTile(index)->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? ObjectSpec::GetByTile(index)->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint param, bool &avail) const override { @@ -497,12 +497,12 @@ static const NICallback _nic_airporttiles[] = { }; class NIHAirportTile : public NIHelper { - bool IsInspectable(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grffile != nullptr; } + bool IsInspectable(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.HasGrfFile(); } uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_AIRPORTS, GetStationIndex(index)); } const void *GetInstance(uint)const override { return nullptr; } const void *GetSpec(uint index) const override { return AirportTileSpec::Get(GetAirportGfx(index)); } void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), index); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportTileSpec::Get(GetAirportGfx(index))->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint param, bool &avail) const override { @@ -538,12 +538,12 @@ static const NIVariable _niv_airports[] = { }; class NIHAirport : public NIHelper { - bool IsInspectable(uint index) const override { return AirportSpec::Get(Station::Get(index)->airport.type)->grf_prop.grffile != nullptr; } + bool IsInspectable(uint index) const override { return AirportSpec::Get(Station::Get(index)->airport.type)->grf_prop.HasGrfFile(); } uint GetParent(uint index) const override { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Station::Get(index)->town->index); } const void *GetInstance(uint index)const override { return Station::Get(index); } const void *GetSpec(uint index) const override { return AirportSpec::Get(Station::Get(index)->airport.type); } void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, index, Station::Get(index)->airport.tile); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportSpec::Get(Station::Get(index)->airport.type)->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? AirportSpec::Get(Station::Get(index)->airport.type)->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint param, bool &avail) const override { @@ -700,7 +700,7 @@ class NIHRoadStop : public NIHelper { const void *GetInstance(uint)const override { return nullptr; } const void *GetSpec(uint index) const override { return GetRoadStopSpec(index); } void SetStringParameters(uint index) const override { this->SetObjectAtStringParameters(STR_STATION_NAME, GetStationIndex(index), index); } - uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetRoadStopSpec(index)->grf_prop.grffile->grfid : 0; } + uint32_t GetGRFID(uint index) const override { return (this->IsInspectable(index)) ? GetRoadStopSpec(index)->grf_prop.grfid : 0; } uint Resolve(uint index, uint var, uint32_t param, bool &avail) const override { diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index ae02481c20..1042f3de18 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -869,9 +869,9 @@ static void GetTileDesc_Town(TileIndex tile, TileDesc *td) uint16_t callback_res = GetHouseCallback(CBID_HOUSE_CUSTOM_NAME, house_completed ? 1 : 0, 0, house, Town::GetByTile(tile), tile); if (callback_res != CALLBACK_FAILED && callback_res != 0x400) { if (callback_res > 0x400) { - ErrorUnknownCallbackResult(hs->grf_prop.grffile->grfid, CBID_HOUSE_CUSTOM_NAME, callback_res); + ErrorUnknownCallbackResult(hs->grf_prop.grfid, CBID_HOUSE_CUSTOM_NAME, callback_res); } else { - StringID new_name = GetGRFStringID(hs->grf_prop.grffile->grfid, 0xD000 + callback_res); + StringID new_name = GetGRFStringID(hs->grf_prop.grfid, 0xD000 + callback_res); if (new_name != STR_NULL && new_name != STR_UNDEFINED) { td->str = new_name; } @@ -883,8 +883,8 @@ static void GetTileDesc_Town(TileIndex tile, TileDesc *td) td->str = STR_LAI_TOWN_INDUSTRY_DESCRIPTION_UNDER_CONSTRUCTION; } - if (hs->grf_prop.grffile != nullptr) { - const GRFConfig *gc = GetGRFConfig(hs->grf_prop.grffile->grfid); + if (hs->grf_prop.HasGrfFile()) { + const GRFConfig *gc = GetGRFConfig(hs->grf_prop.grfid); td->grf = gc->GetName(); } diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 513ec66734..9e7cb11a07 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -1531,8 +1531,8 @@ public: PickerItem GetPickerItem(int cls_id, int id) const override { const auto *spec = HouseSpec::Get(id); - if (spec->grf_prop.grffile == nullptr) return {0, spec->Index(), cls_id, id}; - return {spec->grf_prop.grffile->grfid, spec->grf_prop.local_id, cls_id, id}; + if (!spec->grf_prop.HasGrfFile()) return {0, spec->Index(), cls_id, id}; + return {spec->grf_prop.grfid, spec->grf_prop.local_id, cls_id, id}; } int GetSelectedType() const override { return sel_type; } @@ -1587,7 +1587,7 @@ public: dst.insert(item); } else { /* Search for spec by grfid and local index. */ - auto it = std::ranges::find_if(specs, [&item](const HouseSpec &spec) { return spec.grf_prop.grffile != nullptr && spec.grf_prop.grffile->grfid == item.grfid && spec.grf_prop.local_id == item.local_id; }); + auto it = std::ranges::find_if(specs, [&item](const HouseSpec &spec) { return spec.grf_prop.grfid == item.grfid && spec.grf_prop.local_id == item.local_id; }); if (it == specs.end()) { /* Not preset, hide from UI. */ dst.insert({item.grfid, item.local_id, -1, -1}); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 7e5e63bc30..cff919b975 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -347,7 +347,7 @@ void VehicleLengthChanged(const Vehicle *u) { /* show a warning once for each engine in whole game and once for each GRF after each game load */ const Engine *engine = u->GetEngine(); - uint32_t grfid = engine->grf_prop.grffile->grfid; + uint32_t grfid = engine->grf_prop.grfid; GRFConfig *grfconfig = GetGRFConfig(grfid); if (_gamelog.GRFBugReverse(grfid, engine->grf_prop.local_id) || !HasBit(grfconfig->grf_bugs, GBUG_VEH_LENGTH)) { ShowNewGrfVehicleError(u->engine_type, STR_NEWGRF_BROKEN, STR_NEWGRF_BROKEN_VEHICLE_LENGTH, GBUG_VEH_LENGTH, true);