From b42abfbefccf82c20547e42a21202c06a65fc6a2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 23 May 2025 19:55:22 +0100 Subject: [PATCH] Fix 0455627d16: Incorrect script order position mapping. (#14294) --- src/script/api/script_order.cpp | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index 255bb8790a..617394ddf8 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -89,17 +89,10 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr assert(ScriptOrder::IsValidVehicleOrder(vehicle_id, order_position)); - int pos = (int)order_position; - int res = (int)order_position; - for (const Order &order : v->Orders()) { - if (order.IsType(OT_IMPLICIT)) { - ++res; - } else { - if (pos == 0) break; - --pos; - } - } - return res; + auto orders = v->Orders(); + auto real_orders = orders | std::views::filter([](const Order &order) { return !order.IsType(OT_IMPLICIT); }); + auto it = std::ranges::next(std::begin(real_orders), order_position, std::end(real_orders)); + return static_cast(std::distance(std::begin(orders), it.base())); } /** @@ -111,18 +104,11 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle { const Vehicle *v = ::Vehicle::Get(vehicle_id); - int num_implicit_orders = 0; - int pos = order_position; - for (const Order &order : v->Orders()) { - if (order.IsType(OT_IMPLICIT)) { - ++num_implicit_orders; - } else { - if (pos == 0) break; - --pos; - } - - } - return static_cast(order_position - num_implicit_orders); + auto orders = v->Orders(); + auto first = std::begin(orders); + auto last = std::ranges::next(first, order_position, std::end(orders)); + int num_implicit = static_cast(std::count_if(first, last, [](const Order &order) { return order.IsType(OT_IMPLICIT); })); + return static_cast(order_position - num_implicit); } /* static */ bool ScriptOrder::IsGotoStationOrder(VehicleID vehicle_id, OrderPosition order_position)