From c79467692812db55bafe6348a73d53d413704818 Mon Sep 17 00:00:00 2001 From: merni-ns <66267867+merni-ns@users.noreply.github.com> Date: Tue, 3 Oct 2023 18:13:15 +0530 Subject: [PATCH] Fix #10763, Fix #11168: Display variant groups that consist only of unavailable sub-groups (#11342) --- src/autoreplace_gui.cpp | 8 +++++++- src/build_vehicle_gui.cpp | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 467e64d4b8..a95c0034c7 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -179,7 +179,13 @@ class ReplaceVehicleWindow : public Window { if (side == 1 && eid == this->sel_engine[0]) flags |= EngineDisplayFlags::Shaded; list.emplace_back(eid, e->info.variant_id, flags, 0); - if (side == 1 && e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id); + if (side == 1) { + EngineID parent = e->info.variant_id; + while (parent != INVALID_ENGINE) { + variants.push_back(parent); + parent = Engine::Get(parent)->info.variant_id; + } + } if (eid == this->sel_engine[side]) selected_engine = eid; // The selected engine is still in the list } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 9c869426e5..bbe6034f60 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1422,7 +1422,14 @@ struct BuildVehicleWindow : Window { list.emplace_back(eid, e->info.variant_id, e->display_flags, 0); if (rvi->railveh_type != RAILVEH_WAGON) num_engines++; - if (e->info.variant_id != INVALID_ENGINE) variants.push_back(e->info.variant_id); + + /* Add all parent variants of this engine to the variant list */ + EngineID parent = e->info.variant_id; + while (parent != INVALID_ENGINE) { + variants.push_back(parent); + parent = Engine::Get(parent)->info.variant_id; + } + if (eid == this->sel_engine) sel_id = eid; } @@ -1563,8 +1570,13 @@ struct BuildVehicleWindow : Window { /* ensure primary engine of variant group is in list after filtering */ std::vector variants; for (const auto &item : this->eng_list) { - if (item.engine_id != item.variant_id && item.variant_id != INVALID_ENGINE) variants.push_back(item.variant_id); + EngineID parent = item.variant_id; + while (parent != INVALID_ENGINE) { + variants.push_back(parent); + parent = Engine::Get(parent)->info.variant_id; + } } + for (const auto &variant : variants) { if (std::find(this->eng_list.begin(), this->eng_list.end(), variant) == this->eng_list.end()) { const Engine *e = Engine::Get(variant);