mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Store grfid with entity grfprops.
This allows using the grfid without having to dereference the grffile pointer. Uses no extra storage as it fits within otherwise wasted padding space.pull/13124/head
parent
e750d10cee
commit
e73d6fcaac
|
@ -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<Colours>(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();
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -131,7 +131,7 @@ const Tspec *NewGRFClass<Tspec, Tindex, Tmax>::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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -309,8 +309,15 @@ bool Convert8bitBooleanCallback(const struct GRFFile *grffile, uint16_t cbid, ui
|
|||
template <size_t Tcnt>
|
||||
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<const struct SpriteGroup *, Tcnt> 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. */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue