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 после каждого изменения состава, если вы не задали сцепку вручную.
Соединить
Соединить этот вагон со следующим в один состав
Перетащите для изменения порядка