Simutrans - kdo nestaví vláčky s námi staví je proti nám
Co jsem dělal poslední měsíc? Nic moc. Z větší části jsem si prošel sérií nemocí, chorob a zdravotních problémů, které jako by vypadly ze sumerského eposu, kde bohové testují hrdinovu odhodlanost sérií stále vážnějších zkoušek. Minule jsi vykašlával krev? Tak co kdyby jsi dostal vzácnou parazitickou chorobu a začal jsi krvácet z konečníku? Co řekneš na tohle? Zdraví jsem nabyl až ±třetího ledna po jednom z nejzvláštnějších symptomů, co jsem za několik dekád na planetě Zemi zažil. Z poslední komplikace, otravné, ale celkově neškodné, jsem se dostal až v posledních dnech.
Kromě těhle radovánek jsem plus/minus jen sledoval přednášky z Chaos Communication Congressu & hlavně hrál Simutrans.

Nevím jak vy, ale stavění vláčků je stejně záživné v roce 2024 jako bylo v roce 2005, kdy jsem o tuhle hru prvně zakopnul.
Nakřápnul jsem nový svět, mapa velikosti 256x256 se skromným počtem měst. Za pár herních roků na mě dolehlo, že města rostou příliš pomalu. Realisticky, to ano, pro pro hru příliš pomalu. Chci přepravovat nekonečné zástupy cestujících mezi nezměrnými metropolemi, které postupně srostou do jedné megapole a to výchozí nastavení neumožní.
Podle tohoto návodu jsem editoval soubor /usr/share/games/simutrans/pak/config/menuconf.tab, aby klávesa i (v pak64 nepoužívaná) otevřela menu s interními volbami včetně rychlosti růstu měst. To je ono: v záložce Economy and cities změnit volby growthfactor_villages, growthfactor_cities a growthfactor_capitals.
Menší znamená rychlejší růst. Nastavil jsem 10× menší (40, 20, 10 místo 400, 200, 100) a připadá mi to dobré. Města rostou rychle, ale ne nezvladatelným tempem. Nepřipadá mi, že jsem neustále v presu, že musím pokrýt nově rozrostlá města sítí autobusů a vlaků a každou chvíli řešit řešit, jak přepravit explozi cestujících mezi klíčovými dopravními uzly.
Tomu se musím věnovat, eventuálně, jednou za čas, ale ne každou vteřinu. V novém světě jsem rozložil dopravní síť do tvaru hvězdy, kdy mám dva dopravní mega-uzly propojené mezi sebou, z nich vedou spojení (vlaková, jak jinak) do větších měst nebo aglomerací a z těchto zastávek pak do koncových bodů. V síti nejsou žádné smyčky – když cestující chce z jednoho kraje mapy na druhý, musí se dostat to mega-uzlu Appingmouth, pak spojkou do Renville a odtud do cílové stanice. Mezi hlavními centry vedou tři kolejiště pro rychlovlaky a jedno pro poštu a jejich kapacita se postupně plní.

Přesto jsem zase narazil na známý defekt – když propojím všechna města a ta vyrostou do gigantických rozměrů (kolem herního roku 2000 se všechna sídla slila do jedné megalopole a jedné enklávy dvou měst), začne se stávat to, že pasažéři najednou nenacházejí cestu do své destinace. Síť přepravuje skoro 4 miliony lidí každý měsíc, ale pak, z neznámých důvodů, tohle číslo spadne o 20 nebo 25 procent. Zažil jsem to teď a zažil jsem to už dřív.
Jenom teď jsem měl při ruce zdrojové kódy a začal jsem je prozkoumávat, abych zjistil, co může způsobovat tento defekt. Nenašel jsem nic, ale objevil jsem něco mnohem zajímavějšího – úroveň simulace je mnohem hlubší, než jsem si do té doby myslel. Simutrans modeluje zpáteční cesty – když se cestující vydá do práce nebo do jiného města, chce se také vrátit. Tohle Simutrans zvládá modelovat na úrovni malých skupinek cestujících nebo pošty o maximální velikosti 7. Když na některém z mega-dopravních uzlů čeká přes 10000 pasažérů, někteří z nich jsou na zpáteční cestě.
Hra interně modeluje přepravní systém jako sérii sítí (jedu pro každý druh zboží), kde uzly jsou zastávky a hrany linky mezi nimi. Při hledání cest pro routování pasažérů nebo zboží jako optimalizaci bere v potaz jen propojené komponenty grafu. Start i cíl cesty může být pokryt několika zastávkami a routovací engine uvažuje jen ty začátky, které jsou spojené s některými konci. Tohle dává smysl pro přepravu zboží nebo multiplayerové hry, ale pro pasažéry a mail se to rozpadá. Moje světy obsahují jen jednu globální síť spojující všechny zastávky, která přepraví všechny pasažéry. Existuje jen jedna komponenta grafu.
Zdrojáky Simutrans mají jedno specifikum – jsou napůl anglicky a napůl německy. Původně, v roce 1997 s vývojem začal Hajo, v roce 2004 vyskočil z jedoucího vlaku, aby se role ujala skvadra dobrovolníků v čele s Prissim. V té době šlo stále o closed source software. Teprve o tři léta později zveřejnili zdrojáky a přešli na svobodnou licenci. Ale i teď, o téměř dvě dekády později, si zdrojové kódy zachovávají svoji kryptickou povahu mezi dvěma jazyky. Z větší části anglicky, dost anglicky, abych jim rozuměl, ale přesto některé termíny, názvy metod nebo typů jsou stále v původním jazyce: stadt, ziel, punkt, welt, halt, karte, fabrik.
Někdy se musím podívat do slovníku, jindy stačí zalovit v historické paměti českého jazyka nebo najít nejpodobnější anglické slovo. Stadt = město, jak ve slově Frenštát, ziel = cíl, punkt = bod, jako ve slově puntík, welt = world, halt = zastávka, karte = mapa, fabrik = továrna.
Názvy metod jako starte_mit_route nebo merke_passagier_ziel můžou na první pohled vypadat krypticky, ale za chvíli si na tuhle bizarní polovičatost zvyknu a neproniknutelné kódy ztratí svůj nádech mystičnosti.
Co defekt způsobuje, jsem ještě nenašel. Nejspíš půjde o souhru několika faktorů, kdy provedu změny v přepravní síti, ale za určitých okolností je herní engine hned nepropíše do struktur použitých pro hledání cest. K nápravě dojde až eventuálně, kdy jsou všechny cesty aktualizovány. Taková je aspoň moje představa. Jestli tomu tak skutečně je, musí ukázat až podrobná analýza.
Ale teď, když mám zdrojáky nakřápnuté a nabyl jsem právě tolik znalostí, abych byl nebezpečný, co můžu udělat? Pár drobností bych měl, hlavně v uživatelském rozhraní a správě linek. Běžně chci vystavět tramvaj pro pasažéry a pak vypravit linku poštovních vozů ve stejné stopě, ale nic mi neumožní říct: zkopíruj cestu spoje XYZ (nebo ji zkopíruj opačným směrem). Nebo funkce pro vypravení nového vozidla typu, které na lince už jezdí. Nebo řazení seznamu konvojů tak, že ty v depu předcházejí těm jezdícím. Nebo když postavím nové depo, jako výchozí linka se zvolí ta nejbližší. Detaily v tomto duchu.
Nebo jsem přemýšlel o automatickém balancování. Asi takhle: vozidla v paku64 (toho, kterého hraju) mají někdy celkem nahodilé ceny provozu – některé jsou tak drahé, že není možné vydělat ani halíř, jiné mají provozní náklady na kilometr tak nízké, že prakticky tisknou peníze. Líbilo by se mi, kdyby pořád existoval důvod upgradovat, kdyby každá nová lokomotiva, autobus nebo osobní vlak byly v něčem výhodné. Automatické balancování by nastavilo provozní náklady takové, aby se v době uvedení daného dopravního prostředku vyplatilo ho nasadit aspoň na určitý druh spojení – na dálkové rychlostní spoje, na kapacitní spoje nebo na lokální spoje.
Teď v prázdných okamžicích dumám, jak by tohle mohlo fungovat. Ideál je takový, že do instalace Simutrans naházím libovolné addony a paky, které nikdy nebyly spolu testovány, ale automatické balancování je aspoň částečně vyladí, aby spolu dávaly smysl aspoň za určitých okolností a nemusel bych z přehršle vozů, vagonů, lokomotiv, autobusů a dodávek používat jen tři modely, které se vyplatí.
Jestli to dotáhnu do konce teď záleží, jestli můj zájem v Simutrans vydrží, nebo vytratí se stárnoucím rokem 2024.
Dodatek: V čase mezi okamžikem, kdy jsem článek dopsal a než jsem ho rozmáznul po netu, se mi podařilo najít příčinu jednoho defektu. Možná má spojení s tím zmíněným výše, možná jde jen o nový bug zavlečený do zdrojáků od poslední stabilní verze. Jde o souhru mezi kódem, který má (myslím) předejít situaci, kdy v zastávce stojí několik vlaků a ty se pomalu nakládají všechny najednou a namísto je nakládá jeden po druhém, a kódem pro aktualizaci routování. Ve výsledku za určitých okolností pasažéři a pošta z velkých zastávek, kam jezdí několik vlaků ze stejného směru najednou (jako jsou například moje super dopravní uzly) nenastupují do odchozích vlaků a čekají na zastávce, zatímco vlaky odjíždějí prázdné.