Codechange: Store the rail type of rail engines as a RailTypes bitmask.
This commit is contained in:
@@ -271,7 +271,8 @@ Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t internal_id
|
||||
_gted.resize(Engine::GetPoolSize());
|
||||
}
|
||||
if (type == VEH_TRAIN) {
|
||||
_gted[e->index].railtypelabel = GetRailTypeInfo(e->u.rail.railtype)->label;
|
||||
_gted[e->index].railtypelabels.clear();
|
||||
for (RailType rt : e->u.rail.railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label);
|
||||
}
|
||||
|
||||
GrfMsg(5, "Created new engine at index {} for GRFID {:x}, type {}, index {}", e->index, std::byteswap(file->grfid), type, internal_id);
|
||||
@@ -425,7 +426,8 @@ void ResetNewGRFData()
|
||||
|
||||
/* Fill rail type label temporary data for default trains */
|
||||
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
||||
_gted[e->index].railtypelabel = GetRailTypeInfo(e->u.rail.railtype)->label;
|
||||
_gted[e->index].railtypelabels.clear();
|
||||
for (RailType rt : e->u.rail.railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label);
|
||||
}
|
||||
|
||||
/* Reset GRM reservations */
|
||||
@@ -864,7 +866,11 @@ static void FinaliseEngineArray()
|
||||
if (!e->info.climates.Test(_settings_game.game_creation.landscape)) continue;
|
||||
|
||||
switch (e->type) {
|
||||
case VEH_TRAIN: AppendCopyableBadgeList(e->badges, GetRailTypeInfo(e->u.rail.railtype)->badges, GSF_TRAINS); break;
|
||||
case VEH_TRAIN:
|
||||
for (RailType rt : e->u.rail.railtypes) {
|
||||
AppendCopyableBadgeList(e->badges, GetRailTypeInfo(rt)->badges, GSF_TRAINS);
|
||||
}
|
||||
break;
|
||||
case VEH_ROAD: AppendCopyableBadgeList(e->badges, GetRoadTypeInfo(e->u.road.roadtype)->badges, GSF_ROADVEHICLES); break;
|
||||
default: break;
|
||||
}
|
||||
@@ -1711,13 +1717,18 @@ static void AfterLoadGRFs()
|
||||
}
|
||||
|
||||
for (Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
||||
RailType railtype = GetRailTypeByLabel(_gted[e->index].railtypelabel);
|
||||
if (railtype == INVALID_RAILTYPE) {
|
||||
RailTypes railtypes{};
|
||||
for (RailTypeLabel label : _gted[e->index].railtypelabels) {
|
||||
auto rt = GetRailTypeByLabel(label);
|
||||
if (rt != INVALID_RAILTYPE) railtypes.Set(rt);
|
||||
}
|
||||
|
||||
if (railtypes.Any()) {
|
||||
e->u.rail.railtypes = railtypes;
|
||||
e->u.rail.intended_railtypes = railtypes;
|
||||
} else {
|
||||
/* Rail type is not available, so disable this engine */
|
||||
e->info.climates = {};
|
||||
} else {
|
||||
e->u.rail.railtype = railtype;
|
||||
e->u.rail.intended_railtype = railtype;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user