From 9fc7e94074dcaff77ef1fcbabd24b1ce22203169 Mon Sep 17 00:00:00 2001 From: claude Date: Sat, 24 Oct 2026 09:50:12 +0200 Subject: [PATCH] =?UTF-8?q?M6:=20pl=C3=A5nbok,=20biljetter,=20kortet=20i?= =?UTF-8?q?=20telefonen=20och=20seedade=20minispel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sim.Wallet: IC-kort, kontanter, pappersbiljett, telefon med batteri, spenderat; följer med mellan banor (Game.Wallet) - internal/minigame: gemensamt Game-gränssnitt (Update/Done/Success), all slump från del-seeds: TopUp (hitta チャージ, belopp, mata sedlar), Ticket (taxetavla med resmål på japanska), Crowd (tidsfönster, två försök), Ride (stationerna passerar, kliv av vid resmålet) - sim.Run: spärren kräver biljett på biljettbanor annars användbart kort; telefonen ger ×1,1 fart men 15 % seedad omskanning (frysning 1,5 s), dött batteri gör kortet oanvändbart; automaten startar påfyllning eller biljettköp; tåget kontrollerar biljetten; fulla tåg kräver trängsel; resan avgör vinst/förlust (fel station, åkte förbi, fel tåg); StepMini låter klockan och sällskapet ticka medan rörelsen pausar - level: ticketRequired, rideStops, Train.Crowded; 002 är biljettbana med fullt tåg och fyra stopp; ordboken har stationer (kind) + sju nya namn - game: vyer för minispelen, plånbok i HUD, P i menyn = kort i telefonen, förlustorsaker och spenderat på resultatet, flaggor -phone/-card, skriptkommandon hold/waitstop; inforuta/minikarta döljs under minispel - plan: M7b (Björn) – tågvind, ankomstindikator nära rälsen, in-/utkörningsanimation för tåg och bussar – i spelbeskrivning, roadmap, testplan - docs/README/wiki med tre nya bilder (automat, biljettavla, tågresa) Co-Authored-By: Claude Fable 5.1 --- README.md | 31 ++- cmd/metro-puzzle-jp/main.go | 4 +- doc/img/level-001.png | Bin 18481 -> 18555 bytes doc/img/level-002.png | Bin 18062 -> 18215 bytes doc/img/menu.png | Bin 14271 -> 14542 bytes doc/img/platform.png | Bin 22972 -> 23052 bytes doc/img/result.png | Bin 25758 -> 26139 bytes doc/img/ride.png | Bin 0 -> 21551 bytes doc/img/sign-help.png | Bin 25215 -> 25363 bytes doc/img/sign-learned.png | Bin 25487 -> 25568 bytes doc/img/sign.png | Bin 25682 -> 25851 bytes doc/img/ticket.png | Bin 0 -> 21965 bytes doc/img/topup.png | Bin 0 -> 19761 bytes doc/img/words.png | Bin 16184 -> 16169 bytes doc/mal-och-tester.md | 7 +- doc/plan.md | 5 +- doc/roadmap.md | 57 ++++- doc/spelbeskrivning.md | 11 + internal/game/game.go | 11 +- internal/game/input.go | 34 +++ internal/game/minigame_view.go | 156 +++++++++++++ internal/game/scene_level.go | 67 +++++- internal/game/scene_menu.go | 13 +- internal/game/scene_result.go | 15 +- internal/game/script.go | 29 ++- internal/lang/dictionary.go | 13 ++ internal/lang/lang_test.go | 12 + internal/level/level.go | 35 ++- internal/level/level_test.go | 18 ++ internal/minigame/crowd.go | 56 +++++ internal/minigame/minigame.go | 38 ++++ internal/minigame/minigame_test.go | 206 ++++++++++++++++++ internal/minigame/rand.go | 12 + internal/minigame/ride.go | 70 ++++++ internal/minigame/ticket.go | 53 +++++ internal/minigame/topup.go | 107 +++++++++ internal/sim/run.go | 240 +++++++++++++++++--- internal/sim/run_test.go | 278 ++++++++++++++++++++++-- internal/sim/wallet.go | 67 ++++++ internal/sim/wallet_test.go | 35 +++ resources/data/levels/002-shinjuku.json | 105 ++++----- resources/text/en.json | 35 ++- resources/text/jp-dictionary.json | 74 ++++++- resources/text/sv.json | 35 ++- tools/shots/main.go | 16 +- 45 files changed, 1779 insertions(+), 166 deletions(-) create mode 100644 doc/img/ride.png create mode 100644 doc/img/ticket.png create mode 100644 doc/img/topup.png create mode 100644 internal/game/minigame_view.go create mode 100644 internal/minigame/crowd.go create mode 100644 internal/minigame/minigame.go create mode 100644 internal/minigame/minigame_test.go create mode 100644 internal/minigame/rand.go create mode 100644 internal/minigame/ride.go create mode 100644 internal/minigame/ticket.go create mode 100644 internal/minigame/topup.go create mode 100644 internal/sim/wallet.go create mode 100644 internal/sim/wallet_test.go diff --git a/README.md b/README.md index d144ae2..f805b11 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,12 @@ 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:** M5 klar (2026-10-24) – 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 med sina behov, och -minikartan visar bara avgångar och riktmärken tills du utforskat stationen. -Nästa är M6: tågkort, biljetter, telefon och minispel. Se +**Status:** M6 klar (2026-10-24) – japanska skyltar och ordinlärning, +lämmeltåget med sina behov, minikarta med dimma, och nu pengarna: tågkortet +fylls på vid automaten, svårare banor kräver rätt pappersbiljett, kortet kan +ligga i telefonen (snabbare, men batteri och omskanningar), fulla tåg kräver +att man tränger sig på, och på tåget måste man kliva av på rätt station. +Nästa är M7: svårighet, tid, poäng och debuffar. Se [doc/roadmap.md](doc/roadmap.md). ![Skylt på japanska med delvis översättning](doc/img/sign.png) @@ -26,10 +27,18 @@ 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. +På tåget passerar stationerna en i taget; kliv av med Enter vid ditt resmål. 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) +Spärren drar från tågkortet. Tar saldot slut fyller du på vid automaten, +där du först måste hitta rätt knapp bland de japanska. På svårare banor +krävs i stället en pappersbiljett till rätt resmål, köpt från en taxetavla +på japanska. + +![Automaten](doc/img/ticket.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. Minikartan i hörnet visar @@ -113,16 +122,19 @@ 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 改札,番線 -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 -seed 7 # fast seed för händelser, läsning och minispel (tester/skärmdumpar) +metro-puzzle-jp -phone -card 0 # kortet i telefonen; kortets startsaldo (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å tåget, använder toaletten -eller handlar i kiosken. H frågar om hjälp vid en skylt, L öppnar -ordlistan, M döljer/visar minikartan, Esc går tillbaka, R spelar om. Gamepad +Pilar eller WASD går. Enter väljer, kliver på tåget, använder toaletten, +handlar i kiosken eller startar automaten; i minispelen väljer pilarna och +Enter bekräftar (håll Enter för att mata in sedlar). H frågar om hjälp vid en +skylt, L öppnar ordlistan, M döljer/visar minikartan, P i menyn lägger +kortet i telefonen, Esc går tillbaka, R spelar om. Gamepad med standardlayout fungerar: d-pad/vänster spak, A = välj, B = tillbaka, Y = hjälp, X = ordlista, Back/Select = karta. @@ -161,6 +173,7 @@ cmd/metro-puzzle-jp/ programstart internal/game/ Ebitengine: scener, input, rendering, skriptläge (enda paketet som får känna till Ebitengine) internal/sim/ rutbaserad rörelse, kollision, kamera, banomgång med tåg/spärrar/hjälp (ren Go) internal/lang/ japanska: ordbok, kunskap, delvis översättning (ren Go) +internal/minigame/ påfyllning, biljettköp, trängsel, tågresa – seedade minispel (ren Go) internal/level/ banformat, validering, framkomlighet internal/res/ hittar och läser resources/ internal/rng/ seedad slump diff --git a/cmd/metro-puzzle-jp/main.go b/cmd/metro-puzzle-jp/main.go index c7b2040..c7f4521 100644 --- a/cmd/metro-puzzle-jp/main.go +++ b/cmd/metro-puzzle-jp/main.go @@ -22,6 +22,8 @@ func main() { 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)") + phone := flag.Bool("phone", false, "ha tågkortet i telefonen från start") + card := flag.Int("card", -1, "kortets startsaldo i yen, -1 = standard (tester/skärmdumpar)") version := flag.Bool("version", false, "skriv ut version och avsluta") flag.Parse() @@ -30,7 +32,7 @@ func main() { return } - g, err := game.New(game.Options{LevelID: *levelID, SmokeFrames: *smoke, Script: *script, KnownWords: splitWords(*know), Points: *points, Seed: *seed}) + g, err := game.New(game.Options{LevelID: *levelID, SmokeFrames: *smoke, Script: *script, KnownWords: splitWords(*know), Points: *points, Seed: *seed, Phone: *phone, CardYen: *card}) 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 ba959708b165ae8659444e9c35aea8a8c27662c0..219975fc73dd72c16021047c45519e4b43725e39 100644 GIT binary patch literal 18555 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 bK@gpg%QT{zm;L1*`KTzU%NJg||MdR=K9tKO literal 18481 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 diff --git a/doc/img/level-002.png b/doc/img/level-002.png index 884b333e036379ba9563902e5a8e0f0bf70c926c..50d6f117cc4977b117748c4f098f96ae7485c530 100644 GIT binary patch literal 18215 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 J{0lb%{vX!jp%efB literal 18062 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 diff --git a/doc/img/menu.png b/doc/img/menu.png index da9541c83a5adc441a042abdb50256258e4ed3dd..321ed4132fdb17388e39a52de78caf3eff3de4ae 100644 GIT binary patch delta 3251 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 delta 2811 zcmcIkc{tSj8rPVK6k{|JGbT(~Dr6ak2o+L|$uf3YbZlcXlszOw!;teUj-`g`OsGs# zmh3g1k)*Qc(fN1jlOF*{rQhmwGxWd49Y4%hA&aLDoRbg-pZOx5vl2nna0e z$)92@C$7EwTL1bga04uDsSS$Ijpm8O+hZ$PTuCtoIVA4YKBOD>^Y_&B=sx5m^H&e* zrAa%>l4CQqSko+*V$4!e!sMVUoG@v164odlXs{%O3>RL|76+~f!U1uJ5EwSvxCNkT zN$Q5Av#f4rQ+kgR{EAh~k_)_m?jdXRwt`QQv;`>0~ojb?YiJqwPwDa6V@XPa-_FWd4Gxo;oV&at@SzZYaZ{~c#bJ+ zY{2G{I`l}vUHd|cKSf86;?}`_Z+*|7nV8prma6I+DF4MkbEZ@IJ(94H&J#VP8DI-g zz^J3?+r6YV!YFm?EW@aVzse8B>t#?3(_E<*rR7p5sB7Y;>hgcoC*Yeshn~$i21eKc zlMpFF_?B5C-X{-pJGt2Yufx@REl&Fry)C&#<<9$zI#0@c+)9;y9fcGv+Uz9wIQqRY zF$dEkD8OltuR#Uy#$ifvBTCNJRh#)ZoI46p$$Q3fUN7s7rwd z2*N@@l$xxXHe~T6bNHB%q;z1jNIYp5@;w507PJ-&54{bhtB{B&cIg?yw+U*V8x2GpP z3bRFUW|&vdFRntq!x^y+nj@JJ7lt`bcOL4UQN%Yqy=jwMpXc!v*W7*)kpa{UMy3Vq zZA)r61ytU=c&)=CSe9&E?sCbyEr|B0Z}&*vn~eP$^`XT>o3a46hi25w-FV-pRF75* zWmQ0_q$rBIxaVR+W@si-zb^IWwa+^K;t z(mQly7_uHSytjU|&%+-B2eS}FpRW$hk9ADzPKh#3t)%7_DULYhF@GPdO}ArY6YnV| zT6z?=?A9}PSA9HZ#tF=(AL=*^WQ+99X6h*}Hy8GzJE($I@WKzTzy;5^N%->->D$Y#C3UePM$6t^wagRw1n59@nvaQ!6 zy0{luCfY0q_Cq*ioTKvN0tM8;!ckUn?xH30oTTN`IqHSGe0=QZJY}W1Zn?~A;@}Q6 z@qH##sl#?Ebm^I!Etlj{d4@EVl9&I4u3n7|y8Z0E&vS2F9HwHg!Cg8lbHskM>=Ooq zA#mGWFCWE*7WjluJ)reS&0{c&(GdlHjQl6V3zA`|GW*A4H5pwPO$^4&scZD!j(8nb z^jUlCgP?XO7goh8%oHJR)V@Uy#A}n&l^s8YJHjpel|}wMhep-@$k{Xp1gKJekI@%p@@5!Rg-Nk( zAGXPSxb97V>#6Q0iJvG+iJKcr-=ZC@2tZH=krCsdl}igbx9?U(Me`Dl?`Y0 z@pKKp*aI*W(xeyCwRt0iofBO7I)4ZOJ&WwCmPz~y< zt_%)G0WVPqEc z0x(@kL!=BhA%RuWuh4nG+NGy@GPJ8C-&}TK?5^T9O2tgeF@Kl(;Gx`n9Sk0he~YYg zICmfGQzAN)mN;-+Lw-$4*0w|33nsP!lFa@HTQ#T}%|lK)$1RbZuZa(7uHtCW+s>`lyY zS3WJRlB`28_%rdfa+q53KK{IchHab6GrVE#G5@xs&FnId^TQ-Ia26%2S-RZ|u@OeE zi_Q)-ei0R&2x8EaJs?-9cZkK_nqLHZ@32MFvcIte7M_L^d z2ACoUxzzvBd#fhP1TaCN0uQAdcmJQj`E&E4r@*Y>ZIIe!=Qe@0V_|A}wD9nmtN#Gb CQwVeb diff --git a/doc/img/platform.png b/doc/img/platform.png index 5b38c4daa610c36d8c9ede86fad5ae7b6534145f..1854c7d49d54a5eeda96d85c9b4c49d674259028 100644 GIT binary patch literal 23052 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 aWsGZn7BnJH5`MexrYNf-Q!4fJ<^KVF0yhx= literal 22972 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 diff --git a/doc/img/result.png b/doc/img/result.png index 5ad2513dc6579282a57bca9d69cf598543898a64..f08306f9109fb2425d69de85dfe295a4734bf9eb 100644 GIT binary patch literal 26139 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 A4FCWD literal 25758 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 diff --git a/doc/img/ride.png b/doc/img/ride.png new file mode 100644 index 0000000000000000000000000000000000000000..91d80ade70278958a89e2bd87df1192ab387c2f4 GIT binary patch literal 21551 zcmdtK2UJwcwl0i`-g9HhZb8bYU$h z6x2^BDAy@5u3xoO0~8;kpr{7liRxI#1Dk}^E{^6~}{+XK_1dt2wR z^LuJxc(uOzk>kl|?`5+~!c#S;vE)tiBA1n z5?*3G-5WHmlEd)ncS6m)qW$bn1&Omc1JmhYN0tMj2ISzc9cQ2>DUHq1s)K~&aZ?Cj zYaU^{djOe>@+k*)DXI~#YQz@4eJBvslypI?f-A^m^?@qYnU@zo%J%M}c&m>eD&|c> zJbKC}0+D~!5bjP-X{RQTwQ`e7bL(DoJI|R2g~sNJ$vehmg75=DWBXMy=q)(}hfi3p z!fqjtdseT8;!KD8t_rsat)@{IuS{-&Q-GGutKK0Ar3QZUj+!UVtBL$x+AAE49#J^_ zg!{M9$&sKQ2UQ*g8K?-v2dKpCKi7m1@CvT%YuA9NL_im(7Hxu1sIQ>6&bc`UByN=- z?if!t>QDR6rbP=3Rn-RoK)MYWwwaI^&mt zz}|?qI_GoR1$De+YZ4g}>J!m7#f_O3>6T#^Gj+G;WDYK1@Yc02;FGV1n}&;&EeE-V z{KnyKV#)sMa>Au95ucyW+t>nT`sKR8r{=rM{Or~d7arg)_izwN2km-S)BIe^3dNkT zf2sL^;_<7l^Jphy>?vLMN~7uY=Y^}LagSEuT|1n{ckIb~;sZowNOaypHNSbJ={Y4* zTZN@WsN^YaM~FAu2Q@kDHrkk|^a6C6md@=nAwhtpjuUk@)8lCBodA%22h1-e0i;iB z{U!3y^Sn>JA$_;$1c2i$OuiIRlzkE{K?=Q;gpGXiDw(BO&Y%YIoa~uJfc@)_1Kup z%@mDw>fq7L8zZ-1)`YCJ3)7*#XK5RJu}-_e=}7K=un2>-p5!i=uMT$mjb?y7oL_%z0yJB(~jG|kW{OpKeqgp8Qq z^4vLzSE1VzDQ7Y%4gbeEetJWXQ3(T9bnK6ZS~;FiayW0O39PWX0!i(AW94fp9QwFI zte&|=@Qvs);Q;r08}rU&SUQLr^*oJun!H>^@)^dMyBnB>2THZzB<&6|FCz&8<{4ON z9n}*_D@N_^gddn)^QGY+4j(MEwba>NU`Xif;rH+jABqN(SD0OXhQ=JRsbY8C;VI$5 z<3S2XuA50{$WSkS9lii_h&L2fH89wW>v&3&_;vBt%8N%-##30==&|C!&z&^L?elFi zFJb#@U*870Mt^oV-0`q19Ctl=LWfo1fLLGHHIH)jTO=5lBFWV6STR`H7Ci54qjlw( zepu~eyX`HsZP|9_Uo}Y_Q1X#;jfGMgLBv8iiq zvloe6D2v~b&)Z5X{-y=p7Gd1%9h7G#^2XMfsW1#-F#-52A#&;Z_q!JtFhN@sXmI8n ze~@|m!Ik{c`3-MaocBc1k?w`Mba>S7gKSSLAP$MI9u6>`5~t~lfL%ebH2u4je;=!N zDIGdyf`Q`JJzq*3awR5?303J3UQXTLCEF_uyG~GzFV^`=Jx?M1?HJF# zYO!}vpexqrijN5^bupW;8?D#=Hk1fk2_7)K+EOU2z-_?a?d0>j^%#RTR^tq;_;Ro# z=BS_V!fda-`mLnvEObMk0Ce$9sCrR+83`cv8L~)$O+V;RX86Hv%ee?IevPMkulmA< z_i0^y-PlxssqoAkZ>9HMXKI`G;83Y`yGqi;Ui+rFENPlz;r+MYHkM_|iVGj~_4V_K zEX=*NiV0{)AF2HRu`3Qog$9u?)dvDRQ6J%`y1Cp{e+~JEqAtwXE?af3 zqHi^2x>kxVcdFh&vPdfi?CWy1L&Jv~4r6N`O4_81-qui%H+CFQ7~)sPp#9F+MSKs_ zbxJitzx^Dxcw>I`!xyv`zQMQ6ep zkvd-Hor9WG?6HEaxqEw?H+B*Y8k#Q;-1jLrWd|k78=*x@MgCdq;)e%t#M27>#b_Pc zIR2rxvexe{V38UtCYb z;B(??6>_Umj(_a*c{sa3q1DlC;X!%+bWwV+Ya1DtM+$@TLXT!)oRId1&4kSNS_4mc z)V?vAoH$BZdWXJ5Wep)mzJ+NY9<4n!nnW|>qbQSL{~v!gvif6zIQ{?3HGtFhP8 z$Qi287};I16T^+Tlq~_W#jY8q)T@(=`afnNQqGLT@>gZbc}#l;>x1Hx|JW4A%ao&> z_b%6otB%h&<^+-I^pX}R)-P94_U!V^i?4#s$Ku1llXuQ{4HXoVk63Rf@j71^N$^dj zRa8`Hn~ViDAGH$jN~C8W=W7>rPPv#CKZ%&)zBPtjD4`YEo@jZgB%>LTU9Vp+e}CF2 zW=GJ;L{d^+o!c=y$w0K=LsxzN(K@AW>*w+7KIngmOWy0qbW(YgRE&(8?VXWuA%}Z3 z5zoR!OueCq;qBOwk&zN2PsxYL=Ip!UI-XA-@>&iIRrRZkrad;Ymlj~L@ zc>1<@cXC80HN<2T+k+}Fn)BYkhM-_>wfzk)Ikg2>r8p0`7IR*t#nV2C3eg zQ+7D)ijq>1%NZqh>U{$Hm}l^zO4&ppKv3dUgi$7Uj+{n>n_eA5y?j4mA8-5W z`iIT*FOd#rR!>BU_cPfx6BhGJRwuVTyESzKQ@YNKcZO&y1nnhNmWtApArB&^)1C(u z7kYo}tbr_L_YD`t$ePoytTxfm&t%t>%IW8Mvx%muPQ{$5=J^Mf>cxuPGDCuO=;I7b zq_}M8*1L~O1m=@7d5*BO5V;r#i*zudx3}H!%aNr@_x<^D3auG@zNIk-Mx&+FuX+Z@!&>&n`z|UDY4c+^Acd%WmUx;4&rzEY{pS(f}A0(+pS? zLB?jTo?%DJmn(a~;(bst6dwII#{b*wvgKRtoKLf8@{=;jkq=Ic`qk$c90r{ za*nNC?(jK>G`a_SF#HE*{F7B?F}5f?;;8?<+vUbO;CNTJ)BHZpa_t?+U90-NEdth{ z>n+s}ar=VXQf-YKF|zJZU8moD^DZD4Md_tgWLD$i-S#bkm=-s|yi4b@-N8VN z4Cc)w)IOgzafb}SK}s_`o?lnJ+kL2I7z0ZHy3#I%CKcw64f!QohPmalTcZV=hE=TZ zdO{YcPopy*#RVl z>9QA&7RmdgM<GYJ<&Bw(Lo1P(4W8qp$1z>>^-T#hTc#RYozTUPY4}ZP zeBiX|ID@>i=&+KeNQUdEdywmC&xG0-XX1HUS8J9M4U3JC@yz5-4MT3`{T-k}NAij7#;agjim^SV4SUb$_gzwbjz zaiEPoV0hHN;tr=y|~N)EAFl9p)D#P@s!mjV9G;WOi03pJIV}ld3S#%=%N;#QfIf zK!egIVm`W0f}OK$$!^H5-_x(!8s}_%|9GC)?O??&f2+CP!yWO6i6QQg3^Id`M*d5j zVbJ}`NJ${a>O|=)Kc!<14$X9`@UppD!I}wmhk6b7^KmVvj^T}q`0XzL+=!lscD7j? zH_^EtnJx+teYn7(k{U`fKOPRrB<<<-^{!t~aTPmhz|oGVPtS7Q^;f*JveBma*DCz+ zFHNTe6D*m?@#(PUh4<_11$R-UCaKiQm_at)G{JV#*NrfNH1H-&AT??iUZ&=Qj{EE6 zUC%jb3-)>@(Tui2&xeyUP83gu$JI73%IMwONpj=BV@xy`qNkuPhW-Dykifnr)QV<+im<<8_PfYF;6|_ zC7e~%1BW>g{CGx18OOshMyw@X0;0aQfai2WQW`V9jXPqOuC4vCVB>D!_;|pgd&kWL|I+9@0@5r} zmY;`@!Gi>j?HD}QkipRh#r^p7;;mx8R9%=Db(|ad#y4oWbQ{4)ATX=ZX>D%3g89w2 zJoA(nE2A3~1B9VPJf)JM*dK-%Nv6~ENJivjf90+s|-GzdHbyCn}Nn*p{vq> zY;bknifnMo@Frk$!Xuv>C1^eH!9Xi?7P~Jy<_?al5R6wkW*(QIi9&kBY(S1tG!nuf zw_b(y)*!-~>wr6mY>731F3cpN6UQn-1}E961ScZo6{pTpl>x_Gl0U&*kof?yQz+Hh+FLZFvcvF z(jWzVIyBE)hnSF-yogN1mlB0+x6VfP+vjBAx8N(RXv{+8gNG!`abrd7g@##TG3A*# zCyAz`DrZ7lLLV2vr@nDUkhkSxB9+_eFmc4dJk>JazMm3`zINHj1%lE?=n2tXrQD3C z*9akBcq41k`7<70k0lRmD!5G+>)EAyQwQ|yYugzUlI0?2b zGT+$S+1m0SFocRNBLG~6%~!zG`|-y~aZC{W0++DmZPTNjZyC*nTD9eBYS`7mHKqFF z6D9&@7yH|$Rp+N0Z;qDc<_i;n%R@1BC#qwWT8^(%09QXq4OL$;gy#%Y#60|1_gwRY zRpZTS8N)yBrI*jqSX8K>RxD2863bFNEt#` z;z0;5R15B~iCDOEpH@R%zRS?ap|O^uN~aiXE&!4Y`ZD-QO$3% zp5MU*C$IvwCIXLm&-_#Bc|{s{+dKc9>^(rVQ56>*+h4Vrrh0NXj4p*xak^zKrmJff zn}o`;x!-p|<$!ViKyU6Mwpy=aL?lgY4Jri5ySN~W5IXV{#16cuS#_Fq1 z*C{f8?u+O8+#7KlKb341g?GC_w!>Amd{O1^>&8XZ0Vq9@(MEL#9O?i?JmqnoiF(N9 z&F)9tNo!gsI`E>~%trm~>MCaji!c5*G@|^otz+MOGaaI$BLecL#f9fpMgrj7>BAi= z((2jVbV?& zBMRNN0=?xG+~g5k7E@I>`KpFjjwd)kU2;p47z&$QGX#2l+K3`W8FDtd`z=OZ%PIbYSpHK;J%AaAau-0MyrdFkrzuxUvpD~qhr?AE)(yv)qhZAsF1t@z zFN?FH-|c$dn1iv^lRTAb@n_S)+A+?d&3nPH@oZNzY0aU$b|Trfsn_=F7C(R+hX=J! zoO|$ps}NO3ulM-o29E3WXJ;$^JpF~G=Kw6q(xgIE=FCPtH$U!1h?ub5D*f!?zPJ|; z6##a-9X5a__C~f`;JnRXll`+$gK6o;?w{#8_Mrd&VtW0Hs5Q#qTtYtaru<&li(YE0 zreI$5Bp;IuGPA!Z*4=mq?@=Oy!|lcO9kGy&j|Bw)(h3paSxw9MT2BIB{*i}^q`-d< z_k(ONE}CheIRzC!@I#{{Rkt+!j_uv);$_+%YU{=zewp$9dFUC9nBeB_ymJw6{(S#P zLYi(e1@2{Vxk#|N^3gdQd?{jH2T{tovC+vc}Q{WWn&A^%>dXU?jgj@H{M*-hj01u*EdR&*14eH#tF;OUtihlzUW ztiTadjJLkUR!v0ULl4Am+Xtp6YHHaa(dC{RVD@~$lJ?ui5m~p*?t|5>qZ3VyTB4C0 z8|C1vnQngJz(5((`BDX?&(j~NEy2{GQ!_iAW$)xa0<+5_yiBaqLx%Q78pMvvfZbwe z7M|XHOGlc`)#Mhkjaq>ojI@B*m(F%>DiCNJV~ zfNS>b!eh*r1ZWsyu7p+jn!M3t5@CG#D#R)YHE0Z zJ5a%;dU<;@X>lWPZ$vW?mxscPZ_qMhO1#3y1ho%6>Gy`fNpTY81UflFh3t!r_Yur- z{53Iy*qO|R0%06HpCZn{SQG{4>)&L+>5ayPfbLAHKJMdZ+_qBbE1ULe%Lyrac_^avmQm-+om+B7t zzMpS`8xt)=KBX$OQPmCiXN)-9c;CVJEc!FSbTqu4@;Ea4G$4cIZ3NbZ- zZC>oU#acERmNwJ0FJxt`-G<4&CTP-BBMy>8P!b6s^U=%KQhg@OfmlNbE%EaFDfHU%a<0fbhIdeOPD>oTB zOHZE+Yts+3TbG9(YgJ5*&N)`r)KIw5bedB>ePcR_6M#C9F=XZ}x8>#{vL>ScJIV$~ zPCC83|99fk^?tS~U|Xe=h7$Jlg)Qr>;P$ND`vnId=iPCoJ3B5L(H>cq6m6OpeQ+nI z%cd(Z?wnO!X*&$*{g8ovmY z?;cd7jk8hK8^5y@Jy1xKwHuokMjItcFB9C>c2*=g1!>GzquX1)O2mmd+{Z(}PiJZB zSgAnJxbX#&t&KkSq&^Ol({-)!-H2sxFr6lFe0N}9cfjU&m$b&5BN)|n`)>QkRusb9 zsDw)>chTRc_-ki8!sIdX zU$m#3^ETe&G;kYYh|NJP z?V+A<8vtSN%|#l)SodC|ZDGGO`oe~&aA1Vg6OkxfUNH8-un*ER09RP*&K{CVv6Kvs zFeL)sfo^r)J;`Y21HL4p8MsA2Kwz#rd=wb>{c9YnyoHr}9M7_f9ktbbMkPmAq1FKgs#0Cuzh;}u7iqI=e& zGx|Hz`n$lRbLeqfp4kI8r{t#=wE;m_*Owu*A4vU)^8eMRW)6C*Kxn#f$b)JvGYf-d{z2)_1FU>!oF$?m6?cHW_bB_dwl54e z08hkOIs}YJ00_f32Lgex3g$5<@2v@L#m?pZ%RRNH=ND6BU06M((#57Ggj~VcR>Ap(Tx7qpMn(9c#<2U3B zz88_|^idH-XVzf(w75scEa>ls5i?rS&jZb{wUl1W-|&&K z3XK+$X1={Y7ERSdszLgLd5LV|7>D*~NS0=u;F`O)heK*-lbXXbd8!6B{P;qco{loh zZPW5KdxL#h5ncLuqKZ#8)0-|fyb;P?Y89PYJ8jRQOjYj+rl7^UA0SI&nsWz55?Xc{$x;awb5julf1Z3^vy zyUy+}Jb*7~U2i;U^h>>Mb^O5P$rnEQ7j$a!_AORj7rL;h( z?JpX#&k4decK2%u!Y3ek8hX6~yJyvMPZuEkz6KKwE#(i(PTv|e*dHAe_Bb@}(il$J zu8lCiQ_Govk65g^g}=OWQdkYQM68@dtSrO20s2+&CR?v#{d78cVWLyqt1mb~l=tmF z2U_P*)<1l*`4W7{`7!f9#E^fFFjJ8K=@-ZB^;I7mP8FI&l{}25O&o!e4EH1km? zyqm6_#iyQYTHOm?5}@X83DRy*y!D7cib#j0#Ea_W4aVFl%91cI1+s4IcwY0*0)ms4m4q zpWjhTOD|8OIVmhU&+TT}n>aY>IhtzPa@ZeUHA7+`&)-M=Ii7lDU;8#a;Lif+E&D3j zJeO;ZDZlLBP*?M;{&)tjO1K<>)C}?E&+yYo3zycXrPM>rb<@vMW1Z~#W8ftFJ?KXV zu#tDi71LTfM5V{+QVrdpaZk|uk&SKB(gO7TDVDJvsLCMa_aVMi&~#|j?^$4}- zl+u$=tQa3Fd)QNcbr)4sqx@{Z{>uyS|9J>_9UVpV3rF_FbOQ)5UA;Ne$v;%BHnA%j zT>Vu=rwMxZs;zTfxAH%_Wopbba&4b1Mz+%WOJD^O;W1Mx3*`KdHprMWQ!cabWv8m^ z0!;uOGBPm;&^}Op%l)!6vLJY%zNnN&&vXh{0}&!S95Ms6Ey9q=!jB%5-DxE8bqbWj z7oHr!AcI`bydeZGlUeSz;6$CXlR^n#x(hTdtdPC8a;DADKV|&ei(XDsiZ#n}<>Qns zow`3ggs7{mar~Q4%c~mqkmh)oam<_vr%gasi|O>{4JyY?VoJ>2Pj#p+U%681u9Gaz z@(S4Bcq8DF5mb$8b?-6Yk-Nv9tb?+9^ukP+Y1A$Ek+u;=8=#ti>MtQ(Wc%5c*?fkt z1G>79MnRnmu-65!y@l!!Uh2JsHx&hrw=ow7>d}-AL{7-~OZ;sZrC`Y%Ev;@P$PApj z*cgcTim(b5Snqn9nRA;O7OZW1#i=CMeKNH4dLp>`5=&_p@`u zTTX}Pg=(RHDUpZ0I6v>I@12WzU&O9LT4{=Cu5z<0W_AKR9~}4ZXmgtMN2Je?O4;9E zO#;F;5cTFubwgmM`8hDja)zotxSi=9_rOAIEpvP23tz8W>3T&qX?14trB@z7c0`ga^`)1$2KNjXq%4&z3*G2 zlm`Tg*IIt|UH$|TVx6ep>}?hI5a)N7^~Q3H0Z^ zhPs`t*@bfV3kAro;(NGMPV-O(7>Ljhm4EOpOLN_1b@kE9biFBj^eI@eSali=cyPmT zhR2)GRvu)d&|Jk}Ocxr+XamDR_if?W|F#2@L$=TZLrAvmZIt?1Pp@z{)qs?|k`jPk zX@OB_o@V>q@1o}LM0bKS-0%zSL!lL9o@SsWl6)IX6y1^q?;u##>MpD|GFud=N3=iP zz9RU(^Du#W#K`?w#0ID6dwr}C5-GQ;shPG&s|F($Jt}+Z%HZciELu{9W_OCS)GF(V zwBlq9qk^Sah(BoL{Q05RE2_H_c*1$#7z&p$T1%&1uDai_;B6@4W*iBL@hq!^?0=4I zJDQz7^0an7rVLNz?-#WvSGL-e9d>(OIKg?D39>rGMB% zl}W{aLc`j?7l~(B>A&v57u9}!+4DWZNg!!Qir+AA7A7}5XpjDiML}+WOaM(;QYI#x zROKT@4io#0?p8_eaMN)xf>=awd{Z`!%**{!;{g$t|Km)>qVmaEPjI+9C-a_cmxw$N zLAz5wN0X(~D>86`&^v6p8S47!%LWZcbom)#`ha8v1daAU1uM5%0bgwfUD=E zvk$D}S6Ph}pntR9{<>3v=+^zqw$A*BH1>3WR9%8wbBJ;d3@1Kb>3LLdo~a1v_Jose zlnwfh%ej~Q`JCJ2xSPfdj2lNHwjaXS4~ad3Mn9XmQyci3-(w05$?pBHq`PTfU+=3a zosa^tU2N_&xLR?J@H9;Vb6vb>O4as9cFu-?xNzf3_Pr(bwZxBS19IOd4?A4;><6SH zS}F&Y)NY$0!FucM|EZKaYs?IOrSEfoG9zf&8FFrk4_@L$Lh}1C)?*YhnEz!@|9U;L zU-~aYb|RSQ)NQiPgkAXYZ9r8X@UQmUC;OcU(}o$TDaFf=4hSJk2?Np&R)%XjGmq47 zlGwDJgVEHfrq%A2wSTs~n|Wc*tf2+k<9AhF4B1fBPZxRfvx)8qL~iT&4;^ zekk~v2A20-sV1+ib1VPPh8j{KVG~4$j@t zoH@n!8n);$-R(kO(#cE$m_7S-Pq#Gg^ZV#2;4NI8*1Cmv z#(+Lcbp4?awh`G&&GEX4t}cZ`^`y&2M2*AAGMf(FJ)u{u=>yC3n9C-8t%JA{v{JrM zRDtyD5QstSzX<({uGQ0wDqFL~!PZQF3G6^(JXT6Afyy5n5U&W*R5=2UfEL(?r^COkQn`aC58&5-Ttp;u`o|K7C*2BXPZtZU3oU8x zrvbs1Ue;DCn`ue5hHQ?0C%&GO4t_UC^-f?A z`Cvr|6bu5T#C~Zhydsz`Bbqu=417Nai<=w&2!8QcdS*}NM=|_EI^^yTA`|A{`GDr< z8)UY3T}u^1O9Ovm%uFxaPH^1@q5p3KS5Fd08198TB?q)};7AaT*^!cCqHB<8)Z*?U z2sIvE&mn$f$6{G_x~I5I?;M^QvkvRGAFball@8Wxg4-7%)#QHG@9Zr7jp~8K5e*L3 zPyzooW=e&{FULf9?GcF~G<8h?#9kh#bFIC_y(7&gEIIIJ&CCqlJ;&$yqT(+RgcYbF zkkYzHgqLUg8-WQstj-#tK3~=92gtG?*2$100l1@xgD<}At86n4v_+Jb?Z}t089v|= z+giF`-SojZqAc~Izpjt&9{0+C(e0Tom3a35`IH$cJKMBp<%M_% z0>09Pj(0!LV?70lk$FY7biUDp<{SdMTy^juc0urVu55^fta3GvC$}%rzqd&`M!f7< zm8Ib<-U6@How?PMROV#BhuP%Bh%Kwbwa>#J)kY%;+A0DcltqnWI z4{7dM?J>Yv|9@d=lU0y@ZgtV&nve`7Yt*f!YWO}1o2V6 z`p9{BiS1}YM4{JZ^8jPt{d-sUyBZ80pZkMoN#eK7uFGd&ey@n4)n8ohupJjWx;-OF zst;%7c$hb5z4iEM=fbJ##QCJ&y2#a+f4nVe>1gSwX9j$!OSEORJxx%30UjcQ$$FQ+tgjc|S220%A=*^A<>BN- z)u}}`Vy+V4@IBou#0Lqf-`MpB-M?AMqaR$IV0Y1MX1f?muCXhMt1n4E04w@rJHjZo z4%E)gtAdS4_Qw#vb0y7f02+k2FiS#}(Op0^Gy|3@n>^K!XmGtZ{(T95AJd#fMh_0; zYVe;pMhEnXz;(q3jqyemA*ny8I=^e9Q077Kq_77uV-^$6f_&DNwfIA0rH~s{RpmO0 z4~Z;Vq>1Fb6PWnkR80mQU!vZ5s5;9^eDTE5<&D6$sF{L&qkflhG$iF-+pMsuf;I8M zt_RJ13^O#I>*UwMUQ3J9We^PhR&^IdbHwioFqSB%or<)4!beXLjoVed9&M$(yMrH2 z&1UziE&UvE>lbIM4|RT#R`PSIN%%_{0UQxjdn4i%bfmpG2BYHs#nJYm$9~HlS7zE+ zQ!RXPAjE+`J(WgSBAQ;d#B%rfOV0s$^|hOtzskb#r9?7y@@rJI86F<#^RVS2j1Sxe zEZzdV1)GC3ChcabCLV7<(dTu?D?0E^y?NOBKwo2eB)H6NoZ0Eb(eU?)!{REK962EEcyw{`(2&opc+U`6RgHJ6K>CYtrV#s8`AD3p&PG~MU zveKmwrN0OTnhiw?B2QiNr~1`+C!9+F-#S%vcSlUwPaT+PodV7qE@wwIt_~gI=XH#A znqDl9x_a$}0G_>l5K*l|Rk{m0hLk(A)z9fgrKTz{Zh2E{UY%i%8jB=ip{qz=+H$b9 zJstRzGncMVvo-K?=N_5UA(Ur$Gj@})Sm8^<6OTP}xbb)t>t1Dt)@Xz$T670%)_s|y z><3%gUnm8Q8cTaY`vD$OCb#Kd+FqPjhAr&P z#5-TqJ!~S+@~C(oNH2S}a?$katp55aox`D`)fA}*B(b?a2u@kZ{wYCp6oihU(vqu2AiDlPjYDJ(NTRw!D!C9;c4Cg8BY zp_zr{koEEXz}}%7zr8}wx@BKClxb{Icm~C)llrpYP)KJ?kad5{iSIr|+>uZZrEVwb z@CQbU_@2mJ#ufXloia|+cV3i%pi|_#fd}sp=NEe`JnoSI4{Jsg3T7CZnU*-7@fY#? zE4vQjL^=IkM!sd4mFq6e^+Ifb#`R5C2ShQ=LCpQn;~EqT1!Gs? z&t`(hVk9<=#l8VpB*-nQ!<4TECz20<;>(Ja<_mGjxa&>wXvNVk7eqSoS!b%~v#D=n z=69Q$&x*2pSGe#OT2a{%eX@|fWH~OlQ|UM{Y<-538)E&`Wv=Ec|9bM_qo+*hdeF`F21?5<3U12x_ z>?ZgYd@{Zs5XsLg9Z=u4!3pEkenUIPk5nJ(AQ12b1Z;PExVUEuyA1ZCGgi8^@BZm)(&tYz7mC5FB<#@Zt1)+X6=k5cHr@ZC^!cfojV&(m=J z6qAd_NJoink^e-gq{^hy4woPAd&K%&_IlFm`x%&K|6V*mJ6zu>%pOb&i56rCGR=^y zg}0-|pzOCWa0*AE^BK~qNb5j+Lbq_xcV;IqR$h6VWP@OkhQu_SC3%sh`^NLJlQ9b6 zGurk;CXgJ4^fp&?a{c*nNS(1lMUtF*Ql{~0K~gf@mq8-&#{0Kc6cnPGMUHbM7>i*S)}2tMf?F)hLg9C6%rZKOia6A%=|?yIY9Y{YPtQsY3)V`K@DZ2NJ?h$)oz$I%o8N8^h^53S=wdY-gPg3q z$5A&lxj(sQpQpPmJYDFP@_wMce*%ZHU!7BXjf@tc1oh8^uE;w2zn&L3-P#+}6G#(< z0eG&Vpa}WsBhK&hTgh2Dj1pYN{VQy!-~;^Y*)s?6~D_^e?)no;$<7 z`iFC-wX*Ko9c-QH_W-)b{X3fB&ANK6PoZ?#p$ggJKD@D{0G0`go89w z4H9u?SsbCuwPvT-dcPMJoS1#Ju6f5JfqL^`w7$#vaCl?X*Ph z3T{*|BUL~mv?<~8!tEGtx%kn)jTlc`0NF!+v%f?R_7oZ3^5olRdFgh>$f5xK+=DEX ze-H2vwnVU?HpKQjH;4t-+hs#J`c(&{rr|Ua8|}XqUO&Oin5g$R+WX2BE}wgh*qRmj zL#s~6+i>d`H~~OY`f8S@4E4|}4qd3J)0d`ftZhn005rOD?G*|aUPz*SyJbEWz3N8+)pSwnXVP>7h$x$m}r3G~|8tF@VF1wn$=k?IJv8 zm#I%`J4JV8>++bCjGJR%u;|1Y__^Z>^&Pywjqm^#O1tl=lTprG;3AK$c9>KO3;gzs zrV|FzB>*7FzW908SLfWDtY2T6K=7mh|Cjlb^*0BTMN%C41tGI3+5j3iy!si@(sVJq#V;j275IM)G7kPmr+fBdtLDf@qeAjiLek~+!NR%A$eQnSN;waCFcS@d yjH&lItkG!wJe#Y@IgVWa@8=mc(Tjs`qTKU{d;RE4eCGQvwXBqaWXa^*C~|F>q=%s&5i71Dk64G(xmUrXI0AbTs@ zB$id1uG?U`ua{)`^`|O5tx46Zakv;BaulB(@z;3tS8p<6ThW_3X161>rsCs?H3r$} zM8g-gKL-wJ(eiS>`A+`&V=eg;n4_Oa>ihDZ!OtHiEtQoerD5&6cRu~G;X9tS;T95% z{Q*}ZpyNee9r{&z`zD5fjgVF(1D#4u*}xFEe;}*1Tl%}w>eEgo>D;w%FH04z{Fg=> z2fkS&5+SAS5t$fPPl&T&euySzE0BWZ1_1{FgV~k|yn23OH=@ZU~Yii7l{8HeS5Fb}_43 zEa9DLlblwM_j<-|@MzjYuI`?P%H1>DhuiVqaFlIZ4Xey!(jz!>_a$*wettari$nbO zT*F;&aDG6j0&Mu`i0ZS4U;dD;#};H+>|4(qG_k|VfV9TS&wvX4x zC0iOQot#Q62X1crhaea8HzpYdPun=!aAyr*QzhDNt2Kmg^-dzBlqBezqX3Fq!sAHU zJ3rvST8DA3^`IdD|4kn$D_4|qKtO+Sr2Y<5)$9iB6KG6SFuk)+gBc+6?06NHJ{}6G zOYqsDkg}93>rkhss_-z4iV$M8Sjro0=8VD>56)%C)({$pvh=nz(Ew}wGqWw z97*A#A6Hj)>z&H-uq)FO=eT&*a*HMw&5k#k&g{xQ&!2lQip|Rf${H4NSkvZNWke^L zqL@Y;b9J7Tl{@BE0^JTN-&Ig(M&!p7^$fWb)4jGBhDw6E%!+7LK_p?DCy*Z}yz9rYa~3LsQze5r8$t zTYFebqz^`A_j5aIyYCglo2wz|yS7pe-RF-f4En7g`P{d`cb)ReFVEv5qJ%2)9=7Ic zCTWoh^ZV#eBX|GQIrb{THVp8xgH&}RZ+cMpTXHr zDX$@20gQFftYm0R?|i2_kvjg&&?$F|z_ZlCPkrJ<^pxD^i(01|xbtH8JCosI1SqV* zC9&YfazG5fNvgq+t-Y5Sjn)~_au<}+DP3I~qJPU}WwHZ0b@vlZCY$`8gRPtW+oKQ@1HSv{>8h75UAu?xTDI(?z3I3&T zisZ3q%c+D0$(qA873%w(JA`;rXg?K1k?m)K2jXZI=u(Q}Q3nj^YFO z&{HJ>c`)>B4w|L;oUa8t!4YrK5au|SVD04}kUn}Dr7qbbRJ6*Tj=vM=;jp!P5G|9e z43*TS95hn>GVyPojA@1ptVEEpcvFoh8^+C&8hinA#M6&VNd;{qRT8LLY6duX^lpLb>)HJ%US^yx+apsTJ7f?gNleQo_-;M#y;| z25$jSeZShG-wS*${oR{?@~^$&i{$nLC2Yqi;t{pyTP|mb9Ax1aPcQ3^$7oOdwjxQ*(Ke%E3>N_JKvWtpE$3pNH_<*^>cM? zJ!e|j+NJ`5ozIV1WsM0DLG7e>Og7K_IsG)FD0q3sM>2~}PR8SLvm9=2ZdldMSv(A9 zlXbkRP`_4y&Pfb*%qwEz_B$P%pSqJ3ojpJGHY7MEp1PdcC3tbO23>7VYnpGurcJ@`z@|JS>-^+3 zzh~CVRZjj66eoWF^D*6uM4zYQ!-TMrtb^2Mx&m2aA$Wtywc-9PyX+G8A{q@c&PbXL z`@=zdSr7-=N*vi^FLm$@UL{Q}-7qa(^$0XgqfcXOMxJJDQc`+mrtG4!z*Ww@3=XY2 zsFsS`RNYbVAtuY^LF=>K06$sT6I6VNC;N%yp4PN@mYDTPisSrw({NKG16p^vA;*z{M5A{%52a~JfJFr#owEo zcPF`ZY1yq&qB<^ld2WB&jP8yaHM0FK+|DbveN}e$kkC2uVr!{t^v(CaoR`Hnh!`n} z{)sXj5hX-K{x&$t(^Sr)m{O>PITb@_f@xd!uDF*LPe1e%NqgXGw%$;3Pm$J4e=_8- z*)U*SPGAqD*Zm3c;t$)Z8NEbRx5C`a+A{u!M~j2f%4}=nuh}26?@`wicfU?1y{8;@ zLclyv4MJ|h6l{oTP00;yc6c7jWNeCnd#XXV^DbH{vr8z21W8p4e1(|`)^pCU2 zE#Nll!Q91X>m^^+0n%8FniUTT9e79(bLm*}c&0wcKnjT%+|e@%D?s1#AuM{jBpql9 z2~z(+Od{;>AxDZ)z?%>;c}|F$JSF%cZB(IDH`lTQv9jPmdyA@F$x(Q{Jw4;8sVvyM zK>wPox%k%lLj)GYW_ZN^Q;cy>aEu$81LhiDA-*p)NtaPr8WaqQ4*xOnMz@MDTE%5i zCr`y{(c8mPtd;tDcPMZd!+HF;LHj=KK<>z53jemr-JS_)6&&EydmroM;s=K0jG(#L zp=@cW4%}Q&!)PCL%Po~POeDZTR8)+pB`P?@FdFm5^#kQ%%-d9RfW2W-(y~v(M}8)p0*dv zi)N{0`+zT;r21GF4NAbbD3Q61J`TTTBT2{lkn%X>Gr!#Y*9~WZ+7yskc&-D>=>`r` z!sFXH%-jkGJ@;1;g^Nh6?rJB#K-8q8bRaC%kAjEv%LoJ zcl%ODMno5$WT~lk(q(vC4teDr9iE&Ux}MkCjarKyA{q~=F>x!M$IHQ3d3%VxA_GK8 zo?hV^d5@O>t4(PSf72gJYaOEY@6*~W(s$0;2a~i0e zigMIG77B&@q`Cv%p-Zygnm2I;s5ACp8ug18rz6TN)y-&z3*GfnG;V3B3y!3lZ+*2< z*FvU})`UCI+eZ%Z(a&r-w5~gz8)m*Z+|SaSn1*lpp#n3Zh|uP*YR~e-hZvnHq)3>r zC5ClhCMg~An4C#6!<_P%Aj}pwA?^+Ukst|@PyRm+BVN2@8~ZK;+A#maQ+_s2M(<4O zZfKQN!-T<~lL3?9&{eDN7kAZ98vg4vNqrow5KbBa2s_O!n}adRgO2_t-Dy91$`gD( zVArpq&Dz?|ZcwJO45`X$hj{wooP~lUVkx7Poi%qxeEYb(yrrEDGg^hKvx8gLJZfdb z0Fv4F0Z?dWs=Y9xri=I)&8>@S(z)0JAd?|B1T!72o;FVefC$nyWygqKL>egDB6D){ zmMZ);`{sBRHnZtsj=_nmVvhBBkH-hk!XZzznIK>6ZbI@%h{4Y^$aGg-zL}f+wzDgI zr`^x(!yU&E%WlEFM${3tF29NE!po*N*c{mXq3y%exfVTX)mu#bD#kpG6nBKfWYr6Fg^Sa&Q3^G?5XIYmmb=9+alw(u55<^jmR+scgUC={qWQUr2>z!S{=CXMySeV)y%G549g%yzGRJ)0@ZgnqfBcV@~tTHxoL3Q>YP^H?HN+pCkI(##+@H4&na;Q6Pg1 delta 4299 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 diff --git a/doc/img/sign-learned.png b/doc/img/sign-learned.png index baa6590f050371b27ca5ed94e4fa78402de69e89..5fa66c85f8f7056083884263c5fad496253e09e1 100644 GIT binary patch literal 25568 zcmce;2RvL`_ctzxl0=POqXf}=H$xDeXqiNf=)LzAEkuppjV^lc?IL;^f(QoDJ7F-! zC~t20z0ZB_mHRyJ|Nnm8^F5q%)^PUPYps1|t+m%a@1Lv6;oPIRhk}BFqaZJ%fr5he z3knJ<6&C6bN(1mYI|_<%k%EkrmPf{3hFTbvEK#4*?BD>#3hhb@sq74}S%&{Z*&XMH zT!G(YPriwu2Sz8~&0`6otEeIcVFzbOuo$3sMR>rn-;+I-8Zf=9cHbM@duUJZsaqk9 z*j0le=+p&1HFDkIo}#GjI-R~ladyhC_EhbP|Itr}CVsI5L| z6^|~jQ!3*t-Ru#quWd4wY#p0?T?t%O-yj z#k;`x(U~7xHW~W(Z6LUFl3|a668LBcCv&WVwG_a%$!DWwih1dQ*-z>E{N3mdd3aiG z2029}lRmLfZij08SdZk-A;*1dE9m1t+CftTdVX$nK3ck&@#Q0hh`SC6IfFktYe@S7 zhKIIkyJbFK%_WI;2uO@^xt63t^C5HKs8btAq!C5ux4sL%cG;IZQ}xFw>0it@fxC-0 z4hP4Z3$Xz;YJ<9Twv@F>j5R8V6Nr=lx zB`^Hpp9s-jj8u-=!ntdhysviY<9hio#3^6yteGV-rxQdUi_!A~0Bxh`%1vl6y08UFgas znf$W{qF`o$^ZI&|bSb&FINtu;jE97T)OV7&g%8}B*B?8Oaa;(8NQJ3@04;SQ)FA-PW8v~v2Zznr%mZ`dq3*HEs zM0*0#LqJMmmF_X0UM$)>0O!Y)hC0tJ4_1Y^>|!pxI|sd@{Yd-hwg%f57rNFc7sNs; zEg{d(tOk*Bt|s?q^}Xth=fE#Y*Ub~9)~*Kkc}$3%D29{YNyw4vy@$Q}?ww`eno46E zl@X&^q`ns;+2It{?tIW@Z>Bi{)N5ZsI^}GJ0ayCqAWrkMIGX);eujOB;EWVMLpr;G z4<|mzQBW)RpdAi;;4en85>u83kCP^YUCSUQfAOt=(ynIH`0>LJEq$-aXoe7EU5pR- zZ-L9s1AcAckKIzlxFrtHLxNbTw3f5)Vg62vo-1((TY0LSPl}VWh2NLJ5+<3O;YBC& zgicyVfDtDnE=^H+sbw&geiJv^<^ofr|)+s5??JRYcVj!0u-@WzvtZ1Oo+~uyS8B$Un+&Ah^M? z-be2pqmN=z{LUE0LM4W05B3yt787gqh9guRom=A<+-t@5R>i=XZykP)HECghpO>c2 zs5EQMFiSV9Oe~?7?0p=0vN-3#+5Y=IFO7P>7J!yNG=7ur{vfC+xNJ8fFwEY-vo5iy z?5;&d_t<1ZVj8HyQ~2$4g>rSfr#7gkAzxJ1msIuwpkvD)wTpHi;t2YR;o-XN+3b&f&A5gTex{c09Nbm*D``?UK4ZiniI zWc;m=V;q;`%;?E4n_n2O&`CvPl8Z8CfB4rA^RuvC;i%7UWd`HfG#h{p>yJrN{xur$_$N9|XP?rNB+ z|MzW9L!Hxk=m4=GYel!wiJI1+Lwi`LNB64b9PEBD+J6n>76RP%d!bTxSXDWc!wGk= zFn>U!Q~m~*i-*z=p@>Me*_z14W)C4ZQYbH^LY{cAKsYK~D$8^BIT=QPXumy5n{lkIbJ z>|e&OYggT)ucfY*WFP0dL}#5&KW#jOa%3)qJrAGosF8i@i&$x1da<=Jck$yt78j4_ znaI^j7((@k7QTkbi7JLq7(3mN84b)v=?^0N$rgB3Pb)IMCr)sPC>?X3T;&xUvS3Sx z6Q~^{U(Ic;G9J=WS^NXGie0m%ZdH~B1C1$o>uIb z${UiU@5dKq3Yl~66D0SAIgU*`Z!ve_4IYoxDpiq$=RTa!g;XY*&4((@0rEc&OCy{w z_w!E#d{OSAQ``ctyIA~0xGYr9g|i(bm)~~Z2|>Gu`8&Z&Q<&m@*XL~dy*}gc8P4fd z(K0u3Wile=*3x7bO#rg8Ex(i|CIxR0{Q5nG>yV5hv|8)syU{%(b%-MWX;)s_Jhh&c z(3zxXOn=eFB|37wuLmms9=U4Q)I`}HX}yvsECdh>&t=#;YHci-WlTnZFW<~BdOuIg zl*quLa1v?tZRD5Az773PvvdB+?eFaK;M@x>sgrsPlI8_m-n>>PK0ev?v~){KBeYWK z;%DIz;^ZkT$=?Mab(yRJA5DCS6oA+?=$2i`M*;2fveK$P_D?G<0-RN1`aSDcNWX+$ z2C)ZJudD`WsAc>4`J^*0G8m8YjYLr#O)uayItop#rtzN1POl1f1j|?lNCy2QZpZ_e zZiOo2xR@8xB|AW66k;7|y&(eaFi5+_DC)Aa_gA#qUPl zQuRcd^$FfOBv}otwDh@P148l>#sAF`ekW8j-jlObmi^R)<)xA0@9wW9@FEqUJ!zj| z{*oWnA5}<$$Ht}1v9kqp@(Nr0!8;%9(*g5Mu>6T|7vX|H@4AInjN0h)ss)PUu<1|Z zq&QHlshN8|xPHWC2hsu6kUa?iBiK6HLNRb!lS2Gh2RS)htrCTI{plL&QLmrYV^Ycg zZXlGIxuBUFAY^!mbIg2N8gg;H-2WLp0OJB{){9I;viQFPu_ zlsz9ECIwMYIH|O&OJ3r}nnovxIe1_rtjuPR|Ze&sWMj(%TuFY&>`04Uc1X!t7d&*S_j z>i*M{AW3@ps|Zk{v>pdYdJXBU{oFVdC*_{1<3nM(dbNC6HiIzg{9@f%xPiCH3;=#& zj#kTa=)68g-u>6ZiqLjcA& z3WX$^1qx2~9sajJxtKv4k4GRkrv)+7&_)9`B%QNG#;GiD`G0u$?k$wOwfR`bDW)#FR= zq%{QIT8mSCywbeatv7TUyqFt3ecVm=U!%GZOYS@Wn^I;HE-qX!YE)q~1W7b}{61zLO?WaAnJ0@Fkjh&y_l=<4qH65sO!0+p+t6JV)S!kUGEUzfl z1vYv`5JZ74&^=C$nTEY?PFmW|R%^FgkVWQV#ojTh{y57%G!2=0yS}>qh7U}9aT@&V z9yS{LmcKNd#vu50EB|8fPB84(&FvYId~TrRQC5ykQ+|5y!qCL_-dHDTJr#5v;#cY= z^LPvV8dPfBP@m8JtZ`3;t-#OjRZ@o)+G_n)Msk)~d`*zEO>LegKW*h}_O#14`Yy_^ zdVXpuE?k&8!P2*Y!995OIJZ|KPZpE5%x4;R2MLL31V;GZcxg;a{L*>@ht!r-Y;g~D zRd`_=XakwH`&$bP`)TVQCb$$isi(3>praRLk;wahVrW{T&~tK7F0Ck?IoWH;?y|!K zXMl90o)x`Zgp`I_`YL9oa*BLZQ1dK$pXpW*XF#0rT7OE(E8@a?8Z24~hBfT$HsY;| zU*5=SH&&?4zKUUhUSfQpJsu(i>%M zxL)bbJTHL-{kTl_d&!3ZOsFd8X;}Qf6Lw{@0~~(%wyJXfKH$59m$ut zH)FecmuE;d~Kfc`jg(a}7aQJx3$U`#0 zmjiXd@w%`8b#%{@LUZ`cpr^S2!tv#KsMZETsWR_?b0X;LAdkqduj`EQEY5+Shom)!rUAy0yuMZ zUgD}3p1(srRk>p_+$y%ccV2x@mFlM{qd%t|{>UQzg+$YFFZ8%vcJS(hP`mQM2a`IG z`q1_rVLe#g7&EQ!#PE`W6I1|mD2syT*n6p{L_PZ;&gKxQl2z=o!ymO{u@+J``a&y& zp+}kx8kyQ?+|tn{J!#vQ9!?^-FqJcUuE&`w)XT5GBpB_D^in^H$_+texeGO8E&wu{ z^?2vlsG2(?bME+7Y{!OToH)KPj`I|^&wv>EEC5vFr5i}-g?vU+xjIMKXpVc$4h^ZP zUEv0qT=O3pZAvb|_I*X0gJpTWm>-U7OGGcTTrL3?+YCuV`v%VCV)Qc?n4G}Vz2+o^`U zqk}r`%zdh2W-8}(jKn+=)U@%S)fdXHTEQ^*lrxS08=b$zuD~FvQDq3`&1{wM+Ak^O z3{#(rWz%*E9IGB~OhY{om)dN)GO|maA|OsIpIFP!Z?6$UKC^mqahk{&Vo{c9QA0J? z`G4U5PfvpX-DS)`2b;06xlPOCwODt5_?4GN|Dfwh?N+*&!i)BM*q@Kmuy;>e6gO6m zcS;gDhV(2XE@GRUd{V(t))JW@gF2d{-gQ~z7QYUbZ0C&M(WqNxPVJp3#!aty`?r#E z^AI@_;@Qnjdt?D66wnd7=p$rHQUIv;w>vn~7E|eX&|X~hTrB>;i-t<)YlTpD;rJfx z3^MNZqFuq)y4iP)ODJ%xHC+7Z54)35le4-t?PE#rCmsig7 zeFvEf`MqmRW4s3{8dd(6FGrC8(o8r?b56|nwh-IKyoxFJMMSMyrxmRn{8?3fAQOl5 zrdGdV^!?~8m&=sOnb96`B+-7-mK`<*vFYHHf-m!gW3~JC5Oz0*yD&sInPXqV!5OV9Wn3mUL260B~)-RJi^q0LZd!z zC>O!+@eZeky!V+AK>!}~4YFVoH4T>YOqD9+n2p5oXmM{lB6f~_4wp)&uW0=nVsP5w z%b5Gd(uRJ}gn=fqnZZcd%+gI=%;fjT2X|W^Td=-q)@Xe!Z0H=Tj(?J1sqf59_Ri?n z-EU{)-+Q!yDsh8)MeA)oKG*P2=BQrqP7m#M-MB8@$(uRdPEa=Kq+gWYy(_2Yge+YR zR0SO>v4Z#RtcMnII+pPRUk*oej;-n`%9&1%&OAp6E_r9wQqU=SZ81qNk9p)mxkLEkg@)Gb`hlCvl65JhgwOw;Y#B-qARiv$7 z399k$Q$*b4lG$|Q_!e0F=oF|p0q-QG|Nmc}00_47P>uIib~laPV}xj5rNgD zoZzu3`;cCR>YteEWW5%&0_qW_u}tW^C;TL>r+;&ejByqcn#obQ^1N=slBww)0lq?0%m9ZlY-&KJ zwSY%r`>1)aLCZd24Og@Jy3h(RtoD4Jf`ibEVjs;a1N^x1vxs|h8>L;|aO=yrX&H>D z3Oy-cz@hb{n(#C1KJu4+y_@DS$Fb#tksp5iywo=nzkBM;eF|g$AItrhlK-alTL{r| zH4a*fjU~{Q81@88q$Sz#Zc7X_cYFTIeOuF!HlP|Q#qp(htj5V`k>8*s$riK3ilkg` z$}YCeGC47!(C6TDQ5@ToS1^WjZjZ|2BR_Z?#@5Al<6NA8YVzzr2Dn}{(Wdwn^~wi& zPvnH`bgp5+8UxynI~`@O$C3dMZBvdnf!{<3&vGIMDX+A|ug4Fp2aPkgOgVRoQVEZ3 zZERK@lVf>?`y)II*V;9K-s-@0*ipxTH}LDlkApLDI@sa&af)Igr~UfD@8?WGSuHJR zuT8G!LX-?U^ce&*2pO>Vp($ev{TRjIm0CKppfZwn*>|xieurJLGFiWJYf&i~MFxgBHzlJN{1_`mOZ~ya1AA{9EvmdO3`8 zUFt~L=L-y;jA&dHmY4RNjF&D#+LbS7<*91=>3m*4WVdOtC3hrz}9QA4CWC`^)J9E%?{>h=TeTgeEAuv;({ z?J#9kxtY0mQnpHvb{vAUp5f>{U-!+tb^&Po>Hhudfa#Lv$!mY|;rC(-%cWaoMJyli zm!@+Z@(39i-NKdL@O(Sbxi~iR&086+0}?NWa~l^$E6I4M0~99Ggz|m zdp)`3<6m*6{&PN0L<7vS$t^I_{_W5b8juC>z9^KS2^qTq+T(?Oe4$hU3SLc^ad!2b z9xJ9joow}+s`a`~-g$NPk@mE<^MZW-dW5y@w+MS;Fzny%_S?O;XfV7CmIX>!xo^4& zQaVrfTqTStcQ%`L%x!kb)2CuC)PXy4SI`-}Tcjzc{C5`90uGF_HzU?-BmnsxSLfo0 z@?@?>yL1u9A0fxfve5^-`BNABtFcpRWTZ>L`p}1`4`*UxX^cxZs~2ov*SE|cX`S*F zUO2Y9>2ZOJ1|gH@NXSe?%)U|HOyy#ID03sQ_Fkow%#Y25_s!p1|5ZRB51ibKi{3>< z-AfI0DW8Q`P{h3zpv)1I7k=l>D{-tv83Oh1(tFV!TX6uK+bK*A%GQAMEqX#95E(2uiczmlwd zYj$T8HSI3{eG8I52zKn*ONgy2E-wF=0WcokP1&cz15VqSgxU?*?%@*G>|=5y>sddz z^9ot|6#~54m;hB*8nj=7cN2G3L*jfcyFkf6A&6YNcTrcJK4921)JKcO^5fU-U1xuP ze}uD@yEdQuG240GC|nya9cbKj5}XC5KAx?8?mbq?UC!jMb``44`>Ka}C$C1nu@rK& z1cZ=&lEg=s`mujVCs1AfMuhvbU(vN0-OH`UM#GlP7Z{UArcU>5LdC+&v~#pX>q_U$ zuJ+<9lWlTxx5|rCu+vlmO1aN^b`l0wZw$&JNf1u+ist*hvE$fcCvBy+h;ZiuxWcBx zw40?3bLZ7j&pJe?aJd-c2PMB2iN2|@@ys-Rnz??Xbyuy^#~lIN7YU8sxuVL@jSYgi z=_vI020HJ0W+~Ul#TaTI73-Z6nTjMcDA#H4z`N}gdzsrz+5iU(_g?MVqTQ16#Xf{did2(xK_;&1Gt&SP5_KGrfrgEyV>9o@OLC`SVIQWGy~}P)q#)x zsi^m{_ccQzHO5wZ^`*n%$N|sMOJv@Am(g?3$SA(T}L#4~-`)-o*)9o> zj64R~edEP`0e)Td|)^W`0?2Y~- zJZ6sX{Mwp4%@W8Gxf(x6CVz|?E;N-**&9ONaib^$sz~@4cHgk;g9*{o9sD9?75Itm z=PR-Ls+0IB{~a)}PbnqWvCaF$ZJzveyXTsOP(d&`FWQ4IZ@{m@>lWZZm;~ieJSB zX7`=tw+@oRkErl*u`q+tetH?bj2|s~-x-VU6AS&@D2tE_rk_t;{5G-S)sBX9+pRHV zg|)=B#dV84=Hvx6*eC}pYIhraW-N7XM(y=sOQQeC#h-a>krKxGt7QINPCvie>biUK zhU#WF0IrbUsm99M2QdVT&bgk|UO{jC{&{xh;7h=tb@4|VzpA9!9qGAKS@~+I6Grdb zaQ!*yQx#ieE2&O-$Uf~}(E(Gn9;Z2Jb?bcCq6iS!dhYIajAZm}(2r^Tut}!L1{3-i zb$wrTGhOs>9mXjW@6a){spL0=2>5Tb^Q&C)D1(i2UVGKQp3}ExGgg0S`8Ag*H^HAl z5i!S~4!d509r%bCj)Cz05AVtly!vI)V5c&sAJ4E{Yb0+S=7T)qaRuFo(>_c-?(}jy z5p?BRg&nm{=~F*U3|u{={oFh2YVCKirm|zumt1+M>F&BgvuGC8N=ibqI~f1`rSk)T z*U3f8rPkoH$oE64;_%BZZO;R3jG6GDo}MXvT0~OV<&SL0&MZsh6Y+%0?X@7-m0pvj z-xD`|@yZltI|BC@wd0WW-9cEq93ADvJ)v@e!l7+WnKkp~%Xq+ixW(@NDJ!H@(a$Qg zlIBaTErR^e>qmJ+=o1YzDWd+_S!%cFM@?II(c5pHv;}^n({q!PVZ5vJd_MC;nQ#++ z{Frf8SrnjHFV6p@L!Jh#1M+qND#E zGBwKn-NF3f-g1xQZNfa~{B?VK5mSwahD8gFT-WC(>yX}}NlVd&K%ExY{noD>Ge0V+ zd8@Zj*tYFSa5 zm`TowgLOm+nCo;FSJ17o%|ahLsD1gQep`rfqR}Uko+dL~ zI=sB+JPQads`p8Xm-x>*Qq0)Q91>51ZV!+C2%VOM1Fltm5+}Zha*(-y?GzB@QTY@= zXiqtyzlSBirr9fy*RV2nw4GN{U8S<55%tlTXILb1!qsu+1=Lf^f)2zG&7RSv9^Mx;8ZCd(26M+%Gt`hjMIgo*<5AOVS`b+P(mL7>Q0{>2bB(f42>#LDNd$OHzwy9EFyw5Z!F zccT{xqgk@aBId%28&WC`++YW%KAvPthHYtFLTZZODE|-&4gAcNxLrjCKBLEE%__2k zopE&{iatr+tSV#v*N3yvv%1om)v7p&{q<+7e&vi5u1dI(Bh&PF(>#;f=4^;mvJa4j z&U?3&u>M-qI@2x5aC>ciUSn`xMcf<3Bs3dIee53GIeF8kObEG_YC#$N7jF`*)k^im zj!%j-FJr?ucZo7XZ|V2%vM@*rcy@d7e*YW7XwmlmPB37^mW{*Hnt=5+6br-`G^(fb zT|?*uC^J4wdBsChQVdj&!R0H$Ng?4dx4zyYdl+mm@sX`JI-?GkpxQy(_+#lfl-qS) z89?g!(&Qq$7>Kb@U=a&pigMjI;~IJW(EK6#!qC8`sL;r_b@tVF6~pLV!4)iE@6?tY zfE@mt{nVUV9m- zT($fY0QDF-!itVEO0RXOCj+BftXg>Qa!nE!^ffu_nJ{rY?UN2MdurqE(ksiTQI}#8 zaoLOpuI(;fMjMJ6}0o{t>$!y1Bl1=7|hcK~E5E@U7 z6sB~gL89y)RM89ZQ&6zjJ{dAM-Z2^>PI8onD;0f&RS^)-`lg+D8_>3s<&o&~cy!K7 zAlkWu8t2o4j@~Ezpv4LmA`=7p`Y&C#K4poIkTN_v9ce( zLX{QV^Nq=g5R)mntk_s7Iy)%Cj3#Ev8@l{X0yxCL9N z7-^cq!XZJo{~{3!F@7tHqjVG9gw?tbgQ&??vh7@gB;VC9G^6f)UMo4Ny=kS7&ug4p zk$=jo>BP#b`F=Q<^WpcFdUNQ<^!8R@D&yc<%qvxw;?h3PO#TC#4Glg`e!n3TkIGMi znkHWi8Z~Nz<_b7u$Mwf#0JZnpont9C#tKV$D9HJ)iJ}I}+9$wUL*mV8%kA0jf-%~4 zHaBx)w&_W))6U7*E)pubqQLp2I-3(sfIeMV|qkF7u z;pgAz!|vY;jG+$)`plSKc$JCx_CcXAelY)9#MupWORdP?>ql148K`z6 zBK&a^!X;w$I)J{jCA!2Cq$)>~Wu?=I51E0NlUF&pPf!^>b@}YLS>1u{_U8MnWAB}O zuaN%9{jtyl;>|S%M2U|RDKRxkqh?vuWm80HZm}>kSnomoOLatlUuzlIK+MoH*wG}3 z5U&EHncyQP3vAC)P4G~jAUb>v@cae~FJ18@wiXcDFUkd5?C`oeswVh2U0>`>FT3=7 zRhxip^{|lmSDt2gFRJx=gc}iovpTO@J`N+N3!c357sBQREv-w-;5BI;S+#deyk zbiQxny6a+6-|cKvSV3~Ez;yG1iMMZLbG8e`A4e*Z!> zLH}Dt*TJ3fMp}RebO$r1&6N8hNwbn8=ndOGy3$^9F9{@vcz5%|Ow4Be$)@aZ9K6)8 zb0h{q&I>eWIQb*_hx)f#F*wQ=Y}AZz2z(!?TRvAU()i%nOwK4o@{|J74gr<7OgAzo zmy7mzlz~mlX(7AkS;6|MiL zsfGl{%+YTI_Ki{pXMyW zZS{#)dm$R+7e0RNdVn@vv#S$W|IR%dZ=bnAI+{i0wfTMZ)M@6?k!e%4Du2bi2HRFW zRfWFF*QttLXEyy6$x3GJyx<7VPNq{6gXPcp@n?07Jl&f%x7ntnlbTocvfpAa6*_Hn1 zz}CGL9+xrcCu33aW~1H$?|IAnghBRuH=P3h zNW=^vpQ5VV0)6>x&88MsL#g}WZ&(Y8>p&&hDuUXJL4mEL>)O2EOO{ODb5EKpD=yoD z7X*eUv(=c`A9rf4L%8ou$+-u{X-e*VmwS99X(~P{@0}5}d~JZ9Ih_T*@weuf>qP0I z&K%|;0Y?@+j-|0Ylk55zY1Bou_{EYY{84i_I2pj(p9lKl@iYSve<+RJvDOPVG3FU zF@5vGqLxVk*+*&Jqhyp7VyTC<5xaM8Df|9cDY%_TO=v;wEoa2L2&;PP=;-`t#Kh{=QvrwsZm-3~Y<-2Up zYVr!YBSNx#PxhXWr?*}@Nf@W~KP#WCEi$n=INlA~KGNiJu^Xg2%VsV%ha^=u4_9(Z zcq{g8aCWx*@h?ML|1OCRd-MxZZ}aaDdkKS&GDFsn9?>0A3%8qqNl}IHu0hZ62!$z( z#h;GL+;AM?zsc2;u!s!DFi|mSsS&H!otKzwpWM6b5EWL2sLs4_w+EDVY)jo98~m}- zmrzj{D#iJsUyw3Qyy3m;kSM_4Zd0x2v&d@ww<8_gR_WU4r5@EQ8baEYcox8aSQ-46 zwZn4s*!{0yMp3EHX2D==Ih|w(cnZvUkHtCVhURr=JE$&Uc zGhnYH5#SS6{ZHX)68=uQhCyAwP@g%4skI>VAmD>C_scGDFA{C(tv&QO%IkVf(Eozq zkFZkG9ObrR95k#Gt6*>Tdq3)A9{Q_EFHd3Ssi(r=)w$n*gd8_=-S{8QEtDu&g_0H* z+gZ)e7jwi496S*V)X(}ZF1$=x+|TrNDZi(xpFV;)z<b$<3_eQpr z2>?ABmMJKgcN>-5U;6IwEogp}s_%YxElt>bT`ihoYuX9AY2V>?mFiHpnN!=!U0%Kv}-rtjj0~b zAAETT7-k&+Lsx34u1$Ci`VMnq7A{#kdr|%HblzuzgHK-l8zJMVOO>KCnUg zhLo#Rf6G@S(1ga=D&WnR2xb?8$?u+Xncf1Iv$HXmxtP*HMkx>yOi_wwFHeLLIb94d z(rS(MyTG&F67if5CMz(cD({0M?)DX(^!7z)0otCpH*cSoqbBXgrY(2{933KMmS|1_Q=59l#ruglKi zhjL#K;^ZW6h0lTK0^gw8enXD|m=}CbK z=a*K(?ZXP+FEkDGvGhOd>*9Y-C%J|}1|@zXb{WO26M@;E@}GtmosAus%<#OAzswSOeONJ*cf?5{0sH!@ zFMNkmM(4HsT-~D_wt?%Ckg;TC_DP(mwERz=M-z7W^4Fp>dtLwVGKb2zpDb1ylh1a~ z8cqk$827C)oyt>k&U(1 zaNd$oKhP+++d39oIw;dU5x3g{+9xfsvGduT{q73HBEv~)3Oud>pJ|H}kpNTc`QJdS z3B)A)KjPMM`}_NzUlxgGEMKI<0ONGtRbN(gmuZZ<68brkPM_D%WLWk>yXgAEJ(7V; z{I#9Dqah~H;jQqr>dp#IeQ0&ABgto{sR~vtrFTFl&yU0KSL0uz6rf;)9oaZuff%?5 zn}#H+HVt?|n}-`1;5IRE>E9ISc>=Qvtyl>HHUNEffj=3_KY77KKbwLuMvu`)i4iBt zpaLbpqerF|##JfT_yI=;wU@a=r!&ZBa^-BpYxNdSDz;nkFhW3z@%9Upf)qe+Vt$+} zU6jB%v5okX^g^FIk4~68$YF8@jLD@grq3~V_HtVmMJkn`AAY=pB5%ncnPfjFvUvJ& zrjXGV_E;tV_M^H|pY4LI8fq8NP(vI~AG4Ut%e7Y)?-RaQ$}8>1Q*#PFTheL_qtw^N zIDJYuU^NkRdVy_QXW2GPn>PdL=kmL2D9v@+V0V7RGviE7t0_1}A#}PR-1=RBj)Ks< zJ>*n6)?$kXwY^mn`k|B&;H23Tm45{w`)Ett?wte?5K`oNCtxC8Nu;C;|d9b zN^yOusGs?Nq3gBtyYxYlLQss4n7TMP>gB)uIpKC@oPfz$QU4qYKK}a@J8e@M6@$)6Pu%ELQwb{3`nZq52 zcR@in#z(V}R|Ux}Wh2uU@x-*VGINN;^U22ZvOM6E8*uVAgyIUQr{MDva^`g~fANY% z^p9%a2HST($<+GE3!jjpJXn9Gs9-9E9co0$wfqZM8&Ug(FuKA<^D!0uSNuuBV$+Ks zjeNtq_PB0ayya%?o5TaelNlhw}V zKUNn~j}Qc436ijnz9wrR6cb^m+#Fkgjy8NhaGcg!-fj?`qX_P>;kM1{{)Z>RuP=VF zm-uPw@<&HeP^@tXY=j%v1EWa0Fn*H#{MTDITqrRp{==(Ts;h$0dbn*CY@2E+54NJN zki=xSBS|Siw>Sw>`6Hf&Tr%=dDN%wm~cBQFt4dMy7f7%THU^PX1A=*Kv*oqkJW+ z&SfQMwAFnbC9I?7HSB|~^2^x{&xKj2h;Z*=h6Hs>{q(Y5@}As-qPT^_FzetYJM$k+|7u}KdaoH`60wDN#2lGfP*;}jOZT}rHA{Cz#4FN!22 zOWd2FHcVL@k7hBZTB(CGc~-EIlXK-|av7-9Cf$C?zn6y~HX3ohY#Vv1x9CY^ECH{m zFfQ9XC`#rj9NaAh@qE!Fl5H6E0jRy1Tl38NbUABN$ZEI;`LSfxcOnAw!&qpHF&kZ(C4%27Ojv!s5B z14lK51IzmPWiq}XzfQrl%rU(~pZWCbF(m||>Bq;22spG;+;<_qVB1|Zg>hL(iKn(r ztsMX=Of{X|n$d|HIlXIbc>y@hBt3QJ+?S}m1m4Pz2%&{6Yq%CsF^h(Jey+T1Y&bpf zPYJ1d`GhmxgzyDwUGLE4rV(D@8Athlzh|P2|E)KPY#Q%NWuDx0 z5`*v={?NmpSp8K?cbWdgZ2QXF>(_^NPghy^3qST1OD-d!`?G;=7EWSl7`@DMd_8n1_7NH*Z=^2IH|0-`W0FkG z@y)Qr`P3z668N%;m~W1y=lLeo8QtQJ&Rde~yZ;{#q3n_|3r_Rx%kM1)PCat)8y+Sq z733GDbLxlJs-El~*lA3Xf<1M8@a-cW;xt}gz+$RKTaI=XjF15Gyx#MO4CQ5(o3@97 z+KEHJdh?naxL-z8#+bgp^vheS(7mOyIW(%}d+CWIwAg=glDJAz%Hl&!bz5?j*uP8qRlfXUq7R-CjUQ#OcR=ql?Z6;~xpYv!M z@A5r9gHNyfHhfvaRzjO@hHdr~s=~-<55uQllumPFI(~7lkB_>g?tV-%TVp(0E0I*J zbXid04rxTtJ|=081{()}msGIm!s>XqYSfFXxwBF1h0YYxo+Rd``*o>Caqzy(^!fg( z`PipdC3Ay)I>L1h7R%$^IU&;bLrHKssQ!^42i6hp#>XjY=rh34ow<}cA_9uo!|5nq zjkfbso|%;I1M$zo6bp=T@n#l<>@VT+akFg298}Kf!$xXfT-_xmrXC+pNxRqi)Ba3& zG*kf%|74n`Yox_21zPT z5rXfyAF-6%PA~;!YZK(NNHJpA&L!}nFTikTQoW-$J;tEqr?5*BcxI2$hN&5Bz1cAO zKRQ&uext{NmdT*;ESzU!c?~gPCq=BzdE=VGykm=`mC%(E%>(fnAGSV%QFA;W3S;{Q z!A4^$4+_4RKH-tevq|?`zxTI>zesBS)Sn}`7aFFwN!5PwCbB*ChM|zkbN?V^NFu~| zJb0(whd5)2eT6EFVmQf6RKERjbAN z;*PbIa9$0Y@4@=+4<^3QD;BpNzHe@@dFA(PAI@5@)}D1CUmYJrYpnd)4$OqJLah)g z%;R_caPS%dKN;CgZ;L%Bs%(pA-SKHYQI3?YsioAk&+^}%CBw{W-26<7sA(e6vQs4#eos*Y~ zl+^u>RGV=b8%D=)O`XYU@n~ZNMD9(Se461tBeJcHXhzZ0(_CoA_YYtG-(1Y!J$=0P zfWrTv4L#$KyruOmv(@;iPPYjOwnINEjvuMT7cW4@33QvuhVVCgqe0GU zy(uO>?8Q$G=b+KncWa1y9OCQyLM!{VRG20^KiV%{()BGuX@mYAXp{%gOxzM`{BVO$ z_EENOzP5s=nR2-wtj7DxqJuc5?TB<(0$ZNT$c%@C4I6~bd{)B$ln8nh82%{GyGunq zw<4JEQ%Km8F%~PJl+jkI@@F%qPPp!gapcke>f~C$q1xK8&gqy!byS#CQaOZ4N-lXO zspQ@`C^4Zk$z>vU$0eqaW(qU8rop%+r^C2J6owyZDrJVrJ>xPM*J0cSV`k3iIsJb! zU7mmM^*n2@XRp2X`o6XH-rsun_kJ$fU~pxMsvrlzFa0Q2dsXsF#}EEIA-TECvt&jR zO*Bg*La`1CkeAwn{*6x{APGbp3}>LH$GuWnCglp(PGv+_|UbIc@hE-3q2ySqQ{zW$_reK9YN-b1T@n&R{((BeoL{aA?e zE|Rh3KwzF4y=7$%uNdhsL7hVXn_&O0`ILoxoo7Da+v)qt%1SRwh>P3AR|YddtsL8m zd`i-Lc<^j5BCokKsyf>867)LyP}<#uwE_>rfomFG=ljb|#-*ymmn6_?V`D{-*ezaN z|9LZd6`U-W)on+I_Xp~PaHUCldf514sr;AN#Zape0MvXL^|WS(m~c^RIX)9#7ATgO z*x&IsuJ+|quGQCt_`g<5zHvh3Jnp-xG(a4}cHs>a-v#70)|=2BBp#;(vU#>@jWqB| z^63qn24m)?EMDyCoS5tHFsIfwExlh>xv+%DF1#gz{NbJGrnKw(p?h|2BA@7}aA=jU z)k4#Xq(IL~Z?$IBh^bWFz8l_xmwkq+5_1MPU(&D7mi4uiYGR2$MkPXPj6g}Uk67Sd zpV?P-47bZV)x3Meika6l_Hq_|ol5l;QU111VI6-`d3 zD}En@07PV^d+JqZDkf*@wI>br$9A<-$08hYEDXACt00PHkk^Kz--IWPLompt^Eh4Zj#Kw}J@Vd%mkyV+5$ZYnQraN-ZcA$~rZhiM$<5+lj;db$u>{l2M z1K5KhMuTgrk$pGYlNu9rhkaDtV^1)5rg`K;keB+gt`t678U!-usn;Keu9Ix#M z39wh)!`9rE-wC@6UH>*s04#NAprKIB=(Re_o%te6NGFv}VHG&DqYScAHapo&C&ea!Ot{WWLsPG`8}||tQs7nB z1AK7_;%4=c9y&dS;AoIZ^&j|vhjLj>1p^01-vxm4nG8o3g*&OtPNSYQ-LGxM~w;g98qmU663E78+^g98hGQuqtYV7VAn=k*Y=Q%pi+iUIV zHNH<SidqfHOl zKjr>D@tooV;8J_kAtcYB+Z44FT;Hr%jsQA;f$OH0<7aK<6xl7AVMHcKi2mQ{n3bhF$`~&)k$Ko zx~HHd^|>A%Od#gxcyv_<{_PIGAFjXIW}S2Fp-eV+ux62NCoonQ>VOd{Dxh13@6zku zz6GPG9n_5u_mu#CNelk_q7p2CVgm8a@=a^y6eaIoKit_dXN8pX@e{iy&x%A*&0y}!!=sW(e%3JrW~XM;@} z78mf>{tRkNRm(Y;8w{EwY2hwrbA#N;A(mTd#lm>} zR`@iX&yn75vDr}UEM6ng9b#yNfa^`F2*Rv#9_XGH$Xg?d{kl0j-ojWt?{TvzUik4t zc{}3-6{EFKBp(9v<*b(${N%2hQ*UMZULC#-HGZX6c1P)cm-V*6Eu3n0j39h-o0%Z` zjXNye1HoCA2|3gP%}E^3sZ7ftw2`a!u!}yX9SsOH@^lG3=FU%1O~uXoMMQ^a5Ug93 zrw=4{;J%32p%1pXP(rW7->(taCqX`J0)cjjz*mdVh;ETPZM@|BX%$CYCg&Uksf^SMq zZI{e_J#3TrXU$HVgJF(aWITyWlNxI5fKi- zgcoX*)J7v-{k+z2n&KDM&6;ny9V}F%PgUT)(6bS_61bP@QDv*iInF41R6PP3!2~Zt z27AoYC0u@ihFX1=Y5RP&CDlG4xKC@`pLy=H`m3-0Z>bTw8hYm=@k^q*7|GnTm3A?0 zkj?;vJ!`ywv0;nScSVDTeoJNF(B@~SR5p?e)(Ocg{Sxl2;HSRw583DpL@)o;A7TFh Dgo|S8 literal 25487 zcmc$`1z1$w_6MwpfHX>jv~)-hjZ%ViNP~2Dw}^BJNHYxGFe1{WbPtWR%IT0_r>?#`#sDDbI zax|pxlo~N*)?2qsUdT#5QTNQ)&Vbl(OA&W#$}T)J@GMs~5mD#4VtgjWV#fwkXhO?u zK0`&5TFytsd!!|YBeJIa&F~wmC*Iyngoe%=0~*GsRA~8y1@&PH>)F!`+>KS!3hoJz zQ-P+j)ZT%yX)MG6aPQ)sf!7A`)9Wj{z1_vE%Piyb_*ZUP7VJ}2wercIXAB;F7CiJ8 zElb!COqOXzcF_OeyS$w^xz{OJ)-G747Uo95kM+IR-#2j{s$pD9G#+G9B&@&?afvMI zKbjv=1KCqiZc!0-)MtaM#u_w0$%iC-qY-z-7C!HLKYT|EkT@mD5zqY_6c+sRV!vJ+ z2MO^7qcpw1t`ighOe-MZ5N$O}n^f8m@RD#B=U=`wYS?$KiP`u72!Ahr^JE$miEbx=H&&IAXe&%Fi3H=G(Tag(I>~|0y`$sW;XwF z%TPzmza>EA;IOXOJI0?dMq)U@r#b!eYSp^Ns!0PszJK+qSFhlQ;B9shK~A7jy&hjx z{HH@i$Wa7DoZ@vP8;o4i!qc z>25GU@gB)&(*5p&n2sZY*oFSMkea%lL^+*8PHJ*@G!YpbAa7%Kx>@&NBW(vdjpoFM z3oVSmOW z8-!ga?p1FrcYp&f?b1?LrVB9+rxK`WR%RVyBnT&C#Sp9qv5~Y*XUsQ@3JPx^eG(Z$pn=<*ICHA*UHsoa1n&8%yay-WREv>ZUo z=S%C?2KaXP$avScg|4wHE3pHqzMxs-VUyh@dxAt=9ew8TMVIBoiiZbJ{=hWcB`_@H%%#yT*RcopR;C_X5CD=GISf{^g7 zqkQ-1NNN3&`WHvOX=d_s0^caI8H=I&yNVUs+O`a9`fOvsRcZOi-X^GbTtvd_+D`tG z=?iH4b@ZyBq)S51)@6m5028N&I>vgP5x-R)V@s$aTQ0iH8Z-GT!dHaz$ZXp-a_YxO zcS&!AU@MZst(ySE73a`vb!Rz>WXCVqEkC92c|(l-LCId9+h0v=?CQ#i7 z)7P$gh3GQ(&$5Y%2ZoP7Q(lIj7TQ2KaIybu#F*p8R5U&7e6i%%gLRvXQ^#U^cTe!c0TqR!{#zoOf?Dx=r#N7`4hA7-==E{j;K}MCoD;G$hNMU*5s<*T5{YTYu)Y& z(n&$RdBzjmO}ljy1gT#cU_ONKQHY|?J6C0N4JG(rf=TV3DsQyr8eSNg!0%!C#|Uzk zd#pRd2p<$nKb+rJ9-OYH9hA+Uc~gwwykgBv<`!~CDU3gGC$|{`tt+!!;B*MQ8JbT8 zSS$d2G)}9kTn6$0S3Fbk*vy(H?5|BYh59RraoohVG~t48xSeFn2d&}{r>8d7S9Y3` z@7_2?eoP$iG<2RDC%26KoA!0x!~{3h%IVq78E4pf&1X}&3Z01egWE>&y`1S!fjDDc z(`|c#9zw>2vd=!La}~yzRDH>~zCV-4?KU)T@4RclW;B@fFwQEWrJK*^h<=CP2RcNi zjVEcuTCVL*IGuuKENL2tM?VZeItz4Xwl? zrbW(qZXDxRtA-;kw!G;1*E1#cM!kcz5iCp3IuJs1~9CZsblGDqS^)ADjt~(Y~U$7iaRV_YudM_zg!F{_>Rz86yL$&?= z`|dLR2k&MWs@&~H(@INAXEALOQgTYFbO8LEK5xn3^t&vwV+Y6v{-B z%1UBJhXj)+-x#Ttq;bkc>E_U1+D_WDMyc$R1O2Y(7c>6&UBV9uLm;*3Y4y{IZz4HNZK?}TTkn+9P)z4Cl z$b5$c%jd{aDmvQ>HdC6Juwf!yU7z1) z(j}&$!&_W&lw1W$t|PZIcbzf094r399W4U!Yfy`@JIKPixX21&220XB?m!{Z1v{FOna-y zdG|3WzmApuA<331gC*!*-XLaGge8~Xj38Mk8Lv`|1GxK11nKu1B$My6 zMf)XB>QX9(4SQ}XP42pTw?T?R@yzG5@}MuDi#UO9`Ag8D>R8qJz8aMV^77s?kuiKo zZ%TI67Gq*)q!bf-qzd_%*%G)lPSh4YajCNTB%eNXQZ)W|A~k&1zG<3 zH5D4q4LB;nz3Gu@i3E$dMV^v7;&9B@|6A-S&T{bK3IylpmE<>C^3z&VNrT>91tCv#p4w{jplmkWY*_u; z8>E^c)%SJz@?f39=0K@%s3Vhq(We#vI*~(6kWFd`LI|Wh*|Oi6n%iEwJUa{uXbKPv zzNlV1#rSm{`{nMog25{sC%fjg;S^Cw-|}Sh7upJOo)Tq!c=G<`XI_m>l*H0omBk%q zj*nQiUW?~Yu_F~LM5uQq&B$iJo#Inh1@>~fxSfQrWO2HocJKbN)o7%>LHe|gi$yja zt4@a}NApgSFP+Xxzev(Ag-3hG>mVF z&T}^nNg?p}O+gS+v^ecB8qfbn2N60Xk+iF8;diqyMbi`IeTA{zfR3)N_z`xG)Af@P z0R z{HX2(<*AKTnyE9oETF4Uc>aVvVqC!L{G>%sM`Z3oYh-Rac{So1vH1OHIZ>z@& zNrcvz4tcw!zAO%HY)m zpl2B6kJC>JFXOYL%btDV?g*i!Agqnt*w`LwC92K(MMY5hnDJ`q!`ndDvkmLeS z3-Fc!{89PfnNPlKn}?%U6ab0s>kP+QOH6+C{T%jbh&4XvPWH%mti^Ny9ZY_QKDOjW(wC8D?Z9 zg^Ts@bIp=oNvh8y?Z27#MaOG?9LC$2vsegW=e`Z+_ci6Tz=Ul zqd4Bdx>xspC7*a-BmCKRq;*GaQHv(;R?`erzw?w5)aQ0~rctCj#b77d9XnT&&t||J zk>6Mx<6@#Rh(J`|ws?oz9NxMOY_+G8!tFXGERWv7qU1NROm|oQB4OXGt?G znH4VngV11rOp1nzi%mr?4tV8wYw1?o?KgLR5UQ!kp9mH|tG6VFu-ug`lIf8865c+T zNeyTDmet5L?6meucnv74ZO-`RSv7j=g)YEM6)rGlcaXr&qi-I(3w|{Ofy{Ix@xwKj z>r%~XtzSZ;8iNX`5{^=}hy746_M5eDdrd=~4z1TbCx)-0nEFxI2VrNj zOy`d`ea=qYTEqXn&%ZFi9wvV0=U)Gdja-ukl^J z?q-;d9Xfxt=apSvQ7_E?Sm3Uo;D80VLk4T=%n{?sMV(S%HjGglTLNSld%Fh!Gdx}- zP=*EvJTuE|Jrdm9y)P1`pJRaYsip0u`&8Vj)%&+(4*rO2hSYAUMfj(bh1EriskrpZ zJeXFo?0pf}x<%mM@{su;5anNT{}%^$&}8h;LM_6CHCFo;cpM^R6k^_?y?-#l9dzgo z2Vcw=lE^AYe@+Cxb{cOcWJymgZi|DDF<%j0?H)dx_gj6bx@QpSTM@MwnL$G##|g$p z2$GzfI)_WYNO+Famv;cC|0uV)E$*V9m~t(sS@@!OgsKWdHTH+;t+f;3I z7Xr~bIA--t;#)b7b#O986UiB>3W;=y-kuVMR({N2PK;WdrKu)l=Z13Kao@S;dF2GYVM5+=;!R<9q&8V=!2pT*O=uN6Y1l%NwYFn&a|+m#*Ohj1Dz0D zLkSEFOa7W%q!YHyMtv(lN>7|z9guZdEJwLq72V2K>%PKdyJO+r^TGpFN+b3H2!xuS z$n1_iccw3G*O3PQB*0!{xH60G z3D7E0-0cgDVIhihR*H?|?umYos(){803}6+R7ST==7e5$-7a0R&w1jxHcFmt!2pfy z$hNVeG#;Fb4$mWtDt9l_NNMAo3&}aFb8tS)ddSrqOjVVkozmk0OxSCGnGxkI9+*By zD$$&VZ{5X8B5^l?A{opMIlXGunZMq*xcD;cL+L*(%6GKZtq>j+=>!}A1RxMf7XU0s zkMeun*9A05EY-TN4|$15?mkgUo#aIgG9nK7zAqIH{mRjI77sawuPZ%J%I$=n;2YXJ zczn5}gwag!l%t^e*ypY{=gw45{xC=K^NspPkKX2WR;s0W79Pa7=Oyxm+aeaonZYkg zN35SxI)J9gop?UyPWNt|E_n_^f;AWTfsig=(M9;>+~PU;Y^`#462#iA(dG4dw!iac zsCPkTiGd?^e9PZta)e8RY5V7?*{ZeneET|# zNn*qei3#rtRBM?xt=&`9x0~j#fHt2fhUIq%c#Zm3K7`H}4&M@2nQQjN!!{XU_iylN zI_H2d4xX0oEN<*yXEVKYBZ;{==={$>bR*;NZ?a6DJQy+wD^F{QfeF<8h;yGo{S&OW zqU$B+V{DvL2eRy5WIh0%HCAAP(u|#dJUoi;1A1@$iFNO56|t`3PG_IKi(G6DGiB0- zoHRj54n*4{x%VBkq@;vbBe#t|T_FWD{01rdKfv$p&1t70s$rRQw=TH~Vm?L1fZ!y$ z7Qa*vSkpu0Q7y1Td$H$n{f7FS3>c3iX-5~mr_EK3m|vm52$PXN5z~!Wfb0(GVFGVf z2V5KA%zmt=aQvWkjQz17D8oF8R>R`Ob065bfLNqq#R!d2!H8&97hL;*8R(MS-?+rr z&=h&Ms8^QeEl(7DD)Pm4)716PpDCJ&c(`iuo_k*xzCHx-hpT5GaSMKU} zyMCO$J(8T0j6kLa2bhi_;yv3<}D zcH+3#E=g?#ODBEoJZVH1@*7>5e;#<%zVL9Hul$V)xsr2&dNa}_EABJ2a4aD{;RoQh z$jVnD&j`Y5Ev?dNRD2$%nsS}UlZIXn*$&Vt7OcdsA6)|*XvqH)wDDpLIAc2o`Ii|$ zK(^WXV*{6*?2NJ4iV7pFT}hB1-3rxnERrb6IC9gD^tWF?-;{@Xm}YSA%3cz>fcXcR zW{j@Wm*ajjZ!V;s&hTrX|llv=<&g+c_SN zjJ1e)7Tg-c!HcO=p}>c9Scn7!qy`AZ1o6D%7ZGr6*qbEX71-oiD}1DXHPluxn}o-3dl|ag z+?i)u+>Fjt=pORX(kC-Vji-7;F-ddsrRo8vM83{?To;k7%Jc zKxPL`ru@WvVM75TNRiEC_(ge$q_$Q8!=G;!!7bhN9+yn3JWXilI=M2VZtP)8#E^Fc z(!G8Chv@vwoKKAl>*xsYD1!4jC@1-uTjVd)mh=IFM76~r$&s#!^eVRS)QqaI%}wa> z;5sT_^w25Pn(}Y@34UOSk``#5Me@tRhZwd|Rp>CYq5`|TK0I*@v#wtCmI5exiD)Kk z?qr;+h&6A?h?GJDiZdr-zqc+*L6tj@vNjuByzd(@iujkS{dw(Oqbw+aL2e1sAqRON zTo+<6#a)x_A5-ezRg+mMizuQz&h;OM_#vqN8ba~wK>lkNNnjKx-Yr_}vnvvtv$2qb zMQ`}>PEG2Asb<2+&Y6MtigM+Pq7<@-H%|KqH6MVAm=l6{gR{n)Vs;+oMQP(hB@Ho? z63Qu??&AZmv`gXW)@$G9vo92U-iS?oA5Z5C?$U3hl7DOrv^NXLD|m{k1Z=nsREm5g zh1)R&>;!_Tt|agsa!~g#K%GHf74Y%yigoOUq55SjzOPKxm_T@+Be*yu%-mnRaMx_5 zVQw%_LQ?-8SnSEGd>kEw`Hjl^t+k`tm5&;(sSTb>`#rMH$VgZ>0>Obah?I7h2g8zZ zm^DjVyy}(t?H>eK7t%Q}cH#Qq;56(K{_Pt??s9i`)LlWqMzr#~dj92rf1!wyx_9ibV|=d%G!p-QX^VzT=G^r1G&r zu|juEUKfVe*J3lihR5&W+=TK~2k|SaLdp_kKq47aRawE0s5BsF< zk1m-#l49lkCqno9R6LS4EH``im|8yPC9U0Yop{S4n%J|;N}0;6S>4fC1km&bxngVD zC3m?W%uEQrG+rI`dnAi3X1Wj;FF-!m69@nt z3KMze7yz}I&|Y;G_?ZR)s82&lCCNpgO;R`CpX0JX-M8&|*Vc+?&fDq*zMDhhP|4qA zi7M0DsEZZ@5sr_mg+c*r(3j430*0E2)|OTqUlhmOeOUZCm{HR&q7MNkLniRDcsb*i zH8u-)T}aRO&#FfH>IL<#M1^mz_$(&2yvt4>zb}oKNx4RwFs>^+%K(g0U6 zv_i#Hr;T3Or{Txy^;*=QJ(Dmj&*=8{7|XQEFi1+am#+@inKmZ;p7-22v3|o~PJV{J@=4FZ$LxfPjl>-N!L*M%0C-o zt4oG_HBp%U)HJnijmwMN;ohk8f}*Zf5vc(vG<1px%rqjl2x_t}Ya)$VwEtd-VTzvI zzv|SKZ(I__t|>|_;c)M^ZhE0)FZ(GhfaOe6KPD17 zPu8{FyVamKR4!O*ra?-Y+>oL!WuLz^L=AdT;{1YWb9`d#8=yG<@YvgNa$w>%(u}9u zu>{KHm=CyW5rgA33gAV<0wN+8(6)lb()V#QPmxF~x`oFwEWY>wfQR-Jheu+NcM#3DWYiO@P-}lG za$IaQ)Hiq9ZZExZ6bJmiNsPUu_3?2i?$an5q%UDFiX5D?1cu2iv3XF_?hFR5i@W@L zb4qCVrc0YBzme!v>#RzQD2z6xt^N?VE!b$^?*S}0Uc8*-y)F;>+g|+C$6T^EL4T3V zuX6f*i$YJFqiesF!V~lnevy}Be0h0XoU3mkHVZ-QS^S=-?;OMIAO12H|G38=L*i2l zD!e*RJ4Og`j9P4Q*vVoxw$=G$Pw0HP`s}}Hf4_gt*&VO3F&YLuJgkZguwZCa8nu`` zuEX$(;jHEg2%3SlesygrJ~R;Bd&+YUTI$=fT9`rkUyaTma%uQpse)dhiBT|LUBgAl z8yCW6O(O^A&v^${s1n$_7TFt0K3wxXcKqM2D)_P1gAs z8C7Nq-wWpL{+cTT2KOr^+IFNAZFjgpDD@Jd24;@s0D!Rk{BfK^cn`!^6r35|meMBC z3sMvXEJA|Q*OQH>Iu9efmI<9s&*%)bS~7*jyzoEZl{=2KEInDi5n! zFaRGkm8=#{!Z(dXW|Khs6;KWzj}#hSTuG-4;JgtO?RBJq`0xd&jRlRO&CEkmQZ?&t z^}H;E&dHy{@M-+uk-Ep~KG?#1z*E@p_%PA$-MMYOXz1-zDw^+G0}1CaCeNKgaqgcE z^F~<~2XI&w#Ac4D(7BP1rJ@%&H}{E+bgt8ofNjr9*WRKws!&QQNC*@GR`c~%sRR(H zgc>UzPP#cw5%NdHGH$A6FmFDP$wBKRJPs$+;$(87s~~CVJnaMd-(4G(@-u!}PnxaQ zpjUZ@_H$a_IiN*)<~GCJ&;g_gTSw_nXp8>7gSgRTwWpaOP8 z#?_@`fY?Lbyp?^x&ix&OOz=5e734R8`d8lyhK=;A#Qto#h6YkBLZWwl?falzh)Kcu zPF=tY5@}n`D4TWMgU9FuV?d?OILqP=9HZ4ps~TezO>MEi_mZL?z!rbwCz?#4$$b3E zLG&f;lzEkQzb0_5Gv<|~sD>W5HOnqJNVJ3$WA=z`B218|Dx;lPpUA_m6DSi*=*+v^ z(?&wh%M@(f;+#b5e(H`UPx$wZH-p9U zoJCt}u9crH2*3&{lgi5PBHfzQJn{~l#{OJ|)6 z@M=IMvWoCFYr2mi`)RIT9ZnzmhqKR8$V7g)myFAijPz)wYOFrr^3EZy^u2rIK@uJo z4Gj(SB#J=0`sE0gin@k3r8X{Eu3(A6$X%BT)E-c|*x0z)VlN0|5L6B4R?t6q>q`&P zjDy%5TBJ1y6IopNDySv9;enp)r*iy=z}yOTnpmRvaju71AvCu_zJGdA+j_lucw%pV z=hmwSpH8j@+gsDY5W^w6Zr7FBorm_XtS=Auua*`Eldm11eD}j8nHA}XEpGtKglqU2 z;H@Lol6YI-n>+VV?_<-E{~*BFmco!CDvQcftRpuz?fLf%AjzToh|W^D^I_i6^qFQ6 z_1zIB_WBAQt_Lq($IYt0yJV3~&+V|NFC1OHgkEP3+9@@9i(s=%j~UqW>`uw$sMM~0 z>d|96P=3g*?^Y8J3cn4XLzLb^A-xgaY?wU%>di0R^L`H4WM(Qb75IcQp7?k>D_Wi2 zG(I4Y%tiv)=#g~&$;ZBGTBQKNPRe4>7R3>-8~FYq3z!*+ zHrnTEM&oMJk?!Re+OrZZfPNK?t`U)ta(DX~X1m;(Ib&9_3r% z(vE2`#AOd_kjIsWMI6*87n5zeAX86f-g^!tqc=Y1F>4thLrquOc=_PXE}qTh0;5hc ziLIy^O1t>Y(ERPVYRR{$$Q;XTsM+8~IHd<|BS^~NbFi*kEY1?S*@2@;Ilg=a6kU2oB>b+et`UMbWO(}{ zg|e;C>C>k)#W)5iIPMGS7w#%2LxkYzZhHJ+DAgCU8f@4(*6lp2`dKzHu*+}ji@ zo8n?WX2e%K&%pJ&X+)L=Szf=Mz+MxSg>d|Cs z>K>09w#FyscXzswQ{4pIXEZv16ZsRlsN8h?MZ7Z&+`7Lme%(J+2;f$-HH zHnW~o!Q{o@(RZtuyi3hZzbU7~!TqR^hC8uN9>#SWtn1Si-7wvFksuo{f0eQ(ncQHV zF(tb)WX{gZEwxf8A95;Z%PnQTOTSR%+*-kD+rIR%u(84M#aA5f8r#~C4DZHQ*vDQ^KoteoF=uL4zHk}yXFd-v zU{@o8O7=29!C-@jiu_Rsd_(7kmfqih&w?Wxnhf>RX!=Li`i0*) zJZ9&hr}juOEHx&EKc~M+@4;Z&Elqi|%%3AEcBh*hDjDAIvN7tyQ$DrjZtKB!Ah}cP z?~Mr1nVVu=vwb7_=L1zy`WC799m`u-S+{v!p$z}gfKlA?yI2b9F89an(?!X35ICOU zVyqceeBa@(ZM#pdQ|XWGh43_Z9$@g1)vI;$wEr>%M1APO_muJ1MD6R<$6zx8o`cy)d{*#Bhv7a9D&XmH%ig6Iar zid^@Xb`}F15Z?O*4{3AsI~SjmB5HT#r?`LTME>D$JrWqcITukS4JeqciBy2IuR+(g zUI5ijTYWRUA8^wP_ql>Je7&!Rb2d=ql2^N$IAc>lIlg{JWg1pI^Yz|SCAtXDs}c>I z=bbd+Q`TQ2YZf*5rw>1ot^U=G{XZvHr0UL3itwipjw){-QJxG@@!L~`w86PQQyyX7 z^$uol*xGO01jchlT25)D2-yV@VhpSUNusJY5otw6) z9z55$!h9g^=gPn+a5oP-K>a?Bde>Og$8G`Q-94#c?HxG$x^^-Lfq^?WQcrHO-|MM! zeP`y+)O9uEtk z`CYXwH!+14Fb3d;+TnlI6T6E2HsWoM-fdc6u1+diBe+-Scn12C!rJMsLCtXNnmWQ; zOrd|h@J*&WWEVF=-KyecJuq|0WAfo};9Qa=?OpJlzrE?v1oiMgUsw1kg80Y#3xIcR zPLZ9w8c=R2FL?f_*D!bBD^!<6igKG>pT;v1?Ay1+J$&EQNLo2;*S|JNV<52h zd|7qkGA!eLiBnv6)>fYI>9a_&W$JLXQnrx38gdTPTvX*!Ljqj1v5w-mb^U)-{KNQ= z({4n=Tk-4DwZp0Y6!$Ctd!)EGesVm zxFj3Grez?R@s;)c98=r{Ubf?cB0h3m>+G$fDHLMIPoYWV#yH;b-Y2#s>5Z40qg92b zwz~(V&wu<2IOE@u}l zvcl2g0X8*#-$YPXk)`;gWC2T~T4VJ*_q@>H&|Ya!`_ZwP^Tq(67$bzj+&f zalh!|9Wf^-Y3ArDjP2^?_fB)w+4=bR=j&N7Wr;vlD>tDmW!6l}eL`7W z5XD5G!-Skssj{>2Lx$R8USiBSBaYCsymZL%<;IYAH|3>vlh`+`vo5y9BB+x6VIk!| z-AY%Ko2qXFUx|aI>$-CsU0g)=PkHba{T`Dh3ItHHpkL9B90br|-VTqg$;);&+1Qyc zbq?8k*r0}9=&ER0sf?YDRCGVi#&@7Fj091UcqBJ^4x%HCn#z5*^$?aLM&(%XJz#CGPl9Tq)*KiF@{1~ z)bVar+3U+*HqrhiCHfV!ON#R^gWv;Q)~~1U6VFVA0=V`WYT;wCjyOMD6T$B*$Y1N7 z9*SqR9~?@L)Dv8s<;RfC>IQ|k3f*Fw?PM-K^3Dx!EjTt4-wanJJz?S`8-8RyuX)vD z=eLGK;xT=N^xXPGns1W8ty`>|=PJ8@y!8M5?RlA3H)~dm>3!^C*5~B{MVRI3t5NKD z*0Qf`Td3XlKgYaK#g9oP z!*wsTf^>`2sr`c3?NOXXSdz(E-ps{Gk`VgmX{TxfdNL0XXn@rdKHio`N2DJ9fb3%Y zGBPL&u^%3b6D2;uy)pkyV4j`)NuZp?2XWKhGoD_Odg=5I=(UU(wB?!9JF<`>34U43 z=$<7v-a*66*Aj*o6@1E@{E^0UwDaF!*vBOD4rc2JdG=HE|pZm`(7fLok?@f3(Mb3Ug=6LxzC0sC(oScX}!0t=>9MP(7Ts< z=VaGggmf=wggX{!R#w#VB=2rWo&v`GhS%F*9hh%#2iN>?k*r(>5#^3_#46ZjkOGtE zw>V-ZvAlm1U{T24(0ch|m%);*?9UA>Ht!cTk`hX!OcsTvdd{cubMF_HuWM!NVB+tm zMzgo(@RQo`&wTO}YINtw^@e#&TrxEgratER;-$Gk71d=YJZ@6K?$@nKbrsdcL?ns0 z$L1C=*q<_XIQ{wf^ty?#a_lg4^D)NZ=~O5rproCoqE%q;&chF=Hf${fyPSmbUUSCU zIFGhIr@k0?NbXz~<^eZ(%6-8yruVF?IjW+FJol+E=3yKq)-;nsbwi*peuE;5w8gMMezl4r3NQGr1V6J^mjb z5>4@MOdgYm%(S!Ca%wfK-a%3g;X{esz`-Nl6Yb|H(F>Aa4+vw4By*@lx3{ zp9enKY?QlSrTJuRxb-eoQL~AtY^zlt(XFQruah|gR;8Tl`OM-WSV{Ak#EaFV&eNjB2+3fIO&-cFy!O7 z==74Y$&rFvWZj5{nKB1mU>Tu^78o=vo!-@W$?1*oy!zAcxv%Qddh1KRkqjcDPZf6RTcsnUae%Hl< z24Q`Q*&X@kWj2Ga5s2o^;qDQmBa4Ts+w0wsWU(P&laFroprgk%F&l}kq^#6tIMXBb zTvMhXGYTeGIsMVPMs{O4U)Rs-yZO4v(#dmAciGwceGQb95~O7;4PC2SRo6LBrrLw9 z{bE=6WhRVJ>;n)L*cJf5nHV8x@Qa~$aetp)xtR8ToI)PZFkH+p5+Zn>aB%IFdQ~=Z z-JaMHdTa}Zwv>Z{bN*57Ycy;AyGU*58;OA1pOo$M-l-G5b0n_WzmI*XohW9*wgl_r z(`ci9jm60pr&I9#Cf{H4j)g+D5Mrzh8t$Cs?q-~Z)uYl=s_pN*l7wQ-1Rx@2nM=D1 z8F7z?Z-O=^&%K-ADvi`U_L&?n?4`-)QOpn{mdb?o4^F#tgY&i+dlZ@q1ex}wx#dq_ z{U~GWOutF z#&f`9%=XFo5TVAUn1wH`hJiPS>Ouk+)KUI0uFtFQ!&nJ&Q3B%XD8=VcD*4HPn-s{*Hd4y>h4Ju-pLOO3LqRq3od;5mPcVBgKq~FMt$k~FfaXkgh->6Dm6Z8Z<9C=)4m4 zKNpt%r3?S)5ilq4N8IcGy78BY*njyK80YPy?SAN*7%KL_x!@J^_4ls?5HkNRitR!p zF_G3_TKK``{&xs~pb*Ckrhcxj2MXyAPc8{#a<}V^?3P=hQv0BQmVLKj|CvkMoc|#H z{~H_=s$g1_?=^&RF0$>jste6tl(|0%`WLzT@c$X%`!D(V-#$ixn|1xcqnkAv*@*a+ z%d|MQu7omfF#c;x4y{PDPkq-`8#wQY%4j39I?!Gif70)O@dT!9)7eaJAKE$H@!+rR zA;57EJwW0Szw@^{m?Dd8>17mW7qQwtJY%fN9RbffXzbw0#N3t zwe$XSIz1> zt6^kj`_17QCWUwP$mKT+bFaA-iqm(inJ*e2#&B}OPHl3hHwKP}YMVFqn%;q8edbm& zTRkC&{;??$?KJ!Q# z>JN}M@I_wEGpV=;8UiWi2zC5oMpc#H5fXc)n4Ov#oEGORt38Ng`ZGQcY5?T^#oSN4 z9&ykQ-@^L;VHdbn{_otV*3%@`$-O(c)^)ne`HykPR%D4a=cPdleYI%b)UxX5 zXvU|=cRx#g0^*8^)3nzS+!>N2hhmz>3#AGf)&t=p7EY84AIFH&l0pN9L}XqOX5F>C zt@Ho#;N63C^o6Zns|G zkY{KJBGp+{E1z}#?nJ;oPA(TUx8M5cC1d{hH;qX4u#8J>;PD&zIbWYI3$R+sR;vANjR8iKU&Az*G z0i8L&vT_1-FZl7<##UFVW2Uc(rrQ|#ltqVPJe*^22r$%Nu&_Y@-}5K~g#tuvH+f?B z_basQs&%kja4q~ag{FybsNBFrp25df1IRBu4sO5UBqk2jw(q;t^1j&HXXWrc$L)^Dtq&n>2wN8CKPL`OybP zmD}gD|6;qdVxeMZ0v|i)`uNyGXy5@;l*u#;N~b!^S?i-|S)2yvT(?uYJ0+CUfe96_PRMQhh#Dzk;AT&Km;-J%kU z&~%2YmP*K~2)9$Yx=wY_^>sO$e}IJ^%X_8VV}mGywT)}0;2`0KM&P0K$wn1ql=4)pCcecN87fKuE$J4 zEKN$+gBm*t`*^|j6uY7blHENs$_xBy=+}YL&CyohE>VZ3w|Z8ciG5WyO^)ks3wsvh z{$SPbkLKc7d?A4|&Mvy06RT0Gg*ex+2P;sqxNT5?5~Qi6mu$oTyice&XDInOq(h5N zsFCw{9iE&S?ex{lhaC~e5oz6$O2OSU#`*;0hq=+Lx{?G7mnX_yN-Y z{QLMMdAPgG7yiSR|HZ`ovxi5+WS0M7G`e|T0M7Me?D<4x5jI5gRR_D>oG&se`bR{_ zwzfD6%+1_*rAeIq;cgsV3&Ma?^(fh{?)bEWiou<_7gV~OnEcu{zGvR@6Q*2<$n%py zO5^Q81gGU+9Su?#p4|V^O%Kq~nC@j&yb~O%aBaB(i>3 z-FC1iTQl+#J+HeoMQAj2M05C$Hsu(f=!K;$N9CM6zz@mnrL!|X_EZGM`W0bWRlO*2^h7?jH(MH1;vX9|&Em;yW%VlOR zCI*eUc>3;5rf$!D&v~Bnp6A`p|9{T=KELyO|GyJmX9{hS!#cJ#G_(tT6Eevs9Przy z%C%E^j&=o%1qqvj0>>ghvyr8R2I1ouO6_8(zfLut8H-S&AWcj@+BQW;SKKM;p?A`9 zH)@Z*)P@527%DAL4P64J5_L7pEiDI^hf_^2%vw7pS+vd$nw1tV9#!mIM4HIxgBHYA zXi1D06(k6#Jg?Ce&!`cHWzvh!fMKB%ZLD&a(^7S{7hKAn1``?K3uqrU)4^~Vid+G^ zyS4iiEotK%cFxM2!c9++Cwd$u{ODHX%Ic;TZ&VGXU619zr{K$SWdQB=Q$&#>4y z$F1%b;ARj(-j`KVCxFV)Z?5^Bge%E+d>Hq80CXM^x|Tv~4+;;Ozi96!WPBVUiBd_w z0WXoxX}l)r6-C|#F~<&1cB)h6mc@~;L3xUo6IDEFN&7de(zs{|TEMpGwZM}WHPG_e z^Ee8Li#>mxA50Ix6%qPsH%$)f>(-4r&whQMT# zjO>0$YkZkko1X$|U6+vsbq^mDQaDh|X9Xa$d}@}Fc9&4q*0K%7xw}Rl)iD#{&SX>O zG&8Z#V)8Wvxcj7}q|1%ZoN%c-KFr$JeYlUkL~*K8N!CkSySe!{ROq4H&N5l2j9-F_ z3>>Uy#!Wlu!zDC4%auUf{xyd(hiU9-dCC^!x55&(j$HN>U(-JNsCKs{*PFGL>=|unaCAit z2z?)}e4mY4@3u7LDd6}*^z?LK0_+&0vO3B@@lnS3iy(j2r>1usBJ~z(w7u9yOe}4OY%`!BF2m++L58Y>V%4(&g#>k~agTFgK)|@= z?9!E;b?O=m%7IFdD@)9h^B z_m2eAwM0#9!T#C_C1|9(R}$?brH5} z%TiuOF(BSRNC%*kP?7u`qEAi%LZB+{+658W*_kL(C+QtofI+1Xx<+D>lg*5W@*wfS zv3dr2`dg+5=shurCyQPJ{GZgxDb3SZ9eoY}Uo8}Ow$tL>uYY8k>93^S*?-@T?#a}$-#lm%?GEWR2(LS=<5a zT4qN3Z)A2ZQToZO?u9dD2;bJ2w&i_;(V~py3YGPo zS20bE1e!!E;|~5V2i67`Jn@7u@3&Hfk5knwV@m$Tt|vWv*emRQ7e8IxT8I2;Nf;n5 zXt)NoqQ8VzAHXU@G34r&6Vm;QpXsnFMAbWH0rydFh$I6!LUb`7nj-q5pnVl-h*DVY ztFpO?q5cdHYR}=%}KI7|^3BI=el^Q>JlSAkAX^8)qt+q_(HTlP`s?h77T?i2Tj z;p~FP?)-kX*;3^(c5vDW*wla0@Yo1Fhwb5yja$KegKjoropsP51K%sgH>L4%gMieW zP$rksj_4Vki1Ay>?!2|qlEt!LQQF~p)iGZh{&jIo_Iq~{+ne@gZ(2i)tnJt5Z@l`? z8m)B4M(TZ)iLVo2!z%_Ghoq5=`xq(}K?V@&KIi{W(=uhg@2?-Ya>F6oEdj2)fWjLD VRLlDzV(oXbrKyd{V`I;2{|0pHctQXG diff --git a/doc/img/sign.png b/doc/img/sign.png index c8af9babb03cf071c4873d8127a4c3834104e59a..431b1ad0c777af265ae21299bd17056b848b3123 100644 GIT binary patch literal 25851 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 z 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 diff --git a/doc/img/ticket.png b/doc/img/ticket.png new file mode 100644 index 0000000000000000000000000000000000000000..a65bc23dc8643ffe42cab0b8eb1f1c2299adc09f GIT binary patch literal 21965 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 UF*U5;9Qt?VRpd%%>V!Z literal 0 HcmV?d00001 diff --git a/doc/img/topup.png b/doc/img/topup.png new file mode 100644 index 0000000000000000000000000000000000000000..07117f07b1fc73b8eb0a7da1be01d730f239e112 GIT binary patch literal 19761 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 literal 16184 zcmeHucQ~9~x3?fV(MybyD5IAUCEAEibV5W8LZX*MCt4)R=)DGsAi9X|K^QfN2%?TM zL`@7)q8ur29^v-nJ?A^$AK!Pqv+nEK_u6B2S$nOu*Kh6Zv6_k;KF)a@6ciME1$k)= z6cn_-P*6}oSg40J6%uM3C@A6w3eu8Vt|?1nosUPrRCG0K@YC!Drs&j5{grQw+oWZP>Jx-V2|WD#rqf^tUC5{B#EuR8HSGh*AbqFR>+d zIl3MY`${?E%=zD+>N6Q3pUuu&-MjAAF|o($vyT^&`N#?XZpAK9C&tT(eUbWSI(Fl& zRazfpH> zDWv1guCtMp^kHS?)^IZ-$YG|Z*Z>zMOlRv_Lko(vck!syX<5&2b&HnGfRP; z-9>HTA0=vibQY-FQyJZY+^X#-& z!xkDe6mwT%Ygj+f3@$Z3AHF*-nMNGzd5+RrLqUxNdMR~>#gr2JH0jEw?4-_anE_nesGlN;Vh?9;<%-_ zYEfdmXxQiI^mvov*{(Y=ezCgDQsI5XiSVZ>9?Fy)7beE^5(maEZClcw`@-aht<>0D zeZNo4jga8qCTJrO)UD9tzL+3faCL!AyL*16{yJirfR5>I%jT?yjuOw^aXqCEUqe*; z(?`A%k87@VwdY^&OxEG9(3?S4^H`%J7u&|hv{w2qY~2~9>)c&I?ko5;zY~=Vb&0)h z^jGW?FuC)+O=Ik*ygf=aSbj>#3`iCr9q4383PAwq3nsi*rpg%2r=+p7Xnq5)DCvSG zXO!UzlK^T2ee{!6rA9?V&MWDEk)_?7Baajy9#!x);p^`O)$QFk8?7SzqZr#{mW~4PmNpJl=wE+uAL87 z*SSNA!w*2~x;Xq;m;eOZrw18YH5*y0Jtnuq4z9q;oHu;Jz=z!EX%H+qbLK^6ofY;= zGeT&_`A2Gr_mqaVR0c1LsZ24p)4#xlzN)n4^AAy3U7!Ww>F8u_CRvb;7_51(C6Wua zRDKmrRBuj7Z)K|)8q53;UljXMqf>Mfo4V!_@4{7ISpYKB^u>Uq0MHO!fE2x?eU3!i zJ)ibiCx~K7s`$rJNiim(m|emq-bd^f7U1)^xvrNJujv@)fHC{iUll=3LJ}vGFgBCJ z_`+8k>uiclZ(Q1LHOeV>X+h7bZQ&&0tH&?JRb|+^=T|7ZDh@Zy@kI>-ps{R-KcKZN zoojN?QSPyvAHc23IBSCEj(c(1kXS}r$CK8`iV&$IshD#fLTaeodXqm~|IYLL7)mJj z>R8cbK9|>7HzJT?&Jy@9(HkAXW6*@ipiFV$!@AC!qLqEu6K@!7!n``iGyT^JjbmK4eLX^N^5o4t9UucSKI2Lk zrW_bky2H|1GpfiJ@26DX(Z$jWL{coho)F}jZcKi<<1fx|w4KK3X^Z{|uP&?m^Lo2e z&2zanWgC70F5Ndfmv`6h?l?L1FRamry{$hlx6x7Td|qj1b=7DsXfnsae$Df4O`TrH zpk0IQ6}P8wlDh>t7D1XLi1&gJo)_KwB`%wl*l3aPC6awcc4d6aU^QXq`K#= z#2(men^TjXxlowqz0W>8npHWWSL<7|Fj42)|bhr&HwsHif79FpY2TiL&!yW3zMm81g z=7m%oAG&Ohd8I9`lpSmLS1$)ekYxLWQ;5T(>B(=y`Sr8E$GFan!w*6G|MYP|ao=w}l zbq0Pfh9%k$)|N7(Xw{Z3ZZO9YoU|JpYo}XgkUO@py|Fhpk^d?_XV&g8gnvi1fSkVV zw*6{_t|2ZSiyt)%!q9uP=#kD~1(6cqU!4hIR9B7?pTktgo<8WAj-=?8B=v@K7VlMN}265;AF zFn3yit0Pp`3uT?(1I`$&}93!fq6ja1*(I>vVj>es{9!snjKubC?8OK;S!57*rwlC zV#NpZH+A_uSSry9i?`<_I8l987{4(Cd;L0Lu4`9eTzIw25GTIm(^6pMF{}9{ zh8-4kJ+uPf_YkX$%f06<@yjuOusZy`4F?A`X%#*3hT-ki;nC+-@8J+dGGz0lR;$}; zHHT>|WaF&P>aM0zAGMdCtHph>_oUHa2AaACN*x*dLoVWh2)pi3kqV;>f=BqiQx2H}^F%w}MS{po3x49i5z^ zhpPDQoTrv{o{FURP}pv9ODEyByvaij&wFn=DZh|fRNijFFfmnaYE5|ozW38x9UC_Q zTLNwBJKzM_^rTJoX%Dn*KW`c~oofe|Sp{ zZJ{@bPU2Ldu*mp2ykTh^yVgfVnTRFLp(^`#O{qxnz*Jm0visLX3KJ-Cqb*GQx{-I6 zG${|iOz}c^lBLghT?}-<`AW)0P;{lEQ?S-^x|n;SZQ9v~24D_H-1BeWLSNWB`>c_P z%&kp!`Iphrr3BVRJPoWUdQ;C|r_+h9{OE?R|wEa-Aho{I0W zz2Mi*;7@#tYHnrQYsJFMXrnKSGP7^tDdq}mGYKqtXWq8u5lo9#IoJnI z8^Awdbuko|iJ^9`rcOHA3s-`i^r21CG)6SVQ?{fl;Tm5HbvMo6!E9rLs*)#Ft2z+a zXNItWDBM=!RIjw56&boTBWsjJ8`vvB+xhaIFN^bJ--y7#xJ4Fqk>);+6AK2lge{2Q z^xqjVCxr$VWv+=Ix)|YbJ`0P}Opi9^xG(wcTIPc>b~X=u2K&D-X>NG3-G?r0Xt9Tj zg6rOJT|E2*l8$$ljEe{Ycmu;z_FxRMe=`4HUd7!G*bjUgRkB^i#88cCGQyYT!89o; zzt*FRxIE}LFR(FZT*Yf9z>}0p^z-vO8<9E6F7&xlGio|zcZDq7Je?*!-Fv5#&=OTS z1DoHMxfeYNLh^r)2`8OLI@l|9I(XkbHG7_=$=b*InO zu@kLEfZFta%D}R@@MvL3{_=tAgpqis@QGQkv-rlH?12#kPP4ZrCYb2|Bo-#zkYjQK zR<|Gx_gM_w>T|_6?fTfYv$6QpB=?qZ=?IB)Z_751p{EGy)=QPz0$=)lXw6K#KAFmV;&@kTR&)HS7z)Qvvy z4)NUHeb+9nA<5_wrR2c;g)v$*$6U2@Iqu~InV3{6FJpYQz^iMH9$u^jQ8l-!1x{Ih z7;EouQvbOKrlkQ4*aFp=(75i6v@`79{BCZh1Y!msWzeZxIczTm>Gnng>(x9H?z*6d z%Zs;)gbz)GSP4=zLB)?E^sp*!Vt@EVEH_xS=Nc~xc+$NX8 zFcMBiWf;jDs$)j~Tb%seHyTg??+AP9Lhdmf)>`>7y%)Ra@3V>MZ zl_VepksHC0!*r`|Nb`XbsB*o%e40BxI;ZL$;K^te*-M)+*j0k`3Aixh{W}|Hf9y8; zP&)%CtTVoRFDWa3uUrOTi(v*zXE;mx(yD^X%I(}D6iKMET{Z=X4s$mxGUw1=%g>ZUX3HUG-(8(iknLKI_nJf69kjO_ z7IBx#+NIyeq7Dd?BNfnVO?dYtGFX=Fe6D47=D+(AZB2>st351H22jsVoOyN= zBSQ#1Z%;=_1cs9-*oi@ea=4!*AnX=RWC)|rK*%}oK{Fz^2VLqXM6jkRxv%uZK* z7sg&3%d_REdS?nAT!*k{ko{n*vmSW6dF%~&ABc=gG*qO&5*%#34-1A(U(a47Yw7qF zk2q$M&N;rg;xxTE=kfLNNk6lWgZit8iZYE3qylQ zw%|t)-fxs=m=gm#yhuN2kxedfk&%4SlP-G13v;LmNq_r5Y5#zG{?;H29U*{t>8Qp3 zRBCr#-wHr7EcUJEIQP(m@*(fY)~-8uxX(0Vr%?3bN$394wbh9OD?|+&=yNRx0oYQd z_nD}qho|@69&&2-yR?Of{iIm zvX~YXXpYGDpTW?JEPGIHWJlth?U*(p5fPPW0RAD6nuauC02rDRFaY4qZGxlXP^jT~ zpOI0neSFbSqr~#MMl>nx#!KeH{~wyAuvOT#=saG= zJSh&SpR_)h6{-+CogX)4=I(W5?_4CDr~9%(nd3`|l~r7cc9vptUq_mBw_E=DEs^si zK79B%ov6xRJ}zrs{~0?T3nh=S0*s)IhdN#@2};jyeRE_fV;_;((L- zW2V629u;t_pmWk5$v^8!k?NcP$6%rDGzPB@|EHRRf6!TPQfT6A) z3A8b+%({M~t#PBP6?A#y0==90=YBR?VW;}%n1jRK_Rz!;cSLQe>+O;H4VtgHg1gn* zx$cM-f1^!{)5g6%i?K5ZL9;}`&p5;X0HYV>{0}A_Wj?&9XSJayo>{QW(Zgy5hWV-; z@kZaLWy6UG&a zBeiW=1jkE9YY zjFGUw+Yxy?hCLzbk72y630=Dfb#aS(wRJ`vWN?TOAwdAz9|~D8h{~O)ivfu-gd*?& z-x%%hg4QprYx@54Keh0)lMjRhGHk(Gq`52_>e-p{GLgX-$^J(bbF3P?w}-ZO_c;eg zc0Ijf7W)NbVbK27T_W>t8IUdlMlfG{dJq<7)1QhuLTE>k zb=i0X^^7dHV-~8wGrDf~C80U-&kY$r7><9q;Nd=pe*UB^p$6En4x`?wcp=!w*?>lS zkj3!l?$zXm8awaP?oC*bSOTodeI^i;??Z`L^Ow-R3JXy8K9#A8K%Ylxsk%9GpA@LA zI!0gFQ&t%IC4gZ@)*KgeOwuLvnFy+>8M&1iEsPqd8BSkuSyV6cRjAGRM^AX5n2-G) z;^0s|U>d?v=RHGqi}JoPzM>)yIV5rl%!nJ3;#Ds)w`nLD19~#kKjGs=o^jUljNXG2 z#r!tv`f&G#fxE$F2Naig4#}n>u>0S(CY!~fH`mhc959FSA~s3gg%OLR0AXi!FmRIQ zFu7?O%FE0wxSl}Wh5s$YDy;&@NUcA_2FzjqI;uF#x~d1F{R7Z(R|T4w_(e#14uwHY zk%xc*JDNI1CZ06aqf3P5^c|2GUzWp)x5an?K)?uSn}wbsC9qolxHOGi+=tn2uB}Im zn;xdb+>@!Riq*HUP95C*7xWJ@Y+M=+k-;Ha`q@(#$tZFwusOfiI8Rrgopq_MLT52BxKD%mvgo8VeMAzGLB%-!7*Lh}8~cRzoL9hW*8{8v-> zz6ZM9BZUjg-~`1k$T*R`*0Wmfh%c5LqPNE5wkG|8-22L%3n18eZ(xx1LJH2pLSl_0 z&>}A&Q?7l@qq5gQeG9Qw;L3cEc5rC!68&&E{>nL#&FHrfJeUJ1g&!9>1&$%4)_)U* z>vo2s!ib_VV!NL?wRTrvDqBi0@Y5FI=A9P}s#%^f2QeO{Y^$s}=EznG+g(!Nl$2O1 zMCo`M=x_&s7GlfI7KX-9Q?K^(+zwF4S7XL8Z|yA=4%ZVXx*1Y0dwUGA#EWQ9Scm{+ zG9|KX&ZrB=cF$(Tb;pL!5dn9loN<5-ymcuHh4RKy30Sk3;&op6D@wbK&5R6bMs^~D zHZOS=uz_`Xp)b`Y&B`>k3qo&|X%w-azGi&-x_I_s&85*;cwuPbY6ty^eB8MUfN7X4 zxh99e*lMZJ3$2uFt(H}~S>{e(%B{I1UJfFbZV1jMBh$m|1O#~%n8{;_V^wF>%~gd% z1h|tr>xN5T)V*(B-1~_6b$k7*zt_I2=$>OkeNPS6iFDu~u_Y!D&7Z}buXz=}iJUOq zAgc;AE%Ffl;vQ~(Pv7xTt|L~zP%i6Rovz)>CmZ}Gs`(ON@g7Qtqw|9o(@-0WU<`Ff zSPXF@SNm&vqmxOt?};#41HjPhN0v}Xx=HdMGmAF3rV-KC6>lSRM2<{gFZ8h ziD72TX{9{C>2rd(+d`UEA|G?CHkZ_Ghb0e)6Upoj3Z`2Fxlush`lm`;q73d%$z~aZ zsm*rnk|!5#-_1wkSJ%VK2OH>jQs-5tAVhy`oK_^gd7$jUe z!zTL{0~vMhkbH|Qn}9}1WN?_4^^dC1lE{ucjA+{!+jrR2>UMNSop2wo`Ub8b#oRut zk!$Z<_7}e1J46dvS;gvnAO0Jlqg-8x>x05K%KxBn*2(|7bGgQ74FHvY!Y{9LsLFpI zL;sBgtJy#!vRkxxgcxnC_z`}HNbZ(I(Y0wseC^NFhDd)S*E~d8QnD3SOQNT$R<{Sv z%jLk!s)zb5Mm|xz)tbdwA35Q)R}pA@`}tS%?XHU=6C z9dM?}k6^JRD-XU=jx&&d3z|=bkVH;$An5_%8J05{Fh~_6CEx@fQqJd_DvG&TY`5#q zpDnTf$ReCQ29BxrX{iUd&}i=uRhgzd^re50DV>?4K-Bm9y@ZJSII?vf zLYeJ{K-Up2d^A}8330gZ0NNIe7(2*|>8qm1uuk=Rc9BqC-V(zZ_V@z&&$+uZo#JFZ zY&5Bu2#?budG}FE(RF+2$HGUz{63eDYhTuw#D~|q=>DFD9$h9vHni${m`h{z=^znwS!oxv z;^C(}kB9#d!!!ni!KbCPVd3dPxpSGZRPlwO1Y+xJiQAb+&tHBG^~Z6{FSd^udI-kp z!BX@X8TPgQxZIO_Me`l4*$R9#7?hu^1Q9uCg~n^HoIkEa!&Wqf;u@+uI_10{vk)k- zKK0Z`h%_)?RSrnPx=eKU;ydZ*kJU(?{9a){!F&}c$5ay3RML@3dBgh?v3S%J18ck& zBNKrP^c@GcElrf;#WExH(dRc?HutHkp6L#-33xVt!fzJ5jz7^hcS9Wd+x?hRyvFy~ z5ZX-!#WhrFVVdgN&McVKDC{P}y+|PA5VhCG@={~L?xyN$tVd2Evg3~o%%!cQsyI)xWHkuyb z5cPQ5F z@JTKJKZ!`onIn1Mc)ZZ6_GU|e3Z#@7yhuNgG~4FP4WOcR!`52wnY95=-^rS+9T|s zKaiY#)8{u0_AE#4X#!k~{Bf1@fV&q3|3AO(7GTS*5MIac5^HYJsmob6rVxxr{OS08-4OWX`wB4>MEx3!nYv4!kI{PhlJEif zX&~lbhp_2jVEn)UXSsZi;qlcwlNI0wncA;yI-jxs585)QGNi29u1~wb98YV#{c&&c z1S&dq$)HXbIL7#b4a;kS*8`lbAHT4${sI^i(kTl$7V~b~vEQ1UN%6cj*~S-d`=@&j z^QPz@P;GoGAU88Od&whyz4U@RLn25+eQ6ec;0@ z!}GVkT?zir^S>a0c?L)jjR@u8;y~yTc4G{o$*sUB^_aFE*S!-^`A_Qpp9cO15`~@J zK^42d0v-rvdN{r1F-Z)nJVU_()%Rs^==5{+C&bHLSSS?tl4ze40O!7&aN^qCQF8k< z+31gX4wFv2R;-w!tZ2e#fB)-5xSi4d2DYhHcdpYyO7(2c%4d=Qdx#J{h>!paGXSmW z4E(_#*ji8%JZu1eLU%ZZ+BO)uBr4Lgx+{7h+~ZBT$FpNH`n4JBk8S+y5GITTJ4hGz z_VzGDlGBgmZK77;+JTbnKxx&^Zid4IZ}_WSTZ73+^k3fcu=xDW=0oXuiWhgCiM$Ps zmfpmvUahFJV34J3ZcAT!iEJf_Z4TkO(jKY#E)j`j)68J)CAGxiKbwTA?E4Jzot>A$ zDZeQ++5{&jcx7K1*vtvCh1=r>{iuQ#ys}Tp8IVJ=v?cFvJq^KLQ}@{&o)lacvaYY{ zpBRN5T>Lg+#kq;sYL||-`mavBxpDY`1UM9IkLPxMOKP_v!*NFXd4Haz_?%3t3Jb?v z*RWgcre2y3Z)3{njkqT%SoieEx{KD|s3EaL3LbJ$fE2mhx!JhsoVX~3iO%00_*~_e zdVTIj&Su+VwH$4jW2#EylW~!D;T(DKp@l$COF!YNGOWJ5Xi>9#Ho4TP=usK)94hts z)<#}AuDU&Mxj3W7AFd`k zqgHXzf=g>iZOxG`sbv%$cX2(IGb$vds)J@xix%gecFYVjwYoudj9uju^ZoI+_{)=S$Y2wW^p9(P6kFrURmu16 z^U!637IY&)u|YU%nqqb?;Holzso0ZxV~MjKii!`U)D;&&9uqF4nR_YH5`%+ou_6~L zI@g|YyqZF>{>XoImua`dwD~Ub<(2)HY;jycE4R7%-;Ho-1(eD;=C~1M9%^L{>Aca> zsPf%r2%emSdk~kq@AyHm!Nxh6j5j(OHQVjUJXxV)tq);k5yS*cAVr}VdltA_(~|%x z?4VOC^z#Eu+430eLfw&@jB|3&XkBLXbD-6!i0ou)knmtwW)*cZb=Slq>!pF2cQf5W zFI7l}W!_vaZ3MsmVE%3<)U5GktX$>|VNIBhp^}OUP3}QnJ8asn$Ix`<(zC)Ug>g~Z zS8F7hRftG0rX1+Cf|STeQ?uFJ+?QD^nJSkDQzDb}r?niPIlfB?eK!;N+^0uA_15uY zUQ3J}b$}#@*qL5Cy46Ee6SzgR;SoewL_Y3E;e)$Bj5g`El5Vk?(;xwmrQz!h!O){1 zFc5Nv_XbKGd#O~VAaF=+%gG1Tn`}SaSQO;2^L_Q#P5a?je<4M`iq=T%?U|e$U6QXM ze{Z$@eA5%$ATAKlOUisxBhX3s?}?Q<^Z%_w*Bup0: alla banor startar med denna seed (tester/skärmdumpar) scene Scene next Scene @@ -46,6 +48,8 @@ type Options struct { 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) + Phone bool // kortet i telefonen från start + CardYen int // >=0: kortets startsaldo (för tester/skärmdumpar), -1 = standard } // New laddar resurser och bygger spelet. @@ -60,13 +64,18 @@ func New(opt Options) (*Game, error) { } g.Know.Points = opt.Points g.fixedSeed = opt.Seed + g.Wallet = sim.NewWallet() + g.Wallet.Phone = opt.Phone + if opt.CardYen >= 0 { + g.Wallet.Card = opt.CardYen + } 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, g.seed()) + s, err := NewLevelScene(a, opt.LevelID, g.Know, g.Wallet, g.seed()) if err != nil { return nil, err } diff --git a/internal/game/input.go b/internal/game/input.go index 5f11924..d8e0a45 100644 --- a/internal/game/input.go +++ b/internal/game/input.go @@ -81,6 +81,40 @@ func wordsJustPressed() bool { return virtual.pressed["l"] || inpututil.IsKeyJustPressed(ebiten.KeyL) || gamepadJustPressed(ebiten.StandardGamepadButtonLeftRight) } +// miniMove: -1/+1 vid just-tryck på pil/WASD (upp/vänster = -1, ner/höger = +1). +func miniMove() int { + switch { + case virtual.pressed["up"] || virtual.pressed["left"] || inpututil.IsKeyJustPressed(ebiten.KeyArrowUp) || inpututil.IsKeyJustPressed(ebiten.KeyArrowLeft) || + inpututil.IsKeyJustPressed(ebiten.KeyW) || inpututil.IsKeyJustPressed(ebiten.KeyA) || + gamepadJustPressed(ebiten.StandardGamepadButtonLeftTop) || gamepadJustPressed(ebiten.StandardGamepadButtonLeftLeft): + return -1 + case virtual.pressed["down"] || virtual.pressed["right"] || inpututil.IsKeyJustPressed(ebiten.KeyArrowDown) || inpututil.IsKeyJustPressed(ebiten.KeyArrowRight) || + inpututil.IsKeyJustPressed(ebiten.KeyS) || inpututil.IsKeyJustPressed(ebiten.KeyD) || + gamepadJustPressed(ebiten.StandardGamepadButtonLeftBottom) || gamepadJustPressed(ebiten.StandardGamepadButtonLeftRight): + return 1 + } + return 0 +} + +// confirmHeld: Enter/mellanslag eller A hålls nere (sedelinmatning). +func confirmHeld() bool { + if virtual.pressed["enter"] || virtual.holdEnter { + return true + } + if ebiten.IsKeyPressed(ebiten.KeyEnter) || ebiten.IsKeyPressed(ebiten.KeySpace) { + return true + } + for _, id := range ebiten.AppendGamepadIDs(nil) { + if ebiten.IsStandardGamepadLayoutAvailable(id) && ebiten.IsStandardGamepadButtonPressed(id, ebiten.StandardGamepadButtonRightBottom) { + return true + } + } + return false +} + +// phoneJustPressed: P = kortet i telefonen av/på (meny). +func phoneJustPressed() bool { return virtual.pressed["p"] || inpututil.IsKeyJustPressed(ebiten.KeyP) } + // mapJustPressed: M eller gamepadens vänstra mittknapp (Back/Select) = minikartan av/på. func mapJustPressed() bool { return virtual.pressed["m"] || inpututil.IsKeyJustPressed(ebiten.KeyM) || gamepadJustPressed(ebiten.StandardGamepadButtonCenterLeft) diff --git a/internal/game/minigame_view.go b/internal/game/minigame_view.go new file mode 100644 index 0000000..0bd536a --- /dev/null +++ b/internal/game/minigame_view.go @@ -0,0 +1,156 @@ +package game + +import ( + "fmt" + "image" + "image/color" + "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/minigame" +) + +// Minispelen ritas som en panel över banan. Logiken bor i internal/minigame. + +func (s *LevelScene) drawMinigame(g *Game, screen *ebiten.Image) { + a := g.Assets + r := s.run + panel := image.Rect(12, 28, ScreenW-12, ScreenH-10) + vector.DrawFilledRect(screen, float32(panel.Min.X), float32(panel.Min.Y), float32(panel.Dx()), float32(panel.Dy()), colPanel, false) + vector.DrawFilledRect(screen, float32(panel.Min.X), float32(panel.Min.Y), float32(panel.Dx()), 3, colKnown, false) + switch m := r.Mini.(type) { + case *minigame.TopUp: + s.drawTopUp(a, screen, m, panel) + case *minigame.Ticket: + s.drawTicket(a, screen, m, panel) + case *minigame.Crowd: + s.drawCrowd(a, screen, m, panel) + case *minigame.Ride: + s.drawRide(a, screen, m, panel) + } +} + +// jp ritar japansk text sedd genom spelarens kunskap (kända ord i gult). +func (s *LevelScene) jp(a *Assets, screen *ebiten.Image, text string, x, y int) { + rd := lang.Render(a.Dict, s.run.Know, text, UILang) + a.drawLines(screen, []line{shownLine(rd.Original, colText, false)}, x, y) +} + +func (s *LevelScene) drawTopUp(a *Assets, screen *ebiten.Image, m *minigame.TopUp, p image.Rectangle) { + x, y := p.Min.X+8, p.Min.Y+8 + a.DrawBig(screen, "チャージ", x, y, colKnown) + a.Draw(screen, a.T("mini.topup.title"), x+60, y+2, colText) + y += 20 + switch m.Stage { + case minigame.TopUpPickButton: + a.Draw(screen, a.T("mini.topup.pick"), x, y, colDim) + y += LineH + 4 + for i, b := range m.Buttons { + bx, by := x+(i%2)*140, y+(i/2)*26 + col := colBar + if i == m.Cursor { + col = color.RGBA{90, 105, 136, 255} + } + vector.DrawFilledRect(screen, float32(bx), float32(by), 132, 22, col, false) + s.jp(a, screen, b, bx+6, by+5) + } + if m.Penalty > 0 { + a.Draw(screen, "ピッ! "+a.T("mini.topup.wrong"), x, y+56, colBad) + } + case minigame.TopUpPickAmount: + a.Draw(screen, a.T("mini.topup.amount"), x, y, colDim) + y += LineH + 4 + for i, amt := range m.Amounts { + col := colText + if i == m.Cursor { + vector.DrawFilledRect(screen, float32(x-2), float32(y+i*LineH-1), 120, LineH, colBar, false) + col = colKnown + } + a.Draw(screen, fmt.Sprintf("%d円 (%d¥)", amt, amt), x, y+i*LineH, col) + } + case minigame.TopUpFeed: + a.Draw(screen, fmt.Sprintf(a.T("mini.topup.feed"), m.Amount), x, y, colText) + y += LineH + 8 + vector.DrawFilledRect(screen, float32(x), float32(y), float32(p.Dx()-16), 8, colBar, false) + vector.DrawFilledRect(screen, float32(x), float32(y), float32(float64(p.Dx()-16)*m.Fill), 8, colGood, false) + } + a.Draw(screen, a.T("mini.cancel"), x, p.Max.Y-16, colDim) +} + +func (s *LevelScene) drawTicket(a *Assets, screen *ebiten.Image, m *minigame.Ticket, p image.Rectangle) { + x, y := p.Min.X+8, p.Min.Y+8 + a.DrawBig(screen, "きっぷ", x, y, colKnown) + a.Draw(screen, a.T("mini.ticket.title"), x+48, y+2, colText) + y += 20 + a.Draw(screen, fmt.Sprintf(a.T("mini.ticket.hint"), s.run.Level.Destination.Get("romaji"), m.Cash), x, y, colDim) + y += LineH + 4 + for i, o := range m.Options { + ry := y + i*LineH + col := colText + if i == m.Cursor { + vector.DrawFilledRect(screen, float32(x-2), float32(ry-1), float32(p.Dx()-12), LineH, colBar, false) + } + if o.Fare > m.Cash { + col = colDim + } + s.jp(a, screen, o.Dest, x, ry) + fare := fmt.Sprintf("%d円", o.Fare) + a.Draw(screen, fare, p.Max.X-10-a.Width(fare), ry, col) + } + a.Draw(screen, a.T("mini.cancel"), x, p.Max.Y-16, colDim) +} + +func (s *LevelScene) drawCrowd(a *Assets, screen *ebiten.Image, m *minigame.Crowd, p image.Rectangle) { + x, y := p.Min.X+8, p.Min.Y+8 + a.DrawBig(screen, "満員", x, y, colBad) + a.Draw(screen, a.T("mini.crowd.title"), x+36, y+2, colText) + y += 24 + a.Draw(screen, fmt.Sprintf(a.T("mini.crowd.hint"), m.MaxTries-m.Attempts), x, y, colDim) + y += LineH + 10 + w := float32(p.Dx() - 16) + vector.DrawFilledRect(screen, float32(x), float32(y), w, 14, colBar, false) + vector.DrawFilledRect(screen, float32(x)+w*float32(m.ZoneLo), float32(y), w*float32(m.ZoneHi-m.ZoneLo), 14, colGood, false) + vector.DrawFilledRect(screen, float32(x)+w*float32(m.Pos)-1, float32(y)-3, 3, 20, colText, false) +} + +func (s *LevelScene) drawRide(a *Assets, screen *ebiten.Image, m *minigame.Ride, p image.Rectangle) { + x, y := p.Min.X+8, p.Min.Y+8 + a.DrawBig(screen, "次は", x, y, colDim) + a.Draw(screen, a.T("mini.ride.title"), x+36, y+2, colText) + y += 22 + cur := m.Current() + a.DrawBig(screen, cur, x, y, colText) + rd := lang.Render(a.Dict, s.run.Know, cur, UILang) + a.drawLines(screen, []line{shownLine(rd.Partial, colText, false)}, x+a.Width(cur)*12/10+12, y+2) + lvl := s.run.Level + if lang.ShowEnglish(lvl.ID, m.Index, 77, lvl.Difficulty) { + if e := a.Dict.Lookup(cur); e != nil { + a.Draw(screen, e.Romaji, x, y+16, colEnglish) + } + } + y += 34 + // Linjen: en prick per station, den aktuella större. + for i := range m.Stops { + cx := x + 6 + i*22 + col := colDim + if i == m.Index { + col = colText + } + if i < m.Index { + col = colBar + } + vector.DrawFilledRect(screen, float32(cx), float32(y+3), 14, 2, colBar, false) + vector.DrawFilledRect(screen, float32(cx-3), float32(y), 6, 8, col, false) + } + y += 14 + vector.DrawFilledRect(screen, float32(x), float32(y), float32(p.Dx()-16), 3, colBar, false) + vector.DrawFilledRect(screen, float32(x), float32(y), float32(float64(p.Dx()-16)*(1-m.Timer/m.StopSec)), 3, colKnown, false) + hint := a.T("mini.ride.hint") + if dest := lvl.Destination.Get("romaji"); dest != "" { + hint = strings.Replace(hint, "%s", dest, 1) + } + a.Draw(screen, hint, x, p.Max.Y-16, colGood) +} diff --git a/internal/game/scene_level.go b/internal/game/scene_level.go index 3de34b1..69c94eb 100644 --- a/internal/game/scene_level.go +++ b/internal/game/scene_level.go @@ -13,6 +13,7 @@ import ( "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/lang" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/minigame" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/sim" ) @@ -22,6 +23,7 @@ const ( deniedShowSec = 2.0 learnedShowSec = 3.0 progressedShowSec = 2.5 + flashShowSec = 2.5 ) // LevelScene är själva spelandet av en bana. All spellogik ligger i sim.Run; @@ -36,14 +38,14 @@ type LevelScene struct { // NewLevelScene laddar banan och ställer spelaren på startrutan. know är // 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) { +func NewLevelScene(a *Assets, id string, know *lang.Knowledge, wallet *sim.Wallet, 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, sim.RunOptions{Dict: a.Dict, Know: know, Seed: seed}), + run: sim.NewRun(lvl, sim.RunOptions{Dict: a.Dict, Know: know, Wallet: wallet, Seed: seed}), cam: sim.NewCamera(ScreenW, ScreenH, float64(lvl.Width()*TileSize), float64(lvl.Height()*TileSize)), } s.followPlayer() @@ -62,12 +64,27 @@ func (s *LevelScene) TrainHere() bool { return tr != nil && at } +// RideAtDest rapporterar om tågresan står vid resmålet (skriptläget). Utan +// pågående resa: true, så att skriptet inte hänger. +func (s *LevelScene) RideAtDest() bool { + g, ok := s.run.Mini.(*minigame.Ride) + return !ok || g.Index == g.Dest +} + func (s *LevelScene) followPlayer() { x, y := s.run.Player.WorldPos(TileSize) s.cam.Follow(x+TileSize/2, y+TileSize/2) } func (s *LevelScene) Update(g *Game) error { + if s.run.Mini != nil { + // Minispel: all input går dit; Esc avbryter minispelet, inte banan. + s.run.StepMini(dt, minigame.Input{Move: miniMove(), Confirm: confirmJustPressed(), Hold: confirmHeld(), Cancel: backJustPressed()}) + if s.run.Outcome != sim.Ongoing { + g.SetScene(NewResultScene(s)) + } + return nil + } if backJustPressed() { m, err := NewMenuScene(g.Assets) if err != nil { @@ -172,6 +189,9 @@ func (s *LevelScene) Draw(g *Game, screen *ebiten.Image) { s.drawUrge(g, screen, s.run.Party.Members[0], int(ox+math.Round(px)), int(oy+math.Round(py))) s.drawHUD(g, screen) + if s.run.Mini != nil { + s.drawMinigame(g, screen) + } } // memberTints färgar följarnas sprites tills de har egna. @@ -217,14 +237,24 @@ func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) { if r.Know.ShowsDestinationJP() { // hint från nivå 1: resmålet på japanska, att matcha mot skyltarna dest += " " + r.Level.Destination.Get("ja") } - 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", 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) + name := r.Level.Name.Get(UILang) + a.Draw(screen, name, 4, 0, colText) + destX := 4 + a.Width(name) + 12 + a.Draw(screen, a.T("hud.destination")+": "+dest, destX, 0, colKnown) + a.Draw(screen, fmt.Sprintf("%s Lv%d·%d", a.T("hud.japanese"), r.Know.Level(), r.Know.Count()), + destX+a.Width(a.T("hud.destination")+": "+dest)+12, 0, colDim) + wallet := fmt.Sprintf("%s %3.0fs %s %d¥ %s %d¥", a.T("hud.time"), r.Time, a.T("hud.card"), r.Wallet.Card, a.T("hud.cash"), r.Wallet.Cash) + if r.Wallet.Phone { + wallet += fmt.Sprintf(" %s %.0f%%", a.T("hud.phone"), r.Wallet.Battery) + } + if r.Wallet.Ticket != "" { + wallet += " " + a.T("hud.ticket") + " " + r.Wallet.Ticket + } + a.Draw(screen, wallet, 4, LineH, colDim) s.drawMeters(g, screen) - if r.Outcome != sim.Ongoing { - return // resultatpanelen tar över; ingen inforuta eller minikarta + if r.Outcome != sim.Ongoing || r.Mini != nil { + return // resultatpanelen eller minispelet tar över; ingen inforuta eller minikarta } lines, accent, bar := s.infoLines(a) if entry := a.Dict.Lookup(r.Learned); entry != nil && r.Time-r.LearnedAt < learnedShowSec { @@ -241,6 +271,13 @@ func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) { } lines = append(lines, a.wrapLine(plainLine(strings.Join(parts, " "), colWarn), ScreenW-8)...) } + if r.Flashing(flashShowSec) { + col := colBad + if r.FlashKey == sim.FlashRescan { + col = colWarn + } + lines = append(lines, a.wrapLine(plainLine(a.T(r.FlashKey), col), ScreenW-8)...) + } // Inforutans läge: nederkant, men flyttas upp under HUD:en om spelaren // (eller tåget under hen) annars skulle hamna bakom den. @@ -344,9 +381,21 @@ func (s *LevelScene) infoLines(a *Assets) (lines []line, accent color.Color, bar 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 + case level.TicketMachine: + if lvl.TicketRequired { + return []line{plainLine(fmt.Sprintf(a.T("hud.machine_ticket"), r.Wallet.Cash), colGood)}, colGood, false + } + return []line{plainLine(fmt.Sprintf(a.T("hud.machine_topup"), r.Wallet.Card, r.Wallet.Cash), colGood)}, colGood, false } if r.DeniedAt >= 0 && r.Time-r.DeniedAt < deniedShowSec { - return []line{plainLine(a.T("hud.gate_denied"), colBad)}, colBad, false + key := "hud.gate_denied" + switch { + case lvl.TicketRequired: + key = sim.FlashNoTicket + case r.Wallet.Phone && r.Wallet.Battery <= 0: + key = "hud.phone_dead" + } + return []line{plainLine(a.T(key), colBad)}, colBad, false } return nil, accent, false } diff --git a/internal/game/scene_menu.go b/internal/game/scene_menu.go index 8783884..2ccc106 100644 --- a/internal/game/scene_menu.go +++ b/internal/game/scene_menu.go @@ -58,10 +58,13 @@ func (m *MenuScene) Update(g *Game) error { g.SetScene(NewWordsScene(g.Assets, m)) return nil } + if phoneJustPressed() { + g.Wallet.Phone = !g.Wallet.Phone + } 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, g.seed()) + s, err := NewLevelScene(g.Assets, m.entries[m.sel].id, g.Know, g.Wallet, g.seed()) if err != nil { m.err = err return nil @@ -91,8 +94,12 @@ 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 %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) + onoff := a.T("menu.off") + if g.Wallet.Phone { + onoff = a.T("menu.on") + } + a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s %s %d %s %d¥ %s %d¥ %s", a.T("hud.japanese"), g.Know.Level(), g.Know.Count(), a.T("hud.words"), + a.T("words.points"), g.Know.Points, a.T("hud.card"), g.Wallet.Card, a.T("hud.cash"), g.Wallet.Cash, fmt.Sprintf(a.T("menu.phone"), onoff)), 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 ac60c71..e170d92 100644 --- a/internal/game/scene_result.go +++ b/internal/game/scene_result.go @@ -23,7 +23,7 @@ func (r *ResultScene) Update(g *Game) error { case wordsJustPressed(): g.SetScene(NewWordsScene(g.Assets, r)) case inpututil_R(): - s, err := NewLevelScene(g.Assets, r.from.id, g.Know, g.seed()) + s, err := NewLevelScene(g.Assets, r.from.id, g.Know, g.Wallet, g.seed()) if err != nil { return err } @@ -44,7 +44,7 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { a := g.Assets vector.DrawFilledRect(screen, 20, 36, ScreenW-40, 120, colPanel, false) - accent, headline := colBad, a.T("level.wrong_train") + accent, headline := colBad, a.T("level.lost") if run.Outcome == sim.Won { accent, headline = colGood, a.T("level.cleared") } @@ -63,8 +63,11 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { a.Draw(screen, fmt.Sprintf("%s %s %s → %s", a.T("hud.track"), tr.Track, tr.Line.Get("romaji"), tr.Destination.Get("romaji")), 28, y, colDim) y += LineH if run.Outcome == sim.Lost { - for _, l := range a.wrapLine(plainLine(fmt.Sprintf(a.T("result.wrong_detail"), tr.Destination.Get("romaji"), - run.Level.Destination.Get("romaji")), colText), ScreenW-56) { + reason := a.T(run.LostReason) + if run.LostReason == sim.LostWrongTrain { + reason = fmt.Sprintf(a.T("result.wrong_detail"), tr.Destination.Get("romaji"), run.Level.Destination.Get("romaji")) + } + for _, l := range a.wrapLine(plainLine(reason, colText), ScreenW-56) { a.drawLines(screen, []line{l}, 28, y) y += LineH } @@ -74,8 +77,8 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) { a.Draw(screen, fmt.Sprintf("%s %.1fs (%s %.0fs) %s %d %s %.0f %%", a.T("hud.time"), run.Time, a.T("result.par"), run.ParSec(), a.T("hud.steps"), run.Steps, a.T("result.explored"), 100*run.Fog.Explored(run.Level)), 28, y, colText) y += LineH - a.Draw(screen, fmt.Sprintf("%s %d %s %d¥ %s %d", a.T("result.gates"), run.GatePasses, a.T("result.card"), run.Card.Balance, - a.T("result.served"), run.Served), 28, y, colText) + a.Draw(screen, fmt.Sprintf("%s %d %s %d¥ %s %d¥ %s %d %s %d", a.T("result.gates"), run.GatePasses, a.T("result.card"), run.Wallet.Card, + a.T("result.spent"), run.Wallet.Spent, a.T("result.missed"), run.MissedTrains, a.T("result.served"), run.Served), 28, y, colText) y += LineH if run.Outcome == sim.Won { msg := fmt.Sprintf("+%d %s", run.PointsEarned, a.T("words.points")) diff --git a/internal/game/script.go b/internal/game/script.go index 69f603a..864b551 100644 --- a/internal/game/script.go +++ b/internal/game/script.go @@ -19,7 +19,9 @@ import ( // Stegen skiljs med ';': // // wait N vänta N bildrutor +// hold N håll Enter nere N bildrutor (sedelinmatning) // waittrain vänta tills tåget vid perrongen spelaren står på är inne +// waitstop vänta tills tågresan står vid resmålet // 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) @@ -51,8 +53,9 @@ type script struct { // virtual är den simulerade inputen som input.go läser före riktig input. var virtual struct { - held sim.Dir - pressed map[string]bool + held sim.Dir + pressed map[string]bool + holdEnter bool } func parseScript(src string) (*script, error) { @@ -64,9 +67,9 @@ func parseScript(src string) (*script, error) { } st := scriptStep{cmd: f[0]} switch f[0] { - case "wait": + case "wait", "hold": if len(f) != 2 { - return nil, fmt.Errorf("script: 'wait N'") + return nil, fmt.Errorf("script: '%s N'", f[0]) } st.n, _ = strconv.Atoi(f[1]) case "press": @@ -88,7 +91,7 @@ func parseScript(src string) (*script, error) { return nil, fmt.Errorf("script: 'shot PATH'") } st.arg = f[1] - case "quit", "waittrain": + case "quit", "waittrain", "waitstop": default: return nil, fmt.Errorf("script: okänt kommando %q", f[0]) } @@ -118,13 +121,17 @@ type playerTiler interface { } // trainWaiter implementeras av scener där man kan vänta på ett tåg. -type trainWaiter interface{ TrainHere() bool } +type trainWaiter interface { + TrainHere() bool + RideAtDest() bool +} // tick körs i början av varje Update. frame är senast ritade bild. // Returnerar ebiten.Termination när skriptet vill avsluta. func (s *script) tick(g *Game, frame *ebiten.Image) error { virtual.held = sim.None virtual.pressed = map[string]bool{} + virtual.holdEnter = false if s.i >= len(s.steps) { return nil } @@ -135,6 +142,12 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error { if s.counter >= st.n { s.advance() } + case "hold": + virtual.holdEnter = true + s.counter++ + if s.counter >= st.n { + s.advance() + } case "press": virtual.pressed[st.arg] = true s.advance() @@ -174,6 +187,10 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error { if tw, ok := g.scene.(trainWaiter); !ok || tw.TrainHere() { s.advance() } + case "waitstop": + if tw, ok := g.scene.(trainWaiter); !ok || tw.RideAtDest() { + s.advance() + } case "shot": if err := saveShot(frame, st.arg); err != nil { return err diff --git a/internal/lang/dictionary.go b/internal/lang/dictionary.go index 9bb87ca..914cadf 100644 --- a/internal/lang/dictionary.go +++ b/internal/lang/dictionary.go @@ -19,6 +19,7 @@ type Entry struct { En string `json:"en"` Sv string `json:"sv"` Tier int `json:"tier"` + Kind string `json:"kind"` // valfri kategori, t.ex. "station" } // Translation returnerar översättningen på UI-språket (sv/en) med fallback. @@ -91,6 +92,18 @@ func (d *Dictionary) Len() int { return len(d.entries) } // Words returnerar alla ord, längsta först. func (d *Dictionary) Words() []string { return append([]string(nil), d.words...) } +// OfKind returnerar orden i en kategori (t.ex. "station"), sorterade. +func (d *Dictionary) OfKind(kind string) []string { + var out []string + for _, w := range d.words { + if d.entries[w].Kind == kind { + out = append(out, w) + } + } + sort.Strings(out) + return out +} + // IsKana rapporterar om tecknet är hiragana eller katakana (inkl. ー). func IsKana(r rune) bool { return unicode.Is(unicode.Hiragana, r) || unicode.Is(unicode.Katakana, r) || r == 'ー' diff --git a/internal/lang/lang_test.go b/internal/lang/lang_test.go index 6488924..28d3f1c 100644 --- a/internal/lang/lang_test.go +++ b/internal/lang/lang_test.go @@ -248,3 +248,15 @@ func TestBuyWordsWithPoints(t *testing.T) { t.Fatal("negativa stjärnor ger inget") } } + +func TestOfKind(t *testing.T) { + d := testDict() + d.Add("池袋", Entry{Kana: "いけぶくろ", Romaji: "Ikebukuro", En: "Ikebukuro", Sv: "Ikebukuro", Tier: 3, Kind: "station"}) + d.Add("品川", Entry{Kana: "しながわ", Romaji: "Shinagawa", En: "Shinagawa", Sv: "Shinagawa", Tier: 3, Kind: "station"}) + if got := strings.Join(d.OfKind("station"), ","); got != "品川,池袋" && got != "池袋,品川" { + t.Fatalf("OfKind = %q", got) + } + if len(d.OfKind("x")) != 0 { + t.Fatal("okänd kategori är tom") + } +} diff --git a/internal/level/level.go b/internal/level/level.go index ef3d8be..40bd318 100644 --- a/internal/level/level.go +++ b/internal/level/level.go @@ -72,6 +72,7 @@ const ( DefaultDwellSec = 10.0 DefaultFareYen = 200 MaxParty = 5 + DefaultRideStops = 3 ) // Status returnerar om tåget står vid perrongen vid tiden t, och hur många @@ -94,6 +95,7 @@ type Train struct { Line Text `json:"line"` // linjens namn Destination Text `json:"destination"` // slutstation Correct bool `json:"correct"` // tar spelaren till rätt resmål + Crowded bool `json:"crowded"` // fullt tåg: minispel för att få plats Schedule Schedule `json:"schedule"` } @@ -106,17 +108,19 @@ type SignText struct { // Level är en bana. type Level struct { - ID string `json:"id"` - Name Text `json:"name"` - 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"` - Signs []SignText `json:"signs"` + ID string `json:"id"` + Name Text `json:"name"` + 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) + TicketRequired bool `json:"ticketRequired"` // spärren kräver pappersbiljett (köps i automaten) i stället för kort + RideStops int `json:"rideStops"` // antal stationer på tågresan (0 = DefaultRideStops) + FareYen int `json:"fareYen"` // vad spärren drar från kortet (0 = standard) + Grid []string `json:"grid"` + Trains []Train `json:"trains"` + Signs []SignText `json:"signs"` } // Point är en rutkoordinat. @@ -240,6 +244,15 @@ func (l *Level) Validate() error { if l.Party == 0 { l.Party = 1 } + if l.RideStops == 0 { + l.RideStops = DefaultRideStops + } + if l.RideStops < 2 || l.RideStops > 8 { + return fmt.Errorf("level %s: rideStops måste vara 2–8", l.ID) + } + if l.TicketRequired && len(l.Find(TicketMachine)) == 0 { + return fmt.Errorf("level %s: biljettkrav utan biljettautomat (T)", l.ID) + } if l.Party > MaxParty { return fmt.Errorf("level %s: sällskapet får vara högst %d", l.ID, MaxParty) } diff --git a/internal/level/level_test.go b/internal/level/level_test.go index 6edb413..50a63fd 100644 --- a/internal/level/level_test.go +++ b/internal/level/level_test.go @@ -288,3 +288,21 @@ func TestPartyAndParDefaults(t *testing.T) { t.Fatal("W och K ska vara passerbara rutor") } } + +func TestTicketAndRideFields(t *testing.T) { + l := mustParse(t, sample) + if l.RideStops != DefaultRideStops || l.TicketRequired || l.Trains[0].Crowded { + t.Fatalf("standard: stops=%d ticket=%v crowded=%v", l.RideStops, l.TicketRequired, l.Trains[0].Crowded) + } + if _, err := Parse([]byte(strings.Replace(sample, `"difficulty": 1`, `"difficulty": 1, "ticketRequired": true`, 1))); err == nil { + t.Fatal("biljettkrav utan automat ska ge fel") + } + if _, err := Parse([]byte(strings.Replace(sample, `"difficulty": 1`, `"difficulty": 1, "rideStops": 1`, 1))); err == nil { + t.Fatal("för få stopp ska ge fel") + } + ok := strings.Replace(strings.Replace(sample, `"#S..#P#"`, `"#ST.#P#"`, 1), `"difficulty": 1`, `"difficulty": 1, "ticketRequired": true, "rideStops": 4`, 1) + l2 := mustParse(t, ok) + if !l2.TicketRequired || l2.RideStops != 4 { + t.Fatal("fälten ska läsas") + } +} diff --git a/internal/minigame/crowd.go b/internal/minigame/crowd.go new file mode 100644 index 0000000..88e65e2 --- /dev/null +++ b/internal/minigame/crowd.go @@ -0,0 +1,56 @@ +package minigame + +import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" + +// Crowd är "få plats på det fulla tåget": en markör pendlar över en stapel, +// tryck Enter när den är i den gröna zonen. Två försök, sedan går tåget. +type Crowd struct { + base + Pos float64 // markörens läge 0..1 + dir float64 + Speed float64 // enheter per sekund + ZoneLo float64 + ZoneHi float64 + Attempts int + MaxTries int +} + +const crowdZoneWidth = 0.22 + +// NewCrowd seedar zonens läge och markörens fart. +func NewCrowd(seed rng.Seed, tries int) *Crowd { + r := newRand(seed, "crowd") + lo := r.between(0.1, 0.9-crowdZoneWidth) + return &Crowd{dir: 1, Speed: r.between(0.9, 1.5), ZoneLo: lo, ZoneHi: lo + crowdZoneWidth, MaxTries: max(1, tries)} +} + +// InZone rapporterar om markören är i zonen just nu. +func (g *Crowd) InZone() bool { return g.Pos >= g.ZoneLo && g.Pos <= g.ZoneHi } + +// Update pendlar markören och tar emot försök. +func (g *Crowd) Update(in Input, dt float64) { + if g.done { + return + } + if in.Cancel { + g.done = true + return + } + g.Pos += g.dir * g.Speed * dt + for g.Pos < 0 || g.Pos > 1 { + if g.Pos < 0 { + g.Pos = -g.Pos + } else { + g.Pos = 2 - g.Pos + } + g.dir = -g.dir + } + if in.Confirm { + g.Attempts++ + if g.InZone() { + g.done, g.success = true, true + } else if g.Attempts >= g.MaxTries { + g.done = true + } + } +} diff --git a/internal/minigame/minigame.go b/internal/minigame/minigame.go new file mode 100644 index 0000000..a8d5ca5 --- /dev/null +++ b/internal/minigame/minigame.go @@ -0,0 +1,38 @@ +// Package minigame innehåller de små spelen i spelet: fylla på kortet vid +// automaten, köpa rätt biljett, få plats på ett fullt tåg och gå av på rätt +// station. Ren logik utan Ebitengine; all slump kommer från en seed så att +// ett minispel är exakt likadant varje gång för samma seed. +// +// Gemensamt mönster: skapa med en seed, mata Update med input varje +// bildruta, läs Done/Success när det är klart. Renderingen görs av +// internal/game per typ. +package minigame + +import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" + +// Input är vad spelaren gjorde den här bildrutan. +type Input struct { + Move int // -1 / +1 (upp/vänster resp. ner/höger), 0 = inget + Confirm bool // Enter tryckt (just nu) + Hold bool // Enter hålls nere + Cancel bool // Esc tryckt +} + +// Game är ett pågående minispel. +type Game interface { + Update(in Input, dt float64) + Done() bool + Success() bool +} + +// base är det gemensamma tillståndet. +type base struct { + done, success bool +} + +func (b *base) Done() bool { return b.done } +func (b *base) Success() bool { return b.success } + +func newRand(seed rng.Seed, context string) *randSrc { + return &randSrc{seed.Derive(context).New()} +} diff --git a/internal/minigame/minigame_test.go b/internal/minigame/minigame_test.go new file mode 100644 index 0000000..5cc41fe --- /dev/null +++ b/internal/minigame/minigame_test.go @@ -0,0 +1,206 @@ +package minigame + +import ( + "math" + "strings" + "testing" + + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" +) + +const frame = 1.0 / 60 + +func TestTopUpFlowAndDeterminism(t *testing.T) { + g := NewTopUp(rng.FromInt(1), 5000) + h := NewTopUp(rng.FromInt(1), 5000) + if strings.Join(g.Buttons, ",") != strings.Join(h.Buttons, ",") { + t.Fatal("samma seed ska ge samma knappordning") + } + if strings.Join(g.Buttons, ",") == strings.Join(NewTopUp(rng.FromInt(2), 5000).Buttons, ",") && + strings.Join(g.Buttons, ",") == strings.Join(NewTopUp(rng.FromInt(3), 5000).Buttons, ",") { + t.Fatal("olika seeds ska (nästan alltid) ge olika ordning") + } + // Fel knapp: straff och frysning. + wrong := 0 + for wrong = range g.Buttons { + if g.Buttons[wrong] != "チャージ" { + break + } + } + g.Cursor = wrong + g.Update(Input{Confirm: true}, frame) + if g.Mistakes != 1 || g.Penalty <= 0 || g.Stage != TopUpPickButton { + t.Fatalf("fel knapp: mistakes=%d penalty=%.1f stage=%v", g.Mistakes, g.Penalty, g.Stage) + } + for g.Penalty > 0 { + g.Update(Input{Move: 1}, frame) // ignoreras under straffet + } + // Rätt knapp -> belopp -> mata sedlar. + for g.Buttons[g.Cursor] != "チャージ" { + g.Update(Input{Move: 1}, frame) + } + g.Update(Input{Confirm: true}, frame) + if g.Stage != TopUpPickAmount { + t.Fatal("ska välja belopp nu") + } + g.Update(Input{Move: 1}, frame) + g.Update(Input{Confirm: true}, frame) + if g.Stage != TopUpFeed || g.Amount != 2000 { + t.Fatalf("stage=%v amount=%d", g.Stage, g.Amount) + } + for i := 0; i < 60 && !g.Done(); i++ { + g.Update(Input{Hold: true}, frame) + } + if g.Fill < 0.5 || g.Done() { + t.Fatalf("efter 1 s hållning: fill=%.2f done=%v", g.Fill, g.Done()) + } + g.Update(Input{}, 0.5) // släppt: rinner tillbaka + if g.Fill >= 0.8 { + t.Fatalf("släppt Enter ska tömma: fill=%.2f", g.Fill) + } + for i := 0; i < 600 && !g.Done(); i++ { + g.Update(Input{Hold: true}, frame) + } + if !g.Done() || !g.Success() || g.Amount != 2000 { + t.Fatalf("done=%v success=%v amount=%d", g.Done(), g.Success(), g.Amount) + } + // Kontanter begränsar beloppen; utan pengar är spelet över direkt. + if a := NewTopUp(rng.FromInt(1), 2500).Amounts; len(a) != 2 || a[1] != 2000 { + t.Fatalf("amounts med 2500 kr: %v", a) + } + if !NewTopUp(rng.FromInt(1), 500).Done() { + t.Fatal("utan råd ska automaten vara klar direkt") + } + // Esc avbryter utan köp. + c := NewTopUp(rng.FromInt(1), 5000) + c.Update(Input{Cancel: true}, frame) + if !c.Done() || c.Success() { + t.Fatal("avbrutet = klart utan framgång") + } +} + +func TestTicketBoardSeededAndAffordable(t *testing.T) { + g := NewTicket(rng.FromInt(4), "渋谷", []string{"東京", "上野", "新宿"}, 5000) + h := NewTicket(rng.FromInt(4), "渋谷", []string{"東京", "上野", "新宿"}, 5000) + if len(g.Options) != 4 { + t.Fatalf("%d alternativ", len(g.Options)) + } + for i := range g.Options { + if g.Options[i] != h.Options[i] { + t.Fatal("samma seed ska ge samma tavla") + } + if f := g.Options[i].Fare; f < 140 || f > 620 || f%10 != 0 { + t.Fatalf("taxa %d", f) + } + } + // Flytta till 渋谷 och köp. + for g.Options[g.Cursor].Dest != "渋谷" { + g.Update(Input{Move: 1}, frame) + } + g.Update(Input{Confirm: true}, frame) + if !g.Done() || !g.Success() || g.Chosen == nil || g.Chosen.Dest != "渋谷" { + t.Fatalf("köp: %+v", g.Chosen) + } + // Utan råd går det inte att köpa. + p := NewTicket(rng.FromInt(4), "渋谷", []string{"東京"}, 100) + p.Update(Input{Confirm: true}, frame) + if p.Done() { + t.Fatal("utan råd ska köpet inte gå igenom") + } + p.Update(Input{Cancel: true}, frame) + if !p.Done() || p.Success() { + t.Fatal("Esc avbryter") + } +} + +func TestCrowdZoneAndAttempts(t *testing.T) { + g := NewCrowd(rng.FromInt(7), 2) + if g.ZoneLo < 0.1 || g.ZoneHi > 0.9 || math.Abs((g.ZoneHi-g.ZoneLo)-crowdZoneWidth) > 1e-9 { + t.Fatalf("zon %.2f–%.2f", g.ZoneLo, g.ZoneHi) + } + // Vänta tills markören är utanför zonen och tryck: ett bommat försök. + for g.InZone() { + g.Update(Input{}, frame) + } + g.Update(Input{Confirm: true}, frame) + if g.Done() || g.Attempts != 1 { + t.Fatalf("done=%v attempts=%d", g.Done(), g.Attempts) + } + // Vänta in zonen och tryck: lyckas. + for i := 0; i < 600 && !g.InZone(); i++ { + g.Update(Input{}, frame) + } + g.Update(Input{Confirm: true}, frame) + if !g.Done() || !g.Success() { + t.Fatal("träff i zonen ska lyckas") + } + // Två bom = tåget går. + f := NewCrowd(rng.FromInt(7), 2) + for n := 0; n < 2; n++ { + for f.InZone() { + f.Update(Input{}, frame) + } + f.Update(Input{Confirm: true}, frame) + } + if !f.Done() || f.Success() { + t.Fatal("två bom ska misslyckas") + } + // Markören studsar och håller sig i 0..1. + b := NewCrowd(rng.FromInt(8), 1) + for i := 0; i < 600; i++ { + b.Update(Input{}, frame) + if b.Pos < 0 || b.Pos > 1 { + t.Fatalf("pos=%.2f", b.Pos) + } + } +} + +func TestRideStopsAndGettingOff(t *testing.T) { + fillers := []string{"東京", "上野", "新宿", "成田"} + g := NewRide(rng.FromInt(3), "渋谷", fillers, 4, true) + if len(g.Stops) != 4 || g.Dest < 1 || g.Stops[g.Dest] != "渋谷" { + t.Fatalf("stops=%v dest=%d", g.Stops, g.Dest) + } + h := NewRide(rng.FromInt(3), "渋谷", fillers, 4, true) + if strings.Join(g.Stops, ",") != strings.Join(h.Stops, ",") { + t.Fatal("samma seed = samma linje") + } + // Åk till resmålet och kliv av. + for g.Index != g.Dest { + g.Update(Input{}, frame) + } + g.Update(Input{Confirm: true}, frame) + if !g.Done() || !g.Success() || g.GotOff != g.Dest { + t.Fatal("kliva av på resmålet ska lyckas") + } + // Kliva av för tidigt. + e := NewRide(rng.FromInt(3), "渋谷", fillers, 4, true) + e.Update(Input{Confirm: true}, frame) + if !e.Done() || e.Success() || e.GotOff != 0 { + t.Fatal("fel station = misslyckat") + } + // Åka förbi. + m := NewRide(rng.FromInt(3), "渋谷", fillers, 4, true) + for i := 0; i < 60*20 && !m.Done(); i++ { + m.Update(Input{}, frame) + } + if !m.Done() || m.Success() || m.Index != 3 { + t.Fatalf("åka förbi: done=%v success=%v index=%d", m.Done(), m.Success(), m.Index) + } + // Fel tåg: resmålet finns inte på linjen, så det går aldrig att lyckas. + w := NewRide(rng.FromInt(3), "渋谷", fillers, 4, false) + if w.Dest != -1 || strings.Contains(strings.Join(w.Stops, ","), "渋谷") { + t.Fatalf("fel tåg: %v", w.Stops) + } + w.Update(Input{Confirm: true}, frame) + if w.Success() { + t.Fatal("på fel tåg kan man inte komma rätt") + } +} + +func TestRideWithoutFillersStillHasDestination(t *testing.T) { + g := NewRide(rng.FromInt(1), "渋谷", nil, 3, true) + if len(g.Stops) != 3 || g.Dest < 1 || g.Stops[g.Dest] != "渋谷" || g.Stops[0] != UnknownStop { + t.Fatalf("stops=%v dest=%d", g.Stops, g.Dest) + } +} diff --git a/internal/minigame/rand.go b/internal/minigame/rand.go new file mode 100644 index 0000000..2db5684 --- /dev/null +++ b/internal/minigame/rand.go @@ -0,0 +1,12 @@ +package minigame + +import "math/rand/v2" + +// randSrc är ett tunt lager över math/rand/v2 så att minispelen bara använder +// ett fåtal väldefinierade operationer (lätt att hålla deterministiska). +type randSrc struct{ r *rand.Rand } + +func (s *randSrc) intn(n int) int { return s.r.IntN(n) } +func (s *randSrc) float() float64 { return s.r.Float64() } +func (s *randSrc) between(lo, hi float64) float64 { return lo + (hi-lo)*s.r.Float64() } +func (s *randSrc) shuffle(n int, swap func(i, j int)) { s.r.Shuffle(n, swap) } diff --git a/internal/minigame/ride.go b/internal/minigame/ride.go new file mode 100644 index 0000000..6ccc209 --- /dev/null +++ b/internal/minigame/ride.go @@ -0,0 +1,70 @@ +package minigame + +import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" + +// Ride är tågresan: stationerna passerar en i taget med "次は …"-utrop; +// tryck Enter vid ditt resmål. Fel station eller att åka förbi är misslyckat. +type Ride struct { + base + Stops []string // stationsnamn på japanska i ordning + Dest int // index för resmålet, -1 om det inte finns på linjen (fel tåg) + Index int // aktuell station + Timer float64 // sekunder kvar vid aktuell station + StopSec float64 + GotOff int // index där spelaren klev av, -1 = inte än +} + +const rideStopSec = 2.5 + +// NewRide bygger linjen: fillers är andra stationsnamn (blandas), dest läggs +// på en seedad plats (aldrig först) om det är rätt tåg, annars utelämnas det. +func NewRide(seed rng.Seed, dest string, fillers []string, stops int, correctTrain bool) *Ride { + r := newRand(seed, "ride") + f := append([]string(nil), fillers...) + r.shuffle(len(f), func(i, j int) { f[i], f[j] = f[j], f[i] }) + stops = max(2, stops) + g := &Ride{StopSec: rideStopSec, Timer: rideStopSec, GotOff: -1, Dest: -1} + if correctTrain { + g.Dest = 1 + r.intn(stops-1) + } + for i := 0; i < stops; i++ { + switch { + case i == g.Dest: + g.Stops = append(g.Stops, dest) + case len(f) > 0: + g.Stops = append(g.Stops, f[0]) + f = f[1:] + default: + g.Stops = append(g.Stops, UnknownStop) // slut på namn: en namnlös station + } + } + return g +} + +// UnknownStop används när det inte finns fler stationsnamn att ta av. +const UnknownStop = "・・・" + +// Current är stationen tåget står vid. +func (g *Ride) Current() string { return g.Stops[g.Index] } + +// Update låter stationerna passera och tar emot "kliv av". +func (g *Ride) Update(in Input, dt float64) { + if g.done { + return + } + if in.Confirm { + g.GotOff = g.Index + g.done = true + g.success = g.Index == g.Dest + return + } + g.Timer -= dt + if g.Timer <= 0 { + g.Index++ + g.Timer = g.StopSec + if g.Index >= len(g.Stops) { + g.Index = len(g.Stops) - 1 + g.done = true // åkte till slutstationen utan att kliva av + } + } +} diff --git a/internal/minigame/ticket.go b/internal/minigame/ticket.go new file mode 100644 index 0000000..39e1e91 --- /dev/null +++ b/internal/minigame/ticket.go @@ -0,0 +1,53 @@ +package minigame + +import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" + +// Ticket är biljettautomaten: en taxetavla med resmål (på japanska) i seedad +// ordning. Spelaren väljer ett resmål och betalar – om det var rätt avgör +// spärren/tåget senare. +type Ticket struct { + base + Options []TicketOption + Cursor int + Chosen *TicketOption + Cash int +} + +// TicketOption är ett resmål på tavlan. +type TicketOption struct { + Dest string // resmålets namn på japanska + Fare int +} + +// NewTicket bygger tavlan: rätt resmål + lockande alternativ, blandade. +// Taxan är seedad per resmål (140–620 yen i steg om 10). +func NewTicket(seed rng.Seed, correct string, others []string, cash int) *Ticket { + r := newRand(seed, "ticket") + g := &Ticket{Cash: cash} + names := append([]string{correct}, others...) + for _, n := range names { + g.Options = append(g.Options, TicketOption{Dest: n, Fare: 140 + 10*r.intn(49)}) + } + r.shuffle(len(g.Options), func(i, j int) { g.Options[i], g.Options[j] = g.Options[j], g.Options[i] }) + return g +} + +// Update flyttar markören och köper. +func (g *Ticket) Update(in Input, dt float64) { + if g.done { + return + } + if in.Cancel { + g.done = true + return + } + g.Cursor = wrap(g.Cursor+in.Move, len(g.Options)) + if in.Confirm { + opt := g.Options[g.Cursor] + if opt.Fare > g.Cash { + return // har inte råd: välj annat eller avbryt + } + g.Chosen = &opt + g.done, g.success = true, true + } +} diff --git a/internal/minigame/topup.go b/internal/minigame/topup.go new file mode 100644 index 0000000..1d8943e --- /dev/null +++ b/internal/minigame/topup.go @@ -0,0 +1,107 @@ +package minigame + +import "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" + +// TopUp är påfyllningsautomaten: hitta チャージ-knappen bland japanska +// knappar i seedad ordning, välj belopp, mata in sedlar genom att hålla +// Enter. Fel knapp kostar en straffsekund eller två. +type TopUp struct { + base + Stage TopUpStage + Buttons []string // knapparnas text, seedad ordning + Cursor int + Amounts []int + Mistakes int + Penalty float64 // sekunder kvar av frysning efter fel knapp + Fill float64 // 0..1 sedelinmatning + Amount int // valt belopp (resultat) + MaxCash int // vad spelaren har råd med +} + +// TopUpStage är var i flödet man är. +type TopUpStage int + +// Steg. +const ( + TopUpPickButton TopUpStage = iota + TopUpPickAmount + TopUpFeed +) + +// Knapparna på en japansk biljettautomat. チャージ är den rätta. +var topUpButtons = []string{"チャージ", "きっぷ", "定期券", "取消"} + +// TopUpAmounts är beloppen man kan välja. +var TopUpAmounts = []int{1000, 2000, 3000, 5000} + +const ( + topUpPenaltySec = 1.5 + topUpFeedPerSec = 0.8 // hålla Enter: fyller på 1/0.8 s + topUpDrainPerSec = 1.2 +) + +// NewTopUp skapar automaten. maxCash begränsar beloppen. +func NewTopUp(seed rng.Seed, maxCash int) *TopUp { + r := newRand(seed, "topup") + g := &TopUp{Buttons: append([]string(nil), topUpButtons...), MaxCash: maxCash} + r.shuffle(len(g.Buttons), func(i, j int) { g.Buttons[i], g.Buttons[j] = g.Buttons[j], g.Buttons[i] }) + for _, a := range TopUpAmounts { + if a <= maxCash { + g.Amounts = append(g.Amounts, a) + } + } + if len(g.Amounts) == 0 { + g.done = true // inga pengar: inget att göra + } + return g +} + +// Update för automaten framåt. +func (g *TopUp) Update(in Input, dt float64) { + if g.done { + return + } + if in.Cancel { + g.done = true + return + } + if g.Penalty > 0 { + g.Penalty -= dt + return + } + switch g.Stage { + case TopUpPickButton: + g.Cursor = wrap(g.Cursor+in.Move, len(g.Buttons)) + if in.Confirm { + if g.Buttons[g.Cursor] == topUpButtons[0] { + g.Stage, g.Cursor = TopUpPickAmount, 0 + } else { + g.Mistakes++ + g.Penalty = topUpPenaltySec + } + } + case TopUpPickAmount: + g.Cursor = wrap(g.Cursor+in.Move, len(g.Amounts)) + if in.Confirm { + g.Amount = g.Amounts[g.Cursor] + g.Stage = TopUpFeed + } + case TopUpFeed: + if in.Hold { + g.Fill += topUpFeedPerSec * dt + } else { + g.Fill = max(0, g.Fill-topUpDrainPerSec*dt) + } + if g.Fill >= 1 { + g.Fill = 1 + g.done, g.success = true, true + } + } +} + +func wrap(i, n int) int { + if n == 0 { + return 0 + } + return ((i % n) + n) % n +} diff --git a/internal/sim/run.go b/internal/sim/run.go index 0f9bec2..fd7b52d 100644 --- a/internal/sim/run.go +++ b/internal/sim/run.go @@ -5,6 +5,7 @@ import ( "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/lang" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/minigame" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" ) @@ -18,30 +19,12 @@ const ( Lost // klev på fel tåg ) -// Card är tågkortet (IC-kortet). Saldo i yen. -type Card struct{ Balance int } - -// CanPay rapporterar om saldot räcker. -func (c *Card) CanPay(yen int) bool { return c.Balance >= yen } - -// Pay drar beloppet om det går. -func (c *Card) Pay(yen int) bool { - if !c.CanPay(yen) { - return false - } - c.Balance -= yen - return true -} - -// StartBalanceYen är kortets saldo vid banstart tills M6 ger riktig ekonomi. -const StartBalanceYen = 2000 - // Run är tillståndet för en pågående bana: spelaren, klockan, kortet och // utfallet. Ren logik – LevelScene ritar den, testerna kör den headless. type Run struct { Level *level.Level Player *Mover - Card Card + Wallet *Wallet // pengar, kort, telefon, biljett – delas mellan banor Time float64 // sekunder sedan banstart (styr tidtabellerna) Steps int GatePasses int @@ -80,8 +63,51 @@ type Run struct { Served int // personer som fått mat/dryck/toa (statistik) Notice string // senaste meddelande från sällskapet (HUD) NoticeAt float64 // < 0 = aldrig + + // Minispel, biljetter och telefon. + Mini minigame.Game // pågående minispel (nil = inget); rörelsen pausar + MiniKind MiniKind + miniCount int + PendingTrain *level.Train // tåget vi håller på att kliva på + MissedTrains int + TopUps int + Rescans int + RescanUntil float64 // telefonen måste skannas igen: spelaren står still tills dess + LostReason string // varför banan förlorades (nyckel för UI) + FlashKey string // kort meddelande till HUD (textnyckel) + FlashAt float64 // < 0 = aldrig } +// MiniKind är vilket minispel som pågår. +type MiniKind int + +// Minispel. +const ( + MiniNone MiniKind = iota + MiniTopUp + MiniTicket + MiniCrowd + MiniRide +) + +// Förlustorsaker (textnycklar). +const ( + LostWrongTrain = "result.lost_wrong_train" + LostWrongStop = "result.lost_wrong_stop" + LostMissedStop = "result.lost_missed_stop" +) + +// Flash-nycklar. +const ( + FlashWrongTicket = "hud.wrong_ticket" + FlashMissedTrain = "hud.missed_train" + FlashRescan = "hud.rescan" + FlashNoTicket = "hud.need_ticket" +) + +// CrowdTries är antalet försök att få plats på ett fullt tåg. +const CrowdTries = 2 + // FacilityState är ett pågående toalettbesök (tar tid, avbryts om man går). type FacilityState struct { Active bool @@ -93,10 +119,11 @@ type FacilityState struct { // 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) + Speed float64 // rutor per sekund (0 = DefaultSpeed) + Dict *lang.Dictionary // nil = tom ordbok + Know *lang.Knowledge // nil = ny kunskap + Wallet *Wallet // nil = startkassa + Seed rng.Seed // omgångens seed (sparas med spelet) } // DefaultSpeed är spelarens grundfart i rutor per sekund. @@ -128,10 +155,14 @@ func NewRun(l *level.Level, o RunOptions) *Run { if o.Speed <= 0 { o.Speed = DefaultSpeed } + if o.Wallet == nil { + o.Wallet = NewWallet() + } r := &Run{ Level: l, Player: NewMover(l.SpawnPoint(), o.Speed), - Card: Card{Balance: StartBalanceYen}, + Wallet: o.Wallet, + FlashAt: -1, DeniedAt: -1, Dict: o.Dict, Know: o.Know, @@ -171,19 +202,27 @@ func (r *Run) StarsFor(t float64) int { } // CanEnter avgör om spelaren får gå in på en ruta: inte vägg, och en spärr -// kräver att kortet kan betala avgiften (att gå mellan två spärrutor är gratis). +// kräver biljett (på biljettbanor) eller ett användbart kort med saldo (att +// gå mellan två spärrutor är gratis). func (r *Run) CanEnter(p level.Point) bool { t := r.Level.At(p.X, p.Y) if !t.Passable() { return false } - if t == level.Gate && !r.inGate() && !r.Card.CanPay(r.Level.FareYen) { + if t == level.Gate && !r.inGate() && !r.canPassGate() { r.DeniedAt = r.Time return false } return true } +func (r *Run) canPassGate() bool { + if r.Level.TicketRequired { + return r.Wallet.Ticket != "" + } + return r.Wallet.CardUsable() && r.Wallet.Card >= r.Level.FareYen +} + func (r *Run) inGate() bool { return r.Level.At(r.Player.Tile.X, r.Player.Tile.Y) == level.Gate } @@ -194,10 +233,20 @@ func (r *Run) Step(dt float64, want Dir, board bool) { if r.Outcome != Ongoing { return } + if r.Mini != nil { + return // minispel pågår: använd StepMini + } r.Time += dt + r.Wallet.Drain(dt) before := r.Player.Tile wasGate := r.inGate() r.Player.Speed = r.baseSpeed * r.Party.SpeedFactor() + if r.Wallet.Phone && r.Wallet.Battery > 0 { + r.Player.Speed *= PhoneSpeedFactor + } + if r.Time < r.RescanUntil { + r.Player.Speed = 0 // står och skannar om + } r.Steps += r.Player.Step(dt, want, r.CanEnter) if r.Player.Tile != before { r.Party.OnLeaderArrived(r.Player.Tile) @@ -212,8 +261,15 @@ func (r *Run) Step(dt float64, want Dir, board bool) { r.stepFacility(dt) r.stepReading() if r.Player.Tile != before && r.inGate() && !wasGate { - r.Card.Pay(r.Level.FareYen) r.GatePasses++ + if !r.Level.TicketRequired { + r.Wallet.PayCard(r.Level.FareYen) + if r.Wallet.Phone && r.Seed.Derive(fmt.Sprintf("rescan:%d", r.GatePasses)).New().Float64() < PhoneRescanChance { + r.Rescans++ + r.RescanUntil = r.Time + RescanSec + r.flash(FlashRescan) + } + } } if board && !r.Player.Moving() { switch r.Level.At(r.Player.Tile.X, r.Player.Tile.Y) { @@ -221,14 +277,131 @@ func (r *Run) Step(dt float64, want Dir, board bool) { r.useToilet() case level.Kiosk: r.buyAtKiosk() + case level.TicketMachine: + r.startMachine() default: if tr, at, _ := r.PlatformHere(); tr != nil && at { - r.Board(tr) + r.tryBoard(tr) } } } } +func (r *Run) flash(key string) { r.FlashKey, r.FlashAt = key, r.Time } + +// Flashing rapporterar om ett kort meddelande ska visas just nu. +func (r *Run) Flashing(within float64) bool { return r.FlashAt >= 0 && r.Time-r.FlashAt < within } + +func (r *Run) miniSeed() rng.Seed { + r.miniCount++ + return r.Seed.Derive(fmt.Sprintf("mini:%d", r.miniCount)) +} + +// stationPool ger andra stationsnamn ur ordboken (seedat urval) till +// taxetavlan och tågresan. +func (r *Run) stationPool(exclude string, n int) []string { + var pool []string + for _, w := range r.Dict.OfKind("station") { + if w != exclude { + pool = append(pool, w) + } + } + rr := r.Seed.Derive("pool:" + exclude).New() + rr.Shuffle(len(pool), func(i, j int) { pool[i], pool[j] = pool[j], pool[i] }) + if len(pool) > n { + pool = pool[:n] + } + return pool +} + +// startMachine öppnar automaten: biljettköp på biljettbanor, annars påfyllning. +func (r *Run) startMachine() { + if r.Mini != nil { + return + } + if r.Level.TicketRequired { + dest := r.Level.Destination.Get("ja") + r.Mini, r.MiniKind = minigame.NewTicket(r.miniSeed(), dest, r.stationPool(dest, 4), r.Wallet.Cash), MiniTicket + return + } + r.Mini, r.MiniKind = minigame.NewTopUp(r.miniSeed(), r.Wallet.Cash), MiniTopUp +} + +// tryBoard försöker kliva på: biljetten måste gälla tåget, fulla tåg kräver +// trängselminispelet, sedan börjar resan. +func (r *Run) tryBoard(tr *level.Train) { + if r.Mini != nil { + return + } + if r.Level.TicketRequired && r.Wallet.Ticket != tr.Destination.Get("ja") { + r.flash(FlashWrongTicket) + return + } + r.PendingTrain = tr + if tr.Crowded { + r.Mini, r.MiniKind = minigame.NewCrowd(r.miniSeed(), CrowdTries), MiniCrowd + return + } + r.startRide() +} + +func (r *Run) startRide() { + tr := r.PendingTrain + if r.Level.TicketRequired { + r.Wallet.Ticket, r.Wallet.TicketFare = "", 0 // biljetten är förbrukad + } + dest := r.Level.Destination.Get("ja") + r.Mini, r.MiniKind = minigame.NewRide(r.miniSeed(), dest, r.stationPool(dest, 8), r.Level.RideStops, tr.Correct), MiniRide +} + +// StepMini för ett pågående minispel framåt; klockan och sällskapet tickar +// under tiden men spelaren står still. +func (r *Run) StepMini(dt float64, in minigame.Input) { + if r.Outcome != Ongoing || r.Mini == nil { + return + } + r.Time += dt + r.Wallet.Drain(dt) + r.Party.Advance(dt, r.Time) + r.Mini.Update(in, dt) + if !r.Mini.Done() { + return + } + m := r.Mini + r.Mini, r.MiniKind = nil, MiniNone + switch g := m.(type) { + case *minigame.TopUp: + if g.Success() && r.Wallet.TopUp(g.Amount) { + r.TopUps++ + } + case *minigame.Ticket: + if g.Success() && g.Chosen != nil && r.Wallet.PayCash(g.Chosen.Fare) { + r.Wallet.Ticket, r.Wallet.TicketFare = g.Chosen.Dest, g.Chosen.Fare + } + case *minigame.Crowd: + if g.Success() { + r.startRide() + } else { + r.MissedTrains++ + r.PendingTrain = nil + r.flash(FlashMissedTrain) + } + case *minigame.Ride: + tr := r.PendingTrain + r.PendingTrain = nil + switch { + case g.Success(): + r.finish(tr, true, "") + case !tr.Correct: + r.finish(tr, false, LostWrongTrain) + case g.GotOff >= 0: + r.finish(tr, false, LostWrongStop) + default: + r.finish(tr, false, LostMissedStop) + } + } +} + // useToilet startar ett toalettbesök för alla som behöver (tar tid). func (r *Run) useToilet() { if r.Facility.Active { @@ -260,7 +433,7 @@ func (r *Run) stepFacility(dt float64) { // 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) + r.Served += r.Party.BuyAtKiosk(r.Wallet.PayCard) } // FacilityProgress är 0..1 för ett pågående toalettbesök. @@ -295,12 +468,13 @@ func (r *Run) SignHere() *level.SignText { return r.Level.SignAt(r.Player.Tile) } -// 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) { +// finish 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) finish(tr *level.Train, won bool, reason string) { r.Boarded = tr - if !tr.Correct { + if !won { r.Outcome = Lost + r.LostReason = reason return } r.Outcome = Won diff --git a/internal/sim/run_test.go b/internal/sim/run_test.go index d66e2de..4744492 100644 --- a/internal/sim/run_test.go +++ b/internal/sim/run_test.go @@ -7,10 +7,27 @@ import ( "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/lang" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level" + "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/minigame" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/res" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/rng" ) +// ride spelar tågresan: kliver av när tåget står vid resmålet. På fel tåg +// finns inget resmål, så resan går till slutstationen. +func ride(t *testing.T, r *Run) { + t.Helper() + if r.MiniKind != MiniRide { + t.Fatalf("ingen tågresa pågår (kind=%v)", r.MiniKind) + } + for i := 0; i < 60*120 && r.Mini != nil; i++ { + g := r.Mini.(*minigame.Ride) + r.StepMini(frame, minigame.Input{Confirm: g.Index == g.Dest}) + } + if r.Mini != nil { + t.Fatal("resan tog aldrig slut") + } +} + func loadDict(t *testing.T) *lang.Dictionary { t.Helper() b, err := res.ReadFile("text", "jp-dictionary.json") @@ -52,7 +69,9 @@ func dirTo(from, to level.Point) Dir { } } -// walk låter en bot följa en väg ruta för ruta, en bildruta i taget. +// walk låter en bot följa en väg ruta för ruta, en bildruta i taget. Tangenten +// släpps så fort steget mot nästa ruta påbörjats, så att boten stannar exakt +// där även när farten inte är bildruteexakt (telefon- eller sällskapsfaktor). func walk(t *testing.T, r *Run, path []level.Point) { t.Helper() for _, next := range path[1:] { @@ -61,9 +80,13 @@ func walk(t *testing.T, r *Run, path []level.Point) { if r.Player.Tile == next && !r.Player.Moving() { break } - r.Step(frame, d, false) + if r.Player.Target == next || r.Player.Tile == next { + r.Step(frame, None, false) + } else { + r.Step(frame, d, false) + } } - if r.Player.Tile != next { + if r.Player.Tile != next || r.Player.Moving() { t.Fatalf("boten fastnade på %v på väg mot %v", r.Player.Tile, next) } } @@ -108,11 +131,15 @@ func TestBotWinsLevel001(t *testing.T) { t.Fatal("rätt perrong ska ha rätt tåg") } r.Step(frame, None, true) + if r.Outcome != Ongoing || r.MiniKind != MiniRide { + t.Fatalf("att kliva på ska starta tågresan: outcome=%v kind=%v", r.Outcome, r.MiniKind) + } + ride(t, r) if r.Outcome != Won || r.Boarded != tr { t.Fatalf("outcome=%v boarded=%v", r.Outcome, r.Boarded) } - if r.GatePasses != 1 || r.Card.Balance != StartBalanceYen-l.FareYen { - t.Fatalf("spärrpassager=%d saldo=%d (vill ha 1 och %d)", r.GatePasses, r.Card.Balance, StartBalanceYen-l.FareYen) + if r.GatePasses != 1 || r.Wallet.Card != StartCardYen-l.FareYen { + t.Fatalf("spärrpassager=%d saldo=%d (vill ha 1 och %d)", r.GatePasses, r.Wallet.Card, StartCardYen-l.FareYen) } if r.Steps != len(path)-1 { t.Fatalf("steg=%d, vägen är %d rutor", r.Steps, len(path)-1) @@ -135,8 +162,9 @@ func TestBotLosesOnWrongTrain(t *testing.T) { walk(t, r, l.Path(r.Player.Tile, goal, r.CanEnter)) tr := waitForTrain(t, r) r.Step(frame, None, true) - if r.Outcome != Lost || r.Boarded != tr || tr.Correct { - t.Fatalf("outcome=%v boarded=%+v", r.Outcome, r.Boarded) + ride(t, r) + if r.Outcome != Lost || r.Boarded != tr || tr.Correct || r.LostReason != LostWrongTrain { + t.Fatalf("outcome=%v boarded=%+v reason=%q", r.Outcome, r.Boarded, r.LostReason) } } @@ -144,7 +172,7 @@ func TestGateNeedsCardBalance(t *testing.T) { l := loadLevel(t, "001-flygplatsen") r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) gate := l.Find(level.Gate)[0] - r.Card.Balance = 0 + r.Wallet.Card = 0 if r.CanEnter(gate) { t.Fatal("spärren ska stoppa ett tomt kort") } @@ -154,13 +182,13 @@ func TestGateNeedsCardBalance(t *testing.T) { if l.Path(r.Player.Tile, l.Find(level.Platform)[0], r.CanEnter) != nil { t.Fatal("utan saldo ska perrongen vara onåbar") } - r.Card.Balance = l.FareYen + r.Wallet.Card = l.FareYen if !r.CanEnter(gate) { t.Fatal("med exakt avgiften ska spärren släppa igenom") } // Mellan två spärrutor är det gratis: ställ spelaren i spärren. r.Player.Tile, r.Player.Target = gate, gate - r.Card.Balance = 0 + r.Wallet.Card = 0 other := level.Point{X: gate.X + 1, Y: gate.Y} if l.At(other.X, other.Y) == level.Gate && !r.CanEnter(other) { t.Fatal("att gå mellan två spärrutor ska inte kosta") @@ -302,6 +330,7 @@ func TestGoodResultTeachesDestination(t *testing.T) { waitForTrain(t, r) } r.Step(frame, None, true) + ride(t, r) if r.Outcome != Won || r.Stars != tc.stars { t.Fatalf("%s: outcome=%v stars=%d", tc.name, r.Outcome, r.Stars) } @@ -395,10 +424,10 @@ func TestToiletAndKioskInRun(t *testing.T) { walk(t, r, l.Path(r.Player.Tile, kiosk, r.CanEnter)) anna.Meters.Drink = 5 anna.Urge = Thirsty - before := r.Card.Balance + before := r.Wallet.Card 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) + if anna.Meters.Drink != 100 || anna.Urge != NoUrge || r.Wallet.Card != before-KioskPriceYen || r.Served != 2 { + t.Fatalf("kiosken: dryck=%.0f urge=%v saldo=%d->%d served=%d", anna.Meters.Drink, anna.Urge, before, r.Wallet.Card, r.Served) } } @@ -412,3 +441,226 @@ func TestPartySlowsLeader(t *testing.T) { t.Fatalf("fart=%.2f", r.Player.Speed) } } + +func TestRideWrongOrMissedStopLoses(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + for _, tc := range []struct { + name string + getOff bool + reason string + }{{"fel station", true, LostWrongStop}, {"åker förbi", false, LostMissedStop}} { + r := NewRun(l, RunOptions{Dict: loadDict(t), Seed: rng.FromInt(1)}) + walk(t, r, l.Path(r.Player.Tile, l.CorrectPlatform(), r.CanEnter)) + waitForTrain(t, r) + r.Step(frame, None, true) + g := r.Mini.(*minigame.Ride) + if g.Dest < 1 { + t.Fatalf("resmålet ska ligga på linjen men inte först: %d", g.Dest) + } + if tc.getOff { + r.StepMini(frame, minigame.Input{Confirm: true}) // första stationen = fel + } else { + for i := 0; i < 60*120 && r.Mini != nil; i++ { + r.StepMini(frame, minigame.Input{}) + } + } + if r.Outcome != Lost || r.LostReason != tc.reason { + t.Fatalf("%s: outcome=%v reason=%q", tc.name, r.Outcome, r.LostReason) + } + } +} + +func TestTopUpFlowAtMachine(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + r := NewRun(l, RunOptions{Dict: loadDict(t), Seed: rng.FromInt(1)}) + r.Wallet.Card = 0 + gate := l.Find(level.Gate)[0] + if r.CanEnter(gate) { + t.Fatal("tomt kort stoppas") + } + machine := l.Find(level.TicketMachine)[0] + walk(t, r, l.Path(r.Player.Tile, machine, r.CanEnter)) + r.Step(frame, None, true) + g, ok := r.Mini.(*minigame.TopUp) + if !ok || r.MiniKind != MiniTopUp { + t.Fatalf("automaten ska starta påfyllning: %T", r.Mini) + } + cash := r.Wallet.Cash + for g.Buttons[g.Cursor] != "チャージ" { + r.StepMini(frame, minigame.Input{Move: 1}) + } + r.StepMini(frame, minigame.Input{Confirm: true}) + r.StepMini(frame, minigame.Input{Confirm: true}) // första beloppet (1000) + for i := 0; i < 600 && r.Mini != nil; i++ { + r.StepMini(frame, minigame.Input{Hold: true}) + } + if r.Mini != nil || r.Wallet.Card != 1000 || r.Wallet.Cash != cash-1000 || r.TopUps != 1 { + t.Fatalf("efter påfyllning: card=%d cash=%d topups=%d", r.Wallet.Card, r.Wallet.Cash, r.TopUps) + } + if !r.CanEnter(gate) { + t.Fatal("med påfyllt kort ska spärren släppa igenom") + } + // Minispelet pausar rörelsen men inte klockan. + r.Step(frame, None, true) + t0 := r.Time + r.Step(frame, Right, false) + if r.Mini == nil || r.Time != t0 || r.Player.Moving() { + t.Fatal("under minispelet ska Step vara en no-op") + } + r.StepMini(frame, minigame.Input{Cancel: true}) + if r.Mini != nil || r.Time <= t0 { + t.Fatal("Esc avbryter och klockan går") + } +} + +// TestTicketLevelFlow spelar bana 002: köp rätt biljett, passera spärren, +// tränga sig på det fulla tåget och kliva av i Shibuya. +func TestTicketLevelFlow(t *testing.T) { + l := loadLevel(t, "002-shinjuku") + if !l.TicketRequired || !l.Trains[0].Crowded { + t.Fatal("002 ska kräva biljett och ha ett fullt tåg") + } + r := NewRun(l, RunOptions{Dict: loadDict(t), Seed: rng.FromInt(11)}) + r.Party.nextEventAt = 1e9 + gate := l.Find(level.Gate)[0] + if r.CanEnter(gate) { + t.Fatal("utan biljett stoppar spärren även med kort") + } + machine := l.Find(level.TicketMachine)[0] + walk(t, r, l.Path(r.Player.Tile, machine, r.CanEnter)) + + // Fel biljett först: tåget vägrar. + r.Step(frame, None, true) + tk := r.Mini.(*minigame.Ticket) + for tk.Options[tk.Cursor].Dest == "渋谷" { + r.StepMini(frame, minigame.Input{Move: 1}) + } + wrong := tk.Options[tk.Cursor] + r.StepMini(frame, minigame.Input{Confirm: true}) + if r.Wallet.Ticket != wrong.Dest || r.Wallet.Cash != StartCashYen-wrong.Fare { + t.Fatalf("biljett=%q cash=%d", r.Wallet.Ticket, r.Wallet.Cash) + } + goal := l.CorrectPlatform() + walk(t, r, l.Path(r.Player.Tile, goal, r.CanEnter)) + waitForTrain(t, r) + r.Step(frame, None, true) + if r.Mini != nil || r.FlashKey != FlashWrongTicket || r.Outcome != Ongoing { + t.Fatal("fel biljett ska stoppas vid tåget") + } + + // Rätt biljett. + walk(t, r, l.Path(r.Player.Tile, machine, r.CanEnter)) + r.Step(frame, None, true) + tk = r.Mini.(*minigame.Ticket) + for tk.Options[tk.Cursor].Dest != "渋谷" { + r.StepMini(frame, minigame.Input{Move: 1}) + } + r.StepMini(frame, minigame.Input{Confirm: true}) + if r.Wallet.Ticket != "渋谷" { + t.Fatalf("biljett=%q", r.Wallet.Ticket) + } + walk(t, r, l.Path(r.Player.Tile, goal, r.CanEnter)) + waitForTrain(t, r) + r.Step(frame, None, true) + cr, ok := r.Mini.(*minigame.Crowd) + if !ok { + t.Fatalf("fullt tåg ska ge trängselminispel, fick %T", r.Mini) + } + for i := 0; i < 600 && !cr.InZone(); i++ { + r.StepMini(frame, minigame.Input{}) + } + r.StepMini(frame, minigame.Input{Confirm: true}) + if r.MiniKind != MiniRide || r.Wallet.Ticket != "" { + t.Fatalf("efter trängseln: kind=%v biljett=%q", r.MiniKind, r.Wallet.Ticket) + } + ride(t, r) + if r.Outcome != Won { + t.Fatalf("outcome=%v reason=%q", r.Outcome, r.LostReason) + } +} + +func TestCrowdFailureMissesTrain(t *testing.T) { + l := loadLevel(t, "002-shinjuku") + r := NewRun(l, RunOptions{Dict: loadDict(t), Seed: rng.FromInt(11)}) + r.Party.nextEventAt = 1e9 + r.Wallet.Ticket = "渋谷" + goal := l.CorrectPlatform() + walk(t, r, l.Path(r.Player.Tile, goal, r.CanEnter)) + waitForTrain(t, r) + r.Step(frame, None, true) + cr := r.Mini.(*minigame.Crowd) + for n := 0; n < CrowdTries; n++ { + for cr.InZone() { + r.StepMini(frame, minigame.Input{}) + } + r.StepMini(frame, minigame.Input{Confirm: true}) + } + if r.Mini != nil || r.MissedTrains != 1 || r.Outcome != Ongoing || r.FlashKey != FlashMissedTrain { + t.Fatalf("missat tåg: mini=%v missed=%d outcome=%v", r.Mini, r.MissedTrains, r.Outcome) + } + if r.Wallet.Ticket != "渋谷" { + t.Fatal("biljetten ska vara kvar när man inte kom med") + } +} + +func TestPhoneSpeedRescanAndBattery(t *testing.T) { + l := loadLevel(t, "001-flygplatsen") + rescans := map[int]int{} + for seed := uint64(1); seed <= 12; seed++ { + r := NewRun(l, RunOptions{Seed: rng.FromInt(seed)}) + r.Party.nextEventAt = 1e9 + r.Wallet.Phone = true + r.Step(frame, Right, false) + if math.Abs(r.Player.Speed-DefaultSpeed*PhoneSpeedFactor) > 1e-9 { + t.Fatalf("telefonen ska ge fartbuff: %.2f", r.Player.Speed) + } + for r.Player.Moving() { // gå klart rutan innan vi väljer väg + r.Step(frame, None, false) + } + gate := l.Find(level.Gate)[0] + path := l.Path(r.Player.Tile, gate, r.CanEnter) + for i, p := range path { // stanna på den första spärrutan – där sker skanningen + if l.At(p.X, p.Y) == level.Gate { + path = path[:i+1] + break + } + } + walk(t, r, path) + rescans[r.Rescans]++ + if r.Rescans == 1 { + if r.Time >= r.RescanUntil || r.FlashKey != FlashRescan { + t.Fatal("omskanning ska frysa spelaren en stund") + } + before := r.Player.Tile + r.Step(frame, Right, false) + if r.Player.Moving() || r.Player.Tile != before { + t.Fatal("under omskanningen står man still") + } + } + } + if rescans[1] == 0 || rescans[0] == 0 { + t.Fatalf("på 12 seeds borde några men inte alla ge omskanning: %v", rescans) + } + // Determinism: samma seed -> samma utfall. + run := func() int { + r := NewRun(l, RunOptions{Seed: rng.FromInt(5)}) + r.Party.nextEventAt = 1e9 + r.Wallet.Phone = true + walk(t, r, l.Path(r.Player.Tile, l.Find(level.Gate)[0], r.CanEnter)) + return r.Rescans + } + if run() != run() { + t.Fatal("omskanningen ska vara seedad") + } + // Dött batteri: kortet i telefonen går inte -> spärren stoppar. + r := NewRun(l, RunOptions{Seed: rng.FromInt(1)}) + r.Wallet.Phone = true + r.Wallet.Battery = 0.001 + r.Step(frame, None, false) + if r.Wallet.Battery != 0 || r.CanEnter(l.Find(level.Gate)[0]) { + t.Fatal("dött batteri ska stoppa spärren") + } + if r.Player.Speed != DefaultSpeed { + t.Fatal("ingen fartbuff med dött batteri") + } +} diff --git a/internal/sim/wallet.go b/internal/sim/wallet.go new file mode 100644 index 0000000..b263679 --- /dev/null +++ b/internal/sim/wallet.go @@ -0,0 +1,67 @@ +package sim + +// Wallet är spelarens pengar och biljetter. Följer med mellan banor +// (sparas i M8). +type Wallet struct { + Card int `json:"card"` // IC-kortets saldo (yen) + Cash int `json:"cash"` // kontanter (yen) + Phone bool `json:"phone"` // kortet ligger i telefonen + Battery float64 `json:"battery"` // telefonens batteri 0..100 + Ticket string `json:"ticket"` // köpt pappersbiljett: resmålets namn (ja), "" = ingen + TicketFare int `json:"ticketFare"` // vad biljetten kostade + Spent int `json:"spent"` // totalt spenderat (poäng i M7) +} + +// Pengar och telefon. +const ( + StartCardYen = 2000 + StartCashYen = 5000 + BatteryPerSec = 100.0 / 900 // telefonen håller 15 min – tar bara slut på långa banor + PhoneSpeedFactor = 1.1 // kortet i telefonen: man slipper rota i plånboken + PhoneRescanChance = 0.15 // ...men ibland måste man skanna igen + RescanSec = 1.5 +) + +// NewWallet ger startkassan med kortet i plånboken (inte telefonen). +func NewWallet() *Wallet { return &Wallet{Card: StartCardYen, Cash: StartCashYen, Battery: 100} } + +// CardUsable: kortet i telefonen går inte att använda med dött batteri. +func (w *Wallet) CardUsable() bool { return !w.Phone || w.Battery > 0 } + +// PayCard drar från kortet om det går. +func (w *Wallet) PayCard(yen int) bool { + if !w.CardUsable() || w.Card < yen { + return false + } + w.Card -= yen + w.Spent += yen + return true +} + +// PayCash betalar kontant om det går. +func (w *Wallet) PayCash(yen int) bool { + if w.Cash < yen { + return false + } + w.Cash -= yen + w.Spent += yen + return true +} + +// TopUp flyttar kontanter till kortet (påfyllning räknas inte som spenderat +// förrän kortet används). +func (w *Wallet) TopUp(yen int) bool { + if w.Cash < yen { + return false + } + w.Cash -= yen + w.Card += yen + return true +} + +// Drain laddar ur telefonen när kortet ligger i den. +func (w *Wallet) Drain(dt float64) { + if w.Phone { + w.Battery = max(0, w.Battery-BatteryPerSec*dt) + } +} diff --git a/internal/sim/wallet_test.go b/internal/sim/wallet_test.go new file mode 100644 index 0000000..5edb96c --- /dev/null +++ b/internal/sim/wallet_test.go @@ -0,0 +1,35 @@ +package sim + +import "testing" + +func TestWalletPayTopUpAndPhone(t *testing.T) { + w := NewWallet() + if w.Card != StartCardYen || w.Cash != StartCashYen || !w.CardUsable() { + t.Fatal("startvärden") + } + if !w.PayCard(200) || w.Card != StartCardYen-200 || w.Spent != 200 { + t.Fatal("PayCard") + } + if w.PayCard(99999) { + t.Fatal("kan inte betala mer än saldot") + } + if !w.TopUp(1000) || w.Card != StartCardYen-200+1000 || w.Cash != StartCashYen-1000 || w.Spent != 200 { + t.Fatal("TopUp flyttar kontanter till kortet utan att räknas som spenderat") + } + if w.TopUp(99999) || !w.PayCash(150) || w.PayCash(99999) { + t.Fatal("kontantgränser") + } + w.Phone = true + w.Drain(450) // halva batteriet + if w.Battery < 49 || w.Battery > 51 || !w.CardUsable() { + t.Fatalf("battery=%.1f", w.Battery) + } + w.Drain(10000) + if w.Battery != 0 || w.CardUsable() || w.PayCard(1) { + t.Fatal("dött batteri = kortet i telefonen går inte att använda") + } + w.Phone = false + if !w.CardUsable() { + t.Fatal("kortet i plånboken bryr sig inte om batteriet") + } +} diff --git a/resources/data/levels/002-shinjuku.json b/resources/data/levels/002-shinjuku.json index 511c6de..65e60c0 100644 --- a/resources/data/levels/002-shinjuku.json +++ b/resources/data/levels/002-shinjuku.json @@ -1,11 +1,21 @@ { + "id": "002-shinjuku", + "name": { + "en": "Shinjuku Station", + "ja": "新宿駅", + "sv": "Shinjuku station" + }, + "difficulty": 2, + "party": 3, + "ticketRequired": true, + "rideStops": 4, "destination": { "en": "Shibuya", "ja": "渋谷", "romaji": "Shibuya", "sv": "Shibuya" }, - "difficulty": 2, + "timeLimitSec": 0, "fareYen": 200, "grid": [ "#################################", @@ -30,13 +40,49 @@ "#pG.#...#.....................#P#", "#################################" ], - "id": "002-shinjuku", - "name": { - "en": "Shinjuku Station", - "ja": "新宿駅", - "sv": "Shinjuku station" - }, - "party": 3, + "trains": [ + { + "correct": true, + "destination": { + "en": "Shibuya", + "ja": "渋谷", + "romaji": "Shibuya" + }, + "line": { + "en": "Yamanote Line", + "ja": "山手線", + "romaji": "Yamanote-sen" + }, + "platform": "P", + "schedule": { + "dwellSec": 8, + "intervalSec": 20, + "offsetSec": 3 + }, + "track": "14", + "crowded": true + }, + { + "correct": false, + "destination": { + "en": "Tokyo", + "ja": "東京", + "romaji": "Tokyo" + }, + "line": { + "en": "Chuo Line", + "ja": "中央線", + "romaji": "Chuo-sen" + }, + "platform": "p", + "schedule": { + "dwellSec": 8, + "intervalSec": 25, + "offsetSec": 10 + }, + "track": "8" + } + ], "signs": [ { "text": { @@ -65,48 +111,5 @@ "x": 15, "y": 17 } - ], - "timeLimitSec": 0, - "trains": [ - { - "correct": true, - "destination": { - "en": "Shibuya", - "ja": "渋谷", - "romaji": "Shibuya" - }, - "line": { - "en": "Yamanote Line", - "ja": "山手線", - "romaji": "Yamanote-sen" - }, - "platform": "P", - "schedule": { - "dwellSec": 8, - "intervalSec": 20, - "offsetSec": 3 - }, - "track": "14" - }, - { - "correct": false, - "destination": { - "en": "Tokyo", - "ja": "東京", - "romaji": "Tokyo" - }, - "line": { - "en": "Chuo Line", - "ja": "中央線", - "romaji": "Chuo-sen" - }, - "platform": "p", - "schedule": { - "dwellSec": 8, - "intervalSec": 25, - "offsetSec": 10 - }, - "track": "8" - } ] } diff --git a/resources/text/en.json b/resources/text/en.json index 82673f7..d78973a 100644 --- a/resources/text/en.json +++ b/resources/text/en.json @@ -49,7 +49,7 @@ "words.hint": "Arrows: select Enter: learn the word for points Esc/L: back", "words.already": "You already know that word.", "words.bought": "New word: %s = %s", - "words.too_expensive": "Costs %d points – clear levels with good times for more.", + "words.too_expensive": "Costs %d points - clear levels with good times for more.", "urge.toilet": "needs the toilet (W)", "urge.thirsty": "is thirsty (K)", "urge.hungry": "is hungry (K)", @@ -60,5 +60,36 @@ "hud.kiosk_prompt": "Enter: buy food/drink for %d person(s), %d¥", "hud.kiosk_none": "Nobody is hungry or thirsty right now.", "result.explored": "Explored", - "result.served": "served" + "result.served": "served", + "hud.cash": "Cash", + "hud.phone": "Phone", + "hud.ticket": "Ticket", + "hud.machine_topup": "Enter: top up the card (card %d¥, cash %d¥)", + "hud.machine_ticket": "Enter: buy a ticket (cash %d¥)", + "hud.wrong_ticket": "This ticket is not valid for this train!", + "hud.need_ticket": "Gate: you need a ticket - buy one at the machine (T).", + "hud.phone_dead": "Gate: your phone is dead - buy a ticket instead.", + "hud.rescan": "Beep… scan again.", + "hud.missed_train": "You could not get on - the train left.", + "level.lost": "Level failed", + "result.lost_wrong_train": "Wrong train.", + "result.lost_wrong_stop": "You got off at the wrong station.", + "result.lost_missed_stop": "You rode past your destination.", + "result.spent": "Spent", + "result.missed": "Missed trains", + "menu.phone": "P: card in phone %s", + "menu.on": "on", + "menu.off": "off", + "mini.cancel": "Esc: cancel", + "mini.topup.title": "Top up the card", + "mini.topup.pick": "Pick the right button on the machine:", + "mini.topup.amount": "Choose an amount:", + "mini.topup.feed": "Hold Enter to feed %d¥ in bills", + "mini.topup.wrong": "Wrong button…", + "mini.ticket.title": "Tickets", + "mini.ticket.hint": "Buy a ticket to %s. Cash: %d¥", + "mini.crowd.title": "Crowded train - squeeze in", + "mini.crowd.hint": "Press Enter when the marker is in the green zone (%d tries left)", + "mini.ride.title": "On the train - next stop", + "mini.ride.hint": "Enter: get off here (you are going to %s)" } diff --git a/resources/text/jp-dictionary.json b/resources/text/jp-dictionary.json index 33ad95e..457d2c7 100644 --- a/resources/text/jp-dictionary.json +++ b/resources/text/jp-dictionary.json @@ -145,35 +145,40 @@ "romaji": "Shinjuku", "en": "Shinjuku", "sv": "Shinjuku", - "tier": 2 + "tier": 2, + "kind": "station" }, "渋谷": { "kana": "しぶや", "romaji": "Shibuya", "en": "Shibuya", "sv": "Shibuya", - "tier": 2 + "tier": 2, + "kind": "station" }, "東京": { "kana": "とうきょう", "romaji": "Tōkyō", "en": "Tokyo", "sv": "Tokyo", - "tier": 1 + "tier": 1, + "kind": "station" }, "上野": { "kana": "うえの", "romaji": "Ueno", "en": "Ueno", "sv": "Ueno", - "tier": 2 + "tier": 2, + "kind": "station" }, "京成上野": { "kana": "けいせいうえの", "romaji": "Keisei-Ueno", "en": "Keisei-Ueno", "sv": "Keisei-Ueno", - "tier": 3 + "tier": 3, + "kind": "station" }, "京成線": { "kana": "けいせいせん", @@ -208,7 +213,8 @@ "romaji": "Narita", "en": "Narita", "sv": "Narita", - "tier": 3 + "tier": 3, + "kind": "station" }, "駅": { "kana": "えき", @@ -419,5 +425,61 @@ "en": "Keisei Main Line", "sv": "Keisei huvudlinje", "tier": 3 + }, + "池袋": { + "kana": "いけぶくろ", + "romaji": "Ikebukuro", + "en": "Ikebukuro", + "sv": "Ikebukuro", + "tier": 3, + "kind": "station" + }, + "品川": { + "kana": "しながわ", + "romaji": "Shinagawa", + "en": "Shinagawa", + "sv": "Shinagawa", + "tier": 3, + "kind": "station" + }, + "秋葉原": { + "kana": "あきはばら", + "romaji": "Akihabara", + "en": "Akihabara", + "sv": "Akihabara", + "tier": 3, + "kind": "station" + }, + "浅草": { + "kana": "あさくさ", + "romaji": "Asakusa", + "en": "Asakusa", + "sv": "Asakusa", + "tier": 3, + "kind": "station" + }, + "銀座": { + "kana": "ぎんざ", + "romaji": "Ginza", + "en": "Ginza", + "sv": "Ginza", + "tier": 3, + "kind": "station" + }, + "原宿": { + "kana": "はらじゅく", + "romaji": "Harajuku", + "en": "Harajuku", + "sv": "Harajuku", + "tier": 3, + "kind": "station" + }, + "日暮里": { + "kana": "にっぽり", + "romaji": "Nippori", + "en": "Nippori", + "sv": "Nippori", + "tier": 3, + "kind": "station" } } diff --git a/resources/text/sv.json b/resources/text/sv.json index 710d592..c315b37 100644 --- a/resources/text/sv.json +++ b/resources/text/sv.json @@ -49,7 +49,7 @@ "words.hint": "Pilar: välj Enter: lär dig ordet för poäng Esc/L: tillbaka", "words.already": "Det ordet kan du redan.", "words.bought": "Nytt ord: %s = %s", - "words.too_expensive": "Kostar %d poäng – klara banor med bra tid för fler.", + "words.too_expensive": "Kostar %d poäng - klara banor med bra tid för fler.", "urge.toilet": "måste på toa (W)", "urge.thirsty": "är törstig (K)", "urge.hungry": "är hungrig (K)", @@ -60,5 +60,36 @@ "hud.kiosk_prompt": "Enter: köp mat/dryck åt %d person(er), %d¥", "hud.kiosk_none": "Ingen är hungrig eller törstig just nu.", "result.explored": "Utforskat", - "result.served": "försörjda" + "result.served": "försörjda", + "hud.cash": "Kontant", + "hud.phone": "Tel", + "hud.ticket": "Biljett", + "hud.machine_topup": "Enter: fyll på kortet (kort %d¥, kontant %d¥)", + "hud.machine_ticket": "Enter: köp biljett (kontant %d¥)", + "hud.wrong_ticket": "Biljetten gäller inte för det här tåget!", + "hud.need_ticket": "Spärren: du behöver en biljett - köp i automaten (T).", + "hud.phone_dead": "Spärren: telefonen är död - köp en biljett i stället.", + "hud.rescan": "Pip… skanna igen.", + "hud.missed_train": "Ni fick inte plats - tåget gick.", + "level.lost": "Banan misslyckades", + "result.lost_wrong_train": "Fel tåg.", + "result.lost_wrong_stop": "Du klev av på fel station.", + "result.lost_missed_stop": "Du åkte förbi ditt resmål.", + "result.spent": "Spenderat", + "result.missed": "Missade tåg", + "menu.phone": "P: kort i telefonen %s", + "menu.on": "på", + "menu.off": "av", + "mini.cancel": "Esc: avbryt", + "mini.topup.title": "Fyll på kortet", + "mini.topup.pick": "Välj rätt knapp på automaten:", + "mini.topup.amount": "Välj belopp:", + "mini.topup.feed": "Håll Enter för att mata in %d¥ i sedlar", + "mini.topup.wrong": "Fel knapp…", + "mini.ticket.title": "Biljetter", + "mini.ticket.hint": "Köp biljett till %s. Kontant: %d¥", + "mini.crowd.title": "Fullt tåg - tränga sig på", + "mini.crowd.hint": "Tryck Enter när markören är i det gröna fältet (%d försök kvar)", + "mini.ride.title": "På tåget - nästa station", + "mini.ride.hint": "Enter: kliv av här (du ska till %s)" } diff --git a/tools/shots/main.go b/tools/shots/main.go index 4b8a643..62e4eb6 100644 --- a/tools/shots/main.go +++ b/tools/shots/main.go @@ -44,6 +44,18 @@ func buildShots(levelsDir string) error { if err != nil { return err } + toMachine, err := moves(l, l.SpawnPoint(), l.Find(level.TicketMachine)[0]) + if err != nil { + return err + } + l2, err := level.LoadFile(filepath.Join(levelsDir, "002-shinjuku.json")) + if err != nil { + return err + } + toMachine2, err := moves(l2, l2.SpawnPoint(), l2.Find(level.TicketMachine)[0]) + if err != nil { + return err + } // Skyltbilderna tas med några kända ord så att markeringen och den // delvisa översättningen syns; hjälpen lär sedan in nästa ord. known := []string{"-know", "改札,番線,方面", "-seed", "7"} @@ -53,7 +65,9 @@ func buildShots(levelsDir string) error { {"001-flygplatsen", "move right 4; move down 2; wait 5; shot $OUT/level-001.png; quit", nil}, {"002-shinjuku", "move down 6; move right 4; wait 5; shot $OUT/level-002.png; quit", nil}, {"001-flygplatsen", toSign + "; wait 5; shot $OUT/sign.png; press h; wait 200; shot $OUT/sign-help.png; wait 200; shot $OUT/sign-learned.png; " + toGoal + - "; waittrain; wait 30; shot $OUT/platform.png; press enter; wait 5; shot $OUT/result.png; quit", known}, + "; waittrain; wait 30; shot $OUT/platform.png; press enter; wait 40; shot $OUT/ride.png; waitstop; press enter; wait 5; shot $OUT/result.png; quit", known}, + {"001-flygplatsen", toMachine + "; press enter; wait 5; press right; wait 5; shot $OUT/topup.png; quit", []string{"-seed", "7", "-card", "0"}}, + {"002-shinjuku", toMachine2 + "; press enter; wait 5; shot $OUT/ticket.png; quit", []string{"-seed", "7", "-know", "渋谷"}}, } return nil }