From 6a0d1c7c1934f5f98ba7c2bc7956c2e6590c94df Mon Sep 17 00:00:00 2001 From: PeterN Date: Fri, 13 Jan 2023 19:22:31 +0000 Subject: [PATCH] Fix: Link variants to parents when finalising engines. (#10346) This ensures that definition-order of engines within the NewGRF does not matter. --- src/newgrf.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 62e72f8e8e..bbf29750a0 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1329,7 +1329,7 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop break; case 0x2F: // Engine variant - ei->variant_id = GetNewEngineID(_cur.grffile, VEH_TRAIN, buf->ReadWord()); + ei->variant_id = buf->ReadWord(); break; case 0x30: // Extra miscellaneous flags @@ -1531,7 +1531,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop } case 0x26: // Engine variant - ei->variant_id = GetNewEngineID(_cur.grffile, VEH_ROAD, buf->ReadWord()); + ei->variant_id = buf->ReadWord(); break; case 0x27: // Extra miscellaneous flags @@ -1711,7 +1711,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop } case 0x20: // Engine variant - ei->variant_id = GetNewEngineID(_cur.grffile, VEH_SHIP, buf->ReadWord()); + ei->variant_id = buf->ReadWord(); break; case 0x21: // Extra miscellaneous flags @@ -1873,7 +1873,7 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int break; case 0x20: // Engine variant - ei->variant_id = GetNewEngineID(_cur.grffile, VEH_AIRCRAFT, buf->ReadWord()); + ei->variant_id = buf->ReadWord(); break; case 0x21: // Extra miscellaneous flags @@ -9001,13 +9001,16 @@ static void FinaliseEngineArray() } } - if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue; - - /* Set appropriate flags on variant engine */ + /* Do final mapping on variant engine ID and set appropriate flags on variant engine */ if (e->info.variant_id != INVALID_ENGINE) { - Engine::Get(e->info.variant_id)->display_flags |= EngineDisplayFlags::HasVariants | EngineDisplayFlags::IsFolded; + e->info.variant_id = GetNewEngineID(e->grf_prop.grffile, e->type, e->info.variant_id); + if (e->info.variant_id != INVALID_ENGINE) { + Engine::Get(e->info.variant_id)->display_flags |= EngineDisplayFlags::HasVariants | EngineDisplayFlags::IsFolded; + } } + if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue; + /* Skip wagons, there livery is defined via the engine */ if (e->type != VEH_TRAIN || e->u.rail.railveh_type != RAILVEH_WAGON) { LiveryScheme ls = GetEngineLiveryScheme(e->index, INVALID_ENGINE, nullptr);