From daa2089edaa14cad3107ea4aa39007ba28bc19a7 Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 23 Oct 2026 21:29:09 +0200 Subject: [PATCH] =?UTF-8?q?Inl=C3=A4rning=20(framsteg,=20stj=C3=A4rnor,=20?= =?UTF-8?q?ordlista)=20och=20M4:=20l=C3=A4mmelt=C3=A5get?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inlärning enligt Björns regler: - lang.Knowledge: framsteg per ord (3 läsningar = känt), språkpoäng, köp av valfria ord (kostnad = tier), Award per stjärna - sim.Run: RunOptions med seed; stjärnor 1–3 mot par (parSec eller kortaste vägen × 0,5 s + 20 s); ≥2 stjärnor lär resmålets ord; att stanna på skylt/perrong ger seedad 35 % chans till framsteg per okänt ord - game: ordlista (L) med kända ord, framsteg och kostnad; stjärnor, poäng och inlärt resmål på resultatskärmen; framstegsnotis; flaggor -points/-seed M4 lämmeltåget: - sim.Party: medlemmar med mat/dryck/toa-mätare, behov under tröskel, seedade händelser var 45 s / antal (toa, törst, hunger, distraktion), fartstraff, toalett (W, 3 s/person) och kiosk (K, 150 ¥/person), följare på ledarens spår - level: rutor W och K, party och parSec i bandatan; banor med sällskap måste ha toalett och kiosk (testas); 001 har 2, 002 har 3 i sällskapet - game: följare med färgton, behovsmarkering över huvudet, mätarpanel, facilitetsrutor med förlopp; genart ritar toalett och kiosk - skriptläget: move stannar exakt på målrutan även när farten inte är bildruteexakt (sällskapets fartstraff), stall-skydd mot väggar - docs/README/wiki/spelbeskrivning uppdaterade Co-Authored-By: Claude Fable 5.1 --- README.md | 26 +- cmd/metro-puzzle-jp/main.go | 4 +- doc/img/level-001.png | Bin 16267 -> 17016 bytes doc/img/level-002.png | Bin 15769 -> 16437 bytes doc/img/menu.png | Bin 14071 -> 14304 bytes doc/img/platform.png | Bin 20102 -> 21652 bytes doc/img/result.png | Bin 22123 -> 24921 bytes doc/img/sign-help.png | Bin 23157 -> 23655 bytes doc/img/sign-learned.png | Bin 23585 -> 24051 bytes doc/img/sign.png | Bin 23114 -> 24222 bytes doc/img/words.png | Bin 0 -> 16184 bytes doc/mal-och-tester.md | 10 +- doc/plan.md | 7 +- doc/roadmap.md | 45 +++- doc/spelbeskrivning.md | 13 + internal/game/assets.go | 11 +- internal/game/game.go | 16 +- internal/game/input.go | 5 + internal/game/scene_level.go | 145 +++++++++-- internal/game/scene_menu.go | 9 +- internal/game/scene_result.go | 23 +- internal/game/scene_words.go | 112 +++++++++ internal/game/script.go | 51 ++-- internal/lang/knowledge.go | 78 +++++- internal/lang/lang_test.go | 40 ++++ internal/level/level.go | 37 ++- internal/level/level_test.go | 23 ++ internal/sim/party.go | 265 +++++++++++++++++++++ internal/sim/party_test.go | 143 +++++++++++ internal/sim/run.go | 235 ++++++++++++++++-- internal/sim/run_test.go | 167 ++++++++++++- resources/data/levels/001-flygplatsen.json | 5 +- resources/data/levels/002-shinjuku.json | 5 +- resources/sprites/tiles.png | Bin 692 -> 879 bytes resources/text/en.json | 24 +- resources/text/sv.json | 24 +- tools/genart/main.go | 23 +- tools/shots/main.go | 5 +- 38 files changed, 1436 insertions(+), 115 deletions(-) create mode 100644 doc/img/words.png create mode 100644 internal/game/scene_words.go create mode 100644 internal/sim/party.go create mode 100644 internal/sim/party_test.go diff --git a/README.md b/README.md index 62e6eef..3579290 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,11 @@ 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:** M3 klar (2026-10-23) – skyltarna är på japanska. Ord du kan -lyser gult och översätts, resten står kvar tills du frågar någon om hjälp -och lär dig ett ord till. Lätta banor har engelska på skyltarna, svåra inte. -Nästa är M4: lämmeltåget och mätarna. Se [doc/roadmap.md](doc/roadmap.md). +**Status:** M4 klar (2026-10-23) – skyltarna är på japanska och du lär dig +ord genom att läsa, fråga om hjälp, klara banor med bra tid eller lägga +språkpoäng i ordlistan. Lämmeltåget följer efter dig: polarna blir hungriga, +törstiga och måste på toa, oftare ju fler ni är, och du löser det vid kiosker +och toaletter. Nästa är M5: minikartan. Se [doc/roadmap.md](doc/roadmap.md). ![Skylt på japanska med delvis översättning](doc/img/sign.png) @@ -24,9 +25,16 @@ väntar några sekunder och får hela skylten översatt plus ett nytt ord. Spärrarna släpper bara igenom dig om kortet har saldo. På perrongen (gul ledlinje) är avgångstavlan också japansk. Står tåget inne trycker du Enter för att kliva på. Rätt tåg tar dig till resmålet, fel tåg avslutar banan. +Klarar du banan under par får du stjärnor, språkpoäng och resmålets namn. ![Perrongen – tåget är inne](doc/img/platform.png) +Ditt sällskap följer efter i en rad. Mätarna uppe till höger visar mat, +dryck och toa för var och en; faller de får någon ett behov som saktar ned +er alla tills ni hittar en kiosk eller en toalett. + +![Shinjuku station med sällskapet](doc/img/level-002.png) + Fler bilder och en genomgång finns i [wikin](https://gitea.brasse-pc.eu/brasse/metro-puzzle-jp/wiki). @@ -101,16 +109,18 @@ metro-puzzle-jp # meny metro-puzzle-jp -level 001-flygplatsen # hoppa direkt in i en bana metro-puzzle-jp -scale 3 # fönsterstorlek (320x180 × skala) metro-puzzle-jp -smoke 90 # öppna fönster, avsluta efter 90 bildrutor (smoke-test) -metro-puzzle-jp -know 改札,番線 # japanska ord du kan från start (tester/skärmdumpar) +metro-puzzle-jp -know 改札,番線 -points 3 # förkunskap och språkpoäng (tester/skärmdumpar) +metro-puzzle-jp -seed 7 # fast seed för händelser och läsning (tester/skärmdumpar) metro-puzzle-jp -script "move right 4; shot bild.png; quit" # skriptläge, se internal/game/script.go metro-puzzle-jp -version ``` ### Styrning -Pilar eller WASD går, Enter väljer/kliver på, H frågar om hjälp vid en -skylt, Esc går tillbaka, R spelar om. Gamepad med standardlayout fungerar: -d-pad/vänster spak, A = välj, B = tillbaka, Y = hjälp. +Pilar eller WASD går. Enter väljer, kliver på tåget, använder toaletten +eller handlar i kiosken. H frågar om hjälp vid en skylt, L öppnar +ordlistan, 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. ### Verktyg diff --git a/cmd/metro-puzzle-jp/main.go b/cmd/metro-puzzle-jp/main.go index 18a4061..c7b2040 100644 --- a/cmd/metro-puzzle-jp/main.go +++ b/cmd/metro-puzzle-jp/main.go @@ -20,6 +20,8 @@ func main() { smoke := flag.Int("smoke", 0, "avsluta automatiskt efter N bildrutor (smoke-test)") script := flag.String("script", "", "skriptade steg för skärmdumpar/tester, t.ex. \"wait 10; shot menu.png; quit\" (se internal/game/script.go)") know := flag.String("know", "", "japanska ord spelaren kan från start, kommaseparerade (tester/skärmdumpar)") + points := flag.Int("points", 0, "språkpoäng från start (tester/skärmdumpar)") + seed := flag.Uint64("seed", 0, "fast seed för banorna, 0 = slumpad (tester/skärmdumpar)") version := flag.Bool("version", false, "skriv ut version och avsluta") flag.Parse() @@ -28,7 +30,7 @@ func main() { return } - g, err := game.New(game.Options{LevelID: *levelID, SmokeFrames: *smoke, Script: *script, KnownWords: splitWords(*know)}) + g, err := game.New(game.Options{LevelID: *levelID, SmokeFrames: *smoke, Script: *script, KnownWords: splitWords(*know), Points: *points, Seed: *seed}) if err != nil { log.Fatalf("kunde inte starta: %v", err) } diff --git a/doc/img/level-001.png b/doc/img/level-001.png index b373d2e1e7fe24c7711155864c95cf0fadb8e8ca..b20a8ad725edb43b9ebdf3833456a909c7d1d505 100644 GIT binary patch literal 17016 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 delta 8733 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Μ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 diff --git a/doc/img/menu.png b/doc/img/menu.png index 71a0827551be954679d948b9e6dfe082cda3ec8e..3a116ac96b20c48302900beed8e0adfa3a86c28b 100644 GIT binary patch delta 3106 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 XQm=a2c5PSUTYHXJ*c_%DJRSXSa7uuq delta 2784 zcmb`JdpMNq7Qo%FnTSTi7!f0cEoK;vOpQw}5xIoiFEcK=cGM8kPWDNL_NPP)5~Fbs z2Z`B;X_Q+MMWHZZYc@t|H0Dfuch0lhhx432&iDJCXMO8^*7}}zt@nM`dZ!}S&t&Zr zK(^PZhij+{9@%5L8+}PqZ;HSBhDMaSx4ZO%xRCNeXN~DnBfl#urmZyE&XQ#jen47O zc2}Yr#^=?O_Cm%+0^6)`w1i^^bcm?xdZds%ijEuGZ9$p6vH$V956%%kn7Czx-Q6tc zeFFIHfC3mz(V)mSjG*E7?^%IC#`xNsH=;~cr-Up0KHW8z1<$*k+;ohEeKH*$xqo_* zS*&*npxg>Ke{kAC2F)e|SO4L;%zIT#glAbmC@<#s$dEJr^~{@iIa;0RMP z9gt{nGk(}Py&F^$bw0IA8|pp%n?%|lL&VaWD7%`1RwhliH^6zh#G-J*khR!4GG_nA zV(9F`K{4Pu42G5!^0+YUqdixy4K67_u zr~<_>m?>AHK`dLHC$v;*!rM4h{MGn~LaxN_M6`8T$??AIU! znfnKU>#|^2g1PZkZRXou4~NMHu`Er?S-qCCY^W>p<^7;9J|bUD`I`Wu;T{E3RcO6U zzwe`*JF)GTl=H~L2bZynRd{#TmVVz@uc%IZgJA$F&F5ARUB> zeCtnT=ve*G__hd$Z7?7MQ!-*#3BTgsiufr$&hpx4&iZ=(%8bs(fSmc|5^Ps`X%E_> z&|i)>%e|IVo1)~g))Hsb(Y+E~LiaDD0|j4l!C0{-Z;)J2W-bZo^En1$>$x-+^T~8S z|8b1$ppfC81y1Ze2MhvI1Z4qf?HvF}STuPPTO^Jb$h!#tKZ!!MB5E>6 z+DYU5&S^OiIm$S->yIH?6*+3=N`G}5Db!nu^ey(5m`_NO4*#YGh`yB7ywt#9f zW6#jR#o-)PoeDGkq@6C6X#$tw>T)=-SHcS3p;Z45dpAAnm;!rAvI zVSUrejtX!6~K396)$#pZR4M*g5t1(_p z-6mCN(H?T#cWU*8J~ZwKC1sXV;2MC>H80L-#ZZG`N@z^njX4>Yk(mogAwB3^x7isz z+bXz=tvn`JI82oyj)2-ah9Ew(!G-qM4UNt>V6)|%em zK^BL4+7RNG?FSObJRhYqEZjE90)dIizSF*A#yz!;sj)wPN5F>(Oc8I(E2LQdNw6hS zf~R>d+aM+>$~$<<$@>PG@W0fs?rg2>PIkyWA9m{}<+~G43jJ@nWBY^UKtflc- zYo<2^Gg?-(zh(BAy;;ch9<3(_164?7s)Is#7+IhUhJvz2gxQlzX&F^^^@|9bIm~5@GwGApOB}dG6Q7+;6Cnj@aS?@$q_;A| zxHn71!=teb&k4c?t9?9P45*V()PE<@@SjEITiqe+Hl#_+3&6I_zHN50I|dwqK|NRwV%xOeXJS^Hp-{K0dH(xH&w7wFs^t&` z#rDys=?DS|o$aYh)E-JFtSnh*!yN5S$wfZnb+8ldPI8Rm;)3UABs77s6w7?iT8+B8*upEI+mBcDJ)nF9Ure2sM;FhfECJEXXYzUuVj$-&i%FKRilxG=B=BPD%y;@*7zm-hJylt#`XAg@Pl zc1Ua-L#@7iV2NvqTcFQQ%;#SS&jqHCazLb!qz(;&=aVYpH@qk^$ftl2{9R#*V7RY0 znFG`eR074W+|_TB9^mtOl=}q8LMrGP4DMj9?P$1+?Npi0iaKVj2Hgb`Py4rO35SmC zdA<*c?-B8SJ?%yVGLTBj$ME(7ZBLl@zqA;>whC5K$Z~_C^Xuo(7p>}Cc;-d WUw!z!Vudds@3FS9H?KbGd+DFG#>x8t diff --git a/doc/img/platform.png b/doc/img/platform.png index 49263851602074651d8efe0f9551350d5365ab12..592b0b70e8e5fae863fbd8a435312942c401ac57 100644 GIT binary patch literal 21652 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

=futX~p_>;bzq{ZsmXH95H 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 diff --git a/doc/img/result.png b/doc/img/result.png index 98ca2bc18e270f122a9026f0de22e01af4863370..db3a1f53e2f41fd7e09a9828452708b3c1ff20db 100644 GIT binary patch literal 24921 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 Z$guNM_x#_s9WOy$Ax~F7mvv4FO#lX(O^pBm literal 22123 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 Ap#T5? diff --git a/doc/img/sign-help.png b/doc/img/sign-help.png index 33299b902fe8bd59fbf0e19d7ec481b97f3d569d..f569a4011a1f4d157b440ce02893f9da55b9f82f 100644 GIT binary patch literal 23655 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 R6ap=T^mO%eS?83{1OOMnHeCP! literal 23157 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 Gp$PzbI4ZyZ literal 23585 zcmdSB1zc2FA3uzU5=w*A2nOBV%z%Q3lyrlLv~=f4hlGIAFobkTNXJU|&`1nO4vpk6 zL%poK`#idfyZgMK|NFk5cfOao_Z;Ay^NVxu`Ng>*PZgwbaVT-n(9m#Y9!n~tp>}33|$khNiP3BPpTkn!J$=wN%j}>6pDK!}I=W_du89t=lHtnb-1;{3>rb zGFW4r#}?KS5aMJx4yv8q`V?M0u3k8F&yiSy5M6>%k1ss*^CERj^7OIyV#9vJ;-1(I zo2|O-nV4h!l{tq<2A9>QsZ^<=@?~U`zIXmJR7S8{yeTU@Pfb2|01Wj(ASJY)HM_)hgPQc>Mv^U4McHody^Km*Fn@O0xMKe{>mcfqgq? z-JG?BGEmARUH-YLshOFlR7;$P0}Vk0W>~x!l<2rVf#MI-?hgD=G`fFjyBGr(EgPI^ zY4TeY%z!`h$QPWQdbIHtxvX-TtJnj3dRJ%tZwPITs~5+sJ128!%u|RyfqVpgv;afn znO+-wP`^F0o?}m!mk^{&a(Tz!#<7nl}@`jQs!q#zv+mqHI-)aZ7FK_#wtct59Z9coJGEV6GyG2RwS@8wFb)E;#w`x&9% z`g6qhp?`H5@Ce1>*`_9PQwHhRF>6l0esw!O%*v`u;c9#C(c1%K*yO5Gr-`4_pQS5W zAK!9=yYC$)tgerD?|KdIYnXe_@QN7-_*Un~JgfkDl%ytRlNpBGF#;4|mZ}#VEYLt% zNW6Kx22~OLd>W{h{b0&U*}6zdF^Jf9dwXFYgbaUO3{qE7DYh;0sG@dhJ21>{OA&?` z9qL~neVA`}jEh%BJe7Vj+A%hT&#&kX#HTFmSTUXZj3HJ%A!>y`Gb?!LC8rmMGGKGl z=Z<8(TOb?hEO#6Oh4k z?~^vfw&14B-;-vx+iZVh|Nh|$7i#G2QReoG3A^1bPMK>_nHE~ICG5DH>AgJfyF^=3 zUY+j4pY2t{eR)_~qWsc1WFqe?KEzLDzvTsq^Uf}nHKl(qkE+95wX26t?o+XgP3~)> z+~lh#Q3bqHdqOf^`CxwepKJWEWE%FRc!)7jQ$Cz+e!RYW?jl#7Ii>|aJW>6$ueGEp z%ia}bjgsf4o9C9vcvFFs;?9LGz}~vwRR(-I76*uSc;Ph$7$tqNA&OB@6J<#~-xFI;&~e$s_@=i5@mW%djJ=G-e*Mmci=F zo+VQB6Z!o0c5!#0i+E*wBc;iLM2VzbLyq6vcZ+$F5o@06GZOIJ==Lq&XL+{_OO-wl z(h?|71(z7w6n)MaY$edulO&m+!7s;zPK$V$I-Bf@RCV_Cz7g8va5(C>X}UIt_EY5I z&mA4D!jhAM=(U$_mg2~~_jjuJ@XDWfGVV~H9k;`9 zpfN0a`lVTEGT`a}`URfXq+P?|y#$W;Nz8CA!-_vTYPu-NrMaH4eZ+6>S%h5h96?3t zQ_Kl-5FZM)pdNCXl5-o=pu^8bv5Yia zqR;g<2u{oH;Ab|ByLop@;UYJ{K>gN$``9M~WO)@UCvWhPt?=Or1Q{0QzlJm)mb6Oa zqE4ZzpNnG&X zBVR&L9q@2fH+xtHjQMca{bpAeJZyQ`pl3IEx8CK*t*K5(7&+llSJi_og)=Zg3R?Vc z;^Q~^ud=f1H4*OP z!i`aWxy_)RDOcV8(NYatCN>*}QsKQkypLt);>mg|pHptYbzR{4qo*4$0S-#Zp7~TV zB5L_u44*>c!{2Gj1=d0i@;o=2YiwmQ`+MFmmVa7ipjC zmrmr)aNEz`1@2`EEd0lsvnxU7Tk*YBi_cNIl~OB(+FMVbR|ZUm57=ofxZJMOd(IK_ z=2ey>b4u%^VDdSUcGi8T2w1WGmZ?~Ct*>*)gMxjRjSn6r+-DzL4u$PWB}nvTsl_cT z+F!H=cSef0#}GulxpVLFn{Tx*{o9*?oM$!y6*1a7a_J}oflkZ{IaY#ZCzR6 zA&iYQ^mQG3@R*W#;EJ9Ei-{TIKC9}rDd=qDG)Y`$#wTq1w~z{!m;0)8cpY-MhpI2P z?0xAm&yQ~18Mqt>Dxbg~NB##X9sG=d^hXC^e($>h~##N~!4ys18%+ z4FQO>%0HcJ6rN7CY>LlsnW7be?sNT80JSg@FGcNrAMcZnO?gY2x12em-Q5-n?F@Ui7LQ6%*RSYK4mC@G zHo5I=H<^MOJa?KX2C0m8rkBD$9Pig@=IWVr9;NAVG=d{)#7J+{ZLPOf%+s7h1x&nv zkqMNIipG(w`{~6E`~~l-u(hO_XXW1sl^^_Ftx_z;EOP_BTpVE4IF`6XbSmDl2fW6F6K13#?3t^ z&)hP5O;h>XuOX|*_(sK+i^nwYCDW&*$lpYj*dD;xU*ouUpmK{HE8Mu<(U4r?O;t4>^`;r^dpH%7l zzladYu=U)Z>nLhifd*{PxYr%9MVoGeEc@i&-efm0_}D0aWSVZ>nhI@1)$*Ok7&M+2 z^Myb#NkG%%r?n+T6Aw=ok3NAWKsSuj#fF+nmrFpH!wsfqTzTz2o*wORkLsi>jCuNe6cF_ro zLfaYbJa(dIGWZ>EtGB;@D%BGG(SKPcz|SwE$@|rAK8=hB#Fg=n#-by9a__AqW5`pY zblL}hQ~;ET?xKf_-ygu@{r-fDwQqK|W6Y?M#x!uT(&N3Bh%WDwE&lUjilWb>G(s~B z%Kt+rY9b$M`ExLJw-qO(?+HDSI;d7bP*@nJjX%DxxaSPuh-&)e3FK&6U06f)2UtZa zN^f|A3n7L@G<$r7$Tgjd>wOd#aCK)D>(~;C7?%j-zwmmXp&efTkY-V-dh~E@cuO-__PFx zCW6DcZ*g$o*?@0#m};aK%ZoUb@ijHpA>)eN?14B=2t}Os1)1D+NBbyCPoe>Z+LYEI ziz@H6WL_^11NNdEn|4cWP;X?UNZAXrgh@ERr z4j456*{qDQY}#Jiex15eG7}N$Jhb`QfaOqw@f#0*u>iaDsL?$HxfB0!O7M$Jh~}=t}7x;1FV3{P{Rg@Bg5?vy9M*C-c|DmhBSd@&seF? z5Ue9sb1)h)SHiW>Tjj~ss^P5#`3T7q)QA1`BjQckd#S4Ip@ZDA;`j2ceU79>iQq*c z(hAeVW-Ix8w}aRRpVcKP_CL%U+aT%ba68~F!nfmGxX)nmJk~|`^Nw=ZQNASYp%mY| zj_PbdqLcpSUh({Kq~emW=Lz#j(RvJj#)7o<=+G?=(zYR(YDZ0J?(*5$BIvfG7qJEJkVH#)%t^L7q`y045+{rdsJ6fBpDg&5sIaf?jCX2QPTon; z!-}IRzvn$_TUAX_TMc3vB2Mf>k1mgqh{a22c5gs3?Y9aT2Rg3*RV+*bygLAK!B@5y zMq%@nZxswNsx8PtKyOpyhu`$-I7*wo}S`SaVUiYro03*sKtoNL1v)l zc>x@{JyQ=Nifw7y6D9+n?;VeTuPA5p(&P#ZcPKs?4N{tIQKadn|LMvB4F*N=07Z zmI30;#N5tQZM>P2yZm-{^m(i!@e-(7Li!6UWSt5FO4nFoVM?G z?LE6I06aUeylcLYzwMbOXS2Iqj)+P)dB38WCqpE5vl^iAXTJYHNtI-p&v%^vP85Sw z&2tp@6iMAoZ7g)=GrFRPt~h6Sn0&B$dtN(hl^BIFN?u>C!WkKecy7$YqbA4=)^3|^ zo^1%{oi@e0buib^Io|!bp__5Olw@!1b4iRLm?O^2gs+A+O^$h1M)rkZdH7xq2z2i3 zsw>&>0gxfLgIg7lh~62C?=m#8V?>%P_;X+3pPeCp@hFOVk>V}s6ht52wF#Bmihp6R zs@A=VEjYdB2`OnjDejz=v7Z#fOcCP~H9-tz=PRYnMZdfdH&j&^HY&n3{v>?AZ zYOeIQb@qtJQ@y;ePo0uhv-89I1aQrG8e(N9W8-s@>Kf*NUYe?&nHEM{d)D+-Y3rsR zVrA*219;-5$dd-f6CrLdA3#j`=*$-?-5R})TjuOi0c9TvYUVupJ&{@ZJMnD%k!O4> znR7skuf|Dl{pC~6_xe8b4(E((_m+F6=DhDs^=QyAq5ks(`A$r~&6po579JBsv^>0h zO(;`NpDA8CTEgC0?eSZU-C3;J=}iw&(UUr`Fg_4FHZvS{%iXr0*ZhGPh8OqVW1__u zJf02$^lV}l8oaoSUrWg%&q%j~T8e2jUdJG!Ufk7Sqx>4*pid%SCM9Sw_X*6!jwkfg zbxG=&u*vga_v;F;7M4`gxcBkGp;F5)S4LM*VG?$$gb2HuyFOhA4+^QS&7y_RE938x>^N@f^enFeEOHf%Cv>aR;Ae^uB9} zH+ad+*avjeYQ9zI+4(56!Np7$yE4-p20BDEqU;spIw=<06AFtltlO_lKHlr3^E9!E ze&1(xovBAHs_f?D3AsF}=={;P#&G6ctH<}K#U^tXOcx9*|0 zLSIo5C7;d_C%>vf65YkN-wxu5rPHBi81M3wriy$YbryBjHn$SC(KUPxs0TYcTL0=f zw%&aFHhVJ3&cVT97wK`n?qGBN0H!0Vs0d}i-IYG8Sd8?Hg+iDhOOYp0Ae%UlhYrNs zkL%l7g8j1f)Sp+Amn^w{@+UMQ;s!RH?M!E9dqG>^ll`gTr!GvLCE4c#od$)rb5$$g zIw?@>(rxvHl{UJE??}X+DE)lF@onk4KSOGE=|U}H+hWel-bJ!cNhsOVq7`=f6~j`g zlu>dR=GDS(@MXverp5#TRk++^rPCv8a@2FX4UYo_;`~#0IjU(|f|{3Lrni}Esk+mW zIpsB7#POa>2}g~<9h9o#=JC@((KVJD7V2l8CBj!iyf#A$D0$p6Wi zYU0+GL6UN<{s$)0fGE=uRd~T5JbS{3Yr*Bf3q)l>*J7ZrA9z5K&-f3kb%^q1>+@P4 zaf2oRrGkCS2fO2?+4SsS@L8?a0Mh9ftOZ+F>csXOsEYgo5J|BEJ3V=aZpSI6#vF62 zCHE$I%p-rdyjER`4`o34tB>3~$x~~K_v^BEP3v=HpRRfyXBj4U)>>5d#)*QdY1)%? z@6>UH1+M6~(BL z_rZ(MsU_&lSWtl9zs5p1E5PeXIkU?Q170@^!dx|Cd=JRgHqvz56r0rUh5l{|KcYK* zL`Z=>KPDnFe__(6v57K87a*^c?ARsKttx8JBi|PDHv1q%mRz}eUS@Tlg}8Ii6lN|v zEGVm};nnkuo2d$ppX4#}{hNY}NU_Z3}@Jv0|2((f{4$$O8Rtn-Newni64;kJLf zswOWS8Fj#av@pe9yE|?G4Q5dYNqIY6V<%L;jT;3@DtQ!-n`p7i!p-cnq(i}Hrz2%t z%t%TsdZnV7d~~r>H5qgL*KPM9lq4sAOM3Ge^7X0060cRTFRk}$w~?e} z-pvZI{EoGp&SggGe{U;ZN*LPy4==$&Fku9zn?^?-r#^o9(NQl&9%l`q0d@b#WVqzX zov5YGydz?{88IU`xBV@ej5~gyN#&YmkGp@ehX32qH%ocn0G+M*?j=wXX(q()_M7L~ zQR4v3z-J>CXs<4T#f0Q)A(hv+geY$=nbN78eQGwTizQ^ZG7n#DkkTj{Q3`)M3>s$V zm=3RQwx;E07A5I-ge}`3$kY$&YyrjB4LmYgB>&d7RuoT@5|q3I7Se(i;p2Pkv%Q52 zI1iD{KK2S?KPK9Jrk4i@joiY3!r+J`{px~ zb;y!`kLBuA&SrQhD7z)^D?7js-(?sSk{wuc`?ZPLDf0zFi3?rSdKN~)?D@Sf#@`7AHE-XMgaq%v_J;RpmmzlOfcR!sAv;f z-)u=hc=6E-CpWvE=wp&b@!g5qFpZ2jsmn=qUAj%+bug$ZSg91cdziv(HM_u-+ez~OgBdE=V zM<|977?k7GFb6z;rnG8N1ktIR`o;aU0-lG;$vWF{+eFrTg5S z|8#EjUlHS%+vr{H0%VINksvT|x#iO6dxWo4A41)_4Zel%E1)DvazapdpL#z)_*1)y zx*B4A712|F^WB7&)`Z?^Xzog)7S7W)$FaLH?ajP++`ss(NaTN#M{dhYyeX3E#btPj zL41ij?pGJxeiIh&4YOMVtZ7=}<*!Vx^r0tS`@Mqd#)=Ej{k*4V_Wmxsr3J*YQ&%TD z#kW+5JV6~JWSwQ&8$(Zb;5O%H%!hl5O>X;Y8wDCA=WzEdlxsRI4fyNm60~nmX?w<; z(<%;XKXI3a^a&-iGYU05J8N*3JgGO@n{tA4X13=w+OiDQ&HPF&(DC9rolY*JyCt)UuZhYR=CIQb!gRYwO=Jb3XqU!4yd1E2 z{|IyZ$+^d$Y3naP+TCvX`Q6uoX)Pc(QjMk&AqCUQ&dg(I$~n3oqaBMsp!Tr%NcCP_ zx#x>~-BF_LjCtKvuOT7bk9w3-T{hqoTjXB2xoiF>Azi-J4d5rY=o+O7lLMI|4JK1x`?!H|Al>r;#ndd_}Tf*T*GKJ+=JwtSloD`KisK zqlR3-%PoQag)pJWrSd1tA;{ROh zb8d${qxPByQ4t|3B=l0l7G;5RABjg&)EEsOU^E9N@v?)nE+=jlfR6ipTbdaU_`?y{o?Wxyc@*dfC?ppe_ zT%)%vj9+W{hc8u46%eNSFJ;~EDjHf6$~<0K+%~^ZpSC@iO57-}E9|k>>--n8{E; za)%r#q-*G!ie+PumPif?N1sjE#$2X=vLLlqow8uQI`5qWi#_KxcxWX$y8zp`nwQ$L zM!e))oE__ze7ld!&sJ0qu!VX^LMQSS2hqR--_Oii7~VD-jCxwM9PIei$cgS1h9 z{IOUXh-zyiAU_zv=hnm=Wjv&=-Kn*J!+^G8FI2Tw7^`M(rn~lBnY89zph%FXc3!uZ zUapFUV#~t&*#7bLPg*=0m{?{Dqoeo~Ulq3-`n@^ou_(W2u4-4+aVtKgq~;W?i(no6OSw{s!bml6Oh-Ba0i@X4TYt zat^76h&jjpI=9~8b5RwbfrPccY7C?R>0>J{cn3g$hlS~XwfV~2tDhE)1pSQ$n*k57 zxI(d>-PcZU?DAO_cSsW&0GQ$NVkTbg`*Tr$Tm0cAO-D!&;*lznLe-g5`J=-}x*wIT zZ`88QIwg*Q_jJZjs__1H6yJ?8!kPf@FP!<2Pd_iY+g@oP?>Kk=;x)9q9TOV5vp1d- z;hb{%5`<`i{G6s=DXw$+K^DLF@vBI-VBV>yb;~itcKu^WQBwsS*9OkQR)D&t;W6fM zUY!hUT+f8m#uk5uOFtCKewLDQ0+fMRjW4h-3bl`PpWs?#p8F0Xv->@e^*07-lS_7y z(GYv@ey!q+VVfP ziZxgLu__L=zOd7x!9u!ch7_Ik_LPH-f}kC(Stli_w;SYPJx87=>`odTl38Dlj)NTS zoMDL&pj%9B+|JVa@rYhZO;DBA1t$X9+;?e7#sGei)D4a7Ahj|=ql_|Qs2JE*E!E@Q zr;qbrzH&N^OE=Qp1MMN}-T85haPaBC!pJY4ATsMjgHSy(D9dt)PAhC7#?uh#zI(E$ z)cL5QS>7@{&%X8sAySL|{5`bt-lV%nL-$^OG(;O-5OnZT$Gg2QwP^!p7&;ltS0| z^v>TJYXS;sU}7^uyh{+Fb{{b4+ob#K{!GD}$kwUr_GBXHL`YS;zTBc}2TxS41?$V< zD%JaIy1n*zMvi*ZA4y%PNwqsigYVxkwHOXEkT6HPQKOjr`xxq< ztVUk+2Kql4E#IV3+af;e<$CTmIotX=kL>JCH}Yii?BU&jc{aceu=`wQFF8 zX*9p;EsE49{B!M);9ti0V<@=cD*BJ6+aJo^=;4kqpPcolR*W2G-xP;}QgigyJ5a0o zpt16UmtqFiVjhi$2cCJ*#F7ERg zYQRfjuZ7l7-vL*i$*IJ7F@V{5!DGu%UZ<{yy9u89Qoxcvi22&CZt~_HpS<3fl;`y} z)5dR}7Bnvu9@o(5bo_Tr@NVw5ekO{B!F@AXupC_HejO zl}q)N{2ge=aS&L*;H)WS>M<=*o?z6oG{Z{}*(H8|PQ2O2|0*^n5gskzvEUoqJKriY ztNicdFt%q@KF?>%E~tamdx#lOw(gR5(bE+3>hdSjnu^(BhDD9Te zT15~+mQtU@>_N^w_^ZS=*A4^=UnqLi3|1Skggk;pU%l_}vGbu*ujA;%6L0$Kiw=kq zbaJyxvGS2~;J>5!VR$QSbGZfYoX#3-k3p9`RKI4hI zRX>7zicjcx_y`;pWU;0=lG)O0el=UFXCe_K+>Vj1!MpaP^gct;LrGTMQSvorUI956 ze+*QL`c?waY%Nm4g-Ls{T*gSRZsG>d=hg`fi7M{hntog!SD~Kj^mT3t&UBV;xPG>E zE|kz;(}SMX$vQrGb@(lk+XnCwnB^x=P%B-yb9O8VF(Eu{lq+a+ z=IH&hdAR({GlTA;ZZUk-+c<59tI5xBG6TUy6UiQa-8HP>>gjJY;+6E5Yl&oL`e|-H z%YVAKp`TWgITKZS=bXo6OP6;QJ0Z^{zBY-X-urbCFA7i&%a+Z$v%CvoVXWzG2mCWqA={eM zvY0pYzD*A8Rh{Qf@4=|I-lPy%Guhr!q?h4F8pRUpt>xS4GlYvI)r|C#ghRL~W>`x5 zND@Ad7maMBIh)H8I>zxtK?@&j>n;Y?l&@NZJ!%gFNf~il+Uzsbaw`^_xN@wd^cj(| zO*K_IOl8x>(*xT>fmsFQui7i}beL}PUSR+3brge#OZ7Z2fs~zY)zpFC9iYz_s$k#l z(0jmYta)GGFPXu2G6vM%^k4JXiRSIfHV2ym1z$w3zTnOS_b0*^_=m34QfL`LRPEa z`X~wAtiqsTNe(d`wF+;WNW3ETQT=?rtA3kypZsy&3PWP8oL(|99VEG_(cMW9#(Ai+ z&x7I&ZJV_egQp@?xKf{!x8=ZXn%LKNy`9WMS*7DR_MSF=s;-aspEmR^3N>8hNI0^& z$ML?pC&G5&%~16M=a>C#euGYC zdpu7Y+8ws{)C#N*HoJ@q`Z=lBO|{lL_JkYZ#-crxk%$8Crrt;-1vls(;NOE-N>Dq% zOd}JMU+|}P+kdROeRHAzko^M>{`W!y?JJ-SX-4KyTTm7Fyy0NIEy+17*qIc}VZJ|G z%cBSVnGyNxVB#(!td|BIdMW4Pt*6-em+Ia^;!1R!6kzAOc5Cvz@n0E-z0`MBkq=*I zQ!(mAQ|+~jKKBmYJs2!k&l+@uujyTIbpctRF2+jwnpVHShhx%P1NH)X)#lA#&Dj64 zqZjWlvg^1$0RAlEH(l*Ujsu5cfCqR;R!D1CiaWORU7oZvhCZhr0Q%ph>rUV*T4$H8fWcmpz&Yc<6lrxLxxqM03?DmGQRz7(xh(hJY%DUlIN(5U8JeJ{3Y)tl<1 zUpVYpc(EWe@IXm<21EH;|3_cV#jXrj(G>P^n~Z4*NU!1twTRx6K-7*MZO%BO8jfo5 z=#?AZ!9kFQFJAhMUf{TjFYI-$H&gbWhL$f6F_t{Rz~QT#60O{7oc5tegavufv~}n-(aL{+iiG0ED(afe8pI>SmK;?$8Dz_^&= z)i7<+)^Xg4xWj6+tuY|&KEi#2p(}pP%eTKQrvm&WQj~IL0#W|R4Ib9X0coHOTA?^T zcicUtJfHF`ySytg*s@(5YDgYAw1dHvv_+CP!Y4{HqE9Ild4{Or z&#IfqBuqcT;pem3uMauIZKdJ%VQmZx<}&Z46Hk>mnT<3#1FD=7J80u?V^IDLP-_G~ z%dU4+5v1>VkudaCnCabkL#0miFQ1(Fq&ZSdy~W%MJD26^h??jT?Vl@mfYi0cM{oCE zsB?bMiX2JSScs%=Leu^jlGRIX_Jlo#2^{^j!Q_&;h-f9mnBWdg)3RVtew zeO{}FG|z#b8!ZhfA8*i>d``To2vF9qjFY_?~=27;H;L5IHtW$MmR}5 z-XG0he%1&Qzer%dEJJ+ZDNYC5t#Q>9D9O@N+!MG2SzE=ycCBU*WYemWZmHQ*RO?{)@Oy=9ekR~@=-IaPUj2A`XA zOnjcRLJ|=dH{L`Yh8iWM*>82<@;pD802v*uI30e_-*NX+6%(kyzsSIxDLFd52W&N^ z2VT0l;u6Q|Z+z;Y#Oa9nx^^>Lj7iV^@NHP1o_D$_jhM%i_GR`aU1FTv_8P-1^Z{xOMP%;F60s_$9n_>e(g*Hzwk1?^clSD!uUZz6ew{=EVIo#v6m z*giJavglJXHiOZz)k@~lU8$9=qV-NQlwjjDKmO{^{+tq6Qfp5GK8)lBuY4MKM!xLU z<`WS}cidc;H`Nh#N##x>?dl7AXQOo^7RSZOatEi70UTY)BV@OSP-#6O{ZOZ z&wYZW>0n>ymanFUGjJ!?ncv}J9&lj?6;rNL+RZzK z)kc?Kjl#vI;!JxExZUg!qi*Y(soL>x7c-dcp5FkEdfAgyfKrcKpJC)fx>f?AOEb-c zq`CI=RFaipIkMV|04pL0nT@xL_hYHIRDrnB}r z<<701TMe~0(&Pceu(QFUAgmGtCex7cQ|s#Vx{PT};~2V-w_LIOLRwAl9-ljJmLJ*@ zgpmBG*gud*e-)PaS3UW4pFbgnyQLG)GN+QBl zjHNWzHoMC5ZVo2ge7wZMr_SAx%Fek??Ez>YkKE6)vFPf8u zcMTcMz@yphm2zPTfl__SL>b6Z^Y@x(*AW}(KiNn4>;A%R<;%&Uz(B2(%H=s&<+sbH zSgEMPtMgb@fSF2;&g$}PY@z)H7Di5ysm`W3OvNijWBlPjTkjM-s-8URcKMHge1IJ+Gs+q3jQVj5sa8=na3c{=aB4NOF{h$a&! zF(AfbQ(zf?)i2xgO4@4N7h@eD>TXSO**gglC3xJFOCBE+t{4Zbg0nIau8!0L^~*jojB}smok!Y@J50>vOrtC<2Ly599}5RWr`TT7gqpM* z5^iiM$UMAw-2!iJ%%dT11J>S3i`!x>aBWIs-XOjgq9t!1>wxYWc@rH44l~e|ZN>0W z8TH~LkC3c!exis^V~S3{-Tu&4+MmDr!_~>j*gxY{7y+R(&Urka51i62xAi;$I|+tI zf6{-es;Vf*lrBss>on%2x}vH#L;<_S#RsZ<4&{n!dnx1=AJrF0Zaf7>HW zQ;Qycxza|MYYL*Fl?UFWx(lc_TqrTTdX4fQP#byKGx0C)H2M8y2|sz`2_jbf+;BTW zEitGW?WQ!P8M}C>Z%p}X{a1)DTPZgr7}81Xi0Uxze#Q0;{Os_+Arap5itZy&qp*QjH#5QSj-NfKAgx^VkjZllJ%n$*{=>%8*BJ)oTR+B2Jv+HO9PWJj*Q zex015L*9xp+tKuR-|p~?;DVSJL%n*PXaPic*g^geoA1uOv3)G~^I|;xoM2sTb;tp$ z39Qh_TyCfQe7a+3Zwa~UY3$v&5p?+Qc+UQ?rN#^V^EUp}!$p(1+ceZhR$)RrH4U;) zD)lET&vjC4`0cjdOjuQ^fo!&E?E1-#ZiyYj%MMNd)i8hUB3nifjWX@Z|8$^MUKK+i zlQaxxLUrRuqwpoCWRc}+8pMM4^(}@SjhPAjHmE{y`;6<(jVypyB@i{Ls6Xw!HxZnW-p|bnK9=Y$@ZU_$&M8`<)NuB~=TC_-bCe z#DFs>k-M`gs=+^&vFR|z!N<}Y zGud=eT@Dv*@;(pYyClxu5iTwg(82^zn6t$RQV~pUo+H7_u@(HTD*KEi!lQ3*@UVC9 zz-2JDGqWx(b2C8%Utcn5Mf6GDUDX|$bNDYL5%btzT{o=?k@3vlav`D+m846OY0WTd z*?lT61$(JaD)Ox8qgDC~VVxb89;9~D*v2>$;NJP(+}^lZj4OO(nK0_^3vZ-%m1T0b zL0MaW(pGn|cArTmTTE7rR%%P>*PZ5YGh+jpO=R+oX`{%1XuQs0kl6L-hObjJs&wt74~KKhvsf*euES z(y)MD3{K**ROjNyX?pMH?~#(_RX=W%VrEyiiwb?Ms{37)3OFiM`AL>afLSRyOO`!q zx!{EFcz1U)Lg2@wZfZWCvyT4TnU%PKSI7^axuY9#lHjD`1hDJL+YIFC3%fBp@;Yt} z0q&>9v?bxcv3$WzEBnhLfz}Ddb3>^zZ>gqe_};F@#cpTxzMiD2=)ZlG{_$AI$Cmau zFF&ex>9?X$ocl_Gr#RQS$OND(c~~pjPV&oyyOtJ+eIx^SEq3W1~ z;S^!XE#I7w=c@LvAK}hKcz=#Q{j10eOh_Dm;aM10d%U`dcf$lIVqrY8dd%!rQj#F| zUlT-rOYoSvuKkbW>ZG4ztONwrXcx`9+Iw@v*}eE7A^$&_MieWJ6n_=$ud$PoD+7uf zu+k?whU7sz#GM0KDi5DzKfuwO%!=@R9c;w@i^x|6Ks`puy)Q&k1fN)J3Fp#c2z&*D z%hMYDTCf=y7*Hw6vrRqHW-S75Q-g98@BL|?!6m6Hm*pHeQJBp(&*=z`?db^8=fLe) zr>nL>3z~Z(rdkYmH%{`P^^pk)4QwC55S2Ro%evSvyZ(DP@H>GtpozPfBHWU1Xe=Y% zYSkbnBK))t)Q-1{xR1GxZg(_`ExFAjxXLA+y_|?Tnr~Cz?ik!_-pj~>zUIEE6~R-k zJtO^(BKTt(kJ18CKwy{oZQK{3yHhf*zDqSsGi!*HGEQrj1{h{ zjukCvj9GH4x2{Rwwpn<0;r^|$)B!0*gA|o+?|Qh7Y?p5z zMSMH@qqmQaQ^#gqi1Ge4A{^)e=-T2p%&xGdU8{I?YvBLk!iq8ZcWRvSVRKbOUMho3YJ_1`pDIfPE4(@JUMA&XGt!q#CQgp*bSrc8U{`ufhYS z`9)T<$fpBu`1wy2_UiQ_?lz|r_V>#SeVT||8$auVt0_u9eKlG zPz`VP(BTF9AjCzk>f>WaH)nyG4vfi5QM-vjIVUbifaibphf^k|e`Z$@tKQ80i@d_k z;iU=KA~mturC6yXHoK*=1d^kNon%IRE-LRw4@|$ zhv4iw)a6f<{7Bb-N}uuO$di-X?g2_{w#}I+XeakV4-u^Q?nN6VZy)^IVZ02oWgNh% zKra$!`QJ|>90Pti9TrQ?iCXonV6UU5QJ0kSQOj+FgOgW6>|O38vG>No2!_eMGMeMk z-ww#>6#m~ZsDs0Q!LLC?-JCqM8Lf~A(}hd}lg!|Ogrhydv|b9p>%zuzf&9`Ijk!9R zW%Cp(pc$KX;LSe26;b25J>#lcGSK_n2=}_*r)Q4=W#q|r$&rXEa!kA36P`!1{;^nW zgxdEiB+Wtwh|=jE{IsHwoiN`v_fp7JH7lid%!{_8kRm!C!OQE%4EhCCl9Tm%=xjc* z;<9OU14L%n6&Tu=7pv(1zp;^Tqj|YI921oD`0^Z|-yXrtn}#*DTmIch|3inK{9imm zwO7;1dkWU$*G+5UAuknLc&r+yhdacKL+4b7{|g7ccagc{q`3&y17{9T zyC+t}QfnT0&3i(#{&_Z?>ZBFfYR-LVHVkON2_nT~0jLWW{vWQ0m{1o?JhvW~Rk-Bt z_T#;dbS3-R_hfy$#zgzo17+`_*I33ObZ&4uk}Ugw?cYLzMTNF56;in^<1cFli4Pa1 UE)xI005tmV>FVdQ&MBb@00c4Z(EtDd diff --git a/doc/img/sign.png b/doc/img/sign.png index 282283ed320b517afc139776e156f5efcf0bb8f2..7cac225a0d815d2dfaa72b6f7770c2ae1c86edb3 100644 GIT binary patch delta 14197 zcmch;cU)9WvOg?2=bWQt5F`y5BnQbz1_2cW$sm~#MG=reI3$srK?KPe9?5w?G7==` zFk~2pc|rHtb@#gWcmI03`b?j$&zbJ(s_Hpi-|p$HL`iExdCvy6daSObVCb8&oigA= zXH4FauUsC1Ut(@HVOd+b8J1alg!Y|Zq~ZO2=B;N3Sm;{1VpgH=nQiY;T0OPtZh7y` z{PBH|Z5Ze)$B!sf9F!1j>QX)@GTRNy;yQm6#=saN1s<2btWfab-@^YJr!&~P2VG_W^Y$^qdCZCA@EMV#qO%~ z_rS@4bD#5A_0vEDS}?-zt5j#7arA(wTmt2tWE;UJPwWSV@c7uY3a9C_wx;~Ay78N+ z%|mfu+F&p36Jw}yBJ+{9;SaQa$@{l+{+q8#qJ{|2GgJ?Ns9O*ogZKgK^v82nDO?|% z9)M0_x&3lJB8c;q^jSD?%ZwbhISQtmDE}p zh~cDosBIFGhlgbeT5naLBD~h=>sJEwUJDt&STSZ)5Mjnyx1(CM-usz!wrXTVO@+;O zPloa!WR@EJw;OB}wHRQH^ostPi{4>F0U--4`9%%2x8Czzod*r#dv22|+;n25Z5?ve zJ%=dn)K_w+hjuu*h$(PhedoevZGKS;lW33HBF276ryx#>uII+4#{6hUC6M5>gyM9{ z!4_Kui{y2ZB#8TSVRB*GMh_yzEGMtwgY4{ByzJ$mk2X+7L<=sH3|$IiYH2bUV3RES zH1yKQf%W!51f>MC-WQN@N|2B^E`=Cw!vPO{*?WyBI`@7V%~~q8@O!YR%cO;wf->6J zoQZopAumTqS4{ewk%1RrbN^J^T7_`<$QD&Ts|9XJGpw79)W>yoie2 z0apYg8TEcho;=`4iwB;y4xyCC%fJ{ybwH`SWp<1I#jh#>%F!!hYd_)Rnoiv$|8ns< zMUGK7YB4ugc&I}R%r z*TUpJU!@?tsFrF_ZkM*| zF^i*47DyxsRfi`SH(`4yj);{Mwr1jX6%@JYW^fPvHUNWP)gujxf0z9qLzyL(m-9W( zoiG5CpNuYVe1N_y3x4hg>q}wl_c@#m+!LRNmR=>DOXuwD$l^~em^ZfE(B_;q;D*I% z^1==Om76pldEBm%SN%o+IlJ|J1&=G~ysKw&n|E~vP6MRp=cnar&l`>hHp1b+d^!i% zYSL+cfAMl{w5iHIElAcIekNRfGhUIi3PeF)K>h?AuN4K5#pD1(LWm)wG(&`PlJ(~e z-WOB(PwDL5l}VhOe6`sWu(b|4SKcfc87tL+Al;8sedaa4ubSUte~?*@8*fyQVDZ{9 zekV#NO>?%&7nFK_WPLIX*R)~$pNbK|@F&6emr4I+VX(Y7`Vf&p{v$Y3U{d`d|C$Iy zPPPbXWS2(#?r46++WzU`c1)fm-G&&d6ogS$0+OsGBU; zxo*kr6-&2g@mKg^W-CZ}-2AsrcknH2X7Hen($LqhoG^2LK;1rX;Dy2MFB7Ys?!5p)YY&lMMnx}f;r_?_HF`36K%3ZOLoPfQURp{BjYlrvEv`NO79lt5Z z*-V^GJZ0EDFokKR*(f4v8#KQ{;0#}a=1zLxhH4rmj;1*ybR&Q-T;v#BLqXRzwBe!z zx5gcZr^AsCI#?k^Vs@t?8WJ3#bqFT&!|jU(6xqaeGxYu|*=vM6K^wqKCJ>=>5F2`y zF(qH|4~Ca58lntw{In}oEM_;RGX`GFA7~n3H}L*NNFbLIcx$E~g3Ke0K3oWw^dWSE zd&w|*Yin0M;dx>M${ep7d}_I@99bEjG`qI9lL~-Uji39>JzaQ`?IM$3zVL4D!b0T8 zkeae_sgTMV40$RYgKcmqY7+fOi$6B~)7o=QSWrQ>i|#X7=aqbGP4^5YeRX9Am~`-2 z!Kk-O3=&HL80KaJesE)hCGUYWY`C7_zcB#5U7AOC5en^q?tasxQ{5%2^Gtmjobpa0 zF$JqQAfnsE(Hr>YPaUI>Dn{9O2-1G&-}7|lm1;M^K=inhfO49p6YKt~@%5Yn5C^*dv4ZMy8Da^;_s9+=_}^Y=3DG- z7c;Ge)a6rEN08x{19{!y9KMxeIB$uEs-JsmD#$KG_g{Kd2X^#hf3{h@q`g zqpKK;kJqPfU{5hhG?N>=SDsEc2xoK;cz&oxs(-HTmyS%g<)2=S8q-gCIg4ByYd~W=A7ka;2joI{h47bUodO%3Sh*AEpXQu03cv z7+-m;LWejgrnem$HXg}w+!uoftTHccKY1?2G_cfwtkE<0l|DZBERHbOoi;}O5_1_7 z!G2FYG#2|di3V$&5?8n`phrZbYR?t^KIBOTjRR)#Z^b$(X1&k(IHH(P{X8tkqL*jn zQpHcrz%GVkYt42%`rL6m&{S@~OsmMb20YXu z0k0R*t-p@{L{#BVL2!Y{B-?vlQEg^sWi?o2G`hz`xMyEBjwHZ*^>zQFEFqx|L(<9F z=;+LR^zlgXv0ZbrsCC72xpAF91a;O@fltILLowCN?{wDB0#J`c7%63{* zvncppf6EgbAr2(Xd7b_-pmFGb-A=_X(FdjxCUUT2yTHXIK;y(%>R;l6$?kzzr{3n? zr93@NfLKe3PY{+@^B~B3#xGB<*4fPucl%x!?`#7vU1}1Sdz6b{;c9ZQU{=jf(-+(a zIU7?K<2^tgwBh^I*Y+)YXV0~>s*0Mrw5r>TYx;?5qSmL+ku z!nJG8vj|o=r87y$`w0wwvJjm2U8e{kTbfQa*2x*zI_KvuGQX6a?kjgPk%WjhdV7-` z8Y#(+6qK&hDD5%nQH&vpv|`;4QbtN+Ufxd#10>^^XK1h5RYASN?RyI3DC`j_!lk%^ zDxxQOajl?y9x6d=8*_y50sn17^x~|Sw4zd}i-!~+B3YSk7iSOBRKJyv{I4_-A+HGN zVUmF%qu57U}5&OvK@p!5;jF9XB3BfGVGTt5Vk`+;lyua+f7PMNIV47KibnSRd+9>E;DjQ^-Q z-I{4@*jcys&JkyiRvhQGLD_|MJP)5cehTn+Jsoc;$|gDD~lNB z#uq|5(W0tRN+-ZLOtSM=zdMgDT-}}Kh;*oVY=HRe)nt8aE*@aMkMf=eC5=w#cMSB z3rf*61C+j%DZg71rQU8;PQS1skx_NPGVA5!ZAWi{ZBA`c`-zxkkV$uxbuiq9y>Kb( zH1JE3)ym#A`@^L$E)QQ=5xbtvUrVb%COH+bONNQ=b*-iwm4L5R!pL%<8^ar5G)pX= zOwUd7kTY2obIS}P{NnM*JNE9*AHCWNa*lHm7&zUJ7P>E;;+eVjLg1|Whs-lfh6D66 z!VeyvW(_ms3z2ykoPuZ$);z-fAH-{-_J$t3QjA+z?Q*k9|$j%^Aecjd?34Qr%T_7GR+FsFE(QWDZ8;X2`W zczmh?lTtsCT9cnrZ2Pz^TfJdUG?Bd;Yf;i=#8~J>Yj}UNVC_Sr)HC@fZ_-rS$YcvN z=-Uy(?_WH${UAXVCF=S1MGLY>ct$lnSeEl#Ww#K$!ZCERYyBUs`*`ObMUKU{U`jgfemWHw?WDE&=X(x*S`42nM*RcmOv_bY2L90_fr%4Tey*mIe2^YHUDsz1z2n z{Kyz3_uI&*{U+7aPJe{8u_XQ+9#BpxBA1FKXVTx#`p7Hra1Zj*&if1fc4&PH-L?O% zKdvZPm)Ucz{)_Shk2mPdL15clq6F8AU80hRx6;7TyBXsB9pI(ny6zW?U+Se>v9|Wb z!SjP3G2-B>0gq1*U~Aoe_>@WW8wF+Lv6?C=%%koZX&tDgb{zAj@1o zo%WG!Zqyf=yj2wI-qb5DpOL+@CKDMku8Jg8E~E<#3S{Gcth%2ri+(wD1=}VrI(W)e zTN;dRx3BQ{>qFa3T}6kZdIVX27bj(L^!7?*29J9CoW@AE79aDx9!k*ZihWR7c9>2x zwGjrx6R*IU<$?gFv}Uk}Hr3NGM)&P!!Hh%MTWtZUo?&1 zK9??`mqp!M@__pA6a^Q0ppM!S9K5l3dDJ@}*>M4Fxv*8Ou?ncV^Ze+F&NAX%#nV(R zIWY3j)p~{y+Wp?jUD-&P&%m*!)*Z_fM9Id7g|5(-kor{+zwJ8jmkIyf;V%)A@w^Zi z7vPh@(vEQIh{X~0*DslIn{k@?FIG9pZ1jkgEZ$=L`%fDr z&-uH5=TeUb8cgvrr=19T zv^O9o;Eh7`_XYkZUP}-n%YiDxC)mkjm6mFZ7bq1#wRM47x6ZPc5K*l#FP~WoU1xb@ ze)5H`v*UKIi_WbKwA%WshO?Ubx;lvWW^eR76|9iwTfPkh^$*zF-+0`5GuP1XAgyBe%vYbur zx$*V_=GQ!MH*>_@mzi5iTRV|$;&>bx(6A`&|-D4KdkdCK|VrwjlSH#Vw|KH!Ez zeywpFbbruCZNR#ysB~|>v+J|(F$`#_;IorVZLjyHzTZhx7IWvGOQGP!G6giJyftSc z3MC4mPOBUJ?44bE^l;qh6q%glW^7gmnOr$t8f}O@P3MdHby>+QZEd@~ou?x0?-qE0 zstFlWkeGxzdilFqIB?WNn~;+++Xf;4x7D6q(GUBxkG;{mxjGYZz!_W3Wcdl!Q#Xp{JP(M)|beH`7n$h#%)S=Btj;8|CZ4ckX@`(6nE9yBMG zMd2HBx4DN0I5U4pGz}oPlTiU=)zy5oT!R#(3Tld z*WLB1T<_@fe1~Nm~qGYXm(5X>Xn6 zn{PeEKIe6rAiEc{r+rDUd>Lo0gRR^gV86r}$_h3%C_{u3{bK`UwgB%P%Flaw*Y|~= zoQPEBoT=1H19oF4IV(N0(03x~PyzI(l)!!26BUWdN8A{gs>rvJ!L z%JrU5AngrW0Q|*;uJW3E9lSlO;6f%t-3jv=t=!Bf8s~fe{{3Xx(gQxzGHyH&3Y|8F zxID9q!c$4+DjEYfw;dXtMUj>@OF=DwW~otwkrBBCC}1+1mlH!+``OCQRW5&wi~tKW zi=`{uDa!lKJVI&hy#cnVO)=9wx@fOr9AZ-qrE$W~apZanQ}PJ7)D~-!B3+UdA1@Cv zlzBW~U`{qCV!D*0A1vuJLUzsH9wK!BhGodH`9l)qU9~b;fMH^CaY_=%mxGdO1EC?( z^eMLc?Ba|0VZv2U*ih8iO&}=|)?ZC*$fDgTCd2JZ#|>2`7$~fB_pN?41iooVGvlUR zoTEMTKSEujDxk&J2N`Etm&K=RrH3_31-b3L@LDV?78F?4Wv$Vb??afNEh%%b)-Zo3 zK~+JF$A$gO2+q|=+h^@&foI0#QJi|P z5<)Ug9=(vs!ZA{1ol>I(WgIe!7OlglivsjDUn0Db%Yo(^gNdKp4OIy9V-BgaxG&u6 zrY~RJH#)j1j?=IC^vR9jX8`qz1Z_ZGcnDtv4g8Ptroh0wSche=wYif?!uOtm=(Ei< zJ*wV^2gs#G?oqW#AhN*`a8LKV55etwZ(b-ux4@#-cpS%296tHs|M#Pl(#CVZN6}Xd!*UmEd0_S%bKI!sck3{60z=y5 zU@GeMrInr@w?@sN^OL9UpYwIBF1Pwawp997JU}UxvHDvz(R3T>y6G*!^n_H-C(ypb znhCIgY-50Mif1H2&1BF0wi@JUeMh@cP4##Ad1T{KX4vQPIU@6brq(Whwmqn<&PaOx z=ca3^dTykwjqM+T>**iAR$&`B;B6ggg2x=N;+x~@S9S2f z2_xR1AgSkLx7!WOkV##3vMr3e&9aEP6F($)EQ^it*k8t&KMSl8U}gR)MCyT(bnY<` zj95oodYKNnMpqB^MV`&e8v@j>uytIJ^+6+A$(N8Mcvk@l@GQUGeHE; z8%^M*Ke%h~z`uD({(mQ`WqII_q{=>&YA){DaB)v&`eVwK1-w$+t4l!kan&?0?K4aF zF%2I^Iqxxzc_KOcTF1~}L|Qo>R)gE}UMtIzs_uvE>?L92oM1>xL-Q^~SuM}L+m|xb z?l~e^Dj|0;I^7d6JB<#u@_*}ZTjF}DMxE9mPNS3jHq197!oF^=tsu~j8_{-V`WZGN z>VWoBU76!=flMh1uq129oS;LtJ5HVZ{u7TYiaC#^%~n@+Z0N(PP`%_w8`7TYuggi5 z|Kb_&h|3dsgo;J`|Dbv=EZR`CKTx({Xj@=Dgjib9j`91QFe;ZRmIidN8jO#tFRMb} zqQ38d#SxfL=tnBy<6)FnSuysLcA^VdzYm|C6CLP)EDd96wYa4HOv*>U_*=CSq#xM)_?3t!Z9lVdyxt4LIBA=81Ai()hBuso5)>YHpxhFybe}clwm!a5lgld* zT&CSf@Au7Nm^!mug`^RBus;gkus*G%HzHJ(@?_GV3O?vhSi#mCCBx@VgS|tG0;5I! zuVmSPM$n4#2hyW!T`-k($-qv_^qCxLaC>_s%JQjcwWxGOWEACdL2`jc2rx4kXs=q7{ zx8q&+UDyfslt!XaF>`4HGDAHp6+>okQ1s3?o!S%1??_AY2@h=Ui3218v zos5a|igz5^uS}XLnZJQAmgA2vCT=~Zaak&TyNXk_mZ{CBE~?!D*4d?JkTc5)b_mLm zt+J$LBh%ErP30p~xnkN=xV%_+P&lDnt{>~vS_f-8wBH&x?n^blT8>O?iC>szvm`Mx zp0G*PiCyR}XATb=@33AoNZ)MjE`NFstgxkL_vNohZL;iT2aiINE`U-7R-lCe7d#pB z+D->-3v70nR}Yt( zfEEqMd*%$^r3+aebT1kdgp5i_@mJ`veOOBnA$^vpQ!cQmR$RKAT#uqnEw)*JG>%G2 zPfB>J({fplzt?Q`m_1hFT{QE-2KWL!J2+OgJ-{UPwe=c6uby=~y(D#{B)?BpHY`mC zZQkLWQFF+f={P%BWlV?W=VI)yC;c3?SU0zSP5oGGBa-D_($haNj6GXf`Tp3KDw@eM zenHF^w$-;Fn%0c8lBjO|B!}c_bL@L4_C4#P>NCmo$pnqxre`lAvOW{g>C6RLykV%lLPX!SSlHZ5z1wK6R;Ew5e5k=E5YW?g(L0eC z2;ogH*=yUeT|Qk1UQ*lVi7-E}>+J*=fBlq5K49V;C~YzC^fNVe3~ako*V$<_xg&A06@j%|{-%5aC_CQLjQ z!KZ6*D@gCWh=~r==1yn3ke%tfEJ$A}O4qAkyLn@%C1zG$ij3 z0HY-bkhGYj2ujE+(f5_Un!#6BFFoye)-Z3z2Ds2-fn`4Y?5u%x2wCQH#qBPwKyIyS zd_r!G4)d@kZU@lOU8#tn@88Rp(_(AetnM^^PTP%PSUa4P8}Rb>-nrx}O6TV{t8^I7 zQjQ$Ye`eWUGWheC91auMsJ-6wAnLBvE+-*z?`BotyG}|>tw=zRIs!YYA=WK1`wX{^3 zuh{*?4>~ai0%9At4&RU1KGVUxKHbuJ5smVeqk;{SAl@)JdlSzyDCI|+Tn0vbx?Yp`N z2aW*{zK{yOI8n@Cyx(GkZe4&%al5zWsZQ5u{MV;c7`MJCiGVYW4o2tXzVC=Rf$Ohh z@xoa-OEjjRGxJt4=ARZC>_ZqhUQ_-qd_q`upQotl=$5+hquCtER7WS}!#?VDsx;i~ z#FQ+eh>*6wCz=-d=Ht};{=82f&zI^bcz^oi0v2#b+}fpiCa~_@<8WoQuPNt_IF1Mo zSmgTSPjnPZx*mxLPKQ>Mx`2;W-yj7VrR3xspPd~EUUcQ}v2Guz+CD#ihGr0!E%s!^ za!F!&$ZMc$=_}o&ZiD+rn~AZVU^nlhto7HzLiWLfnSY6e!%c@7yd8oQ?+(5pj0RWR zE}hr59DrRQ{mO;SR!pjkER2gRX+5z0V5@O>T_5fB9J-!JwH{Zu8{EF!ELZ;Y(O-?H z>X{tByIzz7E4GYJ`&eOAfWn63AZrXtQ6XR>%baeHG01+Sfsu?WLgBzOWSCJXZxE7) zdjD?*$?u#a`%m(0z}MT9PwXT}A?M>$QHm9|E{ov;cG;aQAAEynj#DwPw^3T2AJaMN171&{=29J|MvM^Sjeu93` zbIexl7a&tMgpNFWS0*q6#fsNzKko@8`5IPsMUR%6q{lUy>;w}xICI3t;1B) znamZ&JRJP=C8jO(X)sPDnFHsLc1EhaRLFDG9rWpI#=4ev1`6%J=X#8cF5^TWo3wVH z$ovz_wX*TUV`GjBL`M_cdl?})acpRG45#agnssTghUSbw=e#Y&kr1(uJ2m1L&9a5F zcectHw`d0ax1oMJPykydPG5sNH;z_F3q?d8?f2}3Cm(H(bZxWX_FfhJoM)4)^jU7) zrYKJTl>pq+3SI%oi!lH?VnovON}yge9kxz?TRoSKc+=gZR?b~{@leLrS^c#$V z3~0f|yxtZiqH`c@9VR0n@owgUo^2NQ3d`ok=@W3nJp-=oc74tX{K8EHYk@1u(w8`h zRMOW0TD|@k=eyE3NQt zXyE|czu=VLdY;#ri#r!hGX-aU;lW4ZE>c&hW>`s7~!Z2qjT znSozSOr+ff%%&6czo#2~w!z|!^kCEy1!`rn2CJCL@L5a`)&`fX@e)^#Ec z=U)x=x@tQ!W|fSs55zdsjBoEP4VR1@9AHK|Ic*>iU?x+syS3b{LXvV6JLA(q%g-oo zdt5Dt>_8Ric&ZQ*Repa$Ew0twi9W5&BcSgd6A@`>k+aB3K~-3*)&c&F_wAUfkSo`4 zK=g8dWYhixb}^JJH(G@2AVkdjT15JsFMVx8X^cwaU#QUyEVAc?ibzbAdhX1MzXY<% ztgQuw-m{FLv1oU3;UQccC!|GJz{bVsdYSD7V4LZbc}*rTz(ZdFhc5c3r+k-X)z{|n z%>HH$>a?()lfLLG8&a2HECZcF0mt)UhH|DoMq-3&H_ zU=H1)l}B^9MUa6a^5SR3_}03oamie`MC8ou%saiD;9cjL2=_;G-f|tFL!CiqrkIYw zt}U>wR?2tlJMF$6lIdVRhWz2F@QU`0nurPRN*AjL;lhNO;B?RLoIvCJJUCkK_aXf~ z!t`p)|LFNz3`>-ZM7mD{Nns<%Dc-9Sk&85S{S8lAUS6Sbb>zCk2FPik@VV^z@pi>N zJkC|S3Yt_};B^>y%5C2a?UOwzEQg*_ljb*GCIzL<-O-kGkClc_bBWtZ`=!52H{SjC zuW%v`&73(F`VAX3{%I^$^sZ;*gg}|tZJ<<)_`ZzK3oFR=(SSz^-y~}-8n0~m2ev@d zEu|eMoS$oEZPUZ(+{KKhXNiOy|7g9Np{Dwv-T!CvH0+=@T-B)+>PLHH+V9vZjxQg- z3m0~iz?_)db-AurH8EskngP}(lo+Bz`JY38_hJ-=2)SDqcLIF+r`Y10%M?^w5}0}DiAoF#qoa7x1Y*0PWDtwQrsZ|xSW8Uq=+lIJD*{M{#i=*X-D z_4jWF14TM?wl$*v!%@)I32xQ5)ORmg)ZT5$@9%AbPJoh(tgDc7JQc>-HST;f-f5h{ zOcjGJuv2?_JaL&QgF|zAWVGEv9{8$b_^|abD;pYl7vB^jTwyk+3JB?5Bk0QHV8|0v z$Xvte{9;Obvkr&5h_LWhFNE-P>Ff*CS|lpDlQy|?_DnQ=V6poT=;(L+f4K2)KJAb8 zVi$3CEH$XUy_8SnUR-|t%3Oa4dN)z@tjgkvPk=CEm(%XZOSpyAY`fDF{3lO7(_EQC zL0;q?ScnLk^VnUI zy~!gn@E_^Nm%#L)<=-{_ueaYle zZhd=^1e$jbDTuL1h<$*2mn&yqrzs~ES-DaDOd0_a{m58-UT_%p(MaExd875>+?J$O zs(FyyeX`O)i8YJ6`QTOfnj?7rK1l2TOoJcXW-78GPLbl5)itmuSI}7dF`shj=m~!D zBZPBf`Sh`{kMq`=`oS7^kzz1W^u@iP6NY)%&un_Y0G=PYfV;HX{GZ8vFjNt+F?jk6 z&jBSUnkum~C}AE}ztQVEk!bmLcQGX%TpLF0( zcwlRfOUL3(>$B*uA2AkZTNp3sa66Rm-jD@LhE1#xuy?n`&eJ*xi;91B|5Q3n@dRt{ zv~g|^K+)!wPy_j=xdn34%UMT5D{|$iI;Pa?+U#%Lk`Jg4^bz;#M0F0SmN(DfAEI=? ztHhZ8NAe6ATNr)5PgII}u2|-opBV zmR1zzh5vQKueg2UPlK^<1Z?!BV)Y5cytGl9kSAt$g1&GZMt4{<(N|uy3?jGsf@Zq@ z&YTT!i+PJ&JM5y(+YE|<;4DNVAY?=d2kuhecuDkR<(_JDX z`kSLyIa;!F^NXPH(PMjh8P=n>Lu~h=vH$1IAtOmLAY{NvOAigr9~gspe6Vr7 zZ*mo$?rqG?`0Y)TH!@=+ZE_x)vogFcyE_vnC`CC1a*E*b9AO16l8=%e7KHK@hO zo;~X+AZWlNn&h_qw3P(wW}AZ>Sbe+=K3?3A(3V0_Qki;U|L05n*Bfw73_vlvEf|J* zl$563m2yVURgj$je%~R zQQq~y?RwIuczU`Z0+%J$T}~T=FWOgO@}xkq~x ddkevMD}P{vsaxcM*bNY&uB@$8a_`~G{|`VSsf7Rl delta 12797 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 Rh0BWr&D+|lCCU#&{tvvz;=%v` diff --git a/doc/img/words.png b/doc/img/words.png new file mode 100644 index 0000000000000000000000000000000000000000..187b9807c1c9d86c532e33e351bc91aee877d9f7 GIT binary patch literal 16184 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: alla banor startar med denna seed (tester/skärmdumpar) scene Scene next Scene smokeLeft int // >0: avsluta automatiskt efter så många uppdateringar @@ -42,6 +44,8 @@ type Options struct { SmokeFrames int // >0 avslutar efter N uppdateringar (smoke-test) Script string // skriptade steg för skärmdumpar/tester, se script.go KnownWords []string // ord spelaren kan från start (för tester/skärmdumpar) + Points int // språkpoäng från start (för tester/skärmdumpar) + Seed uint64 // >0: fast seed för banorna (för tester/skärmdumpar) } // New laddar resurser och bygger spelet. @@ -54,13 +58,15 @@ func New(opt Options) (*Game, error) { for _, w := range opt.KnownWords { g.Know.Learn(w) } + g.Know.Points = opt.Points + g.fixedSeed = opt.Seed if opt.Script != "" { if g.script, err = parseScript(opt.Script); err != nil { return nil, err } } if opt.LevelID != "" { - s, err := NewLevelScene(a, opt.LevelID, g.Know) + s, err := NewLevelScene(a, opt.LevelID, g.Know, g.seed()) if err != nil { return nil, err } @@ -104,3 +110,11 @@ func (g *Game) Draw(screen *ebiten.Image) { // Layout talar om för Ebitengine vilken intern upplösning vi ritar i. func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) { return ScreenW, ScreenH } + +// seed ger seeden för en ny banomgång: fast om -seed angetts, annars färsk. +func (g *Game) seed() rng.Seed { + if g.fixedSeed > 0 { + return rng.FromInt(g.fixedSeed) + } + return rng.NewSeed() +} diff --git a/internal/game/input.go b/internal/game/input.go index 40b6126..86412e6 100644 --- a/internal/game/input.go +++ b/internal/game/input.go @@ -76,6 +76,11 @@ func helpJustPressed() bool { return virtual.pressed["h"] || inpututil.IsKeyJustPressed(ebiten.KeyH) || gamepadJustPressed(ebiten.StandardGamepadButtonRightTop) } +// wordsJustPressed: L = ordlistan/språkträdet. +func wordsJustPressed() bool { + return virtual.pressed["l"] || inpututil.IsKeyJustPressed(ebiten.KeyL) || gamepadJustPressed(ebiten.StandardGamepadButtonLeftRight) +} + // menuMove returnerar -1/+1 när användaren just tryckte upp/ner i en meny. func menuMove() int { switch { diff --git a/internal/game/scene_level.go b/internal/game/scene_level.go index 306e1af..7500093 100644 --- a/internal/game/scene_level.go +++ b/internal/game/scene_level.go @@ -5,22 +5,22 @@ import ( "image/color" "math" "path/filepath" + "strings" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/vector" "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/rng" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/sim" ) -// Spelarens grundfart i rutor per sekund (blir en stat i M7). -const playerSpeed = 6.0 - // Hur länge tillfälliga meddelanden visas. const ( - deniedShowSec = 2.0 - learnedShowSec = 3.0 + deniedShowSec = 2.0 + learnedShowSec = 3.0 + progressedShowSec = 2.5 ) // LevelScene är själva spelandet av en bana. All spellogik ligger i sim.Run; @@ -33,15 +33,15 @@ type LevelScene struct { } // NewLevelScene laddar banan och ställer spelaren på startrutan. know är -// spelarens japanska, som delas mellan banor. -func NewLevelScene(a *Assets, id string, know *lang.Knowledge) (*LevelScene, error) { +// spelarens japanska, som delas mellan banor; seed styr omgångens slump. +func NewLevelScene(a *Assets, id string, know *lang.Knowledge, seed rng.Seed) (*LevelScene, error) { lvl, err := level.LoadFile(filepath.Join(a.LevelsDir, id+".json")) if err != nil { return nil, err } s := &LevelScene{ id: id, - run: sim.NewRun(lvl, playerSpeed, a.Dict, know), + run: sim.NewRun(lvl, sim.RunOptions{Dict: a.Dict, Know: know, Seed: seed}), cam: sim.NewCamera(ScreenW, ScreenH, float64(lvl.Width()*TileSize), float64(lvl.Height()*TileSize)), } s.followPlayer() @@ -51,6 +51,9 @@ func NewLevelScene(a *Assets, id string, know *lang.Knowledge) (*LevelScene, err // PlayerTile returnerar rutan spelaren står på/lämnar (används av skriptläget). func (s *LevelScene) PlayerTile() level.Point { return s.run.Player.Tile } +// PlayerMoving rapporterar om spelaren är mellan två rutor (skriptläget). +func (s *LevelScene) PlayerMoving() bool { return s.run.Player.Moving() } + // TrainHere rapporterar om spelaren står på en perrong vars tåg är inne (skriptläget). func (s *LevelScene) TrainHere() bool { tr, at, _ := s.run.PlatformHere() @@ -131,14 +134,73 @@ func (s *LevelScene) Draw(g *Game, screen *ebiten.Image) { } } - px, py := s.run.Player.WorldPos(TileSize) + // Följarna ritas bakifrån så att ledaren hamnar överst. + leader := s.run.Player + followers := s.run.Party.Followers() + for i := len(followers); i >= 1; i-- { + from, to := s.run.Party.FollowerTiles(i) + fx := float64(from.X*TileSize) + float64((to.X-from.X)*TileSize)*leader.Progress + fy := float64(from.Y*TileSize) + float64((to.Y-from.Y)*TileSize)*leader.Progress + facing := sim.Down + switch { + case to.X > from.X: + facing = sim.Right + case to.X < from.X: + facing = sim.Left + case to.Y < from.Y: + facing = sim.Up + } + op.GeoM.Reset() + op.GeoM.Translate(ox+math.Round(fx), oy+math.Round(fy)) + op.ColorScale.Reset() + t := memberTints[i%len(memberTints)] + op.ColorScale.Scale(t[0], t[1], t[2], 1) + screen.DrawImage(g.Assets.PlayerFrame(facing, leader.Moving() && from != to, s.animT), &op) + op.ColorScale.Reset() + s.drawUrge(g, screen, followers[i-1], int(ox+math.Round(fx)), int(oy+math.Round(fy))) + } + + px, py := leader.WorldPos(TileSize) op.GeoM.Reset() op.GeoM.Translate(ox+math.Round(px), oy+math.Round(py)) - screen.DrawImage(g.Assets.PlayerFrame(s.run.Player.Facing, s.run.Player.Moving(), s.animT), &op) + screen.DrawImage(g.Assets.PlayerFrame(leader.Facing, leader.Moving(), s.animT), &op) + s.drawUrge(g, screen, s.run.Party.Members[0], int(ox+math.Round(px)), int(oy+math.Round(py))) s.drawHUD(g, screen) } +// memberTints färgar följarnas sprites tills de har egna. +var memberTints = [][3]float32{{1, 1, 1}, {1, 0.75, 0.55}, {0.7, 0.95, 0.75}, {0.8, 0.7, 1}, {1, 0.95, 0.55}} + +// urgeMark är tecknet som visas över huvudet på någon med ett behov. +func urgeMark(u sim.Urge) (string, color.Color) { + switch u { + case sim.NeedToilet: + return "WC", colBad + case sim.Thirsty: + return "飲", colEnglish + case sim.Hungry: + return "食", colWarn + case sim.Distracted: + return "?", colDim + } + return "", nil +} + +func (s *LevelScene) drawUrge(g *Game, screen *ebiten.Image, m *sim.Member, x, y int) { + mark, col := urgeMark(m.Urge) + if mark == "" { + if m.Meters.Min() <= 0 { + mark, col = "!!", colBad + } else { + return + } + } + w := g.Assets.Width(mark) + vector.DrawFilledRect(screen, float32(x+8-w/2-1), float32(y-11), float32(w+2), 11, colPanel, false) + g.Assets.Draw(screen, mark, x+8-w/2, y-12, col) +} + // drawHUD ritar den övre raden (bana, resmål, tid, kort, japanska-nivå) och // inforutan (perrong, skylt, nekad spärr, nytt ord). func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) { @@ -152,9 +214,9 @@ func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) { } a.Draw(screen, r.Level.Name.Get(UILang), 4, 0, colText) a.Draw(screen, a.T("hud.destination")+": "+dest, 4+a.Width(r.Level.Name.Get(UILang))+12, 0, colKnown) - a.Draw(screen, fmt.Sprintf("%s %3.0fs %s %d %s %d¥ %s Lv%d·%d %s", a.T("hud.time"), r.Time, - a.T("hud.steps"), r.Steps, a.T("hud.card"), r.Card.Balance, a.T("hud.japanese"), r.Know.Level(), r.Know.Count(), - a.T("hud.controls")), 4, LineH, colDim) + a.Draw(screen, fmt.Sprintf("%s %3.0fs %s %d %s %d¥ %s Lv%d·%d", a.T("hud.time"), r.Time, + a.T("hud.steps"), r.Steps, a.T("hud.card"), r.Card.Balance, a.T("hud.japanese"), r.Know.Level(), r.Know.Count()), 4, LineH, colDim) + s.drawMeters(g, screen) if r.Outcome != sim.Ongoing { return @@ -164,6 +226,16 @@ func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) { lines = append(lines, plainLine(fmt.Sprintf("%s: %s = %s (%s)", a.T("hud.learned"), r.Learned, entry.Translation(UILang), entry.Romaji), colKnown)) } + if len(r.Progressed) > 0 && r.Time-r.ProgressedAt < progressedShowSec { + lines = append(lines, a.wrapLine(plainLine(a.T("hud.progress")+": "+strings.Join(r.Progressed, ", "), colWarn), ScreenW-8)...) + } + if urges := r.Party.Urges(); len(urges) > 0 { + var parts []string + for _, m := range urges { + parts = append(parts, m.Name+": "+a.T("urge."+m.Urge.String())) + } + lines = append(lines, a.wrapLine(plainLine(strings.Join(parts, " "), colWarn), ScreenW-8)...) + } if len(lines) == 0 { return } @@ -182,9 +254,13 @@ func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) { vector.DrawFilledRect(screen, 0, float32(y), ScreenW, 2, accent, false) a.drawLines(screen, lines, 4, y+4) if bar { + p := r.HelpProgress() + if r.Facility.Active { + p = r.FacilityProgress() + } by := float32(y + h - 7) vector.DrawFilledRect(screen, 4, by, ScreenW-8, 4, colBar, false) - vector.DrawFilledRect(screen, 4, by, float32((ScreenW-8)*r.HelpProgress()), 4, colKnown, false) + vector.DrawFilledRect(screen, 4, by, float32((ScreenW-8)*p), 4, colKnown, false) } } @@ -199,8 +275,7 @@ func (s *LevelScene) infoLines(a *Assets) (lines []line, accent color.Color, bar if tr, at, secs := r.PlatformHere(); tr != nil { // Avgångstavlan är en skylt som alla andra: japanska, sedd genom kunskapen. - ja := fmt.Sprintf("%s%s %s %s%s", tr.Track, a.T("hud.track_suffix_ja"), tr.Line.Get("ja"), tr.Destination.Get("ja"), a.T("hud.for_ja")) - rd := lang.Render(a.Dict, r.Know, ja, UILang) + rd := lang.Render(a.Dict, r.Know, tr.BoardText(), UILang) lines = append(lines, a.wrapLine(shownLine(rd.Original, colText, r.Know.ShowsReadings()), maxW)...) lines = append(lines, a.wrapLine(shownLine(rd.Partial, colText, false), maxW)...) if english { @@ -240,8 +315,46 @@ func (s *LevelScene) infoLines(a *Assets) (lines []line, accent color.Color, bar return lines, accent, bar } + switch lvl.At(tile.X, tile.Y) { + case level.Toilet: + if r.Facility.Active { + return []line{plainLine(a.T("hud.toilet_busy"), colDim)}, colGood, true + } + if n := len(r.Party.NeedsToilet()); n > 0 { + return []line{plainLine(fmt.Sprintf(a.T("hud.toilet_prompt"), n, sim.ToiletSecPerMember*float64(n)), colGood)}, colGood, false + } + return []line{plainLine(a.T("hud.toilet_none"), colDim)}, accent, false + case level.Kiosk: + if n := len(r.Party.NeedsKiosk()); n > 0 { + return []line{plainLine(fmt.Sprintf(a.T("hud.kiosk_prompt"), n, sim.KioskPriceYen*n), colGood)}, colGood, false + } + return []line{plainLine(a.T("hud.kiosk_none"), colDim)}, accent, false + } if r.DeniedAt >= 0 && r.Time-r.DeniedAt < deniedShowSec { return []line{plainLine(a.T("hud.gate_denied"), colBad)}, colBad, false } return nil, accent, false } + +// drawMeters ritar sällskapets mat/dryck/toa-mätare uppe till höger. +func (s *LevelScene) drawMeters(g *Game, screen *ebiten.Image) { + members := s.run.Party.Members + const w, gap = 14, 4 + x0 := ScreenW - 4 - len(members)*(w+gap) + for i, m := range members { + x := float32(x0 + i*(w+gap)) + g.Assets.Draw(screen, string([]rune(m.Name)[:1]), int(x)+3, 0, colDim) + for j, v := range []struct { + val float64 + col color.Color + }{{m.Meters.Food, colWarn}, {m.Meters.Drink, colEnglish}, {m.Meters.Toilet, colGood}} { + y := float32(13 + j*3) + vector.DrawFilledRect(screen, x, y, w, 2, colBar, false) + c := v.col + if v.val < sim.UrgeThreshold { + c = colBad + } + vector.DrawFilledRect(screen, x, y, float32(w*v.val/100), 2, c, false) + } + } +} diff --git a/internal/game/scene_menu.go b/internal/game/scene_menu.go index 55ed5a0..8783884 100644 --- a/internal/game/scene_menu.go +++ b/internal/game/scene_menu.go @@ -54,10 +54,14 @@ func (m *MenuScene) Update(g *Game) error { if backJustPressed() { return ebiten.Termination } + if wordsJustPressed() { + g.SetScene(NewWordsScene(g.Assets, m)) + return nil + } if n := len(m.entries); n > 0 { m.sel = (m.sel + menuMove() + n) % n if confirmJustPressed() { - s, err := NewLevelScene(g.Assets, m.entries[m.sel].id, g.Know) + s, err := NewLevelScene(g.Assets, m.entries[m.sel].id, g.Know, g.seed()) if err != nil { m.err = err return nil @@ -87,7 +91,8 @@ func (m *MenuScene) Draw(g *Game, screen *ebiten.Image) { if m.err != nil { a.Draw(screen, "FEL: "+m.err.Error(), 8, ScreenH-40, colBad) } - a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s", a.T("hud.japanese"), g.Know.Level(), g.Know.Count(), a.T("hud.words")), 8, ScreenH-38, colDim) + a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s %s %d", a.T("hud.japanese"), g.Know.Level(), g.Know.Count(), a.T("hud.words"), + a.T("words.points"), g.Know.Points), 8, ScreenH-38, colDim) a.Draw(screen, a.T("menu.hint"), 8, ScreenH-26, colDim) a.Draw(screen, fmt.Sprintf("%s (%s)", buildinfo.Version, buildinfo.Mode), 8, ScreenH-13, colDim) } diff --git a/internal/game/scene_result.go b/internal/game/scene_result.go index d0f350e..481e734 100644 --- a/internal/game/scene_result.go +++ b/internal/game/scene_result.go @@ -2,6 +2,7 @@ package game import ( "fmt" + "strings" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/vector" @@ -19,8 +20,10 @@ func NewResultScene(from *LevelScene) *ResultScene { return &ResultScene{from: f func (r *ResultScene) Update(g *Game) error { switch { + case wordsJustPressed(): + g.SetScene(NewWordsScene(g.Assets, r)) case inpututil_R(): - s, err := NewLevelScene(g.Assets, r.from.id, g.Know) + s, err := NewLevelScene(g.Assets, r.from.id, g.Know, g.seed()) if err != nil { return err } @@ -47,6 +50,10 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { } vector.DrawFilledRect(screen, 20, 36, ScreenW-40, 3, accent, false) a.DrawBig(screen, headline, 28, 44, accent) + if run.Outcome == sim.Won { + stars := strings.Repeat("★", run.Stars) + strings.Repeat("☆", 3-run.Stars) + a.DrawBig(screen, stars, ScreenW-28-a.Width(stars)-8, 44, colWarn) + } y := 62 if tr := run.Boarded; tr != nil { @@ -64,10 +71,18 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { } } y += 4 - a.Draw(screen, fmt.Sprintf("%s %.1fs %s %d %s %d %s %d¥", a.T("hud.time"), run.Time, + a.Draw(screen, fmt.Sprintf("%s %.1fs (%s %.0fs) %s %d %s %d %s %d¥", a.T("hud.time"), run.Time, a.T("result.par"), run.ParSec(), a.T("hud.steps"), run.Steps, a.T("result.gates"), run.GatePasses, a.T("result.card"), run.Card.Balance), 28, y, colText) y += LineH - a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s (%d %s)", a.T("hud.japanese"), run.Know.Level(), run.Know.Count(), - a.T("hud.words"), run.Know.Helps, a.T("result.helps")), 28, y, colDim) + if run.Outcome == sim.Won { + msg := fmt.Sprintf("+%d %s", run.PointsEarned, a.T("words.points")) + if len(run.LearnedDest) > 0 { + msg += " " + a.T("hud.learned") + ": " + strings.Join(run.LearnedDest, " ") + " (" + a.T("result.destination") + ")" + } + a.Draw(screen, msg, 28, y, colKnown) + y += LineH + } + a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s %s %d (%d %s)", a.T("hud.japanese"), run.Know.Level(), run.Know.Count(), + a.T("hud.words"), a.T("words.points"), run.Know.Points, run.Know.Helps, a.T("result.helps")), 28, y, colDim) a.Draw(screen, a.T("result.hint"), 28, 130, colDim) } diff --git a/internal/game/scene_words.go b/internal/game/scene_words.go new file mode 100644 index 0000000..c2be25e --- /dev/null +++ b/internal/game/scene_words.go @@ -0,0 +1,112 @@ +package game + +import ( + "fmt" + "image/color" + "sort" + "strings" + + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/vector" + + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/lang" +) + +// WordsScene är ordlistan/språkträdet: alla ord i ordboken, vad spelaren +// kan, framsteg på resten, och möjligheten att lägga språkpoäng på valfria +// ord. Blir ett riktigt träd med skills i M8. +type WordsScene struct { + back Scene + entries []*lang.Entry + sel int + top int + msg string +} + +const wordsRows = 9 + +// NewWordsScene listar ordboken sorterad på tier och ord. +func NewWordsScene(a *Assets, back Scene) *WordsScene { + var es []*lang.Entry + for _, w := range a.Dict.Words() { + es = append(es, a.Dict.Lookup(w)) + } + sort.Slice(es, func(i, j int) bool { + if es[i].Tier != es[j].Tier { + return es[i].Tier < es[j].Tier + } + return es[i].Word < es[j].Word + }) + return &WordsScene{back: back, entries: es} +} + +func (w *WordsScene) Update(g *Game) error { + if backJustPressed() || wordsJustPressed() { + g.SetScene(w.back) + return nil + } + if n := len(w.entries); n > 0 { + w.sel = (w.sel + menuMove() + n) % n + if w.sel < w.top { + w.top = w.sel + } + if w.sel >= w.top+wordsRows { + w.top = w.sel - wordsRows + 1 + } + if confirmJustPressed() { + e := w.entries[w.sel] + switch { + case g.Know.Knows(e.Word): + w.msg = g.Assets.T("words.already") + case g.Know.Buy(e): + w.msg = fmt.Sprintf(g.Assets.T("words.bought"), e.Word, e.Translation(UILang)) + default: + w.msg = fmt.Sprintf(g.Assets.T("words.too_expensive"), lang.WordCost(e)) + } + } + } + return nil +} + +func (w *WordsScene) Draw(g *Game, screen *ebiten.Image) { + a := g.Assets + k := g.Know + screen.Fill(color.RGBA{24, 20, 37, 255}) + vector.DrawFilledRect(screen, 0, 0, ScreenW, 22, color.RGBA{38, 43, 68, 255}, false) + a.DrawBig(screen, a.T("words.title"), 8, 5, colText) + hdr := fmt.Sprintf("%s %d %s Lv%d %d/%d %s", a.T("words.points"), k.Points, a.T("hud.japanese"), + k.Level(), k.Count(), len(w.entries), a.T("hud.words")) + a.Draw(screen, hdr, ScreenW-8-a.Width(hdr), 6, colKnown) + + y0 := 30 + for i := w.top; i < len(w.entries) && i < w.top+wordsRows; i++ { + e := w.entries[i] + y := y0 + (i-w.top)*LineH + if i == w.sel { + vector.DrawFilledRect(screen, 4, float32(y-1), ScreenW-8, LineH, colBar, false) + } + status, scol := strings.Repeat("●", lang.WordCost(e)), colDim + if k.CanBuy(e) { + scol = colKnown + } + wcol := colText + switch { + case k.Knows(e.Word): + status, scol, wcol = "✓", colGood, colKnown + case k.ProgressOf(e.Word) > 0: + status, scol = fmt.Sprintf("%d/%d", k.ProgressOf(e.Word), lang.ProgressToLearn), colWarn + } + a.Draw(screen, e.Word, 8, y, wcol) + a.Draw(screen, e.Romaji, 92, y, colDim) + a.Draw(screen, e.Translation(UILang), 180, y, colText) + a.Draw(screen, status, ScreenW-8-a.Width(status), y, scol) + } + // rullningsindikator + if len(w.entries) > wordsRows { + a.Draw(screen, fmt.Sprintf("%d-%d / %d", w.top+1, min(len(w.entries), w.top+wordsRows), len(w.entries)), 8, ScreenH-38, colDim) + } + if w.msg != "" { + a.Draw(screen, w.msg, 8, ScreenH-26, colKnown) + } + a.Draw(screen, a.T("words.hint"), 8, ScreenH-13, colDim) +} diff --git a/internal/game/script.go b/internal/game/script.go index d73f987..69f603a 100644 --- a/internal/game/script.go +++ b/internal/game/script.go @@ -20,8 +20,8 @@ import ( // // wait N vänta N bildrutor // waittrain vänta tills tåget vid perrongen spelaren står på är inne -// press KEY tryck enter | esc | r | up | down en bildruta -// move DIR N gå N rutor åt up | down | left | right (släpper när rutorna är avklarade) +// press KEY tryck enter | esc | r | h | l | up | down en bildruta +// move DIR N gå N rutor åt up | down | left | right (stannar exakt där) // shot PATH spara aktuell bild som PNG (intern upplösning × shotScale) // quit avsluta spelet // @@ -29,18 +29,22 @@ import ( const shotScale = 3 +// moveStallFrames: så många bildrutor utan ny ruta räknas som "vägg" och +// avslutar ett move-steg (annars skulle skriptet hänga för evigt). +const moveStallFrames = 120 + type scriptStep struct { - cmd string - arg string - n int - dir sim.Dir - done bool + cmd string + arg string + n int + dir sim.Dir } type script struct { steps []scriptStep i int counter int + stall int lastPos level.Point havePos bool } @@ -108,7 +112,10 @@ func parseDir(s string) sim.Dir { } // playerTiler implementeras av scener som har en spelare i rutnätet. -type playerTiler interface{ PlayerTile() level.Point } +type playerTiler interface { + PlayerTile() level.Point + PlayerMoving() bool +} // trainWaiter implementeras av scener där man kan vänta på ett tåg. type trainWaiter interface{ TrainHere() bool } @@ -139,26 +146,39 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error { } cur := pt.PlayerTile() if !s.havePos { - s.lastPos, s.havePos = cur, true + s.lastPos, s.havePos, s.stall = cur, true, 0 } if cur != s.lastPos { s.lastPos = cur s.counter++ + s.stall = 0 + } else { + s.stall++ } - if s.counter >= st.n { + if s.counter >= st.n && !pt.PlayerMoving() { s.advance() return nil } - virtual.held = st.dir + if s.stall > moveStallFrames { // blockerad av vägg: ge upp steget + s.advance() + return nil + } + // Håll riktningen tills sista rutan har påbörjats; släpp sedan så att + // figuren stannar exakt där. Hålls tangenten kvar i ankomstbildrutan + // fortsätter figuren annars en ruta till när farten (t.ex. med + // sällskapets fartstraff) inte är bildruteexakt. + if s.counter < st.n-1 || (s.counter == st.n-1 && !pt.PlayerMoving()) { + virtual.held = st.dir + } + case "waittrain": + if tw, ok := g.scene.(trainWaiter); !ok || tw.TrainHere() { + s.advance() + } case "shot": if err := saveShot(frame, st.arg); err != nil { return err } s.advance() - case "waittrain": - if tw, ok := g.scene.(trainWaiter); !ok || tw.TrainHere() { - s.advance() - } case "quit": return ebiten.Termination } @@ -168,6 +188,7 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error { func (s *script) advance() { s.i++ s.counter = 0 + s.stall = 0 s.havePos = false } diff --git a/internal/lang/knowledge.go b/internal/lang/knowledge.go index 7f85f29..ff287bb 100644 --- a/internal/lang/knowledge.go +++ b/internal/lang/knowledge.go @@ -4,9 +4,11 @@ import "math" // Knowledge är vad spelaren kan: ord ur ordboken och om hen kan läsa kana. type Knowledge struct { - Words map[string]bool `json:"words"` - Kana bool `json:"kana"` - Helps int `json:"helps"` // antal gånger spelaren frågat om hjälp + Words map[string]bool `json:"words"` + Progress map[string]int `json:"progress"` // framsteg på ord som ännu inte är kända + Points int `json:"points"` // språkpoäng att lägga på valfria ord + Kana bool `json:"kana"` + Helps int `json:"helps"` // antal gånger spelaren frågat om hjälp } // KanaUnlockWords: när så här många kända ord innehåller kana "lossnar" @@ -20,7 +22,9 @@ const ( ) // NewKnowledge börjar från noll. -func NewKnowledge() *Knowledge { return &Knowledge{Words: map[string]bool{}} } +func NewKnowledge() *Knowledge { + return &Knowledge{Words: map[string]bool{}, Progress: map[string]int{}} +} // Knows rapporterar om ordet är känt. func (k *Knowledge) Knows(word string) bool { return k.Words[word] } @@ -115,3 +119,69 @@ func ShowEnglish(levelID string, x, y, difficulty int) bool { } return float64(h%1000)/1000 < share } + +// Inlärning utöver hjälp (Björns regler 2026-10-23): +// - bra resultat på en bana lär ut resmålets ord (StarsToLearnDestination), +// - varje läst okänt ord har chansen ReadChance att ge +1 framsteg; vid +// ProgressToLearn framsteg kan man ordet, +// - språkpoäng (Points) tjänas på banor och läggs på valfria ord i ordlistan. +const ( + ReadChance = 0.35 + ProgressToLearn = 3 + StarsToLearnDestination = 2 + PointsPerStar = 1 +) + +// ProgressOf är hur många framsteg ordet har (0 om känt eller aldrig läst). +func (k *Knowledge) ProgressOf(word string) int { + if k.Progress == nil { + return 0 + } + return k.Progress[word] +} + +// AddProgress ger ett framsteg på ett okänt ord. Returnerar true om ordet +// därmed blev känt. +func (k *Knowledge) AddProgress(word string) bool { + if k.Knows(word) { + return false + } + if k.Progress == nil { + k.Progress = map[string]int{} + } + k.Progress[word]++ + if k.Progress[word] >= ProgressToLearn { + delete(k.Progress, word) + k.Learn(word) + return true + } + return false +} + +// WordCost är vad ett ord kostar i språkpoäng: dess tier (minst 1). +func WordCost(e *Entry) int { return max(1, e.Tier) } + +// CanBuy rapporterar om ordet går att köpa för poängen. +func (k *Knowledge) CanBuy(e *Entry) bool { + return e != nil && !k.Knows(e.Word) && k.Points >= WordCost(e) +} + +// Buy lär in ordet mot språkpoäng. Returnerar false om det inte går. +func (k *Knowledge) Buy(e *Entry) bool { + if !k.CanBuy(e) { + return false + } + k.Points -= WordCost(e) + if k.Progress != nil { + delete(k.Progress, e.Word) + } + k.Learn(e.Word) + return true +} + +// Award ger språkpoäng för stjärnor på en klarad bana. +func (k *Knowledge) Award(stars int) int { + p := max(0, stars) * PointsPerStar + k.Points += p + return p +} diff --git a/internal/lang/lang_test.go b/internal/lang/lang_test.go index 68d1c49..6488924 100644 --- a/internal/lang/lang_test.go +++ b/internal/lang/lang_test.go @@ -208,3 +208,43 @@ func TestCharClasses(t *testing.T) { t.Fatal("HasKana/IsJapanese") } } + +func TestProgressLearnsAfterEnoughReads(t *testing.T) { + k := NewKnowledge() + for i := 1; i < ProgressToLearn; i++ { + if k.AddProgress("改札") || k.ProgressOf("改札") != i || k.Knows("改札") { + t.Fatalf("efter %d framsteg: progress=%d known=%v", i, k.ProgressOf("改札"), k.Knows("改札")) + } + } + if !k.AddProgress("改札") || !k.Knows("改札") || k.ProgressOf("改札") != 0 { + t.Fatal("tredje framsteget ska lära ordet och nollställa framstegen") + } + if k.AddProgress("改札") { + t.Fatal("kända ord får inga framsteg") + } +} + +func TestBuyWordsWithPoints(t *testing.T) { + d := testDict() + k := NewKnowledge() + e1, e3 := d.Lookup("改札"), d.Lookup("新宿駅") // tier 1 resp. 3 + if WordCost(e1) != 1 || WordCost(e3) != 3 { + t.Fatal("kostnad = tier") + } + if k.CanBuy(e1) || k.Buy(e1) { + t.Fatal("utan poäng ska inget gå att köpa") + } + if got := k.Award(3); got != 3*PointsPerStar || k.Points != got { + t.Fatalf("Award = %d, points=%d", got, k.Points) + } + k.Progress["新宿駅"] = 2 + if !k.Buy(e3) || !k.Knows("新宿駅") || k.Points != 0 || k.ProgressOf("新宿駅") != 0 { + t.Fatalf("köp misslyckades: points=%d known=%v", k.Points, k.Knows("新宿駅")) + } + if k.CanBuy(e3) { + t.Fatal("redan känt ord ska inte gå att köpa") + } + if k.Award(-2) != 0 || k.Points != 0 { + t.Fatal("negativa stjärnor ger inget") + } +} diff --git a/internal/level/level.go b/internal/level/level.go index 8c521e8..ef3d8be 100644 --- a/internal/level/level.go +++ b/internal/level/level.go @@ -29,11 +29,13 @@ const ( Gate Tile = 'G' // spärr (kräver kort/biljett) TicketMachine Tile = 'T' // biljett-/påfyllningsautomat Sign Tile = 'i' // skylt + Toilet Tile = 'W' // toalett (sällskapets toamätare) + Kiosk Tile = 'K' // kiosk/automat för mat och dryck ) var knownTiles = map[Tile]bool{ Wall: true, Floor: true, Spawn: true, Platform: true, WrongPlatform: true, - Gate: true, TicketMachine: true, Sign: true, + Gate: true, TicketMachine: true, Sign: true, Toilet: true, Kiosk: true, } // Passable rapporterar om en ruta går att gå på (utan hänsyn till spärrar). @@ -69,6 +71,7 @@ const ( DefaultIntervalSec = 30.0 DefaultDwellSec = 10.0 DefaultFareYen = 200 + MaxParty = 5 ) // Status returnerar om tåget står vid perrongen vid tiden t, och hur många @@ -108,6 +111,8 @@ type Level struct { Difficulty int `json:"difficulty"` // 1 (lätt) … 5 (svår) Destination Text `json:"destination"` // dit spelaren ska 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) FareYen int `json:"fareYen"` // vad spärren drar från kortet (0 = standard) Grid []string `json:"grid"` Trains []Train `json:"trains"` @@ -229,8 +234,14 @@ func (l *Level) Validate() error { if l.FareYen == 0 { l.FareYen = DefaultFareYen } - if l.FareYen < 0 { - return fmt.Errorf("level %s: negativ avgift", l.ID) + if l.FareYen < 0 || l.ParSec < 0 || l.Party < 0 { + return fmt.Errorf("level %s: negativ avgift/partid/sällskap", l.ID) + } + if l.Party == 0 { + l.Party = 1 + } + if l.Party > MaxParty { + return fmt.Errorf("level %s: sällskapet får vara högst %d", l.ID, MaxParty) } // Skyltar: varje post måste stå på en 'i'-ruta och varje 'i'-ruta ha text. seen := map[Point]bool{} @@ -369,7 +380,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} { + for _, t := range []Tile{Platform, WrongPlatform, TicketMachine, Sign, Gate, Toilet, Kiosk} { for _, p := range l.Find(t) { if !reach[p] { out = append(out, p) @@ -379,6 +390,24 @@ func (l *Level) Unreachable() []Point { return out } +// BoardText är avgångstavlans text på japanska, t.ex. "2番線 成田エクスプレス 新宿方面". +func (tr *Train) BoardText() string { + return tr.Track + "番線 " + tr.Line.Get("ja") + " " + tr.Destination.Get("ja") + "方面" +} + +// CorrectPlatform returnerar en perrongruta med rätt tåg (valideringen +// garanterar att det finns minst ett rätt tåg vid en befintlig perrong). +func (l *Level) CorrectPlatform() Point { + for _, tr := range l.Trains { + if tr.Correct { + if pts := l.Find(Tile(tr.Platform[0])); len(pts) > 0 { + return pts[0] + } + } + } + return l.SpawnPoint() +} + // CanEnter rapporterar om rutan går att gå in på (för sim.Mover). func (l *Level) CanEnter(p Point) bool { return l.At(p.X, p.Y).Passable() } diff --git a/internal/level/level_test.go b/internal/level/level_test.go index 8289ff6..6edb413 100644 --- a/internal/level/level_test.go +++ b/internal/level/level_test.go @@ -147,6 +147,9 @@ func TestAllShippedLevels(t *testing.T) { t.Errorf("tåg %d saknar spårnummer", i) } } + 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)") + } for _, sg := range l.Signs { if sg.Text["sv"] == "" || sg.Text["en"] == "" { t.Errorf("skylt (%d,%d) saknar sv/en-text", sg.X, sg.Y) @@ -265,3 +268,23 @@ func TestUngatedPlatforms(t *testing.T) { t.Fatal("banan ska vara lösbar med spärren passerbar") } } + +func TestPartyAndParDefaults(t *testing.T) { + l := mustParse(t, sample) + if l.Party != 1 || l.ParSec != 0 { + t.Fatalf("party=%d par=%d", l.Party, l.ParSec) + } + if _, err := Parse([]byte(strings.Replace(sample, `"difficulty": 1`, `"difficulty": 1, "party": 9`, 1))); err == nil { + t.Fatal("för stort sällskap ska ge fel") + } + if l.CorrectPlatform() != (Point{5, 1}) { + t.Fatalf("CorrectPlatform = %v", l.CorrectPlatform()) + } + if got := l.Trains[0].BoardText(); got != "番線 A B方面" { + t.Fatalf("BoardText = %q", got) + } + l2 := mustParse(t, strings.Replace(sample, `"#S..#P#"`, `"#SW.KP#"`, 1)) + if l2.At(2, 1) != Toilet || l2.At(4, 1) != Kiosk || !l2.Solvable() { + t.Fatal("W och K ska vara passerbara rutor") + } +} diff --git a/internal/sim/party.go b/internal/sim/party.go new file mode 100644 index 0000000..282deff --- /dev/null +++ b/internal/sim/party.go @@ -0,0 +1,265 @@ +package sim + +import ( + "fmt" + "math/rand/v2" + + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" +) + +// Urge är ett behov som en i sällskapet kan få. +type Urge int + +// Behov. +const ( + NoUrge Urge = iota + NeedToilet // måste på toa -> toalettruta (W) + Thirsty // törstig -> kiosk (K) + Hungry // hungrig -> kiosk (K) + Distracted // distraherad av något – går över av sig självt +) + +func (u Urge) String() string { + return [...]string{"", "toilet", "thirsty", "hungry", "distracted"}[u] +} + +// Meters är mat, dryck och toa: 100 = allt väl, 0 = akut. +type Meters struct{ Food, Drink, Toilet float64 } + +// Min är den lägsta mätaren. +func (m Meters) Min() float64 { return min(m.Food, m.Drink, m.Toilet) } + +// Lowest returnerar behovet som hör till den lägsta mätaren. +func (m Meters) Lowest() (Urge, float64) { + u, v := Hungry, m.Food + if m.Drink < v { + u, v = Thirsty, m.Drink + } + if m.Toilet < v { + u, v = NeedToilet, m.Toilet + } + return u, v +} + +// Member är en i sällskapet. Members[0] är spelaren själv. +type Member struct { + Name string + Meters Meters + Urge Urge + UrgeAt float64 // när behovet uppstod +} + +// PartyNames är namnen i den ordning de följer med. +var PartyNames = []string{"Du", "Anna", "Ville", "Sara", "Omar"} + +// Takter och trösklar. Mätarna går från 100 till 0 på ungefär 10/7/8 minuter. +const ( + FoodPerSec = 100.0 / 600 + DrinkPerSec = 100.0 / 420 + ToiletPerSec = 100.0 / 480 + UrgeThreshold = 25.0 // under detta uppstår ett behov av sig självt + BaseEventSec = 45.0 // händelseintervall för en ensam resenär; delas med antalet i sällskapet + DistractionSec = 4.0 + UrgeSpeedFactor = 0.8 // någon har ett behov + DistractedSpeedFactor = 0.5 + EmptySpeedFactor = 0.5 // någon mätare har nått 0 + KioskPriceYen = 150 + ToiletSecPerMember = 3.0 + RestoreBelow = 50.0 // kiosk/toalett hjälper alla under den här nivån +) + +// Party är sällskapet – lämmeltåget – med mätare, behov och följarnas spår. +type Party struct { + Members []*Member + trail []level.Point // ledarens rutor, senaste sist + rand *rand.Rand + nextEventAt float64 + Events int // antal händelser som inträffat + Log []string // händelselogg (tester/HUD) +} + +// NewParty skapar n medlemmar (minst 1) på startrutan. All slump i +// sällskapet kommer från seed. +func NewParty(n int, start level.Point, seed rng.Seed) *Party { + n = max(1, min(n, len(PartyNames))) + p := &Party{rand: seed.New()} + for i := 0; i < n; i++ { + p.Members = append(p.Members, &Member{Name: PartyNames[i], Meters: Meters{100, 100, 100}}) + } + p.trail = []level.Point{start} + p.nextEventAt = p.interval() * (0.5 + p.rand.Float64()) + return p +} + +// Size är antalet i sällskapet inkl. spelaren. +func (p *Party) Size() int { return len(p.Members) } + +// Followers är alla utom spelaren. +func (p *Party) Followers() []*Member { return p.Members[1:] } + +// interval är tiden mellan händelser: fler i sällskapet = oftare. +func (p *Party) interval() float64 { return BaseEventSec / float64(p.Size()) } + +// Advance sänker mätarna, låter behov uppstå och kör de slumpade +// händelserna. t är omgångens klocka. +func (p *Party) Advance(dt, t float64) { + for _, m := range p.Members { + m.Meters.Food = max(0, m.Meters.Food-FoodPerSec*dt) + m.Meters.Drink = max(0, m.Meters.Drink-DrinkPerSec*dt) + m.Meters.Toilet = max(0, m.Meters.Toilet-ToiletPerSec*dt) + if m.Urge == Distracted && t-m.UrgeAt >= DistractionSec { + m.Urge = NoUrge + } + if m.Urge == NoUrge { + if u, v := m.Meters.Lowest(); v < UrgeThreshold { + m.setUrge(u, t) + p.log(t, m, "behovet uppstod av sig självt") + } + } + } + if t >= p.nextEventAt { + p.event(t) + p.nextEventAt = t + p.interval()*(0.7+0.6*p.rand.Float64()) + } +} + +// event: en slumpad i sällskapet får ett behov – oftast det som mätaren +// står lägst i, ibland bara en distraktion. +func (p *Party) event(t float64) { + p.Events++ + m := p.Members[p.rand.IntN(len(p.Members))] + if m.Urge != NoUrge { + p.log(t, m, "händelse utan effekt (hade redan ett behov)") + return + } + if p.rand.Float64() < 0.25 { + m.setUrge(Distracted, t) + p.log(t, m, "blev distraherad") + return + } + u, _ := m.Meters.Lowest() + m.setUrge(u, t) + // Behovet är på riktigt: dra ned mätaren till tröskeln. + switch u { + case NeedToilet: + m.Meters.Toilet = min(m.Meters.Toilet, UrgeThreshold) + case Thirsty: + m.Meters.Drink = min(m.Meters.Drink, UrgeThreshold) + case Hungry: + m.Meters.Food = min(m.Meters.Food, UrgeThreshold) + } + p.log(t, m, "fick behovet "+u.String()) +} + +func (m *Member) setUrge(u Urge, t float64) { m.Urge, m.UrgeAt = u, t } + +func (p *Party) log(t float64, m *Member, what string) { + p.Log = append(p.Log, fmt.Sprintf("%.1fs %s: %s", t, m.Name, what)) +} + +// Urges returnerar de som har ett aktivt behov. +func (p *Party) Urges() []*Member { + var out []*Member + for _, m := range p.Members { + if m.Urge != NoUrge { + out = append(out, m) + } + } + return out +} + +// SpeedFactor är hur mycket sällskapet saktar ned ledaren. +func (p *Party) SpeedFactor() float64 { + f := 1.0 + for _, m := range p.Members { + switch { + case m.Meters.Min() <= 0: + f = min(f, EmptySpeedFactor) + case m.Urge == Distracted: + f = min(f, DistractedSpeedFactor) + case m.Urge != NoUrge: + f = min(f, UrgeSpeedFactor) + } + } + return f +} + +// NeedsToilet är de som har nytta av en toalett just nu. +func (p *Party) NeedsToilet() []*Member { + var out []*Member + for _, m := range p.Members { + if m.Urge == NeedToilet || m.Meters.Toilet < RestoreBelow { + out = append(out, m) + } + } + return out +} + +// NeedsKiosk är de som har nytta av mat eller dryck just nu. +func (p *Party) NeedsKiosk() []*Member { + var out []*Member + for _, m := range p.Members { + if m.Urge == Thirsty || m.Urge == Hungry || m.Meters.Drink < RestoreBelow || m.Meters.Food < RestoreBelow { + out = append(out, m) + } + } + return out +} + +// UseToilet fyller toamätaren för alla som behövde och tar bort behovet. +// Returnerar antalet som gick. +func (p *Party) UseToilet() int { + n := 0 + for _, m := range p.NeedsToilet() { + m.Meters.Toilet = 100 + if m.Urge == NeedToilet { + m.Urge = NoUrge + } + n++ + } + return n +} + +// BuyAtKiosk köper mat/dryck åt alla som behöver, en betalning per person +// via pay (returnerar false när pengarna är slut). Returnerar antalet +// försörjda. +func (p *Party) BuyAtKiosk(pay func(yen int) bool) int { + n := 0 + for _, m := range p.NeedsKiosk() { + if !pay(KioskPriceYen) { + break + } + m.Meters.Food, m.Meters.Drink = 100, 100 + if m.Urge == Thirsty || m.Urge == Hungry { + m.Urge = NoUrge + } + n++ + } + return n +} + +// OnLeaderArrived registrerar att ledaren nått en ny ruta; följarna följer +// spåret bakom. +func (p *Party) OnLeaderArrived(tile level.Point) { + if p.trail[len(p.trail)-1] == tile { + return + } + p.trail = append(p.trail, tile) + if keep := p.Size() + 1; len(p.trail) > keep { + p.trail = p.trail[len(p.trail)-keep:] + } +} + +// FollowerTiles returnerar var följare i (1 = närmast ledaren) står och vart +// hen är på väg; följaren interpoleras med samma framsteg som ledaren. +func (p *Party) FollowerTiles(i int) (from, to level.Point) { + at := func(k int) level.Point { + if k < 0 { + return p.trail[0] + } + return p.trail[k] + } + n := len(p.trail) + return at(n - 1 - i), at(n - i) +} diff --git a/internal/sim/party_test.go b/internal/sim/party_test.go new file mode 100644 index 0000000..03ebdcb --- /dev/null +++ b/internal/sim/party_test.go @@ -0,0 +1,143 @@ +package sim + +import ( + "strings" + "testing" + + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" +) + +func TestMetersDecayAtRates(t *testing.T) { + p := NewParty(2, pt(1, 1), rng.FromInt(1)) + for i := 0; i < 60*60; i++ { // 60 s + p.Advance(frame, float64(i)*frame) + } + m := p.Members[1].Meters + for _, c := range []struct { + name string + got float64 + rate float64 + }{{"mat", m.Food, FoodPerSec}, {"dryck", m.Drink, DrinkPerSec}, {"toa", m.Toilet, ToiletPerSec}} { + if want := 100 - c.rate*60; c.got > want+0.5 || c.got < want-0.5 { + t.Errorf("%s = %.1f, vill ha ~%.1f", c.name, c.got, want) + } + } +} + +// TestMoreMembersMoreEvents: fler i lämmeltåget ger fler händelser. +func TestMoreMembersMoreEvents(t *testing.T) { + count := func(n int) int { + p := NewParty(n, pt(1, 1), rng.FromInt(3)) + for i := 0; i < 60*600; i++ { // 10 min + p.Advance(frame, float64(i)*frame) + } + return p.Events + } + one, four := count(1), count(4) + if one < 8 || one > 20 { + t.Fatalf("ensam: %d händelser på 10 min (väntat ~13)", one) + } + if four < 3*one { + t.Fatalf("fyra i sällskapet (%d) ska ge klart fler händelser än en (%d)", four, one) + } +} + +func TestEventsAreSeeded(t *testing.T) { + run := func(seed uint64) []string { + p := NewParty(3, pt(1, 1), rng.FromInt(seed)) + for i := 0; i < 60*300; i++ { + p.Advance(frame, float64(i)*frame) + } + return p.Log + } + a, b := run(9), run(9) + if strings.Join(a, "|") != strings.Join(b, "|") { + t.Fatal("samma seed ska ge samma händelser") + } + if strings.Join(a, "|") == strings.Join(run(10), "|") { + t.Fatal("olika seeds ska ge olika händelser") + } + if len(a) == 0 { + t.Fatal("inga händelser på fem minuter") + } +} + +func TestUrgesSlowAndFacilitiesRestore(t *testing.T) { + p := NewParty(3, pt(1, 1), rng.FromInt(1)) + if p.SpeedFactor() != 1 { + t.Fatal("utan behov full fart") + } + anna, ville := p.Members[1], p.Members[2] + anna.setUrge(NeedToilet, 0) + anna.Meters.Toilet = 10 + if p.SpeedFactor() != UrgeSpeedFactor || len(p.NeedsToilet()) != 1 { + t.Fatalf("toabehov: fart=%.2f behöver=%d", p.SpeedFactor(), len(p.NeedsToilet())) + } + if n := p.UseToilet(); n != 1 || anna.Urge != NoUrge || anna.Meters.Toilet != 100 || p.SpeedFactor() != 1 { + t.Fatalf("toaletten: n=%d urge=%v toa=%.0f", n, anna.Urge, anna.Meters.Toilet) + } + + ville.setUrge(Thirsty, 0) + ville.Meters.Drink = 5 + anna.Meters.Food = 40 // under RestoreBelow men utan behov – kiosken hjälper ändå + paid := 0 + pay := func(yen int) bool { paid += yen; return true } + if n := p.BuyAtKiosk(pay); n != 2 || paid != 2*KioskPriceYen || ville.Urge != NoUrge || ville.Meters.Drink != 100 || anna.Meters.Food != 100 { + t.Fatalf("kiosken: n=%d betalt=%d", n, paid) + } + // Slut på pengar: ingen försörjs. + ville.Meters.Drink = 5 + if n := p.BuyAtKiosk(func(int) bool { return false }); n != 0 || ville.Meters.Drink != 5 { + t.Fatal("utan pengar ska ingen få något") + } + + ville.Meters.Drink = 100 // annars uppstår törsten igen när distraktionen går över + p.nextEventAt = 1e9 // inga slumphändelser i resten av testet + ville.setUrge(Distracted, 100) + if p.SpeedFactor() != DistractedSpeedFactor { + t.Fatal("distraktion halverar farten") + } + p.Advance(frame, 100+DistractionSec) + if ville.Urge != NoUrge { + t.Fatal("distraktionen ska gå över av sig själv") + } + ville.Meters.Food = 0 + if p.SpeedFactor() != EmptySpeedFactor { + t.Fatal("tom mätare ger stor fartstraff") + } +} + +func TestUrgeArisesBelowThreshold(t *testing.T) { + p := NewParty(1, pt(1, 1), rng.FromInt(1)) + p.Members[0].Meters.Drink = UrgeThreshold - 1 + p.Advance(frame, 0) + if p.Members[0].Urge != Thirsty { + t.Fatalf("urge=%v", p.Members[0].Urge) + } +} + +func TestFollowersTrailLeader(t *testing.T) { + p := NewParty(3, pt(1, 1), rng.FromInt(1)) + for _, tile := range []level.Point{pt(2, 1), pt(3, 1), pt(3, 2)} { + p.OnLeaderArrived(tile) + } + p.OnLeaderArrived(pt(3, 2)) // samma ruta igen: ingen dubblett + if from, to := p.FollowerTiles(1); from != pt(3, 1) || to != pt(3, 2) { + t.Fatalf("följare 1: %v -> %v", from, to) + } + if from, to := p.FollowerTiles(2); from != pt(2, 1) || to != pt(3, 1) { + t.Fatalf("följare 2: %v -> %v", from, to) + } + // Vid start står alla på startrutan. + q := NewParty(3, pt(5, 5), rng.FromInt(1)) + if from, to := q.FollowerTiles(2); from != pt(5, 5) || to != pt(5, 5) { + t.Fatalf("start: %v -> %v", from, to) + } +} + +func TestPartySizeIsClamped(t *testing.T) { + if NewParty(0, pt(0, 0), rng.FromInt(1)).Size() != 1 || NewParty(99, pt(0, 0), rng.FromInt(1)).Size() != len(PartyNames) { + t.Fatal("storleken ska klampas") + } +} diff --git a/internal/sim/run.go b/internal/sim/run.go index a35fa5b..4075c28 100644 --- a/internal/sim/run.go +++ b/internal/sim/run.go @@ -1,8 +1,11 @@ package sim import ( + "fmt" + "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/rng" ) // Outcome är hur en banomgång står sig. @@ -53,8 +56,56 @@ type Run struct { Revealed map[level.Point]bool // skyltar som översatts helt via hjälp Learned string // senast inlärda ord (för HUD-notis) LearnedAt float64 // när det lärdes in; < 0 = aldrig + + // Slump och inlärning genom läsning. + Seed rng.Seed // all slump i omgången härleds härifrån + Visits map[level.Point]int // hur många gånger spelaren stannat på en skylt/perrong + lastTile level.Point + Progressed []string // ord som fick framsteg vid senaste läsningen, "ord n/3" + ProgressedAt float64 // < 0 = aldrig + + // Resultat när banan vunnits. + Stars int // 1–3 efter tid mot par + PointsEarned int // språkpoäng + LearnedDest []string // resmålets ord som lärdes in tack vare bra resultat + parSec float64 + + // Sällskapet (lämmeltåget) och pågående toalettbesök. + Party *Party + Facility FacilityState + baseSpeed float64 + Served int // personer som fått mat/dryck/toa (statistik) + Notice string // senaste meddelande från sällskapet (HUD) + NoticeAt float64 // < 0 = aldrig } +// FacilityState är ett pågående toalettbesök (tar tid, avbryts om man går). +type FacilityState struct { + Active bool + At level.Point + Remaining float64 + Total float64 + Count int +} + +// RunOptions styr en banomgång. +type RunOptions struct { + Speed float64 // rutor per sekund (0 = DefaultSpeed) + Dict *lang.Dictionary // nil = tom ordbok + Know *lang.Knowledge // nil = ny kunskap + Seed rng.Seed // omgångens seed (sparas med spelet) +} + +// DefaultSpeed är spelarens grundfart i rutor per sekund. +const DefaultSpeed = 6.0 + +// Par: utan parSec i bandatan räknas "bra tid" som kortaste vägen i rutor × +// ParSecPerTile + ParSlackSec. Tre stjärnor under par, två under 1,5 × par. +const ( + ParSecPerTile = 0.5 + ParSlackSec = 20.0 +) + // HelpState är en pågående "fråga någon om hjälp". type HelpState struct { Active bool @@ -63,24 +114,54 @@ type HelpState struct { Total float64 } -// NewRun startar banan med spelaren på startrutan. dict och know får vara -// nil (tom ordbok respektive ny kunskap). -func NewRun(l *level.Level, speed float64, dict *lang.Dictionary, know *lang.Knowledge) *Run { - if dict == nil { - dict = lang.NewDictionary() +// NewRun startar banan med spelaren på startrutan. +func NewRun(l *level.Level, o RunOptions) *Run { + if o.Dict == nil { + o.Dict = lang.NewDictionary() } - if know == nil { - know = lang.NewKnowledge() + if o.Know == nil { + o.Know = lang.NewKnowledge() } - return &Run{ - Level: l, - Player: NewMover(l.SpawnPoint(), speed), - Card: Card{Balance: StartBalanceYen}, - DeniedAt: -1, - Dict: dict, - Know: know, - Revealed: map[level.Point]bool{}, - LearnedAt: -1, + if o.Speed <= 0 { + o.Speed = DefaultSpeed + } + r := &Run{ + Level: l, + Player: NewMover(l.SpawnPoint(), o.Speed), + Card: Card{Balance: StartBalanceYen}, + DeniedAt: -1, + Dict: o.Dict, + Know: o.Know, + Revealed: map[level.Point]bool{}, + LearnedAt: -1, + Seed: o.Seed, + Visits: map[level.Point]int{}, + lastTile: l.SpawnPoint(), + ProgressedAt: -1, + parSec: float64(l.ParSec), + Party: NewParty(l.Party, l.SpawnPoint(), o.Seed.Derive("party")), + baseSpeed: o.Speed, + NoticeAt: -1, + } + if r.parSec <= 0 { + n := len(l.Path(l.SpawnPoint(), l.CorrectPlatform(), l.CanEnter)) + r.parSec = float64(max(0, n-1))*ParSecPerTile + ParSlackSec + } + return r +} + +// ParSec är tiden för tre stjärnor. +func (r *Run) ParSec() float64 { return r.parSec } + +// StarsFor ger 3 stjärnor under par, 2 under 1,5 × par, annars 1. +func (r *Run) StarsFor(t float64) int { + switch { + case t <= r.parSec: + return 3 + case t <= 1.5*r.parSec: + return 2 + default: + return 1 } } @@ -111,19 +192,79 @@ func (r *Run) Step(dt float64, want Dir, board bool) { r.Time += dt before := r.Player.Tile wasGate := r.inGate() + r.Player.Speed = r.baseSpeed * r.Party.SpeedFactor() r.Steps += r.Player.Step(dt, want, r.CanEnter) + if r.Player.Tile != before { + r.Party.OnLeaderArrived(r.Player.Tile) + } + logged := len(r.Party.Log) + r.Party.Advance(dt, r.Time) + if len(r.Party.Log) > logged { + r.Notice, r.NoticeAt = r.Party.Log[len(r.Party.Log)-1], r.Time + } r.stepHelp(dt) + r.stepFacility(dt) + r.stepReading() if r.Player.Tile != before && r.inGate() && !wasGate { r.Card.Pay(r.Level.FareYen) r.GatePasses++ } if board && !r.Player.Moving() { - if tr, at, _ := r.PlatformHere(); tr != nil && at { - r.Board(tr) + switch r.Level.At(r.Player.Tile.X, r.Player.Tile.Y) { + case level.Toilet: + r.useToilet() + case level.Kiosk: + r.buyAtKiosk() + default: + if tr, at, _ := r.PlatformHere(); tr != nil && at { + r.Board(tr) + } } } } +// useToilet startar ett toalettbesök för alla som behöver (tar tid). +func (r *Run) useToilet() { + if r.Facility.Active { + return + } + n := len(r.Party.NeedsToilet()) + if n == 0 { + return + } + secs := ToiletSecPerMember * float64(n) + r.Facility = FacilityState{Active: true, At: r.Player.Tile, Remaining: secs, Total: secs, Count: n} +} + +func (r *Run) stepFacility(dt float64) { + if !r.Facility.Active { + return + } + if r.Player.Moving() || r.Player.Tile != r.Facility.At { + r.Facility = FacilityState{} + return + } + r.Facility.Remaining -= dt + if r.Facility.Remaining > 0 { + return + } + r.Served += r.Party.UseToilet() + r.Facility = FacilityState{} +} + +// buyAtKiosk köper mat och dryck åt alla som behöver, betalat med kortet. +func (r *Run) buyAtKiosk() { + r.Served += r.Party.BuyAtKiosk(r.Card.Pay) +} + +// FacilityProgress är 0..1 för ett pågående toalettbesök. +func (r *Run) FacilityProgress() float64 { + if !r.Facility.Active || r.Facility.Total <= 0 { + return 0 + } + return 1 - r.Facility.Remaining/r.Facility.Total +} + // PlatformHere returnerar tåget vid perrongen spelaren står på (nil om // spelaren inte står på en perrong), om det är inne, och sekunder kvar // till avgång respektive ankomst. @@ -148,13 +289,63 @@ func (r *Run) SignHere() *level.SignText { return r.Level.SignAt(r.Player.Tile) } -// Board kliver på ett tåg och avgör banan. +// Board kliver på ett tåg och avgör banan. En vinst ger stjärnor efter tid, +// språkpoäng, och vid tillräckligt bra resultat lär man sig resmålets ord. func (r *Run) Board(tr *level.Train) { r.Boarded = tr - if tr.Correct { - r.Outcome = Won - } else { + if !tr.Correct { r.Outcome = Lost + return + } + r.Outcome = Won + r.Stars = r.StarsFor(r.Time) + r.PointsEarned = r.Know.Award(r.Stars) + if r.Stars >= lang.StarsToLearnDestination { + for _, w := range r.Dict.WordsIn(r.Level.Destination.Get("ja")) { + if r.Know.Learn(w) { + r.LearnedDest = append(r.LearnedDest, w) + } + } + } +} + +// stepReading: när spelaren stannar på en skylt eller perrong "läser" hen +// texten – varje okänt ord har chansen lang.ReadChance att ge ett framsteg, +// slumpat deterministiskt från seeden, skyltens position och besöksnumret. +func (r *Run) stepReading() { + if r.Player.Moving() || r.Player.Tile == r.lastTile { + return + } + r.lastTile = r.Player.Tile + text := "" + if sg := r.Level.SignAt(r.Player.Tile); sg != nil { + text = sg.Text.Get("ja") + } else if tr, _, _ := r.PlatformHere(); tr != nil { + text = tr.BoardText() + } + if text == "" { + return + } + r.Visits[r.Player.Tile]++ + roll := r.Seed.Derive(fmt.Sprintf("read:%d,%d:%d", r.Player.Tile.X, r.Player.Tile.Y, r.Visits[r.Player.Tile])).New() + seen := map[string]bool{} + var progressed []string + for _, w := range r.Dict.WordsIn(text) { + if seen[w] || r.Know.Knows(w) { + continue + } + seen[w] = true + if roll.Float64() >= lang.ReadChance { + continue + } + if r.Know.AddProgress(w) { + r.Learned, r.LearnedAt = w, r.Time + } else { + progressed = append(progressed, fmt.Sprintf("%s %d/%d", w, r.Know.ProgressOf(w), lang.ProgressToLearn)) + } + } + if len(progressed) > 0 { + r.Progressed, r.ProgressedAt = progressed, r.Time } } diff --git a/internal/sim/run_test.go b/internal/sim/run_test.go index 28e9eb3..d66e2de 100644 --- a/internal/sim/run_test.go +++ b/internal/sim/run_test.go @@ -8,6 +8,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/res" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" ) func loadDict(t *testing.T) *lang.Dictionary { @@ -90,7 +91,7 @@ func waitForTrain(t *testing.T, r *Run) *level.Train { // och kliver på – helt utan fönster. func TestBotWinsLevel001(t *testing.T) { l := loadLevel(t, "001-flygplatsen") - r := NewRun(l, 6, nil, nil) + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) goal := l.Find(level.Platform)[0] path := l.Path(r.Player.Tile, goal, r.CanEnter) if path == nil { @@ -116,6 +117,9 @@ func TestBotWinsLevel001(t *testing.T) { if r.Steps != len(path)-1 { t.Fatalf("steg=%d, vägen är %d rutor", r.Steps, len(path)-1) } + if r.Stars != 3 || r.PointsEarned != 3*lang.PointsPerStar || r.Know.Points != r.PointsEarned { + t.Fatalf("snabb vinst ska ge 3 stjärnor: stars=%d points=%d", r.Stars, r.PointsEarned) + } // Efter utfall händer inget mer. before := r.Time r.Step(frame, Right, true) @@ -126,7 +130,7 @@ func TestBotWinsLevel001(t *testing.T) { func TestBotLosesOnWrongTrain(t *testing.T) { l := loadLevel(t, "001-flygplatsen") - r := NewRun(l, 6, nil, nil) + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) goal := l.Find(level.WrongPlatform)[0] walk(t, r, l.Path(r.Player.Tile, goal, r.CanEnter)) tr := waitForTrain(t, r) @@ -138,7 +142,7 @@ func TestBotLosesOnWrongTrain(t *testing.T) { func TestGateNeedsCardBalance(t *testing.T) { l := loadLevel(t, "001-flygplatsen") - r := NewRun(l, 6, nil, nil) + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) gate := l.Find(level.Gate)[0] r.Card.Balance = 0 if r.CanEnter(gate) { @@ -165,7 +169,7 @@ func TestGateNeedsCardBalance(t *testing.T) { func TestBoardOnlyWhenTrainPresent(t *testing.T) { l := loadLevel(t, "001-flygplatsen") - r := NewRun(l, 6, nil, nil) + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) goal := l.Find(level.Platform)[0] walk(t, r, l.Path(r.Player.Tile, goal, r.CanEnter)) // Spola fram till en tidpunkt då tåget är borta. @@ -184,7 +188,7 @@ func TestBoardOnlyWhenTrainPresent(t *testing.T) { func TestSignHereOnlyWhenStill(t *testing.T) { l := loadLevel(t, "001-flygplatsen") - r := NewRun(l, 6, nil, nil) + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) sign := l.Find(level.Sign)[0] walk(t, r, l.Path(r.Player.Tile, sign, r.CanEnter)) if sg := r.SignHere(); sg == nil || sg.Text.Get("sv") == "" { @@ -201,7 +205,7 @@ func TestSignHereOnlyWhenStill(t *testing.T) { func TestAskHelpRevealsSignAndTeachesWord(t *testing.T) { l := loadLevel(t, "001-flygplatsen") know := lang.NewKnowledge() - r := NewRun(l, 6, loadDict(t), know) + r := NewRun(l, RunOptions{Dict: loadDict(t), Know: know, Seed: rng.FromInt(1)}) sign := l.Find(level.Sign)[1] walk(t, r, l.Path(r.Player.Tile, sign, r.CanEnter)) @@ -241,7 +245,7 @@ func TestAskHelpRevealsSignAndTeachesWord(t *testing.T) { func TestHelpIsCancelledByWalkingAway(t *testing.T) { l := loadLevel(t, "001-flygplatsen") - r := NewRun(l, 6, loadDict(t), nil) + r := NewRun(l, RunOptions{Dict: loadDict(t), Seed: rng.FromInt(1)}) sign := l.Find(level.Sign)[1] walk(t, r, l.Path(r.Player.Tile, sign, r.CanEnter)) r.AskHelp() @@ -256,8 +260,155 @@ func TestHelpIsCancelledByWalkingAway(t *testing.T) { func TestNoHelpOffSign(t *testing.T) { l := loadLevel(t, "001-flygplatsen") - r := NewRun(l, 6, loadDict(t), nil) + r := NewRun(l, RunOptions{Dict: loadDict(t), Seed: rng.FromInt(1)}) if r.AskHelp() { t.Fatal("ingen skylt på startrutan") } } + +func TestStarsFromParTime(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) + par := r.ParSec() + n := len(l.Path(l.SpawnPoint(), l.CorrectPlatform(), l.CanEnter)) - 1 + if want := float64(n)*ParSecPerTile + ParSlackSec; par != want { + t.Fatalf("par=%.1f, vill ha %.1f (%d rutor)", par, want, n) + } + if r.StarsFor(par) != 3 || r.StarsFor(par*1.5) != 2 || r.StarsFor(par*1.51) != 1 { + t.Fatal("stjärntrösklarna") + } + l.ParSec = 40 + if NewRun(l, RunOptions{}).ParSec() != 40 { + t.Fatal("parSec i bandatan ska vinna") + } +} + +// TestGoodResultTeachesDestination: tre stjärnor lär ut resmålets ord (新宿), +// en långsam vinst gör det inte men ger ändå en poäng. +func TestGoodResultTeachesDestination(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + for _, tc := range []struct { + name string + slow bool + stars int + knowsDst bool + }{{"snabb", false, 3, true}, {"långsam", true, 1, false}} { + know := lang.NewKnowledge() + r := NewRun(l, RunOptions{Dict: loadDict(t), Know: know, Seed: rng.FromInt(2)}) + walk(t, r, l.Path(r.Player.Tile, l.CorrectPlatform(), r.CanEnter)) + waitForTrain(t, r) + if tc.slow { + r.Time = 10 * r.ParSec() + waitForTrain(t, r) + } + r.Step(frame, None, true) + if r.Outcome != Won || r.Stars != tc.stars { + t.Fatalf("%s: outcome=%v stars=%d", tc.name, r.Outcome, r.Stars) + } + if know.Knows("新宿") != tc.knowsDst || (tc.knowsDst && (len(r.LearnedDest) != 1 || r.LearnedDest[0] != "新宿")) { + t.Fatalf("%s: knows 新宿=%v learnedDest=%v", tc.name, know.Knows("新宿"), r.LearnedDest) + } + if know.Points != tc.stars*lang.PointsPerStar { + t.Fatalf("%s: poäng=%d", tc.name, know.Points) + } + } +} + +// TestReadingGivesSeededProgress: att stanna på en skylt ger okända ord en +// chans till framsteg; samma seed ger exakt samma utfall, och efter många +// besök har något ord lossnat. +func TestReadingGivesSeededProgress(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + sign := l.Find(level.Sign)[1] + left := level.Point{X: sign.X - 1, Y: sign.Y} + play := func(seed uint64) *lang.Knowledge { + know := lang.NewKnowledge() + r := NewRun(l, RunOptions{Dict: loadDict(t), Know: know, Seed: rng.FromInt(seed)}) + walk(t, r, l.Path(r.Player.Tile, sign, r.CanEnter)) + for i := 0; i < 15; i++ { // gå av och på skylten = nya besök + walk(t, r, []level.Point{sign, left}) + walk(t, r, []level.Point{left, sign}) + } + if r.Visits[sign] != 16 { + t.Fatalf("besök=%d", r.Visits[sign]) + } + return know + } + a, b := play(5), play(5) + if a.Count() != b.Count() || len(a.Progress) != len(b.Progress) { + t.Fatalf("samma seed ska ge samma inlärning: %v/%v vs %v/%v", a.Words, a.Progress, b.Words, b.Progress) + } + for w, n := range a.Progress { + if b.Progress[w] != n { + t.Fatalf("framsteg skiljer sig för %s", w) + } + } + if a.Count() == 0 { + t.Fatalf("efter 16 läsningar borde minst ett ord ha lossnat: progress=%v", a.Progress) + } + for w := range a.Words { + if a.ProgressOf(w) != 0 { + t.Fatalf("känt ord %s ska inte ha framsteg kvar", w) + } + } +} + +func TestToiletAndKioskInRun(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) + if r.Party.Size() != l.Party || r.Party.Size() < 2 { + t.Fatalf("sällskap=%d, banan säger %d", r.Party.Size(), l.Party) + } + anna := r.Party.Members[1] + r.Party.nextEventAt = 1e9 // inga slumphändelser som stör testet + + // Toalett: tar ToiletSecPerMember per person, avbryts om man går. + toilet := l.Find(level.Toilet)[0] + walk(t, r, l.Path(r.Player.Tile, toilet, r.CanEnter)) + anna.Meters.Toilet = 10 + anna.Urge = NeedToilet + r.Step(frame, None, true) + if !r.Facility.Active || r.Facility.Count != 1 || r.Facility.Total != ToiletSecPerMember { + t.Fatalf("toalettbesök: %+v", r.Facility) + } + r.Step(frame, Right, false) + if r.Facility.Active { + t.Fatal("att gå avbryter besöket") + } + for r.Player.Moving() { // gå klart rutan innan vi vänder tillbaka + r.Step(frame, None, false) + } + walk(t, r, l.Path(r.Player.Tile, toilet, r.CanEnter)) + r.Step(frame, None, true) + if !r.Facility.Active { + t.Fatal("besöket ska starta igen") + } + for i := 0; i < int(ToiletSecPerMember/frame)+2 && r.Facility.Active; i++ { + r.Step(frame, None, false) + } + if r.Facility.Active || anna.Meters.Toilet != 100 || anna.Urge != NoUrge || r.Served != 1 { + t.Fatalf("efter besöket: active=%v toa=%.0f urge=%v served=%d", r.Facility.Active, anna.Meters.Toilet, anna.Urge, r.Served) + } + + // Kiosk: direkt, kostar KioskPriceYen per person från kortet. + kiosk := l.Find(level.Kiosk)[0] + walk(t, r, l.Path(r.Player.Tile, kiosk, r.CanEnter)) + anna.Meters.Drink = 5 + anna.Urge = Thirsty + before := r.Card.Balance + r.Step(frame, None, true) + if anna.Meters.Drink != 100 || anna.Urge != NoUrge || r.Card.Balance != before-KioskPriceYen || r.Served != 2 { + t.Fatalf("kiosken: dryck=%.0f urge=%v saldo=%d->%d served=%d", anna.Meters.Drink, anna.Urge, before, r.Card.Balance, r.Served) + } +} + +func TestPartySlowsLeader(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) + r.Party.Members[1].Urge = Distracted + r.Party.Members[1].UrgeAt = 1000 // går inte över under testet + r.Step(frame, Right, false) + if r.Player.Speed != DefaultSpeed*DistractedSpeedFactor { + t.Fatalf("fart=%.2f", r.Player.Speed) + } +} diff --git a/resources/data/levels/001-flygplatsen.json b/resources/data/levels/001-flygplatsen.json index 29bfb2b..8be217b 100644 --- a/resources/data/levels/001-flygplatsen.json +++ b/resources/data/levels/001-flygplatsen.json @@ -6,6 +6,7 @@ "ja": "空港" }, "difficulty": 1, + "party": 2, "destination": { "ja": "新宿", "romaji": "Shinjuku", @@ -18,11 +19,11 @@ "####################", "#S.....#.....i.....#", "#.###.##.###.#.###.#", - "#...#....#...#...#.#", + "#...#....#..K#...#.#", "###.######.#####.#.#", "#...#....#.....#.#.#", "#.###.##.#####.#.#.#", - "#.....#T.......#...#", + "#W....#T.......#...#", "#######.#########.##", "#....GG......i..GG.#", "#..p.############P.#", diff --git a/resources/data/levels/002-shinjuku.json b/resources/data/levels/002-shinjuku.json index 9c28fda..511c6de 100644 --- a/resources/data/levels/002-shinjuku.json +++ b/resources/data/levels/002-shinjuku.json @@ -9,9 +9,9 @@ "fareYen": 200, "grid": [ "#################################", - "#S#..i..#.#...........#.........#", + "#S#..i..#K#...........#.........#", "#.#.#.#.#.#.#######.#.#########.#", - "#.#.#.#.#.#.#.....#.#...........#", + "#.#W#.#.#.#.#.....#.#...........#", "#.###.#.#.#.#####.#.###########.#", "#.#...#.#.........#.#.......#...#", "#.#.###.###########.#.#.###.#.###", @@ -36,6 +36,7 @@ "ja": "新宿駅", "sv": "Shinjuku station" }, + "party": 3, "signs": [ { "text": { diff --git a/resources/sprites/tiles.png b/resources/sprites/tiles.png index ab95afebb34a5fbcb45a1c694c877170850dbc31..d0fa12f15d4243f820f91f2757292394eeb84ac3 100644 GIT binary patch literal 879 zcmV-#1CacQP)000mO0ssI29%thZ0009vNklR6vvOcKlue45{e-T3)@3RK4eNglu%Lj5E|x!r4PPrU=Nyv2?_Sc9t;zyeDT2- zAGSYWNJ0=ML}`SPRA5v@Lkr5%VnpOa6k3ck-`Ux@_YQaV&uH4`fcw37&Yd}U=IlK) z>#09=g`7~jvjj3mSW)uw^D&AsAC3C_evH2cJ$|P2r`cBKm(*sLB%;pAx*VA zi0D{d6(*d~-Pr<}%DZPRR4@^RGCGN<;rC@sI5;Y4k%?|d4#pkO($t7KDMI%qAywOU zdJ0nK?e*P|>o~zKm`o9CR=M<_`av|7`OBaeWbKM7SU%7D+2#$6w+<~vh79ea+80t#UGN>OtF_U``cr>q66cepZ#)X<1q(c-WU51 z7`3Y{@fh8*sB^Z=uhjFUq`x*4`HSLb(Jp74zo|BE)#%;ZM0BDthzT7nTjrgWyUUs< zE%At2DoZ>v=JWf*in89nqI-KTLh7`&TW1`xR1<(?I9$bX2w3kDGi4Pu(-R{YC4zei z9$)N%B+8{%-=LT6XigWTt0bAubekxA6tK=lrY`FznAZbBSxIZV@#N*WV?N@s!?Fh#Ut|nGXMtZni~53^*sOp002ovPDHLk FV1nYXsL=ob literal 692 zcmV;l0!#ggP)FMNkV@%;4%s9x`n`8lYAjU!`FMtuJz zsFX~47ZIHp9Y!KFD}adRI<64W*w33tX!I&Z<>f7?fW{1+%ZwuzrU?iDl|^91(CUWz z3sEVuZ1;P!1#5=v$^T>myg%JOKl`#3pgtw*Dim72aO>LPUczy#sevi0IwL zPV}@$%{K=>osaSW9mJ)QYO5IqiePX6{(LnQu6k=3uAQUnj(9?|%AC@q<$ z@b5N{`_YX92kU!m*Oo3e;mTI3{-op?N~NGm@BgRn-{TUk a_%#63Whg<*s+QLP0000