From faed30c118b9b06f97356880fd676708d5209a50 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Fri, 15 Apr 2022 18:30:29 +0200 Subject: [PATCH] Minigames begin. --- graphics/Games/MadcatTiles.png | Bin 0 -> 1897 bytes language.def_menu | 3 + language.es_menu | 3 + language.version | 4 +- sndinfo.txt | 3 + sounds/MADCAT.ogg | Bin 0 -> 13651 bytes zscript.txt | 4 + zscript/games/swwm_madcat.zsc | 262 ++++++++++++++++++++++++++ zscript/games/swwm_minigames.zsc | 1 + zscript/kbase/swwm_kbase.zsc | 73 +++---- zscript/kbase/swwm_kbase_tab.zsc | 7 + zscript/kbase/swwm_kbasetab_games.zsc | 148 +++++++++++++++ 12 files changed, 473 insertions(+), 35 deletions(-) create mode 100644 graphics/Games/MadcatTiles.png create mode 100644 sounds/MADCAT.ogg create mode 100644 zscript/games/swwm_madcat.zsc create mode 100644 zscript/games/swwm_minigames.zsc create mode 100644 zscript/kbase/swwm_kbasetab_games.zsc diff --git a/graphics/Games/MadcatTiles.png b/graphics/Games/MadcatTiles.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a4b1e4994c4e574f4413d768d1d2d150bc3601 GIT binary patch literal 1897 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZa$O-TXab;j&2n`KgwQAM> z|Nlc77*;Vb{0|NNziL&eHp8k=hX1QV|6f@Z8p^P06~q7kq5uD{VgM@&{U5pt#0Dt> zss4Y30jvn5;{SgJ?NEl$RUj2t{xg6zfQ|ewS|Z8Lz`(Y{)5S5Q;?~T>9YmZH8~f7%s%x z?akcGFzwv|n}(c*2UgL)Eg8J!FUc|-W!jhj&zoU!@AP07C6*88`I!#PSK7s#@Ib4p zF_WR}sZB%Oh9I#s%mt`} zh~44hTzm2TGoMW_X1K{<_}bh%AwkZ;?7+OQ)qnq0K45bAm-9uriOoS@SJ2@XOKH_M zhgVD*iVgLPdvzNGFUbCz=2q``f&IbB-#?2}qPP>DX!SI%Tja`+(Z!Z}(4@g}Ly}kw z(+uzJ!3@iD`3`UdO4<|^pWkN8;J)z2LPK+xTz%@LYS*`J8F(-6{q4rSq0KS-)H(!1L`pBMY;O_SRob zzfBr0d_DP}pTVYOS6urE0f!f_^Y<4>A2?dKo=Jjz;Sck~O9{UmleDB~nY{V2gC~xu zplJTQN5(tF4jjtY^V4V0FsralOg5 z$@%`1STC?Cu1lYMz5ZL&TFvcQUA}79PR0Z?&uL@QWYoLN%OEYH6=Ah3ykW|lBUc@2 z8N0-V~FrS8hB;8??X*ZGv}3Wf3X~8AY?peNw2cKkgW_$y~aB#%mQbi&ugSx$;(3QViF&v_)yocYmB@uqfO) zCn`uKrr|{ox6Z~ZzRCSxLN|5_iD)g@-X5p1=%-YRavJmc)BDWx)_qykdGh}a_KDS5 z4yh|57zEc;ePxraOsQh^IJI-?{FvQ(v)?nVxU-&NgLVt|r}cR!q;B40Inc6HRH{2= zzbtEr@YeT?3F+CByVo3UTw<@O9X_*`;iyU9v)jGyde)u24h&38Hv}1e=Wr}AT^pd1 zQEqZ>iqFdSU)cv0<}}`K`S-Qi`}*X$zu)c9@>=T7uyL8<{wUMbNDD9hg`QL5ruuJE zd3{oap<#<~Ox*|F6OFy|GhSWL%@=UKJh^Y8&$8z;PGx_Pdm->#QRZ;i^$#azGidd? zNwAp9`)p|6R1+(F^p7=z(tM6j#*JRDPnw(xk-fZ^UBP}qad*)#x9MduSnTXy$So-osxR2Os5AUW($@|1-?1~?5N*=xci#O_ExzK8 z|9304oGIKhUwwO}*bv5FGqLKZxI*!UuAi4nN^d-T zI(~5?gA2=s(>^~9;%EFx@lw0ozvy>xP2#7?%{@*2tk0Qi5pvYWxvN(u5SaILQ?ijTOVT^rdHR2L zE&a%{<%@#&1J`-$Zco#%IV~PtI63~H?SkWP7aUg)zgY9C`*qiwwAbHQ;y?Ubb9~~N zA4TzNLQ>45x3B-nbV&4TqCDS=w>9_JkKHY~yYC4%hxZl!y^pwgqNQ6dm;Rol?^1Qj zWNPZp!{UBIUGdJBPfNTwc_IJ5SHiV@ea?)+o1Sv3YnYyw-zLtr+vv;xZ5=<^ERO7$ zs2e}SX6c_NaRMRX%W9q-ULkkC*T>PDG56DyPm`-1FUCrKp85086U&c`A6b^_UKO3Z zd}*AR?T&foZniuQ&pv0&`Popx)Ok8N^=scJv1g9P4>byXLV7A9CZ2hIvBGNB((mhQ z9=`nZApC*ReydZrCoNx<=PcVKYj5i;>*njHROKD4eI2(z z=)v}PtXd8Ecez~(_xwAx*TI%;M)5xP)_V*evi>oDX9~Ucyk>vUye#p8d*2v;e0{gq zVd}%bXDs(W@q9jK{;|Y+b3PZxF`vsl{&(5WMbo@Pr)_^{xxc44a^3SkahCI*bw7W{ zs@D8iKSdrHYqx-q*do4oCNL{xhE9eYJG9o2w}U0|SGntDnm{r-UW|*Bp-l literal 0 HcmV?d00001 diff --git a/language.def_menu b/language.def_menu index 08d410b62..8780a8dfe 100644 --- a/language.def_menu +++ b/language.def_menu @@ -643,6 +643,9 @@ SWWM_HELPTXT = "\cx———————————————————————\c-\n" "\n" "\cfUp/Down:\c- Scroll"; +SWWM_GAMETAB = "Games"; +SWWM_PICKGAME = "Choose a game"; +SWWM_GAMETITLE_MADCATGAME = "Boot Test"; // Wallbuster menu SWWM_BUSTERTITLE = "Wallbuster - Easy Reload Menu"; SWWM_BUSTERKEYS = diff --git a/language.es_menu b/language.es_menu index b544d7272..b41b5bf85 100644 --- a/language.es_menu +++ b/language.es_menu @@ -622,6 +622,9 @@ SWWM_HELPTXT = "\cx———————————————————————————————\c-\n" "\n" "\cfArriba/Abajo:\c- Scroll"; +SWWM_GAMETAB = "Juegos"; +SWWM_PICKGAME = "Elige un juego"; +SWWM_GAMETITLE_MADCATGAME = "Test de Arranque"; // Wallbuster menu SWWM_BUSTERTITLE = "Wallbuster - Menú de Recarga Fácil"; SWWM_BUSTERKEYS = diff --git a/language.version b/language.version index 0deea0198..49359a1d0 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r30 \cu(Thu 14 Apr 22:14:59 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r30 \cu(2022-04-14 22:14:59)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r31 \cu(Fri 15 Apr 18:30:29 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r31 \cu(2022-04-15 18:30:29)\c-"; diff --git a/sndinfo.txt b/sndinfo.txt index 2018d1196..e3a48b961 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -1601,3 +1601,6 @@ wolf3d/pushwall sounds/wolfstuff/wolf3d_pushwall.ogg wolf3d/ssdie sounds/wolfstuff/wolf3d_ssdie.ogg wolf3d/ssfire sounds/wolfstuff/wolf3d_ssfire.ogg wolf3d/sssight sounds/wolfstuff/wolf3d_sssight.ogg + +// minigames +madcat/boot sounds/MADCAT.ogg diff --git a/sounds/MADCAT.ogg b/sounds/MADCAT.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d9d80fbfdb68427ab1066ab4637581247e4e4278 GIT binary patch literal 13651 zcmeZIPY-5bVt|5=_FJ+*%qc&w|7VnAEXyxS$}9#6FgEN4Q49>6@!obEWcq$kf7#SFt8<;3)1f`~w zCTHfQE4b#BWftY<<)-G9XoAd@Vqjnh&d;k<@J~-yfNC_l|Iz`$VWqj0q0!h}!;1_1_!1Qkub$!VUNOQ$TZfW zLct_Ol!1YTp+SSQZ}BtFtaFy>66$?L3oJAJES4*CwJQQ0+f-;rtCuSl z_gTHt*mA*%TX)MPFCW9JVaeg{ zE~66=Zz(V|fWqB5z( zL88DpNlA0kV$Wr1S?e-qZ_8M{E%)>$ozt6mz)Bbx8CXEBVOWqkYZ(Sgi=3897&&B| z&|+|4VsJQKD093}#WhIfc##e}ID}6yFmNz91nC?tGI1|9IbLjYyx7LQ#O34^pR-?l z_`ymTn84A_z~EpgbF@(A%y$hXD#_=JzcO;WcKBQoguT;cdnc<8ytf< z=OiD`DL$upYUa@eGcU|4KIh3ZYbk_PDKwjX?aE8DiqA^1`fVD|U*^EeWw!d(ogonOz=jr|TNyX!+(FBSbBfP(-kP1glQVWs@wuNV zbKafh1c{+19|r~omc$zp$L2OE)b_C@i6|~poGe$;&o_C2;R($pa=m?SUMrgef+W?K zmNbEVuE4<1A^=XsFan&EA*p!Dq%N&f8k^4;oz?*nYYv~YdcEPWfHRNbmP=kbrdPv~ zd$&HDSG>;BBYWxAYf;)urv!OvE(M1lD1#`ZOmJkA1ZR@A8AYcwmoI4If&?cd;y$RH z7nHq-gwB7I2^3Nd6jHrtq#JB(8yXTCUX~j*4P`R_pjI9zup@!-iDsA;5moE zi9@jkoF}Iw^%x$X)9mNO35j4>&M6c*K2hf6L>2E%D!!L=&VDlS|7>zm*fr3^H&`_G zqG;)5vD9F**vqD=mqSypmZjd@mKwdiHgX#%w?Og?h`e43_97(bfU<~^W#40uNi5)O z0nRxKH2NM{^eKBzQi+_TRyi%bbJoh4^Ioo8#06G@$T=BZ%V%^g@928o(WlWlEwgjh zs-25+POW>riy(sM9QPs>_aacvaV=6o$~gxNWt@Xlj&IWO{S5J=?L}kT&=Oa1BWVZu}f21y16Wk)v27J;s!2~K&o z5gdlkR9F{UvMoF!(Xw2?n8%V=sbqqqy6uihmWO#hKM2wgb@6HLRWNVfct)~OG0DAQ*V9`jTEbk zzTW!qTkS&$kjdAtmWEENO}v(xxV`kgM&_){tVJtU&C*!4YUQeJxvSQ#jb8L()uL6W zHl?pxx8~HQ^{dzAyq=}8YTb%en{-yK(pkM}&F@t@ueYsOwQKFEO&eyfTm5?5d+x(J zuXh!!TDNZXrZ*tjU29(-D}24npk|ro>1C^5?OM5OSKjMgg=e>YM<8WLmN(Q zdjEQt{+3e3z|hjWQ(_;7r$&CyjW3@U{k?TluJ!)4zfTpu-gW7R<@tP>o!fF{Hs?w2 zU;F#mXKnjLi@v4lv$o}~TD5les@1PIV5OrNb$V;=6%uEdl#*G zwM*;tz73}~8QwXTFSFY~Cib>jU-b34o7QsICZG7uc|QC0vBKY0kH3{JUeCjMyq|%g zff1B8gikpvRMci_uwZ0hQ+zHGETDB%p+q3)mBNw`LpH@?Kd+-QQv$rQ6sKI#I;IfP z=XqkzWFfB%%_*0H*cUDh@XB5|wyuEb8&Ul_&u=tXr$I2x_!JaF(26$yJT_Wb~Ww=cw zI?wQ$j8~@a5}{~M&0`|Lxw^+@DIZfvIp=v2WI5Q5r!%JTIeE=&p5*1VcIu>{Gjk?` zjB4)l^3>cm$;)TqlxtpI8(V{-atyD{3Cb~@aw*DF^VlS>9NlA4(LP&C1){jYu3Eb_ zEIVuMu>h}Z)uj^NUK_WHW#<__lk&=33$lFWQL*Sg-D9(YvrU&>%K}M6=h|MIRqVC) z+LfSQ-D9(obN61IRsA03^Q0`@W7m?_f-KkCICWA~j^VRgQ9YJZE+u)cJUS_;NB7vQ z=$xI)re)h64@E3=R#PsS7|w2q@b+ zb_AXC%oHd(W2wdIbjDJBWs#4Qre^3FM-J7k=PWffk6yFnP+cnKt)+W3EL&4^t5~)! z1H%Gvwq^6}Jj%$$8_CJw!pNX-OyP(`3!CIpiRKFuOGJ_dl$J^q`*|%DNj~R!Qlgm8 zNlP;MoTG+jOMsV_W~+dgr|MEB1_mw}1_q{_3sWLw7Qo7p1fC=w!#0JI5F;(Y79TJ5 zm5l;X+-pm(1!XTidL}As?Uox39BW&z8F{N7yAqYQ_Q;GVZ3c!n2N)UNfXfk8h6(Hp z4ibw+lFwPD3nZPfd?91PVfaj@g-`3)oMt{J4$tv%1kdy_Jvd2 zG><7vnH02GBw4`Ab7c{alcwg;Fp$KQs5c5zE=A>-mI-)e>K==7_F8*1B72?U(rZa; zOs`*w>e>2iR<@V!v8e2`I~f@6u(C63V3u|@QGD!h@qCsJaNOF&1n@CcZ;qy7p z9GXXG6ra;vCIM=lOiAhiwLf|c!EM-MGeBZ8AYx8&A4meJaSP^hV)4XE1_lPfuq04} zT$%&YDt8kCbCYu*++#B!T#ypvhC5Ui){e*IMrW_xdMyf>U~t&a#m?}bT{_I&LQ{%c z2joWqJ_ZJf!!wHeEZJmR+B9D*Y2kC?Sm^9!siE2u;H9Zq?C0gRbjg$`ubIU`L0YOy zrv<%ISaK!GOLyzFD0bDQ*MhRvZoOv3v2@E7kX1JvJv5hIi|W=r7U1QzcI%C#9@Dm< zpsck=ZzQcTTyiNWNB5XS@|uNHu0>@V9+Sw{)!ce5sb}l4sBF)bTdyT`n_i3JW_XZS zz|i2ap|EZ0lFf%MJ^;tHA|nHf6F9U%9fP1Q!{-Y?sYTJn%kY^DD2*t#^uWYgCcwo6 zte!)XR!flAbBMYr0Z!ng#j&s@$V*eUMZie|%u;O;aN>kC;J}HoMaWBY=@f8^1U2fW z2sv>mf}3|!f}A)OP6+_X26=HPf=mHv<5UC%7l@^)2+<4D#=y|P3@U|{U#KiTrIcgx z@DOuA#tAQm1|9~6!W&tyHLsmeI69|gns>{DB7r15!JsZn_l>C@l1C-3PBC065*(EM zVop*|p#R)tFT=xYri6KEOl-PTv}SAB8Ab*M1r7!S0Y&3R2SyQz6ATT^Ei9T03pO0M zU>L)~@sx&IF|&$GO3RWXPgqpJ(jbC^1JpwW^{N;cI5;5v zXop~s3aNpK_2TvXdvGg|E^m6N* zxl124%zDMXz&WwX+gJNhWVi8AFS-7pnpmO3e0v%9SbBfkwr$-n@jr7<{+3(HqW?DM z`mamptCuxbzW!)=-EkYw$8~y9ETPWvcG`?bEX(iNTI~NPKj9bqJ?1HFpZ%r!R-L`j z`gZBZwbHwaetGjwT#>V}tw3<;x^uizZFfpOdC#ACdYg1Gf3%*+NjbjnH;oQ$Ji5tx z&&|k zFBg{mGzDuZ{1!3R)waTwZ zS5LRUnOs)ge8PF-4%HRfrBAB)Kc31j@i(;lb;4}v*w2!3FwklpZ5n7zUONvZ0T z1}26Bn|&Tso@GdEMAVJbsL<4Xm`rz#KJHiR^+3S-ba z_5S6GmZE%H89TMemx8fUB}2Cy!#=aS z9Xst0zvHQ0C}x<|U(djhpw2Ldoj2#eLZ$;p4>rpm&gfM1a$rXL(=#S2SkPWrm< zfxoww^xx}RPb7ank>>cW@k(j&bd_uToC_E(EM%Pb?T*Q(=er`#`PEKzShTC6CW=Wm z-J1DVTT;|Pp9|{Kla?{?#qWPSqsVXR!oYj|o!4GmJ+?3N_0iwuo3Cmo`E9x^X?lij zMG))VLvun6c^>56-?hzyc~9;-qsVll*}b3M|6lsxo!(rZqp?war@l-|n|plG%S47H zr}Y>n7`!oZ<@7XPq|vay)tqVLzkQX{>uz;3^Dp?4A9g{t>5OaMU z8{(&Xs#iNNP0HXDl25F^5ZU@5uWY6N%m+?imo8nh)z)Hdms{tpNf%c)+;~#6ZdQQ6 zrcWv>uQFZe`0V*!)H8EaJ&8)t1h677D&0 zOD`X@NZ1i3Q2PF{%;YHTjUoA5Qwo&0#W& z3zsc9e}6}h?e75n#<^?*+W``NMR1W^w`C=_|Ms{s% z9D~fkpKHa0#6(mqQ+Qm5cZF$GnRq4aT5Hn5RRfHi!mTQUGQ)xw}dmC&^ z4+t9E-8pm837Ng|>1te;7X8~iJMxrQActIsNb9pYzo%`*`&*<;=hPi2IkIbxjYtB+ zqqhI1ISU$|u*ubxpFRG&KI7c|H?OWSPs|cmt!HRpn^({Et>c)>( zCuPE&gghKnFAHiiHU#|6(y(O+IB;6Tg;C<}e`6K}2JN;kOM{IJGLNqO)@5RFoywf? zv*?5)SlU`id*ChVn!XgtXH4TQk^s~!Po98b(bNA|7Gl!CI4j;uC7#I@l|5!3GFx)uE zc!%MJZ3RP>QG~+70}^W#c?CC=Ffe?ml5Y4X!_al{q3Xs4X2wV6j1KP^9at(q9lhb* zaDeHn%yJb*4v+PIrXmOS3-fuc{2H>|Q_f#~n$?BdA{+{OOBXqu{PZKLgki;%G$3`S7y5_d;2~LU^iZ7?q^=1E12f{{cZqfQ+^a{kSFJ!Prp_>cg|5+?kr&&@`oc< zoLfLY^p^kU1wVu0^ls-HF1GTVcA=3)PRpU0oq?~eT=v8C_i0k+)2G+GZkaOURpdv0 z28J8@o)4N|aUQT>_>wW{%>w2st^?`}9~d5lAK)rTkj!|n^o$6D&;~VDTT{b{^Ukf~ zXPjigy}_iVITRy;m&TU45hpMoq$5w#d(()j3Zq$_=< zG-)o=l$O0dj9d))3^uzfcX}>3vhwTyZA%$eNIZAGwe$4tWZ|6atKOZc_KID=v20;< zt^)J7UCb>U5-F$RrhRbs{An(rFz1T>vDeOQ4T*|JgXaiiv{9gdS8 zR870Vx{ooVLX$x{E?o9gIp^`)KX%@}ep~cFtMK*BkK`E`K2#Sm$j@VQP-S?oe~>S$ z!IX zY7Q4F;sC$94M|}_~0zU!@&5%VDTv?ou3hw*R(jZ9YZ6Z3nnSrcBCG+ z6%i9^h+Suv$?#Qa6@PeB5XYMJe*@haJR)6k*Lg8B)R)UK2uxH-(h^|wV$gUm;#ceA z!0zJpJ$|SCTx&i zcdz--pRFG&ZpPiU?h4wM#+;+TI4@oH+5AbD*Z;ZG^*?W#USpB0+jWJoBBRA~<{gDRDHsGKg1W@J=}RGP7;UG>_?7vz}P` zzuc4bXnOpv)7GCir%MFxWl_;OD710PK0}j(#^;xKwkrm&w>a39t^VVgYI6=UM%~`=EdEPCa@1HkM!ASqwkgH6I+dWbk8{ zAySs%AkMIczk!=UykS|fVgrLid(EH1mEuc3c4kgi)6x~{oocctN?)mwbfiAv2lyU~OqkTu z=N{D{#ZXs%_rU(In*%ESEdO8USJR#qbG%=EW<&i7rUTRU8Rh*L-dHlobGHjhaLBA^ zX7ha1&cMVVYaOyyM7Oi}+|T2VH$|PpnlcVca56b96p*?;CyA3`$IVDj$2BYh`9jxJ z7%p|qoX((n!S7}^Z-7gd=3>|K@T1@3=CUu>_!!-p`}C%%+~4qz0%||1)f2 zef@0YCduNPr;D7{thbzzFgrSX3X=k_b(pJC{%MX4c|VF)a~zP_$v5G`YTN63(tZfq zHNRF}K5L3;{u6H&qfqU_O>esGGFcWh^D+EeF8eCKan9sT?%uC{CA0FKGJP!1kl^^A z0OePt@9SloUu20P1W?;A_{%xDK#;Hg-zYC`uCmDE7T(lsf=gQ+{$38Wjc)K)H zC{%W}nP$Z1^zBwNRj0IYe!srW<-Go`z~AZHxj7ft&NuP)lzDQnC9#8rBma_W^r`T( z7miQ1@#b3Omt-w^^Xmb&4-1$X6*cQXm&2||oiH9oh3{&g zSvD*X3CUTLMeYjgXr5kEL#Z|2!U%^GXxXRdRZvdCZ6 zM~rn^X=T-71*vNdUEN#{_l7>bxh>mPe1*-dFCp8m`v)Bmo~Y8c=FB4@-_N^NE`3P*AwmvmZ1fV4b`{fkC*L zU4(&ePP5^R1n&t&L5iTRoi($=6vl*mtNPp+uRXu7&1Jz9AUW#@Cqsu&r@dit1H*!U ziR+mgChgtn=(WYg-2Q*PaaLCN%6*zg-*DMx#q=?9wM4zw({!ElxvDQxDD?Ntt>rJK z>u$d?C9HLCF-N=3^d@;Hm+kdORbLb?f9>zXESdLR=6(Dvt)}T4{eIdeI`>VU;WT+~ zwX(A0LY}#Yy*@BNhcQ-z91R)9U}j)oP$^Op6x(y`(4k|;4jnvjZ10|}hj$&@w{QP} zEqnhRznk%Yf=2wqGy4u-Ocp(9deokQ;lpp;1IH_wZg4lKA7DSluz*FOxtWRIgx9cp z3KIj<2J3@9o$FTI69|eB(3-eKIDm<%Vd2?kB?c~~#F*?$Obio`)cGD~%w!b!E$HOw z$r!oIpLe0vqawQxPdQr6WB2aQmtMW9w5C$_t4vgPY)bg9&vE;<-dX%9nw6oV_8Q}j zdV^JmQm-hp9}wv8kIU zWH@2LZ>G0DzV85o(z-uOmG%`)kNI)r?$VCCbHD8kU1_gdy5PQP1}{V0i@ODPwg{b? zZm~B0=|K@t)@P_t^E+@{yWw91Ll=wnHs*;8Wj%*^W-O5Bu-H)QFk6&?f#H|z1NJ%M ze~&Lc;B+YXRql4qBVJ4oY_skL23Rm1ab7!>L4)6Yk_#)NlMX0E0#7_Q+H_#|JhRwR zhwLl6el%#_3O#uK?4AY=ho5!%3=clCYcM&FrQVOg;H@dLDmU_N`HGAh5 z@%`$PPahBLjEFuNC)(eAGUbhnr?;po!;fu@^IphqtMS^_U*ML1**Vqwbp)u{{w-Ve zz;RB8|HVuJj5Pt%8LHSGNb?DsRIm#(bhCu8doeIH)QS68d^q!}-LTb($%E(9PLTx- zBG1JvMHmtentT;zV6aJTOIpFkz_3h0)3w2hp;x?D%7H6lj?UgmQBHR{0z_Ko-AHY0 z2(HRlC9bCRqWlFzhZuh=(}hEK131d!_sv+Q=;ACF-rIH}@@L1RckGTvjyH_MAAaMB z`pBI6%7=H((dj}w6If22;A3E5FvtbP!;3Fp`{P@Uf0+f(|9b^ecFo_*u!FUsu7Up@ z(*@20%MTf9ShJf!Ae3RYiKjpd!wakZ{R|B)BBw1>8(1HNSDUS2 z=}>+bqH-y|oF>mXv z`wwkeS845@W71H=#-QTBw2wn>Urt*}rSbVo(cgn(G}mhWV`OOfyoy2Im?58=;n)H8 z^^6A?94wO=ZX_(?ZqeXiV7SoFlelloH!b(o!jX+$>G|Gm8XgRf*z;K$n1m|qp9(X4 zP+-@-e1(}oq0Ud6;mDyb_LFN_Z~c6Ivu{J_`bc$YKF?syv+&oPMxe}XxLuO_h;AcTdyl>-e>zyQdBCo zefCklL?Mcy`V4kYy_uLe?mg?Bv!r3`f#cJd88|iL zr)K)HbpBbkyDQ*FO}y0AEgy~?+_Oxz=0vlQ#(Ql?tr>=#Hjg@&mL2upbt=a3?comW}%b0wf=vf)x*^X8P%BGec|E(>SpRc2s#B?H5yK7UJ$?E8! zJB!{$89$i*n62Q*;-bpb4Y8cx60^=FvvG2>K6`z5=DO8x(biL#9C#V-amdB&Q#H{q zjJjX-O8d)7Nqd!ozmqvP?3ZAeugma7pYZ`>O$8SNlf(Y`25%fUJ`|R0$YT;vVz{Uy zcILa2r_a9UPSY+gw|QKx9C)rWg1syBb%H8`b#%pfR)&BI|85o~heppMS9F9Lm?mv; zX86$XXVW5<302vP860kAX)J1eEo3Ytq8*TsFP+y=F6im;kL!+N>7mV5=}Zk3vlG0S z_WoAj-Mhg1vgD6&g(8M$Hs;&k=IHC5@9Y=4)38Z>&OZYNh6Z*9hI`;xczXPiv@A#u}r(%sLjRD6E@v6xWVE?0}Gc$jbFn)L%qoR%wD1QR&}IJW^Gyf zEp}^faQ5q#lH!QH+1B4Bmam;OLHxRgXagg|KaF$q=L>zFZL!k7w&1D>s9C|3u%G1s zKLf*+j|&+VF#Zrs;CQiShQJCo(2PwMGkOw$aiW5e0(WqIWkc!V_0 zh8+FgaQfe$W17!?=G!nb`+Q0EYU+(_NaK3p=u%V0eZxk`$)zgo{l|9Kg#D%5C+oj% z;quItNciu}(BQ|+@J~XnET=8yv(fIa?mHLx`+jt0*#DpDL%q<0n=CihUv1PXyT&Mc zphjK6nB&F9!a(68dV|bHW9n8(( za(t!c^2Wor^ZFPV{+aPIFc_?x&7r9h=lk~64wpYK&c`?}WG(xj%D}*|m2=YPGfPt% zyk1N?1&r60*PYTvFWo{1pIj34Hb&vU^m&?muy;Wq|>@2Z{=>o{n5q7Gb z({~2X-?h7>KC27daJ6S(2sqq+o#6uGgDS?u3Le}xB}Gi2wV1vv511K*9Huj0SiyX0 zVJ6E5_RrIzRx_ONRBmL^nPPGERHDX-|7pegAs14UxYX8k?M;qkWJqS!?aH~pZ})K~ z)0WQF->Saeyl21e*R&8X;Uzn6TeKW-IBB<8Tk_rw{-cj|yc4IhZKyo{iTS`L`{zs( zT3=4rll*d#X$`9N%vD7vX2nVcaJnx2?w8gkN*{SNENf zuY-gCF#P!K&HSOB`N2-11@^vdtA2c##30o$M}kLoLn3cbk+TCQgGcW=ZQZQnb;pe! z%`m(&Ri)SeKi9oOOx|lfR9%>+tlxc~hvCAh-|_)g3$`8JDk8!#@hU4v>lUFEUcF3D z-oNAJa3Db0e?(*w@+nT<*a%V8uu`meMN}DNiH0+wo&&e=h z!gFQ@hJdFl8@x2SzHPG)_!48LeKg57TJcru??x>RO~I`u3j+?Yd_A}_NW)M2fBd3_ zJt1rTtfLuKrmQ)=#r;EFQiJ2YxCEv~ALq=qyQ^0hu4Ur+bxFnJoPmL1MG7OsydSc5wVq=8H@MgPn5+M~B4V#n@Ovpkg+Jp54ThRJ z?tO{RnXMXZ`A_sXZe%F9RIq`8LDhvJ_q=J=^H&=_RaVT?U03YFY53jd7BhpYm&`c< z2cZM&VpM9l7(U+hS;P`E@nof4K8M3mKCiW`OLq63V^yh}KbxV;+t#~;!F76W_*o8z zo#q>T>T)eS&nQ{W4HVho#>+e&+>q0gDmY;X|Tcf>X!OyM7o*8cBY5V)~ z>Q-e228nid28MYrWaro~P1*k;@9(R1ua<%<-QW9}A6yn?_~Xc2!C=j##^B7@-Z1X~ z7wftA%p4311(kv^B{7#~x3Oylxr%7iXdm|q@I0mZvW}6#LBk_PMeLH&!%Q!!fCYa{ zESMQKD5XYui0BkZJ&%vJnmBdE9Qo}howXc_zJ6Pz=`^zgw;nEwKb$Jm?K+of6=VQ>*2Z#LJW2% z?iTz}oggG~Z*Bd@9T!)vWc$O+z;M~C!GAu(4?%`)3}sgw83GP1Y+zcRspSHybH6Av z^J*%0%`DSv6mn#k!!Rwt^+DWxH5LYj09BzZO&!BWh!S z{r;ecxzkLGPVWz!pYeI&>39B7YksQST-LG6cgysm$xQ10JUf(bv;3%$^V<0QHsgn& zpA(k~>@}IcWvWTHQr|RxHI~iY6XLB)zX@Jk7<1inm+nSwrWp-Ppb?B~@j|!m|2X+~ z*WKWWnSWRr7#MzNFxr$e{9v2of1~k`;)3QWR`y2}7#JL`F+N~s*g5q)Q%ILg_q%!7 zj1k-i3JwMYFq~P*-|FCS%=&vy%L|S*^0W4KI8{D=ReI+jyZ+Okj8`ut=AM~;dX`pf z%J+zEZ~f=jWVjb^T4S{D%%0yIRjmS-?)W&B7t0wbtYem9coWlPR3a3uw~EmC zhXtpr-C}<&mXZ8CD|p|pO5f#i7bEZ7{Hxf&64B(x%y4hH?7e&cbISeR?l0Oc6~GqR z`$Spg$9sL=1^@LMp35{`=lT#jhnZnXqx#iUP6q}DPWI$QYZ@QqT{yX>EztDnzN*_l>Q!EU`Im&G@U6lqk)Z~E?rh^{`-%j_hS3^njS4we&q@7weT}n#4-MeZ}OK>Sn!yE zUE!vRB9m7K14D;Y;{^VxHT#|mtme?^xTShU>ww^%ZRbn48@~ViW633>#-6_N;i`@g zPx=^4s^;FkwjqdfMGyPkcD>YN%lrf5yBBD^k9!+c@p;SK>4ir$FZyqfte#w)dUN@z zu7p?a2{{*dauX*k4GWsJFtIc`xMt;on;pJ?lKF$2=M_J#owTc&m&HJ!(vR~FUo`uN z6-dVIIQ* zj}M*39PDb#9OrFp0j+rdv4NW*mC@kxG={Azx?y*}u363y@>}ak;|k}zudi+}ESSHJ zWlQ(;H{XN=uFf=7%>FRpnl%vwiEFlxip6ox34Zd1Bg2-Oqss zPaf$B`^)b>Q*m*D@z$EwK*oZ`gTHjddima$%~a3+quILRZI-<3&!Sxh>?XJ7`mwk# z-+eLf%qkQY5%GjXa{x6i3<=p-``Yx^+d!P0$ zT`XrFJKJTKf6u+ESLe1G%zIh;TiE0F7lzEAUEDLL^DK@!b?Jip=>~V@qhdcEJ9IcU zKYZx5w%|r(^;Zdjk1Il$<@o2zaB19pu$(90cJO!-FMU3$z*f%6k|CvZwwC zEwN%)@@nB)O<4!GcP%l876c}w^)8TOtk3F|y>q_jPVLso&0X8?PMUjd>5U(5rcbI~ zn8d|@VxACn^>xMelvAru&YWjFzvlhI>$4W-HN{=Z-d0`rs`bXrI~D%ooBsTZxgT|Q zNow26H9u{|qU?{TTTg9vxALuDCCqAcHZA}7xfNl;#|=K6^R8XS^*ehnJEP2!Fk;cHVrc+?YrQT;fa~99D zV5**!$jIQg%60ZqK87f%YHt@-zn6Shqm1Vtb~|GysJ;8h%13WMCa5sZUUWq$_{;at za~+Jl+aFHS``^?QvpJu2=kH%jLYP;I?34Wy?0P)P_0ZR}Vxi{JX>WBKFEs7^?|%Q? z=KZ~%E({Dj-|p)!kv0nJofGumHg2t4;c9^_CBCUz!VL3Td7eDoeDmt2$zuPOny|jD zs`|5mu}(|u!Ou^O8?H}ah-=y+q#t!n#Nn#QUSaJ8aUuK7%`;Bl)aYJyV29rd4u(%^ zrj0B*OQdG@%P?fTxMMSyS?u+vG{F|VXzi0M^9_BSf9MzxMc^&suZ0JO9Ab)B8+0c3i&c@qF%U_ep`a&lk78oDz5LcE1I$!PnANllyAp z_8of|Cp3lI{o2wCtm|2K`!dwEe%bCnZ}snkTR!(UPvv;SWD{}8Tqhu5%4!b9$X^T$ z49`-HK3Dwxe$8?H-dy`RJy+wF{K?N GameState; + + // return state object for a specific game name + // returns null if no state exists (caller must add a new one) + static ui MadcatGameState GetState( Name GameName ) + { + let gsm = MadcatGameStateManager(ThinkerIterator.Create("MadcatGameStateManager").Next()); + if ( !gsm ) ThrowAbortException("Game State Manager not found."); + for ( int i=0; i= 18 ) continue; + if ( boot_tiles[j+147] && (boot_tiles[j+147] < 195) ) boot_tiles[j+147] += 21; + } + for ( int j=-1; j= 18 ) continue; + if ( (boot_tiles[j+171] < 195) ) boot_tiles[j+171] += 21; + } + for ( int j=-2; j= 18 ) continue; + if ( (boot_tiles[j+195] < 195) ) boot_tiles[j+195] += 21; + } + } + private void Boot_ClearTiles() + { + for ( int i=0; i<360; i++ ) boot_tiles[i] = 0; + } + + // game has been booted up + virtual void Init() + { + oldmus = musplaying.name; + oldorder = musplaying.baseorder; + oldloop = musplaying.loop; + S_ChangeMusic(""); + bClosed = false; + global_state = CAT_BOOT; + boot_state = BS_FADEIN; + boot_timer = -16; + boot_tileset = TexMan.CheckForTexture("graphics/Games/MadcatTiles.png",TexMan.Type_Any); + } + + // game is ticking + virtual void Tick() + { + // only bootup is handled here + if ( global_state != CAT_BOOT ) return; + switch ( boot_state ) + { + case BS_FADEIN: + if ( boot_timer == 0 ) Boot_PrepareTitle(); + else if ( !(boot_timer%4) && (boot_timer >= 4) ) Boot_FadeInTiles(); + boot_timer++; + if ( boot_timer > 12 ) + { + boot_state++; + boot_timer = -16; + } + break; + case BS_FLASH: + Boot_FlashState(); + boot_timer++; + if ( boot_timer > 80 ) + { + boot_state++; + boot_timer = 0; + } + else if ( boot_timer == 0 ) S_StartSound("madcat/boot",CHAN_VOICE,CHANF_UI,1.,0.); + break; + case BS_FADEOUT: + if ( boot_timer == 0 ) + { + Boot_PrepareTitle(); + Boot_PreFadeOutTiles(); + } + else if ( !(boot_timer%4) && (boot_timer >= 4) ) Boot_FadeOutTiles(); + boot_timer++; + if ( boot_timer > 12 ) + { + boot_state++; + boot_timer = 0; + } + break; + case BS_IDLE: + boot_timer++; + if ( boot_timer == 4 ) Boot_ClearTiles(); + else if ( boot_timer >= 40 ) + { + global_state = CAT_MENU; + boot_state = 0; + boot_timer = 0; + } + break; + } + } + + // draw on the virtual screen + // coordinates are absolute + virtual void Draw( Vector2 screen_pos, double screen_zoom ) + { + // only bootup is handled here + if ( global_state != CAT_BOOT ) return; + for ( int i=0; i<360; i++ ) + { + int tsx = (boot_tiles[i]&0x0F)*8; + int tsy = ((boot_tiles[i]&0xF0)>>4)*8; + int fsx = (i%24)*16; + int fsy = (i/24)*16; + Screen.DrawTexture(boot_tileset,false, + screen_pos.x+fsx*screen_zoom, + screen_pos.y+fsy*screen_zoom, + DTA_ScaleX,screen_zoom,DTA_ScaleY,screen_zoom, + DTA_SrcX,tsx,DTA_SrcY,tsy, + DTA_SrcWidth,8,DTA_SrcHeight,8, + DTA_DestWidth,16,DTA_DestHeight,16); + } + } + + // process keyboard input + virtual bool ProcessInput( int key, bool release ) + { + return false; + } + + // game has been closed + virtual void Close() + { + bClosed = true; + S_ChangeMusic(oldmus,oldorder,oldloop); + } + + override void OnDestroy() + { + if ( !bClosed ) Close(); + Super.OnDestroy(); + } +} diff --git a/zscript/games/swwm_minigames.zsc b/zscript/games/swwm_minigames.zsc new file mode 100644 index 000000000..6d4970f01 --- /dev/null +++ b/zscript/games/swwm_minigames.zsc @@ -0,0 +1 @@ +// basic minigames diff --git a/zscript/kbase/swwm_kbase.zsc b/zscript/kbase/swwm_kbase.zsc index a9c96368a..1bcf298de 100644 --- a/zscript/kbase/swwm_kbase.zsc +++ b/zscript/kbase/swwm_kbase.zsc @@ -188,6 +188,7 @@ Class DemolitionistMenu : GenericMenu 'DemolitionistLibraryTab', 'DemolitionistStoreTab', 'DemolitionistChatTab', + 'DemolitionistGameTab', 'DemolitionistHelpTab', 'DemolitionistSecretTab' }; @@ -218,44 +219,48 @@ Class DemolitionistMenu : GenericMenu override bool MenuEvent( int mkey, bool fromcontroller ) { - switch ( kcode ) + // pachinko code only handled if the tab lacks direct input + if ( !tabs[curtab].bDirectInput ) { - case 0: - case 1: - if ( mkey == MKEY_UP ) kcode++; - else kcode = 0; - break; - case 2: - case 3: - if ( mkey == MKEY_DOWN ) kcode++; - else kcode = 0; - break; - case 4: - case 6: - if ( mkey == MKEY_LEFT ) kcode++; - else kcode = 0; - break; - case 5: - case 7: - if ( mkey == MKEY_RIGHT ) kcode++; - else kcode = 0; - break; - case 10: - if ( mkey == MKEY_ENTER ) + switch ( kcode ) { - int secret = FindTabType('DemolitionistSecretTab'); - if ( curtab != secret ) + case 0: + case 1: + if ( mkey == MKEY_UP ) kcode++; + else kcode = 0; + break; + case 2: + case 3: + if ( mkey == MKEY_DOWN ) kcode++; + else kcode = 0; + break; + case 4: + case 6: + if ( mkey == MKEY_LEFT ) kcode++; + else kcode = 0; + break; + case 5: + case 7: + if ( mkey == MKEY_RIGHT ) kcode++; + else kcode = 0; + break; + case 10: + if ( mkey == MKEY_ENTER ) { - MenuSound("misc/secret"); - tabs[curtab].OnDeselect(); - curtab = secret; - tabs[curtab].OnSelect(); - } + int secret = FindTabType('DemolitionistSecretTab'); + if ( curtab != secret ) + { + MenuSound("misc/secret"); + tabs[curtab].OnDeselect(); + curtab = secret; + tabs[curtab].OnSelect(); + } + } + default: + kcode = 0; + break; } - default: - kcode = 0; - break; } switch ( mkey ) { @@ -384,6 +389,8 @@ Class DemolitionistMenu : GenericMenu override bool OnUiEvent( UIEvent ev ) { + if ( tabs[curtab].bDirectInput && ((ev.type == UIEvent.Type_KeyDown) || (ev.type == UIEvent.Type_KeyUp)) ) + return tabs[curtab].DirectInput(ev); switch ( ev.type ) { case UIEvent.Type_KeyDown: diff --git a/zscript/kbase/swwm_kbase_tab.zsc b/zscript/kbase/swwm_kbase_tab.zsc index 57317baa4..0ab4934b2 100644 --- a/zscript/kbase/swwm_kbase_tab.zsc +++ b/zscript/kbase/swwm_kbase_tab.zsc @@ -5,6 +5,7 @@ Class DemolitionistMenuTab ui abstract DemolitionistMenu master; String title; bool bHidden; // tab does not display and can't be selected + bool bDirectInput; // inputs are directly passed to this tab // tab initialization virtual DemolitionistMenuTab Init( DemolitionistMenu master ) @@ -23,6 +24,12 @@ Class DemolitionistMenuTab ui abstract { } + // called for "direct input" from ui events + virtual bool DirectInput( UIEvent ev ) + { + return false; + } + // called after this tab is selected virtual void OnSelect() { diff --git a/zscript/kbase/swwm_kbasetab_games.zsc b/zscript/kbase/swwm_kbasetab_games.zsc new file mode 100644 index 000000000..7de6e1788 --- /dev/null +++ b/zscript/kbase/swwm_kbasetab_games.zsc @@ -0,0 +1,148 @@ +// a game inside a game? + +Class DemolitionistGameTab : DemolitionistMenuTab +{ + MadcatGame game; + Array > gamelist; + int sel; + + override DemolitionistMenuTab Init( DemolitionistMenu master ) + { + title = StringTable.Localize("$SWWM_GAMETAB"); + gamelist.Push((Class)('MadcatGame')); // test + bDirectInput = true; + return Super.Init(master); + } + + override void OnDestroy() + { + Super.OnDestroy(); + if ( game ) game.Destroy(); + } + + override void OnSelect() + { + sel = master.shnd.menustate.At("LastGame").ToInt(); + } + override void OnDeselect() + { + master.shnd.menustate.Insert("LastGame",String.Format("%d",sel)); + if ( game ) game.Destroy(); + } + + override void MenuInput( int key ) + { + // while a game is running, only the back button can be used + if ( game ) + { + if ( key == MK_BACK ) + { + game.Destroy(); + master.MenuSound("menu/democlose"); + } + return; + } + switch ( key ) + { + case MK_DOWN: + if ( sel > 0 ) + { + sel--; + master.MenuSound("menu/demoscroll"); + } + break; + case MK_UP: + if ( sel < gamelist.Size()-1 ) + { + sel++; + master.MenuSound("menu/demoscroll"); + } + break; + case MK_ENTER: + master.MenuSound("menu/demosel"); + game = MadcatGame(new(gamelist[sel])); + game.Init(); + break; + } + } + + override void MouseInput( Vector2 pos, int btn ) + { + if ( game ) return; + if ( btn != MB_LEFT ) return; + String str; + double xx, yy; + yy = int(master.ws.y-14*gamelist.Size())/2; + for ( int i=0; i yy+h ) continue; + sel = i; + MenuInput(MK_ENTER); + break; + } + } + + override bool DirectInput( UIEvent ev ) + { + if ( !game ) return false; + return game.ProcessInput(ev.keychar,ev.type==UIEvent.Type_KeyUp); + } + + override void Ticker() + { + if ( game ) game.Tick(); + } + + override void Drawer() + { + if ( game ) + { // calculate res to fit + double scl = max(floor(((master.ws.y-120)*master.hs)/240.),1.); + Vector2 res = ((384,240)*scl)/master.hs; + String str = StringTable.Localize("$SWWM_GAMETITLE_"..game.GetClassName()); + double xx = int(master.ws.x-master.mSmallFont.StringWidth(str))/2; + double yy = int(master.ws.y-res.y)/2; + Screen.DrawText(master.mSmallFont,Font.CR_FIRE,master.origin.x+xx,master.origin.y+yy-32,str,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); + int cw = int(ceil((master.mSmallFont.StringWidth(str)+8)/6.))*6; + xx = int(master.ws.x-cw)/2; + for ( int i=0; i=4)?0x2727:0x2726,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); + Screen.DrawChar(master.mSmallFont,Font.CR_GREEN,master.origin.x+xx+w+6,master.origin.y+yy,((gametic&8)>=4)?0x2727:0x2726,DTA_VirtualWidthF,master.ss.x,DTA_VirtualHeightF,master.ss.y,DTA_KeepRatio,true); + } + yy += 14; + } + } + } +}