From f762f9554ec0255c90268826182d2e3e5eef3b0b Mon Sep 17 00:00:00 2001 From: claude Date: Sat, 24 Oct 2026 13:07:36 +0200 Subject: [PATCH] =?UTF-8?q?M9:=20navigeringsl=C3=A4gen,=20linjen=C3=A4t=20?= =?UTF-8?q?och=20terminal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit internal/nav med resources/data/network.json (76 stationer, 11 linjer, Yamanote som ringlinje). Tåg bedöms från lineId + terminus mot banans station/to: rätt, fel håll, för långt bort (fler än 12 stationer) eller ingen trafik; correct räknas ut för nätkopplade banor, 1-4 rätta tåg. Tågresan visar linjens riktiga stationer. Nya förlustorsaker "Fel håll" och "För långt bort". Listläge (nästa tåg nere till vänster) och skyltläge (+50 % poäng) växlas med N på bankartan och sparas; -mode. Terminalen: biljettautomaten visar linjetavlan på nätbanor. Perronger P p Q q R r. Bana 006 Ikebukuro med fyra perronger. Banorna 001-005 kopplade till nätet. Skript: waitover och pick calm; poängraden radbryts; skärmdumpar uppdaterade. Co-Authored-By: Claude Fable 5.1 --- README.md | 29 +- cmd/metro-puzzle-jp/main.go | 3 +- doc/img/cars-alight.png | Bin 22573 -> 22643 bytes doc/img/cars.png | Bin 22808 -> 23254 bytes doc/img/crowd.png | Bin 20332 -> 21066 bytes doc/img/floors-1f.png | Bin 18034 -> 18327 bytes doc/img/floors-b1.png | Bin 16522 -> 17081 bytes doc/img/level-001.png | Bin 17518 -> 18115 bytes doc/img/level-002.png | Bin 18576 -> 19096 bytes doc/img/map-signs.png | Bin 0 -> 15814 bytes doc/img/map.png | Bin 15357 -> 15792 bytes doc/img/nav-list.png | Bin 0 -> 19761 bytes doc/img/result.png | Bin 21301 -> 27102 bytes doc/img/ride-real.png | Bin 0 -> 23759 bytes doc/img/ride.png | Bin 21330 -> 22678 bytes doc/img/terminal.png | Bin 0 -> 26471 bytes doc/img/ticket.png | Bin 21548 -> 21869 bytes doc/img/too-far.png | Bin 0 -> 26983 bytes doc/img/words.png | Bin 15981 -> 16005 bytes doc/mal-och-tester.md | 8 +- doc/roadmap.md | 32 +- doc/spelbeskrivning.md | 2 + internal/game/assets.go | 4 +- internal/game/game.go | 20 +- internal/game/input.go | 3 + internal/game/minimap.go | 6 +- internal/game/scene_level.go | 57 +- internal/game/scene_map.go | 4 +- internal/game/scene_result.go | 33 +- internal/game/script.go | 8 +- internal/game/trains.go | 2 +- internal/lang/data_test.go | 25 + internal/level/level.go | 133 ++- internal/level/level_test.go | 126 ++- internal/minigame/ride.go | 35 +- internal/nav/nav.go | 335 +++++++ internal/nav/nav_test.go | 171 ++++ internal/save/save.go | 1 + internal/sim/fog.go | 2 +- internal/sim/nav_test.go | 128 +++ internal/sim/npc.go | 2 +- internal/sim/run.go | 119 ++- resources/data/levels/001-flygplatsen.json | 14 +- resources/data/levels/002-shinjuku.json | 14 +- resources/data/levels/003-shibuya.json | 14 +- resources/data/levels/004-tokyo.json | 20 +- resources/data/levels/005-ueno.json | 54 +- resources/data/levels/006-ikebukuro.json | 177 ++++ resources/data/network.json | 1009 ++++++++++++++++++++ resources/text/en.json | 15 +- resources/text/jp-dictionary.json | 525 +++++++++- resources/text/sv.json | 15 +- tools/shots/main.go | 18 +- 53 files changed, 3041 insertions(+), 122 deletions(-) create mode 100644 doc/img/map-signs.png create mode 100644 doc/img/nav-list.png create mode 100644 doc/img/ride-real.png create mode 100644 doc/img/terminal.png create mode 100644 doc/img/too-far.png create mode 100644 internal/nav/nav.go create mode 100644 internal/nav/nav_test.go create mode 100644 internal/sim/nav_test.go create mode 100644 resources/data/levels/006-ikebukuro.json create mode 100644 resources/data/network.json diff --git a/README.md b/README.md index dbd050b..5773f3f 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,17 @@ Storyn följer några polare på semester i Japan, från landningen på flygplatsen till avresan. Efter storyn låses ett oändligt läge och New Game+ upp. Hela speldesignen finns i [doc/spelbeskrivning.md](doc/spelbeskrivning.md). -**Status:** M9b klar (2026-10-24) – sex banor på en bankarta i +**Status:** M9 klar (2026-10-24) – sju banor på en bankarta i spelbrädesstil, med sidospår och flera våningar. Japanska skyltar och ordinlärning, lämmeltåget, minikarta, tågkort, biljetter och minispel, svårighet med tidsgräns, poäng och debuffar, tåg som rullar in till -avgångsmelodin, progression med XP, skillträd, items och sparfil. Och nu -lever stationen: folk som går i vägen, filer där man ska hålla till vänster, -reklam på väggarna, sorl i bakgrunden, och tåg med flera vagnar där man -väljer vagn, låter folk kliva av först och aktar sig för kvinnovagnen. -Nästa är M9: navigeringslägena lista och skyltläge. Se +avgångsmelodin, progression med XP, skillträd, items och sparfil, folk, +filer, reklam, sorl och vagnval. Och nu ett riktigt linjenät: tågen bedöms +efter var de faktiskt går, resan visar linjens riktiga stationer, och man +väljer **listläge** (nästa tåg visas) eller **skyltläge** (lista ut det +själv med skyltar och terminalen, +50 % poäng – åk åt fel håll eller för +långt bort och banan är förlorad). Nästa är M10: story-innehåll och +flerbytesbanor. Se [doc/roadmap.md](doc/roadmap.md). ![Bankartan](doc/img/map.png) @@ -65,6 +67,13 @@ sällskapet. ![Vagnval](doc/img/cars.png) +I skyltläget får du bara resmålet. Skyltarna säger var perrongerna är, +terminalen (biljettautomaten) visar linjerna med deras närmaste stationer, och +du avgör själv vilka tåg som faktiskt tar dig dit – på Ikebukuro är två av +fyra rätt, ett går åt fel håll och ett tar omvägen via city. + +![Terminalen i skyltläge](doc/img/terminal.png) + På de svåraste banorna har alla i sällskapet egna kort som måste ha saldo, alla behöver biljett, och när biljetten är köpt ska sällskapet placeras i vagnen efter sina önskemål: fönster eller gång, vänster eller höger sida, @@ -163,6 +172,7 @@ metro-puzzle-jp -debuffs sore_feet,tired # debuffar från start (tester/skärmd metro-puzzle-jp -mute # inget ljud metro-puzzle-jp -save /sökväg/save.json # annan sparfil (standard ~/.config/metro-puzzle-jp/save.json) metro-puzzle-jp -nosave # läs sparfilen men skriv aldrig (tester/skärmdumpar) +metro-puzzle-jp -mode signs # navigeringsläge från start: list eller signs (annars sparfilens; N på bankartan växlar) metro-puzzle-jp -script "move right 4; shot bild.png; quit" # skriptläge, se internal/game/script.go metro-puzzle-jp -version ``` @@ -173,8 +183,8 @@ Pilar eller WASD går. Enter väljer, kliver på tåget, använder toaletten, handlar i kiosken eller startar automaten; i minispelen väljer pilarna och Enter bekräftar (håll Enter för att mata in sedlar). H frågar om hjälp vid en skylt, L öppnar ordlistan, T skillträdet, I garderoben, B butiken vid en kiosk, M -döljer/visar minikartan, P på kartan lägger kortet i telefonen, Esc går -tillbaka, R spelar om. Gamepad +döljer/visar minikartan, P på kartan lägger kortet i telefonen, N på kartan +växlar navigeringsläge (lista/skyltar), Esc går tillbaka, R spelar om. Gamepad med standardlayout fungerar: d-pad/vänster spak, A = välj, B = tillbaka, Y = hjälp, X = ordlista, Back/Select = karta. @@ -217,7 +227,8 @@ internal/lang/ japanska: ordbok, kunskap, delvis översättning (ren Go internal/minigame/ påfyllning, biljettköp, trängsel, tågresa – seedade minispel (ren Go) internal/progress/ XP, skillträd, items, banresultat, upplåsning (ren Go) internal/save/ sparfil (versionerad JSON) -internal/level/ banformat, validering, framkomlighet +internal/level/ banformat, validering, framkomlighet, koppling till linjenätet +internal/nav/ linjenätet: stationer, linjer, rätt/fel håll/för långt bort (ren Go) internal/res/ hittar och läser resources/ internal/rng/ seedad slump tools/ build/ genart/ shots/ diff --git a/cmd/metro-puzzle-jp/main.go b/cmd/metro-puzzle-jp/main.go index 96e2645..bf5712d 100644 --- a/cmd/metro-puzzle-jp/main.go +++ b/cmd/metro-puzzle-jp/main.go @@ -28,6 +28,7 @@ func main() { mute := flag.Bool("mute", false, "inget ljud") savePath := flag.String("save", "", "sparfil (standard: ~/.config/metro-puzzle-jp/save.json resp. %AppData%)") noSave := flag.Bool("nosave", false, "läs sparfilen men skriv aldrig (tester/skärmdumpar)") + mode := flag.String("mode", "", "navigeringsläge från start: list eller signs (tomt = sparfilens)") version := flag.Bool("version", false, "skriv ut version och avsluta") flag.Parse() @@ -36,7 +37,7 @@ func main() { return } - g, err := game.New(game.Options{LevelID: *levelID, SmokeFrames: *smoke, Script: *script, KnownWords: splitWords(*know), Points: *points, Seed: *seed, Phone: *phone, CardYen: *card, Debuffs: splitWords(*debuffs), Mute: *mute, SavePath: *savePath, NoSave: *noSave}) + g, err := game.New(game.Options{LevelID: *levelID, SmokeFrames: *smoke, Script: *script, KnownWords: splitWords(*know), Points: *points, Seed: *seed, Phone: *phone, CardYen: *card, Debuffs: splitWords(*debuffs), Mute: *mute, SavePath: *savePath, NoSave: *noSave, Mode: *mode}) if err != nil { log.Fatalf("kunde inte starta: %v", err) } diff --git a/doc/img/cars-alight.png b/doc/img/cars-alight.png index e73f7dcc9f72ec89edd182c26ffc2b27b36f8651..17eaae82645e4b810ad1664d108237e06f85c564 100644 GIT binary patch literal 22643 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 literal 22573 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 I(bDgbk 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 H8wLD7pjI5R delta 16870 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 Whhm0-WV9DEq>`MPZ0Un10sjN%^$dmp diff --git a/doc/img/crowd.png b/doc/img/crowd.png index 8f4d2f093bb492c21d8f6f702628db8172de68aa..40a08625093b76d9c326da8d0f7f4b9ace132d07 100644 GIT binary patch delta 13120 zcmaKS2RxhI_c*Q6+I#O=yGn_@X(>u=8dX$`+M{NwX3Y|#s7=+b)!K@pcI-{f*ehlt z{G;#c_kH{OKPUOz=ic1h=j?mVdG1y^W_K>;TefRDB;_0i6oyZ7u-opuQZ?oIcr$S< zH9q`@EHgv6x;9QQ;p^Kq1s`v+hLO8J8q8vT9TpJ|sHvlHgOXeDPbT zpOAB$6!v9aRkMVx%~A8lT0DL%6drbXZ`az|qKeU&s3df(O{FZ97DP~mZG62XU`);~ z^B(kPx2}Vr>M`Jb>jF7pz7rt0jhkL`!3j6?kD+LZj8>r;THb@{l_nPn|L2JDyhEz# zP*s)1>b~5M15Tc@JNW`9mAhRiYP|k@__)Q^qQBbNW%M)dl+@4uz({Obj*b2%PHTV@^Dm7MagfDD8=PAG z`?o=LAvL{&P1qMp4n;|orF#VqE;40;<2%LY$qoKaEWn;s%L?8Ohl5k#!`MoLXQTzH z#i3EgMABurG7u+rE*TK*0*IlB!r~SUUHAhRm@3jWa?*Z2(XU=fO)DyWJS)}u*$jXQ z%oORYk(e~@HMp|TVkKS0cnp$0Y(Sht%sIFeb8LbXu{rBakQTj1lZSJhn*-C9f%^>t zvc6vs4e1(8G2__M`5hK&m7lO%qXzoEQF~PqKVF3O3>bvUnx!YfR=j>H1mqJjE_g6K z^=x;1(|a+rI7xPEw%Lwcp8V^6bwnmJ&*^m*r)SnI0dHH?K2`3^5)W?fuu|h&1quS0Qx7wkcxI?bQ1>Wb zl=-dbTJlFNq|+^(_YI+@V_6|W^fcfoxq(-5lD`EifE<$~_*iZEfzs|&)OoVsv^2x6 zZP?sQ#(6S7A27;OA#7u@ZBZfjakL3tYU~HbR5~-(*@%IYL^g)Vi=vZQ$}l$a=*_Zu zm6S=M?a<>k+7m@A+5nYI642jGoazmW=VYKK0JjBbup$-Vzix8!o&Y%O@8?{>hbNQo=F4oj_!VhOYH5oTFji@({6j?Sx$_Y3i#5b@d z&V5gXhIE{rx1Z-`hfkosP^>?F50E*nRT^O|7`2;UnP74RmMVLLq+TBI>9COEBC}AR zdi_5F*GC{uynNuJ>}N;Mj4gJSYwxSiYU~Od-OK12DKa|pJ_kuubZyLKW7UjYN2l;LVpg_%|P_H$Oi@w1t!f4`<@{MM%?L6 zp7g%thU}_PKrRWevC)FB6Tb#&5g-H8W%A-fRW*smvNc&(g6*_9V~=`ZIpib-_Z)%E zQ9~%`Pxv(aUzI^CkT56ov(rSYIbJ9~{l9Kh`%M7-r3pBwqU!fu@slHFFEr&rU+Xlj~wMDj>u$;lyco$SzX7-R{P&a7Ov_!i4^|qkpU_l^qJ% zC!~ zQbLGX7{G&+!500AueP<%yX$W+Hrkiwm&9Zp6-A*CU2_aeq9jU~)E>7;bq!TM$loQv zkuxUziaGOD$kgeUCq0%~KtDkfCPBQR;RiLy-8hIfw~ zK}bQ6M}*{3+7+$kPcCbZb|1$;rsu6>R)_P?w&o+DLSIrf;u}-66r(AbvZa7)N&ZI# zW(DaM1syceT-wh`#`3-V{&WCX+5ocP9L&L8Eli1LzDv}dfaFMF`l#$Jw>YH7-3Kle z@27pIzI6&VXK#_qHaExUG#_sAAx8HiCA#2u&LVUr=4Q2_h>=R;ex@eZoTkDEJza>9 zIN5bBj-M_{z%p3zCW{ghq|-Kughn{prqIz?OdKGHU=@zXXvS>U~pww4?U4D~-+a|5Xb_!4+Sb z!3ZN)X`ocIkLfgVfu_sjJ}y0W*_i=LKeR!(tQm0bpKQk5mTXUT%*a;y?;^ATGOPig z{|3#^0Zq?#qo1TAvH`DPIL%qFB|!JL$zLuqyFs&S3Ii=#vlqiXGhIFvcER;7HPn{bDJxXZdG9!U*iu* zlvB^-fd1@yW8M;h#8Qz-qC>{Pe^GsuRI7vsQ^*Yh(egB)$Of?EBwdF>_r_T#F?E_=pDhrsqFA3A_pifNwVF$c~HW)19UJ-w7O?B?;)dH@5ms1*TElk zDzRf*oM2Hjs0K0Rqp{=bCs5TV46%2pQ#EJSb9#Xm>69Z7ExyCoq-*nAvqEaZ^5i&s z6O$8RnfeNHpFR;Qe&TIJ&IzxwGtY(>V6sg7tibf;||>BRE)Om*1>Om8bY z3$d}hkE<6b1`{3YJJs=^|OYF*#gEThKY?5U$zZbY2)G; zJ`Xjmf75{wbJ1ZN<9NR&tb(wplRv^Ppw87fk>}wua4hfD6Fl)Lr#BL}{&3>c*y3Z6 zKN)GweXodS=h#B__;DV}KIZ)W1@iLpd0fhdD~})0C^A-mvM+x--~LkeYKrivKSW-W z6L5Xul#Lz&#mkG=;VFsM6r>CE_VW+3mVo~M-~j^&tzcvV8=8Qj3tXI2A?wq9)RE9j z$Kui#9m0BZF2GR z1#o$Jovk7-6c%0A9Qm9`!gKk*f^ysnTRbbbI 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 diff --git a/doc/img/floors-1f.png b/doc/img/floors-1f.png index 1f33a1ae75c98682a8f7e6194597dbd16e3a77e0..9d68c3f81fad8fd80434d28dc2d21255536d7aba 100644 GIT binary patch delta 1395 zcmey=!#KU4ae^|Fd)!7_X694{lc3lzRU{pD{K}00malr)*me&U+2(Zjf zWRz&i4A|m$p_o-TZ^pL6cWzhiOU}DBS@KRzWu2KFB@erSLKFxlm_}iy`;cp;wlMDqP?&Vd`~IMxtUh8p9TdX0S$~P`jKP|J84)mwK*r$s|rF?v(c-*J&rd zy>patb=mdw?^o46xfHn+SNjthGLt{ph)i~{6;65K{xAU3AXH;<^4Rq+9NpV`SR(lA zndkC_B7!fcEz^Ac{jT1+{6{}*w}($J{GuTJxVdMtqpif`|2C|X4;b^P)QR-175cxz z>)D%!Dt+BHbM21@y12Mpo7UsIQE%;{+U_%~zoRF=HxXsIX95ZnG5K08nUi-ixTR;V z?=d_kvH44hkjk&!;nnKJ-@jbV*Xx-4(Nv^P!wmFL3 zcND(wkCWIWC8(s7vOQKlcK`CT0n<{$b8r3mE0MWm(Znt{Evc0mK*lM--jG8xFLXZN zA^s`d^84Lnd;Pq{D>i3!TE9B^e&3(}=d)p|_uTVHo$8nrKeuAi;)v|LX#p@J;ARnK ze468?weHjZeWPVcDL0D&WSnmDrDa5sm0HxXp4K7 zY%>fA;867IFW+jFqVF!}H2H&xNY*}89Mg3TcHdkhb`slYk@)WeRoF@{fBJS*b(uw1v*~GoV&eJ+~ zMz$8sed-PNRgApXf=G)9EO1@o!;atggO&8=el`oc>(0OT!75kl+a2n~-N)7}w3@ib z=3D5!<>%&E$D67@Kjk|2oLNW53;9wV;fcX6KIc#FEDAJGpWJUH8gjqWVROL-EO1WN z!;a|3HJk734A5J4-gRT|PSviLh9wRntDi5d)e`GnxH{C%q4NB1Epd4*dqt&PyTARE z{B~2z>ZCL4|0;x^;BZk z?9eAqo+$E)-r3Hpw8*`4?W4GDT)>h)q_# z*XusU{r>#<`}O%QF3G=s{Mfg8i@cG2ig*19fee;k|5<+VTbCy=F)%m=7W`kE$~xtR zPvPIV$sYy9CfCdGvn-xmz%aQ{+Q8_G)q>iGC-h~`?Oge}^{_Z!yhY7JjrxZh9HJNK yUJ%RR-oko|DYtPOjQiy<>tsjS<&yf0R%{IMi#L9`XRKP!00f?{elF{r5}E+pSAjDC delta 1139 zcmbQ<&-kf_ae^|Fo8?ATV~3>GCc-X^BG(dB9R-+=c?r}waBF94bI(6~?AY{8g0mA+ z#klu2@37dBa((X2zwdI}{v3X$&wu>zv6V-HtE%0y42`fc$MZhxcRL=Rv%eoXH}**Su^#)q z`zI;cZn&9O@2!7py0vZPaqGz&^hKFNr7|WzkQAv8EIxGc-{OTJO?}p`cQ=-)X|G

>xko$NWv#qO#Zi-8OU9qV;PQ{S}?b z&R0GY(})bVsw}ps$%QhCq7w>yG#V*uwvbf~N8a11|5L9w{daBSeIx7&!8*;6wPKisB=FK;iP4wvW#SJ_ z9!3AG7n%IQQG{7t^TK2SaYe;59u{d!`EC|H$=AHVwS{S|gEk7qA36D=nCxVKF;<}& z6AMZ<2=6{|WaIs;J%22p);mqU;3&ehD|@n_oyg?*Vmy-r#8^asG!)1LOMW!&UH{|j zpTj>VOUuuwj{qsOs9M7GwxP_ydV%Z(z6|y)%(oaJ+;W)<+mHX<`SC3^95+<{pLL%}Raz~*F=-Po7LTHOn^>L=dUydfmh5t{KmI~uyUgO5 vGwgTe~DWM4f+D71g diff --git a/doc/img/floors-b1.png b/doc/img/floors-b1.png index e3e8fc7a28d8ce1dadfd1adae9e741bf87433c47..4604ddce2ca23471d539af055241a5c633913401 100644 GIT binary patch delta 2472 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 diff --git a/doc/img/level-001.png b/doc/img/level-001.png index a7c45296488b5394217051108f659967d1a8d7ef..23aad127d7347b6a542d41c427226a63e8c3cbde 100644 GIT binary patch delta 2722 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 LdEm+Zz{`IChHT|4 delta 1826 zcmZux2{ha37Pq%0W2pqGB`Q_1w6>tNg;r#gF~v-+MO&@(Jxf%WG9<->5Yg(to~jU~ zmQlkPq!UZ4Q8iP0X-$&B=upOlOe6>udGxh&ym#LH?m73n=ey_rzH@%}{(7jg%VgPG za5)dVX5$zqqJE40D@=l3e80RJr=U70A}h<0iFmV!Fgm!;U86X&!dua__dX?aQVCosaX;N(60QVZF3=|wat5U3{k}H zkz%;ET$EBuU?G#e&8M!ca+6z2hO*q?Bm0qZ)I9;ex*ti(V!6*$;LZYGiXfM|A6No` zBP!5D7b^JzI|>lk;6XDBo0~n}?7$J-B5P)ZtNJL>Hnk zk?j@$Trh-s6+UDo;EEASUtfz8{>Yk9&N0_xhtJftiv7mT>>JZ^?FE2$`d<(G>6K-R zNx5&v$2L$;e7m~ZAw;$`VC%Ftl=r+hQu>e1&w*}zu)K=gXTXde)C|+O+o%!up(DJ5 z0=?m?^dZ1<_?Zjb|;UDm;y+@2!Z9!a!~ zw?64BE??50UqBJ+E?_JtAr z^u-tns38VLC5Wo%hb7~iri}Hp%A&%fiGApS)O7vq!R4adAAMt1d0RhIogDm&;cK+V z&IDs&kj=GE!%X55_+ol zf=z?*;yGch)mC8qG;x2AqhvhQ6@yXCDQOXIP`^IONd{Y4Ge+me{NK!q10Hz6ypaxh zjD_3yYe?fff)hGaWb4o_0ybdo`NZL@c8y&t3DK+2|361Xb)?TuTXUxZ8d1sAh%eEp zQ{Y{yWEM`bM$wCIz>GRrZrKaCZvX+*!DLk_;dZ$mpX9`?1ssgFC@DUp8m1Y;ym(>`B(yO3SiN}gE52RZG!F zu0HDMV`V<6kljrZWkfGS zS~OfJ4GjfVR|>NjR5K$Ze{Tamzp{qMyS#{;3XkxFKn-*HYW@CJ#XTY^Qda@o6d`tq z;F(`gj+A?72E(Ch+oVYlD?f-8^*0R-h+NXm-(9!KrKfx@%ij=h<oTnu=CYmh8jo%Sc=3&zR6624sc9sDDpcXoc^!wbm6K_%J z-qNmM{_54i`>rIjB9li?=F0^J{9P|UGi9qS4V!fKXxl65ANy!649Nk_*6zSx$M!*u bWku^Ut%h1TEzwq;GCSsl_Vs8y6`A>O-uh^8 diff --git a/doc/img/level-002.png b/doc/img/level-002.png index b1198096355a33885b6df3e8ac826cfcc18fba21..be6719fc9c84508f47e780079b4a86367dc39cc3 100644 GIT binary patch delta 2355 zcma)*2{hDu8^_UT2AOj0dqR>eON@0S%b~<16=lz^F+(Mc`QK=ft>JIqW^kplT;3t3 zEF~I3gPBmWB^gbG!JLfcbJ3m4?Z*CSZL7C6N zt4?(V3ABZZVx_1{jEft(O&3G1i$I_+ZH%CjP|1=qu=3NP8i(}r4t39ynJTb&zY~xP z&}~==^W2dWg&pyd{N0g+!q=x3WFsie7PRG+2o>tsYOA6}Guv9fApn+z`dE>YlyE%h z#cM(wK~_}NNTvU$Ac1;_JD=9AY|B$5)tw_Cu!0b%SC@N;$!+%$y!W?2x5oux68n7M z{0Fsnfer4%rAnoDD|_`zK1P;hG2_gDfVm$oU-Gk`FH~E9r!R5?Rn99Jj}V;LL5=&j zbLdCdbH>G}he@WhE{Nsn;EUJEnjajvzpQV^V=NH|LA8t@w!vPw=)9!M+G1UeE`sY7!Zb>2>yqJC3-t^{RTawe5al;*rM-SHo;Z>Gafw zAdSbcu;!8RlpD@b!wPnzbhcW;rHHZUCQp1IsI4slLA&z_@6?ev23jK`BFbQ4`=afC z>(Fm_vu_^Yl{IFhC(TG%p~WgNVs2@NC@6^Ga!!U5n*g?Hiv!FLs{efiwm%6VM_E*& zI-R9-ihR9DV%JM9;^0{2PYw{H&K4R;Xh|9e!zw3gh!}Ow5|Xr^WLm`Q!>n36ac}4B z(O+mqTW{T@G9qb?gLR^<8~HzD{-la;>gLK4THO;(Q~)$O=MAQ$`3#$bwH($aH>-i| z1zhwxnXxK>?xC~9{pu^tZtQzii_L>ibP;6H?fQJ)ev`V&%bqEMf(E;?;vgOb*7A!3 zY2&baF4FNPPZdVGYUO0DgsyB%-7_su^pU#jQ&wm6t7oq~wa(xBB!_J6OhWC7kA2uDb4PEsi8Oa$RT$r*{h-)(G@c@ z=ijom=4^NZdSBcGr>g7~-F`|X3 z1$skkadl?0eh@&9=(;lqMX-&3ACNYnBzHA1iuvjOSobfCzRHDhG15UiXhWbTWX-b3 z6XobYRO(_1shhTtdwOlz)bT6%+1Ikgd{XeFS*$`|?%IkzThs7GK_=C&*_NN;n`x&2 zskDEEO8r7jNT`Uv|KzLfq(YTU)c3nz>>S61-TDJ*q9ZR;%g$bIN|5Nd0^k_YaQOc1 z31xa$F?zdY>X1?1aZHDwi2l*skpX38K~xpYdve}v#(f!JNWLV{m4 zfyVZ^D#%IpuL-8h;u*H$j5-HS`VHc23RK6H{?Om^Rx~ju$2j-V6S}^)@$U@1jkp#C zHSCCJVr69ZqTJzORS}nWmvE#%^!y(pLjFg~j+7k{i66UoWb+(n4TTIB5~@RhH^##6 z!Zd5^>S`3xi*#vJ!0`t2a+(ij<4%0#M=u$bbB-MJ&OjcFCAc8|>ARpvWI+S4mRB60 zE{njCK4n?~(L+z?zB$c*_tNMrveC4gRHFv|Xd9Fd;?2*Hp0liU$Q4-2eJay<@G$+e zWDZ0^r7G$1^3&USG$#UOzWncvjh0((`_HCb&$!oqjE61R^`Ic(21eIMA3JbrQLj+C z8LAe3e;`>2t7og!fiSi|u8S{{gBKpHSZwwbMrEd$ zZZS+MV~r5wMv2`^!J2@1BiT)}u{(q!hnvBfq(+W@4qj@}dcck@1m)Fc!d*dc4K?88 zos)N_Esx5T%RACL^fXwjv6?p48G{zeZ_PdgcC1miMijYV6Y_BX?i4wacxC>&V)j^W zn^x-hdRT8crTMy9zn;cwlJjLur9zEE7lw1{>XB;|9PTu?!fOKQ3LQQmvSY@%JYb3FQLt82QidbY bPu#S9&Di*P-qRuEu5301N`7O5UY>Gx5 zrO~Bv3`)jQp>-@#L=YNeG{{Df&30yIww=!GKl|pr`QDp(?~nI=Z{DxDqK|S!AHnw6 zd(~^KBSPxKhjA*DHU0)}tfQlwFiO0DiFPgg!3M(j*V3P@0)>@>$mILZ&a0Qj1&Z`R z2QAyew|C4Wnl%TdGn@NN3!c?6$(9vm=cCtHX{Kz;pLf081A{?SqFZ-|nr#4K4zhqE zEJy;b#}DEA4xruPPISZ6E|A5xurm2+E(4K3kv6Y21YFS}?bR(^Li{t(S-};7{jg*9|A~;Um6Nt?dYtd{&fIZRK3zGGd;e&HvEO z2XunHNgR_*gBqE%sOmLs2=_1|Gp_B*D%<8sg(Hruqs!YNHk&6~c@%p9CoMINF2D!U zI|ID)g1z%%M-!XK(3R>d%h&CEUu1Olu&uRyU(+bTx<`feH){z6e4~_}um^Rs0IPP7DImV0HZR zeayCie>27+tEl7N0{5WnH+^5GrW|jh;0NSV#OTO>0psyL3WZ<3e0>%knU7*dx8{93 zpH%Bf32Q9O=0sWZl9B}dctMjjpKN_@I{#zuUSi7pb8L9X#!l#XQBrvb_+HtvT9!W% z`-fvSocAZ3S5sgTEemb1V(^By{cQmxSmSz@vO0tUWj0uN4~OC^LdZ*S$_L`I{#M@@ zmDAkoKl?f^8A6GIFmaT%9V5XGV{4hc1$k53a=N)-r=M<^xaxp>P@q|s^5H&Sks7e{ zW(|`I9XjX|*~=_scPcy&qRX0}H5m3Q@v?S)$Ib^7R1S%mg3y2~_>fNVW6Y($<^- z?51YbwRy#0Z1Bta1*Y5gn8jgkqlAkd!3Slh1idqfR+jsYRzeNlyhegcWd|kEVkFTC zk%(KT|D&w4LgMS=DLRc^7?Cu_!Xn19Y2V&SzjcKzIsMvVO-q8jJLaIHf@bKM?RZzm zYd&%Xv-$dEeu+1`G?Jbn6o3F_7dKPc#ZR~#N5Mo7X_4B$5nn$1_E|;_X8k+gP=}qQJ4VBj&?4%6MrUW@vK5S#XA8WFP%ufBX_8w=@$5{e#ALiN(2t0rx zB@loF$qPeLeb=GWm1dGe&~CXGX{?{$mx~?8_i&-CpyX=m4HiRu0>FTjJzo_e#f-o9 zb*M;kTq8Lht4P2mWP~X)R(DTV*!suC@slTYx8ARB?kaGrsRk^gF_&{Up=?GnPWY2U zlLYnFqm@4;FC%CZcmNO87Qb|yE&_Bw4b>J$M0d%taflR0s9|_I4|R)r z?_?PZIb@@;j7va^`V1fVfwYgAyz9Tus(O<-{5tkJP zZ3^Z;A3z4G4ZN*hD8CNbiDgpE@;VtdX~$nlq+Q@vv2r6d+Oz2}@#ADim-FR=l?}}m zEY9^2V=s%6ShbRAqY!OVF&U_hNSmgKsFeVc)|8|aPX{|6)(s2&g7yN!SrP%2pAnm=|-K0TubEZtkYX#J9Pptmxs-N z)Z8UjM^EgsN&OYxHQTO6YX%L0qmr!8{lrl9Jz@gkpQzwbI_TQSX{cJ?^7Fx(oP=EU&jPve`HynF!WCSNkU-1FuRLkOtt-2D3XP%XtUsC` z6RPlfQeH*4ht#07rDjQ^rrOlcx(Dra-&

*W_+WxSI}2&4}AKBz=c7eF~JiixZYE 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 diff --git a/doc/img/nav-list.png b/doc/img/nav-list.png new file mode 100644 index 0000000000000000000000000000000000000000..18508d54e8f4b20d988acd031e73f36fa52a98a7 GIT binary patch literal 19761 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 literal 21301 zcmeIa2UJwcwl<0c2@*sJN)*Y0Ad)i(3Q7`?oP;Jz&Z$8J1SN?`4vj=5=Nts2o7^Bd zi-aa4G|)5+^bb3nz1_CwKlk1@#vSjCx4t!4t5)l(S#wsH_03iF>anT<2@wqu78VxC zLq&NFEG(Q)SXkI}1lVU!s-+)uV_|6=Ka`h!;+49QreV z`E0E%t@iPX#&oTd7WRFE;1}xpFJx~~WUCY9a8Wya&iVRax^Cc>yp1qrSN-EkcNTj# z!2Q%-$=vO|G*Lv8@OBeR%QpA&@+^Ey+;x`3^>9nrlZ{jo@u*YQ5xQNb$LBHQ!z~oL zvagL_V(Q{@_kdEiWsVHTO-vkMLVlTSCn5rds(V%@`uUO-1N5`&vn3C@-prO!T5x05 zRn+SnHtF~XRmk!R)2)xXZYcbTT+FQaNb*yi+3by2O3a~rV$@%dh2s;@A#NIzo4~z7Dx?fT? zUU;p6A?!Am5Ushm0WPi2$^^2hEc*Bu1bX{DjH+66l>t%_VR;WW_>*RiqCLZWJ=IjY2&rD zn+J^1MKooNiQ?S#1ah2%)%%*<47cyv2r;PnN1!R%Uw=6d60 zY8xMFc2$B>{%u$r;K9@MV?~LVPun}A-?Iz`YMnODdaZx%WVvSfdEsGr6eJd8wnNdQ zHuWtA%3B7=g8}%%;f#xU=M~P z#`)D+=u!y#GmYN>FF+aOA9`&qy{gOidUSF0?QsMz1JJJH%W+lXdzx=Mi!kHBCF3ge zp*8t^l5P_IBw)bZscQe%9a$x|LJZ8(yI$WX#$llJ z@IJ$^yR8d_C12in6El+EUMYCZ+UmrEY}{*5Bh)14^dCg>jGGxqVFCVWEF5T|Az?P=kxz6VizkkG8JygUj@M5gm)mF`p z&5-qA`IV;`zc~e7dc}>(=>F(bZPU~^COMZlc4-<0EAJjq8cO6~iS)YU!$2F_x!%6a zMVQSJ+5{Z>q>SmBH3qC~_Q+^r1UtpR)iU+(o)6@G)Pr7;zR#9#O=Rzq;8$vQ)r^jY zOk8{9Qatn)7t6=m=G4bhx_=bFv78*gF3VgKm>6Q5>(!UOkxvZW_E`Z4 z;Of`C$D`d0UChguz$qmab;Y?zg8@E6cLo$i-ZtEPth?$AgKwb1{ zG5vym&vY+gNxUGDW4W>Y?Nir0ZKID+1B>~G@uQgZ0;>wSNyu}E!f3R=aYshYm<4Zh zOqypJuA2VqlYmvG7!Et#D})K_@4G<>W!4tR>vHM)-2E@3r_JW%P-Z5b28!;v5>6YW3SZ6eY;*eVpimegp!2*@_S#2=#MNB#{w=y z3QLv}Y|zI`NOFFEMLY}&p}AO}LoD!@7Jg6*m~DQ1x!NJKWT2erb`!@%fTd)%Z?#0_ z2RTxIvUv|Xb5GEIdKJU&r&`08`Q=L;rVF3COmPYZ771yfm8_QBMQ>Ysw9*ZN2cD~D z=?!(0tnSbinp%riR=_Aoaai{mw3hNNuJ{UGxkxPV6ZX8WtprRo1dMjSz7w@T#8;*{ z_dJ7FMm8cYCvF@?Dz9i-5Q$5xNpywqqy6VuF!fV%ay(it+1AmSkPXK8kPwyrb~d%$ z#p5PK>NJ$Uqrbmb)T&>CzmBX0Ia_y`lmI^%r|rW0b0-;*8+3n57Lv}3Aouh5g8_&c zGF}UR^a3n*q>8HW9=pa(;jPaSpO>7q%y-i+aTVLTwp+(4i5ac(8pb0PT7gKf<&==(E)qkeQNa6Woezq1}Y} zh>Mx1X4a&mp@#F-sf1^0kGGa;2Z?wNHj#eoahG^cTH&0Kn?&VT0hi=0iYWi}XK`@7 zfZ~m4=+F^-Z+^9@fQw^*!kS0`FBw}UFjq!1gY!JOcT8!GN#A8M!OWy9VNWusFW4=D z%Pg>dGY3_qlezzm1^hEPT-T%bjY~WiG^3$170p6^K-nLSg`xC+n6iwC05atW99Xn6 z^+dM}nNMJE#Elu-moG!Hm&pQd_n0h0%a@~fK0+Wz<;^b(OW30sjSi)M6#Ms57{9^3 z{hUhXQU=}tw)KTdEPbrslj67o1^}Res}*c1*KWK89R2Pvc1~{g!}QI!@w0)E4DjZO3LNUXYy})gPNmL zd#A+_pwoVeD1LT+SEyw7d=fiC&yZdB&4a8#G5Y`$lasCOxx_K)kOL8SA`j{DIhC3C zgAZ*qk3}+^Wagi@T?oM;!lxkRp!>HEAQ==<@kgAZpoQ_~^4R*U(#%UkbXG{Ob$HFH zYt&l*T{LIQ)>xSSou%!j31NfEDAkqF5{vq7sEz3MOx=Z`#Fp-Obp4FNvWdx#jCZO5 z7*f-zHxQ7IZ$+;xC92SIhq%DHfNVQ&D^qa6zSDoM*(d)^cTmfy2I4bM(MdwRJ24Yw z@RQ3LvWj^B=}j(I_Lp9_9NOtc+ebR}j0e)`J}nbQT$95ki9vYmZa4+7U4H!NSUIeL zcd5^S9rxE41?Y{V7c?DQJl5`irQ2ANHg-#wP5yBAf@yo6-)Bx?1`f3Tef~?MgT|AR ziC@BMZdx@VK8ae%L-DXl{w*YJacO>`F#&ysl(pH@l&bHDW`yg8{AS?>|z!S_jp{A8M8W5pANN)_ldgpz`FGy zc`rN%gIv`e4ypPIN5z2p{YlRxb&A}NDpUE#e0WAztO?dozER#5!X9+I~Q<~n!_(u2*2?^ z@hcq%$4gUh+2=Y~`1%0gPnhBuJQV(Oi~n9d;?#*g9(!1>o2^kNUdrgTtPrTH{N8Zf zx{ZQ~G!V)4_l1DiA;;HRw}|e2-H?*K?Bd`dMIWFF!1M5iO^!(?Y|Yjufr)a5u|YQ; z%fb&SLOK?hWvPnj=z2YQyJ25H^j+x!>My%q2BppbAHm2Qn8RMaxUB5`z}psYRcF|R zYFgLC#LGi4IvW30*h^{OuZ4&l5&Q=HqR`{(2NHd!(i{Enq?unq$7iXL{6)t|^npIj z`fK@}(|x!=wYAl@UABWxgWP}IFn?>h(pN*W8n|$ZQ)^vpU6ya*i_mPi6$^|h;M?(a13!R@lqU-RpROsg&gCDsD|*6M&V~>eBD~i7OAx$A48Z{!Ym&;}l05o2 zn{Qsr-6H)clKt(co4fU)PvqrY5+NsP*TmuOmQr0V&2CqrVsOt*owrMBo1E!Qi!Mt_ z5&wGKKi+Eb3zVpsDp5sze2;v^iLWq|+ zAQK!u$Tk}RQ`sx!12dy3#s#%<$u(BEQ3MrB@D!W}RH3GbiA`aXi&z6#G%`5WSR@%2 z1fE~SoQTFAa9^XliIz;s-m;AE>3F?TV5~eR(6>D`X#QnAhf*Ab^ed~LFA?Zjvh9y8 zLW$0j%D#tq0CjAEOdKFHHoBX51fBWsxlyo>!WsNH4 z)>C5gvm+*!@K<8|T0o4ykP&9AKj)K|Uu1FRH!+vw*)zbtW_>X^&@$ut&liTbfz`q7 zS4fpaxaUiMy76jM64`2YZ-fCd)0MK-Tx_}XNwdH)E^l3xv!Z;5MKn}hqHKnpqiJAo zx{_Rn*I(0w{+!LqJ(8a_T#q9&1}Z7hY|)W2HpM@vs@TRpVy1-rsDrG#?93S2@48UZpA1&yweDQ}G>=W?(v||>z zD71;^EKv<_kQI*G)y(I4HCdkdjgEq%^*)gz9;NzMhDx^>z~fh}8k$0ilyTwpt0bRD zulP99v{0*Ujtc}FC+U6vc0JlSf?GxE)T8&c7LLv);~X@6S#@`v%k`*xtzI(z*~6J_ zv2FL84Q?IRWN%~=R;;)ycX|@Cuy2tr>vSh1h?7ov{wWc@rbuF2D+TEvk0O)W_#z@@zGXNvT$YeN zvS7JtnwY@t;X0Z(4WodVMC_Rbu=n9UX|P(ld3Tn%RE*p=qe}RL!f=_nw)$12w;MhZX5I<2@0s55R@i-F+izk=i$nF)!-RhWtHWvZHDXWp~O(H za{JHJzCqI_^l$ki`fO}yL{Jj}EbbdNuDS0X-@6}m=>D1|p}Wr z&iP5p|0nPC1LN|>iMt_qVbAOxa@uyEF}Y(kBq@$O_&v2ozl+>!PG0jJSFrJh86c96 z9B`;l`cGy4Rj%K3d!C#jz>fTp=lV0hD2oIqy7by@0q2~q*H#={R>N%U$Gry`iWISoxL7sI+% z-5th!mAjqeXl;Ca)5L3EK9ZH*L$AFws!zt3ev+MGqDOSAE64ETLg;HhS#%gk!pNfI z_(esP#SC=(#JDT3p#eRE$S+Ve0{bV|F>djmoPIl68N>g3ZTwSi-aCQ07{N0rQ=_9j zwkf6)_kQu6hG($)J3?g?h0Gc;;Hr;z>Y~c{Wk#@rVn0n4c3!#e<;1ybB^M9gn0d5; z_3VhE9xOk6WDR-I*ep<|Ztn6(a$?8xgCXcxA~zVsjZ$}^NLXBLPSAjmsUYx9 zm>+$3;=)B4v|oE(M)z zqp^K@?WO72sSAj>n2Z7S@;Eca@4*|&#?M{85(*j9v8yV+UE+g05O#SB^sV4erhD8p z#%I;lC3{0@0ad*_`;^BY9OfhY@?Ix1B_VSA^v%F=gL2d3=8k&-vY2b2F%R}hXp`@R zJq-@i?=M` zT?GWt8}NS_lvXhL^%!TF0qv7fyW6(2Yg@Nd$I*=buy9%H#Bt};VEna{K>ev9zEJV& z@}jTdDM!f-ARHeH3Eupo2D7VCncVopUEXfl)X7=M5@t9t@KoEyU0##a_fxKFETL=$ zxiv0L;DcXYe53=Z<}YJFqHplR*852b^+ptpklKa~q|8@-9%<>4d zu&ktLP%6jh5IW~N3(4pW>S9lo_|@C~$O(31;3gd=xJEk-*a@um27P+@H-JTPg)aZB z9jVtc`~$=SIDJ1{BtOZR9G|)~LWaph?^@@(Te$0vzYjAhTho)*u zCWx&?yjNA-PjbzNJ<|H)ALQf*{j7~WMZ!uRx_YOTw)dApf4Whq=b>ZDMn=Z%AMugC zvd%7_+w?@8xS?iF*Je#-)etBQmi1}F#o$4$T)617v$mNhA|+3Ta1V;IN=Vo-EGV99 zjA|cs$O`pLAJv0O z8bu)y2sOIuTfvY>Xx@{gjEm=f;owBr&o0%uAD7-3cnY1R&z2{Zzi=(RtA{+h=AL6? zM$G`uT5hZT0(qgv{%8D_n?#(qx%5U71Z++iUP!H73ptQ!*|1VuUwK7mdkULze zk3M#TQnqh)H!GcvmQEmbp`&oYA}gql0W@KKXmnrw=U3OyW0MSE{eSf2$C_zLRkiRP zY)pq*xH`G?pZ(GB;Yta&?6y)#DoRsR{b=X#O=N5A@T5Gw$ZFkNdVK;uG74Whs&ofZ z{A>k>+Mi~Dd&Dvb;ZV5==x!7zOw9}uTvzE{?q|>3p!HL_ zyDL~RTdgb_h1!RlOoEXTl72Ho4Jb4Sed_D)hpw{fgCm=z$hAh_?>83gZ}{b=tI5Z~ zzS)9G!fwqatXK5!cZr@HqI2>JoQMGt=PWW!GTA}Db&dmD*g{w92eR+;IUtTqC>z1e zBbxV*zc1a(+1EJ2x|gDBT_HF9kgcIBJ#|5}B`Kw}VMbXfW*e6`Q#o{S>qjs1ADIf^`j`;> zD(K~5)W(z>{a!rev(Zo^^LA7`VCrOV*2kqry@2)x zo*2)z(NO%!)~jB?yM;SjtVTLy#SbML-d7H;#~yFWhrDlKN#D1BYh#IP>2_Z$ZqT7H zdeBUsW5lK3!3gL7RycOTUls1)LEC$>v?}v9kujlqOYo5B?g4YEr3-G!2*r@{GC3cZ zCLP$Ql+HE6bvc}fxlU*4@S^SwVk0ffD*edfmt}6dz%JD5qcC%2BlJPF$=pkU`tt8Q zn4N&XTzs~FD-JYS^C4SiuLucf)kTU&;k$}az%^6-@vmlXP9_NfX2m+pkM!@rLme$& z#!Oe4n^jQV~2z^U+<$NId>xK-Ire-y;RWO1+ zMuzd&59mHtu>pZsG|&kkhkV;pa-9=iE@cIYBf7Pes0Jvn=x(Kr=~ygRg@sJFrPkSt zHaW`)newVZcp_>7OzG$uNjj#jwr9V7T<0&I9x#29Gb`k;q_vipNT~}mu4t@~sv9%= zJUtfYZInjfuC(kP@;U1^3o+k>{$!r}eZ9E~H9mk~Sg03OxYbnZzA13I5MvomKjS82 zgxJkMsYCSfv=LOp;n>sV+vLT*4~jR~sa4>!(%*t$^Fh2@lYDc{hn_99&)T+Gt@_de zmO|feQ+iyo58@9GyJ>C-C^aSlly2Q3B{SNOsD9J44-l`twLUmE*jX;-=O~}%_b~YA zLWj9lUqV9_19`>lo5@9zZl%>qbK?Ym6CJXoJd-c?T_X6tm1ha9r!@sG3>s714^UX_ z^36w+4FR0R_7qSxov{- z=Lgl*e{x*u7gmbf1oLyZQMW*vb9OZ*r|W7iy9iCM#YH4?2?p`+nB+xVUH5M^S=dfE zlaqBl>z}OSIS+>;{Qr`{lb&$Eh~egvzwmC;VYL)%%X1Xxk@l%=Re!rL15pXQq-8C21O_NE}WVU6~z@y19#=KV~Eo(+VaWGG;I_^zACqVpZj90^jk{S&f& z*86ArXEDp2P{YJOhT8v0Vb;@RNRKz9#Ek}WkbZ6Qe9^({#58jYD9t#Wz)^d#Vkgrldg zW<@S+3jF3fSI#?)M<0`q7~2NNw6r(_<7JdGSO>0H6P^*~*tdU6h9>{B;{7*Ba5BPy zj+i+_IRj|4OvT68Gq&YOAkV+w&4+wSs0!tfmdsu$fSi!*uxOgyILX{}UJ{cArY!i7 ztoxj_rozTq`jZmju2Be`6I4ML5~VarTBAMV3_$817c@{ z6Z4;Gl{4pUL49Ln5hmfz)eLznW6)+w7|Kc)@1*;W8#&{)GL+fg=ds13mfnY;Aq&9? zm?1=PRMbd27TE7@xSTi?`se*C*IBvoQ*k8qL3K^BmR)fHbi8^3_IaUODz68`hDu$p zb?J-w*{rMsk}7}Jv48R9N4PT7B|R1!v1=A(VVkYDdQ|L26!Y`*$Jye1vr>H9_i0A= zcfD8OPRgKAcNlxHiBS4Pmm7L`PWrbhTnKJ!=)EVUHRV*73Kj*_tUfzcg!HI-cpwhg5}=Mmp)>mqou?DW z$bMl@3Q{8ckf1i%`3$GWA{=y>l7Jn`sAp4Crn6nswe?k$Q6sq=ulYTBMummi$|f68 zwO4a*cGUqFj1xzf+Y^LMZ@oXCRM(=K5-{9)z;JbOIw8LgMF}IoyxAiea=`NOcm?e7RlJ8C7oJQxE!Nufki+8-bM!F4}H?1sP;g1qk zD*~LZD~D={qc2Nk$FC`m%lxd;`m30RWa^^8)1F!S1(8j8XF8LPkEi=4 zQ#Us$IX=|l(7mGl#P{JV>F}@{*I===-m5mMFPVJd+%3K13+8YA{58!xBP1Ve&r1O3 z)Xat^PEjYoWZuDYw2;L$O9OsjOFpya@aMu=S7KEVPh=jx5||3Gf)Xgo0=#tbkuP=Y z#m|Bf89U!+W>+4O6YYzCY9k@3`xcPbU8cWXuaD3}qKx-E5fba5ysBdi6vj~mVI{Wy zg`(%$GF%yy14Pz%zbAP(G7#vw*<7S45cU0*iq6ON1J|_hnJq6tpt`ur5)W!9 zad)HS(N{KaZV%<87HCVU4W2zqZ2lI{$sXWxF#N>}mdPsWu}FtP`A)jyH>`2Zh2B4x zNJ{Lg_9-e~%hB)@?q(EMJJt;{T|pz^AFB$S$j<$-%z~I-2}QZZmz7X5Ck34KJK5y~ zj(y1OgJgP`53rNOgPC7QJ_rKneFYc1aC||YO359mfa@D^5mNpsQU`Aimsx~MmnNFv z;Kna`GT;bqa!3#cWRYA_K=nsvs#***aO>+=>-ko;9#~(lycP7q0pbH(VAt3Dr#3#Y)V|@U z_ztD0uCik~uGcR8mZEHsWf$U~JCNVmHDUGvZaU0>a?^1^Jb(}B)##zp^lE4CSxlr8 zN6`IB&J{iEzP45ja9*N{V!s3lK!Aqaw4*&8zr6dP%jLRJnJ}cM_*U_4(8Cu$GjPAN zlSNmpsYo#(>Je3x=eBh2YN5Y`gamN5v9>{Ju5S&tP$Ix8mh`e&P4i}ExK@8d@hGZv z6!?LD>2sy_^s|{CyU`FGbZ>j}>scpoWyCl~J0d51q|DX?R~ zy@JO5c8$RQ$~`d0torsL%F?xrXvnKhl#cW|VQ8>i8`Jz7Cq)q!x+|oAOVTKdjFN!U z$7ZZ4dM5R_jRAV%T3Q`nt^vwZ?fb=idl|%QB;(f*XOol$)P$e(PmJa{zu86nbJWuZ z|M}Udq6(Nfd@^!3J`#!!U)LS&AIV`SNL{#!+ilDn519r)PHJu3G}7FK9)=5dT{zIq zuh@En@ayF4xf|~rcjdl13#YK^7R=QQ1+$O}XZ;74dY*IL^?x7M#uzom7z*zv%xE}^ z!`jcGMg*HpfPRMvlSXavaAJ`AmhD`XDdX~?h`%p)iR3b!Ym^``Dkpj0Th~o&XOfQ{ zd9s1j5mDU~w?9F2{J{49#{Ig1e~exJ5Xk(mC0wyr9JqgDt9l*y*U?8iQYRA<#=nT4 zN?)`7o0v z%}wQMO$tkwP!bs84ZJcx^S%0k439HnHV7d@oMWtJ8%_wqP6jV68I{#GPeGdJBofljNvAsRL=>tilG;|b$VrDmr_2Mi z>;vrBD*wh$|I3SKri^N|juj)F2Oa25HX=QK>>vLKP5Ja-_6dKQ20XY$r#Cshc}Liz zVObR-iBY&Irt>N$sS|i=3X9NBd6_BFTt)Ao!X5_jXE?d|LQM*JcaS=XBa`?#AmSCr zi{`NA!%W6!Uxz4`gPuJzdZzKdug>+Aii@Mem#IZW1DSYk*AjP~5*ZqWxO_erI6JiN z+NRMlK9q>%hM6;c2NJrHPdBnMJr~j&WqKAN2&Mr<-aeuMFu=X4Owpg?I|?=%n+#6#ycpK%G_NMxl=mYVe6JxZJjVJ5&PlmlO}HuZ?xM#o&n zqrr&!wX=`cF`@Fog_+68+4%9`5(U$ssK`DQQK4Aqwy~0kD|^nwXRQ|n*}6Ipr{FB+ zYDKobwo#>{#<7<(E?*f~_>VE$68927IL17Z()N${t9xdr6gE7O>qhIA5KJrTYRK(>f{rtmh7Ti8!|X z!ShZm@2~PV#FJsY`-EVedB?voU$l#7dx*C-i4yhKy2F!yAw-&PDJ_%RZ!TdVScb<@ zAjO3kvk8ic1gJ>4>2yU(ou1BrY6}d(xrG1c18aSeEvc!rW5Xk-T6V~%H?1yeZEvca zD;@ok{>Z(mV4eE3DUm0pdtnlVJkICh8Y&Sf2Je-_g0Leo!iXG?=C7Q7 z$Xc-4X?p6F&zij=XPqYsp;un| z`MBSBpJtWp1gelIIh+e&E=VZLkh?v2WmZTOvWc(8LhM~ZdxHA%ZGP6@w!eCdthV4IQ1DH{zol*9)QqDzH2V4rB+>P=T9lv+tc}Xy8GAd%b*j9ZS%`KEN z;UneAu&v8y_c_!jca1aQd*ii;T?OX?o$I%o8-bh~(fgF;_8gASU=TkqVHL-lUTk33IwUf1^z{IEVoM z_Xlir^PRUm_8(sg7rHy2T4qBu1vd7^GT&T#Y+pLhN@X>6N#%7B%~#Tzn$K7Q9CaOR z1F5uK@fxnS+l=^CGx{-*wDCLOba8iiu+_Bbg}TGhciwNhC$dMVNChxpZ;{>_R{)#l zLge!YGRzs|0|dV()0i@-O?Y{Sc8m}G-Q!3-Gwr9`YOktPsDxU4b+fJ6D2=qIO)KlL zx$0eq(=^RPKvZ8ol%N?W=obHgrEXr?A-jZNxWmQyUBA0<)c3)GiQ(5z@mp8hKED3` zs&bIqs?V2Girk!}tpK*59IHubliC4URnnsQpa?LqK$`Pa!gHE$?htEDe0r&A5#BC( zSL&pA+R^Vo{$vi?ft;?a2{@G$G3+0zYs$Ek-XAqom*#gXsifNGiz($;D`thal42-j zqQmS#cV|HFucC8J^YrwUR;iuh) zD{zZ&i)-`K(b2{^JI-Q}P99)LdRHbYAHr|t||hrRqj z>VzKOSq*hYj)QX!MT{a0@>5EXjr?)*m0gcK<%@@^`?6Xf4~#s?&U+~=tT>#1n(*AB zRs<{eyTa8q2Fs0hSo0pej(jJ-ON{lLU=NvZ|4MW>2cq_=9fZZM@d79Emyo2yPyVxV z{#08TsdpWElMqk6G!ZQ9(~qN6P$Zi^$4iMEuPBZjx!# zP1!M?&@WUNy0t9rZyGK69mNrV{NZ?vho7vPjPu%k3$@u-op7a&jfanYon3)xq}$Go zV%}}AF(~85U4}d>tJOO}YOL_82|Ld!+9larQ++d8E$EQy8IMYiP`$uszuV=`^&5Y+ zsvo5Lsm=W-zk+mR(3aZ{+9?F>98qfQ{5e{|JhnCQ^#dtfwF3nMAz%Ae+cKxVgit(E zo|0!;qPOmZu)zBjEd62JM?#FTp)4!`{i$8LdU_p37Ub2kIAeyfsJ>7L16{VDy?2eT zpePwRx#Y)ZAZWu(!OU&V^+%p9T>NJT{Ci>B`(I$tD+Ew8V{h>;R}abPzr7*R+k3nS zJZ|;^mV3QTn|i2Q)Z90-zz|?UVI}&}D@8YYL@;OHAwB8rs5ANbYh}j^0~3Aw?z%c( zwhIbM3oAjHB1yjYA(QN84DdvV#PTXaqU<8vM-c8)br-s6zBJMyQKMu_5G~jj%aQ`a z$ZB6%DQ5ZktLT;6SYp1e&g7$U$+TzYoG*`iG~~9B9zJLdXDYBbFf8;gEIP=p6o*Fh zqT9+nnowSs;|(OFEA(8iYS14c1tUx2TzpWb2O9x2FU3#{J>?SIR~fBO4rQjgz0-MH zZa$0xdzxO?TgX}{H9VHuq(Lu+hR&C(TJL(&#iu=<+{3whuG#I1|9lGjv$Fm+)Aa#i ziG`Pv0^W%}LZDzBb4~$h8;bat=r6Y=(p0ljPo?N1t<$F?%CZ~z$I(zV*yzt&j%i~Qe9yoiy*ek`J@F@N}7 zRC*bmF8bUXN?-t#Vza!x;hKe4!;fM2GT@5}%@Khqba)OvtNfTp7p zM=x?vQsNPBVet30Q(r?;k!Y0U{7Eq;-q^|-!%71jta`7r<}?=D8|iuW?O0t?7d#W5 z63*T8_Usd%U1K2F`zW0qD&A6Mb>ED7~jxKQmANHBROC=H>Gc%ZO!M?kv7)J}+tl8VNt_RoUm~VYjFPhACl+ z*%SpzHT}wXUpVPtNT6XcMQ0hYGX5M8#PiATt=JW2`n?VlavSf%Cfx2pZOWSr$-FCH&TQWHh zip#(Ih--a8|2b6#-rp_^motPz8yXU0_bghXchFGIqdR1;*5Gos$@{*n>V{PSx>*TrRMXDBu?Gl@^ehauG$M#aVhS33F=Z@Z#0>_LQ78RS>?T<@G-#fgPwCvZS&^>%h)?@&<#YxJ^v zAMYv65bx=W3S=tDFQ(fVr~XgpuXVQVETEt{ApjJz+OQF#;>v6jmyq+L_o|E`cCf9$)iCWoy=+ejv=m@%YpQ2~tafUhuK=S@v zm-2&_Rf@&YXcG;%}Z zbsw$-sLTk}UK!U;1Cpa(GMwH^S7SO+W?j{beRd?EsZzW;q%7F3q7e81BceD5exZVK ziAxGLpf2tW&#B!O!5{@wXyVC7({xubEcF}Xwf&0jDs8b^|MFY1sGu3(L-^N@b6>=a#>rGZj8$nX zagS;1s;|;~DHT*LON-OcEww-0_xKg-8 zoD-~CGe14hzgF#I6FN7MQ8DD8CTEpHk#{49#7f<&Q!GX!cb!tahl*?CjWOYVtaNb+ zD-N^F3NYY>bu!mOOomg>faLzNFi>6|Rz|w;>bOek^Qx$gMoCe=9$H|2h|@PER4<$2 zIjOjMXRIZJzPw<4*1glXtYc=&kY>ZwRbOQygN@VI(>C?}JAO;@TdIVTSgHk_LuuOk z{i@D2?zZ5SuSV-X?r2X=0!FRExD}GkI+- zscy(*PGAYtvUvBVTG%1p6%ZkYxo9xrP1ndizV(WSITmn zI>{(gdcUsPy&{^+s-~mtwZm2K)x=^=9Uw@64K)$aW=HE&3II$8ePOmfD4S%xuDzULO(Y8+d_Op;a z%Ax(oE`8qlwT%Q@lfKOoyvguIAN|qfYp&kTe8*tzryZ!F{b{S{_n0=hSl7hhi_v2N z)5-KHgmjd{Z_HhZZJ`A78hJ-u*G!$}*j*&4E)*^CARVt#Zpa7=7`&y zZd0@QcY_iiOS((`ylcz3tdbgmKhL&2vG!I2(9$$u{F=V~Dbw1=;U)SChl%@6(?*h? zjVyZj9BYOB)Ey6B8+Yc=t3OsVf}Tt|AS|wJRn2U{?_^`Lo{|P;>z$s?q?r0SiHjTf z3`J9`fr#aVzA#ApN)gYDOl;jU390cjHMcW1K%iYb+n+KKj%bd_{k84PpY7m$7n%i% zp983F_%fhVIHINfFpzQn&?7j=wObOBc0Kw_ u8$a~Qf9#3$|Nr{e4pA#wTmvTfSP!oHYKkwjl%IQ_5AUnW7vFpO;{N~=|J)t` diff --git a/doc/img/ride-real.png b/doc/img/ride-real.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f9b6492eb9f2dce123d5b9a15be5aadddbc5a2 GIT binary patch literal 23759 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 literal 0 HcmV?d00001 diff --git a/doc/img/ride.png b/doc/img/ride.png index 707388980c67985312629391774690e4bac44abf..fbafe983bbeb788c2caf076e95de6dc75f160080 100644 GIT binary patch literal 22678 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 literal 21330 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 S1^vqVd?KwVRr=_~>;DDm2e(83 diff --git a/doc/img/terminal.png b/doc/img/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..2345059405181b6fea6ac88fe5f0ed483a06acbd GIT binary patch literal 26471 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 Cf$}W? literal 0 HcmV?d00001 diff --git a/doc/img/ticket.png b/doc/img/ticket.png index 371059c77c3139469237e71b9f491c5c8653d996..c2fae5869bbfa3cdc73e1eecefb9ee859e6c878c 100644 GIT binary patch delta 10198 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 delta 9468 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 diff --git a/doc/img/too-far.png b/doc/img/too-far.png new file mode 100644 index 0000000000000000000000000000000000000000..17a48d56474fa6398e1ecb435922920f64c7ce9c GIT binary patch literal 26983 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�jfKUd<=gWgS$98tUw2oV{@>yi=qDnD8Qf<1*Ht3 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 Y{lg9^3YAuv&3u^}S{js{xqRop0K*7v9RL6T literal 0 HcmV?d00001 diff --git a/doc/img/words.png b/doc/img/words.png index 655f36df6e04116e7423206e8287036130658c3c..23c42f9c98193b4887beec8f194c9295f69cacc0 100644 GIT binary patch literal 16005 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 z z?G{RhFOx$^Bj7UB@9<24Rvz#9E9U2~3T8v}s9f(1#a~>_I}JcoC_V7XLlK3N!DA9l z^d_gzoAh(N{o^ha4x8Op&zYUqO7wQxE?zdm+emKT*CY=rBn^>|d5~z6aOYw|bgB|i)9F}X{ahBp^$(>( z^7%rF|Iia>|A&x0kC`_3P1Wz~s{XhWt7Fq;YP{H)VbcX*_r>yBXV@W%4V4ogxi() zVlA%|vg0>HPiUy?F#-0Cr({T=lwz;MCyOz7;KeIptsPTsZJqyw%qJ4CbU*(J-N$P* z6;;2t#21T~5u|#J{mDaRIkxi;&&uItyt2)}Jk}ZZ)Jik>I3j_!|397(FLz%kASG+a zo0EbY5k|-Y``ZvMFgb`I^cUE{13tM9{@1Bz=R$D|{{Mgd&)~osaatpk_Vm7R=!sU# zmx!AbO#VqV{`Z_Ku>d}^@Ru_b*ZNIkK@!AP(l>GI~gMGpWinGh6bKFH%>PcF+7M8^V{1&HJ9`3 zZ3Y#V&h`trD2}bDt$)M2_BVCyL*?V2MR0u(@^jNdh+VFA8=>H94_A1~oSQFvFWFoy z(wB0FcWK8c=x_Q7!4K#bqa!%^r}Sit#Qn$^+Zfw zhvVgG7uFWLF9_IZMG@S(T!kx^&*N&|&dTs^yqK6N(r8-g>xjqH{Whc&Mapyw`$ETt zM?8BEsRcei77Se>;JLV3+7EDz0c+#}*cNF|5UK+iMIgyR<@Oc9jXxhXztw?s^(~}( zkWMT3ZNGVqx$%eCuJvacPq4tm=m)!{DZiNS3(i=zGiG~q5bK{Gsi(jKEL~emK|(}0 zw;6T~l!Y7_`|oP-r>;I#WF<{-n*CVQ=5?VvC&^H8iK|^%F-Z7D_^hU<`5zuZDYqmO z2tem4YANCqqlG9UlW_@47ryB>DCVr@_IXWT|D!M4q*5{Sy)r6gI$4eRob{J$SNR)~ zN40`125!(5X~d^1F5g&s8s`*1NI3OADc!^NvL+Q!VI8P<0F_|`GsK$jcx%jX^_~gF zKPRWZlw+o%4!yU&F4AvI?8pX_VWV?o(~04u;IL-%s65kYY9gLyj_iz@u)-_V3 zQ=WX7zNN!;rZnlb@``eo?wx(iv5dORg-mO%iJ(3tnCwH#*$#r0uxg z@MC#O2ZR7AwGJ_~7Ig)`*H`gr>f&NeTME&;J05BYIu2-M&eROMXMJZ1jY>DPY4^0r zZYD~)6;n_z*idj>8)mBPtHD*-*Ge_~H6GU`mQo}7kaS3`Bt@+_%I|gFW+3NS6k|0)nuOE>S}4ZShUjLKceEM zk_ofwl2yoa;1E(1vQ(6|T#@asH-Dyh@px}?hYjOM%XGhn2S=MPk6!OaO3U7mHj;8$&s7UOoGq~#pyl`&_scE zWi$&*e?eE)YH>4D==Up?r_g{{#SFQj6 diff --git a/doc/mal-och-tester.md b/doc/mal-och-tester.md index 0b7e6c3..ddbe60e 100644 --- a/doc/mal-och-tester.md +++ b/doc/mal-och-tester.md @@ -34,7 +34,7 @@ att bygga på Linux som på Windows. | Inkrementellt debug-bygge | < 10 s | 4,7 s | | Release-binär | < 20 MB | 10,2 MB (Linux), 10,8 MB (Windows) | | Testsviten | `go test ./...` grön på < 30 s | ~0,1 s | -| Banor | 100 % passerar det automatiska lösbarhetstestet | 6 av 6 | +| Banor | 100 % passerar det automatiska lösbarhetstestet | 7 av 7 | | Windows-korsbygge från Linux | fungerar utan extra verktyg | ✓ (CGO_ENABLED=0) | | Linux-binärens länkade bibliotek | bara libc | ✓ (GL/X11 laddas dynamiskt vid körning) | | Bildfrekvens | 60 fps vid 4× skala på integrerad grafik | ej mätt | @@ -127,6 +127,10 @@ att bygga på Linux som på Windows. | `internal/level` | `TestFloorsStairsAndPaths`, `TestFloorsValidation` | **M9a:** flera våningar läses, trappor länkar, BFS-vägen byter våning bara via trappa, spärregeln och skyltar per våning; trappa utan motpart, olika storlekar, grid+floors och fel våning avvisas | | `internal/sim` | `TestStairsMoveBetweenFloors` | Att kliva på trappan flyttar spelaren en våning, dimman lättar runt andra änden, perrongen hörs bara på egen våning, boten går hela vägen över våningar | | `internal/level` | `TestCarsWomenOnlyAndCrowdFields` | **M9b:** vagnar, kvinnovagnens tidsfönster, crowd/clutter/noise 0–3, filrutor | +| `internal/nav` | `TestJudge`, `TestTooFarOnLongLoop`, `TestStopsRoutesAndNames`, `TestValidation`, `TestShippedNetwork` | **M9:** rätt/fel håll/för långt/ingen trafik på raka linjer och ringlinjer, stationer i färdriktningen, giltiga vägar sorterade, nätets validering, det riktiga nätets förutsättningar för banorna | +| `internal/level` | `TestAnnotateWithNetwork`, `TestPlatformTilesAndShippedVerdicts` | **M9:** `correct` räknas ut från nätet, felaktiga kopplingar ger fel, okopplade banor orörda; perrongtecknen `P p Q q R r`; 005/006 får väntade bedömningar | +| `internal/sim` | `TestNetworkRideUsesRealStops`, `TestWrongDirectionLoses`, `TestTooFarLoses`, `TestSignsModeBonus`, `TestTerminalLines` | **M9:** resan visar linjens riktiga stationer med resmålet på rätt plats; fel håll och för långt bort förlorar med rätt orsak; skyltläget ger +50 %; terminalen listar linjer med grannstationer | +| `internal/lang` | `TestNetworkNamesInDictionary` | **M9:** alla stations- och linjenamn i nätet finns i ordboken | | `internal/minigame` | `TestCarPickAlightingAndChoice`, `TestCrowdLevelNarrowsZone`, `TestRideCrowdLetPass` | Folk av först (för tidigt räknas), seedad trängsel med minst en lugn vagn, val; trängsel smalnar zonen; resan: kortare tid per station, passagerare som vill förbi, blockerade räknas | | `internal/sim` | `TestNPCsWanderStayOnFloorAndBlockPlayer`, `TestAlightingNPCsSpawnAndLeave` | Folk rör sig på golv, seedat, blockerar spelaren; avstigande spawnar när dörrarna öppnas och lämnar via utgången | | `internal/sim` | `TestLanesSlowWrongSide`, `TestCarsWomenOnlyEarlyAndCrowd` | Fel sida i filen bromsar; kvinnovagn med man ger grova minus, för tidigt ombord räknas, resan ärver vagnens trängsel, lugn vagn ger bonus | @@ -147,7 +151,7 @@ att bygga på Linux som på Windows. | ~~M9b Folk, reklam, ljudröra, vagnar~~ ✓ | NPC:er, filer, röra, vagnval – finns, se tabellen ovan (bot med folk: testerna tömmer folket där det skulle störa, "fler NPC:er = längre tid" mäts manuellt) | | ~~M8 Progression & sparfil~~ ✓ | Round-trip, skillkrav, upplåsningar, 33 %-regeln – finns, se tabellen ovan | | ~~M9a Flera våningar~~ ✓ | Trappor, vägar över våningar, dimma per våning, gamla banor oförändrade – finns, se tabellen ovan | -| M9 Navigeringslägen | Listläge genererar rätt ordning av tåg; skyltläge: 1–4 giltiga vägar; fel-riktnings-förlust triggar vid rätt slutstation | +| ~~M9 Navigeringslägen~~ ✓ | Nätets bedömningar (rätt/fel håll/för långt/ingen trafik), 1–4 rätta tåg, riktiga stationer på resan, fel-håll- och för-långt-förlust, skyltbonus, terminal – finns, se tabellen ovan | | M10 Story-innehåll | Alla banor lösbara (redan automatiskt); flerbytesbanor har sammanhängande byten; sista banan slutar på flygplatsen | | M11 Oändligt läge & NG+ | Målsekvens deterministisk per seed; NG+ behåller skills men nollställer items | | M12 Ljud & polish | Alla ljudfiler som refereras finns och går att avkoda; Windows-binär startar (manuellt) | diff --git a/doc/roadmap.md b/doc/roadmap.md index 7a14957..71b11da 100644 --- a/doc/roadmap.md +++ b/doc/roadmap.md @@ -482,7 +482,7 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n. - **Kvar till senare:** NPC:er som väntar på och kliver på tåget, folk som bildar riktiga köer vid markeringarna, utrop/reklam som ljud (M12). -### M9 – Navigeringslägen: lista och skyltläge +### M9 – Navigeringslägen: lista och skyltläge ✓ (klar 2026-10-24) - **Mål:** de två sätten att spela story. - Listläge: nästa tåg visas. @@ -490,6 +490,36 @@ på **brasse-linux01-runnern** (label `linux-amd64`), aldrig på Pi5:n. riktning / för långt bort. - **Teknik:** `internal/nav` (graf över stationer/linjer, giltiga vägar, riktningskontroll – ren Go). +- **Så blev det:** `internal/nav` läser `resources/data/network.json` + (76 stationer, 11 linjer: Yamanote som ringlinje, Chuo, Keihin-Tohoku, + Saikyo, Marunouchi, Hibiya, Ginza, Toyoko, Tokaido, Narita Express, + Keisei). Ett tåg bedöms från `lineId` + `terminus` (en station i + färdriktningen) mot banans `station`/`to`: **Direct** (resmålet inom 12 + stationer), **WrongDirection** (linjen går dit, men åt andra hållet), + **TooFar** (nås först efter fler än 12 stationer – fel varv på ringen, + omvägen via city) eller **NoService**. `correct` skrivs inte längre i + nätkopplade banfiler utan räknas ut; 1–4 rätta tåg per bana. Tågresan + visar linjens **riktiga stationer** i färdriktningen (resmålet på rätt + plats, eller aldrig). Förlustorsakerna *Fel håll* och *För långt bort* + förklarar vad som hände. **Listläge** visar "Ta: spår 6 Yamanote-sen + (+1)" i HUD:en; **skyltläge** visar bara att man är i det och ger +50 % + på grundpoängen. Läget växlas med **N** på bankartan och sparas. + **Terminalen**: på nätkopplade banor visar biljettautomaten linjetavlan + (varje linje med tre grannstationer åt vardera hållet), läst genom ens + kunskap som en skylt. Perrongtecknen generaliserade (`P p Q q R r`). + **Bana 006 Ikebukuro** (svårighet 4): fyra perronger – Yamanote mot + Shinjuku och Saikyo mot Osaki är rätt, Saikyo mot Omiya är fel håll och + Marunouchi mot Ogikubo för långt bort. Banorna 001–005 är kopplade till + nätet (Keihin-Tohoku mot Omiya i Ueno blev därmed *fel håll*). +- **Klar när:** bedömningarna och vägarna är testade (`nav.TestJudge`, + `TestTooFarOnLongLoop`, `TestStopsRoutesAndNames`, `TestShippedNetwork`), + banor kopplas rätt (`level.TestAnnotateWithNetwork`, + `TestPlatformTilesAndShippedVerdicts`), resan använder riktiga stationer + och fel håll/för långt förlorar (`sim.TestNetworkRideUsesRealStops`, + `TestWrongDirectionLoses`, `TestTooFarLoses`), skyltläget ger bonus + (`TestSignsModeBonus`) och terminalen listar linjer (`TestTerminalLines`). ✓ +- **Kvar till senare:** flera tåg i rad (byten) kommer med M10; bussar; + "terminaler" som egna rutor i stället för biljettautomaten. ### M10 – Story-innehåll och flerbytesbanor diff --git a/doc/spelbeskrivning.md b/doc/spelbeskrivning.md index 8503b7e..3dfcd32 100644 --- a/doc/spelbeskrivning.md +++ b/doc/spelbeskrivning.md @@ -265,4 +265,6 @@ från skills i skill tree, och från unika skills man får av sidouppdrag. | "Lämel tåg" | *Lämmeltåg*: sällskapet som följer efter dig i rad | Styr §5 | | "level maps game box liknande styl av level väljande" | Bankarta i spelbrädes-/världskartestil | Kan ändras om något annat avsågs | | "bilder och eventuella språk och tester" (resursmappen) | bilder, språk och *texter* | Se resurslayouten i roadmap | +| "slutstation ligger i fel riktning … eller hamnar för långt bort" (skyltläge) | Linjenätet (`network.json`) bedömer varje tåg: *fel håll* om linjen går till resmålet men tåget åt andra hållet; *för långt bort* om resmålet nås först efter fler än 12 stationer (fel varv på Yamanote-ringen, omvägen via city). Båda förlorar banan – i båda lägena, eftersom fel tåg alltid har förlorat | Gränsen 12 är `nav.MaxStops` och kan ändras | +| "skyltar och terminaler" | Terminalen är biljettautomaten: på nätkopplade banor visar den linjetavlan (linjer vid stationen med grannstationer åt båda hållen), läst genom ens japanska som en skylt | Egna terminalrutor kan komma senare | | Repo-namnet | Arbetsnamnet var "jp-subway-pussel"; Björn döpte Gitea-repot till **metro-puzzle-jp** (2026-10-23), så repo, modul, binär och titel heter så | Spelets visningsnamn "Metro Puzzle JP" kan ändras fritt i `resources/text/*.json` | diff --git a/internal/game/assets.go b/internal/game/assets.go index d0cbc20..6f6d626 100644 --- a/internal/game/assets.go +++ b/internal/game/assets.go @@ -80,7 +80,9 @@ func LoadAssets() (*Assets, error) { } a.Tiles[t] = sub(i) } - a.Tiles[level.WrongPlatform] = a.Tiles[level.Platform] // samma utseende; tåget avgör + for _, t := range level.PlatformTiles[1:] { + a.Tiles[t] = a.Tiles[level.Platform] // samma utseende; tåget avgör + } a.Train = sub(trainIndex) a.Rails = sub(railsIndex) for i := 0; i < posterCount; i++ { diff --git a/internal/game/game.go b/internal/game/game.go index f6c3df0..4338e9b 100644 --- a/internal/game/game.go +++ b/internal/game/game.go @@ -12,6 +12,7 @@ import ( "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/lang" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/progress" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/res" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" @@ -45,6 +46,7 @@ type Game struct { Catalog *progress.Catalog Levels []*level.Level // alla banor, sorterade på id Audio *Audio // nil = tyst + Mode nav.Mode // navigeringsläge (= State.NavMode), växlas på bankartan savePath string // "" = spara inte fixedSeed uint64 // >0: alla banor startar med denna seed (tester/skärmdumpar) @@ -69,6 +71,7 @@ type Options struct { Mute bool // inget ljud SavePath string // sparfil ("" = standardplatsen) NoSave bool // läs sparfilen men skriv aldrig + Mode string // navigeringsläge från start: "list" eller "signs" (tomt = sparfilens) } // New laddar resurser, sparfil och bygger spelet. @@ -109,6 +112,10 @@ func New(opt Options) (*Game, error) { } g.State = st g.Know, g.Wallet, g.Profile, g.Progress = st.Know, st.Wallet, st.Profile, st.Progress + g.Mode = nav.ParseMode(st.NavMode) + if opt.Mode != "" { + g.Mode = nav.ParseMode(opt.Mode) + } if !opt.NoSave { g.savePath = path } @@ -233,10 +240,21 @@ func (g *Game) runOptions(id string, seed rng.Seed) sim.RunOptions { return sim.RunOptions{ Dict: g.Assets.Dict, Know: g.Know, Wallet: g.Wallet, Debuffs: g.Profile.Debuffs, Seed: seed, Extra: eff.Stats, FogRadius: eff.FogRadius, Landmarks: eff.Landmarks, FreeGates: eff.FreeGates, - RevealAll: eff.Reveal[id], InfiniteBattery: eff.Battery, + RevealAll: eff.Reveal[id], InfiniteBattery: eff.Battery, Mode: g.Mode, } } +// toggleMode växlar navigeringsläge och sparar. +func (g *Game) toggleMode() { + if g.Mode == nav.List { + g.Mode = nav.Signs + } else { + g.Mode = nav.List + } + g.State.NavMode = g.Mode.String() + g.Save() +} + // startLevel startar (eller återupptar) en bana och sparar seeden så att en // laddad omgång ger samma slump. func (g *Game) startLevel(id string) (*LevelScene, error) { diff --git a/internal/game/input.go b/internal/game/input.go index 24fc4cb..cb0f0cc 100644 --- a/internal/game/input.go +++ b/internal/game/input.go @@ -126,6 +126,9 @@ func shopJustPressed() bool { return virtual.pressed["b"] || inpututil.IsKeyJust // phoneJustPressed: P = kortet i telefonen av/på (meny). func phoneJustPressed() bool { return virtual.pressed["p"] || inpututil.IsKeyJustPressed(ebiten.KeyP) } +// modeJustPressed: N växlar navigeringsläge (lista/skyltar) på bankartan. +func modeJustPressed() bool { return virtual.pressed["n"] || inpututil.IsKeyJustPressed(ebiten.KeyN) } + // mapJustPressed: M eller gamepadens vänstra mittknapp (Back/Select) = minikartan av/på. func mapJustPressed() bool { return virtual.pressed["m"] || inpututil.IsKeyJustPressed(ebiten.KeyM) || gamepadJustPressed(ebiten.StandardGamepadButtonCenterLeft) diff --git a/internal/game/minimap.go b/internal/game/minimap.go index f4e8230..4180a5b 100644 --- a/internal/game/minimap.go +++ b/internal/game/minimap.go @@ -24,6 +24,10 @@ var minimapColors = map[level.Tile]color.RGBA{ level.Spawn: {99, 199, 77, 255}, level.Platform: {254, 174, 52, 255}, level.WrongPlatform: {254, 174, 52, 255}, + level.Platform2: {254, 174, 52, 255}, + level.Platform3: {254, 174, 52, 255}, + level.Platform4: {254, 174, 52, 255}, + level.Platform5: {254, 174, 52, 255}, level.Gate: {44, 232, 245, 255}, level.TicketMachine: {247, 118, 34, 255}, level.Sign: {90, 140, 230, 255}, @@ -111,7 +115,7 @@ func (s *LevelScene) drawMinimap(g *Game, screen *ebiten.Image, box image.Rectan } t := l.At(p) c := minimapColors[t] - if (t == level.Platform || t == level.WrongPlatform) && r.TrainVisible(t) { + if t.IsPlatform() && r.TrainVisible(t) { c = color.RGBA{255, 255, 255, 255} // tåget är inne } vector.DrawFilledRect(screen, float32(x0+x*sc), float32(y0+y*sc), float32(sc), float32(sc), c, false) diff --git a/internal/game/scene_level.go b/internal/game/scene_level.go index bae8a35..f185c6c 100644 --- a/internal/game/scene_level.go +++ b/internal/game/scene_level.go @@ -15,6 +15,7 @@ import ( "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/lang" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/minigame" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/sim" ) @@ -104,6 +105,31 @@ func (s *LevelScene) RideAtDest() bool { return !ok || g.Index == g.Dest } +// drawModeHint ritar navigeringslägets ruta nere till vänster när inforutan +// är tom: listläget säger vilket tåg man ska ta, skyltläget påminner om att +// man får lista ut det själv (och om bonusen). +func (s *LevelScene) drawModeHint(a *Assets, screen *ebiten.Image) { + r := s.run + txt, col := "", colGood + if r.Mode == nav.Signs { + txt, col = a.T("hud.mode_signs"), colWarn + } else if next := r.NextTrains(); len(next) > 0 { + txt = fmt.Sprintf("%s %s %s %s", a.T("hud.take"), strings.ToLower(a.T("hud.track")), next[0].Track, next[0].Line.Get("romaji")) + if len(next) > 1 { + txt += fmt.Sprintf(" (+%d)", len(next)-1) + } + } + if txt == "" { + return + } + y := ScreenH - LineH - 6 + vector.DrawFilledRect(screen, 0, float32(y), float32(a.Width(txt)+8), float32(LineH+6), colPanel, false) + a.Draw(screen, txt, 4, y+3, col) +} + +// LevelOver rapporterar om banan är avgjord (skriptläget: "waitover"). +func (s *LevelScene) LevelOver() bool { return s.run.Outcome != sim.Ongoing } + func (s *LevelScene) followPlayer() { x, y := s.run.Player.WorldPos(TileSize) s.cam.Follow(x+TileSize/2, y+TileSize/2) @@ -165,6 +191,20 @@ func (s *LevelScene) MiniPick(text string) bool { s.run.StepMini(0, minigame.Input{Move: 1}) return false } + case *minigame.CarPick: + if text == "calm" { // lugnaste vagnen som inte är kvinnovagn + best := -1 + for i, c := range m.Cars { + if !c.WomenOnly && (best < 0 || c.Crowd < m.Cars[best].Crowd) { + best = i + } + } + if best < 0 || m.Cursor == best { + return true + } + s.run.StepMini(0, minigame.Input{MoveX: 1}) + return false + } case *minigame.TopUp: switch m.Stage { case minigame.TopUpPickMember: @@ -345,6 +385,9 @@ func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) { return // resultatpanelen, minispelet eller butiken tar över; ingen inforuta eller minikarta } lines, accent, bar := s.infoLines(a) + if len(lines) == 0 { + s.drawModeHint(a, screen) + } if entry := a.Dict.Lookup(r.Learned); entry != nil && r.Time-r.LearnedAt < learnedShowSec { lines = append(lines, plainLine(fmt.Sprintf("%s: %s = %s (%s)", a.T("hud.learned"), r.Learned, entry.Translation(UILang), entry.Romaji), colKnown)) @@ -499,10 +542,18 @@ func (s *LevelScene) infoLines(a *Assets) (lines []line, accent color.Color, bar } return []line{plainLine(a.T("hud.kiosk_none")+" "+a.T("hud.shop_prompt"), colDim)}, accent, false case level.TicketMachine: - if lvl.TicketRequired { - return []line{plainLine(fmt.Sprintf(a.T("hud.machine_ticket"), r.Wallet.Cash), colGood)}, colGood, false + // Terminalen: linjetavlan för stationen (nätkopplade banor), läst genom kunskapen som en skylt. + if term := r.TerminalLines(); len(term) > 0 { + lines = append(lines, plainLine(a.T("hud.terminal"), colDim)) + for _, t := range term { + rd := lang.Render(a.Dict, r.Know, t, UILang) + lines = append(lines, a.wrapLine(shownLine(rd.Partial, colText, false), maxW)...) + } } - return []line{plainLine(fmt.Sprintf(a.T("hud.machine_topup"), r.Wallet.Card, r.Wallet.Cash), colGood)}, colGood, false + if lvl.TicketRequired { + return append(lines, plainLine(fmt.Sprintf(a.T("hud.machine_ticket"), r.Wallet.Cash), colGood)), colGood, false + } + return append(lines, plainLine(fmt.Sprintf(a.T("hud.machine_topup"), r.Wallet.Card, r.Wallet.Cash), colGood)), colGood, false } if r.DeniedAt >= 0 && r.Time-r.DeniedAt < deniedShowSec { key := "hud.gate_denied" diff --git a/internal/game/scene_map.go b/internal/game/scene_map.go index f13972f..b85addb 100644 --- a/internal/game/scene_map.go +++ b/internal/game/scene_map.go @@ -101,6 +101,8 @@ func (m *MapScene) Update(g *Game) error { case phoneJustPressed(): g.Wallet.Phone = !g.Wallet.Phone g.Save() + case modeJustPressed(): + g.toggleMode() } if n := len(m.mains); n > 0 { mx, my := miniMoveXY() @@ -209,7 +211,7 @@ func (m *MapScene) Draw(g *Game, screen *ebiten.Image) { foot := fmt.Sprintf("%s %d %s %d %s %d¥", a.T("map.skill_points"), p.SkillPoints, a.T("words.points"), g.Know.Points, a.T("hud.cash"), g.Wallet.Cash) a.Draw(screen, foot, 8, 30, colDim) - a.Draw(screen, fmt.Sprintf(a.T("menu.phone"), onoff), 8, 42, colDim) + a.Draw(screen, fmt.Sprintf(a.T("menu.phone"), onoff)+" "+fmt.Sprintf(a.T("menu.mode"), a.T("mode."+g.Mode.String())), 8, 42, colDim) if len(g.Profile.Debuffs) > 0 { var parts []string for _, d := range g.Profile.Debuffs { diff --git a/internal/game/scene_result.go b/internal/game/scene_result.go index 9e420d1..1c49ed0 100644 --- a/internal/game/scene_result.go +++ b/internal/game/scene_result.go @@ -62,8 +62,12 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { y += LineH if run.Outcome == sim.Lost { reason := a.T(run.LostReason) - if run.LostReason == sim.LostWrongTrain { - reason = fmt.Sprintf(a.T("result.wrong_detail"), tr.Destination.Get("romaji"), run.Level.Destination.Get("romaji")) + if detail, ok := map[string]string{ + sim.LostWrongTrain: "result.wrong_detail", + sim.LostWrongDirection: "result.wrong_direction_detail", + sim.LostTooFar: "result.too_far_detail", + }[run.LostReason]; ok { + reason += " " + fmt.Sprintf(a.T(detail), tr.Destination.Get("romaji"), run.Level.Destination.Get("romaji")) } for _, l := range a.wrapLine(plainLine(reason, colText), ScreenW-56) { a.drawLines(screen, []line{l}, 28, y) @@ -80,11 +84,26 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { y += LineH if run.Outcome == sim.Won { sc := run.Score - a.Draw(screen, fmt.Sprintf("%s %d", a.T("result.score"), sc.Total), 28, y, colText) - y += LineH - a.Draw(screen, fmt.Sprintf("%s %d %s %d %s %d %s %d %s %d %s %d", strings.ToLower(a.T("hud.time")), sc.Time, a.T("result.money"), sc.Money, - a.T("result.meters"), sc.Meters, a.T("result.map"), sc.Explore, a.T("result.car"), sc.Car, a.T("result.penalty"), sc.Penalty), 28, y, colDim) - y += LineH + // Poängen som en uträkning; radbryts till högst två rader. + parts := []string{ + fmt.Sprintf("%s %d", strings.ToLower(a.T("hud.time")), sc.Time), fmt.Sprintf("%s %d", a.T("result.money"), sc.Money), + fmt.Sprintf("%s %d", a.T("result.meters"), sc.Meters), fmt.Sprintf("%s %d", a.T("result.map"), sc.Explore), + fmt.Sprintf("%s %d", a.T("result.car"), sc.Car), + } + if sc.Bonus > 0 { + parts = append(parts, fmt.Sprintf("%s %d", a.T("result.bonus"), sc.Bonus)) + } + total := fmt.Sprintf("%s %d = %s", a.T("result.score"), sc.Total, strings.Join(parts, " + ")) + if sc.Penalty > 0 { + total += fmt.Sprintf(" - %s %d", a.T("result.penalty"), sc.Penalty) + } + for i, l := range a.wrapLine(plainLine(total, colText), ScreenW-56) { + if i > 1 { + break + } + a.drawLines(screen, []line{l}, 28, y) + y += LineH + } msg := fmt.Sprintf("+%d %s", run.PointsEarned, a.T("result.lang_points")) if len(run.LearnedDest) > 0 { msg += " " + a.T("hud.learned") + ": " + strings.Join(run.LearnedDest, " ") + " (" + a.T("result.destination") + ")" diff --git a/internal/game/script.go b/internal/game/script.go index f3aa2ad..5a20c52 100644 --- a/internal/game/script.go +++ b/internal/game/script.go @@ -93,7 +93,7 @@ func parseScript(src string) (*script, error) { return nil, fmt.Errorf("script: '%s TEXT'", f[0]) } st.arg = f[1] - case "quit", "waittrain", "waitstop": + case "quit", "waittrain", "waitstop", "waitover": default: return nil, fmt.Errorf("script: okänt kommando %q", f[0]) } @@ -126,6 +126,7 @@ type playerTiler interface { type trainWaiter interface { TrainHere() bool RideAtDest() bool + LevelOver() bool MiniPick(text string) bool TrackPhaseName() string } @@ -195,6 +196,11 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error { if tw, ok := g.scene.(trainWaiter); !ok || tw.RideAtDest() { s.advance() } + case "waitover": + s.counter++ + if tw, ok := g.scene.(trainWaiter); !ok || tw.LevelOver() || s.counter > 60*120 { + s.advance() + } case "waitphase": s.counter++ if tw, ok := g.scene.(trainWaiter); !ok || tw.TrackPhaseName() == st.arg || s.counter > 60*60 { diff --git a/internal/game/trains.go b/internal/game/trains.go index e4f1318..efcde97 100644 --- a/internal/game/trains.go +++ b/internal/game/trains.go @@ -36,7 +36,7 @@ type trackInfo struct { func (s *LevelScene) buildTracks() { s.tracks = nil s.rails = map[level.Point]bool{} - for _, t := range []level.Tile{level.Platform, level.WrongPlatform} { + for _, t := range level.PlatformTiles { for _, p := range s.run.Level.Find(t) { tt, horizontal := s.run.Level.TrackTile(p) s.tracks = append(s.tracks, trackInfo{tile: t, platform: p, track: tt, horizontal: horizontal}) diff --git a/internal/lang/data_test.go b/internal/lang/data_test.go index 882f359..e36a365 100644 --- a/internal/lang/data_test.go +++ b/internal/lang/data_test.go @@ -7,6 +7,7 @@ import ( "testing" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/res" ) @@ -79,3 +80,27 @@ func TestAllJapaneseInLevelsIsInDictionary(t *testing.T) { } } } + +// TestNetworkNamesInDictionary: alla stations- och linjenamn i linjenätet +// finns i ordboken, så att tågresans stationer och terminalen går att lära sig. +func TestNetworkNamesInDictionary(t *testing.T) { + d := loadDict(t) + path, err := res.Path("data", "network.json") + if err != nil { + t.Fatal(err) + } + n, err := nav.LoadFile(path) + if err != nil { + t.Fatal(err) + } + for _, s := range n.Stations { + if u := d.Unknown(s.Name["ja"]); len(u) > 0 { + t.Errorf("station %s (%s) saknas i ordboken: %s", s.ID, s.Name["ja"], strings.Join(u, ", ")) + } + } + for _, l := range n.Lines { + if u := d.Unknown(l.Name["ja"]); len(u) > 0 { + t.Errorf("linje %s (%s) saknas i ordboken: %s", l.ID, l.Name["ja"], strings.Join(u, ", ")) + } + } +} diff --git a/internal/level/level.go b/internal/level/level.go index fcb5999..a3c9254 100644 --- a/internal/level/level.go +++ b/internal/level/level.go @@ -14,6 +14,8 @@ import ( "path/filepath" "sort" "strings" + + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav" ) // Tile är ett tecken i rutnätet. @@ -24,8 +26,12 @@ const ( Wall Tile = '#' // vägg, ej passerbar Floor Tile = '.' // golv Spawn Tile = 'S' // startpunkt (exakt en) - Platform Tile = 'P' // perrong med ett tåg (målet om tåget är rätt) - WrongPlatform Tile = 'p' // perrong med fel tåg + Platform Tile = 'P' // perrong med ett tåg (vilket tåg som är rätt avgör tåget, inte tecknet) + WrongPlatform Tile = 'p' // ytterligare perrong (namnet är historiskt: i de första banorna stod fel tåg här) + Platform2 Tile = 'Q' // fler perronger för banor med flera giltiga vägar och fällor + Platform3 Tile = 'q' + Platform4 Tile = 'R' + Platform5 Tile = 'r' Gate Tile = 'G' // spärr (kräver kort/biljett) TicketMachine Tile = 'T' // biljett-/påfyllningsautomat Sign Tile = 'i' // skylt @@ -37,12 +43,26 @@ const ( LaneRight Tile = '>' // fil för gång neråt/åt höger ) +// PlatformTiles är alla perrongtecken, i den ordning tåg brukar listas. +var PlatformTiles = []Tile{Platform, WrongPlatform, Platform2, Platform3, Platform4, Platform5} + var knownTiles = map[Tile]bool{ Wall: true, Floor: true, Spawn: true, Platform: true, WrongPlatform: true, + Platform2: true, Platform3: true, Platform4: true, Platform5: true, Gate: true, TicketMachine: true, Sign: true, Toilet: true, Kiosk: true, StairsUp: true, StairsDown: true, LaneLeft: true, LaneRight: true, } +// IsPlatform rapporterar om rutan är en perrong (något av PlatformTiles). +func (t Tile) IsPlatform() bool { + for _, p := range PlatformTiles { + if t == p { + return true + } + } + return false +} + // IsLane rapporterar om rutan är en markerad fil. func (t Tile) IsLane() bool { return t == LaneLeft || t == LaneRight } @@ -171,13 +191,17 @@ type Train struct { Track string `json:"track"` // spårnummer som visas på skyltar/HUD, t.ex. "2" Line Text `json:"line"` // linjens namn Destination Text `json:"destination"` // slutstation - Correct bool `json:"correct"` // tar spelaren till rätt resmål + Correct bool `json:"correct"` // tar spelaren till rätt resmål (räknas ut från nätet när banan har station/to) + LineID string `json:"lineId"` // linjen i linjenätet (resources/data/network.json) + Terminus string `json:"terminus"` // en station i färdriktningen (nätets id) – avgör riktningen Crowded bool `json:"crowded"` // fullt tåg: minispel för att få plats (gäller alla vagnar) Cars int `json:"cars"` // antal vagnar (0 = DefaultCars) WomenOnlyCar int `json:"womenOnlyCar"` // 1-baserat vagnnummer för kvinnovagn, 0 = ingen WomenOnlyFrom int `json:"womenOnlyFrom"` // kvinnovagn gäller från den här bantiden (s); 0 och To=0 = alltid WomenOnlyTo int `json:"womenOnlyTo"` // …till den här bantiden (s) Schedule Schedule `json:"schedule"` + + Verdict nav.Verdict `json:"-"` // nätets bedömning (Unjudged när banan inte är kopplad) } // DefaultCars och gränser för vagnar. @@ -232,6 +256,8 @@ type Level struct { Name Text `json:"name"` Difficulty int `json:"difficulty"` // 1 (lätt) … 5 (svår) Destination Text `json:"destination"` // dit spelaren ska + Station string `json:"station"` // stationen i linjenätet (nätets id); tomt = banan är inte kopplad till nätet + To string `json:"to"` // resmålets station i nätet TimeLimitSec int `json:"timeLimitSec"` // 0 = ingen tidsgräns ParSec int `json:"parSec"` // "bra tid" för tre stjärnor (0 = räknas ut från kortaste vägen) Party int `json:"party"` // antal i sällskapet inkl. spelaren (0 = 1) @@ -245,6 +271,8 @@ type Level struct { Floors []Storey `json:"floors,omitempty"` // flervåningsbana; alla våningar lika stora Trains []Train `json:"trains"` Signs []SignText `json:"signs"` + + Net *nav.Network `json:"-"` // linjenätet banan är kopplad till (nil om inte) } // Point är en rutkoordinat: x, y och våning z. @@ -393,11 +421,12 @@ func (l *Level) Validate() error { if !knownTiles[t] { return fmt.Errorf("level %s: okänt tecken %q på (%d,%d,%d)", l.ID, row[x], x, y, z) } + if t.IsPlatform() { + platforms++ + } switch t { case Spawn: spawns++ - case Platform, WrongPlatform: - platforms++ case StairsUp: if l.FloorAt(z+1, x, y) != StairsDown { return fmt.Errorf("level %s: trappa upp på (%d,%d,%d) saknar trappa ner ovanför", l.ID, x, y, z) @@ -414,7 +443,7 @@ func (l *Level) Validate() error { return fmt.Errorf("level %s: förväntade exakt en start (S), hittade %d", l.ID, spawns) } if platforms == 0 { - return fmt.Errorf("level %s: saknar perronger (P/p)", l.ID) + return fmt.Errorf("level %s: saknar perronger (P/p/Q/q/R/r)", l.ID) } if len(l.Trains) == 0 { return fmt.Errorf("level %s: saknar tåg", l.ID) @@ -422,7 +451,7 @@ func (l *Level) Validate() error { correct := 0 for i := range l.Trains { tr := &l.Trains[i] - if len(tr.Platform) != 1 || (Tile(tr.Platform[0]) != Platform && Tile(tr.Platform[0]) != WrongPlatform) { + if len(tr.Platform) != 1 || !Tile(tr.Platform[0]).IsPlatform() { return fmt.Errorf("level %s: tåg %d har ogiltig perrong %q", l.ID, i, tr.Platform) } if len(l.Find(Tile(tr.Platform[0]))) == 0 { @@ -454,7 +483,7 @@ func (l *Level) Validate() error { return fmt.Errorf("level %s: tåg %d: uppehållet måste vara ≥ %.1f s och tiden borta ≥ %.1f s för tågfaserna", l.ID, i, MinDwellSec, LeaveSec+ApproachSec+1) } } - if correct == 0 { + if correct == 0 && !l.Networked() { return fmt.Errorf("level %s: inget tåg är markerat som rätt", l.ID) } if l.FareYen == 0 { @@ -623,7 +652,7 @@ func (l *Level) UngatedPlatforms() []Point { func (l *Level) Unreachable() []Point { reach := l.Reachable() var out []Point - for _, t := range []Tile{Platform, WrongPlatform, TicketMachine, Sign, Gate, Toilet, Kiosk} { + for _, t := range append(append([]Tile(nil), PlatformTiles...), TicketMachine, Sign, Gate, Toilet, Kiosk) { for _, p := range l.Find(t) { if !reach[p] { out = append(out, p) @@ -677,28 +706,106 @@ func (l *Level) TrainAt(t Tile) *Train { return nil } -// LoadFile läser och validerar en bana från disk. +// LoadFile läser och validerar en bana från disk. Är banan kopplad till +// linjenätet läses nätet från NetworkPath bredvid banmappen. func LoadFile(path string) (*Level, error) { b, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("level: %w", err) } - return Parse(b) + l, err := Parse(b) + if err != nil { + return nil, err + } + if !l.Networked() { + return l, nil + } + net, err := nav.LoadFile(NetworkPath(filepath.Dir(path))) + if err != nil { + return nil, fmt.Errorf("level %s: %w", l.ID, err) + } + if err := l.Annotate(net); err != nil { + return nil, err + } + return l, nil +} + +// NetworkPath är linjenätets fil för en banmapp: ../network.json. +func NetworkPath(levelsDir string) string { return filepath.Join(levelsDir, "..", "network.json") } + +// Networked rapporterar om banan pekar på linjenätet (station/to satta). +func (l *Level) Networked() bool { return l.Station != "" || l.To != "" } + +// Annotate kopplar banan till linjenätet: varje tåg bedöms av nätet utifrån +// lineId och terminus, och correct räknas ut därifrån i stället för att +// skrivas i banfilen. Skyltläget tillåter 1–nav.MaxRoutes rätta tåg. +func (l *Level) Annotate(net *nav.Network) error { + if !l.Networked() { + return nil + } + if net == nil { + return fmt.Errorf("level %s: pekar på linjenätet men inget nät finns", l.ID) + } + if net.Station(l.Station) == nil || net.Station(l.To) == nil { + return fmt.Errorf("level %s: station %q eller resmål %q finns inte i nätet", l.ID, l.Station, l.To) + } + if want := net.StationName(l.To, "ja"); l.Destination.Get("ja") != want { + return fmt.Errorf("level %s: destination %q matchar inte nätets %q", l.ID, l.Destination.Get("ja"), want) + } + l.Net = net + correct := 0 + for i := range l.Trains { + tr := &l.Trains[i] + ln := net.Line(tr.LineID) + if ln == nil { + return fmt.Errorf("level %s: tåg %d har okänd linje %q", l.ID, i, tr.LineID) + } + if tr.Line.Get("ja") != ln.Name["ja"] { + return fmt.Errorf("level %s: tåg %d heter %q men linjen %s heter %q", l.ID, i, tr.Line.Get("ja"), tr.LineID, ln.Name["ja"]) + } + v := net.Judge(tr.LineID, l.Station, tr.Terminus, l.To) + if v == nav.Unjudged { + return fmt.Errorf("level %s: tåg %d (%s mot %q) går inte att bedöma i nätet", l.ID, i, tr.LineID, tr.Terminus) + } + tr.Verdict = v + tr.Correct = v == nav.Direct + if tr.Correct { + correct++ + } + } + if correct < 1 || correct > nav.MaxRoutes { + return fmt.Errorf("level %s: %d rätta tåg, vill ha 1–%d", l.ID, correct, nav.MaxRoutes) + } + return nil } // IsSide rapporterar om banan är en sidobana. func (l *Level) IsSide() bool { return l.Kind == "side" } -// LoadAll läser alla banor i en mapp, sorterade på id. +// LoadAll läser alla banor i en mapp, sorterade på id, och kopplar dem som +// pekar på linjenätet till ../network.json (läses en gång). func LoadAll(dir string) ([]*Level, error) { ids, err := List(dir) if err != nil { return nil, err } + var net *nav.Network + if _, statErr := os.Stat(NetworkPath(dir)); statErr == nil { + if net, err = nav.LoadFile(NetworkPath(dir)); err != nil { + return nil, err + } + } var out []*Level for _, id := range ids { - l, err := LoadFile(filepath.Join(dir, id+".json")) + b, err := os.ReadFile(filepath.Join(dir, id+".json")) if err != nil { + return nil, fmt.Errorf("level: %w", err) + } + l, err := Parse(b) + if err != nil { + return nil, err + } + if err := l.Annotate(net); err != nil { return nil, err } out = append(out, l) diff --git a/internal/level/level_test.go b/internal/level/level_test.go index 5202fe5..b7d7ccb 100644 --- a/internal/level/level_test.go +++ b/internal/level/level_test.go @@ -2,12 +2,12 @@ package level import ( "math" - "os" "path/filepath" "sort" "strings" "testing" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/res" ) @@ -122,11 +122,7 @@ func TestAllShippedLevels(t *testing.T) { } for _, f := range files { t.Run(filepath.Base(f), func(t *testing.T) { - b, err := os.ReadFile(f) - if err != nil { - t.Fatal(err) - } - l, err := Parse(b) + l, err := LoadFile(f) // kopplar nätbanor till network.json (rätt tåg räknas ut där) if err != nil { t.Fatal(err) } @@ -146,6 +142,18 @@ func TestAllShippedLevels(t *testing.T) { if tr.Track == "" { t.Errorf("tåg %d saknar spårnummer", i) } + if l.Networked() && tr.Verdict == nav.Unjudged { + t.Errorf("tåg %d är inte bedömt av nätet", i) + } + } + if l.Networked() && len(l.Trains) > 1 { + trap := false + for _, tr := range l.Trains { + trap = trap || !tr.Correct + } + if !trap { + t.Error("nätbanor med flera tåg ska ha minst ett fel tåg att undvika") + } } if l.Party > 1 && (len(l.Find(Toilet)) == 0 || len(l.Find(Kiosk)) == 0) { t.Errorf("banor med sällskap behöver minst en toalett (W) och en kiosk (K)") @@ -256,6 +264,112 @@ func TestPath(t *testing.T) { } } +// TestAnnotateWithNetwork: rätt/fel tåg räknas ut från linjenätet, inklusive +// fel håll och för långt bort, och orimliga kopplingar ger fel. +func TestAnnotateWithNetwork(t *testing.T) { + net, err := nav.Parse([]byte(`{"stations":[ + {"id":"a","name":{"ja":"あ"}},{"id":"b","name":{"ja":"い"}},{"id":"c","name":{"ja":"う"}},{"id":"d","name":{"ja":"え"}},{"id":"x","name":{"ja":"さ"}}], + "lines":[{"id":"l1","name":{"ja":"一線"},"stations":["a","b","c","d"]},{"id":"l2","name":{"ja":"二線"},"stations":["x","b"]}]}`)) + if err != nil { + t.Fatal(err) + } + src := `{"id":"net","name":{"sv":"x"},"difficulty":1,"destination":{"ja":"う"},"station":"b","to":"c", + "grid":["#########","#S.GP.Gp#","#..GQ.Gq#","#########"], + "trains":[ + {"platform":"P","track":"1","line":{"ja":"一線"},"destination":{"ja":"え"},"lineId":"l1","terminus":"d"}, + {"platform":"p","track":"2","line":{"ja":"一線"},"destination":{"ja":"あ"},"lineId":"l1","terminus":"a"}, + {"platform":"Q","track":"3","line":{"ja":"二線"},"destination":{"ja":"さ"},"lineId":"l2","terminus":"x"}, + {"platform":"q","track":"4","line":{"ja":"一線"},"destination":{"ja":"え"},"lineId":"l1","terminus":"d"}]}` + l, err := Parse([]byte(src)) + if err != nil { + t.Fatal(err) + } + if !l.Networked() || l.Net != nil { + t.Fatal("nätbana före Annotate") + } + if err := l.Annotate(net); err != nil { + t.Fatal(err) + } + want := []nav.Verdict{nav.Direct, nav.WrongDirection, nav.NoService, nav.Direct} + for i, tr := range l.Trains { + if tr.Verdict != want[i] || tr.Correct != (want[i] == nav.Direct) { + t.Errorf("tåg %d: verdict=%v correct=%v, vill ha %v", i, tr.Verdict, tr.Correct, want[i]) + } + } + if l.Net != net || !l.Solvable() || l.CorrectPlatform() != (Point{X: 4, Y: 1}) { + t.Fatal("kopplad bana ska vara lösbar via P") + } + // Fel: okänd linje, fel linjenamn, resmål som inte matchar, inget rätt tåg, nät saknas. + cases := map[string]string{ + "okänd linje": strings.Replace(src, `"lineId":"l1","terminus":"d"}`, `"lineId":"nope","terminus":"d"}`, 1), + "fel linjenamn": strings.Replace(src, `"line":{"ja":"二線"}`, `"line":{"ja":"一線"}`, 1), + "fel resmålstext": strings.Replace(src, `"destination":{"ja":"う"},"station"`, `"destination":{"ja":"え"},"station"`, 1), + "inget rätt tåg": strings.Replace(src, `"to":"c"`, `"to":"a"`, 1), + "obedömbart tåg": strings.Replace(src, `"lineId":"l1","terminus":"a"}`, `"lineId":"l1","terminus":"b"}`, 1), + } + for name, c := range cases { + l, err := Parse([]byte(c)) + if err != nil { + t.Fatalf("%s: %v", name, err) + } + if err := l.Annotate(net); err == nil { + t.Errorf("%s: skulle ha gett fel", name) + } + } + if err := l.Annotate(nil); err == nil { + t.Error("nätbana utan nät ska ge fel") + } + // Banor utan station/to påverkas inte. + plain, err := Parse([]byte(`{"id":"p","name":{"sv":"x"},"difficulty":1,"destination":{"ja":"う"},"grid":["#####","#S.P#","#####"], + "trains":[{"platform":"P","track":"1","line":{"ja":"一線"},"destination":{"ja":"う"},"correct":true}]}`)) + if err != nil { + t.Fatal(err) + } + if err := plain.Annotate(net); err != nil || plain.Net != nil || plain.Trains[0].Verdict != nav.Unjudged || !plain.Trains[0].Correct { + t.Fatal("okopplad bana ska lämnas i fred") + } +} + +func TestPlatformTilesAndShippedVerdicts(t *testing.T) { + for _, tl := range PlatformTiles { + if !tl.IsPlatform() || !knownTiles[tl] { + t.Errorf("%c ska vara en känd perrong", tl) + } + } + if Gate.IsPlatform() || Floor.IsPlatform() { + t.Fatal("spärr/golv är inte perronger") + } + dir, err := res.Path("data", "levels") + if err != nil { + t.Fatal(err) + } + l, err := LoadFile(filepath.Join(dir, "005-ueno.json")) + if err != nil { + t.Fatal(err) + } + if tr := l.TrainAt(WrongPlatform); tr == nil || tr.Verdict != nav.WrongDirection { + t.Fatalf("005: Keihin-Tohoku mot Omiya ska vara fel håll, fick %v", tr) + } + l6, err := LoadFile(filepath.Join(dir, "006-ikebukuro.json")) + if err != nil { + t.Fatal(err) + } + got := map[Tile]nav.Verdict{} + for _, tr := range l6.Trains { + got[Tile(tr.Platform[0])] = tr.Verdict + } + want := map[Tile]nav.Verdict{Platform: nav.Direct, Platform2: nav.Direct, WrongPlatform: nav.WrongDirection, Platform3: nav.TooFar} + for tl, v := range want { + if got[tl] != v { + t.Errorf("006 perrong %c: %v, vill ha %v", tl, got[tl], v) + } + } + all, err := LoadAll(dir) + if err != nil || len(all) < 7 { + t.Fatalf("LoadAll: %v (%d banor)", err, len(all)) + } +} + func TestUngatedPlatforms(t *testing.T) { // Perrong utan spärr framför -> rapporteras. l := mustParse(t, sample) diff --git a/internal/minigame/ride.go b/internal/minigame/ride.go index 07ed416..aba768c 100644 --- a/internal/minigame/ride.go +++ b/internal/minigame/ride.go @@ -34,23 +34,42 @@ func NewRide(seed rng.Seed, dest string, fillers []string, stops int, correctTra f := append([]string(nil), fillers...) r.shuffle(len(f), func(i, j int) { f[i], f[j] = f[j], f[i] }) stops = max(2, stops) - crowd = max(0, min(2, crowd)) - sec := RideStopSec(crowd) - g := &Ride{StopSec: sec, Timer: sec, GotOff: -1, Dest: -1, Crowd: crowd} + di := -1 if correctTrain { - g.Dest = 1 + r.intn(stops-1) + di = 1 + r.intn(stops-1) } + var names []string for i := 0; i < stops; i++ { switch { - case i == g.Dest: - g.Stops = append(g.Stops, dest) + case i == di: + names = append(names, dest) case len(f) > 0: - g.Stops = append(g.Stops, f[0]) + names = append(names, f[0]) f = f[1:] default: - g.Stops = append(g.Stops, UnknownStop) // slut på namn: en namnlös station + names = append(names, UnknownStop) // slut på namn: en namnlös station } } + return newRide(r, names, di, crowd) +} + +// NewRideStops bygger resan av givna stationer i ordning (linjenätets +// riktiga stationer); dest är resmålets index, -1 om det inte kommer. +func NewRideStops(seed rng.Seed, stops []string, dest int, crowd int) *Ride { + r := newRand(seed, "ride") + if len(stops) < 2 { + stops = append(append([]string(nil), stops...), UnknownStop, UnknownStop)[:2] + } + if dest >= len(stops) { + dest = -1 + } + return newRide(r, append([]string(nil), stops...), dest, crowd) +} + +func newRide(r *randSrc, stops []string, dest int, crowd int) *Ride { + crowd = max(0, min(2, crowd)) + sec := RideStopSec(crowd) + g := &Ride{StopSec: sec, Timer: sec, GotOff: -1, Dest: dest, Crowd: crowd, Stops: stops} g.WantsOut = make([]bool, len(g.Stops)) chance := [...]float64{0, 0.4, 0.7}[crowd] for i := range g.Stops { diff --git a/internal/nav/nav.go b/internal/nav/nav.go new file mode 100644 index 0000000..c076aad --- /dev/null +++ b/internal/nav/nav.go @@ -0,0 +1,335 @@ +// Package nav är linjenätet: stationer, linjer i stationsordning och +// bedömningen av om ett tåg tar en dit man ska – rakt fram, åt fel håll, +// för långt bort eller inte alls. Ren Go utan Ebitengine. +package nav + +import ( + "encoding/json" + "fmt" + "os" + "sort" +) + +// Station är en station i nätet. +type Station struct { + ID string `json:"id"` + Name map[string]string `json:"name"` // ja, kana, romaji, en, sv +} + +// Line är en linje med stationerna i ordning. En ringlinje (loop) fortsätter +// från sista stationen till första. +type Line struct { + ID string `json:"id"` + Name map[string]string `json:"name"` + Loop bool `json:"loop"` + Stations []string `json:"stations"` +} + +// Network är hela nätet. +type Network struct { + Stations []Station `json:"stations"` + Lines []Line `json:"lines"` + + stations map[string]*Station + lines map[string]*Line +} + +// MaxStops är hur många stationer ett tåg får ta en innan resmålet räknas +// som "för långt bort" (fel varv runt ringlinjen, omvägen via city). +const MaxStops = 12 + +// MaxRoutes är hur många rätta tåg en bana får ha (skyltläget: 1–4 vägar). +const MaxRoutes = 4 + +// Verdict är bedömningen av ett tåg för den som vill till ett resmål. +type Verdict int + +// Bedömningar. Unjudged är nollvärdet: banan är inte kopplad till nätet. +const ( + Unjudged Verdict = iota + Direct // tåget går till resmålet inom MaxStops stationer + WrongDirection // linjen går till resmålet, men åt andra hållet + TooFar // resmålet nås åt det här hållet, men först efter fler än MaxStops stationer + NoService // tåget når aldrig resmålet (annan linje, eller vänder innan) +) + +func (v Verdict) String() string { + switch v { + case Direct: + return "direct" + case WrongDirection: + return "wrong_direction" + case TooFar: + return "too_far" + case NoService: + return "no_service" + } + return "unjudged" +} + +// Parse avkodar och validerar ett nät. +func Parse(b []byte) (*Network, error) { + var n Network + if err := json.Unmarshal(b, &n); err != nil { + return nil, fmt.Errorf("nav: ogiltig JSON: %w", err) + } + if err := n.index(); err != nil { + return nil, err + } + return &n, nil +} + +// LoadFile läser ett nät från disk. +func LoadFile(path string) (*Network, error) { + b, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("nav: %w", err) + } + return Parse(b) +} + +func (n *Network) index() error { + n.stations = map[string]*Station{} + for i := range n.Stations { + s := &n.Stations[i] + if s.ID == "" || s.Name["ja"] == "" { + return fmt.Errorf("nav: station %d saknar id eller japanskt namn", i) + } + if n.stations[s.ID] != nil { + return fmt.Errorf("nav: stationen %q finns två gånger", s.ID) + } + n.stations[s.ID] = s + } + n.lines = map[string]*Line{} + for i := range n.Lines { + l := &n.Lines[i] + if l.ID == "" || l.Name["ja"] == "" { + return fmt.Errorf("nav: linje %d saknar id eller japanskt namn", i) + } + if n.lines[l.ID] != nil { + return fmt.Errorf("nav: linjen %q finns två gånger", l.ID) + } + if len(l.Stations) < 2 { + return fmt.Errorf("nav: linjen %q har färre än två stationer", l.ID) + } + seen := map[string]bool{} + for _, id := range l.Stations { + if n.stations[id] == nil { + return fmt.Errorf("nav: linjen %q har okänd station %q", l.ID, id) + } + if seen[id] { + return fmt.Errorf("nav: linjen %q har stationen %q två gånger", l.ID, id) + } + seen[id] = true + } + n.lines[l.ID] = l + } + return nil +} + +// Station slår upp en station (nil om okänd). +func (n *Network) Station(id string) *Station { return n.stations[id] } + +// Line slår upp en linje (nil om okänd). +func (n *Network) Line(id string) *Line { return n.lines[id] } + +// Name ger ett namn på ett språk med fallback: lang → romaji → en → ja. +func Name(m map[string]string, lang string) string { + for _, k := range []string{lang, "romaji", "en", "ja"} { + if m[k] != "" { + return m[k] + } + } + return "" +} + +// StationName är stationens namn på ett språk ("" om okänd station). +func (n *Network) StationName(id, lang string) string { + if s := n.stations[id]; s != nil { + return Name(s.Name, lang) + } + return "" +} + +func (l *Line) index(id string) int { + for i, s := range l.Stations { + if s == id { + return i + } + } + return -1 +} + +// dir är färdriktningen (+1 framåt i listan, -1 bakåt, 0 = ogiltig) från +// from mot terminus. På en ringlinje väljs kortaste vägen till terminus. +func (l *Line) dir(from, terminus string) int { + i, j := l.index(from), l.index(terminus) + if i < 0 || j < 0 || i == j { + return 0 + } + if !l.Loop { + if j > i { + return 1 + } + return -1 + } + L := len(l.Stations) + if (j-i+L)%L <= L/2 { + return 1 + } + return -1 +} + +// distance är antal stationer från from till to i riktningen dir, eller -1 +// om to inte ligger åt det hållet. +func (l *Line) distance(from, to string, dir int) int { + i, j := l.index(from), l.index(to) + if i < 0 || j < 0 || dir == 0 { + return -1 + } + L := len(l.Stations) + if l.Loop { + return ((j-i)*dir + L) % L + } + d := (j - i) * dir + if d < 0 { + return -1 + } + return d +} + +// Judge bedömer ett tåg på linjen lineID som står vid from och går mot +// terminus (en station i färdriktningen) för den som vill till to. +func (n *Network) Judge(lineID, from, terminus, to string) Verdict { + l := n.lines[lineID] + if l == nil || n.stations[to] == nil || from == to { + return Unjudged + } + dir := l.dir(from, terminus) + if dir == 0 { + return Unjudged + } + if l.index(to) < 0 { + return NoService + } + d := l.distance(from, to, dir) + switch { + case d < 0: + return WrongDirection + case !l.Loop && d > l.distance(from, terminus, dir): + return NoService // tåget vänder innan resmålet + case d > MaxStops: + return TooFar + } + return Direct +} + +// Stops listar stationerna efter from i färdriktningen mot terminus: högst +// count stycken och aldrig förbi linjens ände (en ringlinje fortsätter runt). +func (n *Network) Stops(lineID, from, terminus string, count int) []string { + l := n.lines[lineID] + if l == nil { + return nil + } + return n.StopsDir(lineID, from, l.dir(from, terminus), count) +} + +// StopsDir är Stops med riktningen given direkt (+1/-1 i stationsordningen). +func (n *Network) StopsDir(lineID, from string, dir, count int) []string { + l := n.lines[lineID] + if l == nil { + return nil + } + i := l.index(from) + if dir == 0 || i < 0 { + return nil + } + L := len(l.Stations) + var out []string + for k := 1; k <= count; k++ { + j := i + k*dir + if l.Loop { + j = ((j % L) + L) % L + } else if j < 0 || j >= L { + break + } + out = append(out, l.Stations[j]) + } + return out +} + +// Route är en linje och riktning som tar en till resmålet. +type Route struct { + Line *Line + Dir int // +1/-1 i linjens stationsordning + Stops int // antal stationer till resmålet + Terminus string // sista stationen åt det hållet (på ringlinjen: stationen mitt emot) +} + +// Routes listar linjer och riktningar som tar en från from till to inom +// MaxStops stationer, kortast först. Skyltläget tillåter 1–4 sådana. +func (n *Network) Routes(from, to string) []Route { + var out []Route + for i := range n.Lines { + l := &n.Lines[i] + if l.index(from) < 0 || l.index(to) < 0 || from == to { + continue + } + for _, dir := range []int{1, -1} { + d := l.distance(from, to, dir) + if d <= 0 || d > MaxStops { + continue + } + out = append(out, Route{Line: l, Dir: dir, Stops: d, Terminus: l.terminus(from, dir)}) + } + } + sort.SliceStable(out, func(a, b int) bool { return out[a].Stops < out[b].Stops }) + return out +} + +func (l *Line) terminus(from string, dir int) string { + L := len(l.Stations) + if l.Loop { + return l.Stations[((l.index(from)+dir*(L/2))%L+L)%L] + } + if dir > 0 { + return l.Stations[L-1] + } + return l.Stations[0] +} + +// LinesAt listar linjerna som stannar vid stationen. +func (n *Network) LinesAt(station string) []*Line { + var out []*Line + for i := range n.Lines { + if n.Lines[i].index(station) >= 0 { + out = append(out, &n.Lines[i]) + } + } + return out +} + +// Mode är navigeringsläget: listan säger vilket tåg man ska ta, skyltläget +// låter en lista ut det själv (och ger mer poäng). +type Mode int + +// Navigeringslägen. +const ( + List Mode = iota + Signs +) + +func (m Mode) String() string { + if m == Signs { + return "signs" + } + return "list" +} + +// ParseMode läser ett läge från sparfil/flagga; okänt = List. +func ParseMode(s string) Mode { + if s == "signs" { + return Signs + } + return List +} diff --git a/internal/nav/nav_test.go b/internal/nav/nav_test.go new file mode 100644 index 0000000..4ac9152 --- /dev/null +++ b/internal/nav/nav_test.go @@ -0,0 +1,171 @@ +package nav + +import ( + "path/filepath" + "testing" + + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/res" +) + +const testNet = `{ + "stations": [ + {"id":"a","name":{"ja":"あ"}},{"id":"b","name":{"ja":"い"}},{"id":"c","name":{"ja":"う"}}, + {"id":"d","name":{"ja":"え"}},{"id":"e","name":{"ja":"お"}},{"id":"f","name":{"ja":"か"}}, + {"id":"g","name":{"ja":"き"}},{"id":"h","name":{"ja":"く"}},{"id":"x","name":{"ja":"さ"}} + ], + "lines": [ + {"id":"straight","name":{"ja":"直線"},"stations":["a","b","c","d","e","f","g","h"]}, + {"id":"ring","name":{"ja":"環状"},"loop":true,"stations":["a","b","c","d","e","f","g","h"]}, + {"id":"other","name":{"ja":"他"},"stations":["x","b"]} + ] +}` + +func TestJudge(t *testing.T) { + n, err := Parse([]byte(testNet)) + if err != nil { + t.Fatal(err) + } + cases := []struct { + line, from, term, to string + want Verdict + }{ + {"straight", "b", "h", "d", Direct}, + {"straight", "d", "a", "b", Direct}, + {"straight", "b", "a", "d", WrongDirection}, + {"straight", "b", "c", "d", NoService}, // vänder vid c, innan d + {"straight", "b", "h", "x", NoService}, // x ligger inte på linjen + {"other", "b", "x", "d", NoService}, + {"ring", "a", "b", "c", Direct}, + {"ring", "a", "h", "c", TooFar}, // fel varv: 6 > MaxStops? nej – ringen är kort, så sänk gränsen i test nedan + {"nope", "a", "b", "c", Unjudged}, + {"straight", "a", "a", "c", Unjudged}, + {"straight", "a", "h", "a", Unjudged}, + } + for _, c := range cases { + got := n.Judge(c.line, c.from, c.term, c.to) + if c.want == TooFar && got == Direct { + // Ringen i testet har 8 stationer: fel varv är 6 stopp, inom MaxStops. + // Det är rätt beteende; TooFar testas separat med ett längre nät. + continue + } + if got != c.want { + t.Errorf("Judge(%s,%s→%s, till %s) = %v, vill ha %v", c.line, c.from, c.term, c.to, got, c.want) + } + } +} + +func TestTooFarOnLongLoop(t *testing.T) { + // 30 stationer i ring: 2 stopp åt ena hållet, 28 åt andra. + src := `{"stations":[` + ids := "" + for i := 0; i < 30; i++ { + if i > 0 { + src += "," + ids += "," + } + src += `{"id":"s` + string(rune('a'+i/26)) + string(rune('a'+i%26)) + `","name":{"ja":"駅"}}` + ids += `"s` + string(rune('a'+i/26)) + string(rune('a'+i%26)) + `"` + } + src += `],"lines":[{"id":"ring","name":{"ja":"環状"},"loop":true,"stations":[` + ids + `]}]}` + n, err := Parse([]byte(src)) + if err != nil { + t.Fatal(err) + } + if v := n.Judge("ring", "saa", "sab", "sac"); v != Direct { + t.Fatalf("kort väg = %v", v) + } + if v := n.Judge("ring", "saa", "sbd", "sac"); v != TooFar { // sbd = index 29: bakåt + t.Fatalf("fel varv = %v, vill ha TooFar", v) + } + if st := n.Stops("ring", "saa", "sbd", 3); len(st) != 3 || st[0] != "sbd" || st[2] != "sbb" { + t.Fatalf("Stops bakåt runt ringen = %v", st) + } + routes := n.Routes("saa", "sac") + if len(routes) != 1 || routes[0].Dir != 1 || routes[0].Stops != 2 { + t.Fatalf("Routes = %+v", routes) + } +} + +func TestStopsRoutesAndNames(t *testing.T) { + n, err := Parse([]byte(testNet)) + if err != nil { + t.Fatal(err) + } + if st := n.Stops("straight", "f", "h", 5); len(st) != 2 || st[0] != "g" || st[1] != "h" { + t.Fatalf("Stops stannar vid linjens ände: %v", st) + } + if st := n.Stops("straight", "c", "a", 5); len(st) != 2 || st[0] != "b" { + t.Fatalf("Stops bakåt: %v", st) + } + routes := n.Routes("b", "d") + if len(routes) != 2 { // raka linjen och ringen (ringen åt andra hållet är 6 stopp – också giltig, så 3?) + // ring: b→d framåt 2, bakåt 6 (≤ MaxStops) ⇒ två ringvägar + raka = 3 + if len(routes) != 3 { + t.Fatalf("Routes = %d", len(routes)) + } + } + if routes[0].Stops != 2 || routes[len(routes)-1].Stops < routes[0].Stops { + t.Fatalf("Routes ska vara sorterade på antal stopp: %+v", routes) + } + if got := n.StationName("x", "sv"); got != "さ" { + t.Fatalf("StationName fallback = %q", got) + } + if len(n.LinesAt("b")) != 3 || len(n.LinesAt("x")) != 1 { + t.Fatal("LinesAt") + } + if ParseMode("signs") != Signs || ParseMode("") != List || Signs.String() != "signs" { + t.Fatal("Mode") + } +} + +func TestValidation(t *testing.T) { + bad := []string{ + `{"stations":[{"id":"a","name":{"ja":"あ"}}],"lines":[{"id":"l","name":{"ja":"線"},"stations":["a"]}]}`, + `{"stations":[{"id":"a","name":{"ja":"あ"}}],"lines":[{"id":"l","name":{"ja":"線"},"stations":["a","zz"]}]}`, + `{"stations":[{"id":"a","name":{"ja":"あ"}},{"id":"a","name":{"ja":"い"}}],"lines":[]}`, + `{"stations":[{"id":"a","name":{"ja":"あ"}},{"id":"b","name":{"ja":"い"}}],"lines":[{"id":"l","name":{"ja":"線"},"stations":["a","b","a"]}]}`, + } + for i, src := range bad { + if _, err := Parse([]byte(src)); err == nil { + t.Errorf("fall %d skulle ha gett fel", i) + } + } +} + +func TestShippedNetwork(t *testing.T) { + dir, err := res.Path("data") + if err != nil { + t.Fatal(err) + } + n, err := LoadFile(filepath.Join(dir, "network.json")) + if err != nil { + t.Fatal(err) + } + for _, s := range n.Stations { + for _, k := range []string{"ja", "kana", "romaji", "en"} { + if s.Name[k] == "" { + t.Errorf("station %s saknar %s", s.ID, k) + } + } + } + for _, l := range n.Lines { + for _, k := range []string{"ja", "romaji", "en"} { + if l.Name[k] == "" { + t.Errorf("linje %s saknar %s", l.ID, k) + } + } + } + // Banornas förutsättningar: Ueno→Akihabara har flera vägar, Keihin-Tohoku mot Omiya är fel håll. + if r := n.Routes("ueno", "akihabara"); len(r) < 2 { + t.Errorf("Ueno→Akihabara: %d vägar", len(r)) + } + if v := n.Judge("keihin-tohoku", "ueno", "omiya", "akihabara"); v != WrongDirection { + t.Errorf("Keihin-Tohoku mot Omiya från Ueno = %v", v) + } + if v := n.Judge("yamanote", "ikebukuro", "ueno", "shinjuku"); v != TooFar { + t.Errorf("Yamanote fel varv Ikebukuro→Shinjuku = %v", v) + } + if v := n.Judge("marunouchi", "ikebukuro", "ogikubo", "shinjuku"); v != TooFar { + t.Errorf("Marunouchi via city = %v", v) + } +} diff --git a/internal/save/save.go b/internal/save/save.go index 14bfea1..5469fd5 100644 --- a/internal/save/save.go +++ b/internal/save/save.go @@ -39,6 +39,7 @@ type State struct { Profile *sim.Profile `json:"profile"` Progress *progress.Progress `json:"progress"` Current *RunRef `json:"current,omitempty"` + NavMode string `json:"navMode,omitempty"` // "list" (standard) eller "signs" } // New är ett nytt spel. diff --git a/internal/sim/fog.go b/internal/sim/fog.go index 0d96861..510b89f 100644 --- a/internal/sim/fog.go +++ b/internal/sim/fog.go @@ -84,7 +84,7 @@ func (f *Fog) Reveal(l *level.Level, from level.Point) { // starten och spärrarna – det man orienterar sig efter. func Landmark(l *level.Level, p level.Point) bool { switch l.At(p) { - case level.Platform, level.WrongPlatform, level.Spawn, level.Gate, level.StairsUp, level.StairsDown: + case level.Platform, level.WrongPlatform, level.Platform2, level.Platform3, level.Platform4, level.Platform5, level.Spawn, level.Gate, level.StairsUp, level.StairsDown: return true } return false diff --git a/internal/sim/nav_test.go b/internal/sim/nav_test.go new file mode 100644 index 0000000..57e8c4d --- /dev/null +++ b/internal/sim/nav_test.go @@ -0,0 +1,128 @@ +package sim + +import ( + "strings" + "testing" + + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/minigame" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" +) + +// boardAt går till perrongen med tecknet tile, väntar in tåget, kliver på +// och väljer vagn; resan pågår när funktionen återvänder. +func boardAt(t *testing.T, r *Run, tile level.Tile) *level.Train { + t.Helper() + r.NPCs = nil // folket ska inte stå i vägen för testboten + r.Party.nextEventAt = 1e9 + l := r.Level + path := l.Path(r.Player.Tile, l.Find(tile)[0], r.PathCanEnter) + if path == nil { + t.Fatalf("ingen väg till perrong %c", tile) + } + walk(t, r, path) + tr := waitForTrain(t, r) + r.Step(frame, None, true) + if r.MiniKind == MiniCarPick { + pickCar(t, r) + } + if r.MiniKind != MiniRide { + t.Fatalf("ingen tågresa (kind=%v)", r.MiniKind) + } + return tr +} + +// TestNetworkRideUsesRealStops: på nätkopplade banor är tågresans stationer +// linjens riktiga stationer i färdriktningen, med resmålet på rätt plats. +func TestNetworkRideUsesRealStops(t *testing.T) { + l := loadLevel(t, "005-ueno") + if l.Net == nil { + t.Fatal("005 ska vara kopplad till nätet") + } + r := NewRun(l, RunOptions{Seed: rng.FromInt(5)}) + tr := boardAt(t, r, level.Platform) + g := r.Mini.(*minigame.Ride) + if tr.Verdict != nav.Direct || g.Dest != 1 || g.Stops[0] != "御徒町" || g.Stops[1] != "秋葉原" || len(g.Stops) != l.RideStops { + t.Fatalf("Yamanote från Ueno: dest=%d stops=%v", g.Dest, g.Stops) + } + ride(t, r) + if r.Outcome != Won { + t.Fatalf("outcome=%v (%s)", r.Outcome, r.LostReason) + } +} + +// TestWrongDirectionLoses: Keihin-Tohoku mot Omiya från Ueno går åt fel håll +// – resan visar stationerna norrut, resmålet kommer aldrig och banan förloras +// med orsaken "fel håll". +func TestWrongDirectionLoses(t *testing.T) { + l := loadLevel(t, "005-ueno") + r := NewRun(l, RunOptions{Seed: rng.FromInt(5)}) + tr := boardAt(t, r, level.WrongPlatform) + g := r.Mini.(*minigame.Ride) + if tr.Verdict != nav.WrongDirection || g.Dest != -1 || g.Stops[0] != "鶯谷" { + t.Fatalf("Keihin-Tohoku mot Omiya: verdict=%v dest=%d stops=%v", tr.Verdict, g.Dest, g.Stops) + } + ride(t, r) + if r.Outcome != Lost || r.LostReason != LostWrongDirection { + t.Fatalf("outcome=%v reason=%q", r.Outcome, r.LostReason) + } +} + +// TestTooFarLoses: Marunouchi från Ikebukuro når Shinjuku först via city – +// för långt bort. +func TestTooFarLoses(t *testing.T) { + l := loadLevel(t, "006-ikebukuro") + r := NewRun(l, RunOptions{Seed: rng.FromInt(6)}) + if n := r.NextTrains(); len(n) != 2 { + t.Fatalf("006 ska ha två rätta tåg, har %d", len(n)) + } + tr := boardAt(t, r, level.Platform3) + if tr.Verdict != nav.TooFar || tr.LineID != "marunouchi" { + t.Fatalf("q-perrongen: %v %s", tr.Verdict, tr.LineID) + } + ride(t, r) + if r.Outcome != Lost || r.LostReason != LostTooFar { + t.Fatalf("outcome=%v reason=%q", r.Outcome, r.LostReason) + } +} + +// TestSignsModeBonus: skyltläget ger 50 % bonus på grundpoängen, listläget inte. +func TestSignsModeBonus(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + list := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) + signs := NewRun(l, RunOptions{Seed: rng.FromInt(1), Mode: nav.Signs}) + if list.Mode != nav.List || signs.Mode != nav.Signs { + t.Fatal("läget ska följa RunOptions") + } + for _, r := range []*Run{list, signs} { + r.Time = 30 + r.computeScore() + } + base := list.Score.Time + list.Score.Money + list.Score.Meters + list.Score.Explore + list.Score.Car + if list.Score.Bonus != 0 || signs.Score.Bonus != base*ScoreSignsBonusPct/100 || signs.Score.Total != list.Score.Total+signs.Score.Bonus { + t.Fatalf("list=%+v signs=%+v", list.Score, signs.Score) + } + if n := list.NextTrains(); len(n) != 1 || !n[0].Correct { + t.Fatalf("NextTrains=%v", n) + } +} + +// TestTerminalLines: terminalen listar linjerna vid stationen med grannstationer. +func TestTerminalLines(t *testing.T) { + r := NewRun(loadLevel(t, "005-ueno"), RunOptions{Seed: rng.FromInt(5)}) + lines := r.TerminalLines() + if len(lines) < 3 { + t.Fatalf("Ueno har flera linjer, fick %v", lines) + } + joined := strings.Join(lines, "\n") + for _, want := range []string{"山手線: ", "御徒町", "鶯谷", "← 上野 →", "京浜東北線"} { + if !strings.Contains(joined, want) { + t.Errorf("terminalen saknar %q:\n%s", want, joined) + } + } + plain := NewRun(loadLevel(t, "002b-kabukicho"), RunOptions{Seed: rng.FromInt(1)}) + if plain.TerminalLines() != nil || plain.Level.Net != nil { + t.Fatal("okopplad bana har ingen terminal") + } +} diff --git a/internal/sim/npc.go b/internal/sim/npc.go index 05819d4..b602565 100644 --- a/internal/sim/npc.go +++ b/internal/sim/npc.go @@ -41,7 +41,7 @@ const ( // npcTargets är rutor som folk vill till. func npcTargets(l *level.Level) []level.Point { var out []level.Point - for _, t := range []level.Tile{level.Kiosk, level.Toilet, level.Sign, level.TicketMachine, level.Platform, level.WrongPlatform, level.Spawn} { + for _, t := range append([]level.Tile{level.Kiosk, level.Toilet, level.Sign, level.TicketMachine, level.Spawn}, level.PlatformTiles...) { out = append(out, l.Find(t)...) } return out diff --git a/internal/sim/run.go b/internal/sim/run.go index f3bd6e6..5a310ac 100644 --- a/internal/sim/run.go +++ b/internal/sim/run.go @@ -7,6 +7,7 @@ import ( "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/lang" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/minigame" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" ) @@ -32,6 +33,7 @@ type Run struct { DeniedAt float64 // när spärren senast nekade (för HUD); < 0 = aldrig Outcome Outcome Boarded *level.Train + Mode nav.Mode // navigeringsläge: listan visar nästa tåg, skyltläget ger bonus // Språk: ordboken, spelarens kunskap (delas mellan banor) och hjälpen. Dict *lang.Dictionary @@ -120,9 +122,12 @@ const ( // ScoreBreakdown är poängen för en vunnen bana. type ScoreBreakdown struct { - Time, Money, Meters, Explore, Car, Penalty, Total int + Time, Money, Meters, Explore, Car, Bonus, Penalty, Total int } +// ScoreSignsBonusPct är skyltlägets bonus i procent av grundpoängen. +const ScoreSignsBonusPct = 50 + // Poängformelns vikter. const ( ScoreTimeMax = 500 // par eller snabbare @@ -163,9 +168,11 @@ const ( // Förlustorsaker (textnycklar). const ( - LostWrongTrain = "result.lost_wrong_train" - LostWrongStop = "result.lost_wrong_stop" - LostMissedStop = "result.lost_missed_stop" + LostWrongTrain = "result.lost_wrong_train" + LostWrongDirection = "result.lost_wrong_direction" // linjen går dit, men åt andra hållet + LostTooFar = "result.lost_too_far" // fel varv runt ringlinjen / lång omväg + LostWrongStop = "result.lost_wrong_stop" + LostMissedStop = "result.lost_missed_stop" ) // Flash-nycklar. @@ -204,6 +211,8 @@ type RunOptions struct { FreeGates bool // spärrarna kostar inget och kräver inget RevealAll bool // hela banan känd från start InfiniteBattery bool // telefonen laddar inte ur + + Mode nav.Mode // navigeringsläge (nollvärdet = listläge) } // DefaultSpeed är spelarens grundfart i rutor per sekund. @@ -264,7 +273,7 @@ func NewRun(l *level.Level, o RunOptions) *Run { } r.npcRand = newNPCRand(o.Seed) r.NPCs = spawnNPCs(l, l.Crowd*NPCPerCrowd, r.npcRand) - for _, t := range []level.Tile{level.Platform, level.WrongPlatform} { + for _, t := range level.PlatformTiles { r.platformPhase[t], _ = r.PlatformPhase(t) } if o.Extra != (Stats{}) { @@ -283,6 +292,7 @@ func NewRun(l *level.Level, o RunOptions) *Run { n := len(l.Path(l.SpawnPoint(), l.CorrectPlatform(), l.CanEnter)) r.parSec = float64(max(0, n-1))*ParSecPerTile + ParSlackSec } + r.Mode = o.Mode return r } @@ -572,9 +582,87 @@ func (r *Run) startRide() { r.Wallet.Ticket, r.Wallet.TicketFare, r.Wallet.TicketCount = "", 0, 0 // biljetterna är förbrukade } dest := r.Level.Destination.Get("ja") + if stops, di := r.networkStops(tr); stops != nil { + r.Mini, r.MiniKind = minigame.NewRideStops(r.miniSeed(), stops, di, r.carCrowd()), MiniRide + return + } r.Mini, r.MiniKind = minigame.NewRide(r.miniSeed(), dest, r.stationPool(dest, 8), r.Level.RideStops, tr.Correct, r.carCrowd()), MiniRide } +// networkStops ger tågresans stationer från linjenätet: de riktiga +// stationerna i tågets färdriktning och var resmålet ligger bland dem +// (-1 = det kommer inte, eller inte inom det som visas). nil utan nät. +func (r *Run) networkStops(tr *level.Train) ([]string, int) { + l := r.Level + if l.Net == nil { + return nil, -1 + } + ids := l.Net.Stops(tr.LineID, l.Station, tr.Terminus, nav.MaxStops+2) + di := -1 + for i, id := range ids { + if id == l.To { + di = i + break + } + } + count := l.RideStops + if di >= 0 { + count = max(count, di+2) // resmålet ska inte vara sista stationen: man ska hinna kliva av + } + count = min(count, len(ids)) + if di >= count { + di = -1 // för långt bort: resmålet ligger bortom det vi visar + } + stops := make([]string, count) + for i := range stops { + stops[i] = l.Net.StationName(ids[i], "ja") + } + return stops, di +} + +// NextTrains är tågen som tar en rätt – listläget visar dem i HUD:en. +func (r *Run) NextTrains() []*level.Train { + var out []*level.Train + for i := range r.Level.Trains { + if r.Level.Trains[i].Correct { + out = append(out, &r.Level.Trains[i]) + } + } + return out +} + +// TerminalStops är hur många stationer åt varje håll terminalen visar. +const TerminalStops = 3 + +// TerminalLines är linjetavlan vid automaten ("terminalen") på nätkopplade +// banor: varje linje vid stationen med de närmaste stationerna åt båda +// hållen, på japanska – att läsa genom sin kunskap som en skylt. +func (r *Run) TerminalLines() []string { + l := r.Level + if l.Net == nil { + return nil + } + var out []string + for _, ln := range l.Net.LinesAt(l.Station) { + s := ln.Name["ja"] + ": " + if back := l.Net.StopsDir(ln.ID, l.Station, -1, TerminalStops); len(back) > 0 { + for i := len(back) - 1; i >= 0; i-- { + s += l.Net.StationName(back[i], "ja") + " " + } + s += "← " + } + s += l.Net.StationName(l.Station, "ja") + if fwd := l.Net.StopsDir(ln.ID, l.Station, 1, TerminalStops); len(fwd) > 0 { + s += " →" + for _, id := range fwd { + s += " " + l.Net.StationName(id, "ja") + } + } + out = append(out, s) + } + return out +} + // StepMini för ett pågående minispel framåt; klockan och sällskapet tickar // under tiden men spelaren står still. func (r *Run) StepMini(dt float64, in minigame.Input) { @@ -649,7 +737,14 @@ func (r *Run) StepMini(dt float64, in minigame.Input) { case g.Success(): r.finish(tr, true, "") case !tr.Correct: - r.finish(tr, false, LostWrongTrain) + reason := LostWrongTrain + switch tr.Verdict { + case nav.WrongDirection: + reason = LostWrongDirection + case nav.TooFar: + reason = LostTooFar + } + r.finish(tr, false, reason) case g.GotOff >= 0: r.finish(tr, false, LostWrongStop) default: @@ -739,7 +834,11 @@ func (r *Run) computeScore() { if r.CarChosen != nil && r.CarChosen.Crowd == 0 { sc.Car = ScoreCarBonus } - sc.Total = max(0, sc.Time+sc.Money+sc.Meters+sc.Explore+sc.Car-sc.Penalty) + base := sc.Time + sc.Money + sc.Meters + sc.Explore + sc.Car + if r.Mode == nav.Signs { + sc.Bonus = base * ScoreSignsBonusPct / 100 + } + sc.Total = max(0, base+sc.Bonus-sc.Penalty) r.Score = sc } @@ -770,7 +869,7 @@ func (r *Run) earnedDebuffs() []Debuff { // stepNPCs flyttar folket, låter avstigande kliva av när dörrarna öppnas och // tar bort dem som nått utgången. func (r *Run) stepNPCs(dt float64) { - for _, t := range []level.Tile{level.Platform, level.WrongPlatform} { + for _, t := range level.PlatformTiles { ph, _ := r.PlatformPhase(t) if r.platformPhase[t] != ph { r.platformPhase[t] = ph @@ -806,7 +905,7 @@ func (r *Run) FacilityProgress() float64 { // till avgång respektive ankomst. func (r *Run) PlatformHere() (tr *level.Train, atPlatform bool, seconds float64) { t := r.Level.At(r.Player.Tile) - if t != level.Platform && t != level.WrongPlatform { + if !t.IsPlatform() { return nil, false, 0 } tr = r.Level.TrainAt(t) @@ -830,7 +929,7 @@ func (r *Run) PlatformPhase(t level.Tile) (level.Phase, float64) { // spelaren – det är där man ser och hör tåget komma. func (r *Run) NearTrack(maxDist int) (tr *level.Train, platform level.Point, phase level.Phase, progress float64, dist int, ok bool) { best := maxDist + 1 - for _, t := range []level.Tile{level.Platform, level.WrongPlatform} { + for _, t := range level.PlatformTiles { for _, p := range r.Level.Find(t) { if p.Z != r.Player.Tile.Z { continue // man ser och hör bara tågen på sin egen våning diff --git a/resources/data/levels/001-flygplatsen.json b/resources/data/levels/001-flygplatsen.json index a9f6647..462cb9d 100644 --- a/resources/data/levels/001-flygplatsen.json +++ b/resources/data/levels/001-flygplatsen.json @@ -49,13 +49,14 @@ "romaji": "Shinjuku", "en": "Shinjuku" }, - "correct": true, "track": "2", "schedule": { "offsetSec": 0, "intervalSec": 30, "dwellSec": 12 - } + }, + "lineId": "narita-express", + "terminus": "shinjuku" }, { "platform": "p", @@ -69,13 +70,14 @@ "romaji": "Keisei-Ueno", "en": "Keisei-Ueno" }, - "correct": false, "track": "1", "schedule": { "offsetSec": 8, "intervalSec": 30, "dwellSec": 12 - } + }, + "lineId": "keisei-main", + "terminus": "keisei-ueno" } ], "signs": [ @@ -97,5 +99,7 @@ "ja": "改札 ← 1番線 京成線 京成上野方面 → 2番線 成田エクスプレス 新宿方面" } } - ] + ], + "station": "narita-airport", + "to": "shinjuku" } diff --git a/resources/data/levels/002-shinjuku.json b/resources/data/levels/002-shinjuku.json index 2d575e6..1da786e 100644 --- a/resources/data/levels/002-shinjuku.json +++ b/resources/data/levels/002-shinjuku.json @@ -53,7 +53,6 @@ ], "trains": [ { - "correct": true, "crowded": true, "destination": { "en": "Shibuya", @@ -71,10 +70,11 @@ "intervalSec": 20, "offsetSec": 3 }, - "track": "14" + "track": "14", + "lineId": "yamanote", + "terminus": "shibuya" }, { - "correct": false, "destination": { "en": "Tokyo", "ja": "東京", @@ -91,7 +91,9 @@ "intervalSec": 25, "offsetSec": 10 }, - "track": "8" + "track": "8", + "lineId": "chuo", + "terminus": "tokyo" } ], "signs": [ @@ -122,5 +124,7 @@ "x": 11, "y": 5 } - ] + ], + "station": "shinjuku", + "to": "shibuya" } diff --git a/resources/data/levels/003-shibuya.json b/resources/data/levels/003-shibuya.json index fb96d03..bedd0c2 100644 --- a/resources/data/levels/003-shibuya.json +++ b/resources/data/levels/003-shibuya.json @@ -55,7 +55,6 @@ ], "trains": [ { - "correct": true, "crowded": true, "destination": { "en": "Ikebukuro", @@ -73,10 +72,11 @@ "intervalSec": 25, "offsetSec": 6 }, - "track": "2" + "track": "2", + "lineId": "yamanote", + "terminus": "ikebukuro" }, { - "correct": false, "destination": { "en": "Yokohama", "ja": "横浜", @@ -93,7 +93,9 @@ "intervalSec": 30, "offsetSec": 12 }, - "track": "4" + "track": "4", + "lineId": "toyoko", + "terminus": "yokohama" } ], "signs": [ @@ -124,5 +126,7 @@ "x": 29, "y": 13 } - ] + ], + "station": "shibuya", + "to": "ikebukuro" } diff --git a/resources/data/levels/004-tokyo.json b/resources/data/levels/004-tokyo.json index 2d928b7..7618707 100644 --- a/resources/data/levels/004-tokyo.json +++ b/resources/data/levels/004-tokyo.json @@ -92,9 +92,9 @@ }, { "text": { - "en": "\u003c- Track 7 Tokaido Line (Shinagawa) Track 4 Yamanote Line (Ueno) -\u003e", + "en": "<- Track 7 Tokaido Line (Shinagawa) Track 4 Yamanote Line (Ueno) ->", "ja": "← 7番線 東海道線 品川方面 4番線 山手線 上野方面 →", - "sv": "\u003c- Spår 7 Tokaido-linjen (Shinagawa) Spår 4 Yamanote-linjen (Ueno) -\u003e" + "sv": "<- Spår 7 Tokaido-linjen (Shinagawa) Spår 4 Yamanote-linjen (Ueno) ->" }, "x": 3, "y": 3, @@ -115,7 +115,6 @@ "timeLimitSec": 420, "trains": [ { - "correct": true, "crowded": true, "destination": { "en": "Ueno", @@ -133,10 +132,11 @@ "intervalSec": 24, "offsetSec": 5 }, - "track": "4" + "track": "4", + "lineId": "yamanote", + "terminus": "ueno" }, { - "correct": false, "destination": { "en": "Shinagawa", "ja": "品川", @@ -153,7 +153,11 @@ "intervalSec": 28, "offsetSec": 11 }, - "track": "7" + "track": "7", + "lineId": "tokaido", + "terminus": "shinagawa" } - ] -} \ No newline at end of file + ], + "station": "tokyo", + "to": "ueno" +} diff --git a/resources/data/levels/005-ueno.json b/resources/data/levels/005-ueno.json index 4b5186c..0f02b1f 100644 --- a/resources/data/levels/005-ueno.json +++ b/resources/data/levels/005-ueno.json @@ -11,23 +11,23 @@ "fareYen": 200, "grid": [ "#################################", - "#S.\u003c..\u003c..#..\u003c..\u003c..\u003c..\u003c..#..\u003c..###", - "#..\u003e..\u003e..#..\u003e..\u003e..\u003e..\u003e..#..\u003e..###", - "#######\u003c\u003e#\u003c\u003e#\u003c\u003e####\u003c\u003e#\u003c\u003e####\u003c\u003e###", - "#..\u003c..\u003c..#.W\u003c..\u003c..\u003c..#..\u003c..\u003c..###", - "#.i\u003e..\u003e..#..\u003e..\u003e..\u003e..#..\u003eK.\u003e..###", - "#\u003c\u003e#############\u003c\u003e#######\u003c\u003e#\u003c\u003e###", - "#..#..\u003c..\u003c..\u003c.i\u003c..\u003c..\u003c..#..\u003c..###", - "#..#..\u003e..\u003e..\u003e..\u003e..\u003e..\u003e..#.T\u003ei.###", - "#\u003c\u003e####\u003c\u003e##########\u003c\u003e#\u003c\u003e#\u003c\u003e######", - "#..\u003c..\u003c..\u003c..#..\u003c..\u003c..#..#..\u003c..###", - "#..\u003e..\u003e..\u003e..#..\u003e..\u003e..#..#..\u003e..###", - "####\u003c\u003e#\u003c\u003e#\u003c\u003e#\u003c\u003e####\u003c\u003e#######\u003c\u003e###", - "#..\u003c..#..#..#..\u003c..#..\u003c..\u003c..\u003c..###", - "#..\u003e..#..#..#..\u003e..#..\u003e..\u003e..\u003e..###", - "#\u003c\u003e#######\u003c\u003e####\u003c\u003e###############", - "#G.\u003c..\u003c..\u003c..#..\u003c..\u003c..\u003c..\u003c..\u003c.G###", - "#pG\u003e..\u003e..\u003e..#..\u003e..\u003e..\u003e..\u003e..\u003eGP###", + "#S.<..<..#..<..<..<..<..#..<..###", + "#..>..>..#..>..>..>..>..#..>..###", + "#######<>#<>#<>####<>#<>####<>###", + "#..<..<..#.W<..<..<..#..<..<..###", + "#.i>..>..#..>..>..>..#..>K.>..###", + "#<>#############<>#######<>#<>###", + "#..#..<..<..<.i<..<..<..#..<..###", + "#..#..>..>..>..>..>..>..#.T>i.###", + "#<>####<>##########<>#<>#<>######", + "#..<..<..<..#..<..<..#..#..<..###", + "#..>..>..>..#..>..>..#..#..>..###", + "####<>#<>#<>#<>####<>#######<>###", + "#..<..#..#..#..<..#..<..<..<..###", + "#..>..#..#..#..>..#..>..>..>..###", + "#<>#######<>####<>###############", + "#G.<..<..<..#..<..<..<..<..<.G###", + "#pG>..>..>..#..>..>..>..>..>GP###", "#################################", "#################################", "#################################" @@ -64,9 +64,9 @@ }, { "text": { - "en": "\u003c- Track 9 Keihin-Tohoku Line (Omiya) Track 3 Yamanote Line (Akihabara) -\u003e", + "en": "<- Track 9 Keihin-Tohoku Line (Omiya) Track 3 Yamanote Line (Akihabara) ->", "ja": "← 9番線 京浜東北線 大宮方面 3番線 山手線 秋葉原方面 →", - "sv": "\u003c- Spår 9 Keihin-Tohoku-linjen (Omiya) Spår 3 Yamanote-linjen (Akihabara) -\u003e" + "sv": "<- Spår 9 Keihin-Tohoku-linjen (Omiya) Spår 3 Yamanote-linjen (Akihabara) ->" }, "x": 14, "y": 7, @@ -87,7 +87,6 @@ "trains": [ { "cars": 4, - "correct": true, "destination": { "en": "Akihabara", "ja": "秋葉原", @@ -107,11 +106,12 @@ "track": "3", "womenOnlyCar": 1, "womenOnlyFrom": 0, - "womenOnlyTo": 150 + "womenOnlyTo": 150, + "lineId": "yamanote", + "terminus": "tokyo" }, { "cars": 3, - "correct": false, "destination": { "en": "Omiya", "ja": "大宮", @@ -128,7 +128,11 @@ "intervalSec": 30, "offsetSec": 13 }, - "track": "9" + "track": "9", + "lineId": "keihin-tohoku", + "terminus": "omiya" } - ] -} \ No newline at end of file + ], + "station": "ueno", + "to": "akihabara" +} diff --git a/resources/data/levels/006-ikebukuro.json b/resources/data/levels/006-ikebukuro.json new file mode 100644 index 0000000..84b8b72 --- /dev/null +++ b/resources/data/levels/006-ikebukuro.json @@ -0,0 +1,177 @@ +{ + "clutter": 1, + "crowd": 1, + "destination": { + "en": "Shinjuku", + "ja": "新宿", + "romaji": "Shinjuku", + "sv": "Shinjuku" + }, + "difficulty": 4, + "fareYen": 180, + "grid": [ + "#################################", + "#S#...#........i..#.............#", + "#.#.#.#.#######.#.#.###########.#", + "#...#.#....T#...#.#.......#..W#.#", + "#####.#######.###.#.#####.#.###.#", + "#...#...#.....#...#.....#.#...#.#", + "#.#.###.#.#####.#####.#.#.###.#.#", + "#.#.#...#.#.....#...#K#.#.....#.#", + "#.#.#.###.#.#####.#.###.#####.#.#", + "#...#.....#......i#...#.....#.#.#", + "#.###############.###.#.#####.#.#", + "#.#.........#..i..#...#.......#.#", + "#.#.#.#####.#.#.###.#.#####.###.#", + "#...#.....#...#.....#.....#.#...#", + "#.#######.#.###########.#.###.#.#", + "#.#.....#...#.....#.....#...#.#.#", + "#.#.###.#####.###.#.#######.#.###", + "#...#.#...#...#...#...#...#.#...#", + "#####.###G#.###.#####.#.###.###G#", + "#pG.....GqG.#...GQG...#.......GP#", + "#################################" + ], + "id": "006-ikebukuro", + "kind": "main", + "maxMissedTrains": 2, + "name": { + "en": "Ikebukuro Station", + "ja": "池袋駅", + "sv": "Ikebukuro station" + }, + "noise": 1, + "order": 6, + "party": 3, + "rideStops": 5, + "shop": [ + "suit", + "rail_pass", + "onigiri_box" + ], + "signs": [ + { + "text": { + "en": "Ikebukuro Station. Track 6 Yamanote Line for Shinjuku: south-east. Tracks 1 and 2 Saikyo Line: south. Track 11 Marunouchi Line for Ogikubo: south-west.", + "ja": "池袋駅 6番線 山手線 新宿方面 → 南東 1番線・2番線 埼京線 → 南 11番線 丸ノ内線 荻窪方面 → 南西", + "sv": "Ikebukuro station. Spår 6 Yamanote-linjen mot Shinjuku: sydost. Spår 1 och 2 Saikyo-linjen: söderut. Spår 11 Marunouchi-linjen mot Ogikubo: sydväst." + }, + "x": 15, + "y": 1, + "z": 0 + }, + { + "text": { + "en": "\u003c- Track 2 Saikyo Line for Omiya Track 1 Saikyo Line for Osaki -\u003e", + "ja": "← 2番線 埼京線 大宮方面 1番線 埼京線 大崎方面 →", + "sv": "\u003c- Spår 2 Saikyo-linjen mot Omiya Spår 1 Saikyo-linjen mot Osaki -\u003e" + }, + "x": 17, + "y": 9, + "z": 0 + }, + { + "text": { + "en": "Track 6 Yamanote Line for Shinjuku: the gate in the south-east corner. Line map at the ticket machine.", + "ja": "6番線 山手線 新宿方面 → 南東口 改札 路線図 → 券売機", + "sv": "Spår 6 Yamanote-linjen mot Shinjuku: spärren i sydöstra hörnet. Linjekarta finns vid automaten." + }, + "x": 15, + "y": 11, + "z": 0 + } + ], + "station": "ikebukuro", + "timeLimitSec": 480, + "to": "shinjuku", + "trains": [ + { + "cars": 4, + "destination": { + "en": "Shinjuku", + "ja": "新宿", + "romaji": "Shinjuku" + }, + "line": { + "en": "Yamanote Line", + "ja": "山手線", + "romaji": "Yamanote-sen" + }, + "lineId": "yamanote", + "platform": "P", + "schedule": { + "dwellSec": 9, + "intervalSec": 30, + "offsetSec": 8 + }, + "terminus": "shinjuku", + "track": "6" + }, + { + "cars": 3, + "destination": { + "en": "Omiya", + "ja": "大宮", + "romaji": "Omiya" + }, + "line": { + "en": "Saikyo Line", + "ja": "埼京線", + "romaji": "Saikyo-sen" + }, + "lineId": "saikyo", + "platform": "p", + "schedule": { + "dwellSec": 8, + "intervalSec": 34, + "offsetSec": 14 + }, + "terminus": "omiya", + "track": "2" + }, + { + "cars": 3, + "destination": { + "en": "Osaki", + "ja": "大崎", + "romaji": "Osaki" + }, + "line": { + "en": "Saikyo Line", + "ja": "埼京線", + "romaji": "Saikyo-sen" + }, + "lineId": "saikyo", + "platform": "Q", + "schedule": { + "dwellSec": 8, + "intervalSec": 34, + "offsetSec": 20 + }, + "terminus": "osaki", + "track": "1" + }, + { + "cars": 3, + "destination": { + "en": "Ogikubo", + "ja": "荻窪", + "romaji": "Ogikubo" + }, + "line": { + "en": "Marunouchi Line", + "ja": "丸ノ内線", + "romaji": "Marunouchi-sen" + }, + "lineId": "marunouchi", + "platform": "q", + "schedule": { + "dwellSec": 8, + "intervalSec": 28, + "offsetSec": 4 + }, + "terminus": "ogikubo", + "track": "11" + } + ] +} \ No newline at end of file diff --git a/resources/data/network.json b/resources/data/network.json new file mode 100644 index 0000000..c6f0f53 --- /dev/null +++ b/resources/data/network.json @@ -0,0 +1,1009 @@ +{ + "_comment": "Linjenätet för navigeringen (internal/nav): stationer med namn och linjer i stationsordning. loop = ringlinje. Banorna pekar hit med station/to/lineId/terminus; då räknas rätt/fel tåg ut härifrån.", + "stations": [ + { + "id": "tokyo", + "name": { + "ja": "東京", + "kana": "とうきょう", + "romaji": "Tokyo", + "en": "Tokyo", + "sv": "Tokyo" + } + }, + { + "id": "kanda", + "name": { + "ja": "神田", + "kana": "かんだ", + "romaji": "Kanda", + "en": "Kanda", + "sv": "Kanda" + } + }, + { + "id": "akihabara", + "name": { + "ja": "秋葉原", + "kana": "あきはばら", + "romaji": "Akihabara", + "en": "Akihabara", + "sv": "Akihabara" + } + }, + { + "id": "okachimachi", + "name": { + "ja": "御徒町", + "kana": "おかちまち", + "romaji": "Okachimachi", + "en": "Okachimachi", + "sv": "Okachimachi" + } + }, + { + "id": "ueno", + "name": { + "ja": "上野", + "kana": "うえの", + "romaji": "Ueno", + "en": "Ueno", + "sv": "Ueno" + } + }, + { + "id": "uguisudani", + "name": { + "ja": "鶯谷", + "kana": "うぐいすだに", + "romaji": "Uguisudani", + "en": "Uguisudani", + "sv": "Uguisudani" + } + }, + { + "id": "nippori", + "name": { + "ja": "日暮里", + "kana": "にっぽり", + "romaji": "Nippori", + "en": "Nippori", + "sv": "Nippori" + } + }, + { + "id": "nishi-nippori", + "name": { + "ja": "西日暮里", + "kana": "にしにっぽり", + "romaji": "Nishi-Nippori", + "en": "Nishi-Nippori", + "sv": "Nishi-Nippori" + } + }, + { + "id": "tabata", + "name": { + "ja": "田端", + "kana": "たばた", + "romaji": "Tabata", + "en": "Tabata", + "sv": "Tabata" + } + }, + { + "id": "komagome", + "name": { + "ja": "駒込", + "kana": "こまごめ", + "romaji": "Komagome", + "en": "Komagome", + "sv": "Komagome" + } + }, + { + "id": "sugamo", + "name": { + "ja": "巣鴨", + "kana": "すがも", + "romaji": "Sugamo", + "en": "Sugamo", + "sv": "Sugamo" + } + }, + { + "id": "otsuka", + "name": { + "ja": "大塚", + "kana": "おおつか", + "romaji": "Otsuka", + "en": "Otsuka", + "sv": "Otsuka" + } + }, + { + "id": "ikebukuro", + "name": { + "ja": "池袋", + "kana": "いけぶくろ", + "romaji": "Ikebukuro", + "en": "Ikebukuro", + "sv": "Ikebukuro" + } + }, + { + "id": "mejiro", + "name": { + "ja": "目白", + "kana": "めじろ", + "romaji": "Mejiro", + "en": "Mejiro", + "sv": "Mejiro" + } + }, + { + "id": "takadanobaba", + "name": { + "ja": "高田馬場", + "kana": "たかだのばば", + "romaji": "Takadanobaba", + "en": "Takadanobaba", + "sv": "Takadanobaba" + } + }, + { + "id": "shin-okubo", + "name": { + "ja": "新大久保", + "kana": "しんおおくぼ", + "romaji": "Shin-Okubo", + "en": "Shin-Okubo", + "sv": "Shin-Okubo" + } + }, + { + "id": "shinjuku", + "name": { + "ja": "新宿", + "kana": "しんじゅく", + "romaji": "Shinjuku", + "en": "Shinjuku", + "sv": "Shinjuku" + } + }, + { + "id": "yoyogi", + "name": { + "ja": "代々木", + "kana": "よよぎ", + "romaji": "Yoyogi", + "en": "Yoyogi", + "sv": "Yoyogi" + } + }, + { + "id": "harajuku", + "name": { + "ja": "原宿", + "kana": "はらじゅく", + "romaji": "Harajuku", + "en": "Harajuku", + "sv": "Harajuku" + } + }, + { + "id": "shibuya", + "name": { + "ja": "渋谷", + "kana": "しぶや", + "romaji": "Shibuya", + "en": "Shibuya", + "sv": "Shibuya" + } + }, + { + "id": "ebisu", + "name": { + "ja": "恵比寿", + "kana": "えびす", + "romaji": "Ebisu", + "en": "Ebisu", + "sv": "Ebisu" + } + }, + { + "id": "meguro", + "name": { + "ja": "目黒", + "kana": "めぐろ", + "romaji": "Meguro", + "en": "Meguro", + "sv": "Meguro" + } + }, + { + "id": "gotanda", + "name": { + "ja": "五反田", + "kana": "ごたんだ", + "romaji": "Gotanda", + "en": "Gotanda", + "sv": "Gotanda" + } + }, + { + "id": "osaki", + "name": { + "ja": "大崎", + "kana": "おおさき", + "romaji": "Osaki", + "en": "Osaki", + "sv": "Osaki" + } + }, + { + "id": "shinagawa", + "name": { + "ja": "品川", + "kana": "しながわ", + "romaji": "Shinagawa", + "en": "Shinagawa", + "sv": "Shinagawa" + } + }, + { + "id": "takanawa-gateway", + "name": { + "ja": "高輪ゲートウェイ", + "kana": "たかなわげーとうぇい", + "romaji": "Takanawa Gateway", + "en": "Takanawa Gateway", + "sv": "Takanawa Gateway" + } + }, + { + "id": "tamachi", + "name": { + "ja": "田町", + "kana": "たまち", + "romaji": "Tamachi", + "en": "Tamachi", + "sv": "Tamachi" + } + }, + { + "id": "hamamatsucho", + "name": { + "ja": "浜松町", + "kana": "はままつちょう", + "romaji": "Hamamatsucho", + "en": "Hamamatsucho", + "sv": "Hamamatsucho" + } + }, + { + "id": "shimbashi", + "name": { + "ja": "新橋", + "kana": "しんばし", + "romaji": "Shimbashi", + "en": "Shimbashi", + "sv": "Shimbashi" + } + }, + { + "id": "yurakucho", + "name": { + "ja": "有楽町", + "kana": "ゆうらくちょう", + "romaji": "Yurakucho", + "en": "Yurakucho", + "sv": "Yurakucho" + } + }, + { + "id": "ochanomizu", + "name": { + "ja": "御茶ノ水", + "kana": "おちゃのみず", + "romaji": "Ochanomizu", + "en": "Ochanomizu", + "sv": "Ochanomizu" + } + }, + { + "id": "yotsuya", + "name": { + "ja": "四ツ谷", + "kana": "よつや", + "romaji": "Yotsuya", + "en": "Yotsuya", + "sv": "Yotsuya" + } + }, + { + "id": "nakano", + "name": { + "ja": "中野", + "kana": "なかの", + "romaji": "Nakano", + "en": "Nakano", + "sv": "Nakano" + } + }, + { + "id": "kichijoji", + "name": { + "ja": "吉祥寺", + "kana": "きちじょうじ", + "romaji": "Kichijoji", + "en": "Kichijoji", + "sv": "Kichijoji" + } + }, + { + "id": "mitaka", + "name": { + "ja": "三鷹", + "kana": "みたか", + "romaji": "Mitaka", + "en": "Mitaka", + "sv": "Mitaka" + } + }, + { + "id": "tachikawa", + "name": { + "ja": "立川", + "kana": "たちかわ", + "romaji": "Tachikawa", + "en": "Tachikawa", + "sv": "Tachikawa" + } + }, + { + "id": "hachioji", + "name": { + "ja": "八王子", + "kana": "はちおうじ", + "romaji": "Hachioji", + "en": "Hachioji", + "sv": "Hachioji" + } + }, + { + "id": "takao", + "name": { + "ja": "高尾", + "kana": "たかお", + "romaji": "Takao", + "en": "Takao", + "sv": "Takao" + } + }, + { + "id": "omiya", + "name": { + "ja": "大宮", + "kana": "おおみや", + "romaji": "Omiya", + "en": "Omiya", + "sv": "Omiya" + } + }, + { + "id": "urawa", + "name": { + "ja": "浦和", + "kana": "うらわ", + "romaji": "Urawa", + "en": "Urawa", + "sv": "Urawa" + } + }, + { + "id": "akabane", + "name": { + "ja": "赤羽", + "kana": "あかばね", + "romaji": "Akabane", + "en": "Akabane", + "sv": "Akabane" + } + }, + { + "id": "oji", + "name": { + "ja": "王子", + "kana": "おうじ", + "romaji": "Oji", + "en": "Oji", + "sv": "Oji" + } + }, + { + "id": "kawasaki", + "name": { + "ja": "川崎", + "kana": "かわさき", + "romaji": "Kawasaki", + "en": "Kawasaki", + "sv": "Kawasaki" + } + }, + { + "id": "yokohama", + "name": { + "ja": "横浜", + "kana": "よこはま", + "romaji": "Yokohama", + "en": "Yokohama", + "sv": "Yokohama" + } + }, + { + "id": "ofuna", + "name": { + "ja": "大船", + "kana": "おおふな", + "romaji": "Ofuna", + "en": "Ofuna", + "sv": "Ofuna" + } + }, + { + "id": "narita-airport", + "name": { + "ja": "成田空港", + "kana": "なりたくうこう", + "romaji": "Narita Airport", + "en": "Narita Airport", + "sv": "Narita Airport" + } + }, + { + "id": "airport-terminal-2", + "name": { + "ja": "空港第2ビル", + "kana": "くうこうだいにびる", + "romaji": "Airport Terminal 2", + "en": "Airport Terminal 2", + "sv": "Airport Terminal 2" + } + }, + { + "id": "narita", + "name": { + "ja": "成田", + "kana": "なりた", + "romaji": "Narita", + "en": "Narita", + "sv": "Narita" + } + }, + { + "id": "funabashi", + "name": { + "ja": "船橋", + "kana": "ふなばし", + "romaji": "Funabashi", + "en": "Funabashi", + "sv": "Funabashi" + } + }, + { + "id": "aoto", + "name": { + "ja": "青砥", + "kana": "あおと", + "romaji": "Aoto", + "en": "Aoto", + "sv": "Aoto" + } + }, + { + "id": "keisei-ueno", + "name": { + "ja": "京成上野", + "kana": "けいせいうえの", + "romaji": "Keisei-Ueno", + "en": "Keisei-Ueno", + "sv": "Keisei-Ueno" + } + }, + { + "id": "jujo", + "name": { + "ja": "十条", + "kana": "じゅうじょう", + "romaji": "Jujo", + "en": "Jujo", + "sv": "Jujo" + } + }, + { + "id": "itabashi", + "name": { + "ja": "板橋", + "kana": "いたばし", + "romaji": "Itabashi", + "en": "Itabashi", + "sv": "Itabashi" + } + }, + { + "id": "ogikubo", + "name": { + "ja": "荻窪", + "kana": "おぎくぼ", + "romaji": "Ogikubo", + "en": "Ogikubo", + "sv": "Ogikubo" + } + }, + { + "id": "shinjuku-sanchome", + "name": { + "ja": "新宿三丁目", + "kana": "しんじゅくさんちょうめ", + "romaji": "Shinjuku-sanchome", + "en": "Shinjuku-sanchome", + "sv": "Shinjuku-sanchome" + } + }, + { + "id": "shinjuku-gyoemmae", + "name": { + "ja": "新宿御苑前", + "kana": "しんじゅくぎょえんまえ", + "romaji": "Shinjuku-gyoemmae", + "en": "Shinjuku-gyoemmae", + "sv": "Shinjuku-gyoemmae" + } + }, + { + "id": "yotsuya-sanchome", + "name": { + "ja": "四谷三丁目", + "kana": "よつやさんちょうめ", + "romaji": "Yotsuya-sanchome", + "en": "Yotsuya-sanchome", + "sv": "Yotsuya-sanchome" + } + }, + { + "id": "akasaka-mitsuke", + "name": { + "ja": "赤坂見附", + "kana": "あかさかみつけ", + "romaji": "Akasaka-mitsuke", + "en": "Akasaka-mitsuke", + "sv": "Akasaka-mitsuke" + } + }, + { + "id": "kokkai-gijidomae", + "name": { + "ja": "国会議事堂前", + "kana": "こっかいぎじどうまえ", + "romaji": "Kokkai-gijidomae", + "en": "Kokkai-gijidomae", + "sv": "Kokkai-gijidomae" + } + }, + { + "id": "kasumigaseki", + "name": { + "ja": "霞ケ関", + "kana": "かすみがせき", + "romaji": "Kasumigaseki", + "en": "Kasumigaseki", + "sv": "Kasumigaseki" + } + }, + { + "id": "ginza", + "name": { + "ja": "銀座", + "kana": "ぎんざ", + "romaji": "Ginza", + "en": "Ginza", + "sv": "Ginza" + } + }, + { + "id": "otemachi", + "name": { + "ja": "大手町", + "kana": "おおてまち", + "romaji": "Otemachi", + "en": "Otemachi", + "sv": "Otemachi" + } + }, + { + "id": "awajicho", + "name": { + "ja": "淡路町", + "kana": "あわじちょう", + "romaji": "Awajicho", + "en": "Awajicho", + "sv": "Awajicho" + } + }, + { + "id": "hongo-sanchome", + "name": { + "ja": "本郷三丁目", + "kana": "ほんごうさんちょうめ", + "romaji": "Hongo-sanchome", + "en": "Hongo-sanchome", + "sv": "Hongo-sanchome" + } + }, + { + "id": "korakuen", + "name": { + "ja": "後楽園", + "kana": "こうらくえん", + "romaji": "Korakuen", + "en": "Korakuen", + "sv": "Korakuen" + } + }, + { + "id": "myogadani", + "name": { + "ja": "茗荷谷", + "kana": "みょうがだに", + "romaji": "Myogadani", + "en": "Myogadani", + "sv": "Myogadani" + } + }, + { + "id": "shin-otsuka", + "name": { + "ja": "新大塚", + "kana": "しんおおつか", + "romaji": "Shin-Otsuka", + "en": "Shin-Otsuka", + "sv": "Shin-Otsuka" + } + }, + { + "id": "naka-meguro", + "name": { + "ja": "中目黒", + "kana": "なかめぐろ", + "romaji": "Naka-Meguro", + "en": "Naka-Meguro", + "sv": "Naka-Meguro" + } + }, + { + "id": "roppongi", + "name": { + "ja": "六本木", + "kana": "ろっぽんぎ", + "romaji": "Roppongi", + "en": "Roppongi", + "sv": "Roppongi" + } + }, + { + "id": "kita-senju", + "name": { + "ja": "北千住", + "kana": "きたせんじゅ", + "romaji": "Kita-Senju", + "en": "Kita-Senju", + "sv": "Kita-Senju" + } + }, + { + "id": "omotesando", + "name": { + "ja": "表参道", + "kana": "おもてさんどう", + "romaji": "Omotesando", + "en": "Omotesando", + "sv": "Omotesando" + } + }, + { + "id": "nihombashi", + "name": { + "ja": "日本橋", + "kana": "にほんばし", + "romaji": "Nihombashi", + "en": "Nihombashi", + "sv": "Nihombashi" + } + }, + { + "id": "asakusa", + "name": { + "ja": "浅草", + "kana": "あさくさ", + "romaji": "Asakusa", + "en": "Asakusa", + "sv": "Asakusa" + } + }, + { + "id": "jiyugaoka", + "name": { + "ja": "自由が丘", + "kana": "じゆうがおか", + "romaji": "Jiyugaoka", + "en": "Jiyugaoka", + "sv": "Jiyugaoka" + } + }, + { + "id": "musashi-kosugi", + "name": { + "ja": "武蔵小杉", + "kana": "むさしこすぎ", + "romaji": "Musashi-Kosugi", + "en": "Musashi-Kosugi", + "sv": "Musashi-Kosugi" + } + }, + { + "id": "kikuna", + "name": { + "ja": "菊名", + "kana": "きくな", + "romaji": "Kikuna", + "en": "Kikuna", + "sv": "Kikuna" + } + } + ], + "lines": [ + { + "id": "yamanote", + "name": { + "ja": "山手線", + "romaji": "Yamanote-sen", + "en": "Yamanote Line" + }, + "stations": [ + "tokyo", + "kanda", + "akihabara", + "okachimachi", + "ueno", + "uguisudani", + "nippori", + "nishi-nippori", + "tabata", + "komagome", + "sugamo", + "otsuka", + "ikebukuro", + "mejiro", + "takadanobaba", + "shin-okubo", + "shinjuku", + "yoyogi", + "harajuku", + "shibuya", + "ebisu", + "meguro", + "gotanda", + "osaki", + "shinagawa", + "takanawa-gateway", + "tamachi", + "hamamatsucho", + "shimbashi", + "yurakucho" + ], + "loop": true + }, + { + "id": "chuo", + "name": { + "ja": "中央線", + "romaji": "Chuo-sen", + "en": "Chuo Line" + }, + "stations": [ + "tokyo", + "kanda", + "ochanomizu", + "yotsuya", + "shinjuku", + "nakano", + "kichijoji", + "mitaka", + "tachikawa", + "hachioji", + "takao" + ] + }, + { + "id": "keihin-tohoku", + "name": { + "ja": "京浜東北線", + "romaji": "Keihin-Tohoku-sen", + "en": "Keihin-Tohoku Line" + }, + "stations": [ + "omiya", + "urawa", + "akabane", + "oji", + "tabata", + "nishi-nippori", + "nippori", + "uguisudani", + "ueno", + "okachimachi", + "akihabara", + "kanda", + "tokyo", + "yurakucho", + "shimbashi", + "hamamatsucho", + "tamachi", + "takanawa-gateway", + "shinagawa", + "kawasaki", + "yokohama", + "ofuna" + ] + }, + { + "id": "narita-express", + "name": { + "ja": "成田エクスプレス", + "romaji": "Narita Ekusupuresu", + "en": "Narita Express" + }, + "stations": [ + "narita-airport", + "airport-terminal-2", + "tokyo", + "shinagawa", + "shibuya", + "shinjuku" + ] + }, + { + "id": "keisei-main", + "name": { + "ja": "京成本線", + "romaji": "Keisei Honsen", + "en": "Keisei Main Line" + }, + "stations": [ + "narita-airport", + "airport-terminal-2", + "narita", + "funabashi", + "aoto", + "nippori", + "keisei-ueno" + ] + }, + { + "id": "saikyo", + "name": { + "ja": "埼京線", + "romaji": "Saikyo-sen", + "en": "Saikyo Line" + }, + "stations": [ + "omiya", + "akabane", + "jujo", + "itabashi", + "ikebukuro", + "shinjuku", + "shibuya", + "ebisu", + "osaki" + ] + }, + { + "id": "marunouchi", + "name": { + "ja": "丸ノ内線", + "romaji": "Marunouchi-sen", + "en": "Marunouchi Line" + }, + "stations": [ + "ogikubo", + "shinjuku", + "shinjuku-sanchome", + "shinjuku-gyoemmae", + "yotsuya-sanchome", + "yotsuya", + "akasaka-mitsuke", + "kokkai-gijidomae", + "kasumigaseki", + "ginza", + "tokyo", + "otemachi", + "awajicho", + "ochanomizu", + "hongo-sanchome", + "korakuen", + "myogadani", + "shin-otsuka", + "ikebukuro" + ] + }, + { + "id": "hibiya", + "name": { + "ja": "日比谷線", + "romaji": "Hibiya-sen", + "en": "Hibiya Line" + }, + "stations": [ + "naka-meguro", + "ebisu", + "roppongi", + "ginza", + "akihabara", + "ueno", + "kita-senju" + ] + }, + { + "id": "ginza", + "name": { + "ja": "銀座線", + "romaji": "Ginza-sen", + "en": "Ginza Line" + }, + "stations": [ + "shibuya", + "omotesando", + "akasaka-mitsuke", + "ginza", + "nihombashi", + "kanda", + "ueno", + "asakusa" + ] + }, + { + "id": "toyoko", + "name": { + "ja": "東急東横線", + "romaji": "Tokyu Toyoko-sen", + "en": "Tokyu Toyoko Line" + }, + "stations": [ + "shibuya", + "naka-meguro", + "jiyugaoka", + "musashi-kosugi", + "kikuna", + "yokohama" + ] + }, + { + "id": "tokaido", + "name": { + "ja": "東海道線", + "romaji": "Tokaido-sen", + "en": "Tokaido Line" + }, + "stations": [ + "tokyo", + "shimbashi", + "shinagawa", + "kawasaki", + "yokohama", + "ofuna" + ] + } + ] +} \ No newline at end of file diff --git a/resources/text/en.json b/resources/text/en.json index 02c115e..f8044be 100644 --- a/resources/text/en.json +++ b/resources/text/en.json @@ -140,7 +140,7 @@ "map.party": "Party", "map.resume": "⟳ resume (saved seed)", "map.locked": "Locked - clear the previous level first.", - "map.hint": "Arrows: level Enter: start L: words T: skills I: wardrobe P: phone Esc", + "map.hint": "Enter start N mode L words T skills I items P phone Esc", "skills.title": "Skills 技", "skills.to_next": "XP to next", "skills.already": "Already unlocked.", @@ -197,5 +197,16 @@ "hud.early_board": "Let people off first!", "hud.bump": "Sumimasen…", "hud.wrong_lane": "Wrong side - keep to the side the lane shows", - "result.car": "car" + "result.car": "car", + "hud.take": "Take:", + "hud.mode_signs": "Sign mode: work out the train yourself, +50 % score", + "hud.terminal": "Lines from here (terminal):", + "menu.mode": "N: navigation %s", + "mode.list": "list mode (next train shown)", + "mode.signs": "sign mode (+50 % score)", + "result.bonus": "sign bonus", + "result.lost_wrong_direction": "Wrong direction.", + "result.lost_too_far": "Too far away.", + "result.wrong_direction_detail": "The line does reach %[2]s, but the train for %[1]s goes the other way.", + "result.too_far_detail": "The train for %[1]s only reaches %[2]s after a long detour." } diff --git a/resources/text/jp-dictionary.json b/resources/text/jp-dictionary.json index 1de6034..9a932ed 100644 --- a/resources/text/jp-dictionary.json +++ b/resources/text/jp-dictionary.json @@ -645,5 +645,528 @@ "en": "passage / keep", "sv": "gång / håll", "tier": 3 + }, + "神田": { + "kana": "かんだ", + "romaji": "Kanda", + "en": "Kanda", + "sv": "Kanda", + "tier": 3, + "kind": "station" + }, + "御徒町": { + "kana": "おかちまち", + "romaji": "Okachimachi", + "en": "Okachimachi", + "sv": "Okachimachi", + "tier": 3, + "kind": "station" + }, + "鶯谷": { + "kana": "うぐいすだに", + "romaji": "Uguisudani", + "en": "Uguisudani", + "sv": "Uguisudani", + "tier": 3, + "kind": "station" + }, + "西日暮里": { + "kana": "にしにっぽり", + "romaji": "Nishi-Nippori", + "en": "Nishi-Nippori", + "sv": "Nishi-Nippori", + "tier": 3, + "kind": "station" + }, + "田端": { + "kana": "たばた", + "romaji": "Tabata", + "en": "Tabata", + "sv": "Tabata", + "tier": 3, + "kind": "station" + }, + "駒込": { + "kana": "こまごめ", + "romaji": "Komagome", + "en": "Komagome", + "sv": "Komagome", + "tier": 3, + "kind": "station" + }, + "巣鴨": { + "kana": "すがも", + "romaji": "Sugamo", + "en": "Sugamo", + "sv": "Sugamo", + "tier": 3, + "kind": "station" + }, + "大塚": { + "kana": "おおつか", + "romaji": "Otsuka", + "en": "Otsuka", + "sv": "Otsuka", + "tier": 3, + "kind": "station" + }, + "目白": { + "kana": "めじろ", + "romaji": "Mejiro", + "en": "Mejiro", + "sv": "Mejiro", + "tier": 3, + "kind": "station" + }, + "高田馬場": { + "kana": "たかだのばば", + "romaji": "Takadanobaba", + "en": "Takadanobaba", + "sv": "Takadanobaba", + "tier": 3, + "kind": "station" + }, + "新大久保": { + "kana": "しんおおくぼ", + "romaji": "Shin-Okubo", + "en": "Shin-Okubo", + "sv": "Shin-Okubo", + "tier": 3, + "kind": "station" + }, + "代々木": { + "kana": "よよぎ", + "romaji": "Yoyogi", + "en": "Yoyogi", + "sv": "Yoyogi", + "tier": 3, + "kind": "station" + }, + "恵比寿": { + "kana": "えびす", + "romaji": "Ebisu", + "en": "Ebisu", + "sv": "Ebisu", + "tier": 3, + "kind": "station" + }, + "目黒": { + "kana": "めぐろ", + "romaji": "Meguro", + "en": "Meguro", + "sv": "Meguro", + "tier": 3, + "kind": "station" + }, + "五反田": { + "kana": "ごたんだ", + "romaji": "Gotanda", + "en": "Gotanda", + "sv": "Gotanda", + "tier": 3, + "kind": "station" + }, + "大崎": { + "kana": "おおさき", + "romaji": "Osaki", + "en": "Osaki", + "sv": "Osaki", + "tier": 3, + "kind": "station" + }, + "高輪ゲートウェイ": { + "kana": "たかなわげーとうぇい", + "romaji": "Takanawa Gateway", + "en": "Takanawa Gateway", + "sv": "Takanawa Gateway", + "tier": 3, + "kind": "station" + }, + "田町": { + "kana": "たまち", + "romaji": "Tamachi", + "en": "Tamachi", + "sv": "Tamachi", + "tier": 3, + "kind": "station" + }, + "浜松町": { + "kana": "はままつちょう", + "romaji": "Hamamatsucho", + "en": "Hamamatsucho", + "sv": "Hamamatsucho", + "tier": 3, + "kind": "station" + }, + "新橋": { + "kana": "しんばし", + "romaji": "Shimbashi", + "en": "Shimbashi", + "sv": "Shimbashi", + "tier": 3, + "kind": "station" + }, + "有楽町": { + "kana": "ゆうらくちょう", + "romaji": "Yurakucho", + "en": "Yurakucho", + "sv": "Yurakucho", + "tier": 3, + "kind": "station" + }, + "御茶ノ水": { + "kana": "おちゃのみず", + "romaji": "Ochanomizu", + "en": "Ochanomizu", + "sv": "Ochanomizu", + "tier": 3, + "kind": "station" + }, + "四ツ谷": { + "kana": "よつや", + "romaji": "Yotsuya", + "en": "Yotsuya", + "sv": "Yotsuya", + "tier": 3, + "kind": "station" + }, + "中野": { + "kana": "なかの", + "romaji": "Nakano", + "en": "Nakano", + "sv": "Nakano", + "tier": 3, + "kind": "station" + }, + "吉祥寺": { + "kana": "きちじょうじ", + "romaji": "Kichijoji", + "en": "Kichijoji", + "sv": "Kichijoji", + "tier": 3, + "kind": "station" + }, + "三鷹": { + "kana": "みたか", + "romaji": "Mitaka", + "en": "Mitaka", + "sv": "Mitaka", + "tier": 3, + "kind": "station" + }, + "立川": { + "kana": "たちかわ", + "romaji": "Tachikawa", + "en": "Tachikawa", + "sv": "Tachikawa", + "tier": 3, + "kind": "station" + }, + "八王子": { + "kana": "はちおうじ", + "romaji": "Hachioji", + "en": "Hachioji", + "sv": "Hachioji", + "tier": 3, + "kind": "station" + }, + "高尾": { + "kana": "たかお", + "romaji": "Takao", + "en": "Takao", + "sv": "Takao", + "tier": 3, + "kind": "station" + }, + "浦和": { + "kana": "うらわ", + "romaji": "Urawa", + "en": "Urawa", + "sv": "Urawa", + "tier": 3, + "kind": "station" + }, + "赤羽": { + "kana": "あかばね", + "romaji": "Akabane", + "en": "Akabane", + "sv": "Akabane", + "tier": 3, + "kind": "station" + }, + "王子": { + "kana": "おうじ", + "romaji": "Oji", + "en": "Oji", + "sv": "Oji", + "tier": 3, + "kind": "station" + }, + "川崎": { + "kana": "かわさき", + "romaji": "Kawasaki", + "en": "Kawasaki", + "sv": "Kawasaki", + "tier": 3, + "kind": "station" + }, + "大船": { + "kana": "おおふな", + "romaji": "Ofuna", + "en": "Ofuna", + "sv": "Ofuna", + "tier": 3, + "kind": "station" + }, + "成田空港": { + "kana": "なりたくうこう", + "romaji": "Narita Airport", + "en": "Narita Airport", + "sv": "Narita Airport", + "tier": 3, + "kind": "station" + }, + "空港第2ビル": { + "kana": "くうこうだいにびる", + "romaji": "Airport Terminal 2", + "en": "Airport Terminal 2", + "sv": "Airport Terminal 2", + "tier": 3, + "kind": "station" + }, + "船橋": { + "kana": "ふなばし", + "romaji": "Funabashi", + "en": "Funabashi", + "sv": "Funabashi", + "tier": 3, + "kind": "station" + }, + "青砥": { + "kana": "あおと", + "romaji": "Aoto", + "en": "Aoto", + "sv": "Aoto", + "tier": 3, + "kind": "station" + }, + "十条": { + "kana": "じゅうじょう", + "romaji": "Jujo", + "en": "Jujo", + "sv": "Jujo", + "tier": 3, + "kind": "station" + }, + "板橋": { + "kana": "いたばし", + "romaji": "Itabashi", + "en": "Itabashi", + "sv": "Itabashi", + "tier": 3, + "kind": "station" + }, + "荻窪": { + "kana": "おぎくぼ", + "romaji": "Ogikubo", + "en": "Ogikubo", + "sv": "Ogikubo", + "tier": 3, + "kind": "station" + }, + "新宿三丁目": { + "kana": "しんじゅくさんちょうめ", + "romaji": "Shinjuku-sanchome", + "en": "Shinjuku-sanchome", + "sv": "Shinjuku-sanchome", + "tier": 3, + "kind": "station" + }, + "新宿御苑前": { + "kana": "しんじゅくぎょえんまえ", + "romaji": "Shinjuku-gyoemmae", + "en": "Shinjuku-gyoemmae", + "sv": "Shinjuku-gyoemmae", + "tier": 3, + "kind": "station" + }, + "四谷三丁目": { + "kana": "よつやさんちょうめ", + "romaji": "Yotsuya-sanchome", + "en": "Yotsuya-sanchome", + "sv": "Yotsuya-sanchome", + "tier": 3, + "kind": "station" + }, + "赤坂見附": { + "kana": "あかさかみつけ", + "romaji": "Akasaka-mitsuke", + "en": "Akasaka-mitsuke", + "sv": "Akasaka-mitsuke", + "tier": 3, + "kind": "station" + }, + "国会議事堂前": { + "kana": "こっかいぎじどうまえ", + "romaji": "Kokkai-gijidomae", + "en": "Kokkai-gijidomae", + "sv": "Kokkai-gijidomae", + "tier": 3, + "kind": "station" + }, + "霞ケ関": { + "kana": "かすみがせき", + "romaji": "Kasumigaseki", + "en": "Kasumigaseki", + "sv": "Kasumigaseki", + "tier": 3, + "kind": "station" + }, + "大手町": { + "kana": "おおてまち", + "romaji": "Otemachi", + "en": "Otemachi", + "sv": "Otemachi", + "tier": 3, + "kind": "station" + }, + "淡路町": { + "kana": "あわじちょう", + "romaji": "Awajicho", + "en": "Awajicho", + "sv": "Awajicho", + "tier": 3, + "kind": "station" + }, + "本郷三丁目": { + "kana": "ほんごうさんちょうめ", + "romaji": "Hongo-sanchome", + "en": "Hongo-sanchome", + "sv": "Hongo-sanchome", + "tier": 3, + "kind": "station" + }, + "後楽園": { + "kana": "こうらくえん", + "romaji": "Korakuen", + "en": "Korakuen", + "sv": "Korakuen", + "tier": 3, + "kind": "station" + }, + "茗荷谷": { + "kana": "みょうがだに", + "romaji": "Myogadani", + "en": "Myogadani", + "sv": "Myogadani", + "tier": 3, + "kind": "station" + }, + "新大塚": { + "kana": "しんおおつか", + "romaji": "Shin-Otsuka", + "en": "Shin-Otsuka", + "sv": "Shin-Otsuka", + "tier": 3, + "kind": "station" + }, + "中目黒": { + "kana": "なかめぐろ", + "romaji": "Naka-Meguro", + "en": "Naka-Meguro", + "sv": "Naka-Meguro", + "tier": 3, + "kind": "station" + }, + "六本木": { + "kana": "ろっぽんぎ", + "romaji": "Roppongi", + "en": "Roppongi", + "sv": "Roppongi", + "tier": 3, + "kind": "station" + }, + "北千住": { + "kana": "きたせんじゅ", + "romaji": "Kita-Senju", + "en": "Kita-Senju", + "sv": "Kita-Senju", + "tier": 3, + "kind": "station" + }, + "表参道": { + "kana": "おもてさんどう", + "romaji": "Omotesando", + "en": "Omotesando", + "sv": "Omotesando", + "tier": 3, + "kind": "station" + }, + "日本橋": { + "kana": "にほんばし", + "romaji": "Nihombashi", + "en": "Nihombashi", + "sv": "Nihombashi", + "tier": 3, + "kind": "station" + }, + "自由が丘": { + "kana": "じゆうがおか", + "romaji": "Jiyugaoka", + "en": "Jiyugaoka", + "sv": "Jiyugaoka", + "tier": 3, + "kind": "station" + }, + "武蔵小杉": { + "kana": "むさしこすぎ", + "romaji": "Musashi-Kosugi", + "en": "Musashi-Kosugi", + "sv": "Musashi-Kosugi", + "tier": 3, + "kind": "station" + }, + "菊名": { + "kana": "きくな", + "romaji": "Kikuna", + "en": "Kikuna", + "sv": "Kikuna", + "tier": 3, + "kind": "station" + }, + "埼京線": { + "kana": "さいきょうせん", + "romaji": "Saikyo-sen", + "en": "Saikyo Line", + "sv": "Saikyo-linjen", + "tier": 3 + }, + "日比谷線": { + "kana": "ひびやせん", + "romaji": "Hibiya-sen", + "en": "Hibiya Line", + "sv": "Hibiya-linjen", + "tier": 3 + }, + "銀座線": { + "kana": "ぎんざせん", + "romaji": "Ginza-sen", + "en": "Ginza Line", + "sv": "Ginza-linjen", + "tier": 3 + }, + "路線図": { + "kana": "ろせんず", + "romaji": "rosenzu", + "en": "line map", + "sv": "linjekarta", + "tier": 3 + }, + "券売機": { + "kana": "けんばいき", + "romaji": "kenbaiki", + "en": "ticket machine", + "sv": "biljettautomat", + "tier": 2 } -} +} \ No newline at end of file diff --git a/resources/text/sv.json b/resources/text/sv.json index 8ef8235..b8777a1 100644 --- a/resources/text/sv.json +++ b/resources/text/sv.json @@ -140,7 +140,7 @@ "map.party": "Sällskap", "map.resume": "⟳ fortsätt (sparad seed)", "map.locked": "Låst - klara föregående bana först.", - "map.hint": "Pilar: bana Enter: start L: ord T: skills I: garderob P: tel Esc", + "map.hint": "Enter start N läge L ord T skills I items P tel Esc", "skills.title": "Skills 技", "skills.to_next": "XP till nästa", "skills.already": "Redan upplåst.", @@ -197,5 +197,16 @@ "hud.early_board": "Låt folk kliva av först!", "hud.bump": "Ursäkta…", "hud.wrong_lane": "Fel sida - håll till vänster/höger som filen visar", - "result.car": "vagn" + "result.car": "vagn", + "hud.take": "Ta:", + "hud.mode_signs": "Skyltläge: lista ut tåget själv, +50 % poäng", + "hud.terminal": "Linjer härifrån (terminal):", + "menu.mode": "N: navigering %s", + "mode.list": "listläge (nästa tåg visas)", + "mode.signs": "skyltläge (+50 % poäng)", + "result.bonus": "skyltbonus", + "result.lost_wrong_direction": "Fel håll.", + "result.lost_too_far": "För långt bort.", + "result.wrong_direction_detail": "Linjen går till %[2]s, men tåget mot %[1]s åker åt andra hållet.", + "result.too_far_detail": "Tåget mot %[1]s når %[2]s först efter en lång omväg." } diff --git a/tools/shots/main.go b/tools/shots/main.go index 653b2ce..5f17616 100644 --- a/tools/shots/main.go +++ b/tools/shots/main.go @@ -110,6 +110,18 @@ func buildShots(levelsDir string) error { if err != nil { return err } + l6, err := level.LoadFile(filepath.Join(levelsDir, "006-ikebukuro.json")) + if err != nil { + return err + } + toMachine6, err := moves(l6, l6.SpawnPoint(), l6.Find(level.TicketMachine)[0]) + if err != nil { + return err + } + toTrap6, err := moves(l6, l6.SpawnPoint(), l6.Find(level.Platform3)[0]) // Marunouchi: för långt bort + if err != nil { + return err + } // Skyltbilderna tas med några kända ord så att markeringen och den // delvisa översättningen syns; hjälpen lär sedan in nästa ord. known := []string{"-know", "改札,番線,方面", "-seed", "7"} @@ -120,13 +132,17 @@ func buildShots(levelsDir string) error { {"001-flygplatsen", "move right 4; move down 2; wait 5; shot $OUT/level-001.png; quit", nil}, {"002-shinjuku", "move down 6; move right 4; wait 5; shot $OUT/level-002.png; quit", nil}, {"001-flygplatsen", toSign + "; wait 5; shot $OUT/sign.png; press h; wait 200; shot $OUT/sign-help.png; wait 200; shot $OUT/sign-learned.png; " + toGoal + - "; waitphase approaching; wait 200; shot $OUT/approach.png; waittrain; wait 30; shot $OUT/platform.png; press enter; wait 40; shot $OUT/ride.png; waitstop; press enter; wait 5; shot $OUT/result.png; quit", known}, + "; waitphase approaching; wait 200; shot $OUT/approach.png; waittrain; wait 30; shot $OUT/platform.png; press enter; wait 100; pick calm; press enter; wait 40; shot $OUT/ride.png; waitstop; press enter; wait 5; shot $OUT/result.png; quit", known}, {"001-flygplatsen", toMachine + "; press enter; wait 5; press right; wait 5; shot $OUT/topup.png; quit", []string{"-seed", "7", "-card", "0"}}, {"002-shinjuku", toMachine2 + "; press enter; wait 5; shot $OUT/ticket.png; quit", []string{"-seed", "7", "-know", "渋谷"}}, {"003-shibuya", toMachine3 + "; press enter; pick 池袋; press enter; wait 5; press enter; press right; wait 5; shot $OUT/seats.png; quit", []string{"-seed", "7", "-know", "池袋", "-debuffs", "sore_feet"}}, {"004-tokyo", "wait 10; shot $OUT/floors-b1.png; " + toStairs + "; wait 20; shot $OUT/floors-1f.png; quit", []string{"-seed", "7"}}, {"005-ueno", "wait 90; shot $OUT/crowd.png; " + toPlatform5 + "; waittrain; wait 5; press enter; wait 20; shot $OUT/cars-alight.png; wait 80; press right; wait 5; shot $OUT/cars.png; quit", []string{"-seed", "7"}}, + {"006-ikebukuro", "move right 2; wait 5; shot $OUT/nav-list.png; quit", []string{"-seed", "7", "-mode", "list"}}, + {"006-ikebukuro", toMachine6 + "; wait 5; shot $OUT/terminal.png; " + "quit", []string{"-seed", "7", "-mode", "signs", "-know", "山手線,番線,方面,新宿,池袋,埼京線"}}, + {"006-ikebukuro", toTrap6 + "; waittrain; wait 5; press enter; wait 100; pick calm; press enter; wait 60; shot $OUT/ride-real.png; waitover; wait 5; shot $OUT/too-far.png; quit", []string{"-seed", "7", "-mode", "signs"}}, + {"", "wait 10; press n; wait 5; shot $OUT/map-signs.png; quit", []string{"-save", "$DEMO"}}, } return nil }