From 9a65a50cc4a728cdada047a4f484e4dee9ed4c66 Mon Sep 17 00:00:00 2001 From: Oliver Rieger Date: Sat, 1 Aug 2026 13:31:00 +0200 Subject: [PATCH] Put a menu in front of the game, with Marvin to explain it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The overlay is a four-stage machine now — splash -> menu -> {courts, tutorial} — swapped by data-stage while the backdrop and card frame stay mounted, so the live court never flashes through between screens. Court tiles SELECT only. Tapping one used to start the match on the spot, which gave you no way to compare the three and no way back out; START GAME and BACK are their own buttons now. Headlines are 15px against the 11px body, so a screen reads as a screen rather than as a list. The tutorial is a data table: a Marvin pose, an optional picture already in assets/, and his lines. Seven pages covering tennis, the turn, the slingshot, the rack and the duel. Marvin is four new frames off x_boymop1 — waving, pointing, shrugging, and clutching his mop in terror. The theme no longer starts at boot. A title screen that plays at you before you have touched it is rude, and the autoplay policy would have held it silent until that first tap anyway. Death returns to the menu instead of the title. The reload stays — it is the honest full reset — and a sessionStorage flag is what picks the stage on the way back in. Machine-gun rounds are tennis balls, so they are drawn as balls and take the perspective. A fixed 4x4 fillRect was exactly as big at the far baseline as at your feet, which read as square confetti pinned to the screen. Co-Authored-By: Claude Opus 5 --- HANDOFF.md | 14 +++++ assets/_regen_batches.json | 14 +++++ assets/marvin1.png | Bin 0 -> 17390 bytes assets/marvin2.png | Bin 0 -> 16388 bytes assets/marvin3.png | Bin 0 -> 17759 bytes assets/marvin4.png | Bin 0 -> 17684 bytes audio.js | 8 +-- index.html | 74 +++++++++++++++++++---- main.js | 121 +++++++++++++++++++++++++++++-------- render.js | 12 ++-- 10 files changed, 199 insertions(+), 44 deletions(-) create mode 100644 assets/marvin1.png create mode 100644 assets/marvin2.png create mode 100644 assets/marvin3.png create mode 100644 assets/marvin4.png diff --git a/HANDOFF.md b/HANDOFF.md index d79641a..d5a409f 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -454,6 +454,20 @@ death summary is the end menu, and the zombie bed ducks out as it comes in. Two bed's gain at 0. Without it, a multi-megabyte file ducked mid-fetch comes up at full level several seconds later, over the match. +**The overlay is a four-stage machine**, not a screen per DOM node: `#intro[data-stage]` swaps +`splash -> menu -> {courts, tutorial}` while the backdrop and card frame stay mounted, because a +screen that unmounts the overlay flashes the live court through between menus. Court tiles SELECT +only; `START GAME` and `BACK` are their own buttons. The tutorial is a data table (`TUT` in main.js) +of Marvin poses, an optional picture already in `assets/`, and his lines — adding a page is a row. + +**The menu theme starts on the FIRST TAP, never at boot** (`go()` calls `menuMusic`). A title screen +that plays at you before you touch it is rude, and on a phone the autoplay policy would have held it +silent until that tap regardless. + +**Death returns to the MENU, not the splash.** `maybeRestart` still reloads — that is the honest +full reset and nothing has to unwind a run by hand — but it sets `sessionStorage.splatterStage` on +the way out, and boot consumes it to open at the menu. + **The theme is AAC** (`background-music.m4a`, 768 KB — the WAV was 8.3 MB, and this one downloads on every page load before the player has decided to play). `loopBed` takes the FULL filename now, because the beds are a mix of `.wav` and `.m4a`; `fadeBed`'s key must match it exactly, extension diff --git a/assets/_regen_batches.json b/assets/_regen_batches.json index 5660c28..02f3641 100644 --- a/assets/_regen_batches.json +++ b/assets/_regen_batches.json @@ -439,5 +439,19 @@ "check": "loose", "subject": "Three frames of the same tennis opponent, drawn as coarse low-resolution pixel art. FIRST a plain standing frame for scale, exactly like the reference. THEN TWO frames of him standing at the baseline BOUNCING A BALL on the ground before serving, with NO ball drawn. Every figure is the SAME man as the reference and the SAME size: RED polo shirt, dark grey shorts, RED cloth headband, blond hair, seen from the FRONT. Same face, same colours, same proportions. His headband is RED, the same red as his shirt \u2014 never white, cream or grey. In both bouncing frames his racket is held out to the side in his RIGHT hand \u2014 which is on the LEFT-HAND SIDE OF THE IMAGE \u2014 and his other arm is stretched DOWN AND OUT to the RIGHT-HAND SIDE OF THE IMAGE, well clear of his body, with the palm open and facing the ground as if patting a ball. CRITICAL: the two bouncing frames are otherwise the IDENTICAL drawing \u2014 same stance, same legs, same head, same racket, same size \u2014 and the ONLY difference between them is the height of that patting hand: in the first it is low, near knee height; in the second it is higher, near his waist. Draw NO ball in any frame.", "palette_ref": "o_idle1" + }, + "marvin": { + "sprites": [ + "marvin1", + "marvin2", + "marvin3", + "marvin4" + ], + "ref_only": [ + "x_boymop1" + ], + "anchor": 0, + "check": "loose", + "subject": "The reference is ONE young ball boy in a WHITE polo shirt and WHITE shorts with brown hair, seen from the FRONT, holding a floor mop. Draw FOUR frames of that SAME boy \u2014 same face, same brown hair, same white kit, same white shoes, same size, same front-facing view \u2014 with a gormless, dim-witted, slightly cross-eyed expression in every frame. THE FOUR FRAMES ARE FOUR DIFFERENT POSES: (1) WAVING hello with his free hand raised beside his head, big goofy open-mouthed grin, the mop standing upright in his other hand; (2) POINTING away to the side with one arm stuck straight out and his mouth open explaining something, mop upright in the other hand; (3) SHRUGGING with both palms turned up and his shoulders hunched, utterly baffled, eyebrows up, the mop tucked under one arm; (4) TERRIFIED \u2014 eyes wide as saucers, mouth open in a yell, both hands clutching the mop up across his chest like a weapon. Each figure stands upright at the same height with both feet on the ground. The whole boy and the whole mop are fully inside the canvas with clear space around them. The canvas contains EXACTLY FOUR figures and no others." } } \ No newline at end of file diff --git a/assets/marvin1.png b/assets/marvin1.png new file mode 100644 index 0000000000000000000000000000000000000000..036927f63ec433ce9f23e6a41dca280d239d7f2c GIT binary patch literal 17390 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 _(HaVxwD5m(c3Ic|!mHh7ZdkncT{gD(w z1MIR=rE|99|1pfyOvG!{_icDpk@fKdxt*ia0&AZ0hk^KSASplQLG4T<&2}TSdNKi z6@V^|2j9Y?{!3JP;ykvf1^4tqtrZs<092;(#sU|If?V)$H}8&D43H(e)pEtfn#MYe zUYi!JHQbN#lCtCi`dsp`x8HXtR6qC)#wbe#P2u>2KCq5ku{AD@+MLp5sD+^ilIE{R zjuBmrCEjf}nB}d#VA?@sYB+1}K&yhZh3;d}NGM$t8`C228r2jD2GuvOt?k0y`G-X} zhqvE*0i61eGY$x_#}c*F79V+jda^!F!PA8%PV+h4VHE3y6Jg%7KibbVrJ+OT)pl~p z)tMeshv4zHTm@K|68PR8DhWPMJ_jNA`>!(&!t$fxNU{Mk;+l(bn+CmN0Kde-K}~>R z-ZYr4SWP>pe(u2>kH(Us2VxxaINnRp)gwm@yu2z}@1hhcD`lEef9(PT31d<^M7>LCB~(3d5NM62oVoJ7Ir#@1s3;;y9)U_wew*>PnS( zZOgPv#*hztbUASTk24M_+MC&J!8WLjk9J9K)J;#2hsdOt2O>j8ymzx4@ro&@13_f>x;51qvWH?%Ce@+<=QBawmIb=W*qM-h0y-G)c6b- zXf~Zn_Kvji{(P`=a5Fy?43wHv`u5e?sbQ>(#hjxC*iHlumd-Fk^nL1{=egD8zn|cS z!>whx(FxN+z#%Vg8Nt$kGh|lK>t+4`- zJxX^)eYt#9NMX<8Kgl>Ki@~#lSqS)Xd*-tVOl;2>58AuF6fz!9I*ftrIzInuL&~8I zzQ=x{MllHniP_J9*88F+3~|O|{O_lf#UOs;#^`sl-VDgwc*ld!zG;|57Muiy({wIL zeg$YO8U1C(Q9>>BZG+T93bW=HCmZ%7qtZ4bxXC-X$65-&vuUA_LR~MR^KBY$2x&tBGIWSwYK$s+YI{;dsQHaU7e`=@dz;kbNQCz2fcYU zx|MtPED-)iR{YqMVMr`?%Chz)?+u*~3Fk@pC|c99xzYKlVHuNhh%22_=-f2pa3)ry z8Sk(3#FKN;giSU~0M!hJ8RCLEV6XmP-xJfjl$rI2te!w(~L4*&vh2c=9Pp za}0C_X4UG9^UyFEN?xMkqZ{x8hU?Et99%afz;~y_I6zA~eU^+MgOOSZrk)!DfcOF9 zfZ@Jl+(rR@=bSmCqRcrV89k4~?6|^WTo0pdfk{U)tg5Y z^)q$%tpi{V6?!Ij-sNFC7J zhjOLWcZ=E|!#I5dlA;3@V($k4vA(GGB0f1kLE2n8sDAURsxNf~uL;Jly5^XN(C%A; zffo0d3EUWW1=a##jbQep|ykRaZ}xJ@36g8m9+HsKEH@$7Vk zY{^YC4wjb98GD$$Nf(>Z)@)GEOHyt&`l((Lq*bvgdQDqIu*F3y1J>3-}_VnG#v;Z_*yU|PbuQS_Q6k0Xf_G`UW8ze!cyB;$Z(JW+{s zKtB|AqwsblI!J?3CwRXv=1DAO1jcbB<5{S_yxh4-#%b!deSv!rJI%cBp#4xG8aZwe zbNy0vm1>7SZsT|8KTa-pMMP@%$ZHuh&eX4u(S}OOXdVH(eUue53BT*%)=r zHX#)i(jtj&P4 z&Paei$T(P3EG`gyU<@=C@HQl21UalD2Sd3u32≫2yuhEu||SJfpef>@nzFyzu?1 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 literal 0 HcmV?d00001 diff --git a/assets/marvin2.png b/assets/marvin2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fd47f30a4c5b92930d2c690ac136cd5133b17b GIT binary patch literal 16388 zcmV+fK>NRmP) zD|qT!6Nab%b3|lhWMm`~i9{kRD=RB2E4SRTva%A1L?V&MNMvLj|MSkQNmjV@3T<|q zIfq>?Aqnth)?B~2l0j55Np~Xk8@`Q1|4k*k+Q?@3_P$uI%Qzlas_EEmDGs=GfNXm!K2iYXW1TLO{3Oz zEmdWJ1+4nF;-941#-wf@Cz4!kr2Nv)_tWK90XCOx2T;>Akvw;h)e6QeO`FH3CDCnB z#nrZwDrnhqTd9^#4E2owXkJewm9=bs)pva5Z>f&7@9We>?oDZwvw_0vX*_4%PWHS$j zu-JR#fAZs^09yqKU_BC@`mh`eUin{jwnBs;36B$hZtw7%7Z+0#MiatlgZw(c=8|h{ zRc+N~NsiX%cS?-)6esG)J{qkX9575=w~I9wk?e!j-h~r58ReoOUrk;N^6LPrS*wI4 z8SN&LXQsv8h1dG{!!|~HDDnO^@<1pch-q4XO{BOPOD^dmU z)PiC~y8;dk=10IS@+^d%jtC&)JrTsSJTtB7*{ywCH(|2&Dc7>tv!;357=)*PHDVFM zUzJpV_5$C@&yybk*j&;b04NI6stP)?Q5B&pLk~dd0`)MXm1UW1x0TwK@ynaC?8IO_ zVSwgM6H7p}DO`)q5``en3uw{$mSEWG#lZe~A8BA;5o(b^%l-zyW|C1AU^Zh2C22S* zI6XWEF!DTaG@Uy|F)GdG45?RrBG!zpcrAgw$G`?a0cV?INQ5YtZ|fSH$7KL6gCt6PPtE6pCLc2fnXbp@?k?{QR|D95KQ>jo^X=~4iqS?zs*5pAx=s|~d5 z8_;SgqLz0B&<1d80z;2kOIByQ?U1(pxf-@zfWz_}s;SH|3g8Q9Gmx4WuiJ$5EViU; zJ_VYGu{48KHGpbN0k=KEv8Y(zQKJe93nZ z0b&JqdxW5UZGTqnWjC~ElB8N23s{RRkx`NBhG|vHIw@t#eJ+Hw)vWB^KpM_VHEnop zC_ntU8deLjLxD*gJAG@Wpnk2Ldt2t3^^uXZ_(6N(e<3h%xLbWfkUXlXS zQ4wi+*RED~fC*ujm{)xHe}nu;z>tn3 zt`=yUt-LMG8~}l{$w;P?aTC0<(3)LLY_9QuC}z<(|-D$3vZC016XSyG%-)T zez{8J$YWcAagMf)!=?7C+O+`H?iYE{*`-!yg=ePIu}sG!yLiG0Sja4uB1?l!8**@Q zwybduBRLZH9pnetuvBGX6B5#Dp>yKLKGFosLn{XaIKf^GEiW-30Ts^EWK?LjD=2i0 z9u!$7v&q<&e~s66tYx#Si&XBiOrGXTS*}ZcpC8{M7IBMCTkSQ-4+E@9<0N(auK?Xa ztw0pvGP~66MRV0ORT{EW2)IQn;y{f@xjZkHO zkz^&S^(L4Imj3nltzSS%J#-@cT)-m16eN~v{Z+>~1!9T83P^M}XtvC{T)l&Kl&3Ns z7j_X)Y)z;tOI53Cy@GcWydoB2P2_eqQ6~%&Lig- zQvb^{TK3pL;b~Gsxp%XA3yXqBM6Rb}85Nl|Er#P|cQebPg=(+;I)qk|6Png;`MA(y z0^TRp+R+lx1n8$~W2^>NtCaF07mKA@Tek)Cai-iqn~X+Uk_Z?9s%p;& zJD3HBXYh(d&0M}Un%W`_?aS?7y&!&E%hI{!p9HLn!LMD`5pS_>EnLyyeJ8@H_Jb|! zv+*b_@36jDII4R|GzV+`yz0y+b`h;M>rV2*x^1hb=tj?(W(MUf5Zb@b@U8r8`DX#! z=Jp*BEpXM_kAnSihRffF12xK085b6I(q%h1Yh}4@?AvzF_C~)yqI&>vce)cTo3&b( zvRJO0=RLMcDi_V31enSv3i40ZyT~yjRV#c zbz1@Xs1CMpbT-z{#l^N^{WoV%%M4Q43}uBs7qF$2BoD4U+tn>rX@TiU1uNe(P+6e~ zS`TNcup*XnE6de76mpx^jk^sjWacG_ZLv6SHk;OCu{?I?&S;BTz_$D2xFixhB`cB) z&el%`tON%o(`7W)sNlxTg{J75f0S0pOIa;8;3a~dy<*ueqV8A)b?9)7%>wqlT&}{g zYHM;tLNsErSZU`0z@LmU8CnN$zF33{!H#3RhS?Pt;2=L7u!jzjfyTgR%Q2c2dvU!f zLq^KmUnrV(utzb~un$1Fp+g}Qz{E%6f>>=zjny`pwE%RrNkc*aV9r;YmIVg>t|q2W~h@zHk(aolOej0$tWoDAx+Q&z|wN9u|>@$ zRg%})?o#xU-ZCAv{p(^oos8t^=}9|f!59evFT!r$+r6Vvg1VOZaxLTOO#VJTc8)ch z&171PWICP5-Sup*6tLw!;C${M{>WrH)mO^0)c4-r-OBURQ)sCf8V-8_SgNRsQL3p@ zemu0_Vp*!KxxGMFXd>yA)Lv$2E!Un%0Ib@Km?ScrOtjr)p^lC%*V;`RoF%8t#PLFl z-rwIJezrW9)oLZxwv0*`Ba@5nvhoX`GdW?TrA|z!-GF*f2*xbMwuomoKbNA?YEl*tv7C(ED9-IIEm0rfm$gb z%lFe9&s_VdwIr}!tQv>R&eQ4*SQTbzs#_EFiOh>Wsa zR+~-ed^OOaNvEScBG+gyCN&dyUy;jdy_VJEeTHZ_vYvDf5E`$cQI@;xWqb7(Z576KwBm!SSxQ6yZ zW`le=V2|5mmo*9O2;RMF2?2^vFlzw^w(DZCY*<-hv(uvtjc9Exd;*qD&|;O+2r}Ge zB~%tWTUr(vk_J{xo@fybf3cshr?Zge_4GlT=omC?PnrF>Q1Ng~(R zQ?14VfEISM5SJztLgS*PYhM!Qfj86O;m@OHw5*QS>I)EyENta^I$&KD_il+o&^f`4}Z1skB%);rt8gCbNcS^j7Fn&j%@wR?|J;{auXGY`CECt?9$B8I-n#5GC!`)i`H=hq{#oRBQzZG~{ z#8+n@#7%~hE%R5qA*l#^~5CThxQ0<(^opq zGei%JD$~HTT&=W{D{f@;sV^q&XTSztZ7QuzsDd*$nLt4ltlF@T`TSXKZ*P_7V6j|k zq(CK5*%PUdS_`)ahpTTL2Yu1DBo>s}T5VdhK+%?)%~sagCJ?%L2FohF;$_}U(?r=? zi0vXbH#Z%Efk$~!=TY};-NLAj!b+(W0qQL zpuJV0M%F6My71#)wk33BMJ`6X5umTzWSTTEih85?^7qDS z(&3EN#>I6h^ToP%-^srw7XhqmsJ`;^x`y+zg2$)1YCmk+ZVzq{;RF@Ch^*49Tew1#W&=*3a0NZl8+DI}kG^nrh zXq)jyR)h|h0I^vj2;3<2Ht`Z|ODa$#&OX&Z2ys`;2?y&&LXE*7J*kKFetmt^PZetf z9A556D^DuRvXtlLMy6wHtD%uGcBz~)lX_ZGvp2WbR$7P?6+AOcfNcqBv3(Jk5tbxK zlzSF~WRM;faFa3eo~k}-SK^-@?>Doh)*wGc*UyWUT+b$wtV;zl+P0Bs_6Mn4n+b*k zX9)=_;PwI;n~{KRyk3`sDezC21U*A+u7i}TT`?+TTWw{_+yY37b*`)x%q*50d7dw2 z1yNj@%FS#Ndcd4`BSZ)E!VCmiLG)f$sEI-9m*m811z3}-fl9N-nJzL$`-RPY5JtRT z-(1URJkpkJcmfdXvNeDLORBm6TUj!TcC8*ip;;Zi5%#2ZZpKm{J7`ujJ72FP%?nv5 zSg~6N-q&7hSS4o*U8#Mk`D9Ezw&v~Kot_VDEc-&OEZY!o#Y7L= zfIZ7#gl3YB^=eUHKt^o6c$QkzuLD^74cO43+VJxAAhtznRvB6T+=n*wK%x0J7{pJd1(p64rdw44E!W0M~CbJ-spH*jlx zYZD?Fol-_QZQkKI^+syC0d^Ev%NL9Be3_F)Sjx>6m<5-kk>>Z)oGw{!D4?`3mwLU{ z?pflfL}x9vTFYWvHu2?{RV$`DszYITL=mF}IP3N50I+EOVdVTb0amM#j`b@g-@_-R zMK9>OkSf(0*MK&-ud=5nS+ACoRcRQRWUm>2Y|9ce!90Kkv96ThP0iM*tk5-V`^giT z&93$0usYc=;U@TPF+(^bK$F_Znf1Rbj}Z^@O^E|+!*X+ZJGKz!U{y`G!FVzb{auwT z7DkK_%iq6$mGkQ9@vjlr=|pY=D&V$BG)4oD=4D^ZHSh>7AV#AS6&Q`j+A_oa$Hzwv zdr|zNZQ)^-*fGv73dXsyJ?B_$t6jQ1>@C~(1S+Y1Wyb9MfIZSW+r&HTi^f)WXePiq zyPj$3AIq|K90V}z3t*z^3iIIZ_D23b&E@ubDs_dE#n27FX3nE=5z*Ar&QQ=MZl|Cp zG?rs>SOLs@KG!nC*BTo+M>8Kp9v&X_;!=A0XjVfkv)Rmg)+F5>BLg`mL34*kFKurO z;+-BgjdGOlA_VN7Q+t2^$j7{!W5c2SnT=FeUqGZ`QeOzDWUW~C$J4QlM`LBp1_1H$ z@5R_e2H*^c1)ynW>-t9KPml7nSVHJvs zx(y4-Lfg83chxS_u}pF9@^p7}&3T3KQyd!-z0Nfo)fXMbi`N&2`?ekJ^&-zti%XaU zZIzRLnfuS5NpMyw+3xsIfK>Tgr_+{3GZLP=ySvlaE5O=+9dM&*A#hVZt~!%C4NNbd zdete2xq)6mZk02hhPJ7TPAr$}xs*pjXK$5LnmN%CqM0^1wpMrKL#Sr9#~R7NjL~cz z++xOj7JKyIM{r2nlP=~Lg(>D)TRfYr*jrQ zLn1_9LR?#GGE#M&cV~CHeC5{xYN@fM;BXN_KL=>ZR*?XJ3n0mIna!pORzP=3tTh`O z^G<=euVr<=d9E`Eus@$3AB`|$Tge3NI}X)Y(1(WQTeZ=q)XxZ@0Vs6^h+h;O@BES| zSe4W+VZeu-kA!cx3~Vz-yA%NWCUd}MkEx8?Eq!97jz*0D=YWm1CD9eFSnDW+Zeqn) z9`~MaxOMGmPkGbvObpz}OKj}wMT%eaZ@8m;SI3#tKDz%Mq`){-fByV=Q=Hc|pPg4c zuINy(I{_SETR>o3*D@Lvp{&r02J8ziw?;*Ob9WaN{2U(hoRUQK46dDA6%SiIy!5zkjZ&% zShIyJ+f%2Z)#Qvqn@g1toPR#5B~P9eMc1Q|+}_?P7}2tT{gj}si6HRB-rwHp7w1#F zJ^gA!HY`D)S}09*d)4$8%9U&bt&(3H4R=_yO$RD|zM;j(SLOGub8%bn{sB$_^Y972 z8;fPzlt~Et(4Z03+1@4P_re7usZQIuP@8wl)_0CyFQip>X_3mGhx@=F_&(85og*73 ze`-P^!fSvTFQ4Pw-QUaKKM!hGG37r?2#?=AB$3Siv?J_g$B%cgsni#(^bC^&o; z{n$^WgszQ{JG@97)(vz2ZsP-gLln9P5cr=+bvk%yo_x}0wSN{Gzt-U`gPF`1sP#QN44ZFrXf*SyV zO&f}JC9RAG)HiRdmfQX`*KF-Jds&i5DVcq_wUAzgkH3X`j=u5WFFP0T6vg(6VHp5E2Hl;6xAy1$@}CcX#(1nj)cq2{4{a z@qUTtQa=oyOGX6sIW0UYVXxOezYa4jv!U&lw1vubp?Dwvp zvuD+|7f1Jiem~Uvk~nGl;rxC3ZE=B*LBBV9MX5^zTMi|f8hYzoD&NvI`?eE!O}0{L z+7hsy!-*lPzz+yu6Ub|h+F=GSJ>{PAwRaQm|G3lTbIBUt`HE8lVO?x(KyR!f&TdFPc z6G-#I=G0*TLJeOM*2uojp7#fx zEV5U3_jgS==^Ual(z4WxU=c!D{J3aV02^Nz0Elf^!e-akjk5-T)pren{#g5Kymr0T z?N15E_xB=bcI4DWX(Y`{f22QjUHfq7!%&lh!-qF}-NIq`sB;ke8>U9GXCDZy(;-XP z89nP|scE0RTUIN%qf?_S!v)tyO{OGOvW)?pOkTN_$#|sZKt@E;l!~vRW;5`+X{bmB4Jc)w8<0DT2{?28ZI;gzfa-)YQRR`Yx0Q%0mJBsw~m-fb7lc# zEd83`$g&sh<7V!G&IF@QV4*?s_1ZMpKFHLuc{P$jW(gvXLN%w4iqg>45nYDn&k>?G@+*(KdSxRNzv(wn$|T?z9ee^8zxL5x?D#~sfC9Q0S~wt z*VKNX7O-ru6C*p-0wGKvfT@E4YY8ptM;C3Vp!iU``C_B3Lq_augQHpgGg7NnrQ8mr zjJenr43FN{O;X@3eQ&+yC2&Bz6%_p7EVakNRp&V&GZB2)G50?b6W#}*j}q-vqrHnx{UJ=#VZmXRQhDPO- zTAyGUGb{V_Y?k-^0oS*7Ui1>Mg%rCoDK)J0R`A7Td6yIoafKMIE#)86uw>HM2O+S7 zeRvGpAGR-ugOuBGa9yGX7Mwi>6aADz7Vn%0DO+ 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
    +yRA=vUcfLJ2lHWPuQTDDJ5?

    tmdn*YKA-iGh{HCHr(7y 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 TX)4+500000NkvXXu0mjf_qE%m literal 0 HcmV?d00001 diff --git a/audio.js b/audio.js index 200c1cd..8137b7a 100644 --- a/audio.js +++ b/audio.js @@ -111,10 +111,10 @@ export const ambient = () => loopBed('tennis-ambient-loop.wav', 500, 0.035); // // 982597 frames at 48 kHz, which is the un-round 20.47077 s below — an AAC loop needs the SOURCE // length as loopEnd, not the decoder's padded one. See the note on menuMusic. export const zombieMusic = () => loopBed('zombie-mode.m4a', 800, 0.2, 20.47077); -// Menu theme: the splash, the court picker, the death summary. Barely highpassed — this one is -// MUSIC, not an atmosphere bed, so the low end is the point. Started at boot so it is already -// running by the time the title is on screen; on a phone the autoplay policy holds the context -// suspended until the first tap, and it becomes audible then (see loopBed). +// Menu theme: every menu screen and the death summary. Barely highpassed — this one is MUSIC, not +// an atmosphere bed, so the low end is the point. Started by the FIRST TAP (main.js `go`), never at +// boot: a title screen that starts playing at you before you have touched it is rude, and on a phone +// the autoplay policy would have held it silent until that tap anyway. // AAC, not WAV: 48 s of stereo music is 8.3 MB as a WAV and this one downloads on every page load, // before the player has decided to play anything. 768 KB encoded, and the master is exactly 48.000 s // — which is the loopEnd, because the decoded buffer is NOT (measured 48.0174 s in Chrome; see the diff --git a/index.html b/index.html index 4d92596..3ef920e 100644 --- a/index.html +++ b/index.html @@ -76,29 +76,54 @@ #build { margin: 10px 0 0; font-size: 9px; color: #5a6270; letter-spacing: 0.5px; } #intro .start { margin-top: 18px; color: #e0cc72; font-weight: bold; letter-spacing: 1px; animation: blink 1.1s step-end infinite; } @keyframes blink { 50% { opacity: 0.25; } } - /* court select — the intro's second stage. One overlay, two panels, .picking swaps them, so the - backdrop and the card frame never flash between screens. */ - #courts { display: none; } - #intro.picking #splash { display: none; } - #intro.picking #courts { display: block; animation: drop 0.3s ease-out; } - #courts h2 { margin: 0 0 14px; font: 400 11px Silkscreen, monospace; color: #e0cc72; letter-spacing: 2px; } + /* ONE overlay, four panels, swapped by #intro[data-stage]. Keeping the backdrop and the card frame + alive across every screen is the point — a screen that unmounts the whole overlay flashes the + court through between menus. */ + #splash, #menu, #courts, #tutorial { display: none; } + #intro[data-stage="splash"] #splash { display: block; } + #intro[data-stage="menu"] #menu { display: block; animation: drop 0.3s ease-out; } + #intro[data-stage="courts"] #courts { display: block; animation: drop 0.3s ease-out; } + #intro[data-stage="tutorial"] #tutorial { display: block; animation: drop 0.3s ease-out; } + /* headline: taller than the body text, so a screen reads as a screen and not as a list */ + #intro h2 { margin: 0 0 20px; font: 400 15px Silkscreen, monospace; color: #e0cc72; + letter-spacing: 3px; line-height: 1.5; } + /* one button look for every menu screen */ + .btn { display: block; width: min(340px, 84vw); margin: 0 auto 10px; padding: 12px 10px; + background: rgba(255,255,255,0.04); border: 2px solid #3b4354; color: #dfe6f2; + font: 400 12px Silkscreen, monospace; letter-spacing: 1px; cursor: pointer; + -webkit-tap-highlight-color: transparent; } + .btn.go { border-color: #e0cc72; color: #e0cc72; } + .btn.back { font-size: 10px; padding: 9px 10px; color: #8a96ab; } /* a row, not a stacked tile: three 3:2 tiles stacked fill a phone twice over, and the art still reads at this size. -webkit-tap-highlight-color kills iOS's blue flash over the pixel art. */ - #courts button { display: flex; align-items: center; gap: 12px; width: min(340px, 84vw); + #courts button.court { display: flex; align-items: center; gap: 12px; width: min(340px, 84vw); margin: 0 auto 8px; padding: 6px; background: rgba(255,255,255,0.04); border: 2px solid #3b4354; color: inherit; font: inherit; text-align: left; cursor: pointer; -webkit-tap-highlight-color: transparent; } - #courts button.on { border-color: #e0cc72; background: rgba(224,204,114,0.10); } + #courts button.court.on { border-color: #e0cc72; background: rgba(224,204,114,0.10); } #courts img { width: 108px; height: 72px; display: block; image-rendering: pixelated; flex: none; } #courts b { display: block; font: 400 11px Silkscreen, monospace; color: #dfe6f2; letter-spacing: 0.5px; } #courts i { display: block; margin-top: 5px; font: 400 9px Silkscreen, monospace; color: #8a96ab; font-style: normal; } + #courts .acts { margin-top: 16px; } + /* tutorial: Marvin on the left, his line and the picture on the right */ + #tutorial .page { display: flex; align-items: flex-end; gap: 14px; width: min(360px, 88vw); + margin: 0 auto; text-align: left; min-height: 190px; } + #tutorial .marvin { width: 84px; flex: none; image-rendering: pixelated; align-self: flex-end; } + #tutorial .say { flex: 1; } + #tutorial .say p { margin: 0 0 10px; font: 400 10px Silkscreen, monospace; color: #dfe6f2; line-height: 1.9; } + #tutorial .say em { color: #e0cc72; font-style: normal; } + #tutorial .shot { display: block; max-width: 100%; max-height: 108px; margin: 0 0 8px; + image-rendering: pixelated; } + #tutorial .dots { margin: 14px 0 10px; font: 400 10px Silkscreen, monospace; color: #5a6270; letter-spacing: 3px; } + #tutorial .acts { display: flex; gap: 8px; width: min(340px, 84vw); margin: 0 auto; } + #tutorial .acts .btn { margin: 0; flex: 1; }

    move: WASD/arrows  ·  serve/swing: SPACE  ·  aim: hold a direction while swinging  ·  T: tuning panel
    -
    +
    @@ -113,10 +138,35 @@

    TAP TO START

    - -

    CHOOSE YOUR COURT

    + + +
    +

    CHOOSE YOUR COURT

    +
    +
    + + +
    +
    + +
    +

    HOW IT WORKS

    +
    + +
    +
    +

    +
    + + +
    +
    - + diff --git a/main.js b/main.js index dabd727..c92345c 100644 --- a/main.js +++ b/main.js @@ -39,34 +39,97 @@ setupPoint(); // warm the pixel HUD font so the canvas never paints a system-serif fallback frame if (document.fonts) { document.fonts.load('700 8px Silkscreen'); document.fonts.load('400 8px Silkscreen'); } -// intro overlay, two stages: the first tap opens court select, picking a court starts play and -// unlocks audio (iOS needs the gesture, and the SECOND tap is still a gesture — the pick is what -// has to unlock it, not the splash). +// The overlay is a four-stage machine: splash -> menu -> {courts, tutorial}. One overlay throughout, +// swapped by data-stage, so the court never flashes between screens. const intro = document.getElementById('intro'); -const courts = document.getElementById('courts'); const lastCourt = (() => { try { return localStorage.getItem('court'); } catch { return null; } })(); +let picked = lastCourt || COURTS[0].id; +const go = stage => { intro.dataset.stage = stage; menuMusic(); }; // every stage change is a gesture, so it is also a safe place to (re)start the theme + +// --- court rows, built from the table +const courtList = document.getElementById('courtList'); for (const c of COURTS) { const b = document.createElement('button'); - b.className = c.id === (lastCourt || COURTS[0].id) ? 'on' : ''; // your last court comes up pre-picked + b.className = 'court' + (c.id === picked ? ' on' : ''); // your last court comes up pre-picked b.innerHTML = `${c.name}${c.sub}`; - b.addEventListener('pointerdown', e => { e.preventDefault(); e.stopPropagation(); start(c.id); }); - courts.appendChild(b); + // Tapping a tile SELECTS it and nothing more. It used to start the match on the spot, which gave + // you no way to look at the three of them and no way back out of the screen. + b.addEventListener('click', () => { + picked = c.id; + for (const el of courtList.children) el.classList.toggle('on', el === b); + }); + courtList.appendChild(b); } -menuMusic(); // the title screen has a theme. Silent until the first tap on a phone — see loopBed. -function openPicker() { + +function start() { if (!intro.parentNode) return; - intro.classList.add('picking'); - menuMusic(); // ...and this call is the one that resumes it: the tap IS the gesture -} -function start(id) { - if (!intro.parentNode) return; - selectCourt(id); + selectCourt(picked); menuDuck(true); // the theme belongs to the menus — hand the court over to the ambience intro.remove(); ambient(); voice('quiet_please'); // low atmosphere bed starts with the first gesture } -// a tap anywhere on the splash opens the picker; on the picker itself only the buttons act, so a -// stray tap beside a tile can't start a match on a court you didn't choose. -intro.addEventListener('pointerdown', e => { e.preventDefault(); openPicker(); }); +document.getElementById('mStart').addEventListener('click', () => go('courts')); +document.getElementById('mTut').addEventListener('click', () => { tutPage = 0; drawTut(); go('tutorial'); }); +document.getElementById('cStart').addEventListener('click', start); +document.getElementById('cBack').addEventListener('click', () => go('menu')); + +// --- the tutorial, narrated by Marvin the mop boy. Pure data: a page is a Marvin pose, an optional +// picture already in assets/, and his lines. +const TUT = [ + { pose: 1, say: ["I'm MARVIN. I mop the court.", + "Lately there is a great deal more to mop.", + "Let me show you how this goes."] }, + { pose: 2, shot: 'court_grass', say: ["First it is just TENNIS.", + "TAP once to toss, tap again to serve.", + "FLICK toward where you want it.", + "DRAG to run — though he mostly runs himself."] }, + { pose: 4, say: ["Then, at some point, the other fellow...", + "stops being the other fellow.", + "Nobody stops the match. Nobody ever does."] }, + { pose: 2, shot: 'x_howto', say: ["Now you do not rally. You AIM.", + "PULL BACK from your man and let go.", + "The further you pull, the harder it lands.", + "A soft one only makes them cross."] }, + { pose: 2, shot: 'w_bomb', say: ["I bring tins out to the rack down there.", + "BOMBS, TRIPLES, FIRE, and the GUN.", + "Tap the rack to load one, then serve it.", + "Do try not to hit me with them."] }, + { pose: 3, say: ["Sometimes the umpire calls order back.", + "One point, tennis rules, against one of them.", + "The lines are live again. Do not miss."] }, + { pose: 1, say: ["That is the lot. Mind the deep ones.", + "And if it all goes wrong —", + "I will be along with the mop."] }, +]; +let tutPage = 0; +const tSay = document.getElementById('tSay'), tMarvin = document.getElementById('tMarvin'); +const tDots = document.getElementById('tDots'), tNext = document.getElementById('tNext'); +function drawTut() { + const p = TUT[tutPage]; + tMarvin.src = `assets/marvin${p.pose}.png?v=91`; + tSay.innerHTML = (p.shot ? `` : '') + + p.say.map(l => `

    ${l}

    `).join(''); + tDots.textContent = TUT.map((_, i) => i === tutPage ? '●' : '·').join(''); + tNext.textContent = tutPage === TUT.length - 1 ? 'DONE' : 'NEXT'; +} +tNext.addEventListener('click', () => { + if (tutPage < TUT.length - 1) { tutPage++; drawTut(); } else go('menu'); +}); +document.getElementById('tBack').addEventListener('click', () => { + if (tutPage > 0) { tutPage--; drawTut(); } else go('menu'); +}); + +// A tap anywhere on the SPLASH moves to the menu — and that tap is the gesture that unlocks audio, +// which is why the theme is not started at boot any more. Every later screen has real buttons, so +// the overlay itself must not swallow taps beside them. +intro.addEventListener('pointerdown', e => { + if (intro.dataset.stage !== 'splash') return; + e.preventDefault(); go('menu'); +}); +// Coming back from a run: the death screen reloads (an honest full reset) and asks, through +// sessionStorage, to land on the MENU rather than the splash — you have already seen the title. +try { + if (sessionStorage.getItem('splatterStage') === 'menu') { sessionStorage.removeItem('splatterStage'); go('menu'); } +} catch {} // which build am I looking at? Push = deploy and the browser cannot see git, so the served file's // own timestamp IS the version marker — it changes on every deploy, with nothing to remember to bump. // Match it against `git log -1 --format=%cd` when a phone looks suspiciously out of date. @@ -74,19 +137,29 @@ fetch('main.js', { method: 'HEAD' }) .then(r => { const t = r.headers.get('last-modified'); if (!t) return; document.getElementById('build').textContent = 'BUILD ' + new Date(t).toLocaleString('en-GB').replace(',', ''); }) .catch(() => {}); // no header, no line — never a broken start screen -// keyboard: any key opens the picker, then 1..N picks a court and Enter/Space takes the -// highlighted one. Not `once` any more — it has two stages to get through. +// Keyboard, per stage: a key leaves the splash; on the court screen 1..N picks and Enter starts; +// Escape backs out. Not `once` any more — there are four stages to get through. addEventListener('keydown', e => { if (!intro.parentNode) return; - if (!intro.classList.contains('picking')) { openPicker(); return; } + const stage = intro.dataset.stage; + if (stage === 'splash') return go('menu'); + if (e.key === 'Escape') return go(stage === 'menu' ? 'splash' : 'menu'); + if (stage === 'menu') { if (e.key === 'Enter' || e.key === ' ') go('courts'); return; } + if (stage === 'tutorial') { if (e.key === 'Enter' || e.key === ' ') tNext.click(); return; } const n = parseInt(e.key, 10); - if (n >= 1 && n <= COURTS.length) start(COURTS[n - 1].id); - else if (e.key === 'Enter' || e.key === ' ') start(lastCourt || COURTS[0].id); + if (n >= 1 && n <= COURTS.length) courtList.children[n - 1].click(); + else if (e.key === 'Enter' || e.key === ' ') start(); }); // eaten: any tap or key restarts — but only once the death animation has played out, so a // panic tap during the gore burst can't skip it. A modal owns its own gesture (see input.js). -const maybeRestart = () => { if (!G.modal && G.mode === 'eaten' && G.eatenT > EATEN_RESTART) location.reload(); }; // ponytail: reload = honest full reset +// The reload IS the reset (nothing here has to unwind a run by hand); the flag is what makes it +// come back to the menu instead of the title screen. +const maybeRestart = () => { + if (G.modal || G.mode !== 'eaten' || G.eatenT <= EATEN_RESTART) return; + try { sessionStorage.setItem('splatterStage', 'menu'); } catch {} + location.reload(); // ponytail: reload = honest full reset +}; cv.addEventListener('pointerdown', maybeRestart); addEventListener('keydown', maybeRestart); diff --git a/render.js b/render.js index 4f1da2c..9d437a9 100644 --- a/render.js +++ b/render.js @@ -151,7 +151,7 @@ export function proj(x, y, z) { // ---------------------------------------------------------------- sprites ---- // assets/.png; game falls back to code-drawn figures until sprites load. -const SPRV = 77; // asset cache-buster — bump with main.js?v=N (see the img.src note below) +const SPRV = 78; // asset cache-buster — bump with main.js?v=N (see the img.src note below) const SPR = {}; for (const n of ['p_idle1','p_idle2','p_bounce','p_bounce2','p_toss','p_smash','p_run1','p_run2','p_run3','p_run4','p_swing1','p_swing2','p_die1','p_die2','p_die3','p_die4','p_die5', 'p_pull', // the serve wind-up: the racket dropping behind him while the pull is drawn @@ -954,11 +954,15 @@ export function render() { : pt.dark ? 'rgba(96,14,14,0.9)' : 'rgba(170,22,22,0.9)'; ctx.fillRect(pp.x | 0, pp.y | 0, 2, 2); } - // machine-gun pellets: flat tracers with a tiny ground shadow + // Machine-gun rounds: they are TENNIS BALLS, fired small and hard, so they are drawn as balls and + // they take the perspective like everything else. A fixed 4x4 fillRect stayed exactly as big at + // the far baseline as at your feet, which read as square confetti pinned to the screen rather than + // as something travelling away from you. Radius is a shade over half the match ball's 0.09. for (const pe of pellets) { const sh = proj(pe.x, 0, pe.z); drawShadow(sh.x, sh.y, Math.max(1, sh.s * 0.04), Math.max(1, sh.s * 0.02), 0.25); - const pp = proj(pe.x, pe.y, pe.z); - ctx.fillStyle = UI.warm; ctx.fillRect((pp.x | 0) - 2, (pp.y | 0) - 2, 4, 4); // fat round — it hits like one + const pp = proj(pe.x, pe.y, pe.z), r = Math.max(1, pp.s * 0.05); + ctx.fillStyle = UI.ball; ctx.beginPath(); ctx.arc(pp.x, pp.y, r, 0, 7); ctx.fill(); + ctx.fillStyle = '#fffbe0'; ctx.beginPath(); ctx.arc(pp.x, pp.y, Math.max(0.5, r * 0.45), 0, 7); ctx.fill(); // hot core: it reads sharp, not soft } // the chapter boss's shockwave: a ring of blood mist blown out through the crowd noise if (G.bossBurst) {