From 00795513b9ffc540964f22954d0015cd80524f85 Mon Sep 17 00:00:00 2001 From: maj00r Date: Sun, 4 Oct 2026 14:33:48 +0200 Subject: [PATCH] Keep a last-vehicle coupler set by hand The back of the consist goes to 0 after every change unless its coupler was set in the editor; a car that gets a neighbour loses that mark, so it is freed again once it is last again. --- StarterNG.Tests/ConsistTailTests.cs | 26 +++++++++++++++++++++++++ StarterNG/Classes/Trainset.cs | 9 ++++++++- StarterNG/Domain/Consist.cs | 17 ++++++++++------ StarterNG/Views/Depot/VehicleDetails.cs | 2 ++ StarterNG/startercfg/lang/cz.xml | 2 +- StarterNG/startercfg/lang/en.xml | 2 +- StarterNG/startercfg/lang/hu.xml | 2 +- StarterNG/startercfg/lang/pl.xml | 2 +- StarterNG/startercfg/lang/ru.xml | 2 +- 9 files changed, 52 insertions(+), 12 deletions(-) diff --git a/StarterNG.Tests/ConsistTailTests.cs b/StarterNG.Tests/ConsistTailTests.cs index 87fa521..d36f13c 100644 --- a/StarterNG.Tests/ConsistTailTests.cs +++ b/StarterNG.Tests/ConsistTailTests.cs @@ -56,6 +56,32 @@ public class ConsistTailTests Assert.Equal("0.BP", car.Cars[0].Coupling.ToString()); } + [Fact] + public void A_coupler_set_by_hand_on_the_last_car_stays() + { + Append("b111-01"); + var last = Append("b111-02"); + last.Cars[0].Coupling.Flags = 3; + last.Cars[0].CouplerSetByHand = true; + + _consist.AutoConnectAll(); + + Assert.Equal(3, last.Cars[0].Coupling.Flags); + } + + [Fact] + public void A_car_set_by_hand_that_gets_a_neighbour_is_freed_again_once_it_is_last_again() + { + var first = Append("b111-01"); + first.Cars[0].CouplerSetByHand = true; + var second = Append("b111-02"); + _consist.AutoConnectAll(); + + _consist.Remove(second); + + Assert.Equal(0, first.Cars[0].Coupling.Flags); + } + private ConsistItem Append(string skin) { var item = new ConsistItem diff --git a/StarterNG/Classes/Trainset.cs b/StarterNG/Classes/Trainset.cs index 47ed387..e17c464 100644 --- a/StarterNG/Classes/Trainset.cs +++ b/StarterNG/Classes/Trainset.cs @@ -235,6 +235,12 @@ public class Dynamic public bool Flipped; + /// + /// The coupler was set in the editor, so the consist leaves it be at the back of + /// the train. Not written out: in the scenery a coupler is just a coupler. + /// + public bool CouplerSetByHand; + public static bool IsPantStateType(string? type) => string.Equals(type, PantState, StringComparison.OrdinalIgnoreCase); @@ -302,7 +308,8 @@ public class Dynamic LoadCount = LoadCount, LoadType = LoadType, MiniName = MiniName, - Flipped = Flipped + Flipped = Flipped, + CouplerSetByHand = CouplerSetByHand }; public string ToTrainsetNode() diff --git a/StarterNG/Domain/Consist.cs b/StarterNG/Domain/Consist.cs index d9509f6..24af9c5 100644 --- a/StarterNG/Domain/Consist.cs +++ b/StarterNG/Domain/Consist.cs @@ -554,6 +554,7 @@ public sealed class Consist : IReadOnlyList common &= ~Coupling.ControlMU; left.Coupling.Flags = left.Coupling.Locked ? -common : common; + left.CouplerSetByHand = false; } FreeTail(); @@ -605,15 +606,19 @@ public sealed class Consist : IReadOnlyList item.Flipped ? item.Cars[^1] : item.Cars[0]; /// - /// Clears the coupler at the back of the consist. The simulator hangs the end - /// signals only on a last vehicle whose coupler is 0 - anything else couples it - /// to whatever stands behind - and every new car comes with 3. Its parameters, - /// the brake setting among them, stay. + /// Clears the coupler at the back of the consist, unless it was set in the + /// editor. The simulator hangs the end signals only on a last vehicle whose + /// coupler is 0 - anything else couples it to whatever stands behind - and every + /// new car comes with 3. Its parameters, the brake setting among them, stay. /// private void FreeTail() { - if (_items.Count > 0 && _items[^1].Cars.Count > 0) - TailCar(_items[^1]).Coupling.Flags = 0; + if (_items.Count == 0 || _items[^1].Cars.Count == 0) + return; + + var tail = TailCar(_items[^1]); + if (!tail.CouplerSetByHand) + tail.Coupling.Flags = 0; } /// diff --git a/StarterNG/Views/Depot/VehicleDetails.cs b/StarterNG/Views/Depot/VehicleDetails.cs index 19105bf..41e6d06 100644 --- a/StarterNG/Views/Depot/VehicleDetails.cs +++ b/StarterNG/Views/Depot/VehicleDetails.cs @@ -207,6 +207,7 @@ public sealed class VehicleDetails check.IsCheckedChanged += (_, _) => { d.Coupling.Set(bit, check.IsChecked == true); + d.CouplerSetByHand = true; _redraw(); }; Grid.SetRow(check, i / 2); @@ -229,6 +230,7 @@ public sealed class VehicleDetails { if (unitIdx <= 0) return; d.Coupling.Flags = Consist.TailCar(_consist[unitIdx - 1]).Coupling.Flags; + d.CouplerSetByHand = true; _redraw(); Refresh(); }; diff --git a/StarterNG/startercfg/lang/cz.xml b/StarterNG/startercfg/lang/cz.xml index a590c87..3bb39ca 100644 --- a/StarterNG/startercfg/lang/cz.xml +++ b/StarterNG/startercfg/lang/cz.xml @@ -280,7 +280,7 @@ Rozdělit jednotku na jednotlivé vozy Společné pro celou jednotku Spřáhlo na konci jednotky - Poslední vozidlo: spřáhlo 0 dává koncovky. Jiný kód spojí soupravu s tím, co stojí za ní, a simulátor koncovky nenasadí. + Poslední vozidlo: spřáhlo 0 dává koncovky, jiný kód spojí soupravu s tím, co stojí za ní, bez koncovek. Starter zde po každé změně soupravy nastaví 0, pokud spřáhlo nenastavíte ručně. Spojit Spojit toto vozidlo s následujícím do jedné jednotky Přetáhněte pro změnu pořadí diff --git a/StarterNG/startercfg/lang/en.xml b/StarterNG/startercfg/lang/en.xml index cfee6bc..309632f 100644 --- a/StarterNG/startercfg/lang/en.xml +++ b/StarterNG/startercfg/lang/en.xml @@ -280,7 +280,7 @@ Split the unit into individual cars Shared by the whole unit Coupler at the rear of the unit - Last vehicle: coupler 0 gets the end signals. Any other code couples the train to whatever stands behind it, and the simulator puts up no end signals. + Last vehicle: coupler 0 gets the end signals; any other code couples the train to whatever stands behind it, with no end signals. The starter sets 0 here after every change to the consist, unless you set the coupler by hand. Join Couple this vehicle with the next one into a single unit Drag to reorder diff --git a/StarterNG/startercfg/lang/hu.xml b/StarterNG/startercfg/lang/hu.xml index adebde5..4b35385 100644 --- a/StarterNG/startercfg/lang/hu.xml +++ b/StarterNG/startercfg/lang/hu.xml @@ -280,7 +280,7 @@ Az egység szétbontása külön kocsikra Az egész egységre közös Az egység végén lévő kapcsolókészülék - Utolsó jármű: a 0-s kapcsolat adja a zárjelzőket. Más kód a mögötte álló járműhöz kapcsolja a szerelvényt, és a szimulátor nem tesz fel zárjelzőt. + Utolsó jármű: a 0-s kapcsolat adja a zárjelzőket, más kód a mögötte állóhoz kapcsolja a szerelvényt, zárjelzők nélkül. A starter minden szerelvényváltozás után 0-ra állítja, hacsak kézzel nem állítod be. Összekapcsolás A jármű összekapcsolása a következővel egy egységgé Húzza az átrendezéshez diff --git a/StarterNG/startercfg/lang/pl.xml b/StarterNG/startercfg/lang/pl.xml index 5e47050..8b745ed 100644 --- a/StarterNG/startercfg/lang/pl.xml +++ b/StarterNG/startercfg/lang/pl.xml @@ -280,7 +280,7 @@ Rozdziel zespół na pojedyncze człony Ustawienie wspólne dla całego zespołu Sprzęg na końcu zespołu - Ostatni pojazd: sprzęg 0 daje końcówki. Inny kod połączy skład z tym, co stoi za nim, a symulator nie założy końcówek. + Ostatni pojazd: sprzęg 0 daje końcówki, a inny kod połączy skład z tym, co stoi za nim, bez końcówek. Starter ustawia tu 0 po każdej zmianie składu, chyba że ustawisz sprzęg ręcznie. Złącz Połącz ten pojazd z następnym w jeden zespół Przeciągnij, aby zmienić kolejność diff --git a/StarterNG/startercfg/lang/ru.xml b/StarterNG/startercfg/lang/ru.xml index 4307c5c..646d38d 100644 --- a/StarterNG/startercfg/lang/ru.xml +++ b/StarterNG/startercfg/lang/ru.xml @@ -280,7 +280,7 @@ Разделить сцеп на отдельные вагоны Общее для всего состава Сцепка в конце состава - Последняя единица: сцепка 0 даёт хвостовые сигналы. Другой код сцепит состав с тем, что стоит за ним, и симулятор не поставит хвостовые сигналы. + Последняя единица: сцепка 0 даёт хвостовые сигналы, другой код сцепит состав с тем, что стоит за ним, без хвостовых сигналов. Стартер ставит здесь 0 после каждого изменения состава, если вы не задали сцепку вручную. Соединить Соединить этот вагон со следующим в один состав Перетащите для изменения порядка