Symulator/MaSzyna/Unifikacja klonów
Ze względu na konieczność umieszczania eventów bezpośrednio we wpisach torów infrastruktura torowa nie mogła być oddzielona od sterowania ruchem, związanego ze scenariuszem jazdy. Sytuacja ta prowadziła do klonowania układów torowych (a czasem nawet wszystkich innych obiektów). Niektóre klony zaczynały żyć własnym życiem i różnicowały się od pozostałych (np. korekty układów torowych nie były prowadzone we wszystkich klonach). Przez kilkanaście lat istnienia MaSzyny wiele scenerii doczekało się klonowania.
Możliwość oddzielenia infrastruktury od sterowania pojawiła się dopiero na początku 2015 roku, wraz z unifikacją klonów linii 61. Unifikacja ta została przeprowadzona w celu zwiększenia realizmu poprzez dopasowanie scenerii do mapy przed dalszą rozbudową wykonywaną edytorem RSF — łatwiej jest przerabiać jedną wersję torów niż kilka klonów równolegle.
Poniżej jest opisany proces, jaki został wykonany w celu unifikacji klonów Linii 61. Wg stanu na styczeń 2017 nie istnieją lepsze narzędzia, pozwalające coś uprościć. Być może kiedyś takie powstaną, jednak ze względu na skończoną liczbę scenerii z klonami tworzenie specjalistycznych narzędzi może nie być opłacalne.
Spis treści
- 1 Wykorzystane programy
- 2 Przygotowanie plików
- 2.1 Identyfikacja klonów
- 2.2 Likwidacja literówek i duplikatów
- 2.3 Usuwanie średników i tabulacji
- 2.4 Usuwanie zbędnych komentarzy
- 2.5 Usuwanie zbędnych zer
- 2.6 Usuwanie zbędnych białych znaków
- 2.7 Formatowanie wpisów
- 2.8 Formatowanie liczb
- 2.9 Nazwa pliku na początku
- 2.10 Sortowanie obiektów
- 2.11 Podział geograficzny
- 3 Cykl unifikacji
- 4 Analiza niedobitków
- 5 Realizacje
Wykorzystane programy
Notepad++
Edytor tekstowy pozwalający wykonać operacje na wielu plikach jednocześnie. Ułatwia usunięcie zbędnych znaków, zmiany formatowania wpisów, wyszukanie i zmianę nazw w wielu plikach.
SVN
System SVN pozwala śledzić wprowadzone zmiany, archiwizować je i porównać z dowolną wcześniejszą zarchiwizowaną wersją, a także cofnąć wszystkie bądź niektóre zmiany. Jeśli zmieni się nazwę klona na nazwę innego, można także porównać linijka po linijce i przekopiować pewne własności do jednego z plików, jak również go edytować. Porównać pliki można też np. opcją w programie Total Commander, jednak nie pozwala ona na kopiowanie pojedynczych linijek pomiędzy plikami.
Rainsted
1. Specjalnie na okoliczność unifikacji klonów powstał mechanizm wyszukiwania identycznych linijek we wszystkich klonach. Aby to zadziałało, konieczne jest jednak przeformatowanie plików tak, aby wpis obiektu zajmował tylko jedną linię. Linijka identyczna we wszystkich klonach jest zapisywana w osobnym pliku, a z klonów usuwana. Operację tą należy wykonywać wielokrotnie.
2. Podgląd scenerii pozwala zorientować się, czym są niektóre obiekty. Używany jest zwłaszcza w końcowych etapach, gdy trzeba porównać największe rozbieżności klonów. Wczytuje się je wtedy z przesunięciem i przygląda każdej różnicy osobno. Można również wykonać na wybranym klonie takie operacje, jak podział odcinków torów, czy przypisanie semaforów (szybciej niż kopiowanie przez klienta SVN przypisań pomiędzy klonami).
3. Kopiowanie torów. Można wczytać plik klona z dołączonym innym klonem (przesuniętym np. 1m, aby tory się nie nakładały). Wtedy z tego dołączonego można kopiować parametry torów do wybranego, np. korygując punkty podziału odcinków. A wraz z podziałem odcinka na dwa można ujednolicić podział dłuższego odcinka na krótsze. Przed takim kopiowaniem należy wczytać wszystkie klony z innym przesunięciem dla każdego i ustalić, że takie kopiowanie parametrów będzie wskazane w jakimś miejscu.
4. Formatowanie wpisów. Poprzez wczytanie klona i następnie przesunięcie całości o dwa wektory sumujące się do zera można uzyskać zmodyfikowanie wszystkich wpisów, przez co zapiszą się one z domyślną precyzją. Również zostaną posortowane własności torów do domyślnej kolejności.
5. Sortowanie obiektów. Jeśli kolejność obiektów w klonach została zmieniona w znaczny sposób, może to uniemożliwić porównywanie plików. W takiej sytuacji może pomóc sortowanie obiektów wg współrzędnej. Może to być również konieczne, gdy jakiś nowy klon ujawni się już po wykonaniu unifikacji znanych klonów (unifikacja zmienia kolejność obiektów w plikach).
Przygotowanie plików
Przed właściwym procesem unifikacji warto pliki przygotować, aby wpisy były jak najbardziej podobne do siebie i dały się porównywać. Po każdej przeprowadzonej operacji wskazane jest sprawdzenie jej skutków za pomocą SVN i zarchiwizowanie. Od czasu do czasu należy uruchomić któryś z klonów i upewnić się, że działa i nie generuje nowych komunikatów o błędach (errors.txt).
Identyfikacja klonów
Należy odszukać wszystkie pliki klonów i upewnić się, że nie są prowadzone prace nad stworzeniem kolejnego klona. Pominięcie jakiegoś klona podczas unifikacji wymagać będzie powtórzenia wielu operacji. Jeśli klon składa się z wielu plików (nie tylko osobne tory, ale także sygnalizacja, sieć trakcyjna) i nie da się wybrać np. jednego pliku sygnalizacji dla wszystkich klonów, wygodniej będzie je połączyć razem, aby dla każdego klona był jeden plik z obiektami do unifikacji.
Aczkolwiek unifikację można przeprowadzić również w taki sposób, że unifikowane będą tylko dwa klony, a następnie dopiero rezultat z kolejnym. Jadnak takie podejście może wymagać większej dbałości o zachowanie kolejności obiektów w plikach.
Likwidacja literówek i duplikatów
Każdy klon należy uruchomić i upewnić się, że nie występują błędy typu odwołania do nieistniejących eventów z powodu literówek, czy duplikaty w nazewnictwie obiektów. Błędy tego typu będą utrudniać unifikację, a łatwo je wyłapać już na wstępnym etapie.
Usuwanie średników i tabulacji
Wskazane jest, by unifikowane pliki miały wyłącznie spacje i nowe linie jako separatory. Średniki są używane przy przeformatowaniu do stanu, w którym jeden obiekt zajmuje jedną linię — średniki wtedy służą do odtworzenia podziału linii wewnątrz wpisów. Średniki i tabulatory należy zamienić na spacje za pomocą Notepad++.
Usuwanie zbędnych komentarzy
Należy usunąć wszystkie komentarze, które nie wnoszą nic do pliku. Istotne komentarze muszą znajdować się w osobnych linijkach. Jednak unifikacja może doprowadzić do rozdzielenia grup obiektów, przez co dotyczące ich komentarze stracą swój sens. W szczególności należy usunąć komentarze z wnętrza wpisów, jeśli scenerie mają nadawać się do uruchomienia po przeformatowaniu. Powtarzające się komentarze (np. we wpisach torów) można usunąć w Notepad++. Następnie należy wyszukać pozostałe znaki komentarza i zastanowić się, co z tymi komentarzami zrobić. Istotny komentarz dotyczący konkretnego wpisu można umieścić na jego końcu (aby po przeformatowaniu był na końcu linii).
Usuwanie zbędnych zer
W wielu przypadkach liczby są zapisane w postaci "0.0" czy "40.0". W poszczególnych klonach liczby te mogą się różnić istnieniem członu ".0". Należy usunąć te zera.
Usuwanie zbędnych białych znaków
Po zamianie średników i tabulacji na spacje oraz usunięciu komentarzy mogą powstać podwójne spacje. Mogą też być spacje na końcu niektórych linii, ewentualnie na początku. Wszystkie podwójne spacje należy wymienić na pojedyncze, aż do nieznalezienia podwójnych spacji. Również należy oczyścić linie z białych znaków na początku i na końcu. Operacje te szybko wykona Notepad++.
Formatowanie wpisów
Wpisy należy sformatować tak, aby po każdym wpisie była jedna pusta linia. Pozwoli to następnie na przeformatowanie takie, żeby w każdej linii był wpis jednego obiektu, co pozwala porównać linijki w klonach. Można to wykonać w Notepad++ zastępując końcowe słowa wpisów słowem zakończonym znakami nowej linii. Następnie usuwać podwójne puste linie. Można też zamieniać początkowe słowo wpisu na to samo słowo poprzedzone znakami nowej linii. Wpisy include rozjazdów najlepiej dokleić do wpisów torów rozjazdów bez pustej linii, będą się one wtedy trzymać razem.
Formatowanie liczb
Klony mogą się również różnić precyzją zapisu liczb. Aby to ujednolicić, najlepiej wczytać każdy klon osobno do Rainsted i przesunąć dwukrotnie całość o wektory sumujące się do zera (np. +1 w górę i -1 w górę). Wtedy wszystkie wpisy zostaną zmodyfikowane i zapisane z domyślnymi precyzjami (1mm dla współrzędnych).
Nazwa pliku na początku
Dobrze jest zapisać nazwę pliku klona w komentarzu na jego początku. Dzięki temu dużo łatwiej przywrócić oryginalną nazwę po porównywaniu z innym klonem przez klienta SVN.
Sortowanie obiektów
Operacja może nie być konieczna, jeśli wstępne porównanie plików klonów wykaże zgodną kolejność obiektów (tzn. występują głównie różnice w nazwach i eventach). Jeśli jednak obiekty w którymś z klonów zostały przemieszane, bez sortowania się nie obędzie. Również sortowanie będzie wymagane, jeśli jakiś klon ujawni się po wykonaniu unifikacji (dołączenie kolejnego klona w trakcie unifikacji nie jest możliwe, trzeba ją najpierw zakończyć dla klonów, dla których została rozpoczęta).
Podział geograficzny
Również niekonieczna operacja, która może ograniczyć nakład pracy. Przykładowo dla linii 61 najpierw zostały zunifikowane wschodnie klony, od Stradomia do Lublińca. Dla zachodnich klonów, również zawierających Lubliniec, został on odcięty, a unifikacji podlegały odcinki bez Lublińca. Następnie poszczególne misje zachodnich klonów były uruchamiane z Lublińcem wziętym z części wschodniej. Związane było to również z faktem, że Lubliniec dla klonów wschodnich został częściowo przebudowany przed unifikacją klonów zachodnich. Być może dla którejś scenerii posiadającej klony wygodniej będzie wykonać najpierw podział geograficzny, a następnie unifikację każdego obszaru osobno. Wskazane by to mogło być w przypadkach, gdy jakiś obszar został w którymś klonie znacznie rozbudowany i większy sens ma jego wycięcie w całości i doklejenie zamiast analogicznego fragmentu pozostałych klonów.
Cykl unifikacji
Unifikację wykonuje się w cyklach, na końcu każdego zwiększa się plik obiektów wspólnych, a zmniejszają pliki klonów. Unifikacja jest zakończona, gdy w plikach klonów pozostają tylko eventy dotyczące scenariusza, dźwięki i inne obiekty charakterystyczne wyłącznie dla danego sceneriusza (np. tarcze D1). Pierwsze wykonania cyklu pozwolą szybko wydzielić 75% obiektów.
Porównywanie plików
Pliki najwygodniej jest porównywać przez klienta SVN. Nazwę jednego klona zmieniamy na inną neutralną. Nazwę innego klona zmieniamy na nazwę tamtego. Przez klienta SVN porównujemy pliki i do tego drugiego klona możemy kopiować np. nazwy torów czy przypisania sygnalizatorów. Łatwo jest również odwrócić tory (zamienić punkt 1 z punktem 2), jednak można to bezpiecznie stosować tylko dla torów, które nie mają nazw. Po porównaniu dwóch klonów i przekopiowaniu możliwych rzeczy, kontynuujemy na innych klonach. Najlepiej porównać każdy z każdym. Po zakończeniu porównań najlepiej sprawdzić wprowadzone zmiany i zarchiwizować na SVN. Często po archiwizacji warto wykonać kolejne porównania par klonów (wynika to z wprowadzonych zmian). W pierwszym cyklu można pominąć porównywania plików, gdyż bardzo wiele obiektów powinno być identycznych (jeśli np. nie były masowo wymieniane podsypki w którymś z klonów).
Ujednolicanie nazw torów
Tory dwóch klonów mogą różnić się jedynie nazwą. Sytuacja jest prosta, jeśli w jednym z klonów nazwa jest none — wystarczy skopiować nazwę z klona, który ją posiada. Jeśli jednak nazwy różnią się, należy wybrać jedną, a drugą wymienić na tę wybraną. Jednocześnie w Notepad++ należy otworzyć wszystkie pliki SCN oraz sterujące i poszukać tam usuwanej nazwy. Może się okazać, że nazwa toru jest używana do wstawienia taboru albo do badania jego zajętości (np. przejazd). Nowa nazwa musi być wpisana we wszystkich tych miejscach. W takich sytuacjach należy również co jakiś czas uruchamiać klony, aby się upewnić, że nie występują problemy z wstawianiem taboru. Za pomocą SVN warto się upewnić, że zmieniana nazwa nie była częścią jakiejś dłuższej nazwy, a jeśli była, to przywrócić poprzednią tam, gdzie zmiana nie powinna być dokonana.
Wydzielanie eventów
Jeśli w torze jest odczyt sygnalizatora, należy go tam zostawić. Jeśli jednak event dotyczy scenariusza, należy upewnić się, że tor ma nazwę, a wywołanie eventu przerobić na event Multiple, przypisywany do toru przez nazwę (z członem :event1 albo :event2). Wpis eventu należy umieścić bezpośrednio przy torze. Dzięki temu wpis toru bez eventu będzie mógł być znaleziony w pozostałych klonach, o ile tylko nazwa toru zostanie do nich rozpropagowana. Zamiast kopiować nazwę przez SVN można w Notepad++ odszukać tor we wszystkich klonach po współrzędnych i w każdym zmienić nazwę.
Przeformatowanie
Aby wydzielić obiekty identyczne we wszystkich klonach, należy zmienić formatowanie plików z użyciem Notepad++. W pierwszym kroku należy wymienić wszystkie znaki nowej linii na średniki. W drugim wymienić podwójne średniki na znaki nowej linii. Ewentualne pliki niebędące klonami należy zamknąć wcześniej (np. SCN, pliki taboru dekoracyjnego). Z przeformatowanych plików powinna normalnie się uruchamiać symulacja, ale testowanie tego nie jest konieczne.
Wydzielanie identycznych linijek
Wydzielanie można wykonać uruchamiając odpowiednią funkcję w Rainsted (nie jest potrzebne wybieranie scenerii). Wg stanu na styczeń 2017 funkcja ta jest dostosowana wyłącznie do plików linii 61 i nie nadaje się do użycia z klonami innej scenerii. W razie potrzeby jej wykorzystania proszę skontaktować się z autorem — niezbędne prace zostaną wykonane, jeśli będą komuś przydatne. Rainsted usunie identyczne obiekty z każdego klona i zapisze je do osobnego pliku.
Powrót formatowania
Przed powrotem formatowania należy jeszcze dodatkowo otworzyć w Notepad++ plik z wydzielonymi obiektami (warto je przejrzeć). Średniki należy wymienić na znaki nowej linii i zapisać pliki.
Weryfikacja SVN
Po zakończeniu cyklu przeglądamy dokonane zmiany w klonach (usunięcia obiektów) i archiwizujemy je na SVN.
Analiza niedobitków
Wielokrotne wykonanie opisanego wyżej cyklu porównywania, kopiowania i wydzielania identycznych obiektów pozwala dojść do poziomu unifikacji około 95% obiektów. Pozostają "trudne sprawy", którym trzeba przyjrzeć się indywidualnie. W przypadku linii 61 były to najczęściej różniące się podziały odcinków — np. długi pierwotny odcinek toru został w kilku klonach podzielony na 4 równe części, a innych na 5 równych części. W efekcie porównania przy pomocy SVN nie prowadziły do rozpoznania sytuacji umożliwiającego ujednolicenie klonów. Trzeba było wczytać wszystkie klony z przesunięciem i dopiero wtedy charakter różnic stał się to widoczny.
Przesuwanie obiektów
Jeśli unifikacji podlegają trójkąty, mogą występować stałe różnice we współrzędnych. Można wtedy dla niektórych klonów wykonać przesunięcie o wektor przed porównywaniem bądź wydzielaniem obiektów, dzięki czemu większa ich liczba będzie identyczna. Po wydzieleniu identycznych można wrócić przesunięcie. (W przypadku linii 61 dotyczyło to podsypek rozjazdów krzyżowych. Już po unifikacji wprowadzone została opcja wymiany trójkątów rozjazdów krzyżowych na odpowiedni plik INC.)
Naprawianie rozjazdów 34m
Rozjazdy 34m są najczęściej używanymi. Często też szablony tych rozjazdów są zepsute. Dzięki naprawieniu tych szablonów w poszczególnych klonach mogą one stać się bardziej podobne do siebie (ewentualnie wystarczy przekopiować punkty 1 i 2 rozjazdu, a punkt 4 się wyliczy do identycznego stanu).
Podgląd klonów z przesunięciem
Należy utworzyć plik SCN, który dołącza wszystkie pliki klonów, ustalając dla każdego przesunięcie (od 1 do 10m) w poziomie albo pionie. Następnie tak utworzoną scenerię należy wczytać do Rainsted, STV bądź do symulatora (zwłaszcza dla przesunięcia w pionie). Pozwala to przyjrzeć się charakterowi różnic i wybrać rozwiązanie (np. w przypadku różnic w teksturach podsypki bądź szyny). Może być też warto dołączyć plik z zunifikowanymi obiektami (z osobnym przesunięciem), albo nawet pozostałe pliki (lasy, budynki, sieć trakcyjną). Pozwala to również zorientować się w różnicach układów torowych pomiędzy klonami. Dzięki temu może być wiadome, że do określonych klonów trzeba przekopiować określoną grupę torów z pozostałych, aby w ogóle istniały one we wszystkich (wydzielanie obiektu wymaga jego istnienia w każdym klonie). Przykładowo jeden z klonów linii 61 nie miał jednego z rozjazdów w Liswarcie.
Kopiowanie torów w Rainsted
Jedną z metod ujednolicenia jest kopiowanie parametrów torów. Polega ono na tym, że za pomocą tymczasowego include dołączamy do klona inny (można użyć //$r). Jeszcze za pomocą origin trzeba przesunąć ten drugi klon np. o 1m (kierunek zależny od ułożenia scenerii). Po zaznaczeniu toru w tym dołączonym można wkleić parametry do klona wczytanego jako główny plik. Używa się to w przypadku zaokrągleń współrzędnych i zastosowania odcinków izolowanych (nazwa zostanie skopiowana tylko wtedy, gdy tor docelowy był none). Wraz z podziałem odcinka na dwa można sobie poradzić z sytuacjami podziału odcinka na różną liczbę części w różnych klonach. Dzięki temu można zunifikować tory, które ciężko jest porównać przy pomocy SVN ze względu na różnice we współrzędnych albo ze względu na inne położenie w pliku (wpisy mogą stać się identyczne, przez co zostaną wydzielone). W ten sposób na linii 61 był unifikowany Lubliniec, gdzie występowały różnice wynikające z zaokrąglenia współrzędnych.
Łączenie dziur w torach
Niektóre dziury rzędu kilku milimetrów nie są istotne dla działania symulacji. Jednak różnice we współrzędnych uniemożliwiają wydzielenie obiektów, które nie są identyczne we wszystkich klonach. Za pomocą podglądu terenu w Rainsted można połatać dziury, dosuwając tory do innych.
Standaryzacja nazewnictwa
Może się zdarzyć tak, że klony różnią się nazewnictwem sygnalizatorów, rozjazdów, przejazdów czy odcinków izolowanych. W takim przypadku może być wskazane od razu ustalanie standardowego nazewnictwa. Może to polegać na wydrukowaniu schematu stacji i naniesieniu nań docelowych nazw, które następnie będą wdrażane w poszczególnych klonach. W przypadku klonów linii 61 przeprowadzona została kiedyś akcja likwidacji zdublowanych nazw rozjazdów, przez co pewne rozjazdy różniły się nazwami w poszczególnych klonach, była też sytuacja że jedną nazwę przypisano trzem różnym rozjazdom, zależnie od klona. Należy pamiętać o tym, że jednocześnie ze zmianami nazw obiektów tego typu należy modyfikować pliki eventów scenariuszy. Warto też prowadzić listę wprowadzonych zmian: jaka nazwa pierwotna została zamieniona na jaką nową — pozwala to łatwiej naprawić scenariusze. W takich przypadkach należy również bardzo często testować poprawność przebiegu symulacji.
Realizacje
Linia 61
W 2015 roku zostały zunifikowane klony Linii 61. W sumie 18 klonów, każdy z własną wersją Lublińca. Największą niespodziankę stanowiły długie tory, podzielone na 4 części w jednych klonach, a na 5 w innych.
MZD
Podobna operacja została przeprowadzona w 2017 roku na scenerii Myślenice – Dobczyce. Tutaj największą różnicą było inne ustawienie oraz inny typ SBL (trzystawna vs czterostawna) oraz przebudowa jednej ze stacji na inne rozjazdy.
Zwierzyniec
Pod koniec roku 2017 rozpoczęta została unifikacja klonów scenerii Zwierzyniec. Głównym celem było wykorzystanie fragmentów tej scenerii do rozbudowy scenerii Quark. Unifikacja nie została ukończona, wykorzystany został jeden z klonów. Pewnym problemem podczas tej unifikacji był brak unikalnych nazw dla wskaźników W4 oraz W5. Również nazewnictwo semaforów wymagałoby przemyślenia.