diff --git a/src/base_station_base.h b/src/base_station_base.h index 6d72322b85..03a5583943 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -22,13 +22,13 @@ extern StationPool _station_pool; struct StationSpecList { const StationSpec *spec; uint32 grfid; ///< GRF ID of this custom station - uint8 localidx; ///< Station ID within GRF of station + uint16_t localidx; ///< Station ID within GRF of station }; struct RoadStopSpecList { const RoadStopSpec *spec; uint32 grfid; ///< GRF ID of this custom road stop - uint8 localidx; ///< Station ID within GRF of road stop + uint16_t localidx; ///< Station ID within GRF of road stop }; struct RoadStopTileData { diff --git a/src/newgrf_class.h b/src/newgrf_class.h index a0073d1dd4..8946f84350 100644 --- a/src/newgrf_class.h +++ b/src/newgrf_class.h @@ -61,7 +61,7 @@ public: static Tid GetUIClass(uint index); static NewGRFClass *Get(Tid cls_id); - static const Tspec *GetByGrf(uint32 grfid, byte local_id, int *index); + static const Tspec *GetByGrf(uint32 grfid, uint16_t local_id, int *index); }; #endif /* NEWGRF_CLASS_H */ diff --git a/src/newgrf_class_func.h b/src/newgrf_class_func.h index 107ab83a36..8b09a5dfa4 100644 --- a/src/newgrf_class_func.h +++ b/src/newgrf_class_func.h @@ -187,7 +187,7 @@ DEFINE_NEWGRF_CLASS_METHOD(int)::GetUIFromIndex(int index) const * @param index Pointer to return the index of the spec in its class. If nullptr then not used. * @return The spec. */ -DEFINE_NEWGRF_CLASS_METHOD(const Tspec *)::GetByGrf(uint32 grfid, byte local_id, int *index) +DEFINE_NEWGRF_CLASS_METHOD(const Tspec *)::GetByGrf(uint32 grfid, uint16_t local_id, int *index) { uint j; @@ -222,4 +222,4 @@ DEFINE_NEWGRF_CLASS_METHOD(const Tspec *)::GetByGrf(uint32 grfid, byte local_id, template const Tspec *name::GetSpec(uint index) const; \ template int name::GetUIFromIndex(int index) const; \ template int name::GetIndexFromUI(int ui_index) const; \ - template const Tspec *name::GetByGrf(uint32 grfid, byte localidx, int *index); + template const Tspec *name::GetByGrf(uint32 grfid, uint16_t local_id, int *index); diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index c33c80beec..a44d4662e2 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -58,7 +58,7 @@ OverrideManagerBase::OverrideManagerBase(uint16 offset, uint16 maximum, uint16 i * @param grfid ID of the grf file * @param entity_type original entity type */ -void OverrideManagerBase::Add(uint8 local_id, uint32 grfid, uint entity_type) +void OverrideManagerBase::Add(uint16_t local_id, uint32 grfid, uint entity_type) { assert(entity_type < this->max_offset); /* An override can be set only once */ @@ -86,7 +86,7 @@ void OverrideManagerBase::ResetOverride() * @param grfid ID of the grf file * @return the ID of the candidate, of the Invalid flag item ID */ -uint16 OverrideManagerBase::GetID(uint8 grf_local_id, uint32 grfid) const +uint16 OverrideManagerBase::GetID(uint16_t grf_local_id, uint32 grfid) const { for (uint16 id = 0; id < this->max_entities; id++) { const EntityIDMapping *map = &this->mappings[id]; @@ -105,7 +105,7 @@ uint16 OverrideManagerBase::GetID(uint8 grf_local_id, uint32 grfid) const * @param substitute_id is the original entity from which data is copied for the new one * @return the proper usable slot id, or invalid marker if none is found */ -uint16 OverrideManagerBase::AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id) +uint16 OverrideManagerBase::AddEntityID(uint16_t grf_local_id, uint32 grfid, uint16_t substitute_id) { uint16 id = this->GetID(grf_local_id, grfid); @@ -184,7 +184,7 @@ void HouseOverrideManager::SetEntitySpec(const HouseSpec *hs) * @param grfid ID of the grf file * @return the ID of the candidate, of the Invalid flag item ID */ -uint16 IndustryOverrideManager::GetID(uint8 grf_local_id, uint32 grfid) const +uint16 IndustryOverrideManager::GetID(uint16_t grf_local_id, uint32 grfid) const { uint16 id = OverrideManagerBase::GetID(grf_local_id, grfid); if (id != this->invalid_id) return id; @@ -204,7 +204,7 @@ uint16 IndustryOverrideManager::GetID(uint8 grf_local_id, uint32 grfid) const * @param substitute_id industry from which data has been copied * @return a free entity id (slotid) if ever one has been found, or Invalid_ID marker otherwise */ -uint16 IndustryOverrideManager::AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id) +uint16 IndustryOverrideManager::AddEntityID(uint16_t grf_local_id, uint32 grfid, uint16 substitute_id) { /* This entity hasn't been defined before, so give it an ID now. */ for (uint16 id = 0; id < this->max_entities; id++) { diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index a53752ed0e..06e5fb5f7c 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -185,8 +185,8 @@ private: */ struct EntityIDMapping { uint32 grfid; ///< The GRF ID of the file the entity belongs to - uint8 entity_id; ///< The entity ID within the GRF file - uint8 substitute_id; ///< The (original) entity ID to use if this GRF is not available + uint16_t entity_id; ///< The entity ID within the GRF file + uint16_t substitute_id; ///< The (original) entity ID to use if this GRF is not available }; class OverrideManagerBase { @@ -209,12 +209,12 @@ public: void ResetOverride(); void ResetMapping(); - void Add(uint8 local_id, uint32 grfid, uint entity_type); - virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id); + void Add(uint16_t local_id, uint32 grfid, uint entity_type); + virtual uint16 AddEntityID(uint16_t grf_local_id, uint32 grfid, uint16_t substitute_id); uint32 GetGRFID(uint16 entity_id) const; uint16 GetSubstituteID(uint16 entity_id) const; - virtual uint16 GetID(uint8 grf_local_id, uint32 grfid) const; + virtual uint16 GetID(uint16_t grf_local_id, uint32 grfid) const; inline uint16 GetMaxMapping() const { return this->max_entities; } inline uint16 GetMaxOffset() const { return this->max_offset; } @@ -237,8 +237,8 @@ public: IndustryOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : OverrideManagerBase(offset, maximum, invalid) {} - uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id) override; - uint16 GetID(uint8 grf_local_id, uint32 grfid) const override; + uint16 AddEntityID(uint16_t grf_local_id, uint32 grfid, uint16_t substitute_id) override; + uint16 GetID(uint16_t grf_local_id, uint32 grfid) const override; void SetEntitySpec(IndustrySpec *inds); }; diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index a311ee2f79..d59457d94b 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -157,7 +157,7 @@ uint32 RoadStopScopeResolver::GetVariable(byte variable, uint32 parameter, bool if (IsCustomRoadStopSpecIndex(nearby_tile)) { const RoadStopSpecList ssl = BaseStation::GetByTile(nearby_tile)->roadstop_speclist[GetCustomRoadStopSpecIndex(nearby_tile)]; - res |= 1 << (ssl.grfid != grfid ? 9 : 8) | ssl.localidx; + res |= 1 << (ssl.grfid != grfid ? 9 : 8) | std::max(ssl.localidx, 0xFF); } return res; } diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index ba6ee47fad..b40674250b 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -364,7 +364,7 @@ TownScopeResolver *StationResolverObject::GetTown() if (IsCustomStationSpecIndex(nearby_tile)) { const StationSpecList ssl = BaseStation::GetByTile(nearby_tile)->speclist[GetCustomStationSpecIndex(nearby_tile)]; - res |= 1 << (ssl.grfid != grfid ? 9 : 8) | ssl.localidx; + res |= 1 << (ssl.grfid != grfid ? 9 : 8) | std::max(ssl.localidx, 0xFF); } return res; } diff --git a/src/saveload/newgrf_sl.cpp b/src/saveload/newgrf_sl.cpp index d15057564a..1c2fd7ff24 100644 --- a/src/saveload/newgrf_sl.cpp +++ b/src/saveload/newgrf_sl.cpp @@ -20,8 +20,10 @@ /** Save and load the mapping between a spec and the NewGRF it came from. */ static const SaveLoad _newgrf_mapping_desc[] = { SLE_VAR(EntityIDMapping, grfid, SLE_UINT32), - SLE_VAR(EntityIDMapping, entity_id, SLE_UINT8), - SLE_VAR(EntityIDMapping, substitute_id, SLE_UINT8), + SLE_CONDVAR(EntityIDMapping, entity_id, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_EXTEND_ENTITY_MAPPING), + SLE_CONDVAR(EntityIDMapping, entity_id, SLE_UINT16, SLV_EXTEND_ENTITY_MAPPING, SL_MAX_VERSION), + SLE_CONDVAR(EntityIDMapping, substitute_id, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_EXTEND_ENTITY_MAPPING), + SLE_CONDVAR(EntityIDMapping, substitute_id, SLE_UINT16, SLV_EXTEND_ENTITY_MAPPING, SL_MAX_VERSION), }; /** diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index f95ec57150..a00171abd7 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -354,6 +354,7 @@ enum SaveLoadVersion : uint16 { SLV_AI_START_DATE, ///< 309 PR#10653 Removal of individual AI start dates and added a generic one. SLV_EXTEND_VEHICLE_RANDOM, ///< 310 PR#10701 Extend vehicle random bits. + SLV_EXTEND_ENTITY_MAPPING, ///< 311 PR#10672 Extend entity mapping range. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 277bf9652b..93f4db3171 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -205,8 +205,9 @@ static void SwapPackets(GoodsEntry *ge) class SlStationSpecList : public DefaultSaveLoadHandler { public: inline static const SaveLoad description[] = { - SLE_CONDVAR(StationSpecList, grfid, SLE_UINT32, SLV_27, SL_MAX_VERSION), - SLE_CONDVAR(StationSpecList, localidx, SLE_UINT8, SLV_27, SL_MAX_VERSION), + SLE_CONDVAR(StationSpecList, grfid, SLE_UINT32, SLV_27, SL_MAX_VERSION), + SLE_CONDVAR(StationSpecList, localidx, SLE_FILE_U8 | SLE_VAR_U16, SLV_27, SLV_EXTEND_ENTITY_MAPPING), + SLE_CONDVAR(StationSpecList, localidx, SLE_UINT16, SLV_EXTEND_ENTITY_MAPPING, SL_MAX_VERSION), }; inline const static SaveLoadCompatTable compat_description = _station_spec_list_sl_compat; @@ -236,8 +237,9 @@ uint8 SlStationSpecList::last_num_specs; class SlRoadStopSpecList : public DefaultSaveLoadHandler { public: inline static const SaveLoad description[] = { - SLE_VAR(RoadStopSpecList, grfid, SLE_UINT32), - SLE_VAR(RoadStopSpecList, localidx, SLE_UINT8), + SLE_VAR(RoadStopSpecList, grfid, SLE_UINT32), + SLE_CONDVAR(RoadStopSpecList, localidx, SLE_FILE_U8 | SLE_VAR_U16, SLV_27, SLV_EXTEND_ENTITY_MAPPING), + SLE_CONDVAR(RoadStopSpecList, localidx, SLE_UINT16, SLV_EXTEND_ENTITY_MAPPING, SL_MAX_VERSION), }; inline const static SaveLoadCompatTable compat_description = _station_road_stop_spec_list_sl_compat;