From 94e2ba84c57ab4a08fc68b65983577656fecae84 Mon Sep 17 00:00:00 2001 From: nebiun Date: Mon, 25 May 2020 18:02:06 +0200 Subject: [PATCH] Version 1.1 --- README.md | 12 +- data/images/autorace_aimcenter.png | Bin 958 -> 0 bytes data/images/autorace_aimleft.png | Bin 852 -> 0 bytes data/images/autorace_aimright.png | Bin 853 -> 0 bytes data/images/autorace_gear1.png | Bin 219 -> 0 bytes data/images/autorace_gear2.png | Bin 221 -> 0 bytes data/images/autorace_gear3.png | Bin 221 -> 0 bytes data/images/autorace_gear4.png | Bin 225 -> 0 bytes data/images/autorace_poweroff.png | Bin 204 -> 0 bytes data/images/autorace_poweron.png | Bin 207 -> 0 bytes data/images/autorace_slide.png | Bin 0 -> 666 bytes data/images/baseball_blip.png | Bin 151 -> 144 bytes data/images/baseball_brightdigits.png | Bin 339 -> 348 bytes data/images/baseball_dimdigits.png | Bin 364 -> 367 bytes data/images/baseball_poweroff.png | Bin 188 -> 0 bytes data/images/baseball_pro1.png | Bin 188 -> 0 bytes data/images/baseball_pro2.png | Bin 188 -> 0 bytes data/images/basketball2_screen.png | Bin 0 -> 13709 bytes data/images/digits_f.png | Bin 371 -> 391 bytes data/images/football2_poweroff.png | Bin 219 -> 0 bytes data/images/football2_pro1.png | Bin 219 -> 0 bytes data/images/football2_pro2.png | Bin 218 -> 0 bytes data/images/football_poweroff.png | Bin 307 -> 0 bytes data/images/football_pro1.png | Bin 289 -> 0 bytes data/images/football_pro2.png | Bin 284 -> 0 bytes data/images/missileattack_screen.png | Bin 0 -> 34174 bytes data/images/nodisp_screen.png | Bin 7466 -> 0 bytes data/images/poweroff_a.png | Bin 604 -> 0 bytes data/images/skislalom_aimcenter.png | Bin 1091 -> 0 bytes data/images/skislalom_aimleft.png | Bin 1014 -> 0 bytes data/images/skislalom_aimright.png | Bin 1014 -> 0 bytes data/images/skislalom_gear1.png | Bin 227 -> 0 bytes data/images/skislalom_gear2.png | Bin 224 -> 0 bytes data/images/skislalom_gear3.png | Bin 223 -> 0 bytes data/images/skislalom_gear4.png | Bin 225 -> 0 bytes data/images/skislalom_gearknob.png | Bin 187 -> 0 bytes data/images/skislalom_powerknob.png | Bin 187 -> 0 bytes data/images/skislalom_poweroff.png | Bin 207 -> 0 bytes data/images/skislalom_poweron.png | Bin 217 -> 0 bytes data/images/skislalom_slide.png | Bin 0 -> 739 bytes data/images/skislalom_slide2.png | Bin 0 -> 1171 bytes data/images/slide1.png | Bin 0 -> 176 bytes data/images/slide2.png | Bin 0 -> 178 bytes data/images/slide3.png | Bin 0 -> 343 bytes data/images/soccer2_screen.png | Bin 0 -> 17543 bytes data/images/spacealert_aimcenter.png | Bin 387 -> 0 bytes data/images/spacealert_aimleft.png | Bin 385 -> 0 bytes data/images/spacealert_aimright.png | Bin 382 -> 0 bytes data/images/spacealert_poweroff.png | Bin 206 -> 0 bytes data/images/spacealert_poweron.png | Bin 208 -> 0 bytes data/images/switch1.png | Bin 0 -> 186 bytes data/images/switch2.png | Bin 0 -> 252 bytes data/images/switch3.png | Bin 0 -> 269 bytes data/images/switch4.png | Bin 0 -> 151 bytes data/sounds/basketball2_3secs.raw | Bin 0 -> 7574 bytes data/sounds/basketball2_bounce.raw | Bin 0 -> 403 bytes data/sounds/basketball2_endgame.raw | Bin 0 -> 31123 bytes data/sounds/basketball2_endplay.raw | Bin 0 -> 11697 bytes data/sounds/basketball2_endquarter.raw | Bin 0 -> 15436 bytes data/sounds/basketball2_foul.raw | Bin 0 -> 2522 bytes data/sounds/basketball2_freethrow.raw | Bin 0 -> 6705 bytes data/sounds/basketball2_overtime.raw | Bin 0 -> 33149 bytes data/sounds/basketball2_score.raw | Bin 0 -> 12708 bytes data/sounds/basketball2_score3.raw | Bin 0 -> 22080 bytes data/sounds/basketball2_tick.raw | 1 + data/sounds/soccer2_ballout.raw | Bin 0 -> 5083 bytes data/sounds/soccer2_beep.raw | Bin 0 -> 947 bytes data/sounds/soccer2_bounce.raw | Bin 0 -> 1589 bytes data/sounds/soccer2_endgame.raw | Bin 0 -> 24626 bytes data/sounds/soccer2_endhalf.raw | Bin 0 -> 14722 bytes data/sounds/soccer2_goal.raw | Bin 0 -> 13836 bytes data/sounds/soccer2_highkick.raw | Bin 0 -> 875 bytes data/sounds/soccer2_looseball.raw | Bin 0 -> 595 bytes data/sounds/soccer2_lowkick.raw | Bin 0 -> 1025 bytes data/sounds/soccer2_tick.raw | Bin 0 -> 88 bytes data/wiimote/WKBLR1.png | Bin 0 -> 2376 bytes data/wiimote/WKD.png | Bin 0 -> 619 bytes data/wiimote/WKL.png | Bin 0 -> 575 bytes data/wiimote/WKR.png | Bin 0 -> 567 bytes data/wiimote/WKU.png | Bin 0 -> 594 bytes source/Games.c | 175 ++- source/Games.h | 9 +- source/LED_Handled.h | 35 +- source/blip.c | 8 +- source/digit.c | 10 +- source/font.c | 4 + source/game/ArmorBattle.h | 3 +- source/game/AutoRace.h | 3 +- source/game/Baseball.c | 1313 ++++++----------- source/game/Baseball.h | 13 +- source/game/Basketball.c | 145 +- source/game/Basketball.h | 3 +- source/game/Basketball2.c | 1340 ++++++++++++++++++ source/game/Basketball2.h | 55 + source/game/Football.c | 210 ++- source/game/Football.h | 7 +- source/game/Football2.c | 357 +++-- source/game/Football2.h | 17 +- source/game/Hockey.c | 170 +-- source/game/Hockey.h | 3 +- source/game/HockeyCa.c | 184 +-- source/game/HockeyCa.h | 3 +- source/game/Soccer.c | 177 +-- source/game/Soccer.h | 4 +- source/game/Soccer2.c | 1805 ++++++++++++++++++++++++ source/game/Soccer2.h | 54 + source/game/SpaceAlert.c | 430 +++--- source/game/SpaceAlert.h | 5 +- source/game/SubChase.c | 3 - source/game/SubChase.h | 3 +- source/gear.c | 68 + source/main.c | 45 +- source/platform/Platform.c | 64 +- source/platform/Platform.h | 10 + source/platform/Platform_armorbattle.c | 52 +- source/platform/Platform_armorbattle.h | 6 - source/platform/Platform_autorace.c | 143 +- source/platform/Platform_baseball.c | 346 ++--- source/platform/Platform_baseball.h | 58 +- source/platform/Platform_basketball.c | 41 +- source/platform/Platform_basketball2.c | 507 +++++++ source/platform/Platform_basketball2.h | 76 + source/platform/Platform_football.c | 87 +- source/platform/Platform_football2.c | 88 +- source/platform/Platform_football2.h | 8 + source/platform/Platform_hockey.c | 47 +- source/platform/Platform_hockeyca.c | 41 +- source/platform/Platform_soccer.c | 41 +- source/platform/Platform_soccer2.c | 574 ++++++++ source/platform/Platform_soccer2.h | 83 ++ source/platform/Platform_spacealert.c | 186 +-- source/platform/Platform_spacealert.h | 19 +- source/platform/Platform_subchase.c | 39 +- source/platform/ReadMe.txt | 88 ++ source/platform/TODO.TXT | 4 + source/platform/help.c | 18 +- source/power.c | 170 ++- 137 files changed, 6807 insertions(+), 2663 deletions(-) delete mode 100644 data/images/autorace_aimcenter.png delete mode 100644 data/images/autorace_aimleft.png delete mode 100644 data/images/autorace_aimright.png delete mode 100644 data/images/autorace_gear1.png delete mode 100644 data/images/autorace_gear2.png delete mode 100644 data/images/autorace_gear3.png delete mode 100644 data/images/autorace_gear4.png delete mode 100644 data/images/autorace_poweroff.png delete mode 100644 data/images/autorace_poweron.png create mode 100644 data/images/autorace_slide.png delete mode 100644 data/images/baseball_poweroff.png delete mode 100644 data/images/baseball_pro1.png delete mode 100644 data/images/baseball_pro2.png create mode 100644 data/images/basketball2_screen.png delete mode 100644 data/images/football2_poweroff.png delete mode 100644 data/images/football2_pro1.png delete mode 100644 data/images/football2_pro2.png delete mode 100644 data/images/football_poweroff.png delete mode 100644 data/images/football_pro1.png delete mode 100644 data/images/football_pro2.png create mode 100644 data/images/missileattack_screen.png delete mode 100644 data/images/nodisp_screen.png delete mode 100644 data/images/poweroff_a.png delete mode 100644 data/images/skislalom_aimcenter.png delete mode 100644 data/images/skislalom_aimleft.png delete mode 100644 data/images/skislalom_aimright.png delete mode 100644 data/images/skislalom_gear1.png delete mode 100644 data/images/skislalom_gear2.png delete mode 100644 data/images/skislalom_gear3.png delete mode 100644 data/images/skislalom_gear4.png delete mode 100644 data/images/skislalom_gearknob.png delete mode 100644 data/images/skislalom_powerknob.png delete mode 100644 data/images/skislalom_poweroff.png delete mode 100644 data/images/skislalom_poweron.png create mode 100644 data/images/skislalom_slide.png create mode 100644 data/images/skislalom_slide2.png create mode 100644 data/images/slide1.png create mode 100644 data/images/slide2.png create mode 100644 data/images/slide3.png create mode 100644 data/images/soccer2_screen.png delete mode 100644 data/images/spacealert_aimcenter.png delete mode 100644 data/images/spacealert_aimleft.png delete mode 100644 data/images/spacealert_aimright.png delete mode 100644 data/images/spacealert_poweroff.png delete mode 100644 data/images/spacealert_poweron.png create mode 100644 data/images/switch1.png create mode 100644 data/images/switch2.png create mode 100644 data/images/switch3.png create mode 100644 data/images/switch4.png create mode 100644 data/sounds/basketball2_3secs.raw create mode 100644 data/sounds/basketball2_bounce.raw create mode 100644 data/sounds/basketball2_endgame.raw create mode 100644 data/sounds/basketball2_endplay.raw create mode 100644 data/sounds/basketball2_endquarter.raw create mode 100644 data/sounds/basketball2_foul.raw create mode 100644 data/sounds/basketball2_freethrow.raw create mode 100644 data/sounds/basketball2_overtime.raw create mode 100644 data/sounds/basketball2_score.raw create mode 100644 data/sounds/basketball2_score3.raw create mode 100644 data/sounds/basketball2_tick.raw create mode 100644 data/sounds/soccer2_ballout.raw create mode 100644 data/sounds/soccer2_beep.raw create mode 100644 data/sounds/soccer2_bounce.raw create mode 100644 data/sounds/soccer2_endgame.raw create mode 100644 data/sounds/soccer2_endhalf.raw create mode 100644 data/sounds/soccer2_goal.raw create mode 100644 data/sounds/soccer2_highkick.raw create mode 100644 data/sounds/soccer2_looseball.raw create mode 100644 data/sounds/soccer2_lowkick.raw create mode 100644 data/sounds/soccer2_tick.raw create mode 100644 data/wiimote/WKBLR1.png create mode 100644 data/wiimote/WKD.png create mode 100644 data/wiimote/WKL.png create mode 100644 data/wiimote/WKR.png create mode 100644 data/wiimote/WKU.png create mode 100644 source/game/Basketball2.c create mode 100644 source/game/Basketball2.h create mode 100644 source/game/Soccer2.c create mode 100644 source/game/Soccer2.h create mode 100644 source/gear.c create mode 100644 source/platform/Platform_basketball2.c create mode 100644 source/platform/Platform_basketball2.h create mode 100644 source/platform/Platform_soccer2.c create mode 100644 source/platform/Platform_soccer2.h create mode 100644 source/platform/ReadMe.txt create mode 100644 source/platform/TODO.TXT diff --git a/README.md b/README.md index fdbea22..e2e990f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ledHeadWii -Porting on Wii of Peter Hirschberg's LedHEAD (classic electronic LED handled game simulator) +Based on Peter Hirschberg's LedHEAD (classic electronic LED handled game simulator) source code. ## OVERVIEW LEDhead is a program that simulates the classic electronic LED (light emitting diode) based handheld @@ -8,4 +8,12 @@ All games feature fully authentic sound-effects, and faithfully replicate the ga Rather than using proprietary code or "ROM images", as is the case with emulators, LEDhead uses simple but extremely clever imitation to ensure excruciating faithfulness to the games you grew up with. -Endless hours of painstaking effort have gone into ensuring the accuracy of each of these games. +Endless hours of painstaking effort have gone into ensuring the accuracy of each of these games. + +## NOTE +Wii version have some games not present in original version. These games was developed from scratch. + +## CREDITS +Thanks to Peter Hirschberg for the original source code. +Thanks to ArcadeUSA and Rick.R for playing real hardware games and telling me how they work. +And then for playing with the simulator to find the differences. diff --git a/data/images/autorace_aimcenter.png b/data/images/autorace_aimcenter.png deleted file mode 100644 index a9069ba8721d88a9c91e5a0587e62725e9537d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 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 L`njxgN@xNA{1`-G diff --git a/data/images/autorace_gear2.png b/data/images/autorace_gear2.png deleted file mode 100644 index 8a28ae83ffab13173a23d6316fdd3ca6973e3675..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA+!3HG%>y`cnQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP_W3;#W5tp{q3}kyayBnjwlElNG&$tT5KRC zJz-9XuZG5g4w0L@c^iH_b6vBwui(JbVreE87DlEf21dt*h98a(zMj-tdgGc+c~0vi%NN0Z<`^Fw@VOhAf1)++QBZn@|eFK~!=&9{hL(<2{2PGsbP0l+XkK;+slg diff --git a/data/images/autorace_gear3.png b/data/images/autorace_gear3.png deleted file mode 100644 index f97172ee65efebc4be4009ae222f3cf22487a04a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA+!3HG%>y`cnQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP_W3;#W5tp{q3}kyayC`SUlAdOxzMh+!9U9 z6e?fN4hVRlw=4U{G4*{LYqnlX<0|-V%f`sm$k52aZKu8V+N&+k=N3k>>@8nzyHsSk ztHH5?Ta$~+7Bww6^j~Yv0WW6-0R;gL0S*=pmZt9~W*L_xyVg&*#GKs}k-K)wx(Ptr O89ZJ6T-G@yGywpn{73cx diff --git a/data/images/autorace_gear4.png b/data/images/autorace_gear4.png deleted file mode 100644 index b606cf59f2e1f1895602753ecfd18ad43f6c3b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA+!3HG%>y`cnQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP_WF?#W5tp{q6OQyhjuSTmlPNr?_cOanhXP z#(qQFH;IYK%)#luy7@`lN@4H5t=9x)Y=7N7$NR@mV`;|P-~SeyGOjgUTWXoUmh;8l z?6uySnT1V9Ils@{aQUY=7efOpLjog11OtN@m^qjIk;J-uz4yW`ADFUCB66pmsr(Og O0fVQjpUXO@geCxOu1A&t diff --git a/data/images/autorace_poweroff.png b/data/images/autorace_poweroff.png deleted file mode 100644 index 31429c56ccc6290272f20f2e21d285baf3008c1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<7!3HE7BzD~bQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?da(%J}yZpkSh>i(`m~ck&#A#6$ILTnxff)TDc)46+zF zfTRSEgC;*07uN!vKMX6_PdOPU9B$(c5UUdq5MW4MDEZ;xVRj8}dmyi2liOYfrp0j* rb#V&pJWWhb|JQfb7(9qeNMK-iG&4f=W8cYKpk)l6u6{1-oD!M<4%9ba diff --git a/data/images/autorace_poweron.png b/data/images/autorace_poweron.png deleted file mode 100644 index b7ce3a7e768aedf0a52a0b4fe5d7953efc79f6b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<7!3HE7BzD~bQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP%y>Q#WBRgJ9&;l;-PvrE(YN#YSIBY3|-<} zTwDuu{xGayKjmbcaJY>(K&(zcK!722q2z~$huJl_?SZ_8O>TP`m=?!L)Ws>V^VBpN wWgS?-s9=!AAj*^Q=l}dgj}i{-J#c`5!EthgYAu(0HPAi=Pgg&ebxsLQ0Nm*~x&QzG diff --git a/data/images/autorace_slide.png b/data/images/autorace_slide.png new file mode 100644 index 0000000000000000000000000000000000000000..ca23eeea5c281148e40a6a7e659c6db813a78b33 GIT binary patch literal 666 zcmV;L0%iS)P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0xwBKK~z{r#g{9v z;y@5Zn^!B4NF)*m5{X12kw_#Gi9{liNF)-8M1n&ikw_eG&(t*Agd{VWUG|--R6dz_uZyd&PoZpg$O{S(U4xR=k8};h3Gb<<;b@M#}sI+)95zL zqOF&On$T`ZB}%}0y?%zDl#ug!z3$Gn6H*BZ*lxEkxu)Oe^SR46APj-21O?FlcJ)*~ zFrYLF6lm%!C>22e+fi(b4IxZDKwxSbf&z5)tX5kRNQVjl?oFXo0259H08TCTJUb<0 z2?~hiBLY}Gq1R%g+E=U9bE7+~J%!*T)D~oqQ=1Zf7pMU3kRtLX;oJ8BRc|YrhZc=m zYCvs7M_ZBNjD11n3SgxQZ^6*4rvnh6b)eHShSC}U4S8OXmDyqm3LvcHIh%hVTG;ql z&DvrK3LyMAACJdx)lR6f*+Q&JP=G$zPCcc}7Ry@^vMN@qXlvmNM>f>zxYcU8VpUre zL6v??{+8S?qN0Dce@&4e_jCG_1dH&~{ICF#Z;x9=xDuj`9RL6T07*qoM6N<$f>$&u ATmS$7 literal 0 HcmV?d00001 diff --git a/data/images/baseball_blip.png b/data/images/baseball_blip.png index 1ac35104eac09541f3e0540c50c3ec060b40e51f..d6b37ec0d34d2ddae568ac9455b2e1878d8f902e 100644 GIT binary patch delta 78 zcmbQvIDv73r+X9w1Ai3bFN6K|3=9mao-U3d65+`|&L4Qdd}RH?8|*3!Nq^cOUH9R6 i!Jr|<6v}#pN0EWeT4a0vx1@7G4Gf;HelF{r5}E)TNE*-p delta 85 zcmbQhIGu5Vr(X;M1Ah!-mGSQ-3=9l9o-U3d65+00j(iLT0*vne|2MqNp1OC+i3te@ p{HA5T>Tv8_TYR`LH9J540|Tp*V04hSdn-^MgQu&X%Q~loCIIgf9&!Kx diff --git a/data/images/baseball_brightdigits.png b/data/images/baseball_brightdigits.png index 5d9e1dbc22971aab971be68db3967b68548b54c9..11083922aa1964a7ab0bcce74e2c84d5043e5f2b 100644 GIT binary patch delta 284 zcmV+%0ptGD0^9_O1NUETqx=p3EzL&%TvEnuRo)uWPULAb(_8c!0^$G~I#qeM3Ms zjqb}DF-spIo;&AjbXEq{G@kpryN?i$=lt(|0x1n>s%h!I^)6D+d?YLXNx!Ah`8`=# zJ@b*Q{3rdqLi~XA1602(qz@iovNY5G4~+PS`GUN2=GXhsxmv3<=FB#ACw_V=z z5njF^7x+|VK-Zp@r*HMob|KC7k96M2d-_)YY!}jOzux%T}N^O3CnH}jTe=Z|z% zjm$@~`rpj+2|+@`3rs?@{C8kP^!Y;VxXSBuXsoQz>xZA8^X2^|WNG+>Afe#}CV@%m Z2bPmNqVdaYbqoLi002ovPDHLkV1iC%i$nkb diff --git a/data/images/baseball_dimdigits.png b/data/images/baseball_dimdigits.png index 290c073e6a8343561a5f3ff721d41c40b439d203..4bae23de92bebddef7b572e582d366cd1fbfd7e4 100644 GIT binary patch delta 303 zcmV+~0nq;J0`CHlNq<`a01sOMD0f}k00035NklAd34)V==ME{)lKzV|xTqF9o;z<oK zzvvq9+?mheU4*vB$$Y=Nbq#p3^08WHc6b?~?Qyv7oz)o0*YNtE^n1+ak8}|u`5IpT zlm7aI_yPC>@D%gZ1um8*bb)DNT%8=!&oj=n2ob-hdz|^DCiMuGzrT+k2Bb?rWk9zy z5Xq1DJ>4SWmnfRlx8C_yQLIIMLKI6=7r0oM);`@LxgqcnNIC!j002ovPDHLkV1kZ= BoPq!V delta 300 zcmV+{0n`5P0_*~iNq<}b01sRNdNcc^00032NklNW6dO$delGLWii`7(s{>UsYm^@T^6(ba`rh_0G0#?7=J7c-NbYwyF^#Gh19+9 zf6*<-^JKn6b}`mWQu%#P>lWmx%BR)ab0EtYYbKF;wAW%J-y-UN(;qRLKhnjFmL1kzU+8@xyOQa?dJ^AJ&nlZ yXZ(@wk@0Iy>m^(7ascc4Gu6^nAU!ZCAgBlykBVm0000a~60+7Bet#w}CLDBYWz0pkSbo6=O$@?QyX7G#1uS(c5 eMebfhBO^nmK6ff-nph~%a0X9TKbLh*2~7aa5;MC1 diff --git a/data/images/baseball_pro1.png b/data/images/baseball_pro1.png deleted file mode 100644 index 8313a80ffec9b0c55d2d9b457862e65ee357bb0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^HbBh5!3HFkiqAO-q!^2X+?^QKos)S9a~60+7Bet#w}CLDBYWz0pkSbo6=O$@?QL2ZmEX}QrY|Tv#3^Uk1vI||fa+pbsi-%2$D?pB=;itpLMyAC} ezkFch;b90C9PW7ID@CFpUXO@geCwCJ2f}} diff --git a/data/images/baseball_pro2.png b/data/images/baseball_pro2.png deleted file mode 100644 index 6c6e7b6aa8cab2c744d30a5305fe8e294a8ae9be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 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 Xqvq#(-M()}s9+RV literal 0 HcmV?d00001 diff --git a/data/images/digits_f.png b/data/images/digits_f.png index 32da8343480602d0334b071130bd220d8d3d2538..4f3747846134b409ca145ee5cda6a954d7804d70 100644 GIT binary patch delta 362 zcmV-w0hRvq0*3=3iBL{Q4GJ0x0000DNk~Le0002c0000C2nGNE025d>vM9H-yt->)0w0F z)m@(I{*|3q`kgu2U)|-Y?ngUOe_uoMQT{rPM05ckAff_!6UiGXgkE7Dokzp}CHF|@ z&iR_&HF@W>&ilJN_ekeo?oZ##q|c$g9HVP~&;pOWfwOBpEAu^Q|C4>BI)7!?v@+j= z_CMM8p!piwk8=KnBP!qnL{yM^faH~>KdWqC&p696GJTXIXMLO5JR|DwK=0#AVCJ?z zXGk7pA~QeJM|mXEx0%g5MDsJYeP68*(Zs)SL-G<8Q|y6%O%Cdz`(%k>ERLtqz?cw4+k5NH2Jpa#6(4n`WOZV{ust8e5IZ~mKjPWzva z?AP;Uk!QXw_IonDrZ2xfP{&iYAu01k*@Eaps*kxgRdnY$&a?ikx~Y5PGnJXYcSmnm zI3NAZJwE>|U+10~K(QeAY+bicx&i+u*B#0E=OJ!9DZla8{4dc9YCLTlyOyqG4$$#^ z!EnJ;>A1!%edBXmI0Wr438vSr&9rTL{{H^sS6HPREa}%f3c# kyO)|0xW*M`fKRsl8@2t)3UB8n0fUOc)78&qol`;+0K_n#h5!Hn diff --git a/data/images/football2_poweroff.png b/data/images/football2_poweroff.png deleted file mode 100644 index 78c4455a965aa0792aec961e24974e393644cb9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^HbBh5!3HFkiqAO-q!^2X+?^QKos)S9a~60+7Bet#w}CLDBYWz0pkRTgi(`m~cXG;vgdgV(nizzq$Qd?d@D~>p zI7B*23p`EaW@c_<;AdxJX69XS;sR^MX9EpCT^$_>6BCgGf8_1!3~VYsG(0@gDxL5x zfW^X=$Lo+BpBN7l6O+bC$u}>>^(Fk~>@ZNVwT<%P&p&X0fx(+ou5$9K>UN;r44$rj JF6*2UngAAFJX!z% diff --git a/data/images/football2_pro1.png b/data/images/football2_pro1.png deleted file mode 100644 index c3aed24b9e74ed7e894de51d88b20ad4befa6506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^HbBh5!3HFkiqAO-q!^2X+?^QKos)S9a~60+7Bet#w}CLDBYWz0pkRTgi(`m~cXG;vgdgV(nizzq$Qd@|$vu1U zpkWi6*oC8q#n{+*80GkQ*w~~3CN?sgoISk2V(W$t2^TH|Fnq56^W)%$2M3wkgvIk3 zZZb1wJWC7^`c|+ZK|nyj!Sh^#|Ne@D1&@xjGJgD$p=rB^k(rs{*aEpq@iXhD0qth+ MboFyt=akR{00(JD#Q*>R diff --git a/data/images/football2_pro2.png b/data/images/football2_pro2.png deleted file mode 100644 index b199d2db8e16e82fb12608ea01ffa5b14cabea0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^HbBh5!3HFkiqAO-q!^2X+?^QKos)S9a~60+7Bet#w}CLDBYWz0pkThIi(`m~cXG;vgdgV(nizzq$QdR?RL*E_ zWLy zK6AzjAb29E^}Rz>bn4Wp94vW{Z$)oP`Fv;kgvWX-`X8S^D)G5V;nl9TAgzxUe|;_%PXQNN8wxXP9Fu zZzHj@u}u)DzEyWa0)vX(Bxc^F)1EwdkYHe7(6G7w&yU8*|2{lqKHMv9ejv+TNMTi^ fAy+~}BO`;ZrTuAnC$3na4;VaM{an^LB{Ts5=^9*p diff --git a/data/images/football_pro2.png b/data/images/football_pro2.png deleted file mode 100644 index 75947cf8231082b2147802417ed8951937e77576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^K0wUD!3HFQ<0J!t6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H|6fVg?5OXb@)9D384j6x`_P;uzxL{dAh5&|w7u*ZSz@4hI(nfewxo z6?cbc9D;(jPN{vJ9V;9ZChjmxNwCUYJ~`yQ@$TQU`O_LF2fboE#GxqQq;c8qd61_O zkJ#s$=4-oDe#clmFMjEnxb~z)k1 z(vlka_{XHsOsP5#Db2+FDWR*j)Y$I*u3FoEMLV;HF_}km>H1kKYkLIG?bQ9<@@M-a b`v&#p-|X){x_oy#(D4kOu6{1-oD!M<&?ISJ diff --git a/data/images/missileattack_screen.png b/data/images/missileattack_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaf720ec2a334526e4f690fabed1420ded9fc04 GIT binary patch literal 34174 zcmZ6ybyOT(@GY7EK|`6s6Ho2~gj?dxtJ7BdPLs{`cx2wSYbJe%g zduJ7C@plztLvy5C_VyvNLa&o#kU1iKFg)%riKJRZ&+l^mj;skfK7 zcb=-=b`Xv)y8D}-B{2H!toz!5#eX1IvnU_fO8n50PE9^IfKnr!E?XcoJNyJ9np~+l zz-Ti_GBP(Jv(5Z<3$KZ)7_S#*B)>n-$_0KAjG8>qsaFq1hndyo2gM3gO>c3Z9I>`KKXm0I|!Gh5noL2mD z-%mmXIEcy8*OHdeF6_B+$r+_r>T#3Qo6AWVD3#koY~@iZbY#X{K~C;xOB7TNKLdNp zilt|u=VkI%sp)Dp49a|k{)rqVZc-zH9+`u2al>s{Po>XWFACj^RmGo9eS~LM?9ZCq zIiw%b21dGSr(lNCM$~Sm>hdMO*`ZV(z1&Cb;m9aNMtxoFSt>mE5&Uto!;;)PWsD{T z$0*9`w^8rJ`uFD&V{%%yK2J_goV4or8a?>j`Zag1RR^;f)0zJ~CglY0-slbL4UqbF z2<&#sG~TS+o|u(YV}D^J4x^^VR$A~YXxVEz==;wjav=s%S%dsFiYEOg3>lMKhc}0O z2KPZf&=~-acvl#bsf*@EuWmZAtz(`2fww(DCy0J~`X@aR7z0dqo$V1T>}Ni9N5p#u zcK(QV>wP^jF<&8%j;+Ry)Xw#ku1s-^#`xIe5D6w!OjJgJIORWu16+|MNuv&b5|@=>Cw#BR;S6#>OF)S*QtT=A&^^HXo*&fRj z*xsL<9f_=JEZN(yw~oCEIp@4Ce=yXEAdS1;EW%fpN*oCzKnLx6Olh0j>644Yg=%3Y zYLlOMSS`p1Kr7fkyK11GxPpFS-;+x#F1I`nt-M@~ba>5o8$XChTMV>PKdU6Rb0aZ4oS20Q^g5MjujqTQn-McB9Z*2m*H@vZQx^y8oTR!shL@WxJqLt~Kr<2$>O5OvBbF4&g8TyT5@X{Ra@Qc!+VcsAvK3 znEDAz-V!siuDU%ZdNdw~e{lo;#TjdOKw^m39TbvK`B}QHp{-`M*a%XRvN=LNi5{on z8NUoFP{R?7>S~f&J<@V*58>CGE+0q^jO`+K60N2g;EV?VVvqM@IXJAr(xVLF!N2di zY4<-W1L;)ng}NPql|);aN)GESaQ3wo8>(p0A6Bho2&-)iBn2s?6BkcYA5ZK(Lr5bB zHHL~rN{p~ep(!4=d1_y`B50i6b_`;=*Hn)$XhrOZ7xH5Gec@bhk<5}d@z<7>qAePP zoJohW6z#!Z58D;WCZ67wc^%w@$@lw5^n(s?+2(R6(pCDK2i;&qG<9`4qU;P%2WK`5 z6T4|d4CkBF>h_gkqdfFlz5OCxIJ2+MX%mr<4;WdRM9g#Hr6YuxI~-Q!E*?99iHj{A z)r+}gOWX~#pn(#$A|0Fy#TplY|4K?^^v<^H7t=FPIRM~GGgLOsW=$Ky>D52$@-S7L zp&Dz~T3ObrCbV3K2^fb->@;(d71?`6jes`3~McL8*Vmqn1YWeGTI%kv|BdmsRr8z_5jQG-!>Tr(l46W`*p|+t=p+El#HXWxBuok3FctGFBRGDsB z(W$~> zzSt7FohoAuUa{rtezv1VYeEm5zsOFad(~C8umDHL38@WR9(uJ@8T`(;I^>XHWa!`b z^&KgC!C?#oi6ufN#Hv%#CIhCCPN^>}Kg31pa(po7>~ZP~KgU$PaGSff`?^%h$324t8q|&#=N|QB#Bsc3bjsI@xbc## zs5$ewTNuI$euLtfGs-WKkWqAL$dE|eT)*~9KTs1yG3YRu>ehd{_+(lG+CVAQ(+}hL z<%9WArNsajNf-5n_+!KH8SZb#^cpa$$ZOKaMh^) zG4kEb00#->54$27TGwHq7v6=*l)iIBYbQSxj}a?@U140yO34mLHka_$VwrkffwXkuF93j$V8Yl^fQNsT&EF;uAl-1Xn*FI;bG|BiZ6!N zfA^o%8W~f!;xDt!{GyX@oQN2k(`i>gppp8balM?ADp z0Y!fOAhv4mBgz>>a}BSa>zEQcYuo>z;#vQhx@$E!6_dNdq>F!qf<+7$J?l0| z88_lb&9c^Jq)ES2(yt(nsrAyGOECZ;QLMa`TFpmIwF^Zf#~_V)%5B|W6vtuGH^Yyl zYqaZ6e*vBkNJZsvR>HjQtJ=neFz6JfGWG!WEVj~|jB8K})D>N2dFD5QeXNITRJ=gN zJo{xx>o{#4sZS{p6^H9bfC9Y9E|J~6Q8!`nNMP5lRB0r$Y9t+`y6Y_xNFP3@jQ7OIgzP^i#d{q{OjE1V97D8ERy~(zDD65vbk>FVu_=H>0Km zi+VE)1v~7O7!%Aeh#7SbU{cF5XgWkq_w-D;-nZ#`oP6cGgXWCsmVXl$xxo7lsI(4$oy+npTrzKA8M6%OMIhEVvYTq*{ZXAZ~U{Pxpz!2pu zchu33m%m9wYn$yo;lTFMzQ&b4$tRSr4s*^%6#<6KMqN@u=rDNu&Uqrvw~BeYQD^8J zQJS3S)Z~+7c~qbvUiNHtId9dmmu=~bDV`T8{l}a69oW#kNmJwUSa~my#Wa>>N}6Am z^?>Gi@V%$Qr+YHm?ckNz99FsQa3A~+XB@Oc0MEC0a5j|`^g%dm6%S?(!T2KU@x|B* zR*SBp!?i^QcM$qhD5<}}Lxq9kr~qMN-6iBI-fk*}C>F^{O!$A2ra9m@YVt2kDt4l4%hsdJ~Z$!pg!2`%`_>A#-xY?qS?8`s0g z9rqCbuMz)m=4K7;c`IgD5Ow*>0@u|f8-Ja14^89Cq0m%z-~Dl;tM_PnxHuEZAX+ouy`HNc zg?feJoZ{LsYto*FOcd-N;_=sB;1PR}mtKe>?1+)%9`Jf_v(QF!(5x-aH;x zo4}JLy^<91^{qau6&1)M{JO2n?>BwpdHG~{(Ch_0wn{-m|DO`X^`w`RWA9c4^QM;p zX9CCiZuhI}B#kWx2=PnlkRO)uL41*mG3uU+6lo)=HN(@ zZPs#?sY#mUW)}@V%iT8hpnWcUKC5PeOK@i2*$;6~;quLo%e6rsJ{xFZ!(+v9-@!KJ zJ-Yb1R+_SU06T!9$lk8T!axdVa0rD`bz&$ZhE9nCR&un`rhC1zvN9pk!F2DYuu~%9 zdN}meji(9D(NopFf9phgE_i#330&SpPrDw+jH_zll^7wRzJZzoCrc{xobFD4u z$3^3}wQ?fp35UWDTOL9GDrsvANZm1+jE(X_+txE(0hcS|zYRE^!?jUq)@4SonKJN8 zyXsGwa-H_ua}v`F@u;gZmVTbShg^0J#3PUJj%JvzCy(s^bkFw@r9D6FHzOqEr@iW7 zL6K`;3tCNTb$1+hNE!FHEl9R4nhGjxa;I=G4(PhtAwE1w-s`;J0}viJnwNiWGhZLm zXnq~kxb|w}J@Wn{vOLYhKs)Xxt9d39?bCZd*zt+4rc;$g_ap(|ppyZIz#nt=;{iGI zt=*AL71ui%zKT8XN9mpGX`TY}`RfP|1NZV0cxSe=J!NI>M}Qe}N=SCAs6%h@lc05kO^lSeUY#?~^$ zJ^a0f#@T{%S4hNY40YY?VsJ!9OR=H$#H3D2;yzjmWRK$CFYLR4V5+K)*Ie(0VQCTp zD*LQf>SqZ{flmN;8_ReXFJ0l+8I%J;7k(`R!jzoXLB~bto)=R8_ISrd&B~!8A`Mo| zp#N>Pw~4iMdmQd&U_Qh1sqN@gIiMT=^%NaIsGf5d&Bzk7?wae=<~+=dJ|nq*(C(d!0odD5bwdAb*>*r;X5 z5iOsbCV@)#kz{AsBke!FV>ICL5%N~Wu=;M2u&yxPuGY^YZcAuYLEH7qEfQLm^bS>G zhBAum0a&+o_6;8m$=P1w*`0WuMQ3)Wpzv-1qM%Z4+7sOMjG1yfAsk6vB>u7SA#1>0 zOX`~ej%LJ~B_5vWUB+sURjytpauJJ5M$yDfZ03nw<>wC`b8Sgl^5Sk=BPh*|50c+k zL$KkS?+Tv>Or|@Gxn&m%;X`dd{f!FgyXqCsF;h2!s_0N_D5X5zG5V|j12OGZKGd>y zQtVY+EjgyU^SYhs>1@Zm?o!vfX_+$71Bd(yuvr{yUx8RII)HrGS@uQEK?IysZHnidQ^ck`P! z4Ry@(o?u0%oGPkgEI)AFlC(r<(aXU!ozu5kcGPn};`xL)n*PEce5__8Q~bNJWKkU% zi_L+xP;|^+ff~89(wf&Nb5noTL7k)OB)-t;b@9XJ{9wMopN=}TPB0>=U}R-Umr~^M zZ|hFV><+c);dATK_6KTW1=XfLUwHcVTXb*4@rRXpgM>=|Tie7&H1!$jnXz$eb{Rwd#YgGPA@y+(poPV{5d^&3GRIwNxn}W?w%+(+ zI!*ROOWegwMZhIocdft3>R)IhyZ>eVG_9$iUTWc2@7=o}%_W-lp8%G=`Ll3(X9V#X zLX;freC0cT^%-%dUqAzB;-JcdQ^JG}a&)i;3BlN45+VFUnOL)%^&ni59&5Xw`r6Dz zh5!2UUhDPBFH@qI>c5k9*t$7+rkjxN#H*v5scVRCElxmF<{s}{D`wa7veO2OtXe5j z)z7oP<0vQmb!xI@E!{NrIupSi7yW2XJEQnOe5Vw{3hV1au&)J#BUb%=Rv*$gLsnuj z(G6R7A+qJ@HcFRV;K+`65#r zH`N!X@1GoyR9AT*h>oB-j8NKW2?yQdk7jIlo0MM_fAHo8QUtxnPUP61^Kia`=9X_nSp{ocoHs4$W-$S&9nm-?PcT}MPu!@28dd;=RF`(+t|XHbKZzMjgN_3 zR2Md7$?|WUCEXWsipq|U|6TFI;s&jgcHf=|4{;*902i^pk3EmffHecw5E$2=fB*d!2R|21+7H;#d?TWS(sUSKt;}FUrr2W z13YUbu?Ka4VLg!D(jHpBrg~i;mIVBFFj_Xz=}pLZbqiY@Zf89F*;g(>X?Zl+hu}?_ zr%lMLPWQQln3u{yW<#C2s$*#oR>ylwvPO|*TaT@|W8wzG#rm=jf0sSiZ4#`z<1tCTPj`ck`L@ubSsX&062lhy^WNz&HK4EfopCmr}r8@p_F<76C z6B%cnU5DE6*K1?8fN>A1=F%`D)jw=ZY>yL^$V`l5tE3nazXe^h{^JgZ&G5{Q31f|@ z>gEE(!qaY@h01fkfofasdM1`@%?@7`MawqL_`hXVnlMaqjqvC>u;=FFGk5UlTV`Fh z`7*-O_nGJ8{=n}fFqwXDj0d*Croxjf(gFR49|)h6UD!lsDQ{2eWM|Xlv+k4AqTu7p zkT8`t<=VnT4#Z0|!lx;TmN|mA3jQ;0 z1Hqp)H)v_tF!XZO>3&yK%*t^d?*BX^vkv}GMfgpD2TdG3LFb;PJl*p!gloM<-c;h3 z!8oAswGR6)_TeV+1+wwn2A88GG<}zfWvZC|Q(|5+_y;<2|JkZGaf}5m8!6YU!xH`f zPD9-lFzbVdg%^CY)p~TL%kLpun$lly78-_qiR-BUPd51a!L%>IywyfF9=>(i#M^wUrT)+V ze@#Kah%ZAuOKoSKdn7u&-a>&MIRDG&d9ZO0&X-VIYbu&^7+WQn@tgJI8~ef)Jn;N9 zp+p=z*1%7gRYxK!7{+=|^O7HQl_*~R5Hfd|`XGowW3|IWuvE}o0^*pSo)Q86%|fqE zZ<^(#c&oXV5Rq1#J!+qxq)(IGN!IOx;EQLk&AaIeMB9Fno>O)FkA14B3spTRIG{C* zS*}6WnR=Pl{v4Ep9D+AEO>oLMxFqxPjf2NSu!{5t!56~9iZeDHoP`SRKj&R?61*fH z=j?i-7^xJfFxf#y2eeGRbZ2IEWvVvdx)NFvni@ggw2ha@lM00CJ} z8$NB##VfkYa75bV@*Gl#U|0*yqU#g+!HRbZmy1n&OR^hf3Pw(n7~WdmG**OGBPiah z;A4ei@AkiJH$Kk_x&A3en;dn>N5s8ef?+(DJ7bv*zAl1((jm$-f0F&0ddOudA(@i# z9`~Z-aTaK;2edYdEvG>kHWH6bM*V}BG$rg!1~cK{h*R(;x26i&=%Q`c*7XgE(-sMO zWr`M?`-v)o9bqjaLshYCp<8m5N?B)~b-g5>H-k)sFvKjG?&#_N@GQM;-+3R>yv-Q= z=(ZLEN0}K%i7~@1l31K%po`#{cb;z}?4bKe=z@IFb6lXn_0i5b$9Gd~Da=Ny#yBsY zfFyD9g#>WgOfRuIZ`xF;!(nVJ)v}cQ$#Stpj^B+mQQHXENSOPU&mK9P&WL$xpR)kch3|>{Wk5r_>yfZ?vjGBp6qnb@_zd z<8_BX7}&L~<~~rmqe%d^MVYj=0{GjLT=bV7ne45e#lvH?8#JuBuIQREk^bl=4iR0P zNzEre6^)5MF8p}w29=KIfNQW_FQpPP%C}u>(>nwUP-(AQ%n78+@Rye0B|Evu`_o!k z6%*X3Y}Fy21Z2G z2eU_IG-L$ZE>~+>W#~i|@1C+up7gX=giBqwyMp$arQRe4Bqn`J>eFxI%(a7WB>Jc% z*X87hi5F;i{ykph%H+rDxT;eW-J+eq@fqMSdwrL-tG8CbQ-*O+1BnCX&;!k)@4C`Z zg*ORz3IGj--9eKa)|7njm_j~Lm3&X;dbyib;j_{)RAyP_WL*&Oq-IsE;(c@@G}ZhV zi^T^N%s=ZiO+!u_YD#W(Jb12g;|qFFw#O-;r&4jh=dws$X=-r8ge4 zFW|5IZa$CC(^l2*+6Hmd$ykrOD818jXI?unTYq^XM(Cv@Diu`j!#vwcLMQ zf(nI3%PMeKUAO|59RYx8`Egj)G)Fo?$|Sp0K9HCa03cA*Ik_OyLBFz8G^a5U-%%b+ z!aw~{g$J(YAxL?x_e?krqu$o#W_~R^3&~Xeica%$3?L9Al0SE=Y`NGmYz2vG%ib9+ zE=?ymF(5mH*g6Nln_x%e)0lvKvWY-?572-P`2`Cyq4_LG6N z#-$uVSnOb|>063aw(LKYvE-Xo*=G&t)sMKeHTA2qmPw$Af|LZvDtkyEJh+CI4eyqR zV0k+a7&XVYB?8^?^>UG!b*AB?du-^r9qMowt}q>a1_d-d-hosbZ?T?3S_Dj@M+@lq*P*^=gOaC*cdRMW=tMEtB>7W90}V zB|F4~$&(P_+BTpBRt)J~ z;mJv1!v_U-VScb)TGU_-y{Q|{J{grN&S#*Ye3MH#4*w&0l*LOJbchpfWJMy`8O zL*vlS@Fb#nA^f|ysUZ36b-$H`wr=E$yo`csMx6WJD#oE-gs-5vCwV1!4Wh3qlMYGe zw&fH@fCP%_TZ2`mRA@${qX&BpE2&!S2a~gPYJ45O@pAwyC-!Kr9xT?}ze)jo&x%po zHJQ&`nTPeQ?BY6Z6gXB_$l0k~5_f5t;SAHN2k(=UJiZB^H9P71%WJogIm&Y)GM($r zd9#!OA$bpFX4Hor#N~5QPPHwAn86j{TJv)ANZTs~`Wb9?hIGsa$19^2eeWnFPv0ny za;HCLD+{%GeGj(A1qX++{Z4v%HZ7{z%`=p~pkv3RzfQ_@aGJ#ao1C4-N>>2|fP)im ze8)E^>Z<>%@D_d+y`?;UUM20EF|h6X)kC#q3bER010A zUyczj-u4ZhX>?y25Ch0eH<`&B2l*C8cI>oAwVAonQ!+ZvP8EhCQRUSX^LeYB@;w)} zJuay?yIaV(nG6)jRw|URdBA1K29p1VlqB=d{&9Pz6HujJoL^@pUge?YoM47e*orSN zj<>`vpyyMM&c;h($m<1^W5UG=RhJuGl0kBB zw6>@P+eJ$p?~FwB-LCuxk1Yy2QqQpZtS65C8PfUnCC2!?x=I_ComI{>!i3cihrusT z#@EPRaP?z!&X>u0HG3V>1-5%@q6M=*QgVPzOLWSr}g9ZX&rfTN7o0IHQEPrL9WI-uvAk zNUX8q(R9TtSWJphnlaAz_EAyG7Vfdv^qpW{%#8&AUopFLg>l{c{I}p`UM*;e@Q@}( zi`jvlF)|r`Q=-jbZ@i?hFSuitvji`eB?G8oCQ|(M-HLyO4ny20j+g>PpG>V44F zAd|bWzN)!`l+LGB=Ak7oRX@$sQ5i3_;danFY{jCF)-LQuusmCGp2Fk=k5@!OMK@tQ+5@Sb>tcb$Q$C-}Vc+oF-`!!G_i7 z*SlWR`)Ss8CWDtbS-zqvTYN(ACS#sD>l^`8o{n$a=cc`_U^Y*7MSlgjz>W+H6k{&-LM%#UO zTWh5f0g#93rijdWA!i5{%95EhmryyVb*5mw>7++*uDSh9-~M=|#IdC6Wyyqh?nk{; zz9_evl#qiFBA<)nKB$dg# zB|jre9xpOm#ts6eHpRJZm+V%l4zAvPvqJp9dn8~2Tc7Cg)JTi7cBn2N5#XRw)f^v& zx6g@nhpOj0S=D!iu9cW>VdytA*%m3vlvFN*;pku!mQ=_bB@Yb>-1~69jmw9MH8Og& z(wMW*FAiv<2Wd$}Y)mC|<>#hWi+e|z&dl zM9RPQRfezJxP?lI6f>-jqMr*FvV)EsTFz3`Hr&Zq6>c)zpYE}C| zfuy!DAe)8HE;DHJR@|pO;nY3eh`$ts+ zc}RQhT9cbeTRapQD)g$}qnn6V2p(6wkJFMrtQU;j3!uJPJu!kmpZswV=T6GSD3LIs zwAMu9e?F_ZBVDQAV3w-xh5$nR-(HJ{1q(0#Cu24SJm4Z61$Id~8E}19kZBsPq=V4H zfdl1M>MTPUT#CR(^GqhEobb46%>&bxgtxCKWO%^=~uOPSrBGvX`-EA>W)@B;_d2|LfjbE<4yBI?IZ$^m)wJ zZ7t}F!H(6Vf5%6Lu^s3Wi*q4vH;BQ9hx%rbJchUAYM;f|0vF4)e>LC?vefT+mY1KP zb~YSn5f=~b6;+CAjhZ}T4INe$nZX+Pu5Fca(fS=^%QF|ayg|C$o3LP{8N%Y}Na|9+ zN7cLS6z8E>8T?TJ1WJdvGPaYJTjE8lomIW%^qs)u$Cn4_{OHm*PQpz$GW_kJ%vgLU z3BN%sPdvCcOA`IlGKqE7R6cEwo{Y!?w6vs10FhlT{Sz1VUh?s-*K-;4$h94qJ}#1n z75a&J;8SKP)k)9A5;rBvSzFrv=KM+BiOkJn#>D!;g@%}?!q)*OQ-E}Jc)BQvq3B`Y0mGMl*4=nG~jqTPOE z)sKB+kk%M1-@(Ic{X?s)`UXJ!B^$EGv6cc}eG_nOSPoim+y>8kGLqiu?3@O*w0pO< z9c7<5y-t=pb%GlVo6ZLD-h{eovy!$)!=mf#rKL&3?T`h#)ZCq07LPN1`dEQ+vn~YD zHW%GyCyCAknD^r@&0Ww1lCd+S@1&IX#9%Zcf|Z+{<7xcnS%%%`zuLH2VF& zcej9uuLDu^%t+I1pO4QXfB%g)OWc?oHZQYxrcdOU7bcT!~G5({gqex)nfUwii{xZ@Qiv9eLvyPk>36=+D9sD|9====(KkA^vZVprHbyR=Z>)MokHJ^p{vZ`C)H{{Sdk;hnA7C93d<}A=d3P%IyrwVaGEEF zT3T@bMqI7|q)xj2O`PFs1nJe{Q77(qUj-&bN)c#ou6vvlUhEECHt&-EJg+4crr~J~ zEw`rXxj5CB^1V)LEF1o7RF%91Av{_cA&C@anDH?5{SogT0VI6Bt7p7v>+$Bd35o4| z>;@2`q71s6^0(=53;h!do8z{7nv_|9=p<}ilyux)+rZ{{FR+y6U~@gUpv$=|K1R6} zTaXqtd#$!w>C_|Mkb4d^YwTt%err#0xtPMefeTCdt5BA_3~2cNDzraojI^t3!(Rri zc@%`SVpD~UCdki4MXT?jJY~%3%)Ax2=4(;gcGa(ba6nkA%_OC+oQ5ovl%^+*g&+yl z5dSOHAy+=*yI)&3X=y!B6?lQrwBbR;z1a*Ba>KxpM$fZLRW=-o%)Zy3M zp3t4l%iX@0UVK-7X6k>t=dOI70?~ zQ0xr8BRXr@?BjlI8KMD!OJ{#;wEAaWDZifj!@E)bGXrP6A-QR+ES|vj%6Ho zdv@#}LVnqGz5GmqKvzIByz@(;Sb_y`?Vj3ej@LElC`_iJeWedrt;_t>C38vO+r_OA zMjIzME`%er?n~x>Amq$!V>WnGRVH*h`fcN%#Eg`N^}7^oTM$Q6fZ`w-lJ40v2z$59 zs2N*B^{!hEe`hg;WiZB|-Kev&xOHg3P}gm@jAG0)$A4(UFFVMUYq$cTwGctr8LGJ^ z=sP^9fG9@b5UNx6)ULUD+T*=EI!n_L`8{OhzCu6>4u8Eu-5%~X6GGhnZ0w{blw`Of zXT_xwg?%zl0N!~6Cfjj`;CtvHzo!iI*5FlQorcuT-ciO5GqphxcyQh7Fm~YjDUYD( z^yNqL5tqu9bzyCYfI*JHtD^5GYr@rE#53Lon6BknH9K#;QZ3ZVWzPLg*d8tmGT@l0 z(kh=X-F%e@O1kZ27%uMRmIG0J?@Dgy(pap(6zPEPra=fh5|8k};<6r4#s`h&2Q3uH z9zoO(YY^a~V7?OOT&WxXpSJndk>JXw%8f9NbZXQbiNp=(?fO2l%}cMGO~bR1#QRY& z0y3Tt&6lD)->{8qN>(1&8Hy9TZ$Z?6%O5HdGiabCXe8LSiW=d*ULJbav`grv(3mXk z-%v3W?d;boyoWwY#rqa_A^QpOPY?3Rbk&PYF6&5Ch5noafmu8sA9A1Kr0Wl*I1{9x zL5aZP3|0nwjsM*Cv$q%(5yz*iIV^JT4EvZm4z*>(vkwydxoq#_` z?|j|rxauDU;gX5-FBCe`T`7<4+wZ7lpi{*D@#ugsuFN58JQl?PztrJOVi_@R*RXAS8(Id7RmUNjO-R(^^Lr}qHo zcuwt-mrD#VxbybUhuZx<(Qf3AWR7Z-C!x(G+22$q>9^(ymzdv*gh`shyiBxjoY%s{e(!4Z!Y~iN z-CXP%;Ep})N_dq?|73gWdhmyXK``8tgG$#L{viD^{`b4mAKqUwt&-O3K1^R)&m;GLe0ecmquL16$KlH88Lx|HJtG22trY1`T$+9uh3N?g7}5z=iRF;W*Gxw>B=r zg)mGa5&rGdN#^c0eNhChBAX-b&1&iGMD`Fi3^^N!Wb9S>H%QFiaZ^+~PG9I~DoTt0<35F)7KFNpJ9rUl9b9I7a)|Er5yS-No zhPdSjl~>d0ch2}Q7nyM0RUtm!I6)pf{64t4i-2rj7mv4q>UW@(IDM*mL>SQQ2)^`) zlyc%b{OuCPJa9v_7V)3kTR()N*uqbWWWIA)Kw%4}8jAdhOVuSrEGdIPr$w*uh#;R9 zoC#G#4J)HLG*ie@^IE04L^-C()#US}Op@^*T)z+%L)MkY>>jW_+eb?~OqyKIJW7PuE@CgY+rbg>bRryn5n9^s;s4pXgE?BCdS$YTD(65H?OQPjv9ni=BKQ->wCZ?1Lghg{d$VUtwd@zH{bj?Lc$;9#>xajf*$&$DkIZCo1f+kP(A>v_Xp+i`AZGGKD5Fj-y=)7~82dItY7qSYRq1}Ec z&kb~m>-}mF!|C+z*qh5wo>SZ-!2rW9luu)3uDU2X{ zp8aLMI7M zi0e?#jR1vF6*lL@|p=DdFYzrcCo2`|D<+v*TwJrNi#wH z*^HUKS{C;PP3{}C=NTi_ZTQW%FlI<7==I40SkYDjU5xI z-7P$6Wyfa}Om)>0$sN_&M->$qTZkU2|Fjk}g0+v&&krAk#>ka9w^CUh>YdcWge|n8 zo*`XkzCh#f@41(-0kO~NU5QxsE*L}F^%jX|Rctd2;^Aa;dCAkL&+<*~if7-o$S*u3 zID?NEik_|#i6Qhty}*mJZ`NuC&^ae3-8Ge?tpRwRbl&+!+nZ$N+@2s+QBfu4-Kan5 z>~X0WpVtBln$*3bmeYVv6?IWDAtEI&ApfS?u#hltex$%JNx&ZZf zr&7MQuJE@N$`-aHp$6c6l6&6aJL^C6djzsTAzjX?`GlkPUQa`lkbN)ow}MT}yE1;)<%Ad4XC2J;S!WI4 zc_+jjKPGlNAgC2HOq^3B=>};HVFtJXTU)wil#PAU~tL+Z_Wc1YnOv*sev>0 z^;5B_g_O=ftUzgbnJ5*NJhU)}#vlX^Z11@*!!kU54DHeCa0MN*DxmF(n^C7~(h9p%rTs=}V< z*l+*za13WqRwgf(T5wQEz*_ytKL>WHrpul#PBM^skCXE`{hDU5?kLc>Z50u=$D>(S zVA3Q*GLf(a)=y;!9NLm0>Pa2&aul=hd@Xp}YhToZe^f9D!7wE>{CMMtGl0uTrJs$$ zwq~y@n!lo0u@uEm$$WH7Om+G9<*>ORFo*lMgdOR_0#O_}`mHEG69+=CmvmjGZh`3( ztltc(hNe*b8&CKD;p!cu>w3Si-Nv?U+l|%OwryKY(%80b+l_6rv3H!t@9zJ1#(T~< z-}hMKS$jR2bKdtg+gKRtC?B?+7<>^^=F(wRPepBZquvFj zptisL-gI_Vh)VHLl2p(B+VI$E6&S(uJ03p@!o9H36Ll`KSwmP*O!Gcjp?p-PG&8hS z=4pXeYXv|4n6mGXi>Oyg@out*Qk9yWb}musMUkSz*&pYjXt=;;$r`d&v$9ui^DSrp`!%oZCNSjYiBj$KQYbdsz6RDB*3kdXAH(@l!R z>#Er-(4f!BBry+c=G@Am1j=}X@X_GLa}YEK8)o5l!^CXYc=$~)H#mI4_qc5CvTBwI z6;@qmQ_|47cNbtx;Hd2iDX)1P4vBu!g*Mhw8N_iVIzbU4XPfSX$$m(^8k|>Mli~0% zwxnQOb()6LrKX}q9aGKsxL)Hw#_Tk1K2tRJI@C{* z3L6BBiXvOxILA0zCir|R)+7%CL4NQy_6>$gC?l3$$|x0Gs-GIbr=x$KTxhei>u9A9 zFMkdSr9D`iql1&%u6Ihf?|#{@cYlR1akg!+Kns|}uw_0ao2FbwlbIuf*D_V@E_#8s ztxfZ`pt7Dx;1adnU7ZTW*?AF~nX+PyJSNT`T9-bO)uM;!7wke|CU!Jn%S3U!Ei(1l zZj)mLx9AoS8M7T@Enr%Q_!E_n%rH#f0gV{e$4Ybx{?B$7Yx@?^raU3q1p%VS*z6UB zU*0BJ-3Bg{E6U!^u8N7$p$+K8YxL7&yni)ywnFu zh(_ppM_Lrs11P`=&(9LEdSAV8miNVw+oxsqM2F#zx(Twf4rlvbCxXC3smFi(;MqL4 zYbQ7oh8F8$O+{y2IJ$eSG3r?6wZ#yMheZ`7)pb3TF6~k!mKl=j9_J%w$`~$v;yJUd zNSY>a<5UD$I6&F668a}-v1J~dz9!-4bdmrjGTH@h#{BV0!&imMQi%hFR8eep$TJ!+>a5(xe{%_Z;J&zU1u!t`-i zLZ4B>NmqTJw@?IE!(8T2YREwO6gRd7-TXXuF#Pl&cVSez`dU$Gdg!C)fKr17L5i4N zTT`G4jNXQIVQ-bStFeNPO<2;RMq>JLrdZrI&wo98&@akb*Aga_h`?1+JajFv3K@2jYpS=g$`(6*DCVujdpA|eUI5{e(vi5Y?+W1DPN zY~bL%UId2dR%jr^jT@=zE_uPstfHoJeOhK?ms;j74Gl9a8-Yp3ki5=aH7IHf^aauk z-7OHJ+PNhIv(%9>B52rHi`B`UIhuI7%If6-uj`BERy$=YPojcif@iGQNY&~%9&Zbe z{`W$T!x^%G_ho&&%Yj30O0pD=Js+&de!99Hdg1u@C~K#$1EDlu7uz}7mg~6HwFP>5 zjZW0g!!h`TlyFT4IB9t@)?bg3Q6(c2orw6-o)od3*C^@r`7^9r&5fWtQ5nT}&r+GS| zPBRu(HV+}m3GC~rSqUD#>QcA!op&w1Rw~`YNsaUX2UDNdH02u|CMSKM-(2*An;QX6 z19;rhX9pSyEaGnczO!dbBFlp&0zAKJJMYCbHpinA3?80x)DQM}`13@Tm|y zjC{AJ{$BfKPn(W{JoditJz>d1w;7bppurLggH`BQe<^!h8`sKk*2{9glg91zO@@m2 zpMy!*TADU&d~um7RQoc6?D*bF*ggx#o9M9Cd~GD zufM)F{x}`B0pk=hEcpq4VHfDY3iayEhV`J)cc1z=vaiR0u0GyvV&RL zSL>&Md^`+wdfP}E@0`-HBCNof@0{-4!;0-8un~Ha*v@;-Vg(4?wRRE4+ez#g`K56Y ze7Dsj<-%2GCG?!bLz;3G6?i~7# zGgc2c6+!u4Jp|i8FZ6xFr@aKG#j(8+*+d|JilC;Y7558h@6&%dQrMx3>oIB5(uJOo zP0I_o`}Mxs=dbj6=%C-qO3tRmoJB?+Bu~ZabIfmR*2UNP&Ua_<&65d0_5Ul6 zP!X9T0@GmH9bNitkbQUXq?m9}Cc$97pW_3im4&=Ze;ZvkAm1#kq$>;0ewdt9Ai)35uf$}dBO`pIE} zRrV*rqph1Q(ODl32HskqcQ$qF?MCX1x=c0@X#dwq^7A1Dt=?^c>BRN=(_hH@Ke3Pr2QrW`6!|k#+2*Z(zD9jKcrrQ* zi~L%gXbymu;hN+RBqhYlG+5ySf7KY6vc9lRoaetE?z?|GsLojobLL_YU^n=`7%%C6 zru$I~0Z&zTTRYlH4n&|IQ!5__=Ktz%nkTaA1Y8y}4dwMtcW#EJq0T6_i;1|2KX+^5T$&1PC-}b< z03v7lCG0;Gk0ItLc09t}r6(&Y2B)tR(p~{_!At6@p?(Ev^H|=t`5LrLUy_6Z8`gSY z2HppizR#m4H3*&@+h$t|y;vzC&22%R)f0G_o<5XvO-N=ceHLrQ4EiUX#EiD zxP$msf?t0wDuXw7DVAdxhKZ)?rC{E>YIMwW*zJ+@@QopkccC zKu0Mh%;K_Bi9SyeUT$qPrYeQC)v-+V46QZUq(RluecyE3v^q&$P-qQeh7kW2tDI=VdhJY5{kCYo^P+ zhlKp*4w`QjbT``NV;za0$;d^o^8Ep3r>kjr!iW0GxPJe(U%FmddoK$<$f=*+QC!f0 z^=B87ed4{wTlLr<3+Q-HHQ;Vu7Ih&*d>gPkM@b;P{}>+MKS_3@3+D^u7yK(b*7=>- zsog2rkQPkeSIu^ti9Q^I{TRr!AG+-a(u9gtOJ{pM2V#2^0`6m({4V5N7X7NvL3e-p zKA-NFZTTkaFnEcUl>$v~&A*z=b5!5o zHX`4-^oETsE7hXy$y(9%(EBMo4Iar}GE)cxPkbvjJ+4LX!=H%V@C#g@2UxV0KTSI# z3<>Yru(iFpD6^kfm+@;t&$^f}eUhz9;40`6*^@sCy`JCH9tiq3~c;~Dd-svb&>WLq#=5%qjpN4usQji*>}$?JzF^*97Yt2lEbUR1TKWiqF*F(7>`T(*xv3 zEBJ6Mo+-MEL-uA}f@Oen54|L2q$EN#3kq&g2};FHm=Y(Fa0-keE6EG~&CB!SxldaJ z-CcF)@T!X!R;0Yvy!BLy$1S(f*8l7oVDzFPcM4~P&^C}QoCym;PPa6`pPdN6xlDCA zuM9y)L@{<#LVZ%2H!8MQbSQ!|x3CXYEng6-}97s+~vvP^dN~mck z8_k(h0=hnTx}~mVme9FrJjB-$iW~{J&#jGH>v1M4eSuf>LtbFIg>C^0wmtX4P8@OH z(J(E`J$!i7!``lOod)M2K2F5#P*dIDw1l{3#iObBRFjXpEM5Z*n&J|UUoXCQ&eib7 zqL9zqF)0Q_|5E6)?_q1upd2OG%17OwrAC8 z$0OEW9}jXD${BGYk0Fem5F-t*N3ZHHDX*BTkM;;kl5p=-eINHbJ9qic&rj-5!>7_P z^^w&uL(yn5E&X`Fp%R@g0o|DOG^SB@fuf)`*&?8Ign{#cF+5~pam(b6w>E?#ww6Mj z0|m{~iVesUMj@X#vUu}26)mU-ZP-A=V*{xni<1Ay-x-LB@@BMv_uIj{XF51j+!3|8UXO}(x?zrbW|9xTKaI9Oh-0Unmf?_5j zK0pi`*HM<>cN2RrmVdOrNJC6dO@?~y7GmH1S2(}Ei@%6cl{)_CzG?3gzAMhcLPaohu!I@0jqyQ*Qj}fbTG^PwWnP5X`zZ7U4(V#+7XFYUhY*=Ny8G za)G{*EHt(&Z#}ewyQ$NB-$}S#BD}==1Dveyd#Sl^v7fz!?S#yz=RV%=$~*PqmCpcq z)k%vB?P{y2oAp;r{#1CHZg@kp-x#kJ;kqky4~wl&zTT>zj^#SJN~j8+_LwSbtWNrI ziOz=B$}{H

(Wt#~HWH?+ModF0PUzJr`axE)^&*Ox|0M?U@D4#@)QN;OYwtjB?DN z7Y&IM<0~MRZ3r5tc_3#D7Z|UjrDcZ*6kCH4JXzTNM3Isl5*Fl?dF6J=3agysvnw1j zA`CRCUeX;M+^8uw(#N$@ZQ@t)iSJjo(yixCGbdoE2j^3;*Q()SLc?ZyXoDE94p2Ze zky(exSIKR4w4B`dTjfPbXQ8sx_eE#{PJSAVlzPo=7cH&|U%Qg3E1Q}~O@j+AHX4_z z+0&O_JAHa_A=LDz5a_jY0T#qihf0Zb4_ILBlXaDk+qf}OQK-%a^o(_@;UV;7{D1FCV@=3* zBQ^r*fmDKZLvK%O@xHo~9qoPXzjqgQb(RrE7Cygo(0-LyY|q3{3xA1zF}z616~Uhi zq-Ihm7)ZuVoGkGO>g!PvEuZ+>mn+~dPk(Ca6^#t^q-7V3^#=#7~n;DA!%R1Ms49v_hga`3PC6OPE&QBJg|k<>INaekrmA`6T}$P*ZX% zQBhxa`{^`xt@af7=~}Mwsan%57~mFS4yyz37HTE*BF2v?Hev*w?GWh`Fj;M-)Uk^v z@s3YRfzju2dTdSkiwTxY*yh{=TwtMhKRd^wp~S`8=N*6*-O02&zWv5?;P+1I?+@_4 zspdVVGSU8;$qspVf2zBkwG!Z(+z8rZBXRtm?RW&-frYv@YY~h>wwj=G3^|bx;{JwZwvu>px<=rolnKM@jGW)sdG% zEop;Ry-7&xn@_>RbbEr%wulHuzEmLLColftXM}10S)-+746iN? zq@?VdEQtf6ESli{-Jx`NaSs=X_>4_V>$Y*(C-47^B2E+wJdXqV>=-%hpZp|R*M^+j zmYv83jxIj#Mlu-PWPGYI|H_NPI^nQ9tw#)>85UQHR350Y@^LOseJ8?vv#n+@`{du$ z0m=d0*Lyq0w=VxQL}&B)OnMjU^_;0w6-Piz3B2^QO}~;-h2r`L7KWN5`iHh%moAa) zs5MwckgrhQ*eke`0I56^Dh48 zLVE3gBC2e4^mEnJ#Y#@OSmD_e-U;{gQZ_i^T^Q$H9mF04a^wJ3AJ~u{mVr8_8}XNZ zvNu^qfci_k(!4JOtPy;$CI*}?UQK-7rVbU+mO9yEgW4pUxe+xl#cn$*ZGfA*ruc}( z0-E;Tk(S}%$N~w}bMq!VhKh;`rvy9Q(&zz-%6V$3b=CVV!;;7}zYB=Xt4`h)S(wMt zq~J#nnz`CNN}T${Zh&#v`(BK`*TH_gt+o7^;9G{@U4Y-8Xk9=~1|%0zl-H9;zuOZ( zJneyZ%3i=zibnM@PFyg=Oo9?^jvC!|Nh8h#2F&+fdwS*s&w756KJR+r*w!I42|ZUi z(0?<)?9V&rkg-syyw@%7Y+h1XZ-8{J|5J0f_g!bPT42Td%ceswNx;K!nmT(mb0zs^ zUyJ;cLq*cY(3Xpv%FfnSV)8~Y@2(74+XX#223GOLLCXv{yYsl zx}Y8cRiwVrOEah2AUcK7Au?l zi^Hq6d3^>XLhFREYwH$gW=7YR9Vp=%-lBPnjWL2DhEsfsN#BoR)Y^sc_sO-&saL zn4MbtRYWG+x|s8Z$~oFPG(#!DmmA8L>A36G#*5fkT$f-ESJhqhm5?phK5|8pwp3!1 zTTv1vW$@7GfQP62_w@>+m#1ZxDvr-M2l%nJx|sD2!SCGE0q;-o?^huxFNvXPoovq5 z#B_ac)_J~vvU#6cqKcf|T(5D(X!!(si^ToEwh8W_;yP~L0QPMrVq?EV(Lq!N_}#1J z1Ri4LE9xRN#W0FTQa&#aHjhx;N?xW1^0HK!y%-D?w_4rs6CgkT>tBKe$HfbM=dw5A%Tb7|qPT(b4x9UmrD4 zVswdrr^5ceK@UOwz^BGScE*4x!3nVGU@bK<%ipTEeL-6>f72gG$=z7B6MkvT`L@pH z!=~xWXHoVhf5t>E9oat?<_fhqQ_IvE?O#r`D?O=_CUJy^OMSm!)y>O6v#XqzbztkW zFzL_j6c3JwQi^Jdjj`?V+975%Gu_cJTNQ?<33^5}lIgZk^qh3Y8aC0OI|_cY4I z@4pXGt4D%S+~sO zt*cOd{n)+;sII*;(W$fxC#_{>d=Q*B>2qoq4shs(=v>8vtvO8g2)IakJ2dz>N9hO% zXwqH|$KRRHziuAe?Qs>&4XBdngj`@v&5c(zSI!k&Ckwd0#5h|q!G-gBu*`Zthw_jr z?B@r8%b6)DEQXH0n1Vg3b1ysEziH3Lo0_QN$GP~Ka6?PE-zisVBNtA4FfRM3c#U2A zEK(#~UeH@TTPmK_|LNPZf`>G$(P&K5lwzhPxUaOT3tr!xW*;jJP*nGZWCb29i~$cz z+%JM(`*JViXT7>qkv7&LeQ)OsR<&_bDt1$u$=6F?Ufh~+r2iRy53cY^DXC10+jJhb6Vq-Gzs8RZ^d8GumgWSmiQ$M;|dP zR)`PT1@AIAFPbu2&^^eGZGDdZKRzEP{q9ntitf}947%7UvB+vr9d_u|63UlaTF;(l zFyC9s`u46EkZ3&|9Nd`sIcU}sK&HXf#vgbU?Wbr##+a#GiHP}MHz`S_(GgHsCHXlM zhT~Mns8*vzp;bB^p@Jdw5=T_2_^ZY%V*jL0$988rF0k(pVk_tk1+ya4MozfD}zxX#^GZ??MuD4wN8 ziKDYLA5%kH>zVKLRK!q8QY}gtKS3M^BF>GmB!zFmx*NcSs%iD(H-)KgcuVTG0y-98^zurgk z-%q%pfNH6uf;*fkM`1Jemcs$~M8d?>f>m;!ltzoA{IcvAI>hsRj60h+4k;Ty)zAG7 z5GgrvRWFNPR_WdCyi|BtN2oc6Q59Pky{?dg3jHk1}@EZ}2b?h1AejAi1%;`~H_Yz-M7cIEI#B%Y&ZgwoN>c|7{G=F0WLXeZ;hm7@~XfscN_E)zPg zLKbNGau!lj_!oRdGY2QXZE?b8OC5G!NLQL#kcRtjAQo*~h(8sm=Qrqmn^CTJ0*~iLudPG~BSEpa1Uqpbfoc)t8p(;(Z zGh)xJOLbW{MT_R*U5ln|_4ISY^J?%wh4WjG77fnhp-IP8{{=$S)fkFKNo5(qcg&XB z3Rz)Q4i;Lu52nr5^nTifWB4^5z}Jv*R1On2A7n@1IO>YjH0jnthgRuKGj|lh(s)YPA=WfO8lj;2*wIb zwE`{u@G|hmoPkLT9RWw+xn82VTk5nU7`|cSz)03rPkFt{`Lr!Ps{bbd%nN3Do;E8! zfHo_UZB~GyM`PAUBZV>(H}P%=Xxlv_%5HSuQ5K(E*=_{PBT1RjTY(cU!b5-r4n5dk^EZ#f=o_@&&}ZNW{kP!pGJdVrj)3()Py z03#-530M7rrpNqeAPgki6EPRdk+WA zlL%#qSGU9Y=kb}M=MIMgOb^*UkX;i~Ut?gB$qe~B8P^PT;HbEpkBEJ?K*JxHZmTbr z^=3f2*52!r{Ic815lpGp^Y&Lq0##my0o*qDoxHc81yRmhW(Uh^&iSn+Zj~xZ>4GTg zJn57OxcW!Dbq^-!>JVw7BIqInCqEx`o&Vd#g4?a_`1xQbas5Q2-U*oI$B?n!q;`5x1xrMq`>D-D96T1W+-&M?{5HjKVCGaoUB=C%DMk`^)?D?C zMwH~Ymton~%VsTWk_WH3ea3Bg?@dM8A&E;j~Vka%1&G>`h_ycgT6`exf-~*NLp{H3w z$=&t%s2up833S*zH&{CsglW*)3kw%kKm{J=e2V=>2`lEZlPTp~@>c>;+ z+I&H)=(ana^U19*y4moED4{X-f*AMd8>imW(?rGk?J|Z*na6Rb+c0ZGo(2|8G>z0U zttnWfhaAL>ME3`3@tj|WPm13bxbN4bAxfn8!clAGq`JNW!-@<1l41_bZb%OT5V`Ttaq#?UUJ-lDS;JmS0mQInkqNn5}v zLq0cd&gJ9p(R+Q#%^;wf>?8_C-Dm6he}&2AH)9(<(F0XHg* z&!1t%6)sUNMNFG2nq|a2|GCEhpC_vyKk{WMrO-Hw^^SRU085hUH|WEwX=0A>C2S#! z&bR{_JUl~duUM7s$+x(hyhr`Kgeh-=?^Ydew{c^wgC06DbSIp&8B$nhWdHn3|0@Q5 z5Bq0xo-hl|rBAS_U$7STOyicC8M|+ly0YXkhE1Vy%WwoEZTMZYg=u^xbfhvu+2Rt( zRe&oTM>JvRKN|SbuT>2mDA2XU|AyhW$fuMy%0}1XizP!|EdN+)x5;P)G=|aISsIjK zrfOeU`K>B<|19|lbEIjTB{n>&e6TYQ8pN(HMxH8bjk{TFa-zTP_6*i|k_%-v`Po(6 zP%}6~0+m%R?;zZo?D5ga2wqx)#r2A4+~y!QtVW93030NYW738de&t0CAHj-98q6si zzw1FaZODSc_%AxH?2PzNS@lVyCYyp2Fjz4L>Z{-O$I_i6)^ocLdzFom{2l}Y%cqNJ zLX%z<$w0x)7!YHHbJ;vIf*9Oos zB=s&AJ(+%TU@9&9cH+h?%U%>VqDhIZ!q!=t1X@)#mwYRAB8w-x0OR8zFPcn&E#vB1 zgGF16pPffr%GxttqA{p#5i~v~YPC30aq414(tGs;?bY8%AZzo~Akta6;wgTKFW)_u zHL@lX7^pK?#*b+lK~MRUTO<%7;G=j3Otex8oXu^N0&bfNg`@rq+&a*aZZRXM;&YaKj1igI z7ZDP9o~`V7#(FW;m{t;+{g@f^f5BKtm@qwlH?_yFw)M(T)FPRx6Gh<$HVhq$*x-lj zxammlHG&pnx4R>%*rMexW&{hg!yDi!(nXh~mq5#W>$I!QvCdAw2E9m)cp_<1Fl~(; z(`5D_0{Od%-|$h>v0@Kr<+7qFHPDZD(N-&wuU^vI)XKw1W`fg`deAL3o6w=iHZ#dB z&X+tCo9#WMYshP&1Bl~a-PN8G9D>__U0FfVfPwSkUjP=gr?|gxWFT1jo2*ptHqiSz z6`lrfX{TN5`!PI$74k_iWW$>k3>>1fwDL|vYyEB`TQt^k@=_v3={DUEFlww{H{{5%9>p0Wbakz2$C{l*S2Arxu9Fq zXrp{TezD(ydP8wzd^)0Cb=~ASL*?%Hpj z5B)S=Vg)1>#<0V}MZm(Kt8^SrIBFVv47@w_a=2eVPN{#*+CCDtrY@hZ@XubY8Sr}W z(nEkKzkEVSndCA2Xs!9YZDS<6Z55Z5kmoJ!`|x=P5EkBWN}&N5yWy;4Tm;u1maHLH zsaQ)Q#5e&xribG9(M zOeJ`R_GdTw^z3$gaPLP@gqmds)qe{7Yl(xLhEhAJ7|xDUCHxKF6vRni$fbG5uhWaiO^ zg&{5(0LSuTq4SkaRs$jL`F1}L*R<^3JJv6BisI$cVA@bM~aQc^QeIe zBqdmI_Y?plLPJLG!kl4&^2(oR1~H79?#I4Vg_>Epa)}Uk`SV<2k=pkHN!8q?VLb@g zY3$_DdT4eN`X8wx-|mpJAB%j?C&rR<&SKN)l2EJR&nF7+A--^HPXw+{xNG;vJ<_({ z-aW9;fFP0o8W6DEwZfpQe)>Z7hRKx|+#c~7dEJl00n=ENKR%M+u5Sp8o;$XAf7c$Z z`#XkV4ORPW6^I$ptkzQEN3>~YOrUFGglKV*RvKx3qg6Qlu@{ctq-X*5t~ZJ>VKYp5 zpYzie3lG>xX`E@7RPZo8sbT_)`z=LnEDzBCyw`Q(_gCJxu0xR(oKx6lXxy!|l#(3; z*VX3A7vCdoI*6ccNM2jC52CI{@oP6Ur8}5V*qy)0?QqBGjo_2F+9U{zX_N6Lwgr>{ zz9q9sqs=}c(h^8ViW68o{OnC(CVj)?{*#PYg+kus#w>K(eFB7}gWcVjohGel>7*32 zT+uo`V&6@VD;~wZzaaV|^}_916r|=SQiJJ$^M$lAx~^A$s){Ll1mV2vVsSFe*dQL! zMI;3Ju=hSJ74$LWJJ9ynoZ5@aWrgsQs2CU)G$~5;B}J3# z<0S$1rou4`p7O_81}q8jR`vnVcA#sxUW*}{lI?T)zl_I*64csW2dNHa!&3TtJ!Twu z?xkdy35vWVL;j#~>2H?5q8K#${|ksv15=D~H|GQOr4TCbij^xRT`gxf)RU|}1cM{v z+=}upEd%NvvvTI(!%UF9tVJ*swo#p#Go^)Y2uxmMZ;!gcs?N7v$~+DigtOm0EVaFQ zdqf3q_66q816>ytcrwcqEE`u|H!?5keu&S9*PR>9EPRJ}td5%a4M4NgnQ%4LZC$p3 z-f2;z=6b$p@+|u>*%c#e)3dwL4@!{raJE{iDN$Mc*){ns_7}&qW&K?hWF5ZDo~~}2 zuFQrDdFu(C4*!18gk}r*xeodIT5X0;@Y$X*a3vH{tsMUSHO&j(KwL->Ya8*aP$+j_ zqJ=naa*~BImk95a%~+VSXASg3k>^*O+XGZG)*(UQ1=a`RSFjf#+>(1NU{qOP$vViB zo0Q6Ki{>hhGcD;H+^iWt14g%MfTn|tmHaVF0-Bo7l(XaseUmDP7m%crqNin7TPlEb zr+G7GD!glZyJ!MjNbR|A({3#mo!^r(kR8+!Z=p>7l2u1X<3{JVx)IPj7ca-(Wcr)O zOe|R3+F}{RPO17gpFa8QTffCRf3(^>zL_8QA06pQ!z5zy(k{#jgvQPFQl(=oI&w zlr1&eC3*UFsaAyK)*7~oY2XK~y-LtNw!N}eZW-s?#>iIQ2(Z*l=G#}4v}D@Xxo0tO zw9+?<=jSXT#n@ILDAW@*6}ZcGO_US(p9Fbq&FD zQhj8Xj7e~J!t!I255@hOE?65heb>ZT8(LK9`or0XYOZSDYM$nj^}?%5e`!(L!va(m zo10>@m_ICDTrk(^VL8t4&cd3o(Ekuf`9QTywDkp>Gx$Kw26pf8wo_@i*eU1&9M424 zkF9MIf}GjR_~-;L02AQ=T5H9OHNjR|l_xzx^Ut+dmth!M;x@I6i(WwHtn*^9Fw+D? zjK=57p5K$LPcLec$7z*CZx|NVzGZ5P=D9-8tgGmvO384krCadOMP>~utMH%w2ePx&vF!g6?xhuDPo z(#mwbu5^znd-2SV*gKFPj(5eV(eSZHHr3|(0ZpH&YOzkbZSG-h9H%{yXgKS%3R54= zMDV)xKtNe{0LqDly9MIUevcb|vbS7h#WuAm?*a8b?$PM<>{a-2zrj5n4I+y5gy8;B zaY@f_zg~E>glJd058MtFZQ6m-FuH)Sok0n`J%TAwvzBFVgafV^*A!lh-S!iJaz_kK@qY;%YDJ#)UVytb%WB~n+Tt`b)V%PdDo2y`Bn#I zz$iFy$DvIE8xskcL3o1xlEeJ=6O>?80S);AY4?iNNqs?_jiFuO6`@DT^-Y6K`hZLl z)YfFZi4dL%x0&R${B!rGH_QWR)#j!y?<6(jBJBZ@-(bk&mnJFS3nRzW+rSD-r1V}k z#cvUBb?1WY#hJe+V4ER#8(a5l-ftI=1eoUI6TCR2LwwY*f%ClR@y>AD&}Ry=^^D=F z>iOB%3;4cAB~Pg~O&Q5{HJqy|r^FKn1m3gw0BDro5>A;3d=RAu%zAJ&9*NhBN`!Xo ztEgOKE>^xJWm`EoIEhPh@x>BhW_&4}6vsTeN-jCRT;)rr&VHph}2K=nVojyJ|dI&qKEWT69s?6P7p2gw|Q20ZkNAHzcB^=5?kv_-S{OysqKxUzGg`G$8FBOr$)? zeszBuv;oGp(R?MCMPd4V!rTtB4_w2ML#XOIz1qWEc}>1J9rY*O+Cx7bHniyI&I(5w z-hCdr3EM23b1lxl+}>ih_y;`NBWpJIdce{?TSr5n3vQb09P_iqNBv$uI|cgK>J0Nt zvWsl5=mbAxipGD%REZf`G%wRIkDj?)&Unpg0RVF7?#?jJo~0I%kC;=D|t z$KP2*;1n5n6WJVON2_n0UP?DrE@GQzx3=4_jHYIrrlIB%avJ|$eprC8RCg+D)u2gV z8~w;?oY6?fxyRf18msHF$OoKeq~V3|=JimOtSZ7L(nt+wqv1B)A%UDohM2(2( zTR5;T{BC9_kWWiCOS_Ute)Jlv3~VGYjm(*YoAj_&Zpv!%s$(Xc^Ak18W`#*N)Owd4 zHARz;B*L^M6nC{+GHtd0nSm21oa{yL^E%0qkD3lAK6$C z`H3N~zAEiz7i@2Hxv6!Mr6z>35vXTy+VBS=m4AMS!CeaV`p@8Ib6xI!Fv4SONNTvS z)RMQ3iZTovwzTrjbR`yumjt_91&bWgnPP_{1h~Q1Ap|2rs!_)1QOozSWG_uMH6^ke zYu~yc3p8`32Qp(hMZ@H|4mp+9S(YaDb7PiS^!%4!oQm{V6R}54KCV%$P4(C(9f;MN z9;Z$lNx=QD#aMQ4q@@IYf9jM@_gIO-QF}4s$n6X!KJBVnND!cmm4k)=vTzh|!P3V5mQIp$gDl{yn{- zaiXS8k~_TRYYiTb^hn)lE~=30ywd1H(eRX2I0))kZR?@R-d4?YYZk^rJ@)F;>~LCX zzK$HHz;+2bp;sl73*|o9Wm|v+h2vqatQxT4{&V$=kaQx;0q+pnhDXZ9MhEf9kC{8j zd_j}J`JsA`&}g!n~$tuK==l)=QBP)@%L`vVdyH!Sp6a*@ zl3&PU+s@!$O?2$2ln3z-p~#HPwZ|7kam;D|FtUailG@HiUgFkmWoIF)8dQnNfcANL zr?R7w3#LxEiEmCHz0+NYJOugc%(WQ~g&SugD1y35yv~{wahR7hb71Ic@PY2EDvnG> zm>@m5x?8oYKT#DifSnlsw@ksE2=Q=|KX({$2ng9Pf-(GGn7)!chDV?nA9_axt#)Z^ z5AEiRm3tt0ywRKF+Nl-9*B$X1@Y{b@ze?oeTde$;g}_MUM~z(&KU*$5>OBvo+=L8U zgiveO-BnspTu5awr_f_FbEsRR)?WEJQ{dT-OwBmpL3O++(M1Sa4rly)n!0;W!yGpG zNI)X;vv4Iko+K;kJDn%h$+t55KK)=`eyWFutJSmtUXfql#7OGv`lse37h%~{kk{I@ z@RZ~|tPtI!?}}2(PVutky2htprk!S>lx6^$M4EXG`VQ0+*_xGJrS+2riKcU%$mS}| zRPu*gGVkNrc%2|SMzp;{9?7KT9bB7+ilu39)0b zN=NJ~vh?XGshj6xruz5E=p>Tct)A+SwJPxm6dI!~Pw;=%p%_O@|?aGi=S_-#%qyIaM`{hUdc=o$8sLb^T1V+D0 z9HrO2a|&x_Fx42l7);;CKDIVT%CzJ?-3@4~vSRAeRb$Fy#CBwBN`r^ASXr<$o6g2U zrDB0lv$wdr?pO@P)^t>@HXU)z7Ptt4&u4Lt{Cib$cKT!B#|KyX>u#vV&Q%%87)Wm} z7p`Mqm^`1nNt95ON>~1lKZu$EN`>l9AU*4+S-16wcT3>?k+Y*z*^MY0PL1>%OOuP_KK*hK~ z_dnmeM@1L5&k1DvwEqR1cjbX^N!vf9tUm!yTt^tDez_JOboU-@p6!FwO~punCLmog zEu$kJDhTX#65aPevv6a}0yL?&ju(puO2yM4qbJX$zg9U&v+Q#z-Hi?(c;#g1Po&nYh=g`vKNJW<=4|K3$oEUa2 zdX^o3fn;!Mu8)vW$XDCYk?7-7&b}MZm0v<~3_(V_C{ap+R$Zw+r);(#af?>`f@Vh& zv@uJnozJOzyqu`zzltC;t<>gooFOtaMHn0#OXc??ia!{S+ZbsBBRm;BNAC)F9EkFS zzkP<|Uo7P@EG3dlGm9zh2+PZKUEu@T4;Ek8J%xS; z&(m|uUcO}m0X4;=h^fWF`k=sg8W6i&fUE3QDXcLUn$8?rVDiou4<$k16=5|D*#OpAhPuAAistm6424!FGnj)ekq)V?OTn<6r_TChRYU-#@$GsJaCNpl&$jwQskaOzk}!Tj_4BJp~szTb^G(yJJ40i zdogt(QR3SAM%~t#GQ01f@<2|`Ua$MWH%C|KGD~K~GAgxoO}39NnNF+%R<9OXVXh`X z+1;K(_xPcw=z@pa%5_{}l|-uW2~`N@N~T{iihywVH#JT7LvINSz2AhY%EAa9e?S4G z@n2KWcQDu>_YMXp1k$0;=RI@1gL~{9`tiAZBf(^*!Cxac;?>fdHBuQsaR0Y$*J+^A zlFXYjzg1W%d24DL%=_SYu`8~EC~8NJAadmOz=!t1Io?a<4^1_+nNk+zL(>&8QKv3h zO`T`i0!=(=w|ahhgbFKfWqTzG6QtX~0VT2#MPF44@8Ejw^WU*i;meK=9#rzN>?lo4 zWSq!@^XnG+*(x=IrwNf7XUe?^XaOKkbL-%$;-Y%sex5=U48;>*=UdQ?OD1003(6OBDlRxd#A{ zJSPVcpCUK+4T%Mbw}HAcpn8C9i&(kgprow?0Mw;WUc9+Utl#o@`Pv%*plSOTB#Z(Y z;Q#;|8myvZ6kv&)yS2wKo=>(%Rv_@3+KY4P4r*18VGPNaz-nso!*d+Dd?%{WO%)!W zUT*-=G=NlUJ8PHrMI?YyBKS<1>Lr3MW zPy3;Y#)j9s5!V+EW#==OXU&s%DQ3mci@4bLM$Vg|cRndoiG8y9|2?QXQ#h}`K+5vw zg-mmjbD!ke2OmQZWezS0{Vm=Dbt&@wIoa~sxjBp>=Q-@IGYtz5zH(C4MlFV(rJMGl z@GaW~@rcT|>Tr+Wx8Y4zirzavM`z(GYla6T3c=T*-rJuamR)9u>}Idd%M;8GzCql? z&%GV&i@m;XxmZX0_pNsG#xQwIT>X8Ul1+neS}C|Mn36;7aeLlG*1y3)WAp?=axjR# zfH}3eWCq6y1WVmp{8ZDDV-^4`=TvxCov$!gMQ2yT2mAoX55-W{W2zUju3xS5$c=sflMuPS}Pi4$tg z$}YD#vAWkXI>)%jfA-JJexvVuGOdvVR7Jmz)I;l zVot;?OR702`zg0tR+M%Q(!mbvI{(h9W->?WI3!xJ>kE9~Z1eopcq78KMb@j6W!K8Z zkhlc1|HUsK&$}ma;xj(5$oqcXLO@XvAsUB2c)7jjwljMjD3`sZgY|6hW1RQkZ!RD5 zvE0k^MhAth`8bXr?0U-=r+<6xH40+rQD?hhv8Qc(;b`?{e2rf|jRDICK}aac5j}@yPUO>#Zg7uLc|u=uLR%TG{vm6RFa za}k?x?xNr8-}GeYEPpa_Q^8mj{N1|m?>2hDs%SqdSFUwBjrK7WLPsW$nv2%4QO4pY zPuQOCT|;kb2W)Dax;Q_^tm!$%sn8oH&Na@NZQZspmpJ=_bV`GywzE8P>LzJ@bf};Y z30t~2b*qv*Y4P+>qI@Azi2`K00ON#80IE$Sy&0(b!^LN2QOX@F`VtNeFrT8fZxh%h z7g5Z}dWpdrlX$R-IT^@9`+oP{vjs+>cdox^$GomDl4bh{yXb}a ztot#n_C_O1{xEHqs=q-M^|N&^j98VDq~{k(>)zt>tv&ZbY=`rVD_=#6(s%nl@|$qQ zVW+X%r|q#Qhmxi6Rfw?FW5iposMla;Zpaqw*C`0ySRL$7c=z+d=1ERG zkKT4N0f92)4_^HEvLsoF5+oC$%4BX`fLa0#1KFRq@${R>aD#@f1bM4I_Y&MHv`?R} zbhJ04D=vzRYx(KllLo;Rf-LuAf9-%$`O zh#pm80Oz{rv>~)@Jb;`dX74y*^A=^dfaahPiBkNuaIcsxZ*Nqxd%Oxa2uZ~=$Et+Y z=dlV+LV#X#_(*aLLB%non_M345`#QJJ`@&lU?AIsE#4AglwV4gZ;!&0XnO=$zovL% zJ4On61z^y`lZVR>so5I)TqLwBUdX7t20`TA`t~jMra}N zEmLGU4x(YFcHRrow|>c|3D5w|NyIYlCd^rd?J3DVF4O&#>r4+c*VWVFkajOPo#ecp zn%9n6euD~%*FUlj@1=5WQxa#n^z-Ca{PgJG_*$DIai63$B67BBbjWL<7>($OZ^?h-OJR9yZyr(~%=dKmW=yaNFJk$N?qP}l+}ecmy@ud*f>)ZH zvt0!{2&pCZp=yQ;soX+6FtxIQY?%4Rc0tyz*2z$yL_BSI)|8ZCGAh2-$i@)-qKIzX;kV5#oEXYR8C&YJ2qC^P*u5;cO{ z))8OX<5srkn^&7c-JgXKI@vbW(50Kf*Dg}+|JkMj?~%&+jqu1`Qj|G;!ti+17Zd4X zyCmjCTtofNn^*;>IvTPMpS;(NE|EH$e+1@0SxTg%H7{G}snQ#zlx}G@=1_@Q+bcM^ z`mmO+@K2^@RwEybZyUcGG&uX_Vgx5q^Y5^l^GckwP!zZ`$ntcgs@qy)h^JN}BZy!K zYX=B$*8N1U_X&!p@-L{def5D z(~n0Tj+{rGH+24q5$`|4CA(Hh`38*XT3I-E3nGX6sdV#9H-W0Ds65m>VjJDtZXoVb zd()$RIvCfnTcfzcGJP?G*t$S+?m9zjv-5=Tz4=jEPQSs<_Eu6diYETPqC)&17Kxpo zg)+An!@24z-*%<&y(pBk|8NQ3vZiYwZ7QT(QM|Y!)GftSZ%^hz%C$UQVwM*7VO^Y0 zUNDJjF<4?=UrRh{aoi1Er5h#U9$}~Jwq+BUQ^1#%GVNpky&@lR45RhX2<(5!7>>xH z;57||-w&=PqFV7EJW+a%zLPkjARE&sWH0r0CXGB82Z~PgLA6UI3a7APJ^LLd#>`k~3z&QeaJzkS@ecAcs9dEkI z7XWR*3N?bkb$GFL{kr8?>Hy1|iF7EoKw3vYp6S0$CcHQEd}w5|8tw933lQCsY8 z1xGs>&OqTUnoL9{itS1XD;7ZWA#v2BVS z8yhac;cG$9LWt=<7x7vApG?FOeVP|?PW&>6T!YgE2fG)IX^8iLi1?lS;tWr9R@z9<4xtkDKAjo*{+c#Q$<83hu%iy)bX|7=vHM5v@k zlT_aUgR${%j%nm+Q2&ISFwB2aUOI8X~WjMg_qwU#b?B6vgC0hUt55HcnX^+j0U+J7)XlHxr=w?&Y8z*r%3HW(#W8>B*`JUptg!gvV?|Y0!aja55 z6zLAD*qy`7x^AkvWs)MLTF90530_P|y9SU(1J(S#$eA%KqI*}xNJ$fV0Ib?B?2%dHTy&XAYszJp&%>-f=V>Bg^;J;ZCHqqxIBQ#RG24FsI zT3Zflqmn1njgwVdG4@=m*6w2j|7LZGvWZgR@6!7zox_d2LJNhshuexyVAo>bV9~ecBuKKaDmqTZHx8vX0%kU+j-Af{@j%4wyj^95!1u zii|0*LxIW_)xI&{>oTn89nVEJ;-=O{GwssPDzTXKMC)6=EY6Q2Od;=9B<_&tKyp-3 zlWCH!Jg#bOt)%CglhpTicH;k8wd)qRvCuijKha5(vfjmE_`_JxjC5mv9j>mw9fvs4 ziNv*h^>>F8QOR@WZ&=9rOxe=@idz-(V*N$D5$T7LF=M#>GzL8H2(Sx{4!Ej)W3N8* zYj>JnAzhXny5G$|XXY7$?Qc1|#CQ4S1pKp}kwm@i!q0^~VFPA}z(+kamVTqY>T*gv zAq3%9X|!UDlx4+85ByP+tWA#k#RE4_pzcSTZxDt?TU_AqOv1K9%ihdFC3C$7*hrX~)NW9L%j zY*Ng?ZItBQM8n*l$q_c|)59Lq?r|eSfWZiyQciT4NEp4xVaEpM9DK(Tv(dTHMdNF^ zOKutO!4icJT+MqL-$r=?m3g}oo-m?aX@*%# zLY}7ZR9>A|Cpw=ZBp0a)jld+kXrD@yZx4g#6SU23<{h@B+bi#dDqDLMf8;lZp&YAFr_dM=ueYmA#_PZimLX*Z5z1G_?$3;SxN3^Z~Y*i|V zx4M+SKy2syHz3HIG0Fy^lFGUr?jP={g7!N*OjUp~D_@{C3cOwTUkqNa z+(zvfzilbR`cc3n;q+eO((?=A?jaG ze}n_=?vM0T{*dNgGW$9v;jX|?*-&M%J)!WrPh>T(i5>i-B-V=1c6#8ds*~d(_Iyo? z7n8i;dl`htpxLQq5`DEe(E~isIkdlh>od>Dvs1vYz&eG&k@YVxIGzLqkRiJu?kL!@ zwC|2%XuzPn{W8*XnKr@<6TV87XBC}cbT=9}%k6^^08R2KqE~1Rn$Pi1AXtR|pxV99 zjZGCdQU~K6a0mj?2N>Y52dbnU)>bm3MK*%ngj?W*IsGBCk-!x-go*iH^I}NxV-Xsf z&oc0hgQswfz?;nO27m2D6|bR?7lOnKX(i4NO|&?#10m?M;^fUs;-s1T1tg2o8f4OAa4P z^li_iaRi27>$%8z5`0o8$=z>*1)>1u#s}tF6E&Rt+ql*9Q|Ps&St%ZZy`VSQtcTSY z{xaK?h#5asz?t1{Nls^|Yx|Pa24dEdMZs#u6$&`dnU z_%$g35uZP})7wmABSLagusc&r8L43GT{eUvxcXa(t;LQ`+MwUa;VBeME7yO#TW=w~ z{~Rw~d4abG0v$ih4!Fr|=R20wAs@-D(b%8cJfq5+PIgiZ^pv%h!3g|d2wFHzDS8Z? zI~6_ewc7as0xNPpb0{50eMto;4ox`>uhG-`C>^D*`G%H7VZWemwTOZ zyX|A5KD?%gKDQvedxLDWTd&Y})8-==eWuD&nWa4A>Ct7#JKLv66)F37+|*TZkB8Cf zG_2P_uaV~oZ!~()z|H<+i>}q_lc}P@OZ4R`KM^L~1Dk5bXsI3Vsi24I()gyY5a9OQ zM_>mU@F#sNTe#?ZdD9wcg#3Q=X-_-tOo?a6q+mHUSy$Lazk6TU#Uj}+t6JSEsg7^R zWVV<^0q_2U!Q2|flOmkKgy$$9;SuZ;G3y(zye{whQ-6Td4Ft$QiqjfOxuf|`pxj=t zTeHitsY!ztwx2(gdi9jwx}`zm(aSE|*RLyYmq@;8x?|{hhksX??S`qBtD!Jvs;;I$ zydA{UG4A}WuXRmz@6;nd*A60(FD&;mOuWTmE0q-5q4{WfQ6r%n_VcnMU&<4tR8x*z zkMN*3nEH5=vJZW|sa|Yjo6+&*`=KRj1cWeCv@#KU39LRyQ-BVXwP;t*lXS{|$?Pu> z5e)4|?vj1SxC8A|8l<5(pzD^T>G2=fQ$EAqueS( zUn;t{(~fT2H3j^>J(CZg0&;&o`R&sSn{MZ?rYzN^zmu=GTkz^=&d$)Fob;4ea?ADo zDGsxVNSY7vOtC33Q`@Jg{rTk?6eQqV0!AO&XxyqjyxP!Mf#>(!hhje7Js9O_ULRa= z;Keg$LQd;XnRjTK&zCtAnpc`gp|51(oVxmR=TgNt+-BA@E^O(nojR0|R{k(56aM?I z@Xm0&qgSLCv}G^L`5!vD?%k91_0k+}!_%|d@Q_$eHa9{9X=?zQLh?iU98YA5Y9!r^ zg<@9AVg+In7Qv(+8vUw+k6+6c)ZQJzQ>v;SPAFSB^$CBH`XHBpKj>kyd?~r2Y?i6C zsn7o~e{u1#+p@~J0&Jl-H3B$i5J&`-W*c)hJ{`(YfFsQ zJIqJJhk8A9$RWH#FAJNUl<&?*nlTQH4sNDOmx33`qisswl}E=tYxc~;)0} zd@$3uQS7Ws(>;&8?LMkp`k_{jg451as*dOs!h_7TF7OL{y%{$2gqf4$9=G!gF0Ltn z69XzFaY!E>$1Uzg_h0h8qic@|44bZ}#J=eRXv@N!kD=`+x=hunf-Dff<`k{o_b!?g zG}BSR-u3N6;r57;Rd@8>%|=&!txS`5Hdd{x^I7LE@LCgD%1SEdxEadE8i>QAL&(_p zH1|n_Ic7g*Ouep+DaT;QJ`Sr6r7>z-@-CY2a*3na4cm%+nx#+qVKA=1Q#i?W`ad`%rCUi_D${$LXro*{Q5tbzgg#n;#&><Px#1ZP1_K>z@;j|==^1poj532;bRa{vGjT>t+?c89)F40r5#hK~z{r?U%i3 z0zni;zl{nODJ(>zF>1&bTP$cKg{7sXm1vXNBnCk&EG+U67FOx=41qj@rG*ez4e=3V z)tI@%jG8}!WYs}(KxXeK=zN~JyQ6u%-Z}P^WHO0%yDcj97>~z%Wd8vlRphq}55(vw z6ihy!N3+>PDwSFUwN0|wEb8?-GMS8+`Da}yJIau<{0W!a?Y$3Pn^ZH@LVs zM=%(|U@$xp-lI4Y3rJmqp3;cyUdZ#JUQ7-F$gSeCUFiR7+{$B%gJ^BwX4Xz{8^q^dw9 z4`rz95nfYRY)RTH@<8{M+72yE{jE6UzHF#4lU$aGD9HXXRk05 z=oK$77F;f8LzBDa^TH)05d}cEGgTx~O(2qoGBizH%zQ*{#8rv@dzzfF}> q*l!t9P1ma#?)5QVbyO2*eSmlRvCzFnJ*nRS0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGjT>t+?c89)F41K3GKK~z{r)tM`F z;y@IJ2etwku>!Xd6_H3p1!4ta1rmuwR3MR&$Vy}+5{ZncKq4v-71?ttA}S&f5uC%$ zca!PzYzYZX`|Zh@Ve;tx=ia&V*h;-K*{BPdxlUTU9&LA-)-I!(mYMksagg`#eCR>j zij-B0l&vqTmNsg--ELaDK9k8LttCXUQbBC#(o#WWrLD&~>Ord(t42LgJ!hd>x@?HZ z^yU`;Td)b+un}9a`4|TR@m8z8ln;Ct60u8(wtaR4@<7L?H`0bPAbk4$zKWu9I|Q5Y z=)TA|f!yGMtVE&i5X(}&@24&0vM*8u%9yjVi-Z1PsD{I#>U26Pj$^f0EYdsWffh3+ zMWAhknZk0L@xw?xj2bc#a3A)2Wo>@mRvMUa!l0qtQsU+ifX}g72Th{@lFKb7YkX{8AWmh?-73 z`Q2)@RIOGMPtpP0FB7!s5KVtw0OJl3{(K?ja=DZ;(gHp0S$Z@}(&7CgLEFJZp9R9Q z*X@X5T^&Xw83?uTK#L55K)J3fZ6D!zUZG)a$R!Y%CJ+&6&ovqiNjBS|iO5q)hX^2? z=^#RzXXzxyby3`;WiChp7)x?N?0h~??vnh4NbI}ol!9bRF2;m*Z>06f6o~NB@rzomyJ&GhYAJkq!2wnxk zknp4J*s_l2np#|uV9Jl5jX!REZ>#b2^pw_4b80`>`rQ(5Jw8542;Se{tJP|y*7^!x zU)9UYiwJyvepc)CTHW5>%6oYJ?(R3W-vojpCjx8XGt zJ`kpar2)~5M>9?dNjytHrL5s*JR8FHQM&lu}BgRtB z{h9J6hpQYjy_j}7#4HE13S{j0p`**%|1+7a`@#1@)PP}P97do6-bdOW-y}YzZQj`Um~D3&izlNM`^5002ov JPDHLkV1ob70qXz& diff --git a/data/images/skislalom_aimleft.png b/data/images/skislalom_aimleft.png deleted file mode 100644 index ccb4fd36cfaa9317a87e0f2aebac9f00c1e3d331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGjT>t+?c89)F41B*#SK~z{r-I*bJuKq8UIN+c4AL?S8>6%iE?6}g#;h>8dV zf*EdqFIh_Y=uJNem;O4;Cd&r)pZDMQmb6f+50{cM?v~S|!%^!7=}|VEq-`eRAgk}O ztRk4@7Y~QS^yp*6bCGcFnAVXncGBM6tRk2voT7;5#8NGV(k%Ppnbs*9)jPMdXNW2h-4wYcFpf;P9Y-dUN!pVyHbttyb^o^79qDvBQm@x# zKA(&4`{_IR!E;{LqzZJMNKc@D+mqYgty&bJ&1Un{Subm_tJQRZQWmMD*=kF-*HxQF zQ8H*e9&4K?(1f-^t<_s{(r7gFjeftc_AHf38o6GtC$(Bl+pmJpKLl2T#Wywb#4Wx= zk2Qy=(Qu&W)oN9W#iB-XG#csqc>-<5qUo7|b%%(_)Ymo$0&Qa>a9|?K9ePjF;re5O zwpV2WTQ(bYomj)zh$I7%5gr+5TIczBSfrzbtP+~42JbUM}d z?(Xiioy}(2$5@0ihQ6z-D+&BSs=un~)t}#N?_*tqWh;Uf>K~SMU02Utb6lxZ^cVrW z$cF89Teo&3B(7nduCkg19TZfVGGgR%A`x+}x=37UmT_KdU7X`1trJi^W3D&(HNbB5&+3XJ==6zRn>m z%9^)J%M#2SDU=(7W!*JdbE8PEV+%fDQ*3ELG&Pd-2UwEGV()z%Y7K5O3d_kadVVnW zT8Z^Y@6Oi9q&j!%i|$ z*4BD~R*`WeWv`->CPI`BCQCb=jAby~-sRZxV*9xvL>dk)khM37%BC&8@0kn})5$Su z6BQ!E3o&}kpV>Z;m}u=TDU6cHTALqQ;KW4EKC8*)L#MY`7YBRmVBSb<`C1%&3xOmQ z*4(Z~h`AI<;z~rhG6+1)mL!y29Ayn=`S^Yn!K}VC>;Fv@mdjT_v-Nnze k&0UgN7lnwGkll#<1(LAnv)Ys4zyJUM07*qoM6N<$f`cRAZ~y=R diff --git a/data/images/skislalom_aimright.png b/data/images/skislalom_aimright.png deleted file mode 100644 index 7c09444df7da1771eff076c5d8d2c49bcad3f579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGjT>t+?c89)F41B*#SK~z{r-B=-T zqd*k>Nh^?u6G&#R0*Q>MK%9s;fv7-6R76xnMk0}sk;ur%$cT!F3Pc5>f}5#8R3IV{ znaS<@>|SX@n!66{P4hB4yDUrCxBu<`pY2)xVow^e3LV+%4#O~&Euy}xwLk|sp#Gkd z7PQTROrs!M6w{EMpF|J@veiA56&o#R8YQ__Mk6O7Pt-1xlsCT^4hX_po|Q7GbHE#d zkfU#Bom*?MSkQPprlRP65&sYbIml55id-zBY0`SVmOb5p3G$vZ^^gO`lPOK7Q}TVE z%Ce*+N#vdO08RiCw9QJ+8I30tMj^{I&#Q^7 zRx7UCLgo2O>J7)y{yo9AS5slRTyj01&sm<9W%0YBD5BwT$aP!5|0ab=eFSiwz@Ed) zmy4LMJ&c8SvJbw(}b`a>h z24p!3e4bb!WC|w(0^VHk4XDa3JnQr6lD0tgczQ3%VquFKA*E=`a;=5(L{ z$QcU+X=5xF3H!PU7uVO<2g~*N_$XWLqMmF!PL=WB-rn;2o}ZujTH)d0fi{~B-@CuR z=X$%{av#QmD8``g=H`adBqi^MC!c=h@Lw#bfcOW=+P2NtwrCFq18#!=3cT%PGU3z? z4hhd-q0r9|mPbFrP80e?drs@qDAgo{Fq?xUtU;}Ao%q3M7!ONuCA{5Iapq7F}l3GEqP zbAov9+s9pPoA~I1R|R|kGKDM^KpHU;`wxI5VOhxg7&z8uPW45Pk6Rt-nj#4Ij#$U> zPgoAMO4$H4aaagm76kxlj0fPP;5qR>=z~YaIQ8swzM>?zD}u<`@R8ef&{qVpx9S0! zNftRd?tmu^3n6r1vZy!f6~&9gEJuYG)sF>H>0l5E;-&F=CZpqf@FR&TKw2nb*6eg( z85EG=Hh#hqa7?I`QL?y`cnQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP_V+&#W5tp{q6LPyayC`Smyd15RmK$lxPi% z=;Xa|;H39`2S-NVmVZ*~9=1q($5^Is=gpgUT4Mo2fCJ-#1||na)&?dn238RUc9vcK z;a;6)&v!dZGc6UlHAg}@mt)JdjAADalU@dsLzT*FJ~X#JddFYeIafTyc(wjfr>NlD T@m^bP0l+XkK1|dbf diff --git a/data/images/skislalom_gear2.png b/data/images/skislalom_gear2.png deleted file mode 100644 index 72c4aa403e713e6684189c20e5d1c2eb73801860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA+!3HG%>y`cnQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP_Wd~#W5tp{q3}kyayC`SQLc~T-cIC+!96H zl9|<~?c-!+6`6P;_OR)kf@Hz$wPI#FO7xr?8sMnd;lbyVT1!tn+f$z6ykM)^?8(K` zcpLBS&hhi|JjTJNJjeVH*BTQhK1QZ<{~I&Xw%2r?6>s^#uy0+&#K)7TZw5Mm!PC{x JWt~$(699Q!NSgov diff --git a/data/images/skislalom_gear3.png b/data/images/skislalom_gear3.png deleted file mode 100644 index 75a4eaabd15cde901f4d8aa2f6c90bbec3942029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA+!3HG%>y`cnQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP_V?)#W5tp{q3}kyayC`SUlAdI(Uv~^c>RY zImX5}Z67Bq>$^p}+p;Yl9($CvHj=C0wM`oXV><(*y3CI?TcTFyoZq7y&9t}t=DeV; z9L^rYlNs9mg diff --git a/data/images/skislalom_gear4.png b/data/images/skislalom_gear4.png deleted file mode 100644 index b606cf59f2e1f1895602753ecfd18ad43f6c3b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA+!3HG%>y`cnQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP_WF?#W5tp{q6OQyhjuSTmlPNr?_cOanhXP z#(qQFH;IYK%)#luy7@`lN@4H5t=9x)Y=7N7$NR@mV`;|P-~SeyGOjgUTWXoUmh;8l z?6uySnT1V9Ils@{aQUY=7efOpLjog11OtN@m^qjIk;J-uz4yW`ADFUCB66pmsr(Og O0fVQjpUXO@geCxOu1A&t diff --git a/data/images/skislalom_gearknob.png b/data/images/skislalom_gearknob.png deleted file mode 100644 index 8da6bb9c4c3ded056730196a40a982a0d0e92101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRn!3HE-lJ=GZDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9GmaUjgdde%Z0C>Y@B;uvD#pFGDP@lZV*7lZH=HR*sHhAwd~ zF0KVSe;8JxzINZh?AXXf#jGc}f}& b9bjNEo*K$o|M+|!&};@zS3j3^P6Y@B;uvD#pFGDP@lZV*7lZH=HR*sHhAwd~ zF0KVSe;8JxzINZh?AXXf#jGc}f}& b9bjNEo*K$o|M+|!&};@zS3j3^P6Nn{1`ISV`@iy0XBV?mg4MTw*XP%y>Q#WBRgJ9&;l;-PvrE(YN#YSKMY23ZUo zKvIIoL6e`0i)(?-ABGj|r<{xv4!7|Jh}8)Q2r#5Bl>G4UFuMk~J&@P1$!#wK)8aUZ vx;O=Po+hTJ|NsBj3NVXISg`lN0S1P@r4gPVT;93^?PKtC^>bP0l+XkKc856Z diff --git a/data/images/skislalom_poweron.png b/data/images/skislalom_poweron.png deleted file mode 100644 index 18c594469d1e0ca3b30fa7332271d791a0d3c644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<7!3HE7BzD~bQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBV?mg4MTw*XP%zKa#WBRgJ9&;l;-PvrE(YN#YSIBY3|-<} zTwDuu{xGayKjmbcaJY>(K&(zcK!722q2z~$huJl_?SZ_8O>TP`m=?!L)Ws>V^VBpN zWgS?-s9=!AAj*^Q=l}oxTvL3-7R=_BbIMFnIDg>40R{&16)~CHcrNY$+RWhT>gTe~ HDWM4fGPpeY diff --git a/data/images/skislalom_slide.png b/data/images/skislalom_slide.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9f968c358aac038d4976a1922fd35eb2bf4623 GIT binary patch literal 739 zcmV<90v!E`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0(eP8K~z{r?N=?3 zf!0F!9X-}jc6niiAE#AK-6Y15DWwZ!C-L4+wa}(o~MY; zjc7POWp-WIec$`u4`b#zbzlJMGeI_0rQXac_PYs0->kH=cA#$%CS0*E=}o&-KGnx;vW zN`(ncCKJA26qo?w4kKYS*9nL*6$E_Gqkg|nB3XIEEx`U;p{oE%==lNFh3ttW1QnF` z^?IGvxCVq0rHt_uxm94FdiVIbO z`!IM4CM}dhBEyku&>=X*E|u~NBk)EY2Jav**0S0*o->5;Tk$Rq`qAhJ=7-7N&So=~ zcsLx=cDtp$xRT9=*6TGBSglsH-|wl>Xz)HL)9G}mTs{*QedSY5HO_M280ZbI>+;+% z46<#T=Kx5dDpa08awwD6ys~mY6F~Bz*17&=8LG|*sDt4lszkl0Knl+TNJwNp&cPaT z1kb6xxdaf~;|9Vc(uA6AgAav=$a)-xF$$;T2j^WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1Sm;FK~z{r?U!v# zTU8jx|Gj;=?Y&S6Y^8$?Cx*$Kj<^?DWS9v;T)-N>YW!rDsEL_h{9>jtF=lbm_;rbi znk?BD#ekA+5EyZcy#x%aPzmi2vawRi25sqkd++t!)7v#yT4b1}AM}@;^ql9M+~27h51r(JH0%l`L92$3_Yjz2N zL`sPk4wZl?SAwHsQ<(M#F?9Dn+J2i=W(tQ&KwPI+dO+>YN^q<}85Isqy#27soumFR zKKJ@Dxw48>N`TFvgCL36WwD@cM+IJgq6YSOKw15G2Vd5^4| z5#P4A;CN&$9o!bd+lXNS{>}a4B-Z6QD(M}N`Rjv zxAl)=KAJ#O6qRTeku{<*whrf!dK|0Sg|17#!l5%Mv)e-@fJvotCeG0M(*WM_1i@*w zxY$sQcN^-^I(!S~B^DEbu&Rlq#1B6V;!b4qLaXwChcn~JzAJdjR)y0?58~$;7cRT! zRiaD`gZA2L{7`R0oW$Ro^P=Cgf^s8EykUY#%Rr}L;0^?_7Ehq5YA0SH#{Iw~{j&+1 zor{?Cc;W7DLro~{^iyj|oSSgaeg;`Ycl{oGS6e~H0;7di6lgy~f`}VkU5Aa;V}B_} zW1E_AJf(qSX&Gl;YI>AhCMl#Z%#%B-=Z*AN-jRv>UK*GAdvX~A5!tq*>{0T3PywsS z6gsav@EqB$Q*8EP=NTRs9DmTH-V@E3e(_m&I$K~fm%#Y*QN z2bBrsucJ?VA$&dM!u6(oIG{YgvjU5cuZ+Q3!ei*w7AhdaO;U_bPtHI`d@#NI0OjQU z@l{(hI&xIWEtleNd_jCTbq527_M*vBf{@t)YwrjIV#rdx4!xbNI2K-2R%h|m?7{Bu zf2616vz8a|zCryu&wC20MkX0UaUb4xduTCv>$aOFmsux6K~2NgY{3NvHa3Q!`LQp> T{q^nxjb!k2^>bP0l+XkKUNkaY literal 0 HcmV?d00001 diff --git a/data/images/slide3.png b/data/images/slide3.png new file mode 100644 index 0000000000000000000000000000000000000000..fce423df09083dbc65016616ec9623a7e103bd68 GIT binary patch literal 343 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 literal 0 HcmV?d00001 diff --git a/data/images/switch2.png b/data/images/switch2.png new file mode 100644 index 0000000000000000000000000000000000000000..deac3ed0ebe9e4a10daafff8daca326e0dbfc9cd GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq!^2X+?^QKos)S9a~60+7BevL9R^{>*_rrXi=2*QHh;4-(8kF zwN<@ushIz6@ADtW5B>hI@Y=0STNs6%7R)iusGa=j=)P=?r47Y>{`NOhBAhbo9v8pN w>S1)5BQz!G@^OjF{6C&Ai+>XPpZNpBtP@N5xA*zE10BcU>FVdQ&MBb@01+i&MgRZ+ literal 0 HcmV?d00001 diff --git a/data/images/switch3.png b/data/images/switch3.png new file mode 100644 index 0000000000000000000000000000000000000000..3679d03cfc11a40435e457db8ba34b1b058661d9 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq!^2X+?^QKos)S9a~60+7BevL9R^{>ZNmnJpc#)8dK3c! zCVZ?v-pBjj*2bnGCd5*}?O{qv%AfrO4-frk=a*|RWo2PuXf4cOn8_2&b6DL^=D>v` zM;KUITW9_k7BZ4xVPSEIv6wI+AYsJ{jRX!J9u_HH#vX;q8#Ue7^y6$2W*8*09scz6 zw4|i6lG4B8f&zm-KRz}y&Shhi_!lvI6;>1s;*b3=DjSL74G){)!Z!ppK`DV~9p@az;kRkMjo(e2|ytW#KV6!y=-> r*^{Nfb|H>gS>u}rqspxV2N)PW>&P^=T+yfl>SOS9^>bP0l+XkKNjNBT literal 0 HcmV?d00001 diff --git a/data/sounds/basketball2_3secs.raw b/data/sounds/basketball2_3secs.raw new file mode 100644 index 0000000000000000000000000000000000000000..9e2301fa0ce8708d45fba83def9e58cb5d3e4b86 GIT binary patch literal 7574 zcmW-mSCAZ6dZp8r_uhAPceVGv+M;0y5Fkj<00d?@tDv+aQ4^uvhk4zI-KTxo*bT)< zGaJ%Ku^LB-cVD$$4cJM&dVQ3UO2(0H@9z-UtYIu_9@>nU;Bi6DbkqPd-O8@$rblzkM14a z%`b>o5|!z|gO`yH*Sj~nHE-Eo{y6`9ws!6C%{#6?_6}?e%)FU>E_;5R2+RSWd&fT0 zT|H-pH-pddUoE*#oRZH~SMOuj3a#PbgJ-p$&JAu_o$vFnKFI#47@v!M`keKh*@?%t z?su5GkJ3LXMi&wvKkImVX8N(I_kHr-8_ndj}v%q5;K>GaQJO_!KfL1F$qwsm~fHC`aM>ptGYH)-Gj*X)scYuMYH`xZ zu|=+(^$asW8N>6IVL)0bO47ibl&3Rrr8;XNfE-N}`nnk~Pl$2*1P#{9k~BIGvP2Fp zVSWuIq(wYC?!}-y#-}|a6jW}aF~tH05Lu)|EGQW+*BLY6AmKF0CwhiSAuRNejVN(- zy!hRL@>NH9H?kx^7}_-UeN|K4!m{=E{TKT;lC`sCclUXf*&NZ$)?@9HQRU2Woro+* z-4VK!T~xXb>y_3zXg?(Kjb)_kggvjXD?CR;h+6^e2T+7xfbILhF|?>K?LYz9id4S` z9B3Alh8=L*G^a3Zi@UZ7jdBOxc1~y&+wit$Tmu~-8~y!8E-XEgn+Hv$=)P=h(7bbA z*3W^aEu2Q2fNu}Yk}g~SW+Q_P>urbioMb}m3AUrkam2ez9h--g)?Mz%IHA-Bm|e%T z+_1~+b`Qz)JHT#tpGLC-Jn0|MO7?)w(H@;7AZ(6%O~?_yHSM;50e*YdZs(4Ktp%%{ zJY%<(&CXVY*jY6?TH*Hoy2jIp5P^$w?^y}u2NFnGfoXb5A`hR37f00M_8u_mwy>$7 zZtRh40W8Z}xvXqiRCB3P86WM})`K`5nOmu0S)$tVjd6S~C&_925K}2g%f!4E6UuC* zGT~-{G)2d|#~83&6=J3ZQEcSlys#)|$P`ek&s!-z&5*ev9|;sOF=3x#g?bH1LrV~k z6~#(xQB7l237J$6!^T9pK^S}p309=B`h*2V;yIw%>*Xl|Bjd&~NM0;+b#g%tQboGj z8u3tE25996`fy3ME~d;=ywEDbX?Q`xQdy|lnln;jn!$6UJvflV#F%S}5Nky^BVPpm zgGgdoO$kW=%TKwn4zgUTcLamVH7KE3V1;%b$uo;`mPv!P>bw=FPfhM>HDtWuI{qr+ zy9*V*0%tG@Cd*EWf8xB)9s^GfZ!N38q=Wpb)3hOrWXH@Cdt?+JuyuW>4uj(=#i2T& zoKef3z-RUuNWP5*?L!Lnp7e=*LM`1zcKQb;@PTS)(5HY;;U^QlS~dW0&i5$UBVl*J zX~a*styPB!J7xElZKg()*}rHsS3*qilF^b+VX1MYORPoCyFEVT?n!B?%OL-PrF!H> z*#mvXpz1~U;G?c?Gju>jhFl8eJ{ul2>7_eNXu|3wj@aO=-Gqn8qb0i$Kf{6-4CZDS z53cDQ)fjesN$V`en`c+lu1vZSx}tKYa+Szcr7K=6#GjFNMJu_~RjD^r%jB=3-qU8h z@(kK_j73_PQD+c~;Lkwa`}8Tdj#_?@*WH>7S5-HL^C1EZX-mMoX#e!DDjE|eQDI!d(yRe)yfI3FR!{NOOfX4-JtFvs$EQAk1a zGLcS!<=UK`5i@iKX&2|0?Qmj_MlzL7Oi7b?3mXs8i2AYK#CkACmCOJ6tAHc

Y{q^Anby19Tgif^DbZk$eI*1fV0!ghamq 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 xQ>@u$9P=i#tXK}GF5h4Bn|NiYc#CZS! literal 0 HcmV?d00001 diff --git a/data/sounds/basketball2_endgame.raw b/data/sounds/basketball2_endgame.raw new file mode 100644 index 0000000000000000000000000000000000000000..de5c169c970298a925e7690c1550ac4ae4fd7e88 GIT binary patch literal 31123 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 YcEAVOl4bZj4wpON3gEtE_!;N_2dD>bJOBUy literal 0 HcmV?d00001 diff --git a/data/sounds/basketball2_endplay.raw b/data/sounds/basketball2_endplay.raw new file mode 100644 index 0000000000000000000000000000000000000000..b3c137fd2d668cafbc100b7e134e733eacf264a5 GIT binary patch literal 11697 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 literal 0 HcmV?d00001 diff --git a/data/sounds/basketball2_endquarter.raw b/data/sounds/basketball2_endquarter.raw new file mode 100644 index 0000000000000000000000000000000000000000..66a24f0f825f41da83dc4665f713ac26d14d84ab GIT binary patch literal 15436 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 Fe*t?b{dNEV literal 0 HcmV?d00001 diff --git a/data/sounds/basketball2_freethrow.raw b/data/sounds/basketball2_freethrow.raw new file mode 100644 index 0000000000000000000000000000000000000000..70697725e39a522e78d9d07917f4a0a37b94d5c4 GIT binary patch literal 6705 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

ks+;XD*LE5Z}!y8>7q>gZR_x^Ww|5AxSm~|w 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

YdEBtz$^3g6R*W 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 literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_beep.raw b/data/sounds/soccer2_beep.raw new file mode 100644 index 0000000000000000000000000000000000000000..3dd944da312ad19fc0ed05bae595a68005f5c299 GIT binary patch literal 947 zcmWlYi*~Ch07V7Gw}Q_kZD-B@f77f^(>6EnXcR;cfyw;A-utX$fHLXR_wEFB5HjK_ zsoeE_WKoAU^V0*47k`6%Ek_|u1;sMscm*df%F*2nVWWF#NC1ZmLAC4^Yf?JQL1EmZ zAW?Z=xPAAYlgTqj{3J;coK~9E^0BBYrs9IV#``x|%)9voQ3%7!^>0hy(P$FOLB!=^ zZ>$OG`_rm28G0v9r1^oBPfk)f4eTd~J-h6SBts|7vO+usC>`5(o1o#H5&zRH3DNe~ zRAF(EGuQx1H4e=BlO_aR%#hW~FncA0-L3MQxmUc2*f>XIb^fR-!8gI-4t7!})u3-~ z7FYY#rEPX(Vc>+~pEhyxGZ!gd<^ierv|rV&C#(6<~NUQ(DdajEIJ}ZtGQ3ujDqIm`Jbz2V2JFNpP@phS3zEBlmfV zz4OX&EuXVj1JGTYpyH30LNd}hF17nB-^_M6!~&O(PLW6jzjEi|jw!P@J`2yJVASJurWlQDyH7-IUYByjuCkeiPPD z%Jl~tW`?nJKS7nG*O`VpHFD7)yL`PA+{?;}mUpX*k-pJ4>jxK6*d<`B3?9B1>xe@$ z`O)iK2Dn;k7rM}B3pIqw1KP0)AOoz1z*xruuv%as)Q$rk>lh2HGR9cA8fg9lG0E*B literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_bounce.raw b/data/sounds/soccer2_bounce.raw new file mode 100644 index 0000000000000000000000000000000000000000..fa2f5e21c9d6543d5485162be6a81d4265a5fa35 GIT binary patch literal 1589 zcmWkvS$o?!62wJ-01uJWEz9vF|NsB&P8=uRi6e^=#hV}qg2Zy(fQRa@x~r?&g4xbs zh7*|4JPM;-HLV*-;KW%Dh-S`U<{7WXQb>JNdD!TevJivb;7^W+)zmBn{Gjh#3HD_j zx9EJU`CuZDGGdu+C52?wN>?*CpV7Dn1+s>Va&Q49T{Am21P^LZ)HX~9Q9fdW0#!MV z!%aOhz=CXYh5$Sefa|tH8VXxmhX~O2fPhtBGex~zG8MBsvLkmJO=sbDa>BrKG6$-} zTp679ZB5MN!JHwJ=nAXZ3wq^Ma9dPKXTD~2D2Etj99n-=J-{$hl1j>R!@4!i$gEvo zj!SK-Iz@oT9(dL(UATs9i=GZ3m}(5LH#Z7Hv~GGKx%-$Ly`2kejBuI>K|%U%a;6o@ z*))f;paTyxJ1Z&%MJDF!R+E`V8K7;5Z-|&fUsGiQR5*A@<_wJ^jdU9}@%x@moOiu~&BwLgF#v*|U3y0Ix^I2y_z%VP z##yE_xS|}ncEw|a16(-;x78M2JYJs2hk%V6-3D^Rd;0T+B=>tZDTDtY7X7>*fbjR+pt@33icNCqq?0ed9p zq=(|-tkcCZWx)0OwTa^Y* zwGO}Aq-Jqe$J(6Qf402!KsIkC?Wiga?u>p$yLY+O`bGZO(K4aG$mTA#-^UlJLYeM@ zoI0QGDTVQG=j%0J+xkTQ>j!zbdY|?gJ-=69jSR=DpVWY-_Bq$_&3vn`kyEULze!TE z?WH}`;3>VGVdL4WyX}md>E~94x%x6(gs6k{tJ&6Qm*z(~J{NyZtP(KA$8PkR=0xt1 zxjlt%ivZJ0{?8dSJMhzs?&0bcd}&qG+@3_{l8twWst)2mJTCd>qdPVBc)g!dE9@sfG?Sl=FLf6e!;8EG zv`CWgU|Tzfv^>c1lz;9?$KVa_rSgmBMdeA;JkKAlSNMlFb!hCqx+kzZ=>G*Pg=r;s zq+;ft#23b|3)Ol%bl=(^ds=SUo4a`g$&cwM7n1jlUts4`?61g6`5|qhse2yZVt0}2 z4R3O9{d4JN2;_YomWW>X=?cY_p6*pVb!Yp!xH1af?Y89G-|A!rZ@7g~WyuYmavj{j zbDagG+4--|x?`Q?&Ft(V7FdIz Xfe-++gu7k-vt3Taav{LKZ!rHKx9SV; literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_endgame.raw b/data/sounds/soccer2_endgame.raw new file mode 100644 index 0000000000000000000000000000000000000000..f27fa1c1ef40c954b90d56aed6bda1717a64e6e8 GIT binary patch literal 24626 zcmaL92YcMevLy)bT{#wuuIQa8sil^>@0;D9zu(U8+-^zqo}w*p;JukZ0Vo!A`wdk> zMrNFdOt?fM^B@ugL6X-$B!T?oFBhgND4fV~`UetNHVe?m`Y-9qUH8 zMEV1ZV=K`)jVslj*^w3_cMu3lweu{a%XHTmE|-06fbv!TN*9QAb2xI=SZ81`d_6iL zX|d7M``l`54m?h-_wHn5QGB+B^9$k7#F8cUCT5Jy(xs0F)#`0`Rpl2C#|LIuzg8F7 zhk5jJUAk11tCFZ9%3$<)`$@avYD(=ApS!P?F7eeiBlP`7{IaQc*Q}Riyi*HR zvi6cJ|K!R~(b_mrbh|`dH?ha1=)P8ZmWUDB=o*_Z$zn_2GL5QcmAKmy_qagaNpsHv z-AAk1aC=}a_l6rmf6lZ8p-TxvO43GklM#mq;bL?W+a#KBW>_*EoW$Ui7z+6`hqh?R zVmRHU*$z{B#!Dt6jFA{mhDu;?NF+o_)0Ngx_d%`n**6N1Dg`L4jUaL#A3Ao9zqJ3q2Z zQOw2~GS@}uAV4N=Beh+-5PvIa`I8b*5zhPjk54t)e;(2(@m#2gZgFQSnz zpd-&CQ2{~lkatW2BXAbS9KjpeK87eH7SgEh=s3nRRGbKwVIT=r!m)&pbi>9Gp2mHa z9=awplctbZv~(?wu@W3O(KBoVLj;-#SW7dX z&8zUY8*n^+*MIyny5BYLx6rc#;;>0wFU%b-G!Lc96}53iyuS#V5Bf%D@J?@UdYA9e z`wh2W4xdZ&1}3!q#TK^IcH{^_-Ow+Gql!OZser*ElVTtF@(UvCIPV6rY*_Q-aVbvb zeLKOhfq)M=%o9=40m9R42gPKR z@F{YvTR0+7SRC_?p`$Ua;7KU^rfK7-L=hoF>!yk%jDRPxXzQ*QlQKs7G-j9vp2##6 zkx&ak~V&Er~zN12uCKxEq-(&;a_;rp@LFi*FFi`DvldF7k9ahNQfQy(6k&$sIK z^UH?T`$O-pYR}8==+p@@Zw|M|JmadigxrzVbicm^)9SeHE^bn?37c3p+iazAxjK zjoQ&d^Se~Npx3YQ59h(^gR#}_f9@P;E=vs<-luUBiFn_tI4T{+GTd>VFhIp|C}0>FdT!YnE$RaW2}-e-pkTs` zi1b2|k$9;PEtYmg%*6uUaG^hBFqDcClP6!wWSgdK0r!zuQiIaS z<0F!BF`LEuN@SuT6Vvp_m2j=(cNvL5I6Z)lCI~DALqj6KXh%0C0)=ZMk>T1v8AJ@j zkflt=z-b;upttjMgCK}GJwOSGz&(lTk8m^Ivg%E}qDcZ$xPTOa%Gho|A@u)ET0{SWVHYka$vobF)PJH&aN zJzQV-t6D!7R!_-;i@14dA3Ur7dTH(VpLeaBum0JtceTlV+phhuMfteAbSUrrMK#ak z-5dMQYkj9R*d0FpIeOS}9=7naJ?dnUzMZR|%&q+3YM0p7W&G*F-Fz7Bw_AVqAGWR5 z3VOCuKQ5P!8s(lsI$eS9%a|_)E^0~0sNwdZH{cR45UGxgb~)DOaT|?z$CC|%3E?3? z`UyO6=mEh+H0}jnS$FG0Lkv;Hi$j7Kh}eiCVkSZox2oH7swN~cA4jf;c588$!96h! z&`^OZKy|nTWrD~Rl71x~z#~PDeQ1m2lnjeUaVm%`j_6d0HctcsVVf0XB#jdeAK}VK zKmv!4{3K)}Ho@JP4qS)9aRQIslA}ivhO;i2V5B#2m4M`9mlcMdAL9(35b!|M%#gqY zjEWdq)jd2CcqF74&Cx=Fq6uh3I5xsKktsajNY%EGgonNn=QUH06H>ylSn_qlM`M}9 zV;0lkQVK*4LkLcHv;ZLl67wXyHzss!UAHQvBWvenNgVV7JN0Qrd-%W5n@#6xjrqPRov#V!rSi%A+Bae0np(StM}@n7qwRNl|LQ*N zkDfODt1rmePI$8>{8+Djn-|Zdt5l14POu#sUN<=b32-^L!WA|yg`hH1mtgh#MM@C_}%6NO5LVXA9Hs6>(>&O_gVAn5}JksaG|XtPxB z!BC6ATHO`Tf3J_{ox`p8thsQjto+Sy9EB^F3X#F+}hFx{~C7IhwY|$^O3k; zk8bAKqc!DZMLty){$1Jqn_0fVcFv=(7tZ$m;N778$KZKKf7lMsKOv{<=-G1V$5#Ev zf_ze1Jgn~ipjR%Ct;^ukjlJ`zzVAQ%F}T|`?zgeC55$iqaj{rET3-4gm#>)BE9(6P zvU+cCy$rrSced5xN_^f_PO9SZV!2bn-~l5IIl|*mKeXgzxL|b@%;OU$;^~e+c4^+B zpp%5>vQu_+E=rV;fLxal`iKw_l<&jH)@+PbDMVy=@S}8(VFnnC0+1+js$(8$F_iCOcXj&+?$KK0;pmb_;RCI83%k!QDJO}(Xi&3FxbFI zLiGe}T=IIPL`1CS;er$UMhS}}${|@>ccgTb1Ea%GgNF(xM4>O>hGS7QhZ0_-=!Qig zloX~z3(X8Ltb`#Ei|V$4;~Y)F2+M>A42&TVBov^7fJcx_V*v|SkB-GGM+Afj;4r3n z5)0s(x4Z(2Umr|z`-yXyU(f4@qeY$z9t*o%NY zQOjSVFkID-wee)~DGJUT91VUSAeEUfF`dx(`E3ZQdA&NLY<+c-C|o zp$n&prfeh>1Fhnz@WLR(zDKYpLY32!iNLNQoEdpxd>a3sA(D` z!mvbyiXg@aArfdPM`O!HCLIJrjx7@&whWPAyb13o(6dlzBnP_fCMY~e65I{F%Ia8-6;swjO%h1LJFd zxHf1nYxf_L$2ISM9zWaQ&YRptZSLE`>fdtxoL)bpeme;_?)Ck4@6T>~Yy7nBU40Hu zx03TU@yB-MTSGo6FMg}+e5Y40;+<<4qZ-@KD!jq`F}UB=AGeW<59sk4dc9IPUR(HH zRxY{aQ-1G+Si12yp{s$XjC%Xgeb_XIC9hSkYnadq8ZB(0?aDEN!h2=aSLgfzPkJmK z8Z7-ROV7AyP;eR&7*W&laagJ?Q_mz^Qncft!Z@jneBLK% z4+B+K!gM(F5li>sebp>^9hxB#S`QH}Hht(h2p`6ev}>sfyy(OpQt_ZKAPF``U5V06 zANm5AC4pCNeGC_)i1|s$G8`YlC6owZ3}M+=B2r|G3Z`x12r0spisBiLn_%D^#<6fo zU=b@|5iaVc8N`%`(Q5bkcdxT)KCUKLyU5ihd9fh< zSYP^HE}sc2N8-Cfa_P$3d9Z)~scv-oJLBg+paU_W4>|paAFiXPOOB=jlNC!>HOBIu7J5{+>(z!1lWX#u!TG1Nr} z4`ck82qHR)NErOZ5eYLSVSpnb1Qg=nh>MdjUFBl9gHRqy`3V`sWDt>ILc;q^9AXLl zV(8^jG(xcu-X8G;L6I1VVa^Ky353ZE86+?@gQjz0QG%s2W-tVfFcgFk!QjG9i(<&4 zUFlSaH2zJhYZ3=mKmaI$^f6nin%zM5uI3jMW3g(g+yO@DQsddvX7 zZ2z0m!hMdO8cl_14bu`3Ch|;0Q{AuV+5OHzsrjVgZ(8)a2dTQqO@ty>RGTTY(gK+2 zUUUB>r568KUeuCTT+|0?F3u_nZR#oio8l%yVe?N_{d3vmX#A?0xJfIRb((?xvxW(* z@Q|tBK=b|1d`>jEI(L=kUUznqo0z2P9GUH8mdWJYc4AlHa{U`vflCW>xo}!!r{!ru zVO*dm`K&NK9#fl{a)4%vSKCyYK=aL1Gd0T{rO8y8m(Au2J)~J3uWo;Zy*f(4ui8SM zEt&yLiVKU0kJPj%&D<1qPjZE_@H?$(Dol*u=B7otFwIY4nJ_I+y-za}aVA%&{z$Qmdl$o4vC%+<_na`Zf;)MNTl)HL0`v-mIIaj2$ zOfhMuFoiVx6@|Gbh0kDS@de^lJt=v!c~imEcq+V_&Qy|VGt~^T5GRTm!=fD0RGhU- zFyUruiDHe-xit7)x_?t56ESu={7}A3kuV;mR#|w&7{}zSMWqLoBdUuHhE&5 zd!F?)Q(a-3?q?4Fha@wGZ6^Gh&Kehp%yD5-R8yo=M@2!A7L9-^CZ3>tqAK(=Rlgz% zWbSpEeKmTOvKHl#iSt+8M9Q;i^2X6j?iY)<$js<1q;NDTeXDxip;;-z6pjn?Nt$J* zfK6x2m-Uw+1{^eyE2)2{IybzRWNs)Uiq|jO89GDhO{$)v# z%Tq9URp!87AhV^vs34pD-uRw2qi{WA^{bfYXT7}fHCy?sJgqggn`WjvobS_2UFm_F z0COLcB$H=~Ck7d=K)*Ju@RnQUjxv3r%hO4cY2F^7SEE@eMdp?>yO5W>CbN)PdDa!k zGuc%9&!dw8QdM5t)Y+?PUNnQ40lg{<18|jlO)c`hnTQ2qnx;bPphydJ0m#*_NukIa zJ5$lrMFvT|{_-!+PAZ(pdDAAAX~9IutR{y8$}(K8m}Dk$E@fKSW~duVZD&AJfC zTBU3B%gd2I^f{&S_@cy1Xh&C(?zab@TMeW%BCTXaqz?JQ5mXekpESuOsN3ifGREF0jtg1X)`^&&+9lClVHXozrExup`vi-1)J}y@7(I^>q0)nWANWR_rN;>HCz_VFsEs5#2$aF#qc-Mzo0i;R8GCr|UkQT2(W(u* zT%+zddBkyALeYjVYJubuyaf}A)PNRLl!nF8$hRfSt!cU(qnrbCqr{LUH4;`SU~beD z1HEGFK-D4>)MmM7nQ2q3&%jbyERX%F>hdwh1+hyKJ&EcOY{(K`7{kKd+{h9FjCT=_ zpt}O7sDOnTO;6GNiVo~FSX2oHWZ4QUElXlU1|8uzV<#G+!1O8*FJfCwO0aGm1T3fP z7KPKWridsmtjv;>05k3!ZfLM1AX143yg18B5P^le0@z?`hynG7@OV_yT|AUvIgzI{ z7pOn5f(PUv*U(_Xw*;$?Qe@aB7{Y2Z$-?w}0_$@)iU^LWC1Fy6r5Q2OU6ZiMrWIBD zD5pP)Qh%3zk%jO4!V$IKwGSRUA9^=i!`1sM~i}mnwQ8`(gJE|#{!t$B4e?&B|qTL%8R$R6o#|ORE zpS``}LsT#r+KzzvH>?mZEDejgR)hd;@rhPO z2RLR+gh%>}ZHtBn#0!`+w;8@wqMm8i<0w0cIW;J&0UgmW!EP~pTVh`@$s?J-#^erK z>-e%m@vv^gVk0>o(salnVSq?|ywVE<7gl>Pmx~AGc*u|;Tx>2T_Q+Bv5u zwyuzt)zAqR*lCnWxHLkdc;v9LZ&I*)j3Ty#55ovYxd6jsCK!!nGy=jKQr1-;xFK9b z!3C*XKosFf0)d5n)god-f|-61$VN7ab3pWRKQ|YL(z{1{wLSW9 z`>^Smo95ML=XTjV+f=T$#KU^&f)@`P`=`qM3AJ$+?_UwS_txsY_2sd<)$eaxcOU)R zE$e2LI@_1NFLP(Lxub>kzm)nhyK#bjJc-tCob4Cw>qCF9+u1hmzS!5>&d+t?c#l0= zWiIP;C-W=cgxU?geuaKG_m&^+o&M-^x3f8V+4OEcB^Mjf^`dZEox9|hF7W+Ztnrvg zJ$sq9`J@Ykg$my$VW|~PN>UvLb3>~fg*@T`^JcUhbtRw@0T+N2;Hr9w6_-);AYyH+ zYFJ_rm+S}+_%SM~0h5qy=)1BD#JZ6b0UN}J1vZtSG=xZi_loKjcR24t*8v>Gz-7r! ziR_S!&!b-A0~@xg=>n2)e&jM(Pr-XMtfP~TQNc#aI2NcOF*ks16`kAh?X#v8zW3%i&3+*x)-#35EfWn7WMzBG4CDYU~(6Omh^H$hKhx zFOp_SgQeRT1MUVd!diP9 z5q+FQ(hkyJR>$Sgl>;}FV<1nr1jemUz{sUlR2d@-tgkx=kWafZ(W7YKM8F~}KSWCX zn0ILo=n)j5a+nHtIg#L2Jl9R;+DUBqAc@6H`UW2&gGOFy}lAL*Z-!|G)sIAj$$EF_1h>hZR5xO8}ucMuPAp z1tc=d(2$6daOgeUbR8E{a6II2)3B0Qpvi~=qL3AZKtjY~A%Gr-FiQ2VAhbBV+g*13 z58Ak49dAV^&Bl$g`kmi83YX9E4^QUj`_WG4dCly8)mv+7d&RmwAnw<~n+9{TE*>u{ z=kmh$>fU#H3D_N%$sZT~_U(ADJ@}*5+Z?pF?CUT7`DSpnCLHdR{$3J*Z1}CZ_cz_V zNVYGX&p-9;=h5Ey@soPDZ9i=g7yI=0CF*9Oc2aNt5a%w*jT_|SrMv#3Z}r>1k6LS1 zuYp}IRL>OYw5|Y!$L-SMh$S2j2hN|Ij2GRG0z)YvgE4H6ruwAd6QmshJ=cPf92W$o zbm@~BQ0x$8Q4;rjuVm{$6jI_)iM)is20T7w@K^`~)RcU!<_-iHM_`^MVJ)ByGNdEn zF7U(5l&B0(2RcAZ0dH0CF2j1T01xEk9x4xDtN~0^xL!lG<~w)<*9NWz5~7w}pqL;i zt;Rs0k6cGihej?*+nOm77~JSdDb!4yz(k`#+lSFATio%j-m;s7a z;CkRt)6xi>XNe#Y4GoAwoP+{(1$+Pl1gIW9gB!5MA2U1&9g$`MQHbGz87+r;+FK|j z6>tPB{bP|JkRinbl?c|t1)#7Buj}l2z4SkoxpsN!nA<(Y z8>jBaj{EUpwB741LHA(3Yz-baql>-xZZElB#7=fA-xtJ7APOlPC*1rwwtXFay)<@z zj`upf|LQ#K_a64V^WTx<&G=$jI$odut6niUqL?IfuM+Sk=EDO3$)qYyDo)&`hUGaLE zxUPuDaHrR*SM17>uz!p-?*bTze!10mUb=hg%kTRAhJC+=o*z(0P4c8s{l2pNcXjTF zUq56&9>&`@_Wu3o>tlbfmtGvdxmVlK&sF|(Q~W;9UsV=PDr-kf?G{_VLq1*y>(9n! zr~7-av!xH0k*k&RNkuxHFZD{e4V}c8!F(R^Lq|Y|^{@qGb|H2WnjPURyl4g_;Ua+$ zYh}O3Aie^9dCYcjv7ZQVq`kZc4!JdatdG|XaLdK5)qsYB8NkIj6C)|$ zH&dFFv`L8!S=}MHz>mfy9QeaNBG^EUCxD)e#2gOas)z}P1|G+$o=z|vhD8o=nRFb* zWgxmpFopn9euYdznlx<{#TobvCQ=;Lj1ocwii!{!@NrNK4CD|F9Z?LC6e;xnawA)L>MFVOqoy=DT3gvWJZUARX ziabP@k@37Ygg#z`?;be#(t#LI9K5JFz)^PLO9zcl`NhDlVY@gxM0j8&d!eKFTHP4| z!BC3)2%(0!Fhbdcfww(diTbsm$B{mqD3{{e@CJekE=vIsRrbeaf5@jpf&gA{x*Xqu z(WXH7s10M=nmrcqn2z8p8mcAJEt+vS#?dNdPl5AJYVq6{9tZ}!X`w#w(Gxrf=+Lo& zs7_&#TMEYs@X1-1z!J(Inn02j5rik(ZD>CSBq|QLs&Gk&z(0~a%e3I5 zE0%O=QSYIFzD{-}*<#Tj;as=Ac7-k82fK&kEiK+|x4-t=&Gzj9ar+)QTc<9oH zXq;kOH_7j(7Cd}*J1_s$d)gm9?*?ZdlhbVsUW<>G=DwH8H|*LK{_f0Md9-$igU`Lz zruwuQUVp$Y*08&Vd{%B;GfTI@M$cau_e!B%AuS3sVj_$=1jzb+h=nlh3kejS&~XCa zv;nyb7|Ai}ML2vc1n+aPi{JrH!FMlSfQ11S2Lv$3Fra#RIPT*_03V7ZM1TOj47jG0 z4==nv6MJ;x5eOW958f0}+`}*r$YVh7f-OAp5hO@JM#BUcT|n)c(8W?NS4sv;XZo@k zKKRxzC5xr(u!#~_WYE5p4hFoi^s7s7lwc`1Ws#*+Ffa#?zz$1)Fj10H$lxnHFi5vh z8v^7pm{FXl6Yv33jabGlo74im6h zep*}zZ`zihEzsrrTA*HAIK@wEdUc=L6}e3QB|D?f#R(wWWZ1$!OQ9_L{io#=m&D5eckumZd!9;SJ)K#*);W&=BMebkSlV?G|B8IW>Z8~R%|D_ zDWE8wfD8Yxh5v|y%4W)^ZJfB6X-JNF#imCE{&HMa3FI+-u#ruZd!2Q;502FYb!$)J*}O7EEiN2(O1e1*G5%_zExbd3~?`a{O$0iY)+z zSlEN+_0YTl=Hx-%i z4_WaWM6vfpnzv_KS)QL*rkg^a%UL$p7U~=`0cQr2l58`xodING?mn}hIGv)W4azZ) zOp7wm+nogK83&n|`Tb@0r>flF8^ix_krrgXiTjzod-YQorMTBB^LFP2d2VX-MktJm zv~XCYlk%yfH>PQ3swsrRZlanL=9LU{U!fKmt_j%8&&QiElb7ezo}4E z@T$tCBAKLbHjv5klkIC0UqOZU0txxFD97j8EXj8>FMEsl#bBzOxcUc++~ce!x0zT> z;F?x?zu3Z$z~VWYvW%lFTiP<8Wj17@qfaK;#pX3I#Gd>ES(fi(HT5P zKqkuJivnY1w9=@eS{oD{<*%V&`6 zK<0?zswqqgV6J}Ss_>ehi4>Ckz{!M2mQMG82-T%-3o*+>LHZ3M{0j)iWJ6d?b!-X? zN`6a5VEqCeN@d?SQHl}={gS^BjRUPAz{E7o3eueofw@dWjaE^2WKw)NzMx5Ip=b4k zMr;jTUaXGqL}Y>Kn4|f6pp8(mB;WK)Xw&bi&MNN=$Fx`?PGW&w?T<&qI&KVXUaDB< z5?QW48)IQP(tz{DS37r=q`|#dYNP6FV?t1*Yjw_pP!VvTTRIxYJ^ZG&mk1b>UgMPtBf@O7FESPWhiC7r4OVPR3E@(YpwIMlq_&9O>0y_ z6*x4CbUQ8~Ye8Fgmqn+q(|m=vh)U=j^;4_Hb5!r1UotD&wYaMi?lZNPTrCZZ58=@Q z{oEvOr4jrw&TmgZXJz(#9ryZKC% zTlR+PmNj2yZ|CS%9le+9&my6sWm~ISz~^c4j8XMmnEr(L9gdeSv-LT4;L|9IVOF&8 zlr*|_JqXLNE?3sHra3If-kfFQ3EgLC4T42+giTniWzM-H4!&u3eW1;Bcv#)#EuJ)q zkTZgcX)_^w+l&VY(`UG0#6oyDKk>`DUDpgLjs=+9rqOm8AHpZQSqz9_TvjbMB3K87 z#g~2=88CDpqLx)lhSd=!;60++mvBp0Jcn^GoObC5VoBLHk3ig(z!yCW^&sX;3~_B} zU$umoq%a35X;uJVl2h>UFcZOiID=5IKmcKY3=gO&JQ<-3toBA2!N9sSi@*vFEY6w;mCjoAg0EhYYyS&v4#>4j`}bSDdDr{R?z~s;c7vad@cL8vc$q%0)qa$kr zPQU%f@L^kj-iXc*u;VrIYN33xH2+z!xG|vn!3GN_;<2m&W~A*}uNV_63( z50!APfin&&_klS z+BstgO~Nv;^au1F8^bsjrptLxHzS;sknpv0e)pPMybD+E{r7jy_VakV)A>_< z*wLRh{LA04vkmlOUO8KtJFdt#;v$d|4@uw=ZU2P84%+s^aKHcZFZE{My5B}FQ{NN* zSb6Omw|Gl#{0!b-n46Er)~Nki`?+a6HE{r)EtA)!(nVwORH{9bjYo68*V}zo_s0;j zYiQMsP_ih|K;2jw(#lILxeT0qRMyOrYL{YPg7{h(G3Gho*Vq!!Gfmb}tF8fS=ByjT z;@gV?JW~$XeHKJ@(F5QEumMG>w2LrZUg*cLo)2p^sMN-5qd;)UuCXh~18DiSe5gFSAf;%YiiNQ65 zcL_`z0U}_Mz#6}4IxG+Z5)U{=wh3Jbun8e@mZ3w80v?KK==f{`7SdoThVdL7qKYsO zV2HyYhzzXBL9i$wFan(rq0@*poM!`X2xr;Y6C=ZQ6P%?eAj(>ngC;CZLi8LLqQ!tA zg?JD|CXFG%19b)nx@{EGme~;@IV5ot)JMYZo!4xS_wQT#roK74_}#nQv`@E{i>Ca& zQN5H(N0s-7%!ts%!R{3^vv&}&iaOe@{(D)5;D+DJTmR-(uacb`_qVI@R(muFc6SS` z#ZBU3k2zXlPV3blE6wla`CEGVr~BchxBt`F8z4&159{MZhK15GY9mUIlc9Hj0f~d) zz|tv=VQClRbu=LHp+pWa(vpEyXS14JF&z=bSPO-&y;r5W6rDaEfXOqCOGd!K3aCMP zB;J>pAw+~=kpKc}j*_zG2tLI@Y$}W#u-p&z=A6|(NbR%4wQwFHw zW86<|QODo4$E)MkyWZ7qI9&CQKhnp|qOA+(;Ai*um*L0u z%l7#Bt9`Z?+^k|J+sbj1I<8lb>g)ejmQTs%Ir-@*+`b47?#F*Vwh!8!J?rs{efG{y zua5oFUrp|0uKpuMgYV6&`27j+6s_Gs_e=kAOMTo-Zr&rOYv@HoK3<*wUay>si)X~< zO|W~b|Mp@vyH;g9oR;A@jwvsVjF?FxjE3n&wMa1SWNm`Cdz z)~V7RmbIkBLs1H%v#K%UbC|(83^J_X@KAvOGf5P4ZMr;wgU?Wo%?i&7(9m$lSQ-FL zV8l}+cnU#GIvlqlnkfX@3>iFxHjaTTO!2_(Kq#Pr32>^2AeJ1}MG%sWu!u%%8`#Y_ z1f@Ym3qs4qEIeQmDhBG;BuW`vptflt7y;CJ;3wN&0Gw7>coyKP;ztCJ;UP`|0zx^8 zI0W!>Z5P(8Spx2y7`_AnUM!8n^<}v5ka8FB?y_ddPB&S4T&TX_3qU=+Hui$2UH#&H za@54mHfC7 zHs@Mp8)BYDK%da!#=xn1C})R=VyZPqlTk;pec*$SNlAn7a5Q6cK>F*I;}P6-ydMAq zvCWja2ya8j4(tgBM!qHo)JzC71%x41g3%1HR6SscjJG2M2CIr35sJdEd1>f~4Rc z05Xsf0BMQDeT;TtWQvl|g#>(Pr|}ON7`+IX?m-MP7N>l8d{{ODG1G`7=8GoxB*1Rt3s{JqvNks7NCV8@0`nKHsceQcKuN~9xe3nd4Pa%&+{C_zJy3)5R!=>B(=T;xUva7O4Nralmg}`fkXL>8kTeq#vbY0 z2b~P67dfwLa<795{T;E)fP2p;`G2sB1K0lFg$n*v8bR3HekEHF|a zqOxjo7|sBZg%5S$_FxPI)FM&KF>xArJbom(V=sM<;AqT-t`QI@NfQo@TMjT#X_EGV zKW%zRLeeBeZcgB-lb{@oVuAB&Il#zd;Bo{iKa7(|4)`k+V%ZSmj)uOBU=7bsNNbMk z)Lm5$y6#G=wD=q^+;@L_9PJVJ8_~%w`vZdFF4xa1tAC5j=g8_U{oy=Wz4h1bwBI`; zAenCH_rIApd*1aLakMZ0SQ5^vwIB7>Z&Dg8`4V}5>8(AQyDjxgyR|!f+PCk%I+r`{ z#TJoT^Hl*8dWhPspwF;I~t2=fT+T^}n_r_eQ`Ty7@ghSr4yQ_|x^ukGgy= zEM8Ju*Z%HL?emkp*>-Abe?c76%mc67lq)Ta_lP(Qk?Po=w{$s5geZ3TuwP?345>*m zoMv$p)P`_z5EUH(y3L@1s4TF(;o;$knlooOB78n$ClFk+UqglvTNxfbqz4~d$)*D@ zmzYl)V$!W+KrC~mFh~-nM=HaZg#g<&W%J>1E*ZjWCB#-uP85X{sPeHA8a zAgWwUC*v5#6P2+6yg?#%f&b+O9?k>R2tJ&NJS&h1APLzN2cM>3G>Ks$jHBS{z-S3* z`X~)FFgBqeL@F-8YX$_`r4fjxhH4gk>B8ZpkFqulPaxzS?jjJJ)ecdbCJFco!-g>l zeBOfj3Mzp{PQp9;TC?{uq}vhM@ZWX9otycdN|BR_Xhad?C*t^SeKYrTciL+u3!V zR_%v17Gj`w6Vb+a;OED#4-_tlHHJeRW5i1bk0jikX#hzGGKxkx0r!R%P{6f}JRpn# z3k)cz5Rw?hfeRKu%&!Du0m8%s2GPdCkPZX*+zws{NeHx_(#u?+mq7$mh;I#VrZ7H$ z&}9)3!&3u@T$A8m5CSaaWdW}&6(*FhbdE12Y^Ae)X|OTaKmnG{3Z?)oC71!n3y5GT RaSMoGz%Wav0VjdU{x^v|Mb-cS literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_endhalf.raw b/data/sounds/soccer2_endhalf.raw new file mode 100644 index 0000000000000000000000000000000000000000..b980e75573c7ecf72dc600b7715403d3488d9099 GIT binary patch literal 14722 zcmaKT_jeUZmS%dN&p&yO5Fm@Z06|fd>peYl&i=6f<({*9dS<)2tGWs+kdQ%0AOkYU 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 UK>Y$rS4c1mxn5-(3JkLU58)$nS^xk5 literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_goal.raw b/data/sounds/soccer2_goal.raw new file mode 100644 index 0000000000000000000000000000000000000000..20da26d00a39a9c4998a21665577bc22a61f8f8f GIT binary patch literal 13836 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 X1~CMXNI_!+K@Lps01w^v{=4{MH literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_looseball.raw b/data/sounds/soccer2_looseball.raw new file mode 100644 index 0000000000000000000000000000000000000000..1652b691aef77e8e208bc34673bec71dc6f6c21c GIT binary patch literal 595 zcmX9+*KXTD0K1`aQf*6$yyVp;==%T9DHj`wmjSzC@nZplep`c}1J= zmvhwVnYbHASmWZl&~!_$8&rh+GIM)rxOi+&tE~NTzDFI58wxCBd*yY}mAi~>WEJN5 zoMR6M6RR`oW>X2Efy2 z_aO_s*U^+(&cTg^Qi4abl#E|?pMKk<4jtN9j&kf1T4a9k;?5a#k0{nksB*GQ?J!-3 zzihvn`1jhfAhADCl6gT&k^+(=o+>E^<1}?gZ`;wcJ0ud?{WC%;r=^KLRMLp?Nlz6} zLV#t?RwwlMPNT*OTdIfxJ}r{ISl;LtRZS?HSwfh`>~8t$2%r8`L2XAhMb5Bz&NfxE z{ouQvhqq#ZmDVNrd}Hf9{`y{p+=@9x79b>NNzGR$z7ssSl}jXms?C<(Hb?bsPeYF5 zrZ5)39?KJ1t}k?B$_dNoj?}uf0>OOK2eO1%5!e}k4HUw$fswtz5NHjh1`=UxdL;ow NgQ9^N?t=#={{s8JHs1gM literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_lowkick.raw b/data/sounds/soccer2_lowkick.raw new file mode 100644 index 0000000000000000000000000000000000000000..288e3e048ba5d347701c4121e7b0ce4bbe676bbb GIT binary patch literal 1025 zcmWlYS(B?a5QVj{7-Itl+hC8cr*10w|9>eDNo734rUfAhp$_hse(9?7)#-B(LI^wp zcyELkoOL9fXe?#rWVXEOmE~?s3Kj-Esegj(@2ccJ`4>LLbn4h&^N_0ko^%m(MLtkQ zvScyJR>WY=9(2NjpYtBjaJ=+X%w@W0J66ZpyPtE#yc?3c&>{Et$u8oM2f~T{$t`Pt zXcTA}-0eh_X_h|zj?YBk$=!({TK)2JQMyb=w5s&{g6MTV_ck2J{Y|7Ft^-iTks&(m z4;+m&C+jkqlFroj_mrVk9Iwp9j9v${@YCMug{7IYxJzs4faALrv7R4R1l|6G)ynb3 z&xE<>G9fwNqdxTGHT{VgoD${ie2FJ-`NvMIMr2j*D2s0G>R6GR3HYJZGu}*)cG0x4 zDwtgj|74o~Mz09Y}UGQAdAG266lFEH?5+hPb2WNW!FRy4fk7 zL~d@E*+|}~ZOB!*H`cN0IIXC?lpLIhn#qKGedzAg**|T+H)FH^j|6R*wF_0Wnk?0* zk|ykmOj{VCHgeDO)AGQmOVUS<7iqU+x}h2@zb1^rt3Gyk3s^m_5u-N-==+p8?T7gC z#wJf?$c7C((W0T_8#`29nR-jX%s(;5v#1Uo0hXO#p%T}FGJYruW`m#NI$99)rer)X z5Bn+x_j~Q)h1ba!rtFfo2Al9CHf&OIOZzIH9b&XrQ_A5}3ObuB9TPiM@$1Oc6HBu6 z*F#IfuXFhgFa~#Scg#0Z2VZ&R4I19RjmGs4Ew_+-#Qmn$?AxgGO*Ai)Y9aw<{75*O zMSdAqH0+ud^mxs!@_klLnsjNyt>ffoRjBNZwBXm%u5-kPiIODR1*=?Q;=NyjowHzl qf(^zHz~V3_6gj{M!-}_Y9ssse01U``f&s6HdO#~8Tj||a`u_ny1~wu9 literal 0 HcmV?d00001 diff --git a/data/sounds/soccer2_tick.raw b/data/sounds/soccer2_tick.raw new file mode 100644 index 0000000000000000000000000000000000000000..740df1a8da587031eb5c9cf54d91aa708be4f74a GIT binary patch literal 88 zcmV~$+X{dn3;)X#-;Yr(gW7B# kz~05lWsrd$HdO*0rAe`tL=**ub;(4ZLM{Xuk+J&t2WI9f+W-In literal 0 HcmV?d00001 diff --git a/data/wiimote/WKBLR1.png b/data/wiimote/WKBLR1.png new file mode 100644 index 0000000000000000000000000000000000000000..478f0bd7539deff58971fb1ebc4f906424a1193f GIT binary patch literal 2376 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 FV1gvB|5N|~ literal 0 HcmV?d00001 diff --git a/data/wiimote/WKU.png b/data/wiimote/WKU.png new file mode 100644 index 0000000000000000000000000000000000000000..c32211701287d9a7ffddb674c7d5c94b872fd880 GIT binary patch literal 594 zcmV-Y0Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizyJUazyWI3i3tDz0q03XK~z{r?U%o* z!Y~xZPbzMLpbml}6?YYJb#n0)boL!w@9H~r)=}JCd;&qlS!opuf`34C6V2_3sTgmn zR=rm)^alr;FDK@-O}pi1hEysAolXbB;V|K{6ha7` z=f#VAVHgI@X0x=_YSGDLLUmoIsA1qWYS@Q4s9lf06;km!aFRlyz$RluBq8Kj%A=v2 zo`ZY7c)ZHf1-uKd0IvYDSS;vnx8u#9plM8}Q>fKy&}cM3O(uDdh@tCHsZ^j|uR|h{ zU|Y;NQzu!YJ7<3$j{eHh6n$0G};&HBun6nv_%jI*f47{1mX2be> zz22z+%QmT|X^_k1;CMW;L>V~9X>uDZ0t;|LQ55L+`%tY`VYytM?Ar2g+r9n-oD1i) zc+Cml1;J{%-7b4SgTa8yBI$G*R8{4z+gOJY42MJB60r^|cGtyX5k{jCdj%hV0^S;M zwGE@uDENFnu815C2bj<2uD79kBZ|eiDq@=Eb4KLaiurE9)s9@YpRr<=crS3_TzqaZ z+U+(Ao2wk@@5sVCj=ci@ZvmN1hQ+HqQ~-LxcDrS#C3=GG0SI2BhJBcWxo-H#pVLbo gD&RNy@FE2G23Ha2*<&toz5oCK07*qoM6N<$fviWidth - 240)/2) -#define realy(y) ((y) + 20) +#define SCALE_X _scale_x +#define SCALE_Y _scale_y +#define realx(x) (((x)*SCALE_X) + (rmode->viWidth - 240*SCALE_X)/2) +#define realy(y) (((y)*SCALE_Y) + 20) // draw_poweroff_a modes -#define POWER_POS_OFF 0 -#define POWER_POS_MODE1 1 -#define POWER_POS_MODE2 2 +#define SWITCH_POS_OFF 0 +#define SWITCH_POS_ON 1 +#define SWITCH_POS_MODE1 2 +#define SWITCH_POS_MODE2 3 +#define SWITCH_POS_PRO1 4 +#define SWITCH_POS_PRO2 5 // draw_vblip/draw_oblip modes #define BLIP_TYPE_NORMAL 0 @@ -48,17 +57,29 @@ #define DIGIT_TYPE_FLOAT 1 #define DIGIT_TYPE_SPECIAL 2 -extern int trace; +// Switch types +#define SWITCH_TYPE_1 0 /* like baseball, football2 */ +#define SWITCH_TYPE_2 1 /* like basketball, hockey, soccer */ +#define SWITCH_TYPE_3 3 /* like football */ +#define SWITCH_TYPE_4 4 /* like basketball2, soccer2 */ + +extern f32 _scale_x, _scale_y; + extern void print_text(int x, int y, u32 rgba, const char *fmt, ...); extern int draw_digit(int x, int y, int val); extern int print_digit(int x, int y, int pass, int val, int max); extern int draw_digit_f(int x, int y, int val, int flag); -extern int draw_poweroff_a(int x, int y, int val); extern int draw_vblip(int x, int y, int type); extern int draw_oblip(int x, int y, int type); +extern int draw_gear(int x, int y, int pos); +extern void destroy_gear(void); + +extern int draw_switch(int type, int x, int y, int pos); +extern void destroy_switch(void); + extern void debugPrintf(int x, int y, u32 rgba, const char *fmt, ...); extern void debugDestroy(void); #endif \ No newline at end of file diff --git a/source/blip.c b/source/blip.c index 31b2e47..3833395 100644 --- a/source/blip.c +++ b/source/blip.c @@ -2,6 +2,10 @@ * LEDhead for Wii * Copyright (C) 2017-2020 Nebiun * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,7 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + #include "LED_Handled.h" #include "v_blip_png.h" #include "o_blip_png.h" @@ -41,7 +45,7 @@ static inline int _drawBlip(int x, int y, int type, GRRLIB_texImg *blip) idx = 0; break; } - GRRLIB_DrawTile(realx(x), realy(y), blip, 0, 1, 1, 0xFFFFFFFF, idx); + GRRLIB_DrawTile(realx(x), realy(y), blip, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, idx); return idx; } diff --git a/source/digit.c b/source/digit.c index d46dfe8..85dbcd5 100644 --- a/source/digit.c +++ b/source/digit.c @@ -2,6 +2,10 @@ * LEDhead for Wii * Copyright (C) 2017-2020 Nebiun * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,7 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + #include "LED_Handled.h" #include "digits_f_png.h" @@ -48,13 +52,13 @@ int draw_digit_f(int x, int y, int val, int flag) idx = 12 + val%10; break; case DIGIT_TYPE_SPECIAL: - idx = 23 + val%2; + idx = 22 + val%4; break; } if(idx < 0) return -1; - GRRLIB_DrawTile(realx(x), realy(y), digit, 0, 1, 1, 0xFFFFFFFF, idx); + GRRLIB_DrawTile(realx(x), realy(y), digit, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, idx); return 0; } diff --git a/source/font.c b/source/font.c index f63ecba..e3d7328 100644 --- a/source/font.c +++ b/source/font.c @@ -2,6 +2,10 @@ * LEDhead for Wii * Copyright (C) 2017-2020 Nebiun * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/source/game/ArmorBattle.h b/source/game/ArmorBattle.h index abdc178..411c71b 100644 --- a/source/game/ArmorBattle.h +++ b/source/game/ArmorBattle.h @@ -50,8 +50,9 @@ Website : http://www.peterhirschberg.com #define ARMORBATTLE_SOUND_HIT 4 #define ARMORBATTLE_SOUND_SCORE 5 #define ARMORBATTLE_SOUND_ENDGAME 6 +#define ARMORBATTLE_SOUND_NSOUNDS 7 -void ArmorBattle_Run(); +void ArmorBattle_Run(int tu); void ArmorBattle_SetSkill(int i); int ArmorBattle_GetSkill(); void ArmorBattle_PowerOn(); diff --git a/source/game/AutoRace.h b/source/game/AutoRace.h index d0e6396..67db7f3 100644 --- a/source/game/AutoRace.h +++ b/source/game/AutoRace.h @@ -50,8 +50,9 @@ Website : http://www.peterhirschberg.com #define AUTORACE_SOUND_HIT 4 #define AUTORACE_SOUND_TIME 5 #define AUTORACE_SOUND_WIN 6 +#define AUTORACE_SOUND_NSOUNDS 7 -void AutoRace_Run(); +void AutoRace_Run(int tu); void AutoRace_SetSkill(int i); int AutoRace_GetSkill(); void AutoRace_PowerOn(); diff --git a/source/game/Baseball.c b/source/game/Baseball.c index 8ee85a9..92cdf16 100644 --- a/source/game/Baseball.c +++ b/source/game/Baseball.c @@ -28,10 +28,13 @@ You should have received a copy of the GNU General Public License along with this program (license.txt); if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -Email : peter@peterhirschberg.comWebsite : http://www.peterhirschberg.com +Email : peter@peterhirschberg.com +Website : http://www.peterhirschberg.com */ +#include +#include #include "Baseball.h" #include "Games.h" @@ -41,12 +44,16 @@ Email : peter@peterhirschberg.comWebsite : http://www.peterhirschberg.com #define THIRDBASE 9 #define HOMEPLATE 12 +#define MAGIC_NUMBER 64 // emperically derived magic number +#define SPEED_BASE (1 + (MAGIC_NUMBER/16)) + +#define CENTER_FIELD 0 +#define LEFT_FIELD 1 +#define RIGHT_FIELD 2 // game variables static BOOL bHomeTeam; static BOOL bInFrame = FALSE; -static BOOL bPower; -static BOOL bPro2 = FALSE; static int nHRuns; static int nVRuns; @@ -59,7 +66,7 @@ static int nTimerPitchWait; static int nPitchSpeed; static BOOL bCurveball; -static int nEraseIndex; +static BOOL bStrike = FALSE; static int nPitchIndex; static int nPendingRuns; @@ -68,13 +75,15 @@ static int nTimerEndPlayWait; static int nTimerRunnerMove; static int nRunnerSpeed; static int nTimerFielding; - static int nCurrentRunnerIndex; static int nDefenseBlip; +static int nBallBlip; static BOOL bCaught; +static BOOL bDisplayOff; static int fireWorks; +static int nSwingSlot; // finite state machine stuff @@ -88,8 +97,9 @@ static void fsmOut(int tu); static void fsmHomeRun(int tu); static void fsmEndPossession(int tu); static void fsmGameOver(int tu); +static void fsmGoOut(int tu); -static enum FSM { +enum FSM { FSM_IDLE, FSM_PITCHWAIT, FSM_PITCHING, @@ -99,8 +109,10 @@ static enum FSM { FSM_OUT, FSM_HOMERUN, FSM_ENDPOSSESSION, - FSM_GAMEOVER -}fsm; + FSM_GAMEOVER, + FSM_GOOUT +}; +static enum FSM fsm; typedef void (*FSMFCN)(int); @@ -114,66 +126,125 @@ static FSMFCN fsmfcn[] = { fsmOut, fsmHomeRun, fsmEndPossession, - fsmGameOver + fsmGameOver, + fsmGoOut }; -typedef struct RUNNER +typedef struct { int baseindex; BOOL enabled; -}RUNNER; +} RUNNER; #define MAX_RUNNERS 4 RUNNER runners[MAX_RUNNERS]; +typedef struct { + int seq[3]; + int n; +} fireworks_t; -// proto's -static void InitGame(); -static void ClearAllDisplay(); -static void RestoreAllDisplay(); -static void InsertRunner(); -static BOOL MoveRunners(); -static void ResetOffBaseRunners(); -static void DrawDefenseBlip(int index); -static void DrawBaseBlips(BOOL bState); -static void ErasePitchBlips(); -static void HitBall(int nPosition); -static void DoOut(); +static fireworks_t fw_frames[] = { + { {DIAMOND(1)}, 1}, + { {DIAMOND(1), DIAMOND(2)}, 2}, + { {DIAMOND(1), DIAMOND(2), DEEP_1ST}, 3}, + { {DIAMOND(2), DEEP_1ST, DIAMOND(4)}, 3}, + { {DEEP_1ST, DIAMOND(4), DIAMOND(5)}, 3}, + { {DIAMOND(4), DIAMOND(5), DEEP_3RD}, 3}, + { {DIAMOND(5), DEEP_3RD, DIAMOND(8)}, 3}, + { {DEEP_3RD, DIAMOND(8), DIAMOND(7)}, 3}, + { {DIAMOND(8), DIAMOND(7), OUT_LEFT}, 3}, + { {DIAMOND(7), OUT_LEFT, OUT_CENTER}, 3}, + { {OUT_LEFT, OUT_CENTER, -1}, 3}, + { {OUT_CENTER, -1, DIAMOND(10)}, 3}, + { {-1, DIAMOND(10), DIAMOND(11)}, 3}, + { {DIAMOND(10), DIAMOND(11), NORMAL_BALL(8)}, 3}, + { {NORMAL_BALL(8), NORMAL_BALL(7)}, 2}, + { {NORMAL_BALL(8), NORMAL_BALL(7), NORMAL_BALL(6)}, 3}, + { {NORMAL_BALL(7), NORMAL_BALL(6), NORMAL_BALL(5)}, 3}, + { {NORMAL_BALL(6), NORMAL_BALL(5), CURVE_BALL(4)}, 3}, + { {NORMAL_BALL(5), CURVE_BALL(3), CURVE_BALL(2)}, 3}, + { {CURVE_BALL(3), CURVE_BALL(2), CURVE_BALL(1)}, 3}, + { {CURVE_BALL(2), CURVE_BALL(1), NORMAL_BALL(1)}, 3}, + { {CURVE_BALL(1), NORMAL_BALL(1), NORMAL_BALL(2)}, 3}, + { {NORMAL_BALL(1), NORMAL_BALL(2), NORMAL_BALL(3)}, 3}, + { {NORMAL_BALL(2), NORMAL_BALL(3), NORMAL_BALL(4)}, 3}, + { {NORMAL_BALL(3), NORMAL_BALL(4)}, 2}, + { {}, 0} +}; -BOOL Baseball_GetPower() +static void ClearBlips() { - return (bPower ? TRUE : FALSE); -} - -void Baseball_PowerOn() -{ - InitGame(); - bPower = TRUE; -} - -void Baseball_PowerOff() -{ - bPower = FALSE; - Baseball_StopSound(); -} - -void Baseball_SetSkill(int i) -{ - if (i == 0) - { - bPro2 = FALSE; - } + int i; + + if(fireWorks) { + fireworks_t *fw=&fw_frames[fireWorks-1]; + + for(i=0; in; i++) { + if(fw->seq[i] != -1) + Baseball_DrawBlip(FALSE,fw->seq[i]); + } + } else { - bPro2 = TRUE; + if(nBallBlip != -1) { + Baseball_DrawBlip(FALSE, nBallBlip); + } + for (i=0; i 0) { + fireworks_t *fw=&fw_frames[fireWorks-1]; + + Baseball_DrawScore(-1, -1); // Clean fireworks + for(i=0; in; i++) { + if(fw->seq[i] == -1) + Baseball_DrawFireWorks(); + else + Baseball_DrawBlip(TRUE,fw->seq[i]); + } + } + else { + if(nBallBlip != -1) { + Baseball_DrawBlip(TRUE, nBallBlip); + } + for (i=0; i 0) - { - Baseball_DrawPitchBlip(TRUE, nEraseIndex, bCurveball); - } - DrawBaseBlips(TRUE); - if (nDefenseBlip != -1) - { - DrawDefenseBlip(nDefenseBlip); - } -} - -static void DrawDefenseBlip(int index) -{ - Baseball_DrawDeepBlip((index == 0) ? TRUE:FALSE, 0); - Baseball_DrawOutfieldBlip((index == 1) ? TRUE:FALSE, 0); - Baseball_DrawOutfieldBlip((index == 2) ? TRUE:FALSE, 1); - Baseball_DrawOutfieldBlip((index == 3) ? TRUE:FALSE, 2); - Baseball_DrawDeepBlip((index == 4) ? TRUE:FALSE, 1); -} - -static void DrawBaseBlips(BOOL bState) -{ - if (bState) - { - for (int i=0; i= 0) && (runners[i].baseindex < HOMEPLATE)) - { - // erase previous blip position - Baseball_DrawBaseBlip(FALSE, runners[i].baseindex); - } + for (int i=0; i= HOMEPLATE) - { + if (runners[i].baseindex >= HOMEPLATE) { // got a run - runners[i].baseindex=-1; - runners[i].enabled=FALSE; - if (i == nCurrentRunnerIndex) - { + runners[i].baseindex = -1; + runners[i].enabled = FALSE; + if (i == nCurrentRunnerIndex) { nCurrentRunnerIndex = -1; } bRun=TRUE; @@ -331,23 +340,19 @@ static BOOL MoveRunners() static void ResetOffBaseRunners() { BOOL bOffBase = FALSE; - for (int i=0; i runners[nRunnerOut].baseindex) - { + else { + if (runners[i].baseindex > runners[nRunnerOut].baseindex) { nRunnerOut = i; } } } } // mark the lead runner out - if (nRunnerOut != -1) - { + if (nRunnerOut != -1) { runners[nRunnerOut].enabled = FALSE; } // figure out if the remaining runners should go to the previous or next base - for (i=0; i 0) { + Baseball_PlaySound(BASEBALL_SOUND_RUN, PLAYSOUNDFLAGS_PRIORITY); + Platform_Pause(200); + --nPendingRuns; + } + bDisplayOff = (nPendingRuns > 0) ? TRUE : FALSE; +} + +// FINITE STATE MACHINE STUFF +static void fsmGoOut(int tu) +{ + static int delay = 0; + + if(delay == 0) { + delay = 1000 * 600; + bDisplayOff = TRUE; + Baseball_PlaySound(BASEBALL_SOUND_OUT, PLAYSOUNDFLAGS_ASYNC|PLAYSOUNDFLAGS_PRIORITY); + Baseball_Clock(1); + } + else if(Baseball_Clock(0) >= delay) { + delay = 0; + bDisplayOff = FALSE; + fsm = FSM_OUT; + } } static void fsmOut(int tu) { ++nOuts; - if (nOuts == 3) - { + if (nOuts == 3) { // end of possession // but first play any pending run sounds - while(nPendingRuns > 0) - { - Baseball_PlaySound(BASEBALL_SOUND_RUN, PLAYSOUNDFLAGS_ASYNC|PLAYSOUNDFLAGS_PRIORITY); - Platform_Pause(600); - --nPendingRuns; - } + if(nPendingRuns > 0) + pendigRunNotify(); nOuts = 0; bHomeTeam = !bHomeTeam; - if (!bHomeTeam) - { + if (!bHomeTeam) { ++nInnings; - if (nInnings == 5) - { + if (nInnings == 5) { // ************************ // ****** GAME OVER ******* // ************************ Baseball_PlaySound(BASEBALL_SOUND_ENDGAME, PLAYSOUNDFLAGS_ASYNC|PLAYSOUNDFLAGS_PRIORITY); - Platform_Pause(200); fsm = FSM_GAMEOVER; return; } } PlatformSetInput(bHomeTeam); - Baseball_PlaySound(BASEBALL_SOUND_ENDPOSSESSION, PLAYSOUNDFLAGS_PRIORITY); - RestoreAllDisplay(); + Baseball_PlaySound(BASEBALL_SOUND_ENDPOSSESSION, PLAYSOUNDFLAGS_PRIORITY|PLAYSOUNDFLAGS_ASYNC); Baseball_DrawStats(-1, -1, nBalls, nStrikes, bHomeTeam); fsm = FSM_ENDPOSSESSION; } - else - { - RestoreAllDisplay(); + else { Baseball_DrawStats(-1, -1, nBalls, nStrikes, bHomeTeam); - nTimerEndPlayWait = (nDefenseBlip == -1) ? (1500/50) : (3000/50); + nStrikes = 0; + nBalls = 0; + nTimerEndPlayWait = (nDefenseBlip == -1) ? 1500 : 3000; + Baseball_Clock(1); fsm = FSM_ENDPLAYWAIT; } - nStrikes = 0; - nBalls = 0; } - -// FINITE STATE MACHINE STUFF - static void fsmIdle(int tu) { // play the run sounds - while(nPendingRuns > 0) - { - Baseball_PlaySound(BASEBALL_SOUND_RUN, PLAYSOUNDFLAGS_ASYNC|PLAYSOUNDFLAGS_PRIORITY); - Platform_Pause(600); - --nPendingRuns; - } + if(nPendingRuns > 0) + pendigRunNotify(); nCurrentRunnerIndex = -1; nDefenseBlip = -1; bCaught = FALSE; - - if (Baseball_GetInputSCORE(NULL)) - { + nBallBlip = -1; + + if (Baseball_GetInputSCORE(NULL)) { Baseball_DrawScore(nVRuns, nHRuns); } - else - { + else { Baseball_DrawStats(nInnings+1, nOuts, nBalls, nStrikes, bHomeTeam); } // wait for pitch button - if (Baseball_GetInputPITCH(NULL)) - { + if (Baseball_GetInputPITCH(NULL)) { // delay from 1.5 to 2.5 seconds (according to manual) // before pitching the ball - - // access of game context info from here is probably not too cool - nTimerPitchWait = (Platform_Random(1000) + 1500) / gGameContext[GAME_BASEBALL].tu; + nTimerPitchWait = 1000 * (1500 + Platform_Random(1000)); // Microsecs + Baseball_Clock(1); fsm = FSM_PITCHWAIT; } - Baseball_DrawBaseBlip(FALSE, 0); - DrawBaseBlips(TRUE); } static void fsmPitchWait(int tu) { Baseball_DrawScore(-1, -1); - - if (nTimerPitchWait > 0) - { - --nTimerPitchWait; - } - - if (nTimerPitchWait <= 0) - { + + if (Baseball_Clock(0) >= nTimerPitchWait) { + int level = Baseball_GetSkill(); + // pick a ball speed and throw style // and pitch the ball - bCurveball = (Platform_Random(3) == 0) ? TRUE : FALSE; - if (bCurveball) - { - nPitchSpeed = Platform_Random(2)+1; // curve balls are a little slower + bCurveball = (Platform_Random(3 - level) == 0) ? TRUE : FALSE; + if (bCurveball) { + nPitchSpeed = (3 - level) + Platform_Random(2 - level); // curve balls are a little slower } - else - { - nPitchSpeed = Platform_Random(3); + else { + nPitchSpeed = (2 - level) + Platform_Random(3 - level); } + + nSwingSlot = nPitchSpeed; + nPitchIndex = 0; + nBallBlip = (bCurveball) ? CURVE_BALL(nPitchIndex) : NORMAL_BALL(nPitchIndex); -#ifdef __PALMOS__ - nPitchSpeed += 7; // PALMOS ONLY -#endif - - nPitchIndex = -1; + bStrike = FALSE; fsm = FSM_PITCHING; } } static void fsmPitching(int tu) { - BOOL bStrike = FALSE; - static int nswing; // swing early=0, center=1, late=2 - int nMissChance = 5; - - if(nPitchIndex == -1) { - Baseball_DrawScore(-1, -1); - nEraseIndex = -1; - nPitchIndex = 0; - nswing = 0; - } + const int nMissChance = 5; - if(nPitchIndex <= 8) - { - if (nEraseIndex != -1) - { - Baseball_DrawPitchBlip(FALSE, nEraseIndex, bCurveball); - } - - Baseball_DrawPitchBlip(TRUE, nPitchIndex, bCurveball); - nEraseIndex = nPitchIndex; - - // check for swing at 3 different points - // we really only need to check 3 times - // when the ball is in the strike zone, but - // we'll do it anyway to keep the timing consistant - - // see HitBall() function for detailed description - // of what it does and what the parameter means - - if (Baseball_GetInputHIT(NULL)) - { - // swing early - switch (nPitchIndex) - { - case 5: - if (Platform_Random(nMissChance)==0) - { - // missed - bStrike = TRUE; - break; - } - else - { - HitBall(0+nswing); - return; - } - case 6: - if (Platform_Random(nMissChance)==0) - { - // missed - bStrike = TRUE; - break; - } - else - { - HitBall(3+nswing); - return; - } - case 7: - if (Platform_Random(nMissChance)==0) - { - // missed - bStrike = TRUE; - break; - } - else - { - HitBall(6+nswing); - return; - } - default: - // strike - bStrike = TRUE; - break; + if(nPitchIndex <= 8) { + if(Baseball_GetInputHIT(NULL)) { + if((nPitchIndex >= 5) && (nPitchIndex <= 7) && (Platform_Random(nMissChance) != 0)) { + fsm = HitBall(); } - } - - if (!bStrike) { - int nDelay = ((nPitchSpeed * 4) / 3) - tu; - - if(nDelay > 0) - Platform_Pause(nDelay); - nswing++; - if(nswing == 3) { - nPitchIndex++; - nswing = 0; + else { + bStrike = TRUE; + nPitchIndex = 9; } } else { - nPitchIndex = 9; + if(--nSwingSlot <= 0) { + nSwingSlot = nPitchSpeed; + ++nPitchIndex; + } } } - - if(nPitchIndex >= 9) { - Platform_Pause(200); - + else { // if player didn't swing, randomly pick strike or ball - if (Platform_Random(2) && !bStrike) - { + if (Platform_Random(2) && !bStrike) { ++nBalls; } - else - { + else { ++nStrikes; } - if (nBalls == 4) - { + if (nBalls == 4) { // walk Baseball_DrawStats(-1, -1, nBalls, nStrikes, bHomeTeam); - Baseball_PlaySound(BASEBALL_SOUND_STRIKE, PLAYSOUNDFLAGS_PRIORITY); - nTimerEndPlayWait = 1500/50; - nTimerRunnerMove = nRunnerSpeed = 10; // walk is always a set speed + Baseball_PlaySound(BASEBALL_SOUND_STRIKE, PLAYSOUNDFLAGS_PRIORITY|PLAYSOUNDFLAGS_ASYNC); + nTimerRunnerMove = nRunnerSpeed = 2 * SPEED_BASE; // walk is always a fixed speed InsertRunner(); fsm = FSM_WALK; } - else if (nStrikes == 3) - { + else if (nStrikes == 3) { // struck out - DoOut(); + fsm = FSM_GOOUT; } - else - { + else { Baseball_DrawStats(-1, -1, nBalls, nStrikes, bHomeTeam); - Baseball_PlaySound(BASEBALL_SOUND_STRIKE, PLAYSOUNDFLAGS_PRIORITY); - nTimerEndPlayWait = 1500/50; + Baseball_PlaySound(BASEBALL_SOUND_STRIKE, PLAYSOUNDFLAGS_PRIORITY|PLAYSOUNDFLAGS_ASYNC); + nTimerEndPlayWait = 1500; fsm = FSM_ENDPLAYWAIT; } } + + if(nPitchIndex <= 8) + nBallBlip = (bCurveball) ? CURVE_BALL(nPitchIndex) : NORMAL_BALL(nPitchIndex); } static void fsmEndPlayWait(int tu) { - if (nTimerEndPlayWait > 0) - { - --nTimerEndPlayWait; - if (nDefenseBlip != -1) - { - // blink fielder if one caught a ball - if (bCaught) - { - static BOOL blink=FALSE; - static int blinkcnt=0; - --blinkcnt; - if (blinkcnt<0) - { - blinkcnt=2; - blink=!blink; - } - if (blink) - { - DrawDefenseBlip(nDefenseBlip); - } - else - { - DrawDefenseBlip(-1); - } - } - else - { - DrawDefenseBlip(nDefenseBlip); - } - } + static int delay = 0; + + if(delay == 0) { + delay = 1000 * nTimerEndPlayWait; + Baseball_Clock(1); } - else - { - // erase the old blips - Baseball_DrawPitchBlip(FALSE, nEraseIndex, bCurveball); - DrawDefenseBlip(-1); - ErasePitchBlips(); - + else if(Baseball_Clock(0) >= delay) { + delay = 0; // reset the runners ResetOffBaseRunners(); - DrawBaseBlips(FALSE); - fsm = FSM_IDLE; } } static void fsmRun(int tu) { - DrawBaseBlips(TRUE); - // RUN does not take effect until you release HIT - if (Baseball_GetInputRUN(NULL) && !Baseball_GetInputHIT(NULL)) - { - if (nTimerRunnerMove > 0) - { - --nTimerRunnerMove; - } - if (nTimerRunnerMove == 0) - { - nTimerRunnerMove = nRunnerSpeed; - if (MoveRunners()) - { - // record runs - if (bHomeTeam) - { - ++nHRuns; - } - else - { - ++nVRuns; - } - // also note the run for later (for the sounds) - ++nPendingRuns; - } - } + if (Baseball_GetInputRUN(NULL) && !Baseball_GetInputHIT(NULL)) { + run(); } - if (nTimerFielding > 0) - { - --nTimerFielding; - } - if (nTimerFielding == 0) - { + if (--nTimerFielding <= 0) { // ball is finished being fielded - // erase the fielder's blip -// nDefenseBlip = -1; -// DrawDefenseBlip(-1); - // ball has been fielded - see if any runners are off base BOOL bOffBase = FALSE; - for (int i=0; i 0) - { - --nTimerRunnerMove; - } - if (nTimerRunnerMove == 0) - { - nTimerRunnerMove = nRunnerSpeed; - if (MoveRunners()) - { - // record runs - if (bHomeTeam) - { - ++nHRuns; - } - else - { - ++nVRuns; - } - // also note the run for later (for the sounds) - ++nPendingRuns; - } - + if (Baseball_GetInputRUN(NULL)) { + if(run() == TRUE) { // when the current runner gets on first, we're done - if (runners[nCurrentRunnerIndex].baseindex == FIRSTBASE) - { + if (runners[nCurrentRunnerIndex].baseindex == FIRSTBASE) { // got someone on first - all done nStrikes = 0; nBalls = 0; - Baseball_DrawPitchBlip(FALSE, 8, FALSE); - DrawDefenseBlip(-1); - ErasePitchBlips(); - fsm = FSM_IDLE; + nTimerEndPlayWait = 1500; + fsm = FSM_ENDPLAYWAIT; } } } @@ -1061,139 +829,14 @@ static void fsmHomeRun(int tu) { static int loop = 0; - trace = fireWorks; if(fireWorks > 0) { // // do fireworks display - // - Platform_Pause(40); - ClearAllDisplay(); + // - switch(fireWorks) { - case 1: // base and fielder blips + if(fireWorks == 1) Baseball_PlaySound(BASEBALL_SOUND_RUN, PLAYSOUNDFLAGS_PRIORITY|PLAYSOUNDFLAGS_ASYNC); - Baseball_DrawBaseBlip(TRUE,1); - break; - case 2: - Baseball_DrawBaseBlip(TRUE,1); - Baseball_DrawBaseBlip(TRUE,2); - break; - case 3: - Baseball_DrawBaseBlip(TRUE,1); - Baseball_DrawBaseBlip(TRUE,2); - Baseball_DrawDeepBlip(TRUE,0); - break; - case 4: - Baseball_DrawBaseBlip(TRUE,2); - Baseball_DrawDeepBlip(TRUE,0); - Baseball_DrawBaseBlip(TRUE,4); - break; - case 5: - Baseball_DrawDeepBlip(TRUE,0); - Baseball_DrawBaseBlip(TRUE,4); - Baseball_DrawBaseBlip(TRUE,5); - break; - case 6: - Baseball_DrawBaseBlip(TRUE,4); - Baseball_DrawBaseBlip(TRUE,5); - Baseball_DrawDeepBlip(TRUE,1); - break; - case 7: - Baseball_DrawBaseBlip(TRUE,5); - Baseball_DrawDeepBlip(TRUE,1); - Baseball_DrawBaseBlip(TRUE,8); - break; - case 8: - Baseball_DrawDeepBlip(TRUE,1); - Baseball_DrawBaseBlip(TRUE,8); - Baseball_DrawBaseBlip(TRUE,7); - break; - case 9: - Baseball_DrawBaseBlip(TRUE,8); - Baseball_DrawBaseBlip(TRUE,7); - Baseball_DrawOutfieldBlip(TRUE,0); - break; - case 10: - Baseball_DrawBaseBlip(TRUE,7); - Baseball_DrawOutfieldBlip(TRUE,0); - Baseball_DrawOutfieldBlip(TRUE,1); - break; - case 11: - Baseball_DrawOutfieldBlip(TRUE,0); - Baseball_DrawOutfieldBlip(TRUE,1); - Baseball_DrawFireWorks(); - break; - case 12: - Baseball_DrawOutfieldBlip(TRUE,1); - Baseball_DrawFireWorks(); - Baseball_DrawBaseBlip(TRUE,10); - break; - case 13: - Baseball_DrawFireWorks(); - Baseball_DrawBaseBlip(TRUE,10); - Baseball_DrawBaseBlip(TRUE,11); - break; - case 14: - Baseball_DrawBaseBlip(TRUE,10); - Baseball_DrawBaseBlip(TRUE,11); - Baseball_DrawPitchBlip(TRUE, 8, FALSE); - break; - case 15: - Baseball_DrawPitchBlip(TRUE, 8, FALSE); - Baseball_DrawPitchBlip(TRUE, 7, FALSE); - break; - case 16: - Baseball_DrawPitchBlip(TRUE, 8, FALSE); - Baseball_DrawPitchBlip(TRUE, 7, FALSE); - Baseball_DrawPitchBlip(TRUE, 6, FALSE); - break; - case 17: - Baseball_DrawPitchBlip(TRUE, 7, FALSE); - Baseball_DrawPitchBlip(TRUE, 6, FALSE); - Baseball_DrawPitchBlip(TRUE, 5, FALSE); - break; - case 18: - Baseball_DrawPitchBlip(TRUE, 6, FALSE); - Baseball_DrawPitchBlip(TRUE, 5, FALSE); - Baseball_DrawPitchBlip(TRUE, 4, TRUE); - break; - case 19: - Baseball_DrawPitchBlip(TRUE, 5, FALSE); - Baseball_DrawPitchBlip(TRUE, 3, TRUE); - Baseball_DrawPitchBlip(TRUE, 2, TRUE); - break; - case 20: - Baseball_DrawPitchBlip(TRUE, 3, TRUE); - Baseball_DrawPitchBlip(TRUE, 2, TRUE); - Baseball_DrawPitchBlip(TRUE, 1, TRUE); - break; - case 21: - Baseball_DrawPitchBlip(TRUE, 2, TRUE); - Baseball_DrawPitchBlip(TRUE, 1, TRUE); - Baseball_DrawPitchBlip(TRUE, 1, FALSE); - break; - case 22: - Baseball_DrawPitchBlip(TRUE, 1, TRUE); - Baseball_DrawPitchBlip(TRUE, 1, FALSE); - Baseball_DrawPitchBlip(TRUE, 2, FALSE); - break; - case 23: - Baseball_DrawPitchBlip(TRUE, 1, FALSE); - Baseball_DrawPitchBlip(TRUE, 2, FALSE); - Baseball_DrawPitchBlip(TRUE, 3, FALSE); - break; - case 24: - Baseball_DrawPitchBlip(TRUE, 2, FALSE); - Baseball_DrawPitchBlip(TRUE, 3, FALSE); - Baseball_DrawPitchBlip(TRUE, 4, FALSE); - break; - case 25: - Baseball_DrawPitchBlip(TRUE, 3, FALSE); - Baseball_DrawPitchBlip(TRUE, 4, FALSE); - break; - case 26: - break; - } + Platform_Pause(40); fireWorks++; if(fireWorks > 26) { @@ -1203,7 +846,7 @@ static void fsmHomeRun(int tu) fireWorks = 0; // insert a runner InsertRunner(); - nTimerRunnerMove = nRunnerSpeed = 10; // fixed run speed + nTimerRunnerMove = nRunnerSpeed = 2 * SPEED_BASE; // fixed run speed } else { fireWorks = 1; @@ -1212,55 +855,22 @@ static void fsmHomeRun(int tu) return; } - DrawBaseBlips(TRUE); - - Baseball_DrawBaseBlip(TRUE, 0); - - if (Baseball_GetInputRUN(NULL)) - { - if (nTimerRunnerMove > 0) - { - --nTimerRunnerMove; - } - if (nTimerRunnerMove == 0) - { - nTimerRunnerMove = nRunnerSpeed; - if (MoveRunners()) - { - // record runs - if (bHomeTeam) - { - ++nHRuns; - } - else - { - ++nVRuns; - } - // also note the run for later (for the sounds) - ++nPendingRuns; - - // see if anyone is still running the bases - BOOL bManOnBase = FALSE; - for (int i=0; i #include "Platform.h" #include "Platform_Baseball.h" @@ -47,15 +47,10 @@ Website : http://www.peterhirschberg.com #define BASEBALL_SOUND_STRIKE 3 #define BASEBALL_SOUND_ENDPOSSESSION 4 #define BASEBALL_SOUND_ENDGAME 5 +#define BASEBALL_SOUND_NSOUNDS 6 - -void Baseball_Run(); -void Baseball_SetSkill(int i); -int Baseball_GetSkill(); -void Baseball_PowerOn(); -void Baseball_PowerOff(); -int Baseball_GetPower(); - +void Baseball_Run(int tu); +void Baseball_Debug(int f); #endif diff --git a/source/game/Basketball.c b/source/game/Basketball.c index 115623d..3f9cf02 100644 --- a/source/game/Basketball.c +++ b/source/game/Basketball.c @@ -131,7 +131,6 @@ static PLAYER defense[NUM_DEFENSEPLAYERS]; p.nColumn++; \ } -static BOOL ISBALL(int x, int y); static BOOL ISBALL(int x, int y) { if ((ball.nColumn == x) @@ -142,7 +141,6 @@ static BOOL ISBALL(int x, int y) return FALSE; } -static BOOL ISPLAYER(int x, int y); static BOOL ISPLAYER(int x, int y) { if ((player.nColumn == x) @@ -153,7 +151,6 @@ static BOOL ISPLAYER(int x, int y) return FALSE; } -static BOOL ISDEFENSE(int x, int y); static BOOL ISDEFENSE(int x, int y) { for (int i=0; i. + */ + +#include "Basketball2.h" +#include "Games.h" + +// constants + +#define GAMETIME 12.0 +#define OVERTIME 5.0 +#define PLAYTIME 24 +#define PLAYTIME2 14 +#define NUM_DEFENSEPLAYERS 5 + +#define TIME_TICKTIMER 10 + +#define TIME_STATSDISPLAY 5 +#define TIME_BALLMOVE 5 +#define TIME_WAITPASSAGE (10 * (4 - nLevel + 1)) +#define TIME_DEFLECT 2 + +#define DMODE_MAN 0 +#define DMODE_ZONE 1 +#define DMODE_PRESS 2 + +typedef struct { + int state; + const int value; +} BLIP; + +static BLIP Blips[BASKETBALL2_BLIP_COLUMNS][BASKETBALL2_BLIP_ROWS] = { + { {0, 3}, {0, 0}, {0, 0}, {0, 3}, {0, 0} }, + { {0, 2}, {0, 0}, {0, 2}, {0, 0}, {0, 0} }, + { {0, 2}, {0, 2}, {0, 0}, {0, 0}, {0, 0} }, + { {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 3} }, + { {0, 2}, {0, 2}, {0, 0}, {0, 0}, {0, 0} }, + { {0, 2}, {0, 0}, {0, 2}, {0, 0}, {0, 0} }, + { {0, 3}, {0, 0}, {0, 0}, {0, 3}, {0, 0} } +}; + +// game variables +static BOOL bGameOver; +static BOOL bHomeTeam; +static BOOL bInFrame = FALSE; +static BOOL bPower; +static int nLevel = -1; +static int nPoints; + +static int nHScore; +static int nVScore; +static float fGameTime; +static int nPlayTime; +static int nQuarter; +static int nTimerTickTimer; +static int n3secTime; +static int nFreeShoot; + +static BOOL bShoot; +static BOOL bPass; +static BOOL bPassed; +static BOOL bInPass; +static BOOL bFoul; +static int nBallDirectionX; +static int nBallDirectionY; +static int nTimerBallMove; +static int nDefenseMode = -1; + +static BOOL bDeflect; +static BOOL nTimerDeflect; + +static int nStatsIndex; +static int nTimerStatsDisplay; + +typedef struct { + int nColumn; + int nRow; + int nBright; + int nColumnOld; + int nRowOld; + int nMoveNow; +}PLAYER; + +static PLAYER ball; +static PLAYER player; +static PLAYER receiver; +static PLAYER defense[NUM_DEFENSEPLAYERS]; + +typedef struct { + int min_x; + int min_y; + int max_x; + int max_y; +} ZONE; + +// macros for dealing with the players + +#define SETPLAYERBRIGHTNESS(p,b) { \ + p.nBright = b; \ +} + +#define NOTECURRENTPLAYERPOSITION(p) { \ + p.nColumnOld = p.nColumn; \ + p.nRowOld = p.nRow; \ +} + +#define SETPLAYER(p,x,y,b) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nColumn = x; \ + p.nRow = y; \ + p.nBright = b; \ +} + +#define UNSETPLAYER(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nBright = BLIP_OFF; \ +} + +#define MOVEPLAYERUP(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nRow--; \ +} +#define MOVEPLAYERDOWN(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nRow++; \ +} +#define MOVEPLAYERLEFT(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nColumn--; \ +} +#define MOVEPLAYERLEFTUP(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nColumn--; \ + p.nRow--;\ +} +#define MOVEPLAYERLEFTDOWN(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nColumn--; \ + p.nRow++; \ +} +#define MOVEPLAYERRIGHT(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nColumn++; \ +} +#define MOVEPLAYERRIGHTUP(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nColumn++; \ + p.nRow--; \ +} +#define MOVEPLAYERRIGHTDOWN(p) { \ + NOTECURRENTPLAYERPOSITION(p); \ + p.nColumn++; \ + p.nRow++; \ +} + +#define IN_ZONE(x, y, z) \ + ((x >= z->min_x && x <= z->max_x) && (y >= z->min_y && ny <= z->max_y)) + +#define IS_SHOOT_POSITION(x,y) ((Blips[x][y].value >= 2) ? 1 : 0) + +#define IS_3SEC_ZONE(x,y) ((x >= 2 && x <= 4) && (y >= 0 && y <= 2)) + +static BOOL ISPLAYER(int x, int y) +{ + if ((player.nColumn == x) + && (player.nRow == y) + && (player.nBright)){ + return TRUE; + } + return FALSE; +} + +static BOOL ISRECEIVER(int x, int y) +{ + if ((receiver.nColumn == x) + && (receiver.nRow == y) + && (receiver.nBright)){ + return TRUE; + } + return FALSE; +} + +static BOOL ISDEFENSE(int x, int y) +{ + for (int i=0; i dx && sx > 0) + x--; + else if(sx < dx && sx < BASKETBALL2_BLIP_COLUMNS-1) + x++; + } + + if(sy != dy) { + if(sy > dy && sy > 0) + y--; + else if(sy < dy && sy < BASKETBALL2_BLIP_ROWS-1) + y++; + } + + if(x != 0 || y != 0) { + if (ISPLAYER(sx+x,sy+y) && IS_SHOOT_POSITION(sx+x,sx+y)){ + if(y > 0) + y = 0; + } + if(ISOCCUPIED(sx+x,sy+y)) { + if(!ISOCCUPIED(sx,sy+y)) + x = 0; + else if (!ISOCCUPIED(sx+x,sy)) + y = 0; + else { + x = 0; + y = 0; + } + } + *nx = sx + x; + *ny = sy + y; + if(x == 0 && y == 0) + return FALSE; + return TRUE; + } + + *nx = sx; + *ny = sy; + return FALSE; +} + +static BOOL ISAGOODPASS() +{ + int x, y; + + x = player.nColumn + nBallDirectionX; + y = player.nRow + nBallDirectionY; + + if(nBallDirectionX == 0) { + while(y != receiver.nRow) { + y += nBallDirectionY; + if(ISDEFENSE(x,y)) { + return 0; + } + } + return 1; + } + if(nBallDirectionY == 0) { + while(x != receiver.nColumn) { + x += nBallDirectionX; + if(ISDEFENSE(x,y)) { + return 0; + } + } + return 1; + } + + while(x != receiver.nColumn && y != receiver.nRow) { + x += nBallDirectionX; + y += nBallDirectionY; + if(ISDEFENSE(x,y)) { + return 0; + } + } + + return 1; +} + +static BOOL probability(int value) +{ + int rtn; + + rtn = (Platform_Random(100) <= ((value/4 * (nLevel + 1)) - Platform_Random(4 - nLevel))) ? TRUE : FALSE; + + return rtn; +} + +static BOOL ISFOUL() +{ + int v = 0; + int d = 0; + + if(ISDEFENSE(player.nColumn,player.nRow-1)) + d++; + else if(ISDEFENSE(player.nColumn,player.nRow+1)) + d++; + else if(ISDEFENSE(player.nColumn-1,player.nRow)) + d++; + else if(ISDEFENSE(player.nColumn+1,player.nRow)) + d++; + + if(d == 0) + return FALSE; + + if((player.nRow == 0) && (player.nColumn == 3)) + v = 80; + else if((player.nRow >= 0 && player.nRow <= 1) && (player.nColumn >= 2 && player.nColumn <= 4)) + v = 40; + else if((player.nRow >= 0 && player.nRow <= 2) && (player.nColumn >= 1 && player.nColumn <= 5)) + v = 20; + else if(player.nRow >= 0 && player.nRow <= 3) + v = 10; + + if(v == 0) + return FALSE; + + if(probability(v)) + return TRUE; + + return FALSE; +} + +static void freethrow_scheme() +{ + SETPLAYER(receiver, ((bHomeTeam) ? 1 : 5), 1, BLIP_DIMBLINK); + SETPLAYER(player, 3, 3, BLIP_BRIGHT); + UNSETPLAYER(ball); + SETPLAYER(defense[0], 1, 0, BLIP_DIM); + SETPLAYER(defense[1], ((bHomeTeam) ? 5 : 1), 1, BLIP_DIM); + SETPLAYER(defense[2], 5, 0, BLIP_DIM); + SETPLAYER(defense[3], 1, 2, BLIP_DIM); + SETPLAYER(defense[4], 5, 2, BLIP_DIM); +} + +static void show_formation() +{ + int i; + + SETPLAYER(receiver, ((bHomeTeam) ? 6 : 0), 4, BLIP_DIMBLINK); + SETPLAYER(player, 3, 4, BLIP_BRIGHT); + UNSETPLAYER(ball); + SETPLAYER(defense[0], 2, 0, BLIP_DIM); + SETPLAYER(defense[1], 4, 0, BLIP_DIM); + SETPLAYER(defense[2], 1, 2, BLIP_DIM); + SETPLAYER(defense[3], 5, 2, BLIP_DIM); + SETPLAYER(defense[4], 3, 3, BLIP_DIM); + + for (i=0; i BASKETBALL2_BLIP_COLUMNS-1) \ + || (p.nColumn < 0) \ + || (p.nRow > BASKETBALL2_BLIP_ROWS-1) \ + || (p.nRow < 0)) + + +#define ISPLAYERENABLED(p) \ + (p.nBright) + +// finite state machine stuff + +static void fsmPlayStartWait(); +static void fsmShowStats(); +static void fsmDefenseWait(); +static void fsmInPlay(); +static void fsmDunk(); +static void fsmGameOver(); +static void fsmFreeThrow(); +static void fsmFoul(); + +static enum FSM { + FSM_PLAYSTARTWAIT=0, + FSM_SHOWSTATS, + FSM_DEFENSEWAIT, + FSM_INPLAY, + FSM_DUNK, + FSM_GAMEOVER, + FSM_FREETHROW, + FSM_FOUL +}fsm; + +typedef void (*FSMFCN)(); + +static FSMFCN fsmfcn[] = { + fsmPlayStartWait, + fsmShowStats, + fsmDefenseWait, + fsmInPlay, + fsmDunk, + fsmGameOver, + fsmFreeThrow, + fsmFoul +}; + +static void InitGame() +{ + bHomeTeam = FALSE; + PlatformSetInput(bHomeTeam); + + nHScore = 0; + nVScore = 0; + fGameTime = GAMETIME; + nQuarter = 0; + bGameOver = FALSE; + bDeflect = FALSE; + + fsm = FSM_DEFENSEWAIT; +} + +static void DrawBlips() +{ + int x, y, nBright; + static BOOL bBlink = FALSE; + + if(fsm != FSM_DUNK) { + for (int i=0; i 0) && (player.nRow > 0) + && (!ISOCCUPIED(player.nColumn-1, player.nRow-1))){ + MOVEPLAYERLEFTUP(player); + } + } + } + else if (Basketball2_GetInputLEFTDOWN(&bChange)) { + if (bChange) + { + if ((player.nColumn > 0) && (player.nRow < (BASKETBALL2_BLIP_ROWS-1)) + && (!ISOCCUPIED(player.nColumn-1, player.nRow+1))){ + MOVEPLAYERLEFTDOWN(player); + } + } + } + else if (Basketball2_GetInputRIGHTUP(&bChange)) { + if (bChange) + { + if ((player.nColumn < (BASKETBALL2_BLIP_COLUMNS-1)) && (player.nRow > 0) + && (!ISOCCUPIED(player.nColumn+1, player.nRow-1))){ + MOVEPLAYERRIGHTUP(player); + } + } + } + else if (Basketball2_GetInputRIGHTDOWN(&bChange)) { + if (bChange) + { + if ((player.nColumn < (BASKETBALL2_BLIP_COLUMNS-1)) && (player.nRow < (BASKETBALL2_BLIP_ROWS-1)) + && (!ISOCCUPIED(player.nColumn+1, player.nRow+1))){ + MOVEPLAYERRIGHTDOWN(player); + } + } + } + else if (Basketball2_GetInputLEFT(&bChange)) + { + if (bChange) + { + if ((player.nColumn > 0) + && (!ISOCCUPIED(player.nColumn-1, player.nRow))){ + MOVEPLAYERLEFT(player); + } + } + } + else if (Basketball2_GetInputRIGHT(&bChange)) + { + if (bChange) + { + if ((player.nColumn < (BASKETBALL2_BLIP_COLUMNS-1)) + && (!ISOCCUPIED(player.nColumn+1, player.nRow))){ + MOVEPLAYERRIGHT(player); + } + } + } + else if (Basketball2_GetInputUP(&bChange)) + { + if (bChange) + { + if ((player.nRow > 0) + && (!ISOCCUPIED(player.nColumn, player.nRow-1))){ + MOVEPLAYERUP(player); + } + } + } + else if (Basketball2_GetInputDOWN(&bChange)) + { + if (bChange) + { + if ((player.nRow < (BASKETBALL2_BLIP_ROWS-1)) + && (!ISOCCUPIED(player.nColumn, player.nRow+1))){ + MOVEPLAYERDOWN(player); + } + } + } + + if (nTimerDeflect) + { + // still in deflect + --nTimerDeflect; + return; + } + + if (Basketball2_GetInputSHOOT(&bChange)) + { + if (bChange) + { + if (!ISPLAYERENABLED(ball)) + { + // shoot! + bShoot = TRUE; + bPassed = FALSE; + bInPass = FALSE; + nTimerBallMove = TIME_BALLMOVE; + SETPLAYERBRIGHTNESS(player, BLIP_DIMBLINK); + SETPLAYER(ball, player.nColumn, player.nRow, BLIP_BRIGHT); + nPoints = Blips[player.nColumn][player.nRow].value; + + if (player.nRow > 0) + nBallDirectionY = -1; + else + nBallDirectionY = 0; + + if (player.nColumn < 3) + nBallDirectionX = 1; + else if(player.nColumn > 3) + nBallDirectionX = -1; + else // player.nColumn == 3 + nBallDirectionX = 0; + + bFoul = ISFOUL(); + } + } + } + + if (Basketball2_GetInputPASS(&bChange)) + { + if (bChange) + { + if (!ISPLAYERENABLED(ball)) + { + int x, y; + + // Pass! + bPass = TRUE; + bInPass = TRUE; + nTimerBallMove = TIME_BALLMOVE; + SETPLAYERBRIGHTNESS(player, BLIP_DIMBLINK); + SETPLAYER(ball, player.nColumn, player.nRow, BLIP_BRIGHT); + + y = player.nRow - receiver.nRow; + x = player.nColumn - receiver.nColumn; + + if(x > 0) + nBallDirectionX = -1; + else if(x < 0) + nBallDirectionX = 1; + else + nBallDirectionX = 0; + + if(y > 0) + nBallDirectionY = -1; + else if(y < 0) + nBallDirectionY = 1; + else + nBallDirectionY = 0; + + bPassed = ISAGOODPASS(); + } + } + } + // move the receiver + moveReceiver(); + + // move defenders + switch(nDefenseMode) { + case DMODE_MAN: + manDefense(); + break; + case DMODE_ZONE: + zoneDefense(); + break; + case DMODE_PRESS: + pressDefense(); + break; + } + + // move the ball + if (ISPLAYERENABLED(ball)) + { + n3secTime = -1; + + // the puck hit a defender last frame - play the sound + if (ISDEFENSE(ball.nColumn, ball.nRow) && !bDeflect && !bPassed) + { + bDeflect = TRUE; + Basketball2_PlaySound(BASKETBALL2_SOUND_BOUNCE, PLAYSOUNDFLAGS_PRIORITY); + nTimerDeflect = TIME_DEFLECT; + return; + } + + if (--nTimerBallMove <= 0) + { + nTimerBallMove = TIME_BALLMOVE; + if (bFoul) { + Basketball2_PlaySound(BASKETBALL2_SOUND_FOUL, PLAYSOUNDFLAGS_PRIORITY); + } + + // check for a basket + if ((ball.nColumn == 3) && (ball.nRow == 0) && !bInPass + && !ISDEFENSE(ball.nColumn, ball.nRow)) // <-- is this right? + { + // basket! + nFreeShoot = (bFoul) ? 1 : 0; + ball.nRow = -1; + Basketball2_DrawBasket(TRUE); + fsm = FSM_DUNK; + return; + } + + // check the foul + if (bFoul) { + nFreeShoot = nPoints; + fsm = FSM_FOUL; + return; + } + + // bounce the ball off the far wall + if (!ISDEFENSE(ball.nColumn, ball.nRow) && !ISRECEIVER(ball.nColumn, ball.nRow)) + { + if ((ball.nRow <= 0) && (ball.nColumn >= 2 && ball.nColumn <= 4) && (nBallDirectionY == -1)) + { + ball.nRow = 0; + nBallDirectionY = 1; + Basketball2_PlaySound(BASKETBALL2_SOUND_BOUNCE, PLAYSOUNDFLAGS_PRIORITY); + nTimerDeflect = TIME_DEFLECT; + bDeflect = FALSE; + return; + } + } + + // bounce the ball off the defenders + if (bDeflect) + { + nBallDirectionX = Platform_Random(3) - 1; + nBallDirectionY = 1; + bDeflect = FALSE; + } + + // see if player has regained possession + if (ISPLAYER(ball.nColumn, ball.nRow) && !bShoot && !bPass) + { + UNSETPLAYER(ball); + SETPLAYERBRIGHTNESS(player, BLIP_BRIGHT); + } + else if (ISRECEIVER(ball.nColumn, ball.nRow)) { + PLAYER tmp; + + bPassed = FALSE; + UNSETPLAYER(ball); + tmp = player; + player = receiver; + receiver = tmp; + SETPLAYERBRIGHTNESS(player, BLIP_BRIGHT); + } + else + { + // move the ball + ball.nColumn += nBallDirectionX; + ball.nRow += nBallDirectionY; + bShoot = FALSE; + bPass = FALSE; + + // see if the ball bounced off the screen + if (ISPLAYEROFFSCREEN(ball) && ISPLAYERENABLED(ball)) + { + // off the screen - get rid of it and end the play + UNSETPLAYER(ball); + SETPLAYERBRIGHTNESS(player, BLIP_BRIGHT); + Basketball2_ClearScreen(); + Basketball2_PlaySound(BASKETBALL2_SOUND_ENDPLAY, PLAYSOUNDFLAGS_PRIORITY); + bHomeTeam = !bHomeTeam; + PlatformSetInput(bHomeTeam); + nStatsIndex = 0; + nTimerStatsDisplay = TIME_STATSDISPLAY; + fsm = FSM_SHOWSTATS; + return; + } + } + } + } + + // 3sec time rule + if(IS_3SEC_ZONE(player.nColumn, player.nRow) && !ISPLAYERENABLED(ball)) { + if(n3secTime == -1) + n3secTime = 3; + } + else + n3secTime = -1; + + // count down the clock + if (Platform_IsNewSecond()){ + // check for end of quarter + if (fGameTime > 0.0){ + fGameTime -= (float).1; + if (fGameTime < 0.1){ + + // end of quarter + ++nQuarter; + + // Overtime needed if nHScore == nVScore + if ((nQuarter >= 4) && (nHScore != nVScore)) + { + // game over + bGameOver = TRUE; + + show_formation(); + + Basketball2_ClearScreen(); + Basketball2_PlaySound(BASKETBALL2_SOUND_ENDGAME, PLAYSOUNDFLAGS_PRIORITY); + nStatsIndex = 0; + nTimerStatsDisplay = TIME_STATSDISPLAY; + fsm = FSM_SHOWSTATS; + return; + } + + bHomeTeam = (nQuarter % 2) ? FALSE : TRUE; + PlatformSetInput(bHomeTeam); + + fGameTime = (nQuarter < 4) ? GAMETIME : OVERTIME; + Basketball2_ClearScreen(); + if(fGameTime == GAMETIME) + Basketball2_PlaySound(BASKETBALL2_SOUND_ENDQUARTER, PLAYSOUNDFLAGS_PRIORITY); + else + Basketball2_PlaySound(BASKETBALL2_SOUND_OVERTIME, PLAYSOUNDFLAGS_PRIORITY); + nStatsIndex = 0; + nTimerStatsDisplay = TIME_STATSDISPLAY; + fsm = FSM_SHOWSTATS; + return; + } + } + // check for 3sec time + if(n3secTime != -1) { + n3secTime--; + if(n3secTime == 0) { + Basketball2_ClearScreen(); + Basketball2_PlaySound(BASKETBALL2_SOUND_3SECS, PLAYSOUNDFLAGS_PRIORITY); + bHomeTeam = !bHomeTeam; + PlatformSetInput(bHomeTeam); + nStatsIndex = 0; + nTimerStatsDisplay = TIME_STATSDISPLAY; + fsm = FSM_SHOWSTATS; + return; + } + } + + // check for end of play timer + if (--nPlayTime < 0){ + Basketball2_ClearScreen(); + Basketball2_PlaySound(BASKETBALL2_SOUND_ENDPLAY, PLAYSOUNDFLAGS_PRIORITY); + bHomeTeam = !bHomeTeam; + PlatformSetInput(bHomeTeam); + nStatsIndex = 0; + nTimerStatsDisplay = TIME_STATSDISPLAY; + fsm = FSM_SHOWSTATS; + return; + } + } + + Basketball2_DrawStat(nPlayTime); + + // make tick sounds + if (fGameTime >= .1){ + if (--nTimerTickTimer <= 0){ + Basketball2_PlaySound(BASKETBALL2_SOUND_TICK, PLAYSOUNDFLAGS_ASYNC); + nTimerTickTimer = TIME_TICKTIMER; + } + } +} + +static void fsmDunk() +{ + switch(nPoints) { + case 1: + Basketball2_PlaySound(BASKETBALL2_SOUND_FREETHROW, PLAYSOUNDFLAGS_PRIORITY); + break; + case 3: + Basketball2_PlaySound(BASKETBALL2_SOUND_SCORE3, PLAYSOUNDFLAGS_PRIORITY); + break; + default: + Basketball2_PlaySound(BASKETBALL2_SOUND_SCORE, PLAYSOUNDFLAGS_PRIORITY); + break; + } + Basketball2_DrawBasket(FALSE); + if (bHomeTeam) + nHScore += nPoints; + else + nVScore += nPoints; + + if(!bFoul) { + show_formation(); + Platform_IsNewSecond(); + fsm = FSM_INPLAY; + } + else { + fsm = FSM_FOUL; + } +} + +static void fsmFoul() +{ + Basketball2_ClearScreen(); + freethrow_scheme(); + fsm = FSM_FREETHROW; +} + +static void fsmFreeThrow() +{ + BOOL bChange; + if (Basketball2_GetInputSHOOT(&bChange)) { + if (bChange) { + nFreeShoot--; + nTimerBallMove = TIME_BALLMOVE; + SETPLAYERBRIGHTNESS(player, BLIP_DIMBLINK); + SETPLAYER(ball, player.nColumn, player.nRow, BLIP_BRIGHT); + } + } + + if (--nTimerBallMove <= 0) { + nTimerBallMove = TIME_BALLMOVE; + + // check for a basket + if (ball.nRow == 0) { + if(nFreeShoot == 0) + bFoul = 0; + // basket! + if(probability(100)) { + nPoints = 1; + ball.nRow = -1; + Basketball2_DrawBasket(TRUE); + fsm = FSM_DUNK; + } + else { + ball.nRow = 1; + nBallDirectionY = 1; + nBallDirectionX = Platform_Random(3) - 1; + Basketball2_PlaySound(BASKETBALL2_SOUND_BOUNCE, PLAYSOUNDFLAGS_PRIORITY); + nTimerDeflect = TIME_DEFLECT; + bDeflect = FALSE; + nPlayTime = PLAYTIME2; + Platform_IsNewSecond(); + fsm = FSM_INPLAY; + } + return; + } + // move the ball + ball.nRow -= 1; + } +} + +static void fsmGameOver() +{ + // show stats if pressed 'down' + BOOL bChange; + if (Basketball2_GetInputDOWN(&bChange)) + { + if (bChange) + { + nStatsIndex = 0; + nTimerStatsDisplay = TIME_STATSDISPLAY; + fsm = FSM_SHOWSTATS; + fsmShowStats(); + return; + } + } + + Basketball2_DrawStat(0); +} + +void Basketball2_Debug(int f) +{ + +} diff --git a/source/game/Basketball2.h b/source/game/Basketball2.h new file mode 100644 index 0000000..9fde46d --- /dev/null +++ b/source/game/Basketball2.h @@ -0,0 +1,55 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __BASKETBALL2_H__ +#define __BASKETBALL2_H__ + +#include "Platform.h" +#include "Platform_Basketball2.h" + +#define BASKETBALL2_BLIP_ROWS 5 +#define BASKETBALL2_BLIP_COLUMNS 7 + +#define BASKETBALL2_SOUND_TICK 0 +#define BASKETBALL2_SOUND_BOUNCE 1 +#define BASKETBALL2_SOUND_SCORE 2 // Four-note fanfare +#define BASKETBALL2_SOUND_ENDPLAY 3 // Two whistles +#define BASKETBALL2_SOUND_ENDQUARTER 4 // Buzzer +#define BASKETBALL2_SOUND_ENDGAME 5 // Long buzzer +#define BASKETBALL2_SOUND_SCORE3 6 // Double fanfare +#define BASKETBALL2_SOUND_FOUL 7 // One whistle +#define BASKETBALL2_SOUND_3SECS 8 // Three whistles +#define BASKETBALL2_SOUND_FREETHROW 9 // Two-note fanfare +#define BASKETBALL2_SOUND_OVERTIME 10 // Two buzzers +#define BASKETBALL2_SOUND_NSOUNDS 11 + + +void Basketball2_Run(int tu); +void Basketball2_SetSkill(int i); +int Basketball2_GetSkill(); +void Basketball2_PowerOn(); +void Basketball2_PowerOff(); +BOOL Basketball2_GetPower(); +void Basketball2_Debug(int f); + +#endif + diff --git a/source/game/Football.c b/source/game/Football.c index 7892d9a..d8badfd 100644 --- a/source/game/Football.c +++ b/source/game/Football.c @@ -181,18 +181,6 @@ static PLAYER player[NUM_DEFENSEPLAYERS]; } \ } -static BOOL ISBALL(int x, int y); -static BOOL ISBALL(int x, int y) -{ - if ((ball.nColumn == x) - && (ball.nLane == y) - && (ball.nBright)){ - return TRUE; - } - return FALSE; -} - -static BOOL ISDEFENSE(int x, int y); static BOOL ISDEFENSE(int x, int y) { for (int i=0; i FOOTBALL_BLIP_COLUMNS-1) || (p.nColumn < 0)) - - // finite state machine stuff static void fsmFormation(); @@ -263,12 +236,93 @@ static FSMFCN fsmfcn[] = { fsmGameOver }; +static void InitGame() +{ + bHomeTeam = TRUE; + PlatformSetInput(bHomeTeam); + + nHScore = 0; + nVScore = 0; + fGameTime = 15.0; + nDown = 0; + nQuarter = 0; + nCurrentYardline = 100 - 20; + nFirstDownYard = nCurrentYardline - 10; -// proto's -static void InitGame(); -static void DrawBlips(); -static void EraseBlips(); + bDisplayScore = FALSE; + bDisplayTime = FALSE; + bDisplayYard = FALSE; + bDisplayDown = FALSE; + bDisplayBlips = TRUE; + + fsm = FSM_FORMATION; +} +static void DrawBlips() +{ + int x, y, nBright; + static int nBlinkTimer = 0; + static BOOL bBlink = FALSE; + + for (int i=0; i FOOTBALL2_BLIP_COLUMNS-1) || (p.nColumn < 0)) - // finite state machine stuff static void fsmKickoffWait(); @@ -277,8 +270,11 @@ static void fsmPassing(); static void fsmSafety(); static void fsmPlayEnded(); static void fsmGameOver(); +static void fsmTurnover(); +static void fsmOutPlay(); -static enum FSM { +enum FSM { + FSM_INVALID=-1, FSM_KICKOFFWAIT=0, FSM_KICKOFFCHARGE, FSM_KICKOFFMIDAIR, @@ -290,8 +286,12 @@ static enum FSM { FSM_PASSING, FSM_SAFETY, FSM_PLAYENDED, - FSM_GAMEOVER -}fsm; + FSM_GAMEOVER, + FSM_TURNOVER, + FSM_OUTPLAY +}; + +static enum FSM fsm, nextFsm; typedef void (*FSMFCN)(); @@ -307,16 +307,99 @@ static FSMFCN fsmfcn[] = { fsmPassing, fsmSafety, fsmPlayEnded, - fsmGameOver + fsmGameOver, + fsmTurnover, + fsmOutPlay }; +static void InitGame() +{ + bHomeTeam = FALSE; + PlatformSetInput(bHomeTeam); + + nHScore = 0; + nVScore = 0; + fGameTime = 15.0; + nDown = -1; + nQuarter = 0; + nCurrentYardline = 35; -// proto's -static void InitGame(); -static void DrawBlips(); -static void EraseBlips(); + bDisplayScore = FALSE; + bDisplayTime = TRUE; + bDisplayYard = FALSE; + bDisplayDown = FALSE; + bDisplayBlips = TRUE; + + fsm = FSM_KICKOFFWAIT; +} +static void DrawBlips() +{ + int x, y, nBright; + static BOOL blink = FALSE; + for (int i=0; i= 4) && (!bGotFirstDown)){ - + } + if ((++nDown >= 4) && (!bGotFirstDown)){ // give the ball to the other team - bHomeTeam = !bHomeTeam; - PlatformSetInput(bHomeTeam); nDown = 0; ball.nYard = MAX_YARD - ball.nYard; nFirstDownYard = ball.nYard - 10; - - Football2_PlaySound(FOOTBALL2_SOUND_ENDPOSSESSION, PLAYSOUNDFLAGS_PRIORITY); - fsm = FSM_PLAYENDED; + Football2_PlaySound(FOOTBALL2_SOUND_ENDPOSSESSION, PLAYSOUNDFLAGS_PRIORITY); + nextFsm = FSM_PLAYENDED; + fsm = FSM_TURNOVER; return; - - } else { - Football2_PlaySound(FOOTBALL2_SOUND_ENDPLAY, PLAYSOUNDFLAGS_PRIORITY); - fsm = FSM_PLAYENDED; - return; - } - + } + fsm = FSM_OUTPLAY; return; } // move the defense randomly towards the ball - if (Platform_Random(100) < ((bPro2) ? 25 : 15)){ + if (Platform_Random(100) < ((nLevel%2) ? 25 : 15)){ int i = Platform_Random(NUM_DEFENSEPLAYERS); if (player[i].nBright){ // pick horizontal or vertical movement toward the ball @@ -1235,9 +1221,8 @@ static void fsmInPlay() } } - // move the receiver randomly - if (Platform_Random(100) < ((bPro2) ? 15 : 5)){ + if (Platform_Random(100) < ((nLevel%2) ? 15 : 5)){ if (receiver.nBright){ // pick horizontal or vertical movement toward the ball if (Platform_Random(4) == 0){ @@ -1268,7 +1253,6 @@ static void fsmInPlay() } } - // check for collisions again if (ISDEFENSE(ball.nColumn, ball.nLane)){ // tackled! @@ -1291,28 +1275,21 @@ static void fsmInPlay() fsm = FSM_SAFETY; return; - } else if ((++nDown >= 4) && (!bGotFirstDown)){ - + } + if ((++nDown >= 4) && (!bGotFirstDown)){ // give the ball to the other team - bHomeTeam = !bHomeTeam; - PlatformSetInput(bHomeTeam); nDown = 0; ball.nYard = MAX_YARD - ball.nYard; nFirstDownYard = ball.nYard - 10; - Football2_PlaySound(FOOTBALL2_SOUND_ENDPOSSESSION, PLAYSOUNDFLAGS_PRIORITY); - fsm = FSM_PLAYENDED; + nextFsm = FSM_PLAYENDED; + fsm = FSM_TURNOVER; return; - } else { - Football2_PlaySound(FOOTBALL2_SOUND_ENDPLAY, PLAYSOUNDFLAGS_PRIORITY); - fsm = FSM_PLAYENDED; - return; - } - + } + fsm = FSM_OUTPLAY; return; } - // count down the clock if (Platform_IsNewSecond()){ if (fGameTime > 0.0){ @@ -1330,8 +1307,7 @@ static void fsmInPlay() static void fsmPassing() { -static int i = 0; -BOOL bIntercepted = FALSE; + static int i = 0; bDisplayTime = TRUE; bDisplayScore = FALSE; @@ -1361,20 +1337,18 @@ BOOL bIntercepted = FALSE; if ((++nDown >= 4) && (!bGotFirstDown)){ // give the ball to the other team - bHomeTeam = !bHomeTeam; - PlatformSetInput(bHomeTeam); nDown = 0; ball.nYard = MAX_YARD - ball.nYard; nFirstDownYard = ball.nYard - 10; Football2_PlaySound(FOOTBALL2_SOUND_ENDPOSSESSION, PLAYSOUNDFLAGS_PRIORITY); - - } else { - Football2_PlaySound(FOOTBALL2_SOUND_ENDPLAY, PLAYSOUNDFLAGS_PRIORITY); + nextFsm = FSM_PLAYENDED; + fsm = FSM_TURNOVER; + } + else { + fsm = FSM_OUTPLAY; } - Platform_IsNewSecond(); - fsm = FSM_PLAYENDED; } else if (ISDEFENSE(ball.nColumn, ball.nLane)){ @@ -1399,14 +1373,13 @@ BOOL bIntercepted = FALSE; UNMOVEPLAYER(ball); // give the ball to the other team - bHomeTeam = !bHomeTeam; - PlatformSetInput(bHomeTeam); nDown = 0; ball.nYard = MAX_YARD - ball.nYard; nFirstDownYard = ball.nYard - 10; Platform_IsNewSecond(); - fsm = FSM_PLAYENDED; + nextFsm = FSM_PLAYENDED; + fsm = FSM_TURNOVER; } } } @@ -1459,8 +1432,6 @@ static void fsmSafety() ++nQuarter; if (nQuarter == 2){ // halftime - force kickoff - bHomeTeam = !bHomeTeam; - PlatformSetInput(bHomeTeam); ball.nYard = 35; nCurrentYardline = ball.nYard; nFirstDownYard = nCurrentYardline - 35; @@ -1473,11 +1444,11 @@ static void fsmSafety() } fGameTime = 15.0; - fsm = FSM_KICKOFFWAIT; + nextFsm = FSM_KICKOFFWAIT; + fsm = FSM_TURNOVER; return; - } else { - fGameTime = 15.0; - } + } + fGameTime = 15.0; } // add 2 points and set up kickoff from 20 yardline @@ -1486,17 +1457,15 @@ static void fsmSafety() } else { nHScore += 2; } - bHomeTeam = !bHomeTeam; - PlatformSetInput(bHomeTeam); ball.nYard = 20; nCurrentYardline = ball.nYard; nFirstDownYard = nCurrentYardline - 10; - fsm = FSM_KICKOFFWAIT; - fsmKickoffWait(); + nextFsm = FSM_KICKOFFWAIT; + fsm = FSM_TURNOVER; + // fsmKickoffWait(); return; } - } static void fsmPlayEnded() @@ -1554,7 +1523,15 @@ static void fsmGameOver() } - - - - +#define LINE_STEP 20 +void Football2_Debug(int f) +{ + int w, h; + int y = 0; + Football2_GetSize(&w, &h); + + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "level =%d", nLevel); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "fsm =%d", fsm); + y += LINE_STEP; +} diff --git a/source/game/Football2.h b/source/game/Football2.h index aea8d10..7714f9e 100644 --- a/source/game/Football2.h +++ b/source/game/Football2.h @@ -45,23 +45,24 @@ Website : http://www.peterhirschberg.com #define FOOTBALL2_BLIP_ROWS 3 #define FOOTBALL2_BLIP_COLUMNS 10 -#define FOOTBALL2_SOUND_CHARGESTART 0 -#define FOOTBALL2_SOUND_CHARGE 1 +#define FOOTBALL2_SOUND_CHARGESTART 0 +#define FOOTBALL2_SOUND_CHARGE 1 #define FOOTBALL2_SOUND_TICK 2 -#define FOOTBALL2_SOUND_RUNBACK 3 +#define FOOTBALL2_SOUND_RUNBACK 3 #define FOOTBALL2_SOUND_FIRSTDOWN 4 -#define FOOTBALL2_SOUND_ENDPLAY 5 +#define FOOTBALL2_SOUND_ENDPLAY 5 #define FOOTBALL2_SOUND_ENDPOSSESSION 6 -#define FOOTBALL2_SOUND_ENDQUARTER 7 +#define FOOTBALL2_SOUND_ENDQUARTER 7 #define FOOTBALL2_SOUND_TOUCHDOWN 8 -#define FOOTBALL2_SOUND_SAFETY 9 +#define FOOTBALL2_SOUND_SAFETY 9 +#define FOOTBALL2_SOUND_NSOUNDS 10 -void Football2_Run(); +void Football2_Run(int tu); void Football2_SetSkill(int i); int Football2_GetSkill(); void Football2_PowerOn(); void Football2_PowerOff(); int Football2_GetPower(); - +void Football2_Debug(); #endif diff --git a/source/game/Hockey.c b/source/game/Hockey.c index b2f3a01..14f604f 100644 --- a/source/game/Hockey.c +++ b/source/game/Hockey.c @@ -138,18 +138,6 @@ static PLAYER defense[NUM_DEFENSEPLAYERS]; p.nColumn++; \ } -static BOOL ISPUCK(int x, int y); -static BOOL ISPUCK(int x, int y) -{ - if ((puck.nColumn == x) - && (puck.nRow == y) - && (puck.nBright)){ - return TRUE; - } - return FALSE; -} - -static BOOL ISPLAYER(int x, int y); static BOOL ISPLAYER(int x, int y) { if ((player.nColumn == x) @@ -160,7 +148,6 @@ static BOOL ISPLAYER(int x, int y) return FALSE; } -static BOOL ISDEFENSE(int x, int y); static BOOL ISDEFENSE(int x, int y) { for (int i=0; inColumn; int dy = pDefender->nRow; diff --git a/source/game/HockeyCa.h b/source/game/HockeyCa.h index b100945..0b08006 100644 --- a/source/game/HockeyCa.h +++ b/source/game/HockeyCa.h @@ -50,8 +50,9 @@ Website : http://www.peterhirschberg.com #define HOCKEYCA_SOUND_ENDPLAY 3 #define HOCKEYCA_SOUND_ENDQUARTER 4 #define HOCKEYCA_SOUND_ENDGAME 5 +#define HOCKEYCA_SOUND_NSOUNDS 6 -void HockeyCa_Run(); +void HockeyCa_Run(int tu); void HockeyCa_SetSkill(int i); int HockeyCa_GetSkill(); void HockeyCa_PowerOn(); diff --git a/source/game/Soccer.c b/source/game/Soccer.c index 4841a5c..4b3e4f2 100644 --- a/source/game/Soccer.c +++ b/source/game/Soccer.c @@ -33,12 +33,9 @@ Website : http://www.peterhirschberg.com */ - - #include "Soccer.h" #include "Games.h" - // constants #define NUM_DEFENSEPLAYERS 6 @@ -133,18 +130,6 @@ static PLAYER defense[NUM_DEFENSEPLAYERS]; p.nColumn++; \ } -static BOOL ISBALL(int x, int y); -static BOOL ISBALL(int x, int y) -{ - if ((ball.nColumn == x) - && (ball.nRow == y) - && (ball.nBright)){ - return TRUE; - } - return FALSE; -} - -static BOOL ISPLAYER(int x, int y); static BOOL ISPLAYER(int x, int y) { if ((player.nColumn == x) @@ -155,7 +140,6 @@ static BOOL ISPLAYER(int x, int y) return FALSE; } -static BOOL ISDEFENSE(int x, int y); static BOOL ISDEFENSE(int x, int y) { for (int i=0; inColumn; int dy = pDefender->nRow; diff --git a/source/game/Soccer.h b/source/game/Soccer.h index eb3742b..b9571fc 100644 --- a/source/game/Soccer.h +++ b/source/game/Soccer.h @@ -40,7 +40,6 @@ Website : http://www.peterhirschberg.com #include "Platform.h" #include "Platform_Soccer.h" - #define SOCCER_BLIP_ROWS 4 #define SOCCER_BLIP_COLUMNS 5 @@ -50,8 +49,9 @@ Website : http://www.peterhirschberg.com #define SOCCER_SOUND_ENDPLAY 3 #define SOCCER_SOUND_ENDQUARTER 4 #define SOCCER_SOUND_ENDGAME 5 +#define SOCCER_SOUND_NSOUNDS 6 -void Soccer_Run(); +void Soccer_Run(int tu); void Soccer_SetSkill(int i); int Soccer_GetSkill(); void Soccer_PowerOn(); diff --git a/source/game/Soccer2.c b/source/game/Soccer2.c new file mode 100644 index 0000000..d9d4bd3 --- /dev/null +++ b/source/game/Soccer2.c @@ -0,0 +1,1805 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "Soccer2.h" +#include "Games.h" + +// constants + +#define NUM_DEFENSEPLAYERS 5 +#define TIME_STATSDISPLAY 5 +#define TIME_BALLMOVE 5 +#define GAMETIME 45.9 +#define TIME_TICKTIMER 10 +#define BALL_LOWKICK (3 + Platform_Random(2)) +#define BALL_HIGHKICK (5 + Platform_Random(4)) + +#define IS_GOALAREA() ((nSector == 1) || (nSector == 9)) +#define IS_ATTACKAREA() ((nSector == 1 && bHomeTeam) || (nSector == 9 && !bHomeTeam)) + +typedef struct { + int state; +} BLIP; + +typedef struct { + Coord_t player; + Coord_t receiver; + Coord_t defense[NUM_DEFENSEPLAYERS]; +} SCHEME_t; + +static BLIP Blips[SOCCER2_BLIP_COLUMNS][SOCCER2_BLIP_ROWS]; + +// debug +static int trc_debug; + +// game variables +static BOOL bGameOver; +static BOOL bHomeTeam; +static BOOL bInFrame = FALSE; +static BOOL bPower; +static BOOL bBounce = FALSE; +static BOOL bTeamMate = FALSE; +static BOOL bTeamMateSet = FALSE; +static BOOL bKickKey = FALSE; + +static int nLevel = -1; +static int nHScore; +static int nVScore; +static int fGameTime; +static int nHalf; +static int nTimerTickTimer; +static int nSector; +static int nBallDirectionX; +static int nBallDirectionY; +static int nTimerBallMove; +static int nStatsIndex; +static int nTimerStatsDisplay; +static int nBallStep; +static int nBallMax; + +typedef struct { + int x; + int y; + int side; +}BALL_OUT; +static BALL_OUT ball_out; + +typedef struct { + int nColumn; + int nRow; + int nBright; + int nColumnOld; + int nRowOld; + int nMoveNow; +}PLAYER; + +static PLAYER ball; +static PLAYER player; +static PLAYER receiver; +static PLAYER goalkeeper; +static PLAYER defense[NUM_DEFENSEPLAYERS]; + +// macros for dealing with the players + +#define SETPLAYERBRIGHTNESS(p,b) { \ + (p)->nBright = b; \ +} + +#define NOTECURRENTPLAYERPOSITION(p) { \ + (p)->nColumnOld = (p)->nColumn; \ + (p)->nRowOld = (p)->nRow; \ +} + +#define SETPLAYER(p,x,y,b) { \ + NOTECURRENTPLAYERPOSITION(p); \ + if (x >= 0) { (p)->nColumn = (x) % SOCCER2_BLIP_COLUMNS; } \ + if (y >= 0) { (p)->nRow = (y) % SOCCER2_BLIP_ROWS; } \ + if (b >= 0) { (p)->nBright = b; }\ +} + +#define UNSETPLAYER(p) { \ + (p)->nBright = BLIP_OFF; \ +} + +#define ISPLAYERMOVED(p) (((p)->nColumn != (p)->nColumnOld) || ((p)->nRow != (p)->nRowOld)) + +#define UNMOVEPLAYER(p) { \ + (p)->nRow = (p)->nRowOld; \ + (p)->nColumn = (p)->nColumnOld; \ +} + +#define ISPLAYEROFFSCREEN(p) (!VALID_COLUMN((p)->nColumn) || !VALID_ROW((p)->nRow)) + +#define ISPLAYERENABLED(p) \ + ((p)->nBright) + +#define ISBALL(x,y) generic_check(&ball, x, y) +#define ISPLAYER(x,y) generic_check(&player, x, y) +#define ISRECEIVER(x,y) generic_check(&receiver, x, y) +#define ISGOALKEEPER(x,y) generic_check(&goalkeeper, x, y) + +#define SET_BALLOUT(p) { ball_out.x = (p)->nColumnOld; ball_out.y = (p)->nRowOld; ball_out.side = Platform_Random(2); } + +static BOOL generic_check(PLAYER *p, int x, int y) +{ + if ((p->nColumn == x) + && (p->nRow == y) + && (p->nBright)){ + return TRUE; + } + return FALSE; +} + +static BOOL ISDEFENSE(int x, int y) +{ + for (int i=0; inRow + 1)) { + v = 1; + } + else if(row == (p->nRow - 1)) { + v = -1; + } + else { + v = 0; + } + + c = (flag) ? -1 : 1; + + if(v != 0 && !ISOCCUPIED(p->nColumn,p->nRow+v)) { + rtn = p->nColumn; + } + else if(VALID_COLUMN(p->nColumn+c) && !ISOCCUPIED(p->nColumn+c,p->nRow+v)) { + rtn = p->nColumn+c; + } + else if(VALID_COLUMN(p->nColumn-c) && !ISOCCUPIED(p->nColumn-c,p->nRow+v)) { + rtn = p->nColumn-c; + } + else { + rtn = -1; + } + + return rtn; +} +*/ +static int move_tocol(PLAYER *p, int col, int flag) +{ + int v = 0; + int r, rtn; + + if(col == (p->nColumn + 1)) { + v = 1; + } + else if(col == (p->nColumn - 1)) { + v = -1; + } + else { + v = 0; + } + + r = (flag) ? -1 : 1; + + if(v != 0 && !ISOCCUPIED(p->nColumn+v,p->nRow)) { + rtn = p->nRow; + } + else if(VALID_ROW(p->nRow+r) && !ISOCCUPIED(p->nColumn+v,p->nRow+r)) { + rtn = p->nRow+r; + } + else if(VALID_ROW(p->nRow-r) && !ISOCCUPIED(p->nColumn+v,p->nRow-r)) { + rtn = p->nRow-r; + } + else { + rtn = -1; + } + return rtn; +} + +static BOOL move_around(PLAYER *p) +{ + int x, y; + int x1, y1; + + for(x=0; xnColumn) % SOCCER2_BLIP_COLUMNS; + for(y=0; ynRow) % SOCCER2_BLIP_ROWS; + if(!ISOCCUPIED(x1,y1)) { + SETPLAYER(p, x1, y1, -1); + return TRUE; + } + } + } + + return FALSE; +} + +static BOOL set_goalkeeper() +{ + PLAYER *p; + int x; + + if(nSector == 1 && bHomeTeam) + x = 0; + else if(nSector == 9 && !bHomeTeam) + x = 6; + else { + UNSETPLAYER(&goalkeeper); + return FALSE; + } + if( (p = GETPLAYERAT(x, 2)) != NULL ) { + move_around(p); + } + SETPLAYER(&goalkeeper,x, 2, BLIP_DIM); + return TRUE; +} + +// finite state machine stuff +#define FSM_RUNNING(x) ((x == FSM_INPLAY) || (x == FSM_SHOOTING) || (x == FSM_GOAL) || (x == FSM_PASSING)) +#define next_fsm(x) { if(FSM_RUNNING(x)) {fsm = x; nextFsm = FSM_INVALID; } else { fsm = FSM_WAITSCOREPRESS; nextFsm = x; } } + +static void fsmKickoff(); +static void fsmTurnover(); +static void fsmThrowin(); +static void fsmGoalKick(); +static void fsmCornerKick(); +static void fsmInPlay(); +static void fsmPassing(); +static void fsmShooting(); +static void fsmGameOver(); +static void fsmWaitScorePress(); +static void fsmGoal(); + +enum FSM { + FSM_INVALID = -1, + FSM_KICKOFF = 0, + FSM_TURNOVER, + FSM_THROWIN, + FSM_GOALKICK, + FSM_CORNERKICK, + FSM_INPLAY, + FSM_PASSING, + FSM_SHOOTING, + FSM_GAMEOVER, + FSM_WAITSCOREPRESS, + FSM_GOAL +}; + +static enum FSM fsm, nextFsm; + +typedef void (*FSMFCN)(); + +static FSMFCN fsmfcn[] = { + fsmKickoff, + fsmTurnover, + fsmThrowin, + fsmGoalKick, + fsmCornerKick, + fsmInPlay, + fsmPassing, + fsmShooting, + fsmGameOver, + fsmWaitScorePress, + fsmGoal +}; + +static int probability(int value) +{ + int rtn; + + rtn = (Platform_Random(100) <= ((value/4 * (nLevel + 1)) - Platform_Random(4 - nLevel))) ? 1 : 0; + + return rtn; +} + +static void lost_possession() +{ + bHomeTeam = !bHomeTeam; + PlatformSetInput(bHomeTeam); +} + +static void InitGame() +{ + bHomeTeam = FALSE; + PlatformSetInput(bHomeTeam); + nHScore = 0; + nVScore = 0; + fGameTime = GAMETIME; + nHalf = 0; + bGameOver = FALSE; + nSector = 5; + bTeamMate = FALSE; + bTeamMateSet = FALSE; + bKickKey = FALSE; + + next_fsm(FSM_INVALID); +} + +static void DrawBlips() +{ + static BOOL bBlink = FALSE; + int x, y, nBright; + + for (int i=0; iplayer.x, ps->player.y, BLIP_BRIGHT); + SETPLAYER(&receiver, ps->receiver.x, ps->receiver.y, BLIP_DIMBLINK); + for(i=0; idefense[i].x, ps->defense[i].y, BLIP_DIM); +} + +static void corner_scheme() +{ + static SCHEME_t cl[2] = { + { {6,0}, {6,1}, {{4,0}, {4,1}, {3,2}, {4,3}, {4,4}} }, + { {0,4}, {0,3}, {{2,0}, {2,1}, {3,2}, {2,3}, {2,4}} } + }; + static SCHEME_t cr[2] = { + { {6,4}, {6,3}, {{4,0}, {4,1}, {3,2}, {4,3}, {4,4}} }, + { {0,0}, {0,1}, {{2,0}, {2,1}, {3,2}, {2,3}, {2,4}} } + + }; + SCHEME_t *ps; + int i; + + if(ball_out.x != 0 && ball_out.x != 6) + return; + + if(ball_out.x == 0) { + if(ball_out.y < 3) + ps = &cr[1]; + else if(ball_out.y > 3) + ps = &cl[1]; + else + ps = ball_out.side ? &cr[1] : &cl[1]; + } + else { /* x == 6 */ + if(ball_out.y < 3) + ps = &cl[0]; + else if(ball_out.y < 3) + ps = &cr[0]; + else + ps = ball_out.side ? &cr[0] : &cl[0]; + } + + UNSETPLAYER(&ball); + + SETPLAYER(&player, ps->player.x, ps->player.y, BLIP_BRIGHT); + SETPLAYER(&receiver, ps->receiver.x, ps->receiver.y, BLIP_DIMBLINK); + for(i=0; idefense[i].x, ps->defense[i].y, BLIP_DIM); + + set_goalkeeper(); +} + +static void throwin_scheme() +{ + static SCHEME_t p[] = { + /* player receiver 0 1 2 3 4 */ + { {3,4}, {3,3}, {{1,3}, {2,2}, {3,2}, {4,2}, {5,3}} }, + { {2,4}, {2,3}, {{0,3}, {1,2}, {2,2}, {3,2}, {4,3}} }, + { {1,4}, {1,3}, {{0,2}, {1,2}, {2,2}, {3,3}, {3,4}} }, + { {0,4}, {0,3}, {{0,2}, {1,2}, {2,2}, {2,3}, {2,4}} }, + { {3,0}, {3,1}, {{1,1}, {2,2}, {3,2}, {4,2}, {5,1}} }, + { {2,0}, {2,1}, {{0,1}, {1,2}, {2,2}, {3,2}, {4,1}} }, + { {1,0}, {1,1}, {{0,2}, {1,2}, {2,2}, {3,1}, {3,0}} }, + { {0,0}, {0,1}, {{0,2}, {1,2}, {2,2}, {2,1}, {2,0}} }, + { {6,4}, {6,3}, {{6,2}, {5,2}, {4,2}, {4,3}, {4,4}} }, + { {5,4}, {5,3}, {{6,2}, {5,2}, {4,2}, {3,3}, {3,4}} }, + { {4,4}, {4,3}, {{6,3}, {5,2}, {4,2}, {3,2}, {2,3}} }, + { {6,0}, {6,1}, {{6,2}, {5,2}, {4,2}, {4,1}, {4,0}} }, + { {5,0}, {5,1}, {{6,2}, {5,2}, {4,2}, {3,1}, {3,0}} }, + { {4,0}, {4,1}, {{6,1}, {5,2}, {4,2}, {3,2}, {2,1}} }, + }; + int i; + + UNSETPLAYER(&ball); + + for(i=0; iplayer.x, ps->player.y, BLIP_BRIGHT); + SETPLAYER(&receiver, ps->receiver.x, ps->receiver.y, BLIP_DIMBLINK); + for(i=0; idefense[i].x, ps->defense[i].y, BLIP_DIM); +} + +static void turnover_scheme() +{ + int i; + + UNSETPLAYER(&ball); + + /* Swap blips specularly to middle line */ + SETPLAYER(&player, SOCCER2_BLIP_COLUMNS - 1 - player.nColumn, player.nRow, BLIP_BRIGHT); + SETPLAYER(&receiver, SOCCER2_BLIP_COLUMNS - 1 - receiver.nColumn, receiver.nRow, BLIP_DIMBLINK); + for(i=0; inColumn != dx) { + if(p->nColumn > dx && p->nColumn > 0) + x--; + else if(p->nColumn < dx && p->nColumn < SOCCER2_BLIP_COLUMNS-1) + x++; + } + + if(p->nRow != dy) { + if(p->nRow > dy && p->nRow > 0) + y--; + else if(p->nRow < dy && p->nRow < SOCCER2_BLIP_ROWS-1) + y++; + } + + *nx = p->nColumn + x; + *ny = p->nRow + y; + + return TRUE; +} + +static BOOL IS_ALIGNED(const PLAYER *p1, const PLAYER *p2, int *dx, int *dy) +{ + int x, y; + + x = p2->nColumn - p1->nColumn; + y = p2->nRow - p1->nRow; + + if(dx != NULL) + *dx = x; + if(dy != NULL) + *dy = y; + + if((x == 0) || (y == 0) || (x == y)) + return TRUE; + + return FALSE; +} + +static int moveCounterInit() +{ + int rtn; + + switch(nLevel) { + case LVL_ROOKIEFAST: + rtn = 8 + Platform_Random(12); + break; + case LVL_PROSLOW: + rtn = 4 + Platform_Random(8); + break; + case LVL_PROFAST: + rtn = Platform_Random(4); + break; + case LVL_ROOKIESLOW: + default: + rtn = 12 + Platform_Random(16); + break; + } + return rtn; +} + +static enum FSM move_player(enum FSM curFsm) +{ + enum FSM newFsm = FSM_INVALID; + BOOL bChange; + BOOL moved = FALSE; + BOOL newsect = FALSE; + int col, row; + PLAYER *p; + + p = (bTeamMate || curFsm == FSM_PASSING) ? &receiver : &player; + + NOTECURRENTPLAYERPOSITION(p); + col = p->nColumn; + row = p->nRow; + + if (Soccer2_GetInputLEFTUP(&bChange)) { + if (bChange) { + col -= 1; + row -= 1; + moved = TRUE; + } + } + else if (Soccer2_GetInputLEFTDOWN(&bChange)) { + if (bChange) { + col -= 1; + row += 1; + moved = TRUE; + } + } + else if (Soccer2_GetInputRIGHTUP(&bChange)) { + if (bChange) { + col += 1; + row -= 1; + moved = TRUE; + } + } + else if (Soccer2_GetInputRIGHTDOWN(&bChange)) { + if (bChange) { + col += 1; + row += 1; + moved = TRUE; + } + } + else if (Soccer2_GetInputLEFT(&bChange)) { + if (bChange) { + col -= 1; + moved = TRUE; + } + } + else if (Soccer2_GetInputRIGHT(&bChange)) { + if (bChange) { + col += 1; + moved = TRUE; + } + } + else if (Soccer2_GetInputUP(&bChange)) { + if (bChange) { + row -= 1; + moved = TRUE; + } + } + else if (Soccer2_GetInputDOWN(&bChange)) { + if (bChange) { + row += 1; + moved = TRUE; + } + } + + if(moved == FALSE) + return newFsm; + + if(!VALID_COLUMN(col)) { + moved = FALSE; + + /* Moves between sectors only if 'p' is the player and has the ball */ + if (!ISPLAYERENABLED(&ball) && (p == &player)) { + if(col < 0) { + if(nSector == 1) { + SET_BALLOUT(p); + newFsm = (!bHomeTeam) ? FSM_CORNERKICK : FSM_GOALKICK; + lost_possession(); + } + else if(nSector > 1) { + nSector--; + newsect = TRUE; + col = SOCCER2_BLIP_COLUMNS - 1; + moved = TRUE; + } + } + else if(col >= SOCCER2_BLIP_COLUMNS) { + if(nSector == 9) { + SET_BALLOUT(p); + newFsm = (!bHomeTeam) ? FSM_GOALKICK : FSM_CORNERKICK; + lost_possession(); + } + else if(nSector < 9) { + nSector++; + newsect = TRUE; + col = 0; + moved = TRUE; + } + } + } + } + if (!VALID_ROW(row)) { + moved = FALSE; /* Invalid move */ + } + + if(moved) { + if(newsect) + build_newsector(p, col, row); + else if(!ISOCCUPIED(col, row) || + ISPLAYER(col,row) || ISRECEIVER(col,row)) { + SETPLAYER(p, col, row, -1); + if(bTeamMate) { + bTeamMateSet = TRUE; + } + } + else if(ISBALL(col,row)) { + UNSETPLAYER(&ball); + Soccer2_PlaySound(SOCCER2_SOUND_BOUNCE, PLAYSOUNDFLAGS_PRIORITY); + if(p == &receiver) { + swap_player(&player, &receiver); + } + SETPLAYER(&player, col, row, BLIP_BRIGHT); + SETPLAYERBRIGHTNESS(&receiver, BLIP_DIMBLINK); + } + newFsm = curFsm; + } + + return newFsm; +} + +static BOOL count_down() +{ + // count down the clock + if (Platform_IsNewSecond()){ + // check for end of quarter + if (fGameTime > 0.0){ + fGameTime -= (int).1; + if (fGameTime < 0.1){ + + // end of quarter + ++nHalf; + if (nHalf >= 2) + { + // game over + bGameOver = TRUE; + Soccer2_ClearScreen(); + Soccer2_PlaySound(SOCCER2_SOUND_ENDGAME, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(FSM_GAMEOVER); + return FALSE; + } + + bHomeTeam = (nHalf % 2) ? FALSE : TRUE; + PlatformSetInput(bHomeTeam); + + fGameTime = GAMETIME; + Soccer2_ClearScreen(); + Soccer2_PlaySound(SOCCER2_SOUND_ENDHALF, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(FSM_KICKOFF); + return FALSE; + } + } + } + + Soccer2_DrawSect(nSector, bHomeTeam); + + // make tick sounds + if (fGameTime >= .1){ + if (--nTimerTickTimer <= 0){ + Soccer2_PlaySound(SOCCER2_SOUND_TICK, PLAYSOUNDFLAGS_ASYNC); + nTimerTickTimer = TIME_TICKTIMER; + } + } + return TRUE; +} + +static BOOL move_receiver() +{ + int x, y; + int dx, dy; + + if(!ISPLAYERENABLED(&receiver)) { + return FALSE; + } + + if(bTeamMate || bTeamMateSet) { + return FALSE; + } + + if(IS_ALIGNED(&receiver, &player, &dx, &dy)) { + return FALSE; + } + + if(receiver.nMoveNow-- > 0) { + return FALSE; + } + + x = receiver.nColumn; + y = receiver.nRow; + if(!bHomeTeam) { + if(dx < 0 && x < (SOCCER2_BLIP_COLUMNS - 1)) + x++; + else if(x < (SOCCER2_BLIP_COLUMNS - 1)) + x++; + } + else { + if(dx > 0 && x > 0) + x--; + else if(x > 0) + x--; + } + + if(ISOCCUPIED(x, y)) { + int newy; + + newy = move_tocol(&receiver, x, Platform_Random(2)); + if(newy >= 0) { + y = newy; + } + else { /* Try move only on y axis */ + x = receiver.nColumn; + newy = move_tocol(&receiver, x, Platform_Random(2)); + if(newy >= 0) { + y = newy; + } + } + } + + if(!ISOCCUPIED(x, y)) { + SETPLAYER(&receiver, x, y, BLIP_DIMBLINK); + receiver.nMoveNow = moveCounterInit(); + return TRUE; + } + + receiver.nMoveNow = 0; /* Try to move next time */ + return FALSE; +} + +static void initDefense() +{ + int i; + + for(i=0; i < NUM_DEFENSEPLAYERS; i++) { + defense[i].nMoveNow = moveCounterInit(); + } +} + +static BOOL passing() +{ + int x, y; + + if (ISPLAYERENABLED(&ball)) + return FALSE; + + Soccer2_PlaySound((bKickKey) ? SOCCER2_SOUND_LOWKICK : SOCCER2_SOUND_HIGHKICK, PLAYSOUNDFLAGS_PRIORITY); + + y = player.nRow - receiver.nRow; + x = player.nColumn - receiver.nColumn; + + if(abs(x) == abs(y)) { + if(y > 0) + nBallDirectionY = -1; + else if(y < 0) + nBallDirectionY = 1; + else + nBallDirectionY = 0; + + if(x > 0) + nBallDirectionX = -1; + else if(x < 0) + nBallDirectionX = 1; + else + nBallDirectionX = 0; + } + else if(abs(x) > abs(y)) { + nBallDirectionY = 0; + if(x > 0) + nBallDirectionX = -1; + else if(x < 0) + nBallDirectionX = 1; + } + else { + nBallDirectionX = 0; + if(y > 0) + nBallDirectionY = -1; + else if(y < 0) + nBallDirectionY = 1; + } + + SETPLAYER(&ball, player.nColumn, player.nRow, BLIP_BRIGHT); + UNSETPLAYER(&player); + + nBallStep = 0; + nBallMax = (bKickKey) ? BALL_HIGHKICK : BALL_LOWKICK; + nTimerBallMove = TIME_BALLMOVE; + return TRUE; +} + +static BOOL shooting() +{ + if (ISPLAYERENABLED(&ball)) + return FALSE; + + Soccer2_PlaySound((bKickKey) ? SOCCER2_SOUND_LOWKICK : SOCCER2_SOUND_HIGHKICK, PLAYSOUNDFLAGS_PRIORITY); + + nBallDirectionX = (!bHomeTeam) ? 1 : -1; + if(IS_ATTACKAREA()) { + if(player.nRow > 2) + nBallDirectionY = -1; + else if(player.nRow < 2) + nBallDirectionY = 1; + else + nBallDirectionY = 0; + } + else { + nBallDirectionY = 0; + } + + SETPLAYER(&ball, player.nColumn, player.nRow, BLIP_BRIGHT); + + UNSETPLAYER(&receiver); + SETPLAYERBRIGHTNESS(&player, BLIP_DIMBLINK); + + nBallStep = 0; + nBallMax = (bKickKey) ? BALL_HIGHKICK : BALL_LOWKICK; + nTimerBallMove = TIME_BALLMOVE; + return TRUE; +} + +static int bounce(enum FSM curFsm) +{ + bBounce = TRUE; + + /* On sector 1 or 9, on shoot or passage it can be corner kick */ + if( IS_ATTACKAREA() ) { + if( (curFsm == FSM_SHOOTING) && probability(50) ) { + nBallDirectionX = (bHomeTeam) ? -1 : 1; + } + else if((curFsm == FSM_PASSING) && probability(25)) { + nBallDirectionX = (bHomeTeam) ? -1 : 1; + } + else { + nBallDirectionX = (bHomeTeam) ? 1 : -1; + } + } + else { + if((curFsm == FSM_PASSING) && probability(15)) + nBallDirectionX = (bHomeTeam) ? -1 : 1; + else + nBallDirectionX = (bHomeTeam) ? 1 : -1; + } + + if(probability(20)) + nBallDirectionY = 0; + else if(probability(40)) + nBallDirectionY = -1; + else if(probability(40)) + nBallDirectionY = 1; + + nBallStep = 0; + nBallMax = (Platform_Random(2)) ? BALL_HIGHKICK : BALL_LOWKICK; + Soccer2_PlaySound(SOCCER2_SOUND_BOUNCE, PLAYSOUNDFLAGS_PRIORITY); + + SETPLAYERBRIGHTNESS(&player, BLIP_DIMBLINK); + SETPLAYERBRIGHTNESS(&receiver, BLIP_DIMBLINK); + nTimerBallMove = TIME_BALLMOVE; + return 0; +} + +static enum FSM move_defense(enum FSM curFsm) +{ + Coord_t gk = {0, 0}; + Coord_t df[NUM_DEFENSEPLAYERS]; + enum FSM newFsm = curFsm; + int i, nx, ny; + + gk.x = goalkeeper.nColumn; + gk.y = goalkeeper.nRow; + for(i=0; i 0 && ball.nRow < 4)) { + gk.y = ball.nRow; + } + } + for(i=0; i gk.y) + gk.y++; + } + else if(player.nRow > 0 && player.nRow < 4) { + if((!bHomeTeam && player.nColumn == 5) || (bHomeTeam && player.nColumn == 1)) { + gk.x = player.nColumn; + gk.y = player.nRow; + } + else { + gk.x = goalkeeper.nColumn; + gk.y = player.nRow; + } + } + else { + if(player.nRow == 2) + gk.y = 2; + else + gk.y = 2 + (player.nRow < 2) ? -1 : 1; + } + } + } + for(i=0; i= nBallMax)) { + SETPLAYERBRIGHTNESS(&player, BLIP_DIMBLINK); + SETPLAYERBRIGHTNESS(&receiver, BLIP_OFF); + bBounce = FALSE; + return FSM_INPLAY; + } + + // move the ball + NOTECURRENTPLAYERPOSITION(&ball); + ball.nColumn += nBallDirectionX; + ball.nRow += nBallDirectionY; + nBallStep++; + + /* Check if is off-screen */ + if (ISPLAYEROFFSCREEN(&ball)) { + /* Choose throwin or goalkick */ + if(!VALID_COLUMN(ball.nColumn)) { + if(nSector > 1 && nBallDirectionX < 0) { + if(nBallDirectionY == 0) { + nSector--; + build_newsector(&ball, SOCCER2_BLIP_COLUMNS - 1, ball.nRow); + } + else { + nBallStep = nBallMax; + ball.nColumn = 0; + ball.nRow = ball.nRowOld; + } + } + else if(nSector < 9 && nBallDirectionX > 0) { + if(nBallDirectionY == 0) { + nSector++; + build_newsector(&ball, 0, ball.nRow); + } + else { + nBallStep = nBallMax; + ball.nColumn = 6; + ball.nRow = ball.nRowOld; + } + } + else { + SET_BALLOUT(&ball); + UNSETPLAYER(&ball); + if(!bBounce) { + lost_possession(); + return FSM_GOALKICK; + } + bBounce = FALSE; + return FSM_CORNERKICK; + } + } + if(!VALID_ROW(ball.nRow)) { + SET_BALLOUT(&ball); + UNSETPLAYER(&ball); + if(!bBounce) { + lost_possession(); + } + else { + bBounce = FALSE; + } + return FSM_THROWIN; + } + } + /* Check if goal */ + if(((fsm == FSM_SHOOTING) || (fsm == FSM_PASSING)) && + ((nSector == 1 && ball.nColumn == 0 && ball.nRow == 2) || + (nSector == 9 && ball.nColumn == 6 && ball.nRow == 2))) { + bBounce = FALSE; + if(bKickKey == TRUE) { + if(ISGOALKEEPER(ball.nColumn,ball.nRow)) { + if(probability(70)) { + SET_BALLOUT(&ball); + lost_possession(); + return FSM_GOALKICK; + } + } + else if(ISDEFENSE(ball.nColumn,ball.nRow)) { + if(probability(20)) { + bounce(curFsm); + return FSM_INPLAY; + } + return FSM_GOAL; + } + else if(probability(30)) { + SET_BALLOUT(&ball); + bBounce = FALSE; + lost_possession(); + return FSM_GOALKICK; + } + return FSM_GOAL; + } + if (ISGOALKEEPER(ball.nColumn, ball.nRow)) { + lost_possession(); + return FSM_GOALKICK; + } + return FSM_GOAL; + } + + /* non goal */ + if( (bKickKey == FALSE) || + (bKickKey == TRUE && (nBallStep == 1 || nBallStep == nBallMax)) ) { + /* Check if bounced by defender or goalkeeper */ + if (ISGOALKEEPER(ball.nColumn, ball.nRow)) { + if(curFsm == FSM_PASSING || probability(50)) { + SET_BALLOUT(&ball); + bBounce = FALSE; + lost_possession(); + return FSM_GOALKICK; + } + bounce(curFsm); + return FSM_INPLAY; + } + if (ISDEFENSE(ball.nColumn, ball.nRow)) { + if(curFsm == FSM_PASSING) { + bounce(curFsm); + return FSM_INPLAY; + } + if(probability(50)) { + lost_possession(); + return FSM_TURNOVER; + } + bounce(curFsm); + return FSM_INPLAY; + } + /* Check if receiver has gained possession */ + if (ISRECEIVER(ball.nColumn, ball.nRow)) { + UNSETPLAYER(&ball); + bBounce = FALSE; + Soccer2_PlaySound(SOCCER2_SOUND_BOUNCE, PLAYSOUNDFLAGS_PRIORITY); + /* Swap player and receiver */ + swap_player(&player, &receiver); + + SETPLAYERBRIGHTNESS(&player, BLIP_BRIGHT); + SETPLAYERBRIGHTNESS(&receiver, BLIP_DIMBLINK); + return FSM_INPLAY; + } + } + + /* Check if player has regained possession */ + if (ISPLAYER(ball.nColumn, ball.nRow)) { + UNSETPLAYER(&ball); + bBounce = FALSE; + Soccer2_PlaySound(SOCCER2_SOUND_BOUNCE, PLAYSOUNDFLAGS_PRIORITY); + SETPLAYERBRIGHTNESS(&player, BLIP_BRIGHT); + SETPLAYERBRIGHTNESS(&receiver, BLIP_DIMBLINK); + return FSM_INPLAY; + } + } + } + else { + bBounce = FALSE; + } + return curFsm; +} + +int Soccer2_GetPower() +{ + return (bPower ? TRUE : FALSE); +} + +void Soccer2_PowerOn() +{ + if (!bPower) + { + InitGame(); + bPower = TRUE; + } +} + +void Soccer2_PowerOff() +{ + bPower = FALSE; + Soccer2_StopSound(); +} + +void Soccer2_SetSkill(int i) +{ + nLevel = i; +} + +int Soccer2_GetSkill() +{ + return nLevel; +} + +void Soccer2_Run(int tu) +{ + int x, y; + + // prevent reentrancy + if (bInFrame){ + return; + } + bInFrame = TRUE; + + // turn off all blips + for (y = 0; y < SOCCER2_BLIP_ROWS; y++){ + for (x = 0; x < SOCCER2_BLIP_COLUMNS; x++){ + Blips[x][y].state = BLIP_OFF; + } + } + + if (!bPower){ + Soccer2_ClearScreen(); + bInFrame = FALSE; + return; + } + + Platform_StartDraw(); + + // run the game + (fsmfcn[fsm])(); + + DrawBlips(); + + Platform_EndDraw(); + + bInFrame = FALSE; +} + +// FINITE STATE MACHINE STUFF +static void fsmWaitScorePress() +{ + static BOOL pressed = FALSE; + BOOL bChange; + + if(nextFsm == FSM_INVALID) { + kickoff_scheme(); + nextFsm = FSM_KICKOFF; + } + + if(pressed == FALSE) { + Soccer2_DrawSect(nSector, bHomeTeam); + if (Soccer2_GetInputSCORE(&bChange)) { + if (bChange) { + pressed = TRUE; + nStatsIndex = 0; + nTimerStatsDisplay = TIME_STATSDISPLAY; + if(nextFsm != FSM_KICKOFF) + EraseBlips(); + } + } + } + else { + if (--nTimerStatsDisplay <= 0) + { + ++nStatsIndex; + nTimerStatsDisplay = TIME_STATSDISPLAY; + } + switch(nStatsIndex) { + case 0: + Soccer2_DrawStat(-1); + break; + case 1: + Soccer2_DrawStat(nVScore); + break; + case 2: + Soccer2_DrawStat(-1); + break; + case 3: + Soccer2_DrawStat(nHScore); + break; + case 4: + Soccer2_DrawStat(-1); + break; + case 5: + Soccer2_DrawStat((int)fGameTime); + break; + case 6: + Soccer2_DrawStat(-1); + break; + case 7: + Soccer2_DrawSect(nSector, bHomeTeam); + break; + default: + initDefense(); + receiver.nMoveNow = moveCounterInit(); + pressed = FALSE; + bTeamMate = FALSE; + bTeamMateSet = FALSE; + bKickKey = FALSE; + bBounce = FALSE; + fsm = nextFsm; + nextFsm = FSM_INVALID; + switch(fsm) { + case FSM_KICKOFF: + kickoff_scheme(); + break; + case FSM_CORNERKICK: + corner_scheme(); + break; + case FSM_GOALKICK: + goalkick_scheme(); + break; + case FSM_THROWIN: + throwin_scheme(); + break; + case FSM_TURNOVER: + turnover_scheme(); + default: + break; + } + break; + } + } +} + +static void fsmKickoff() +{ + BOOL bChange; + + kickoff_scheme(); + + if(Soccer2_GetInputPASS(&bChange)) { + if (bChange) { + Platform_IsNewSecond(); + if(passing() == TRUE) { + next_fsm(FSM_PASSING); + } + } + } + + Soccer2_DrawSect(nSector, bHomeTeam); +} + +static void fsmTurnover() +{ + enum FSM newFsm; + + newFsm = move_player(fsm); + if(newFsm != FSM_INVALID) { + Platform_IsNewSecond(); + next_fsm(FSM_INPLAY); + } +} + +static void fsmThrowin() +{ + BOOL bChange; + + if(Soccer2_GetInputPASS(&bChange)) { + if (bChange) { + Platform_IsNewSecond(); + if(passing() == TRUE) { + next_fsm(FSM_PASSING); + } + } + } + if(IS_LVLPRO(nLevel)) { + if (Soccer2_GetInputTEAM(&bChange)) { + if (bChange) { + bTeamMate = !bTeamMate; + if(bTeamMate == TRUE) + Soccer2_PlaySound(SOCCER2_SOUND_BEEP, PLAYSOUNDFLAGS_PRIORITY); + } + } + if (Soccer2_GetInputSCORE(&bChange)) { + if (bChange) { + bTeamMateSet = FALSE; + } + } + /* Can move the receiver */ + if(bTeamMate == TRUE) { + move_player(FSM_THROWIN); + } + } + Soccer2_DrawSect(nSector, bHomeTeam); +} + +static void fsmGoalKick() +{ + BOOL bChange; + + if(Soccer2_GetInputPASS(&bChange)) { + if (bChange) { + Platform_IsNewSecond(); + if(passing() == TRUE) { + next_fsm(FSM_PASSING); + } + } + } + + Soccer2_DrawSect(nSector, bHomeTeam); +} + +static void fsmCornerKick() +{ + BOOL bChange; + + if(Soccer2_GetInputPASS(&bChange)) { + if (bChange) { + Platform_IsNewSecond(); + if(passing() == TRUE) { + next_fsm(FSM_PASSING); + } + } + } + if(IS_LVLPRO(nLevel)) { + if (Soccer2_GetInputTEAM(&bChange)) { + if (bChange) { + bTeamMate = !bTeamMate; + if(bTeamMate == TRUE) + Soccer2_PlaySound(SOCCER2_SOUND_BEEP, PLAYSOUNDFLAGS_PRIORITY); + } + } + if (Soccer2_GetInputSCORE(&bChange)) { + if (bChange) { + bTeamMateSet = FALSE; + } + } + /* Can move the receiver */ + if(bTeamMate == TRUE) { + move_player(FSM_CORNERKICK); + } + } + + Soccer2_DrawSect(nSector, bHomeTeam); +} + +static void fsmInPlay() +{ + enum FSM newFsm; + BOOL bChange; + + newFsm = move_player(fsm); + if(newFsm == FSM_INVALID) { + if (Soccer2_GetInputSHOOT(&bChange)) { + if (bChange) { + if(shooting() == TRUE) { + next_fsm(FSM_SHOOTING); + return; + } + } + } + + if (Soccer2_GetInputPASS(&bChange)) { + if (bChange) { + if(passing() == TRUE) { + next_fsm(FSM_PASSING); + return; + } + } + } + + if(IS_LVLPRO(nLevel)) { + if (Soccer2_GetInputTEAM(&bChange)) { + if (bChange) { + bTeamMate = !bTeamMate; + if(bTeamMate == TRUE) + Soccer2_PlaySound(SOCCER2_SOUND_BEEP, PLAYSOUNDFLAGS_PRIORITY); + } + } + if (Soccer2_GetInputSCORE(&bChange)) { + if (bChange) { + bTeamMateSet = FALSE; + } + } + if (Soccer2_GetInputKICK(&bChange)) { + if (bChange) { + bKickKey = !bKickKey; + Soccer2_PlaySound((bKickKey) ? SOCCER2_SOUND_LOWKICK : SOCCER2_SOUND_HIGHKICK, PLAYSOUNDFLAGS_PRIORITY); + } + } + } + } + else if(newFsm != FSM_INPLAY) { + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + return; + } + + // move the receiver + move_receiver(); + + // move defenders + newFsm = move_defense(fsm); + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + + // count down the clock + count_down(); +} + +static void fsmPassing() +{ + enum FSM newFsm; + BOOL bChange; + + newFsm = move_player(fsm); + if(newFsm == FSM_INVALID) { + if (Soccer2_GetInputKICK(&bChange) && IS_LVLPRO(nLevel)) { + if (bChange) { + bKickKey = !bKickKey; + Soccer2_PlaySound((bKickKey) ? SOCCER2_SOUND_LOWKICK : SOCCER2_SOUND_HIGHKICK, PLAYSOUNDFLAGS_PRIORITY); + } + } + } + else if(newFsm != FSM_PASSING) { + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + return; + } + // move defenders + if(bKickKey) { + newFsm = move_defense(fsm); + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + } + // move the ball + if(fsm == FSM_PASSING) { + newFsm = move_ball(fsm); + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + } + + // count down the clock + count_down(); +} + +static void fsmShooting() +{ + enum FSM newFsm; + BOOL bChange; + + newFsm = move_player(fsm); + if(newFsm == FSM_INVALID) { + if (Soccer2_GetInputKICK(&bChange) && IS_LVLPRO(nLevel)) { + if (bChange) { + bKickKey = !bKickKey; + Soccer2_PlaySound((bKickKey) ? SOCCER2_SOUND_LOWKICK : SOCCER2_SOUND_HIGHKICK, PLAYSOUNDFLAGS_PRIORITY); + } + } + } + else if(newFsm != FSM_SHOOTING) { + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + return; + } + + // move defenders + if(bKickKey) { + newFsm = move_defense(fsm); + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + } + // move the ball + if(fsm == FSM_SHOOTING) { + newFsm = move_ball(fsm); + if(!FSM_RUNNING(newFsm)) + Soccer2_PlaySound(SOCCER2_SOUND_BALLOUT, PLAYSOUNDFLAGS_PRIORITY); + next_fsm(newFsm); + } + + // count down the clock + count_down(); +} + +static void fsmGameOver() +{ + next_fsm(FSM_GAMEOVER); +} + +static void fsmGoal() +{ + Soccer2_PlaySound(SOCCER2_SOUND_GOAL, PLAYSOUNDFLAGS_PRIORITY); + if(!bHomeTeam) + nVScore++; + else + nHScore++; + nSector = 5; + lost_possession(); + + next_fsm(FSM_KICKOFF); +} + +#define LINE_STEP 20 +void Soccer2_Debug(int f) +{ + int w, h; + int y = 0; + Soccer2_GetSize(&w, &h); + + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "level =%d", nLevel); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "fsm =%d (%d)", fsm, FSM_RUNNING(fsm)); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "nx fsm =%d (%d)", nextFsm, FSM_RUNNING(nextFsm)); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "bnc=%d kk=%d", + bBounce, bKickKey); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "tm=%d tms=%d", + bTeamMate, bTeamMateSet); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "trc =%d", trc_debug); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "ball =%d (%d,%d)(%d,%d)", + ball.nBright, ball.nColumn, ball.nRow, ball.nColumnOld, ball.nRowOld); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "play =%d (%d,%d)(%d,%d)", + player.nBright, player.nColumn, player.nRow, player.nColumnOld, player.nRowOld); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "recv =%d (%d,%d)(%d,%d)", + receiver.nBright, receiver.nColumn, receiver.nRow, receiver.nColumnOld, receiver.nRowOld); + y += LINE_STEP; +} diff --git a/source/game/Soccer2.h b/source/game/Soccer2.h new file mode 100644 index 0000000..7245545 --- /dev/null +++ b/source/game/Soccer2.h @@ -0,0 +1,54 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __SOCCER2_H__ +#define __SOCCER2_H__ + +#include "Platform.h" +#include "Platform_Soccer2.h" + +#define SOCCER2_BLIP_ROWS 5 +#define SOCCER2_BLIP_COLUMNS 7 +#define VALID_COLUMN(x) ( ((x)>=0) && ((x) < SOCCER2_BLIP_COLUMNS) ) +#define VALID_ROW(y) ( ((y)>=0) && ((y) < SOCCER2_BLIP_ROWS) ) + +#define SOCCER2_SOUND_TICK 0 // Time +#define SOCCER2_SOUND_LOOSEBALL 1 // Loose ball +#define SOCCER2_SOUND_BALLOUT 2 // Defense stole ball or ball out +#define SOCCER2_SOUND_GOAL 3 // Goal Scored +#define SOCCER2_SOUND_BEEP 4 // Offense in sec.1 ore Teammate controlled +#define SOCCER2_SOUND_HIGHKICK 5 // High shot & high pass +#define SOCCER2_SOUND_LOWKICK 6 // Low shot & low pass or defense kick +#define SOCCER2_SOUND_ENDHALF 7 // End of the half +#define SOCCER2_SOUND_ENDGAME 8 // End of the game +#define SOCCER2_SOUND_BOUNCE 9 // Bounce (or ball is caught or bounced by anyone) +#define SOCCER2_SOUND_NSOUNDS 10 // Total sounds + +void Soccer2_Run(int tu); +void Soccer2_SetSkill(int i); +int Soccer2_GetSkill(); +void Soccer2_PowerOn(); +void Soccer2_PowerOff(); +int Soccer2_GetPower(); +void Soccer2_Debug(int f); + +#endif diff --git a/source/game/SpaceAlert.c b/source/game/SpaceAlert.c index c10388c..8ba334c 100644 --- a/source/game/SpaceAlert.c +++ b/source/game/SpaceAlert.c @@ -33,12 +33,9 @@ Website : http://www.peterhirschberg.com */ - - #include "SpaceAlert.h" #include "Games.h" - // constants #define TIME_ATTACKWAVE 20 @@ -55,11 +52,8 @@ static BLIP Blips[SPACEALERT_BLIP_COLUMNS][SPACEALERT_BLIP_ROWS]; typedef struct tagRaider { int nColumn; int nRow; - int nSlow; - BOOL bAttacking; - BOOL bLeftColumn; BOOL bMidColumn; BOOL bRightColumn; @@ -67,7 +61,6 @@ typedef struct tagRaider { static RAIDER sRaiderA, sRaiderB; - // game variables static int nColumnSelector; static int nCurrentMissileRow; @@ -77,7 +70,6 @@ static int nTimerAttackWave; static int nRaiderCount; static int nPoints; static BOOL bGameOver; -static BOOL bWin; static BOOL bInFrame = FALSE; static BOOL bPower; @@ -85,10 +77,36 @@ static void InitGame(); static void InitAttack(); static void DoMissileUpdate(); static void DoRaidersUpdate(); -static void DoHitTest(); +static BOOL DoHitTest(); static void UpdateBlips(); static void PaintGame(); +static void fsmPlayStartWait(); +static void fsmInPlay(); +static void fsmHit(); +static void fsmScore(); +static void fsmWin(); +static void fsmLose(); + +static enum FSM { + FSM_PLAYSTARTWAIT=0, + FSM_INPLAY, + FSM_HIT, + FSM_SCORE, + FSM_WIN, + FSM_LOSE +}fsm; + +typedef void (*FSMFCN)(); + +static FSMFCN fsmfcn[] = { + fsmPlayStartWait, + fsmInPlay, + fsmHit, + fsmScore, + fsmWin, + fsmLose +}; BOOL SpaceAlert_GetPower() { @@ -110,7 +128,6 @@ void SpaceAlert_PowerOff() void InitGame() { - nColumnSelector = 1; nCurrentMissileRow = SPACEALERT_BLIP_ROWS - 1; @@ -121,21 +138,35 @@ void InitGame() nTimerAttackWave = 1; nPoints = 0; - + bGameOver = FALSE; - bWin = TRUE; - sRaiderA.bAttacking = FALSE; - + fsm = FSM_PLAYSTARTWAIT; } +static void PaintGame() +{ + if (bPower){ + // draw the blips field + for (int y = 0; y < SPACEALERT_BLIP_ROWS; y++){ + for (int x = 0; x < SPACEALERT_BLIP_COLUMNS; x++){ + SpaceAlert_DrawBlip(Blips[x][y], x, y); + } + } + + // draw the score + SpaceAlert_DrawScore(nPoints); + } +} void SpaceAlert_Run(int tu) { int x, y; // prevent reentrancy - if (bInFrame){ return; } + if (bInFrame) + return; + bInFrame = TRUE; // init the blips field @@ -144,74 +175,37 @@ void SpaceAlert_Run(int tu) Blips[x][y] = BLIP_OFF; } } - if (bPower){ - if (bGameOver){ - // handle game over - static BOOL bFlash = 0; - if (bWin){ - // win - Blips[0][SPACEALERT_BLIP_ROWS-2] = BLIP_BRIGHT; - Blips[1][SPACEALERT_BLIP_ROWS-2] = BLIP_BRIGHT; - Blips[2][SPACEALERT_BLIP_ROWS-2] = BLIP_BRIGHT; - } else { - // lose - if (bFlash){ - bFlash = FALSE; - Blips[1][SPACEALERT_BLIP_ROWS-1] = BLIP_BRIGHT; - } else { - bFlash = TRUE; - } - } - - // allow stick and fire button to be moved - SpaceAlert_GetInputFIRE(NULL); - SpaceAlert_GetInputSTICK(); - - // draw the frame - PaintGame(); - bInFrame = FALSE; - return; - } - } else { - - // allow stick and fire button to be moved - SpaceAlert_GetInputFIRE(NULL); - SpaceAlert_GetInputSTICK(); - - SpaceAlert_ClearScreen(); - bInFrame = FALSE; - return; + if (!bPower){ + fsm = FSM_PLAYSTARTWAIT; } + Platform_StartDraw(); - // get the current stick position - nColumnSelector = SpaceAlert_GetInputSTICK(); + (fsmfcn[fsm])(); - { - DoHitTest(); + UpdateBlips(); - DoRaidersUpdate(); + PaintGame(); - UpdateBlips(); - PaintGame(); - - DoHitTest(); - - DoMissileUpdate(); - } - - bInFrame = FALSE; + Platform_EndDraw(); + bInFrame = FALSE; } +static void cleanall() +{ + sRaiderA.bAttacking = FALSE; + sRaiderB.bAttacking = FALSE; + nCurrentMissileRow = -1; + SpaceAlert_ClearScreen(); + SpaceAlert_StopRaiderSound(); +} -void DoMissileUpdate() +static void DoMissileUpdate() { // update the missiles - if (SpaceAlert_GetInputFIRE(NULL)) - { + if (SpaceAlert_GetInputFIRE(NULL)) { // fire - if (nCurrentMissileRow == (SPACEALERT_BLIP_ROWS - 1)) - { + if (nCurrentMissileRow == (SPACEALERT_BLIP_ROWS - 1)) { SpaceAlert_PlaySound(SPACEALERT_SOUND_FIRE, PLAYSOUNDFLAGS_ASYNC | PLAYSOUNDFLAGS_PRIORITY); --nCurrentMissileRow; return; @@ -219,30 +213,29 @@ void DoMissileUpdate() } // move any active missiles - if (nCurrentMissileRow < (SPACEALERT_BLIP_ROWS - 1)) - { + if (nCurrentMissileRow < (SPACEALERT_BLIP_ROWS - 1)) { if (nCurrentMissileRow >= MISSILE_LIMIT){ // move missile up the screen --nCurrentMissileRow; - } else { + } + else { // missile has hit its limit offscreen -- show new missile nCurrentMissileRow = SPACEALERT_BLIP_ROWS - 1; } } } -void DoRaidersUpdate() +static void DoRaidersUpdate() { - // update the attack if (nTimerAttackWave > 0){ --nTimerAttackWave; if (nTimerAttackWave == 0){ // start a new attack wave - nIndexAttackWave = 0; InitAttack(); } - } else { + } + else { nTimerAttackWave = 0; } @@ -260,7 +253,8 @@ void DoRaidersUpdate() // handle the slow raiders if (sRaiderP->nSlow == 1){ sRaiderP->nSlow = 2; - } else { + } + else { sRaiderP->nSlow = 1; } } @@ -277,83 +271,67 @@ void DoRaidersUpdate() --nRaiderCount; if (sRaiderP->nColumn == 1){ - // battlestart hit -- lose // draw a blank screen during the tune - sRaiderA.bAttacking = FALSE; - sRaiderB.bAttacking = FALSE; - nCurrentMissileRow = -1; - SpaceAlert_ClearScreen(); - SpaceAlert_StopRaiderSound(); - SpaceAlert_PlaySound(SPACEALERT_SOUND_LOSE, PLAYSOUNDFLAGS_PRIORITY); - bGameOver = TRUE; - bWin = FALSE; + cleanall(); + fsm = FSM_LOSE; return; } - else if (nRaiderCount <= 0){ - + if (nRaiderCount <= 0){ // no more raiders -- win // draw a blank screen during the tune - sRaiderA.bAttacking = FALSE; - sRaiderB.bAttacking = FALSE; - nCurrentMissileRow = -1; - SpaceAlert_ClearScreen(); - SpaceAlert_StopRaiderSound(); - SpaceAlert_PlaySound(SPACEALERT_SOUND_WIN, PLAYSOUNDFLAGS_PRIORITY); - bGameOver = TRUE; - bWin = TRUE; + cleanall(); + fsm = FSM_WIN; return; - - } else { - // set up next wave - nTimerAttackWave = TIME_ATTACKWAVE; } - + // set up next wave + nTimerAttackWave = TIME_ATTACKWAVE; } // change lanes randomly (don't change on last rows) - if (sRaiderP->nRow < SPACEALERT_BLIP_ROWS - 2){ + // but not in the first wave + if ((nIndexAttackWave > 1) && (sRaiderP->nRow < SPACEALERT_BLIP_ROWS - 2)) { if (Platform_Random(7) == 0){ // can only be in each column once per attack switch(sRaiderP->nColumn){ - case 0: - sRaiderP->bLeftColumn = TRUE; - if ((!sRaiderP->bMidColumn) - && (sOtherRaiderP->nColumn != 1) + case 0: + sRaiderP->bLeftColumn = TRUE; + if ((!sRaiderP->bMidColumn) + && (sOtherRaiderP->nColumn != 1) + && (sRaiderP->nRow != sOtherRaiderP->nRow)) + { + sRaiderP->nColumn = 1; + } + break; + case 1: + sRaiderP->bMidColumn = TRUE; + if (Platform_Random(2)) + { + if ((!sRaiderP->bLeftColumn) + && (sOtherRaiderP->nColumn != 0) && (sRaiderP->nRow != sOtherRaiderP->nRow)) { - sRaiderP->nColumn = 1; + sRaiderP->nColumn = 0; } - break; - case 1: - sRaiderP->bMidColumn = TRUE; - if (Platform_Random(2)) - { - if ((!sRaiderP->bLeftColumn) - && (sOtherRaiderP->nColumn != 0) - && (sRaiderP->nRow != sOtherRaiderP->nRow)) - { - sRaiderP->nColumn = 0; - } - } else { - if ((!sRaiderP->bRightColumn) - && (sOtherRaiderP->nColumn != 2) - && (sRaiderP->nRow != sOtherRaiderP->nRow)) - { - sRaiderP->nColumn = 2; - } - } - break; - case 2: - sRaiderP->bRightColumn = TRUE; - if ((!sRaiderP->bMidColumn) - && (sOtherRaiderP->nColumn != 1) + } else { + if ((!sRaiderP->bRightColumn) + && (sOtherRaiderP->nColumn != 2) && (sRaiderP->nRow != sOtherRaiderP->nRow)) { - sRaiderP->nColumn = 1; + sRaiderP->nColumn = 2; } - break; + } + break; + case 2: + sRaiderP->bRightColumn = TRUE; + if ((!sRaiderP->bMidColumn) + && (sOtherRaiderP->nColumn != 1) + && (sRaiderP->nRow != sOtherRaiderP->nRow)) + { + sRaiderP->nColumn = 1; + } + break; } } } @@ -368,15 +346,14 @@ void DoRaidersUpdate() } else { SpaceAlert_StopRaiderSound(); } - } -void DoHitTest() +static BOOL DoHitTest() { if (nCurrentMissileRow < 0) { // missile is off screen - return; + return FALSE; } for (int i=0; i<2; i++){ @@ -389,63 +366,18 @@ void DoHitTest() && (nColumnSelector == 1)){ // don't count 0 point hits to center column if not fired } else { - // hit a raider sRaiderP->bAttacking = FALSE; - UpdateBlips(); - - // draw the blips field (minus the score) - { - SpaceAlert_ClearScreen(); - Platform_StartDraw(); - - for (int y = 0; y < SPACEALERT_BLIP_ROWS; y++){ - for (int x = 0; x < SPACEALERT_BLIP_COLUMNS; x++){ - SpaceAlert_DrawBlip(Blips[x][y], x, y); - } - } - - Platform_EndDraw(); - } - - - SpaceAlert_PlaySound(SPACEALERT_SOUND_HIT, PLAYSOUNDFLAGS_PRIORITY); - - // add the score - nPoints += (SPACEALERT_BLIP_ROWS-1) - nCurrentMissileRow; - - // recharge the missile - nCurrentMissileRow = SPACEALERT_BLIP_ROWS - 1; - - --nRaiderCount; - - if (nRaiderCount <= 0){ - // no more raiders -- win - // draw a blank screen during the tune - sRaiderA.bAttacking = FALSE; - sRaiderB.bAttacking = FALSE; - nCurrentMissileRow = -1; - SpaceAlert_ClearScreen(); - SpaceAlert_StopRaiderSound(); - SpaceAlert_PlaySound(SPACEALERT_SOUND_WIN, PLAYSOUNDFLAGS_PRIORITY); - bGameOver = TRUE; - bWin = TRUE; - return; - } else { - // set up next wave - nTimerAttackWave = TIME_ATTACKWAVE - ((Platform_Random(4) == 0) ? (TIME_ATTACKWAVE / 2) : 0); - } - - + fsm = FSM_HIT; + return TRUE; } - } } } + return FALSE; } - -void UpdateBlips() +static void UpdateBlips() { // draw the raider blips for (int i=0; i<2; i++){ @@ -463,40 +395,21 @@ void UpdateBlips() && (nCurrentMissileRow >= 0)){ Blips[nColumnSelector][nCurrentMissileRow] = BLIP_BRIGHT; } - } -void PaintGame() -{ - Platform_StartDraw(); - - // draw the blips field - for (int y = 0; y < SPACEALERT_BLIP_ROWS; y++){ - for (int x = 0; x < SPACEALERT_BLIP_COLUMNS; x++){ - SpaceAlert_DrawBlip(Blips[x][y], x, y); - } - } - - // draw the score - if (bPower){ - SpaceAlert_DrawScore(nPoints); - } - - Platform_EndDraw(); -} - - void InitAttack() { + nIndexAttackWave++; + sRaiderA.nRow = -2; sRaiderA.nSlow = Platform_Random(3); - sRaiderA.nColumn = Platform_Random(3); + sRaiderA.nColumn = (nIndexAttackWave > 1) ? Platform_Random(3) : 1; sRaiderA.bAttacking = TRUE; sRaiderA.bLeftColumn = FALSE; sRaiderA.bMidColumn = FALSE; sRaiderA.bRightColumn = FALSE; - if ((Platform_Random(2) == 0) && (nRaiderCount > 1)){ + if((nIndexAttackWave > 1) && (Platform_Random(2) == 0) && (nRaiderCount > 1)){ // dual attack @@ -522,3 +435,100 @@ void InitAttack() } } +static void fsmPlayStartWait() +{ + // allow stick and fire button to be moved + SpaceAlert_GetInputFIRE(NULL); + SpaceAlert_GetInputSTICK(); + + if (bPower){ + fsm = FSM_INPLAY; + } +} + +static void fsmInPlay() +{ + // get the current stick position + nColumnSelector = SpaceAlert_GetInputSTICK(); + + if(DoHitTest() == TRUE) + return; + DoMissileUpdate(); + if(DoHitTest() == TRUE) + return; + DoRaidersUpdate(); +} + +static void fsmHit() +{ + SpaceAlert_PlaySound(SPACEALERT_SOUND_HIT, PLAYSOUNDFLAGS_PRIORITY); + SpaceAlert_ClearScreen(); + fsm = FSM_SCORE; +} + +static void fsmScore() +{ + + // add the score + nPoints += (SPACEALERT_BLIP_ROWS-1) - nCurrentMissileRow; + + // recharge the missile + nCurrentMissileRow = SPACEALERT_BLIP_ROWS - 1; + + --nRaiderCount; + + if (nRaiderCount <= 0){ + // no more raiders -- win + // draw a blank screen during the tune + cleanall(); + fsm = FSM_WIN; + return; + } + + // set up next wave + nTimerAttackWave = TIME_ATTACKWAVE - ((Platform_Random(4) == 0) ? (TIME_ATTACKWAVE / 2) : 0); + + fsm = FSM_INPLAY; +} + +static void fsmWin() +{ + + if(bGameOver == FALSE) { + bGameOver = TRUE; + SpaceAlert_PlaySound(SPACEALERT_SOUND_WIN, PLAYSOUNDFLAGS_PRIORITY); + } + else { + Blips[0][SPACEALERT_BLIP_ROWS-2] = BLIP_BRIGHT; + Blips[1][SPACEALERT_BLIP_ROWS-2] = BLIP_BRIGHT; + Blips[2][SPACEALERT_BLIP_ROWS-2] = BLIP_BRIGHT; + } +} + +static void fsmLose() +{ + static BOOL bFlash = FALSE; + + if(bGameOver == FALSE) { + bGameOver = TRUE; + SpaceAlert_PlaySound(SPACEALERT_SOUND_LOSE, PLAYSOUNDFLAGS_PRIORITY); + } + else { + if (bFlash) + Blips[1][SPACEALERT_BLIP_ROWS-1] = BLIP_BRIGHT; + bFlash = !bFlash; + } +} + +#define LINE_STEP 20 +void SpaceAlert_Debug(int f) +{ + int w, h; + int y = 0; + SpaceAlert_GetSize(&w, &h); + + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "wave =%d", nTimerAttackWave); + y += LINE_STEP; + debugPrintf(realx(w)+10, realy(y), 0xFFFFFFFF, "index =%d", nIndexAttackWave); + y += LINE_STEP; +} \ No newline at end of file diff --git a/source/game/SpaceAlert.h b/source/game/SpaceAlert.h index 2d27cb7..5eb9502 100644 --- a/source/game/SpaceAlert.h +++ b/source/game/SpaceAlert.h @@ -49,12 +49,13 @@ Website : http://www.peterhirschberg.com #define SPACEALERT_SOUND_LOSE 2 #define SPACEALERT_SOUND_WIN 3 #define SPACEALERT_SOUND_RAIDER 4 +#define SPACEALERT_SOUND_NSOUNDS 5 -void SpaceAlert_Run(); +void SpaceAlert_Run(int tu); void SpaceAlert_PowerOn(); void SpaceAlert_PowerOff(); BOOL SpaceAlert_GetPower(); - +void SpaceAlert_Debug(int f); #endif diff --git a/source/game/SubChase.c b/source/game/SubChase.c index c88c5a1..cce16dd 100644 --- a/source/game/SubChase.c +++ b/source/game/SubChase.c @@ -177,9 +177,6 @@ void SubChase_Run(int tu) } // run the game - - BOOL bHit = FALSE; - BOOL bChange; if (SubChase_GetInputLEFT(&bChange)) { diff --git a/source/game/SubChase.h b/source/game/SubChase.h index 66ceaf0..2737b60 100644 --- a/source/game/SubChase.h +++ b/source/game/SubChase.h @@ -47,8 +47,9 @@ Website : http://www.peterhirschberg.com #define SUBCHASE_SOUND_CHARGE 1 #define SUBCHASE_SOUND_HIT 2 #define SUBCHASE_SOUND_SINK 3 +#define SUBCHASE_SOUND_NSOUNDS 4 -void SubChase_Run(); +void SubChase_Run(int tu); void SubChase_SetSkill(int i); int SubChase_GetSkill(); void SubChase_PowerOn(); diff --git a/source/gear.c b/source/gear.c new file mode 100644 index 0000000..cd164e1 --- /dev/null +++ b/source/gear.c @@ -0,0 +1,68 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "LED_Handled.h" +#include "slide1_png.h" +static GRRLIB_texImg *_gear_slide = NULL; + +void destroy_gear(void) +{ + if(_gear_slide != NULL) { + GRRLIB_FreeTexture(_gear_slide); + _gear_slide = NULL; + } +} + +int draw_gear(int x, int y, int pos) +{ + + int yy; + + if(_gear_slide == NULL) { + _gear_slide = GRRLIB_LoadTexture(slide1_png); + if(_gear_slide == NULL) { + return -1; + } + } + switch(pos) { + case 1: + yy = 3; + break; + case 2: + yy = 19; + break; + case 3: + yy = 37; + break; + case 4: + yy = 53; + break; + default: + yy = -1; + break; + } + + if(yy != -1) + GRRLIB_DrawImg(realx(x), realy(y+yy), _gear_slide, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); + + return 0; +} diff --git a/source/main.c b/source/main.c index e451d8c..30c93d1 100644 --- a/source/main.c +++ b/source/main.c @@ -2,6 +2,10 @@ * LEDhead for Wii * Copyright (C) 2017-2020 Nebiun * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #include #include "LED_Handled.h" #include "Games.h" @@ -24,15 +29,19 @@ #include "WKRD_png.h" #include "WKLU_png.h" -//#define CHECK_PAINTTIME 1 -//#define PRINT_TRACE 1 +f32 _scale_x = 1; +f32 _scale_y = 1; -#ifdef CHECK_PAINTTIME -struct timeval tv1, tv2; -long delta_usec, max_delta; +//#define CHECK_PAINTTIME 1 +//#define PRINT_COUNTER 1 + +#ifdef CHECK_PAINTTIME +static struct timeval tv1, tv2; +static long delta_usec, max_delta; +#endif +#ifdef PRINT_COUNTER +unsigned int counter; #endif - -int trace = 0; static int elapsed = 0; static void timerProc(syswd_t alarm, void *arg) @@ -57,7 +66,7 @@ int main(int argc, char **argv) GRRLIB_texImg *post_screen = NULL; GRRLIB_texImg *next, *prev; GRRLIB_texImg *logo; - u16 btn, last_btn = -1; + u32 btn, last_btn = -1; int help_on = 0; GRRLIB_Init(); @@ -95,9 +104,9 @@ int main(int argc, char **argv) WPAD_ScanPads(); changed = 0; - btn = WPAD_ButtonsHeld(0); + btn = WPAD_ButtonsDown(0); - if(last_btn == -1 || btn != last_btn) { + if((last_btn == -1) || (btn != last_btn)) { last_btn = btn; if(btn & WPAD_BUTTON_A) { @@ -137,10 +146,7 @@ int main(int argc, char **argv) if(delta_usec > max_delta) max_delta = delta_usec; - debugPrintf(300, 60, 0xFFFFFFFF, "run us=%d (max %d)", delta_usec, max_delta); -#endif -#ifdef PRINT_TRACE - debugPrintf(300, 30, 0xFFFFFFFF, "trc=%d", trace); + debugPrintf(realx(game_screen->w)+10, realy(400), 0xFFFFFFFF, "run us=%d (max %d)", delta_usec, max_delta); #endif } #ifdef CHECK_PAINTTIME @@ -152,7 +158,7 @@ int main(int argc, char **argv) delta_usec = tv2.tv_sec - tv1.tv_sec; delta_usec = 1000000 * delta_usec + tv2.tv_usec - tv1.tv_usec; - debugPrintf(300, 90, 0xFFFFFFFF, "paint us=%d", delta_usec); + debugPrintf(realx(game_screen->w)+10, realy(420), 0xFFFFFFFF, "paint us=%d", delta_usec); #endif if(Platform_SoundIsOff()) print_text(realx(0), realy(game_screen->h + 30), 0xFFFFFFFF, "(mute)"); @@ -162,6 +168,9 @@ int main(int argc, char **argv) } Platform_KeyShow(realx(0), realy(game_screen->h + 60), WK_HOME); print_text(realx(0 + 30), realy(game_screen->h + 60), 0xFFFFFFFF, "exit game"); + + if(gCurrentGame->Debug != NULL) + gCurrentGame->Debug(0); GRRLIB_Render(); } gCurrentGame->DeInit(); @@ -231,10 +240,10 @@ int main(int argc, char **argv) print_text(realx(0 + 30), realy(game_screen->h + 90), 0xFFFFFFFF, "for keys map"); if(help_on == 1 && gCurrentGame->Help != NULL) gCurrentGame->Help(); -#ifdef PRINT_TRACE - debugPrintf(300, 30, 0xFFFFFFFF, "trc=%d",trace); -#endif } +#ifdef PRINT_COUNTER + debugPrintf(realx(240)+10, realy(340), 0xFFFFFFFF, "%08d %d",counter++,btn); +#endif GRRLIB_Render(); } diff --git a/source/platform/Platform.c b/source/platform/Platform.c index 89dd6a0..5b62fa9 100644 --- a/source/platform/Platform.c +++ b/source/platform/Platform.c @@ -132,6 +132,9 @@ void Platform_StopSound() ASND_StopVoice(0); } +// Wii input code +#define WPAD_BUTTON_DIRECTION_MASK (WPAD_BUTTON_UP|WPAD_BUTTON_DOWN|WPAD_BUTTON_LEFT|WPAD_BUTTON_RIGHT) + static u32 btn; static int wpad = 0; @@ -169,37 +172,60 @@ int PlatformSetInput(int pad) return -1; } -int PlatformGetInput() -{ - return wpad; -} - BOOL Platform_GetInputUP() { if(btn & WPAD_BUTTON_B) return 0; - return (btn & WPAD_BUTTON_RIGHT); + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == WPAD_BUTTON_RIGHT); } BOOL Platform_GetInputDOWN() { if(btn & WPAD_BUTTON_B) return 0; - return (btn & WPAD_BUTTON_LEFT); + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == WPAD_BUTTON_LEFT); } BOOL Platform_GetInputLEFT() { if(btn & WPAD_BUTTON_B) return 0; - return (btn & WPAD_BUTTON_UP); + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == WPAD_BUTTON_UP); +} + +BOOL Platform_GetInputLEFTUP() +{ + if(btn & WPAD_BUTTON_B) + return 0; + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == (WPAD_BUTTON_UP|WPAD_BUTTON_RIGHT)); +} + +BOOL Platform_GetInputLEFTDOWN() +{ + if(btn & WPAD_BUTTON_B) + return 0; + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == (WPAD_BUTTON_UP|WPAD_BUTTON_LEFT)); } BOOL Platform_GetInputRIGHT() { if(btn & WPAD_BUTTON_B) return 0; - return (btn & WPAD_BUTTON_DOWN); + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == WPAD_BUTTON_DOWN); +} + +BOOL Platform_GetInputRIGHTUP() +{ + if(btn & WPAD_BUTTON_B) + return 0; + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == (WPAD_BUTTON_DOWN|WPAD_BUTTON_RIGHT)); +} + +BOOL Platform_GetInputRIGHTDOWN() +{ + if(btn & WPAD_BUTTON_B) + return 0; + return ((btn & WPAD_BUTTON_DIRECTION_MASK) == (WPAD_BUTTON_DOWN|WPAD_BUTTON_LEFT)); } BOOL Platform_GetInput2() @@ -230,14 +256,7 @@ BOOL Platform_GetInputMINUS() return (btn & WPAD_BUTTON_MINUS); } -BOOL Platform_GetInputMouseDown() -{ - if(btn & WPAD_BUTTON_B) - return 0; - return (btn & WPAD_BUTTON_A); -} - -int Platform_GetPowerSwitch(int type) +int Platform_GetPowerSwitchPlus(int type, int *extra) { static u32 last_btn = 0; @@ -253,10 +272,16 @@ int Platform_GetPowerSwitch(int type) case ONOFF_OFF12: if(btn & WPAD_BUTTON_UP) { btn &= ~WPAD_BUTTON_UP; + if(extra != NULL) { + *extra = (btn & WPAD_BUTTON_1) ? 1 : 0; + } return -1; } if(btn & WPAD_BUTTON_DOWN) { btn &= ~WPAD_BUTTON_DOWN; + if(extra != NULL) { + *extra = (btn & WPAD_BUTTON_1) ? 1 : 0; + } return 1; } break; @@ -277,6 +302,11 @@ int Platform_GetPowerSwitch(int type) return 0; } +int Platform_GetPowerSwitch(int type) +{ + return Platform_GetPowerSwitchPlus(type, NULL); +} + BOOL Platform_CloseGame() { return (btn & WPAD_BUTTON_HOME); diff --git a/source/platform/Platform.h b/source/platform/Platform.h index 0748c55..ac2a2fc 100644 --- a/source/platform/Platform.h +++ b/source/platform/Platform.h @@ -72,10 +72,15 @@ typedef enum { WK_B, WK_BUD, WK_BLR, + WK_BLR1, WK_PLUS, WK_MINUS, WK_HOME, WK_DPAD, + WK_U, + WK_D, + WK_L, + WK_R, WK_LR, WK_UD, WK_NUMKEY @@ -143,7 +148,11 @@ int PlatformGetInput(); BOOL Platform_GetInputUP(); BOOL Platform_GetInputDOWN(); BOOL Platform_GetInputLEFT(); +BOOL Platform_GetInputLEFTUP(); +BOOL Platform_GetInputLEFTDOWN(); BOOL Platform_GetInputRIGHT(); +BOOL Platform_GetInputRIGHTUP(); +BOOL Platform_GetInputRIGHTDOWN(); BOOL Platform_GetInput1(); BOOL Platform_GetInput2(); BOOL Platform_GetInputPLUS(); @@ -155,6 +164,7 @@ BOOL Platform_GetRealTimeInputPLUS(); BOOL Platform_GetRealTimeInputMINUS(); int Platform_GetPowerSwitch(int type); +int Platform_GetPowerSwitchPlus(int type, int *extra); BOOL Platform_CloseGame(); #endif diff --git a/source/platform/Platform_armorbattle.c b/source/platform/Platform_armorbattle.c index 3b512c3..7bce20a 100644 --- a/source/platform/Platform_armorbattle.c +++ b/source/platform/Platform_armorbattle.c @@ -62,7 +62,7 @@ static GRRLIB_texImg *bmpPowerOn; static BOOL bMineSound = FALSE; static BOOL bMineSoundPlaying = FALSE; -static Sound_t tcWaveRes[7]; +static Sound_t tcWaveRes[ARMORBATTLE_SOUND_NSOUNDS]; static Blip_t blip[ARMORBATTLE_BLIP_COLUMNS][ARMORBATTLE_BLIP_ROWS]; static Stat_t digit[2]; static Help_t help[] = { @@ -85,13 +85,13 @@ void ArmorBattle_Init() int x, y; // Init sounds - Sound_set(&tcWaveRes[0], armorbattle_tick_raw, armorbattle_tick_raw_size, 17 ); - Sound_set(&tcWaveRes[1], armorbattle_near_raw, armorbattle_near_raw_size, 165 ); - Sound_set(&tcWaveRes[2], armorbattle_enemy_raw, armorbattle_enemy_raw_size, 124 ); - Sound_set(&tcWaveRes[3], armorbattle_fire_raw, armorbattle_fire_raw_size, 660 ); - Sound_set(&tcWaveRes[4], armorbattle_hit_raw, armorbattle_hit_raw_size, 524 ); - Sound_set(&tcWaveRes[5], armorbattle_score_raw, armorbattle_score_raw_size, 1542 ); - Sound_set(&tcWaveRes[6], armorbattle_endgame_raw, armorbattle_endgame_raw_size, 5244 ); + Sound_set(&tcWaveRes[ARMORBATTLE_SOUND_TICK], armorbattle_tick_raw, armorbattle_tick_raw_size, 17 ); + Sound_set(&tcWaveRes[ARMORBATTLE_SOUND_NEAR], armorbattle_near_raw, armorbattle_near_raw_size, 165 ); + Sound_set(&tcWaveRes[ARMORBATTLE_SOUND_ENEMY], armorbattle_enemy_raw, armorbattle_enemy_raw_size, 124 ); + Sound_set(&tcWaveRes[ARMORBATTLE_SOUND_FIRE], armorbattle_fire_raw, armorbattle_fire_raw_size, 660 ); + Sound_set(&tcWaveRes[ARMORBATTLE_SOUND_HIT], armorbattle_hit_raw, armorbattle_hit_raw_size, 524 ); + Sound_set(&tcWaveRes[ARMORBATTLE_SOUND_SCORE], armorbattle_score_raw, armorbattle_score_raw_size, 1542 ); + Sound_set(&tcWaveRes[ARMORBATTLE_SOUND_ENDGAME], armorbattle_endgame_raw, armorbattle_endgame_raw_size, 5244 ); // load images bmpScreen = GRRLIB_LoadTexture(armorbattle_screen_png); @@ -129,12 +129,20 @@ void ArmorBattle_Init() } } +void ArmorBattle_StopSound() +{ + bMineSoundPlaying = FALSE; + bMineSound = FALSE; + + // stop all sounds... + Platform_StopSound(); +} + void ArmorBattle_DeInit() { // stop all sounds... - Platform_StopSound(); - bMineSoundPlaying = FALSE; - + ArmorBattle_StopSound(); + ArmorBattle_PowerOff(); GRRLIB_FreeTexture(bmpScreen); GRRLIB_FreeTexture(bmpBlipDim); GRRLIB_FreeTexture(bmpBlipBright); @@ -159,12 +167,12 @@ void ArmorBattle_Paint() ArmorBattle_PowerOn(); } - GRRLIB_DrawImg (realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg (realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power) { - GRRLIB_DrawImg(realx(armorbattle_power_x), realy(armorbattle_power_y), bmpPowerOn, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(armorbattle_power_x), realy(armorbattle_power_y), bmpPowerOn, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // show blips for (y = 0; y < ARMORBATTLE_BLIP_ROWS; y++){ @@ -174,10 +182,10 @@ void ArmorBattle_Paint() case BLIP_OFF: break; case BLIP_DIM: - GRRLIB_DrawImg (realx(pblip->x), realy(pblip->y), bmpBlipDim, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg (realx(pblip->x), realy(pblip->y), bmpBlipDim, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); break; case BLIP_BRIGHT: - GRRLIB_DrawImg (realx(pblip->x), realy(pblip->y), bmpBlipBright, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg (realx(pblip->x), realy(pblip->y), bmpBlipBright, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); break; } } @@ -186,9 +194,9 @@ void ArmorBattle_Paint() // Show time for(x = 0; x < sizeof(digit)/sizeof(*digit); x++) { if(digit[x].val == -1) - GRRLIB_DrawTile(realx(digit[x].x), realy(digit[x].y), bmpDigits, 0, 1, 1, 0xFFFFFFFF, 0); + GRRLIB_DrawTile(realx(digit[x].x), realy(digit[x].y), bmpDigits, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, 0); else - GRRLIB_DrawTile(realx(digit[x].x), realy(digit[x].y), bmpDigits, 0, 1, 1, 0xFFFFFFFF, digit[x].val); + GRRLIB_DrawTile(realx(digit[x].x), realy(digit[x].y), bmpDigits, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, digit[x].val); } } else @@ -237,16 +245,6 @@ void ArmorBattle_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void ArmorBattle_StopSound() -{ - bMineSoundPlaying = FALSE; - bMineSound = FALSE; - - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/Platform_armorbattle.h b/source/platform/Platform_armorbattle.h index 008d289..18fccf4 100644 --- a/source/platform/Platform_armorbattle.h +++ b/source/platform/Platform_armorbattle.h @@ -51,12 +51,6 @@ Website : http://www.peterhirschberg.com // interface that the platform must provide for this game -// Input remapping -#define ARMORBATTLE_KEY_UP -#define ARMORBATTLE_KEY_DOWN -#define ARMORBATTLE_KEY_UP -#define ARMORBATTLE_KEY_UP - // functions exported to the game context void ArmorBattle_Init(); void ArmorBattle_Help(); diff --git a/source/platform/Platform_autorace.c b/source/platform/Platform_autorace.c index 82689d3..de1f33a 100644 --- a/source/platform/Platform_autorace.c +++ b/source/platform/Platform_autorace.c @@ -34,26 +34,11 @@ Website : http://www.peterhirschberg.com */ #include "autorace.h" +#include "slide1_png.h" #include "skislalom_screen_png.h" -#include "skislalom_poweroff_png.h" -#include "skislalom_poweron_png.h" -#include "skislalom_gear1_png.h" -#include "skislalom_gear2_png.h" -#include "skislalom_gear3_png.h" -#include "skislalom_gear4_png.h" -#include "skislalom_aimleft_png.h" -#include "skislalom_aimcenter_png.h" -#include "skislalom_aimright_png.h" +#include "skislalom_slide_png.h" #include "autorace_screen_png.h" -#include "autorace_poweroff_png.h" -#include "autorace_poweron_png.h" -#include "autorace_gear1_png.h" -#include "autorace_gear2_png.h" -#include "autorace_gear3_png.h" -#include "autorace_gear4_png.h" -#include "autorace_aimleft_png.h" -#include "autorace_aimcenter_png.h" -#include "autorace_aimright_png.h" +#include "autorace_slide_png.h" #include "autorace_gear1_raw.h" #include "autorace_gear2_raw.h" #include "autorace_gear3_raw.h" @@ -70,15 +55,8 @@ Website : http://www.peterhirschberg.com #include "skislalom_win_raw.h" // images static GRRLIB_texImg *bmpScreen; -static GRRLIB_texImg *bmpPowerOff; -static GRRLIB_texImg *bmpPowerOn; -static GRRLIB_texImg *bmpGear1; -static GRRLIB_texImg *bmpGear2; -static GRRLIB_texImg *bmpGear3; -static GRRLIB_texImg *bmpGear4; -static GRRLIB_texImg *bmpAimLeft; -static GRRLIB_texImg *bmpAimCenter; -static GRRLIB_texImg *bmpAimRight; +static GRRLIB_texImg *bmpPowerSlide; +static GRRLIB_texImg *bmpSlide; static int nStick = 1; @@ -96,7 +74,7 @@ static BOOL bSkiSlalom = FALSE; static void StartEngineSound(); static void StopEngineSound(); -static Sound_t tcWaveRes[7]; +static Sound_t tcWaveRes[AUTORACE_SOUND_NSOUNDS]; static Blip_t blip[AUTORACE_BLIP_COLUMNS][AUTORACE_BLIP_ROWS]; static Stat_t digit[2]; static Coord_t i_slider, i_power, i_gear; @@ -135,25 +113,18 @@ void SkiSlalom_Init() bSkiSlalom = TRUE; // Init sounds - Sound_set(&tcWaveRes[0], skislalom_gear1_raw, skislalom_gear1_raw_size, 1324); - Sound_set(&tcWaveRes[1], skislalom_gear2_raw, skislalom_gear2_raw_size, 1051); - Sound_set(&tcWaveRes[2], skislalom_gear3_raw, skislalom_gear3_raw_size, 1045); - Sound_set(&tcWaveRes[3], skislalom_gear4_raw, skislalom_gear4_raw_size, 852); - Sound_set(&tcWaveRes[4], skislalom_hit_raw, skislalom_hit_raw_size, 137); - Sound_set(&tcWaveRes[5], skislalom_time_raw, skislalom_time_raw_size, 937); - Sound_set(&tcWaveRes[6], skislalom_win_raw, skislalom_win_raw_size, 1275); + Sound_set(&tcWaveRes[AUTORACE_SOUND_GEAR0], skislalom_gear1_raw, skislalom_gear1_raw_size, 1324); + Sound_set(&tcWaveRes[AUTORACE_SOUND_GEAR1], skislalom_gear2_raw, skislalom_gear2_raw_size, 1051); + Sound_set(&tcWaveRes[AUTORACE_SOUND_GEAR2], skislalom_gear3_raw, skislalom_gear3_raw_size, 1045); + Sound_set(&tcWaveRes[AUTORACE_SOUND_GEAR3], skislalom_gear4_raw, skislalom_gear4_raw_size, 852); + Sound_set(&tcWaveRes[AUTORACE_SOUND_HIT], skislalom_hit_raw, skislalom_hit_raw_size, 137); + Sound_set(&tcWaveRes[AUTORACE_SOUND_TIME], skislalom_time_raw, skislalom_time_raw_size, 937); + Sound_set(&tcWaveRes[AUTORACE_SOUND_WIN], skislalom_win_raw, skislalom_win_raw_size, 1275); // load images bmpScreen = GRRLIB_LoadTexture(skislalom_screen_png); - bmpPowerOff = GRRLIB_LoadTexture(skislalom_poweroff_png); - bmpPowerOn = GRRLIB_LoadTexture(skislalom_poweron_png); - bmpGear1 = GRRLIB_LoadTexture(skislalom_gear1_png); - bmpGear2 = GRRLIB_LoadTexture(skislalom_gear2_png); - bmpGear3 = GRRLIB_LoadTexture(skislalom_gear3_png); - bmpGear4 = GRRLIB_LoadTexture(skislalom_gear4_png); - bmpAimLeft = GRRLIB_LoadTexture(skislalom_aimleft_png); - bmpAimCenter = GRRLIB_LoadTexture(skislalom_aimcenter_png); - bmpAimRight = GRRLIB_LoadTexture(skislalom_aimright_png); + bmpPowerSlide = GRRLIB_LoadTexture(slide1_png); + bmpSlide = GRRLIB_LoadTexture(skislalom_slide_png); // images position i_slider.x = skislalom_slider_x; @@ -211,15 +182,8 @@ void AutoRace_Init() // load images bmpScreen = GRRLIB_LoadTexture(autorace_screen_png); - bmpPowerOff = GRRLIB_LoadTexture(autorace_poweroff_png); - bmpPowerOn = GRRLIB_LoadTexture(autorace_poweron_png); - bmpGear1 = GRRLIB_LoadTexture(autorace_gear1_png); - bmpGear2 = GRRLIB_LoadTexture(autorace_gear2_png); - bmpGear3 = GRRLIB_LoadTexture(autorace_gear3_png); - bmpGear4 = GRRLIB_LoadTexture(autorace_gear4_png); - bmpAimLeft = GRRLIB_LoadTexture(autorace_aimleft_png); - bmpAimCenter = GRRLIB_LoadTexture(autorace_aimcenter_png); - bmpAimRight = GRRLIB_LoadTexture(autorace_aimright_png); + bmpPowerSlide = GRRLIB_LoadTexture(slide1_png); + bmpSlide = GRRLIB_LoadTexture(autorace_slide_png); // images position i_slider.x = autorace_slider_x; @@ -260,22 +224,24 @@ void AutoRace_Init() } } +void AutoRace_StopSound() +{ + bEngineSoundPlaying = FALSE; + bEngineSound = FALSE; + + // stop all sounds... + Platform_StopSound(); +} + void AutoRace_DeInit() { // stop all sounds... - Platform_StopSound(); - - bEngineSoundPlaying = FALSE; + AutoRace_StopSound(); + AutoRace_PowerOff(); GRRLIB_FreeTexture(bmpScreen); - GRRLIB_FreeTexture(bmpPowerOff); - GRRLIB_FreeTexture(bmpPowerOn); - GRRLIB_FreeTexture(bmpGear1); - GRRLIB_FreeTexture(bmpGear2); - GRRLIB_FreeTexture(bmpGear3); - GRRLIB_FreeTexture(bmpGear4); - GRRLIB_FreeTexture(bmpAimLeft); - GRRLIB_FreeTexture(bmpAimCenter); - GRRLIB_FreeTexture(bmpAimRight); + GRRLIB_FreeTexture(bmpPowerSlide); + GRRLIB_FreeTexture(bmpSlide); + destroy_gear(); bInited = FALSE; } @@ -292,42 +258,29 @@ void AutoRace_Paint() AutoRace_PowerOn(); } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // draw gear - switch (AutoRace_GetSkill()) - { - case 0: - GRRLIB_DrawImg(realx(i_gear.x), realy(i_gear.y), bmpGear1, 0, 1, 1, 0xFFFFFFFF); - break; - case 1: - GRRLIB_DrawImg(realx(i_gear.x), realy(i_gear.y), bmpGear2, 0, 1, 1, 0xFFFFFFFF); - break; - case 2: - GRRLIB_DrawImg(realx(i_gear.x), realy(i_gear.y), bmpGear3, 0, 1, 1, 0xFFFFFFFF); - break; - case 3: - GRRLIB_DrawImg(realx(i_gear.x), realy(i_gear.y), bmpGear4, 0, 1, 1, 0xFFFFFFFF); - break; - } + draw_gear(i_gear.x, i_gear.y, 4 - AutoRace_GetSkill()); // Draw stick - switch (nStick) - { + switch (nStick) { case 0: - GRRLIB_DrawImg(realx(i_slider.x), realy(i_slider.y), bmpAimLeft, 0, 1, 1, 0xFFFFFFFF); - break; - case 1: - GRRLIB_DrawImg(realx(i_slider.x), realy(i_slider.y), bmpAimCenter, 0, 1, 1, 0xFFFFFFFF); + x = 2; break; case 2: - GRRLIB_DrawImg(realx(i_slider.x), realy(i_slider.y), bmpAimRight, 0, 1, 1, 0xFFFFFFFF); + x = 27; + break; + case 1: + default: + x = 15; break; } + GRRLIB_DrawImg(realx(i_slider.x+x), realy(i_slider.y), bmpSlide, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // Draw power if (power) { - GRRLIB_DrawImg(realx(i_power.x), realy(i_power.y), bmpPowerOn, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(i_power.x), realy(i_power.y+3), bmpPowerSlide, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); for (y = 0; y < AUTORACE_BLIP_ROWS; y++){ for (x = 0; x < AUTORACE_BLIP_COLUMNS; x++){ if(blip[x][y].status != -1) @@ -338,7 +291,7 @@ void AutoRace_Paint() draw_digit(digit[x].x, digit[x].y, digit[x].val); } else { - GRRLIB_DrawImg(realx(i_power.x), realy(i_power.y), bmpPowerOff, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(i_power.x), realy(i_power.y+16), bmpPowerSlide, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); } } @@ -375,16 +328,6 @@ void AutoRace_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void AutoRace_StopSound() -{ - bEngineSoundPlaying = FALSE; - bEngineSound = FALSE; - - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/Platform_baseball.c b/source/platform/Platform_baseball.c index 59ba5b8..6a161c4 100644 --- a/source/platform/Platform_baseball.c +++ b/source/platform/Platform_baseball.c @@ -38,9 +38,6 @@ Website : http://www.peterhirschberg.com #include "baseball_blip_png.h" #include "baseball_dimdigits_png.h" #include "baseball_brightdigits_png.h" -#include "baseball_poweroff_png.h" -#include "baseball_pro1_png.h" -#include "baseball_pro2_png.h" #include "baseball_hit_raw.h" #include "baseball_out_raw.h" #include "baseball_run_raw.h" @@ -54,17 +51,19 @@ Website : http://www.peterhirschberg.com #define DIGIT_TYPE_OFF 0 #define DIGIT_TYPE_DIM 1 #define DIGIT_TYPE_BRIGHT 2 +int Baseball_errno; + +static BOOL bPower = FALSE; +static BOOL bPro2 = FALSE; +static BOOL bInited = FALSE; // images static GRRLIB_texImg *bmpScreen; static GRRLIB_texImg *bmpBlip; static GRRLIB_texImg *bmpDimDigits; static GRRLIB_texImg *bmpBrightDigits; -static GRRLIB_texImg *bmpPowerOff; -static GRRLIB_texImg *bmpPro1; -static GRRLIB_texImg *bmpPro2; -static Sound_t tcWaveRes[6]; +static Sound_t tcWaveRes[BASEBALL_SOUND_NSOUNDS]; static Digit_t digit[4] = { { baseball_digit1_x, baseball_digit_y, 0, DIGIT_TYPE_OFF}, @@ -73,9 +72,9 @@ static Digit_t digit[4] = { { baseball_digit4_x, baseball_digit_y, 0, DIGIT_TYPE_OFF} }; -// blips for normal pitches -static Blip_t blip_pitch[9] = { - { baseball_blip_pitch_1_x, baseball_blip_pitch_1_y, BLIP_OFF }, +#define N_BLIPS (sizeof(blips)/sizeof(*blips)) +static Blip_t blips[BASEBALL_NBLIPS] = { + { baseball_blip_pitch_1_x, baseball_blip_pitch_1_y, BLIP_OFF }, // 0 blips for normal pitches { baseball_blip_pitch_2_x, baseball_blip_pitch_2_y, BLIP_OFF }, { baseball_blip_pitch_3_x, baseball_blip_pitch_3_y, BLIP_OFF }, { baseball_blip_pitch_4_x, baseball_blip_pitch_4_y, BLIP_OFF }, @@ -83,46 +82,28 @@ static Blip_t blip_pitch[9] = { { baseball_blip_pitch_6_x, baseball_blip_pitch_6_y, BLIP_OFF }, { baseball_blip_pitch_7_x, baseball_blip_pitch_7_y, BLIP_OFF }, { baseball_blip_pitch_8_x, baseball_blip_pitch_8_y, BLIP_OFF }, - { baseball_blip_pitch_9_x, baseball_blip_pitch_9_y, BLIP_OFF } -}; -// blips for curve balls -static Blip_t blip_pitchcurve[4] = { - { baseball_blip_pitchcurve_2_x, baseball_blip_pitchcurve_2_y, BLIP_OFF }, + { baseball_blip_pitch_9_x, baseball_blip_pitch_9_y, BLIP_OFF }, + { baseball_blip_pitchcurve_2_x, baseball_blip_pitchcurve_2_y, BLIP_OFF }, // 9 blips for curve balls { baseball_blip_pitchcurve_3_x, baseball_blip_pitchcurve_3_y, BLIP_OFF }, { baseball_blip_pitchcurve_4_x, baseball_blip_pitchcurve_4_y, BLIP_OFF }, - { baseball_blip_pitchcurve_5_x, baseball_blip_pitchcurve_5_y, BLIP_OFF } -}; -// blips bases -static Blip_t blip_base[4][3] = { - // blips for home plate -> 1st base - {{ baseball_blip_base_0_x,baseball_blip_base_0_y, BLIP_OFF }, - { baseball_blip_base_0A_x,baseball_blip_base_0A_y, BLIP_OFF }, - { baseball_blip_base_0B_x,baseball_blip_base_0B_y, BLIP_OFF }}, - // blips for 1st base -> 2nd base - {{ baseball_blip_base_1_x,baseball_blip_base_1_y, BLIP_OFF }, - { baseball_blip_base_1A_x,baseball_blip_base_1A_y, BLIP_OFF }, - { baseball_blip_base_1B_x,baseball_blip_base_1B_y, BLIP_OFF }}, - {{ baseball_blip_base_2_x,baseball_blip_base_2_y, BLIP_OFF }, - // blips for 2nd base -> 3rd base - { baseball_blip_base_2A_x,baseball_blip_base_2A_y, BLIP_OFF }, - { baseball_blip_base_2B_x,baseball_blip_base_2B_y, BLIP_OFF }}, - // blips for 3rd base -> home plate - {{ baseball_blip_base_3_x,baseball_blip_base_3_y, BLIP_OFF }, - { baseball_blip_base_3A_x,baseball_blip_base_3A_y, BLIP_OFF }, - { baseball_blip_base_3B_x,baseball_blip_base_3B_y, BLIP_OFF }} -}; -// blips deep -static Blip_t blip_deep[2] = { - // blip for deep 1st - { baseball_blip_deep1st_x,baseball_blip_deep1st_y, BLIP_OFF }, - // blip for deep 3rd - { baseball_blip_deep3rd_x,baseball_blip_deep3rd_y, BLIP_OFF } -}; -// blips for outfield -static Blip_t blip_outfield[3] = { - { baseball_blip_outfield_left_x,baseball_blip_outfield_left_y, BLIP_OFF }, + { baseball_blip_pitchcurve_5_x, baseball_blip_pitchcurve_5_y, BLIP_OFF }, + { baseball_blip_base_0_x,baseball_blip_base_0_y, BLIP_OFF }, // 13 blips for home plate -> 1st base + { baseball_blip_base_0A_x,baseball_blip_base_0A_y, BLIP_OFF }, + { baseball_blip_base_0B_x,baseball_blip_base_0B_y, BLIP_OFF }, + { baseball_blip_base_1_x,baseball_blip_base_1_y, BLIP_OFF }, // 16 blips for 1st base -> 2nd base + { baseball_blip_base_1A_x,baseball_blip_base_1A_y, BLIP_OFF }, + { baseball_blip_base_1B_x,baseball_blip_base_1B_y, BLIP_OFF }, + { baseball_blip_base_2_x,baseball_blip_base_2_y, BLIP_OFF }, // 19 blips for 2nd base -> 3rd base + { baseball_blip_base_2A_x,baseball_blip_base_2A_y, BLIP_OFF }, + { baseball_blip_base_2B_x,baseball_blip_base_2B_y, BLIP_OFF }, + { baseball_blip_base_3_x,baseball_blip_base_3_y, BLIP_OFF }, // 22 blips for 3rd base -> home plate + { baseball_blip_base_3A_x,baseball_blip_base_3A_y, BLIP_OFF }, + { baseball_blip_base_3B_x,baseball_blip_base_3B_y, BLIP_OFF }, + { baseball_blip_deep1st_x,baseball_blip_deep1st_y, BLIP_OFF }, // 25 blip for deep 1st + { baseball_blip_deep3rd_x,baseball_blip_deep3rd_y, BLIP_OFF }, // 26 blip for deep 3rd + { baseball_blip_outfield_left_x,baseball_blip_outfield_left_y, BLIP_OFF }, // 27 blips for outfield left { baseball_blip_outfield_center_x,baseball_blip_outfield_center_y, BLIP_OFF }, - { baseball_blip_outfield_right_x,baseball_blip_outfield_right_y, BLIP_OFF } + { baseball_blip_outfield_right_x,baseball_blip_outfield_right_y, BLIP_OFF } // 29 blips for outfield right }; static Help_t help[] = { @@ -135,24 +116,55 @@ static Help_t help[] = { //---------------------------------------------------------------------------- // // +static void Baseball_StopSound() +{ + // stop all sounds... + Platform_StopSound(); +} + void Baseball_Help() { Platform_Help(help, sizeof(help)/sizeof(*help)); } -static BOOL bInited = FALSE; +BOOL Baseball_GetPower() +{ + return bPower; +} + +void Baseball_PowerOn() +{ + bPower = TRUE; +} + +void Baseball_PowerOff() +{ + bPower = FALSE; + Baseball_StopSound(); +} + +void Baseball_SetSkill(int v) +{ + bPro2 = (v == 0) ? FALSE : TRUE; +} + +int Baseball_GetSkill() +{ + return (bPro2 == TRUE) ? 1 : 0; +} void Baseball_Init() { - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], baseball_hit_raw, baseball_hit_raw_size, 82 ); - Sound_set(&tcWaveRes[1], baseball_out_raw, baseball_out_raw_size, 392 ); - Sound_set(&tcWaveRes[2], baseball_run_raw, baseball_run_raw_size, 423 ); - Sound_set(&tcWaveRes[3], baseball_strike_raw, baseball_strike_raw_size, 22 ); - Sound_set(&tcWaveRes[4], baseball_endpossession_raw, baseball_endpossession_raw_size, 560 ); - Sound_set(&tcWaveRes[5], baseball_endgame_raw, baseball_endgame_raw_size, 712 ); + Sound_set(&tcWaveRes[BASEBALL_SOUND_HIT], baseball_hit_raw, baseball_hit_raw_size, 82 ); + Sound_set(&tcWaveRes[BASEBALL_SOUND_OUT], baseball_out_raw, baseball_out_raw_size, 392 ); + Sound_set(&tcWaveRes[BASEBALL_SOUND_RUN], baseball_run_raw, baseball_run_raw_size, 423 ); + Sound_set(&tcWaveRes[BASEBALL_SOUND_STRIKE], baseball_strike_raw, baseball_strike_raw_size, 22 ); + Sound_set(&tcWaveRes[BASEBALL_SOUND_ENDPOSSESSION], baseball_endpossession_raw, baseball_endpossession_raw_size, 560 ); + Sound_set(&tcWaveRes[BASEBALL_SOUND_ENDGAME], baseball_endgame_raw, baseball_endgame_raw_size, 712 ); // load images bmpScreen = GRRLIB_LoadTexture(baseball_screen_png); @@ -162,15 +174,10 @@ void Baseball_Init() bmpBrightDigits = GRRLIB_LoadTexture(baseball_brightdigits_png); GRRLIB_InitTileSet(bmpBrightDigits, DIGIT_W, DIGIT_H, 0); - // set up the power switch images - bmpPowerOff = GRRLIB_LoadTexture(baseball_poweroff_png); - bmpPro1 = GRRLIB_LoadTexture(baseball_pro1_png); - bmpPro2 = GRRLIB_LoadTexture(baseball_pro2_png); - PlatformSetInput(0); // turn on the game - Baseball_SetSkill(0); - Baseball_PowerOn(); + bPro2 = FALSE; + bPower = FALSE; bInited = TRUE; } @@ -178,100 +185,70 @@ void Baseball_Init() void Baseball_DeInit() { // stop all sounds... - Platform_StopSound(); + Baseball_StopSound(); + bPower = FALSE; GRRLIB_FreeTexture(bmpScreen); GRRLIB_FreeTexture(bmpBlip); GRRLIB_FreeTexture(bmpDimDigits); GRRLIB_FreeTexture(bmpBrightDigits); - GRRLIB_FreeTexture(bmpPowerOff); - GRRLIB_FreeTexture(bmpPro1); - GRRLIB_FreeTexture(bmpPro2); - bInited = FALSE; } void Baseball_Paint() { - int i; - BOOL power = Baseball_GetPower(); - BOOL skill = Baseball_GetSkill(); int p_switch; p_switch = Platform_GetPowerSwitch(ONOFF_OFF12); - if(power) { + if(bPower) { if(p_switch == -1) { - if(skill == 0) - Baseball_PowerOff(); - if(skill == 1) { - Baseball_PowerOn(); - Baseball_SetSkill(0); + if(bPro2 == FALSE) + bPower = FALSE; + if(bPro2 == TRUE) { + bPower = TRUE; + bPro2 = FALSE; } } if(p_switch == 1) { - if(skill == 0) { - Baseball_PowerOn(); - Baseball_SetSkill(1); + if(bPro2 == 0) { + bPower = TRUE; + bPro2 = TRUE; } } } else { if(p_switch == 1) { - Baseball_PowerOn(); - Baseball_SetSkill(0); + bPower = TRUE; + bPro2 = FALSE; } } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); - if (power) - { - if (skill == 0) - { - GRRLIB_DrawImg(realx(baseball_pro_1_x), realy(baseball_pro_1_y), bmpPro1, 0, 1, 1, 0xFFFFFFFF); + if (bPower == TRUE) { + int i; + if (bPro2 == FALSE) { + draw_switch(SWITCH_TYPE_1, baseball_pro_1_x, baseball_pro_1_y, SWITCH_POS_PRO1); } else { - GRRLIB_DrawImg(realx(baseball_pro_2_x), realy(baseball_pro_2_y), bmpPro2, 0, 1, 1, 0xFFFFFFFF); + draw_switch(SWITCH_TYPE_1, baseball_pro_1_x, baseball_pro_1_y, SWITCH_POS_PRO2); } // show blips - for(i=0; i<9; i++) { - Blip_t *pblip = &blip_pitch[i]; + for(i=0; i< BASEBALL_NBLIPS; i++) { + Blip_t *pblip = &blips[i]; if(pblip->status != BLIP_OFF) - GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlip, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlip, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); } - for(i=0; i<4; i++) { - Blip_t *pblip = &blip_pitchcurve[i]; - if(pblip->status != BLIP_OFF) - GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlip, 0, 1, 1, 0xFFFFFFFF); - } - for(i=0; i<4; i++) { - int j; - for(j=0; j<3; j++) { - Blip_t *pblip = &blip_base[i][j]; - if(pblip->status != BLIP_OFF) - GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlip, 0, 1, 1, 0xFFFFFFFF); - } - } - for(i=0; i<2; i++) { - Blip_t *pblip = &blip_deep[i]; - if(pblip->status != BLIP_OFF) - GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlip, 0, 1, 1, 0xFFFFFFFF); - } - for(i=0; i<3; i++) { - Blip_t *pblip = &blip_outfield[i]; - if(pblip->status != BLIP_OFF) - GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlip, 0, 1, 1, 0xFFFFFFFF); - } - + // show digits for(i=0; i<4; i++) { Digit_t *pdigit = &digit[i]; switch(pdigit->type) { case DIGIT_TYPE_DIM: - GRRLIB_DrawTile(realx(pdigit->x), realy(pdigit->y), bmpDimDigits, 0, 1, 1, 0xFFFFFFFF, pdigit->val + 1); + GRRLIB_DrawTile(realx(pdigit->x), realy(pdigit->y), bmpDimDigits, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, pdigit->val + 1); break; case DIGIT_TYPE_BRIGHT: - GRRLIB_DrawTile(realx(pdigit->x), realy(pdigit->y), bmpBrightDigits, 0, 1, 1, 0xFFFFFFFF, pdigit->val + 1); + GRRLIB_DrawTile(realx(pdigit->x), realy(pdigit->y), bmpBrightDigits, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, pdigit->val + 1); break; case DIGIT_TYPE_OFF: default: @@ -279,9 +256,9 @@ void Baseball_Paint() } } } - else - { - GRRLIB_DrawImg(realx(baseball_power_off_x), realy(baseball_power_off_y), bmpPowerOff, 0, 1, 1, 0xFFFFFFFF); + else { + Baseball_StopSound(); + draw_switch(SWITCH_TYPE_1, baseball_pro_1_x, baseball_pro_1_y, SWITCH_POS_OFF); } } @@ -290,131 +267,12 @@ void Baseball_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void Baseball_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // - -void Baseball_DrawPitchBlip(BOOL state, int index, BOOL curve) +void Baseball_DrawBlip(BOOL state, int index) { - Blip_t *pblip = NULL; - - switch(index) - { - case 0: - default: - pblip = &blip_pitch[0]; - break; - case 1: - if (curve) - pblip = &blip_pitchcurve[0]; - else - pblip = &blip_pitch[1]; - break; - case 2: - if (curve) - pblip = &blip_pitchcurve[1]; - else - pblip = &blip_pitch[2]; - break; - case 3: - if (curve) - pblip = &blip_pitchcurve[2]; - else - pblip = &blip_pitch[3]; - break; - case 4: - if (curve) - pblip = &blip_pitchcurve[3]; - else - pblip = &blip_pitch[4]; - break; - case 5: - pblip = &blip_pitch[5]; - break; - case 6: - pblip = &blip_pitch[6]; - break; - case 7: - pblip = &blip_pitch[7]; - break; - case 8: - pblip = &blip_pitch[8]; - break; - } - - if (pblip != NULL ) - { - pblip->status = (state) ? BLIP_DIM : BLIP_OFF; - } -} - -void Baseball_DrawBaseBlip(BOOL state, int index) -{ - Blip_t *pblip = NULL; - - switch(index) - { - case 12: - case 0: // home plate - pblip = &blip_base[0][0]; - break; - case 1: - pblip = &blip_base[0][1]; - break; - case 2: - pblip = &blip_base[0][2]; - break; - case 3: // 1st base - pblip = &blip_base[1][0]; - break; - case 4: - pblip = &blip_base[1][1]; - break; - case 5: - pblip = &blip_base[1][2]; - break; - case 6: // 2nd base - pblip = &blip_base[2][0]; - break; - case 7: - pblip = &blip_base[2][1]; - break; - case 8: - pblip = &blip_base[2][2]; - break; - case 9: // 3rd - pblip = &blip_base[3][0]; - break; - case 10: - pblip = &blip_base[3][1]; - break; - case 11: - pblip = &blip_base[3][2]; - break; - } - if (pblip != NULL ) - { - pblip->status = (state) ? BLIP_DIM : BLIP_OFF; - } -} - -void Baseball_DrawOutfieldBlip(BOOL state, int index) -{ - Blip_t *pblip = &blip_outfield[index]; - - pblip->status = (state) ? BLIP_DIM : BLIP_OFF; -} - -void Baseball_DrawDeepBlip(BOOL state, int index) -{ - Blip_t *pblip = &blip_deep[index]; + Blip_t *pblip = &blips[index]; pblip->status = (state) ? BLIP_DIM : BLIP_OFF; } @@ -513,8 +371,8 @@ void Baseball_DrawFireWorks(void) int i; for(i=0; i <4; i++) { - digit[i].val = -1; - digit[i].type = (i == 1) ? DIGIT_TYPE_BRIGHT : DIGIT_TYPE_DIM; + digit[i].val = (i == 1) ? 10 : -1; + digit[i].type = DIGIT_TYPE_DIM; } } @@ -591,7 +449,7 @@ BOOL Baseball_GetInputRUN(BOOL *pChange) if (pChange){ *pChange = FALSE; } // check the keys - if (Platform_GetInput1()) + if (Platform_GetRealTimeInput1()) // NOTE: gets realtime key state { if (!bLast && pChange) { diff --git a/source/platform/Platform_baseball.h b/source/platform/Platform_baseball.h index 7104d35..b07edb5 100644 --- a/source/platform/Platform_baseball.h +++ b/source/platform/Platform_baseball.h @@ -53,37 +53,37 @@ Website : http://www.peterhirschberg.com #define baseball_digit_h 9 // blips for normal pitches -#define baseball_blip_pitch_1_x 118 +#define baseball_blip_pitch_1_x 117 #define baseball_blip_pitch_1_y 151 -#define baseball_blip_pitch_2_x 118 +#define baseball_blip_pitch_2_x baseball_blip_pitch_1_x #define baseball_blip_pitch_2_y 167 -#define baseball_blip_pitch_3_x 118 +#define baseball_blip_pitch_3_x baseball_blip_pitch_1_x #define baseball_blip_pitch_3_y 182 -#define baseball_blip_pitch_4_x 118 +#define baseball_blip_pitch_4_x baseball_blip_pitch_1_x #define baseball_blip_pitch_4_y 197 -#define baseball_blip_pitch_5_x 118 +#define baseball_blip_pitch_5_x baseball_blip_pitch_1_x #define baseball_blip_pitch_5_y 211 -#define baseball_blip_pitch_6_x 118 +#define baseball_blip_pitch_6_x baseball_blip_pitch_1_x #define baseball_blip_pitch_6_y 225 -#define baseball_blip_pitch_7_x 118 +#define baseball_blip_pitch_7_x baseball_blip_pitch_1_x #define baseball_blip_pitch_7_y 236 -#define baseball_blip_pitch_8_x 118 +#define baseball_blip_pitch_8_x baseball_blip_pitch_1_x #define baseball_blip_pitch_8_y 248 -#define baseball_blip_pitch_9_x 118 +#define baseball_blip_pitch_9_x baseball_blip_pitch_1_x #define baseball_blip_pitch_9_y 256 // blips for curve balls #define baseball_blip_pitchcurve_2_x 123 -#define baseball_blip_pitchcurve_2_y 166 +#define baseball_blip_pitchcurve_2_y 167 #define baseball_blip_pitchcurve_3_x 125 -#define baseball_blip_pitchcurve_3_y 181 +#define baseball_blip_pitchcurve_3_y 182 #define baseball_blip_pitchcurve_4_x 125 -#define baseball_blip_pitchcurve_4_y 196 +#define baseball_blip_pitchcurve_4_y 197 #define baseball_blip_pitchcurve_5_x 123 -#define baseball_blip_pitchcurve_5_y 210 +#define baseball_blip_pitchcurve_5_y 211 // home plate -> 1st base -#define baseball_blip_base_0_x 118 +#define baseball_blip_base_0_x baseball_blip_pitch_1_x #define baseball_blip_base_0_y 236 #define baseball_blip_base_0A_x 138 #define baseball_blip_base_0A_y 215 @@ -130,22 +130,36 @@ Website : http://www.peterhirschberg.com #define baseball_blip_outfield_right_x 184 #define baseball_blip_outfield_right_y 85 -// interface that the platform must provide for this game +#define NORMAL_BALL(x) (x) +#define CURVE_BALL(x) (((x)>=1 && (x)<=4) ? ((x)-1+9) : NORMAL_BALL(x)) +#define HOME_PLATE 13 +#define BASE(x) (HOME_PLATE+(3*(x))) +#define DIAMOND(x) (HOME_PLATE+(x)) +#define DEEP_1ST 25 +#define DEEP_3RD 26 +#define OUT_LEFT 27 +#define OUT_CENTER 28 +#define OUT_RIGHT 29 -// functions exported to the game context +#define BASEBALL_NBLIPS (OUT_RIGHT+1) + +// interface that the platform must provide for this game void Baseball_Init(); void Baseball_Help(); void Baseball_DeInit(); void Baseball_Paint(); -void Baseball_PlaySound(int nSound, unsigned int nFlags); -void Baseball_StopSound(); void Baseball_GetSize(int *w, int *h); +void Baseball_SetSkill(int i); +int Baseball_GetSkill(); +void Baseball_PowerOn(); +void Baseball_PowerOff(); +int Baseball_GetPower(); + +// functions exported to the game context +void Baseball_PlaySound(int nSound, unsigned int nFlags); // "private" functions not exported to game context -void Baseball_DrawPitchBlip(BOOL state, int index, BOOL curve); -void Baseball_DrawBaseBlip(BOOL state, int index); -void Baseball_DrawOutfieldBlip(BOOL state, int index); -void Baseball_DrawDeepBlip(BOOL state, int index); +void Baseball_DrawBlip(BOOL state, int index); void Baseball_DrawStats(int innings, int outs, int balls, int strikes, BOOL bHomeTeam); void Baseball_DrawScore(int vruns, int hruns); diff --git a/source/platform/Platform_basketball.c b/source/platform/Platform_basketball.c index 57dc873..89cbe39 100644 --- a/source/platform/Platform_basketball.c +++ b/source/platform/Platform_basketball.c @@ -45,7 +45,7 @@ Website : http://www.peterhirschberg.com // images static GRRLIB_texImg *bmpScreen; -static Sound_t tcWaveRes[6]; +static Sound_t tcWaveRes[BASKETBALL_SOUND_NSOUNDS]; static Blip_t blip[BASKETBALL_BLIP_COLUMNS][BASKETBALL_BLIP_ROWS]; static Blip_t basket; static Stat_t digit[2]; @@ -68,15 +68,16 @@ void Basketball_Init() { int x, y; - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], basketball_tick_raw, basketball_tick_raw_size, 27); - Sound_set(&tcWaveRes[1], basketball_bounce_raw, basketball_bounce_raw_size, 50); - Sound_set(&tcWaveRes[2], basketball_score_raw, basketball_score_raw_size, 799); - Sound_set(&tcWaveRes[3], basketball_endplay_raw, basketball_endplay_raw_size, 721); - Sound_set(&tcWaveRes[4], basketball_endquarter_raw, basketball_endquarter_raw_size, 1878); - Sound_set(&tcWaveRes[5], basketball_endgame_raw, basketball_endgame_raw_size, 3753); + Sound_set(&tcWaveRes[BASKETBALL_SOUND_TICK], basketball_tick_raw, basketball_tick_raw_size, 27); + Sound_set(&tcWaveRes[BASKETBALL_SOUND_BOUNCE], basketball_bounce_raw, basketball_bounce_raw_size, 50); + Sound_set(&tcWaveRes[BASKETBALL_SOUND_SCORE], basketball_score_raw, basketball_score_raw_size, 799); + Sound_set(&tcWaveRes[BASKETBALL_SOUND_ENDPLAY], basketball_endplay_raw, basketball_endplay_raw_size, 721); + Sound_set(&tcWaveRes[BASKETBALL_SOUND_ENDQUARTER], basketball_endquarter_raw, basketball_endquarter_raw_size, 1878); + Sound_set(&tcWaveRes[BASKETBALL_SOUND_ENDGAME], basketball_endgame_raw, basketball_endgame_raw_size, 3753); // load images bmpScreen = GRRLIB_LoadTexture(basketball_screen_png); @@ -109,10 +110,17 @@ void Basketball_Init() bInited = TRUE; } -void Basketball_DeInit() +void Basketball_StopSound() { // stop all sounds... Platform_StopSound(); +} + +void Basketball_DeInit() +{ + // stop all sounds... + Basketball_StopSound(); + Basketball_PowerOff(); GRRLIB_FreeTexture(bmpScreen); bInited = FALSE; } @@ -144,14 +152,14 @@ void Basketball_Paint() } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power){ if (skill == 0){ - draw_poweroff_a(basketball_pro_1_x, basketball_pro_1_y, POWER_POS_MODE1); + draw_switch(SWITCH_TYPE_2,basketball_pro_1_x, basketball_pro_1_y, SWITCH_POS_MODE1); } else { - draw_poweroff_a(basketball_pro_2_x, basketball_pro_2_y, POWER_POS_MODE2); + draw_switch(SWITCH_TYPE_2,basketball_pro_1_x, basketball_pro_1_y, SWITCH_POS_MODE2); } for (y = 0; y < BASKETBALL_BLIP_ROWS; y++){ @@ -168,7 +176,7 @@ void Basketball_Paint() draw_digit(digit[x].x, digit[x].y, digit[x].val); } else { - draw_poweroff_a(basketball_power_off_x, basketball_power_off_y, POWER_POS_OFF); + draw_switch(SWITCH_TYPE_2,basketball_pro_1_x, basketball_pro_1_y, SWITCH_POS_OFF); } } @@ -196,13 +204,6 @@ void Basketball_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void Basketball_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/Platform_basketball2.c b/source/platform/Platform_basketball2.c new file mode 100644 index 0000000..b0af075 --- /dev/null +++ b/source/platform/Platform_basketball2.c @@ -0,0 +1,507 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "Basketball2.h" +#include "Basketball2_screen_png.h" +#include "Basketball2_3secs_raw.h" +#include "Basketball2_bounce_raw.h" +#include "Basketball2_endgame_raw.h" +#include "Basketball2_endplay_raw.h" +#include "Basketball2_endquarter_raw.h" +#include "Basketball2_foul_raw.h" +#include "Basketball2_freethrow_raw.h" +#include "Basketball2_overtime_raw.h" +#include "Basketball2_score_raw.h" +#include "Basketball2_score3_raw.h" +#include "Basketball2_tick_raw.h" + +// images +static GRRLIB_texImg *bmpScreen; + +static Sound_t tcWaveRes[BASKETBALL2_SOUND_NSOUNDS]; +static Blip_t blip[BASKETBALL2_BLIP_COLUMNS][BASKETBALL2_BLIP_ROWS]; +static Blip_t basket; +static Stat_t digit[2]; +static Help_t help[] = { + { WK_U, { 33, 179} }, + { WK_L, { 33, 205} }, + { WK_R, { 33, 232} }, + { WK_1, { 87, 175} }, + { WK_2, { 175, 175} }, + { WK_BLR1, {10, 268} }, + { WK_DPAD, { 128, 231} } +}; +//---------------------------------------------------------------------------- +// +// +void Basketball2_Help() +{ + Platform_Help(help, sizeof(help)/sizeof(*help)); +} + +static BOOL bInited = FALSE; + +void Basketball2_Init() +{ + int x, y; + + if (bInited) + return; + + // Init sounds + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_TICK], basketball2_tick_raw, basketball2_tick_raw_size, 8); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_BOUNCE], basketball2_bounce_raw, basketball2_bounce_raw_size, 37); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_SCORE], basketball2_score_raw, basketball2_score_raw_size, 1153); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_ENDPLAY], basketball2_endplay_raw, basketball2_endplay_raw_size, 1061); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_ENDQUARTER], basketball2_endquarter_raw, basketball2_endquarter_raw_size, 1400); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_ENDGAME], basketball2_endgame_raw, basketball2_endgame_raw_size, 2823); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_SCORE3], basketball2_score3_raw, basketball2_score3_raw_size, 2003); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_FOUL], basketball2_foul_raw, basketball2_foul_raw_size, 0); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_3SECS], basketball2_3secs_raw, basketball2_3secs_raw_size, 687); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_FREETHROW], basketball2_freethrow_raw, basketball2_freethrow_raw_size, 608); + Sound_set(&tcWaveRes[BASKETBALL2_SOUND_OVERTIME], basketball2_overtime_raw, basketball2_overtime_raw_size, 3007); + + // load images + bmpScreen = GRRLIB_LoadTexture(basketball2_screen_png); + + // set blips + for (y = 0; y < BASKETBALL2_BLIP_ROWS; y++){ + for (x = 0; x < BASKETBALL2_BLIP_COLUMNS; x++){ + Blip_t *pblip = &blip[x][y]; + + pblip->x = (x * basketball2_blip_xspacing) + basketball2_blip_x; + pblip->y = (y * basketball2_blip_yspacing) + basketball2_blip_y; + pblip->status = -1; + } + } + basket.x = basketball2_basket_x; + basket.y = basketball2_basket_y; + basket.status = -1; + + // set digits + for(x = 0; x < 2; x++) { + digit[x].x = basketball2_digit_x + x * basketball2_digit_spacing; + digit[x].y = basketball2_digit_y; + } + + PlatformSetInput(0); + // turn on the game + Basketball2_SetSkill(LVL_HIGHSCHOOL); + Basketball2_PowerOn(); + + bInited = TRUE; +} + +void Basketball2_StopSound() +{ + // stop all sounds... + Platform_StopSound(); +} + +void Basketball2_DeInit() +{ + // stop all sounds... + Basketball2_StopSound(); + Basketball2_PowerOff(); + GRRLIB_FreeTexture(bmpScreen); + bInited = FALSE; +} + +void Basketball2_Paint() +{ + int x, y, extra; + BOOL power = Basketball2_GetPower(); + int skill = Basketball2_GetSkill(); + int p_switch; + p_switch = Platform_GetPowerSwitchPlus(ONOFF_OFF12, &extra); + if(power) { + if(p_switch == -1) { + if(skill%2 == 0) + Basketball2_PowerOff(); + if(skill%2 == 1) { + Basketball2_PowerOn(); + Basketball2_SetSkill((extra == 0) ? LVL_HIGHSCHOOL : LVL_ALLSTAR); + } + } + if(p_switch == 1) { + if(skill%2 == 0) { + Basketball2_PowerOn(); + Basketball2_SetSkill((extra == 0) ? LVL_COLLAGE : LVL_PROFESSIONAL); + } + } + } + else { + if(p_switch == 1) { + Basketball2_PowerOn(); + Basketball2_SetSkill((extra == 0) ? LVL_HIGHSCHOOL : LVL_ALLSTAR); + } + } + + // paint the backdrop + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); + + // visualize the control states + if (power){ + if (skill%2 == 0){ + draw_switch(SWITCH_TYPE_4, basketball2_power_off_x, basketball2_power_off_y, SWITCH_POS_PRO1); + } else { + draw_switch(SWITCH_TYPE_4, basketball2_power_off_x, basketball2_power_off_y, SWITCH_POS_PRO2); + } + + for (y = 0; y < BASKETBALL2_BLIP_ROWS; y++){ + for (x = 0; x < BASKETBALL2_BLIP_COLUMNS; x++){ + Blip_t *pblip = &blip[x][y]; + + if(pblip->status != -1) + draw_oblip(pblip->x, pblip->y, pblip->status); + } + } + if(basket.status != -1) + draw_oblip(basket.x, basket.y, basket.status); + for(x = 0; x < 2; x++) + draw_digit(digit[x].x, digit[x].y, digit[x].val); + } + else { + draw_switch(SWITCH_TYPE_4, basketball2_power_off_x, basketball2_power_off_y, SWITCH_POS_OFF); + } +} + +void Basketball2_ClearScreen() +{ + Platform_StartDraw(); + + // erase the blips + for (int y = 0; y < BASKETBALL2_BLIP_ROWS; y++){ + for (int x = 0; x < BASKETBALL2_BLIP_COLUMNS; x++){ + Basketball2_DrawBlip(BLIP_OFF, x, y); + } + } + + Basketball2_DrawBasket(FALSE); + + // erase the stat display + Basketball2_DrawStat(-1); + + Platform_EndDraw(); +} + +void Basketball2_PlaySound(int nSound, unsigned int nFlags) +{ + Platform_PlaySound(&tcWaveRes[nSound], nFlags); +} + +//---------------------------------------------------------------------------- +// local fcn's +// + +void Basketball2_DrawBlip(int nBright, int x, int y) +{ + switch(nBright){ + case BLIP_DIM: + blip[x][y].status = BLIP_TYPE_NORMAL; + break; + case BLIP_BRIGHT: + blip[x][y].status = BLIP_TYPE_BRIGHT; + break; + case BLIP_OFF: + default: + blip[x][y].status = -1; + break; + } +} + +void Basketball2_DrawStat(int nStat) +{ + if (nStat == -1){ + // erase the display + digit[0].val = -1; + digit[1].val = -1; + } else { + // draw 10s place + digit[0].val = nStat/10; + // draw 1s place + digit[1].val = nStat%10; + } +} + +void Basketball2_DrawBasket(BOOL bBasket) +{ + Platform_StartDraw(); + + if (bBasket) + { + int x, y; + + // erase the blips + for (y = 0; y < BASKETBALL2_BLIP_ROWS; y++){ + for (x = 0; x < BASKETBALL2_BLIP_COLUMNS; x++){ + Basketball2_DrawBlip(BLIP_OFF, x, y); + } + } + // draw the basket + basket.status = BLIP_TYPE_BRIGHT; + } + else + { + // erase the basket + basket.status = -1; + } + + Platform_EndDraw(); +} + +BOOL Basketball2_GetInputLEFTUP(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputLEFTUP()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputLEFTDOWN(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputLEFTDOWN()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputLEFT(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputLEFT()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputRIGHTUP(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputRIGHTUP()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputRIGHTDOWN(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputRIGHTDOWN()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputRIGHT(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputRIGHT()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputUP(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputUP()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputDOWN(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputDOWN()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputSHOOT(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInput2()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_GetInputPASS(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInput1()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Basketball2_TestForMovement() +{ + // check the keys + if ( + /* Platform_GetInputLEFTUP() || + Platform_GetInputLEFTDOWN() || + Platform_GetInputRIGHTUP() || + Platform_GetInputRIGHTDOWN() || */ + Platform_GetInputLEFT() || + Platform_GetInputUP() || + Platform_GetInputRIGHT() || + Platform_GetInputDOWN() || + Platform_GetInput2() || + Platform_GetInput1()) + { + return TRUE; + } + + return FALSE; +} + +void Basketball2_GetSize(int *w, int *h) +{ + *w = bmpScreen->w; + *h = bmpScreen->h; +} diff --git a/source/platform/Platform_basketball2.h b/source/platform/Platform_basketball2.h new file mode 100644 index 0000000..e9eb47f --- /dev/null +++ b/source/platform/Platform_basketball2.h @@ -0,0 +1,76 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __PLATFORM_BASKETBALL2_H__ +#define __PLATFORM_BASKETBALL2_H__ + +// [general] +#define basketball2_digit_spacing 12 +#define basketball2_digit_x 112 +#define basketball2_digit_y 7 +#define basketball2_digit_w 8 +#define basketball2_digit_h 9 +#define basketball2_blip_xspacing 22 +#define basketball2_blip_yspacing 21 +#define basketball2_blip_x 52 +#define basketball2_blip_y 42 +#define basketball2_power_off_x 29 +#define basketball2_power_off_y 269 +#define basketball2_basket_x 118 +#define basketball2_basket_y 24 + +// Skills +#define LVL_HIGHSCHOOL 0 // Pro1 +#define LVL_COLLAGE 1 // Pro2 +#define LVL_ALLSTAR 2 // Pro1 + Man button +#define LVL_PROFESSIONAL 3 // Pro2 + Man button + +// interface that the platform must provide for this game + +// functions exported to the game context +void Basketball2_Init(); +void Basketball2_Help(); +void Basketball2_DeInit(); +void Basketball2_Paint(); +void Basketball2_ClearScreen(); +void Basketball2_PlaySound(int nSound, unsigned int nFlags); +void Basketball2_StopSound(); +void Basketball2_GetSize(int *w, int *h); + +// "private" functions not exported to game context +void Basketball2_DrawBlip(int nBright, int x, int y); +void Basketball2_DrawStat(int nStat); +void Basketball2_DrawBasket(BOOL bBasket); + +BOOL Basketball2_GetInputLEFT(BOOL *pChange); +BOOL Basketball2_GetInputLEFTUP(BOOL *pChange); +BOOL Basketball2_GetInputLEFTDOWN(BOOL *pChange); +BOOL Basketball2_GetInputRIGHT(BOOL *pChange); +BOOL Basketball2_GetInputRIGHTUP(BOOL *pChange); +BOOL Basketball2_GetInputRIGHTDOWN(BOOL *pChange); +BOOL Basketball2_GetInputUP(BOOL *pChange); +BOOL Basketball2_GetInputDOWN(BOOL *pChange); +BOOL Basketball2_GetInputSHOOT(BOOL *pChange); +BOOL Basketball2_GetInputPASS(BOOL *pChange); +BOOL Basketball2_TestForMovement(); + +#endif diff --git a/source/platform/Platform_football.c b/source/platform/Platform_football.c index b338802..c93e687 100644 --- a/source/platform/Platform_football.c +++ b/source/platform/Platform_football.c @@ -35,9 +35,6 @@ Website : http://www.peterhirschberg.com #include "football.h" #include "football_screen_png.h" -#include "football_poweroff_png.h" -#include "football_pro1_png.h" -#include "football_pro2_png.h" #include "football_tick_raw.h" #include "football_endplay_raw.h" #include "football_endpossession_raw.h" @@ -45,11 +42,8 @@ Website : http://www.peterhirschberg.com // images static GRRLIB_texImg *bmpScreen; -static GRRLIB_texImg *bmpPowerOff; -static GRRLIB_texImg *bmpPro1; -static GRRLIB_texImg *bmpPro2; -static Sound_t tcWaveRes[4]; +static Sound_t tcWaveRes[FOOTBALL_SOUND_NSOUDS]; static Blip_t blip[FOOTBALL_BLIP_COLUMNS][FOOTBALL_BLIP_ROWS]; static Digit_t digit[7] = { {football_digit_x, football_digit_y, -1}, @@ -82,22 +76,18 @@ void Football_Init() { int x, y; - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], football_tick_raw, football_tick_raw_size, 25); - Sound_set(&tcWaveRes[1], football_endplay_raw, football_endplay_raw_size, 489); - Sound_set(&tcWaveRes[2], football_endpossession_raw, football_endpossession_raw_size, 984); - Sound_set(&tcWaveRes[3], football_score_raw, football_score_raw_size, 1335); + Sound_set(&tcWaveRes[FOOTBALL_SOUND_TICK], football_tick_raw, football_tick_raw_size, 25); + Sound_set(&tcWaveRes[FOOTBALL_SOUND_ENDPLAY], football_endplay_raw, football_endplay_raw_size, 489); + Sound_set(&tcWaveRes[FOOTBALL_SOUND_ENDPOSSESSION], football_endpossession_raw, football_endpossession_raw_size, 984); + Sound_set(&tcWaveRes[FOOTBALL_SOUND_SCORE], football_score_raw, football_score_raw_size, 1335); // load images bmpScreen = GRRLIB_LoadTexture(football_screen_png); - // set up the power switch images - bmpPowerOff = GRRLIB_LoadTexture(football_poweroff_png); - bmpPro1 = GRRLIB_LoadTexture(football_pro1_png); - bmpPro2 = GRRLIB_LoadTexture(football_pro2_png); - // init blips positions for (y = 0; y < FOOTBALL_BLIP_ROWS; y++){ for (x = 0; x < FOOTBALL_BLIP_COLUMNS; x++){ @@ -122,14 +112,18 @@ void Football_Init() bInited = TRUE; } -void Football_DeInit() +void Football_StopSound() { // stop all sounds... Platform_StopSound(); +} + +void Football_DeInit() +{ + // stop all sounds... + Football_StopSound(); + Football_PowerOff(); GRRLIB_FreeTexture(bmpScreen); - GRRLIB_FreeTexture(bmpPowerOff); - GRRLIB_FreeTexture(bmpPro1); - GRRLIB_FreeTexture(bmpPro2); bInited = FALSE; } @@ -139,38 +133,34 @@ void Football_Paint() BOOL power = Football_GetPower(); BOOL skill = Football_GetSkill(); int p_switch; - p_switch = Platform_GetPowerSwitch(ONOFF_OFF12); - if(power) { - if(p_switch == -1) { - if(skill == 0) - Football_PowerOff(); - if(skill == 1) { - Football_PowerOn(); - Football_SetSkill(0); - } - } - if(p_switch == 1) { - if(skill == 0) { - Football_PowerOn(); - Football_SetSkill(1); - } - } - } - else { - if(p_switch == 1) { + p_switch = Platform_GetPowerSwitch(ONOFF_1OFF2); + if(p_switch == -1) { + if(!power) { Football_PowerOn(); Football_SetSkill(0); - } + } + else if(power && skill == 1) { + Football_PowerOff(); + } + } + else if(p_switch == 1) { + if(!power) { + Football_PowerOn(); + Football_SetSkill(1); + } + else if(power && skill == 0) { + Football_PowerOff(); + } } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xffffffff); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xffffffff); // visualize the control states if (power){ if (skill == 0){ - GRRLIB_DrawImg(realx(football_pro_1_x), realy(football_pro_1_y), bmpPro1, 0, 1, 1, 0xffffffff); + draw_switch(SWITCH_TYPE_3, football_pro_1_x, football_pro_1_y, SWITCH_POS_PRO1); } else { - GRRLIB_DrawImg(realx(football_pro_2_x), realy(football_pro_2_y), bmpPro2, 0, 1, 1, 0xffffffff); + draw_switch(SWITCH_TYPE_3, football_pro_1_x, football_pro_1_y, SWITCH_POS_PRO2); } for (y = 0; y < FOOTBALL_BLIP_ROWS; y++){ @@ -184,7 +174,7 @@ void Football_Paint() } } else { - GRRLIB_DrawImg(realx(football_power_off_x), realy(football_power_off_y), bmpPowerOff, 0, 1, 1, 0xffffffff); + draw_switch(SWITCH_TYPE_3, football_pro_1_x, football_pro_1_y, SWITCH_POS_OFF); } } @@ -213,13 +203,6 @@ void Football_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void Football_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/Platform_football2.c b/source/platform/Platform_football2.c index bc4626e..6e8c8fe 100644 --- a/source/platform/Platform_football2.c +++ b/source/platform/Platform_football2.c @@ -35,9 +35,6 @@ Website : http://www.peterhirschberg.com #include "football2.h" #include "football2_screen_png.h" -#include "football2_poweroff_png.h" -#include "football2_pro1_png.h" -#include "football2_pro2_png.h" #include "football2_chargestart_raw.h" #include "football2_charge_raw.h" #include "football2_tick_raw.h" @@ -51,11 +48,8 @@ Website : http://www.peterhirschberg.com // images static GRRLIB_texImg *bmpScreen; -static GRRLIB_texImg *bmpPowerOff; -static GRRLIB_texImg *bmpPro1; -static GRRLIB_texImg *bmpPro2; -static Sound_t tcWaveRes[10]; +static Sound_t tcWaveRes[FOOTBALL2_SOUND_NSOUNDS]; static Blip_t blip[FOOTBALL2_BLIP_COLUMNS][FOOTBALL2_BLIP_ROWS]; static Digit_t digit[7] = { {football2_digit_x, football2_digit_y, -1}, @@ -89,27 +83,23 @@ void Football2_Init() { int x, y; - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], football2_chargestart_raw, football2_chargestart_raw_size, 865 ); - Sound_set(&tcWaveRes[1], football2_charge_raw, football2_charge_raw_size, 946 ); - Sound_set(&tcWaveRes[2], football2_tick_raw, football2_tick_raw_size, 12 ); - Sound_set(&tcWaveRes[3], football2_runback_raw, football2_runback_raw_size, 260 ); - Sound_set(&tcWaveRes[4], football2_firstdown_raw, football2_firstdown_raw_size, 138 ); - Sound_set(&tcWaveRes[5], football2_endplay_raw, football2_endplay_raw_size, 334 ); - Sound_set(&tcWaveRes[6], football2_endpossession_raw, football2_endpossession_raw_size, 700 ); - Sound_set(&tcWaveRes[7], football2_endquarter_raw, football2_endquarter_raw_size, 995 ); - Sound_set(&tcWaveRes[8], football2_touchdown_raw, football2_touchdown_raw_size, 2566 ); - Sound_set(&tcWaveRes[9], football2_safety_raw, football2_safety_raw_size, 726 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_CHARGESTART], football2_chargestart_raw, football2_chargestart_raw_size, 865 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_CHARGE], football2_charge_raw, football2_charge_raw_size, 946 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_TICK], football2_tick_raw, football2_tick_raw_size, 12 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_RUNBACK], football2_runback_raw, football2_runback_raw_size, 260 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_FIRSTDOWN], football2_firstdown_raw, football2_firstdown_raw_size, 138 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_ENDPLAY], football2_endplay_raw, football2_endplay_raw_size, 334 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_ENDPOSSESSION], football2_endpossession_raw, football2_endpossession_raw_size, 700 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_ENDQUARTER], football2_endquarter_raw, football2_endquarter_raw_size, 995 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_TOUCHDOWN], football2_touchdown_raw, football2_touchdown_raw_size, 2566 ); + Sound_set(&tcWaveRes[FOOTBALL2_SOUND_SAFETY], football2_safety_raw, football2_safety_raw_size, 726 ); // load images bmpScreen = GRRLIB_LoadTexture(football2_screen_png); - - // set up the power switch images - bmpPowerOff = GRRLIB_LoadTexture(football2_poweroff_png); - bmpPro1 = GRRLIB_LoadTexture(football2_pro1_png); - bmpPro2 = GRRLIB_LoadTexture(football2_pro2_png); for (y = 0; y < FOOTBALL2_BLIP_ROWS; y++){ for (x = 0; x < FOOTBALL2_BLIP_COLUMNS; x++){ @@ -128,65 +118,69 @@ void Football2_Init() } PlatformSetInput(0); - // turn on the game + // turn off the game Football2_SetSkill(0); - Football2_PowerOn(); + Football2_PowerOff(); bInited = TRUE; } -void Football2_DeInit() +void Football2_StopSound() { // stop all sounds... Platform_StopSound(); +} + +void Football2_DeInit() +{ + // stop all sounds... + Football2_StopSound(); + Football2_PowerOff(); GRRLIB_FreeTexture(bmpScreen); - GRRLIB_FreeTexture(bmpPowerOff); - GRRLIB_FreeTexture(bmpPro1); - GRRLIB_FreeTexture(bmpPro2); bInited = FALSE; } void Football2_Paint() { - int x, y; + int x, y, extra; BOOL power = Football2_GetPower(); - BOOL skill = Football2_GetSkill(); + int skill = Football2_GetSkill(); int p_switch; - p_switch = Platform_GetPowerSwitch(ONOFF_OFF12); + p_switch = Platform_GetPowerSwitchPlus(ONOFF_OFF12, &extra); if(power) { if(p_switch == -1) { - if(skill == 0) + if(skill%2 == 0) Football2_PowerOff(); - if(skill == 1) { + if(skill%2 == 1) { Football2_PowerOn(); - Football2_SetSkill(0); + Football2_SetSkill((extra == 0) ? LVL_ROOKIESLOW : LVL_PROSLOW); } } if(p_switch == 1) { - if(skill == 0) { + if(skill%2 == 0) { Football2_PowerOn(); - Football2_SetSkill(1); + Football2_SetSkill((extra == 0) ? LVL_ROOKIEFAST : LVL_PROFAST); } } } else { if(p_switch == 1) { Football2_PowerOn(); - Football2_SetSkill(0); + Football2_SetSkill((extra == 0) ? LVL_ROOKIESLOW : LVL_PROSLOW); } } // if (gMainWndP == NULL){ return; } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power){ if (skill == 0){ - GRRLIB_DrawImg(realx(football2_pro_1_x), realy(football2_pro_1_y), bmpPro1, 0, 1, 1, 0xFFFFFFFF); + draw_switch(SWITCH_TYPE_1, football2_pro_1_x, football2_pro_1_y, SWITCH_POS_PRO1); } else { - GRRLIB_DrawImg(realx(football2_pro_2_x), realy(football2_pro_2_y), bmpPro2, 0, 1, 1, 0xFFFFFFFF); + draw_switch(SWITCH_TYPE_1, football2_pro_1_x, football2_pro_1_y, SWITCH_POS_PRO2); } for (y = 0; y < FOOTBALL2_BLIP_ROWS; y++){ @@ -200,7 +194,7 @@ void Football2_Paint() } } else { - GRRLIB_DrawImg(realx(football2_power_off_x), realy(football2_power_off_y), bmpPowerOff, 0, 1, 1, 0xFFFFFFFF); + draw_switch(SWITCH_TYPE_1, football2_pro_1_x, football2_pro_1_y, SWITCH_POS_OFF); } } @@ -229,12 +223,6 @@ void Football2_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void Football2_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - //---------------------------------------------------------------------------- // local fcn's // @@ -419,7 +407,7 @@ void Football2_DrawYard(int nYard) if (sign == 1){ // draw direction on left - digit[idx].val = 1; + digit[idx].val = 0; digit[idx].type = DIGIT_TYPE_SPECIAL; idx++; } @@ -435,7 +423,7 @@ void Football2_DrawYard(int nYard) if (sign == -1){ // draw direction on right - digit[idx].val = 0; + digit[idx].val = 1; digit[idx].type = DIGIT_TYPE_SPECIAL; } } diff --git a/source/platform/Platform_football2.h b/source/platform/Platform_football2.h index 15a8588..cbab5be 100644 --- a/source/platform/Platform_football2.h +++ b/source/platform/Platform_football2.h @@ -53,6 +53,14 @@ Website : http://www.peterhirschberg.com #define football2_pro_2_x 91 #define football2_pro_2_y 295 +// Skills +#define LVL_ROOKIESLOW 0 // Pro1 +#define LVL_ROOKIEFAST 1 // Pro2 +#define LVL_PROSLOW 2 // Pro1 + Kick button +#define LVL_PROFAST 3 // Pro2 + Kick button + +#define IS_LVLPRO(x) (((x) == LVL_PROSLOW) || ((x) == LVL_PROFAST)) + // interface that the platform must provide for this game // functions exported to the game context diff --git a/source/platform/Platform_hockey.c b/source/platform/Platform_hockey.c index a7b755e..e0aebc8 100644 --- a/source/platform/Platform_hockey.c +++ b/source/platform/Platform_hockey.c @@ -48,7 +48,7 @@ Website : http://www.peterhirschberg.com // images static GRRLIB_texImg *bmpScreen; -static Sound_t tcWaveRes[9]; +static Sound_t tcWaveRes[HOCKEY_SOUND_NSOUNDS]; static Blip_t blip[HOCKEY_BLIP_COLUMNS][HOCKEY_BLIP_ROWS]; static Stat_t digit[2]; static Help_t help[] = { @@ -70,18 +70,19 @@ void Hockey_Init() { int x, y; - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], hockey_tick_raw, hockey_tick_raw_size, 14 ); - Sound_set(&tcWaveRes[1], hockey_deflect_raw, hockey_deflect_raw_size, 16 ); - Sound_set(&tcWaveRes[2], hockey_bump_raw, hockey_bump_raw_size, 35 ); - Sound_set(&tcWaveRes[3], hockey_poke_raw, hockey_poke_raw_size, 57 ); - Sound_set(&tcWaveRes[4], hockey_score_raw, hockey_score_raw_size, 1575 ); - Sound_set(&tcWaveRes[5], hockey_penalty_raw, hockey_penalty_raw_size, 1196 ); - Sound_set(&tcWaveRes[6], hockey_steal_raw, hockey_steal_raw_size, 531 ); - Sound_set(&tcWaveRes[7], hockey_endperiod_raw, hockey_endperiod_raw_size, 1205 ); - Sound_set(&tcWaveRes[8], hockey_endgame_raw, hockey_endgame_raw_size, 2382 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_TICK], hockey_tick_raw, hockey_tick_raw_size, 14 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_DEFLECT], hockey_deflect_raw, hockey_deflect_raw_size, 16 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_BUMP], hockey_bump_raw, hockey_bump_raw_size, 35 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_POKE], hockey_poke_raw, hockey_poke_raw_size, 57 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_SCORE], hockey_score_raw, hockey_score_raw_size, 1575 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_PENALTY], hockey_penalty_raw, hockey_penalty_raw_size, 1196 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_STEAL], hockey_steal_raw, hockey_steal_raw_size, 531 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_ENDPERIOD], hockey_endperiod_raw, hockey_endperiod_raw_size, 1205 ); + Sound_set(&tcWaveRes[HOCKEY_SOUND_ENDGAME], hockey_endgame_raw, hockey_endgame_raw_size, 2382 ); // load images bmpScreen = GRRLIB_LoadTexture(hockey_screen_png); @@ -113,10 +114,17 @@ void Hockey_Init() bInited = TRUE; } -void Hockey_DeInit() +void Hockey_StopSound() { // stop all sounds... Platform_StopSound(); +} + +void Hockey_DeInit() +{ + // stop all sounds... + Hockey_StopSound(); + Hockey_PowerOff(); GRRLIB_FreeTexture(bmpScreen); bInited = FALSE; } @@ -147,14 +155,14 @@ void Hockey_Paint() } } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power){ if (skill == 0){ - draw_poweroff_a(hockey_pro_1_x, hockey_pro_1_y, POWER_POS_MODE1); + draw_switch(SWITCH_TYPE_2, hockey_pro_1_x, hockey_pro_1_y, SWITCH_POS_MODE1); } else { - draw_poweroff_a(hockey_pro_2_x, hockey_pro_2_y, POWER_POS_MODE2); + draw_switch(SWITCH_TYPE_2, hockey_pro_1_x, hockey_pro_1_y, SWITCH_POS_MODE2); } for (y = 0; y < HOCKEY_BLIP_ROWS; y++){ @@ -168,7 +176,7 @@ void Hockey_Paint() draw_digit(digit[x].x, digit[x].y, digit[x].val); } else { - draw_poweroff_a(hockey_power_off_x, hockey_power_off_y, POWER_POS_OFF); + draw_switch(SWITCH_TYPE_2, hockey_pro_1_x, hockey_pro_1_y, SWITCH_POS_OFF); } } @@ -194,13 +202,6 @@ void Hockey_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void Hockey_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/Platform_hockeyca.c b/source/platform/Platform_hockeyca.c index b333ece..73b6355 100644 --- a/source/platform/Platform_hockeyca.c +++ b/source/platform/Platform_hockeyca.c @@ -45,7 +45,7 @@ Website : http://www.peterhirschberg.com // images static GRRLIB_texImg *bmpScreen; -static Sound_t tcWaveRes[6]; +static Sound_t tcWaveRes[HOCKEYCA_SOUND_NSOUNDS]; static Blip_t blip[HOCKEYCA_BLIP_COLUMNS][HOCKEYCA_BLIP_ROWS]; static Blip_t goal; static Stat_t digit[2]; @@ -68,15 +68,16 @@ void HockeyCa_Init() { int x, y; - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], hockeyca_tick_raw, hockeyca_tick_raw_size, 13 ); - Sound_set(&tcWaveRes[1], hockeyca_bounce_raw, hockeyca_bounce_raw_size, 33 ); - Sound_set(&tcWaveRes[2], hockeyca_score_raw, hockeyca_score_raw_size, 3307 ); - Sound_set(&tcWaveRes[3], hockeyca_endplay_raw, hockeyca_endplay_raw_size, 762 ); - Sound_set(&tcWaveRes[4], hockeyca_endperiod_raw, hockeyca_endperiod_raw_size, 1654 ); - Sound_set(&tcWaveRes[5], hockeyca_endgame_raw, hockeyca_endgame_raw_size, 2543 ); + Sound_set(&tcWaveRes[HOCKEYCA_SOUND_TICK], hockeyca_tick_raw, hockeyca_tick_raw_size, 13 ); + Sound_set(&tcWaveRes[HOCKEYCA_SOUND_BOUNCE], hockeyca_bounce_raw, hockeyca_bounce_raw_size, 33 ); + Sound_set(&tcWaveRes[HOCKEYCA_SOUND_SCORE], hockeyca_score_raw, hockeyca_score_raw_size, 3307 ); + Sound_set(&tcWaveRes[HOCKEYCA_SOUND_ENDPLAY], hockeyca_endplay_raw, hockeyca_endplay_raw_size, 762 ); + Sound_set(&tcWaveRes[HOCKEYCA_SOUND_ENDQUARTER], hockeyca_endperiod_raw, hockeyca_endperiod_raw_size, 1654 ); + Sound_set(&tcWaveRes[HOCKEYCA_SOUND_ENDGAME], hockeyca_endgame_raw, hockeyca_endgame_raw_size, 2543 ); // load images bmpScreen = GRRLIB_LoadTexture(hockeyca_screen_png); @@ -108,10 +109,17 @@ void HockeyCa_Init() bInited = TRUE; } -void HockeyCa_DeInit() +void HockeyCa_StopSound() { // stop all sounds... Platform_StopSound(); +} + +void HockeyCa_DeInit() +{ + // stop all sounds... + HockeyCa_StopSound(); + HockeyCa_PowerOff(); GRRLIB_FreeTexture(bmpScreen); bInited = FALSE; } @@ -142,14 +150,14 @@ void HockeyCa_Paint() } } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power){ if (skill == 0){ - draw_poweroff_a(hockeyca_pro_1_x, hockeyca_pro_1_y, POWER_POS_MODE1); + draw_switch(SWITCH_TYPE_2,hockeyca_pro_1_x, hockeyca_pro_1_y, SWITCH_POS_MODE1); } else { - draw_poweroff_a(hockeyca_pro_2_x, hockeyca_pro_2_y, POWER_POS_MODE2); + draw_switch(SWITCH_TYPE_2,hockeyca_pro_1_x, hockeyca_pro_1_y, SWITCH_POS_MODE2); } for (y = 0; y < HOCKEYCA_BLIP_ROWS; y++){ @@ -166,7 +174,7 @@ void HockeyCa_Paint() draw_digit(digit[x].x, digit[x].y, digit[x].val); } else { - draw_poweroff_a(hockeyca_power_off_x, hockeyca_power_off_y, POWER_POS_OFF); + draw_switch(SWITCH_TYPE_2,hockeyca_pro_1_x, hockeyca_pro_1_y, SWITCH_POS_OFF); } } @@ -191,13 +199,6 @@ void HockeyCa_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void HockeyCa_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/Platform_soccer.c b/source/platform/Platform_soccer.c index ff26e24..33657b0 100644 --- a/source/platform/Platform_soccer.c +++ b/source/platform/Platform_soccer.c @@ -45,7 +45,7 @@ Website : http://www.peterhirschberg.com // images static GRRLIB_texImg *bmpScreen; -static Sound_t tcWaveRes[6]; +static Sound_t tcWaveRes[SOCCER_SOUND_NSOUNDS]; static Blip_t blip[SOCCER_BLIP_COLUMNS][SOCCER_BLIP_ROWS]; static Blip_t goal; static Stat_t digit[2]; @@ -68,15 +68,16 @@ void Soccer_Init() { int x, y; - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], soccer_tick_raw, soccer_tick_raw_size, 21 ); - Sound_set(&tcWaveRes[1], soccer_bounce_raw, soccer_bounce_raw_size, 47 ); - Sound_set(&tcWaveRes[2], soccer_score_raw, soccer_score_raw_size, 1637 ); - Sound_set(&tcWaveRes[3], soccer_endplay_raw, soccer_endplay_raw_size, 793 ); - Sound_set(&tcWaveRes[4], soccer_endperiod_raw, soccer_endperiod_raw_size, 1746 ); - Sound_set(&tcWaveRes[5], soccer_endgame_raw, soccer_endgame_raw_size, 2687 ); + Sound_set(&tcWaveRes[SOCCER_SOUND_TICK], soccer_tick_raw, soccer_tick_raw_size, 21 ); + Sound_set(&tcWaveRes[SOCCER_SOUND_BOUNCE], soccer_bounce_raw, soccer_bounce_raw_size, 47 ); + Sound_set(&tcWaveRes[SOCCER_SOUND_SCORE], soccer_score_raw, soccer_score_raw_size, 1637 ); + Sound_set(&tcWaveRes[SOCCER_SOUND_ENDPLAY], soccer_endplay_raw, soccer_endplay_raw_size, 793 ); + Sound_set(&tcWaveRes[SOCCER_SOUND_ENDQUARTER], soccer_endperiod_raw, soccer_endperiod_raw_size, 1746 ); + Sound_set(&tcWaveRes[SOCCER_SOUND_ENDGAME], soccer_endgame_raw, soccer_endgame_raw_size, 2687 ); // load images bmpScreen = GRRLIB_LoadTexture(soccer_screen_png); @@ -108,10 +109,17 @@ void Soccer_Init() bInited = TRUE; } -void Soccer_DeInit() +void Soccer_StopSound() { // stop all sounds... Platform_StopSound(); +} + +void Soccer_DeInit() +{ + // stop all sounds... + Soccer_StopSound(); + Soccer_PowerOff(); GRRLIB_FreeTexture(bmpScreen); bInited = FALSE; } @@ -143,14 +151,14 @@ void Soccer_Paint() } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power){ if (skill == 0){ - draw_poweroff_a(soccer_power_off_x, soccer_power_off_y, POWER_POS_MODE1); + draw_switch(SWITCH_TYPE_2,soccer_power_off_x, soccer_power_off_y, SWITCH_POS_MODE1); } else { - draw_poweroff_a(soccer_power_off_x, soccer_power_off_y, POWER_POS_MODE2); + draw_switch(SWITCH_TYPE_2,soccer_power_off_x, soccer_power_off_y, SWITCH_POS_MODE2); } for (y = 0; y < SOCCER_BLIP_ROWS; y++){ for (x = 0; x < SOCCER_BLIP_COLUMNS; x++){ @@ -165,7 +173,7 @@ void Soccer_Paint() draw_digit(digit[x].x, digit[x].y, digit[x].val); } else { - draw_poweroff_a(soccer_power_off_x, soccer_power_off_y, POWER_POS_OFF); + draw_switch(SWITCH_TYPE_2,soccer_power_off_x, soccer_power_off_y, SWITCH_POS_OFF); } } @@ -193,13 +201,6 @@ void Soccer_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void Soccer_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/Platform_soccer2.c b/source/platform/Platform_soccer2.c new file mode 100644 index 0000000..6336590 --- /dev/null +++ b/source/platform/Platform_soccer2.c @@ -0,0 +1,574 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "soccer2.h" +#include "soccer2_screen_png.h" +#include "soccer2_ballout_raw.h" +#include "soccer2_highkick_raw.h" +#include "soccer2_beep_raw.h" +#include "soccer2_looseball_raw.h" +#include "soccer2_endgame_raw.h" +#include "soccer2_lowkick_raw.h" +#include "soccer2_endhalf_raw.h" +#include "soccer2_tick_raw.h" +#include "soccer2_goal_raw.h" +#include "soccer2_bounce_raw.h" + +// images +static GRRLIB_texImg *bmpScreen; + +static Sound_t tcWaveRes[SOCCER2_SOUND_NSOUNDS]; +static Blip_t blip[SOCCER2_BLIP_COLUMNS][SOCCER2_BLIP_ROWS]; +static Blip_t goalarea; +static Digit_t digit[2]; +static Help_t help[] = { + { WK_PLUS, { 38, 181} }, + { WK_U, { 34, 206} }, + { WK_MINUS, { 38, 237} }, + { WK_1, { 87, 175} }, + { WK_2, { 175, 175} }, + { WK_BLR1, {10, 268} }, + { WK_DPAD, { 128, 231} } +}; + +//---------------------------------------------------------------------------- +// +// +void Soccer2_Help() +{ + Platform_Help(help, sizeof(help)/sizeof(*help)); +} + +static BOOL bInited = FALSE; + +void Soccer2_Init() +{ + int x, y; + + if (bInited) + return; + + // Init sounds + Sound_set(&tcWaveRes[SOCCER2_SOUND_TICK], soccer2_tick_raw, soccer2_tick_raw_size, 8); + Sound_set(&tcWaveRes[SOCCER2_SOUND_LOOSEBALL], soccer2_looseball_raw, soccer2_looseball_raw_size,54); + Sound_set(&tcWaveRes[SOCCER2_SOUND_BALLOUT], soccer2_ballout_raw, soccer2_ballout_raw_size,461); + Sound_set(&tcWaveRes[SOCCER2_SOUND_GOAL], soccer2_goal_raw, soccer2_goal_raw_size, 1225); + Sound_set(&tcWaveRes[SOCCER2_SOUND_BEEP], soccer2_beep_raw, soccer2_beep_raw_size, 86); + Sound_set(&tcWaveRes[SOCCER2_SOUND_HIGHKICK], soccer2_highkick_raw, soccer2_highkick_raw_size, 79); + Sound_set(&tcWaveRes[SOCCER2_SOUND_LOWKICK], soccer2_lowkick_raw, soccer2_lowkick_raw_size, 93); + Sound_set(&tcWaveRes[SOCCER2_SOUND_ENDHALF], soccer2_endhalf_raw, soccer2_endhalf_raw_size, 1335); + Sound_set(&tcWaveRes[SOCCER2_SOUND_ENDGAME], soccer2_endgame_raw, soccer2_endgame_raw_size, 2234); + Sound_set(&tcWaveRes[SOCCER2_SOUND_BOUNCE], soccer2_bounce_raw, soccer2_bounce_raw_size, 144); + + // load images + bmpScreen = GRRLIB_LoadTexture(soccer2_screen_png); + + for (y = 0; y < SOCCER2_BLIP_ROWS; y++){ + for (x = 0; x < SOCCER2_BLIP_COLUMNS; x++){ + Blip_t *pblip = &blip[x][y]; + + pblip->x = (x * soccer2_blip_xspacing) + soccer2_blip_x; + pblip->y = (y * soccer2_blip_yspacing) + soccer2_blip_y; + pblip->status = -1; + } + } + goalarea.x = soccer2_goalarea_x; + goalarea.y = soccer2_goalarea_y; + goalarea.status = -1; + + // clean digit + // set digits + for(x = 0; x < 2; x++) { + digit[x].x = soccer2_digit_x + x * soccer2_digit_spacing; + digit[x].y = soccer2_digit_y; + digit[x].val = -1; + digit[x].type = DIGIT_TYPE_NORMAL; + } + + PlatformSetInput(0); + // turn on the game + Soccer2_SetSkill(0); + Soccer2_PowerOn(); + + bInited = TRUE; +} + +void Soccer2_StopSound() +{ + // stop all sounds... + Platform_StopSound(); +} + +void Soccer2_DeInit() +{ + // stop all sounds... + Soccer2_StopSound(); + Soccer2_PowerOff(); + GRRLIB_FreeTexture(bmpScreen); + bInited = FALSE; +} + +void Soccer2_Paint() +{ + int x, y, extra; + BOOL power = Soccer2_GetPower(); + int skill = Soccer2_GetSkill(); + int p_switch; + p_switch = Platform_GetPowerSwitchPlus(ONOFF_OFF12, &extra); + if(power) { + if(p_switch == -1) { + if(skill%2 == 0) + Soccer2_PowerOff(); + if(skill%2 == 1) { + Soccer2_PowerOn(); + Soccer2_SetSkill((extra == 0) ? LVL_ROOKIESLOW : LVL_PROSLOW); + } + } + if(p_switch == 1) { + if(skill%2 == 0) { + Soccer2_PowerOn(); + Soccer2_SetSkill((extra == 0) ? LVL_ROOKIEFAST : LVL_PROFAST); + } + } + } + else { + if(p_switch == 1) { + Soccer2_PowerOn(); + Soccer2_SetSkill((extra == 0) ? LVL_ROOKIESLOW : LVL_PROSLOW); + } + } + +// if (gMainWndP == NULL){ return; } + + // paint the backdrop + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); + + // visualize the control states + if (power){ + if (skill%2 == 0){ + draw_switch(SWITCH_TYPE_4, soccer2_power_off_x, soccer2_power_off_y, SWITCH_POS_PRO1); + } else { + draw_switch(SWITCH_TYPE_4, soccer2_power_off_x, soccer2_power_off_y, SWITCH_POS_PRO2); + } + + for (y = 0; y < SOCCER2_BLIP_ROWS; y++){ + for (x = 0; x < SOCCER2_BLIP_COLUMNS; x++){ + Blip_t *pblip = &blip[x][y]; + + if(pblip->status != -1) + draw_oblip(pblip->x, pblip->y, pblip->status); + } + } + if(goalarea.status != -1) + draw_oblip(goalarea.x, goalarea.y, goalarea.status); + + for(x = 0; x < 2; x++) + draw_digit_f(digit[x].x, digit[x].y, digit[x].val, digit[x].type); + } + else { + draw_switch(SWITCH_TYPE_4, soccer2_power_off_x, soccer2_power_off_y, SWITCH_POS_OFF); + } +} + +void Soccer2_ClearScreen() +{ + int x, y; + + Platform_StartDraw(); + + // erase the blips + for (y = 0; y < SOCCER2_BLIP_ROWS; y++){ + for (x = 0; x < SOCCER2_BLIP_COLUMNS; x++){ + Soccer2_DrawBlip(BLIP_OFF, x, y); + } + } + // erase the stat display + Soccer2_DrawStat(-1); + + Platform_EndDraw(); +} + +void Soccer2_PlaySound(int nSound, unsigned int nFlags) +{ + if(tcWaveRes[nSound].stream != NULL) + Platform_PlaySound(&tcWaveRes[nSound], nFlags); +} + +//---------------------------------------------------------------------------- +// local fcn's +// + +void Soccer2_DrawBlip(int nBright, int x, int y) +{ + Blip_t *pblip = &blip[x][y]; + + switch(nBright){ + case BLIP_OFF: + pblip->status = -1; + break; + case BLIP_DIM: + pblip->status = BLIP_TYPE_NORMAL; + break; + case BLIP_BRIGHT: + pblip->status = BLIP_TYPE_BRIGHT; + break; + } +} + +void Soccer2_DrawGoalareaFlag(BOOL status) +{ + if (status) { + // goalarea flag on + goalarea.status = BLIP_TYPE_NORMAL; + } + else { + // goalarea flag off + goalarea.status = -1; + } +} + +void Soccer2_DrawStat(int nStat) +{ + digit[0].type = DIGIT_TYPE_NORMAL; + digit[1].type = DIGIT_TYPE_NORMAL; + + if (nStat == -1){ + // erase the display + digit[0].val = -1; + digit[1].val = -1; + } else { + // draw 10s place + digit[0].val = nStat/10; + // draw 1s place + digit[1].val = nStat%10; + } +} + +void Soccer2_DrawSect(int nSect, BOOL side) +{ + digit[0].type = DIGIT_TYPE_NORMAL; + digit[0].val = (side == TRUE) ? nSect : (10 - nSect); + digit[1].type = DIGIT_TYPE_SPECIAL; + digit[1].val = (side == FALSE) ? 2 : 3; // Print U or H +} + +BOOL Soccer2_GetInputPASS(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInput1()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_GetInputSHOOT(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInput2()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_GetInputKICK(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputPLUS()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_GetInputSCORE(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputUP()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_GetInputTEAM(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputMINUS()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_GetInputLEFTUP(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputLEFTUP()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Soccer2_GetInputLEFTDOWN(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputLEFTDOWN()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Soccer2_GetInputLEFT(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputLEFT()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Soccer2_GetInputRIGHTUP(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputRIGHTUP()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Soccer2_GetInputRIGHTDOWN(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputRIGHTDOWN()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + return FALSE; +} + +BOOL Soccer2_GetInputRIGHT(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputRIGHT()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_GetInputUP(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputUP()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_GetInputDOWN(BOOL *pChange) +{ + static BOOL bLast = FALSE; + + if (pChange){ *pChange = FALSE; } + + // check the keys + if (Platform_GetInputDOWN()) + { + if (!bLast && pChange) + { + *pChange = TRUE; + } + bLast = TRUE; + return TRUE; + } + + bLast = FALSE; + + return FALSE; +} + +BOOL Soccer2_TestForMovement() +{ + // check the keys + if (Platform_GetInputLEFT() + || Platform_GetInputUP() + || Platform_GetInputRIGHT() + || Platform_GetInputDOWN()) + { + return TRUE; + } + + return FALSE; +} + +void Soccer2_GetSize(int *w, int *h) +{ + *w = bmpScreen->w; + *h = bmpScreen->h; +} + diff --git a/source/platform/Platform_soccer2.h b/source/platform/Platform_soccer2.h new file mode 100644 index 0000000..9b695ff --- /dev/null +++ b/source/platform/Platform_soccer2.h @@ -0,0 +1,83 @@ +/* + * LEDhead for Wii + * Copyright (C) 2017-2020 Nebiun + * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __PLATFORM_SOCCER2_H__ +#define __PLATFORM_SOCCER2_H__ + +// [general] +#define soccer2_digit_spacing 12 +#define soccer2_digit_x 112 +#define soccer2_digit_y 6 +#define soccer2_digit_w 8 +#define soccer2_digit_h 9 +#define soccer2_blip_xspacing 25 +#define soccer2_blip_yspacing 21 +#define soccer2_blip_x 43 +#define soccer2_blip_y 42 +#define soccer2_power_off_x 29 +#define soccer2_power_off_y 269 +#define soccer2_goalarea_x 118 +#define soccer2_goalarea_y 22 + +// Skills +#define LVL_ROOKIESLOW 0 // Pro1 +#define LVL_ROOKIEFAST 1 // Pro2 +#define LVL_PROSLOW 2 // Pro1 + Score button +#define LVL_PROFAST 3 // Pro2 + Score button + +#define IS_LVLPRO(x) (((x) == LVL_PROSLOW) || ((x) == LVL_PROFAST)) + +// interface that the platform must provide for this game + +// functions exported to the game context +void Soccer2_Init(); +void Soccer2_Help(); +void Soccer2_DeInit(); +void Soccer2_Paint(); +void Soccer2_ClearScreen(); +void Soccer2_PlaySound(int nSound, unsigned int nFlags); +void Soccer2_StopSound(); +void Soccer2_GetSize(int *w, int *h); + +// "private" functions not exported to game context +void Soccer2_DrawBlip(int nBright, int x, int y); +void Soccer2_DrawStat(int nStat); +void Soccer2_DrawSect(int nSect, BOOL side); +void Soccer2_DrawGoalareaFlag(BOOL status); + +BOOL Soccer2_GetInputLEFTUP(BOOL *pChange); +BOOL Soccer2_GetInputLEFTDOWN(BOOL *pChange); +BOOL Soccer2_GetInputLEFT(BOOL *pChange); +BOOL Soccer2_GetInputRIGHTUP(BOOL *pChange); +BOOL Soccer2_GetInputRIGHTDOWN(BOOL *pChange); +BOOL Soccer2_GetInputUP(BOOL *pChange); +BOOL Soccer2_GetInputRIGHT(BOOL *pChange); +BOOL Soccer2_GetInputDOWN(BOOL *pChange); +BOOL Soccer2_GetInputKICK(BOOL *pChange); +BOOL Soccer2_GetInputPASS(BOOL *pChange); +BOOL Soccer2_GetInputSHOOT(BOOL *pChange); +BOOL Soccer2_GetInputTEAM(BOOL *pChange); +BOOL Soccer2_GetInputSCORE(BOOL *pChange); + +BOOL Soccer2_TestForMovement(); + +#endif diff --git a/source/platform/Platform_spacealert.c b/source/platform/Platform_spacealert.c index 2eee114..33d875f 100644 --- a/source/platform/Platform_spacealert.c +++ b/source/platform/Platform_spacealert.c @@ -34,27 +34,26 @@ Website : http://www.peterhirschberg.com */ #include "spacealert.h" +#include "slide2_png.h" +#include "slide3_png.h" #include "spacealert_screen_png.h" -#include "spacealert_poweron_png.h" -#include "spacealert_poweroff_png.h" -#include "spacealert_aimleft_png.h" -#include "spacealert_aimcenter_png.h" -#include "spacealert_aimright_png.h" +#include "missileattack_screen_png.h" #include "spacealert_fire_raw.h" #include "spacealert_hit_raw.h" #include "spacealert_lose_raw.h" #include "spacealert_win_raw.h" #include "spacealert_raider_raw.h" +#define SPACE_ALERT 0 +#define MISSILE_ATTACK 1 + // images static GRRLIB_texImg *bmpScreen; -static GRRLIB_texImg *bmpPowerOn; -static GRRLIB_texImg *bmpPowerOff; -static GRRLIB_texImg *bmpAimLeft; -static GRRLIB_texImg *bmpAimCenter; -static GRRLIB_texImg *bmpAimRight; +static GRRLIB_texImg *bmpPower; +static GRRLIB_texImg *bmpAim; static int nStick = 1; +static int game = -1; static BOOL bRaiderSound = FALSE; static BOOL bRaiderSoundPlaying = FALSE; @@ -62,58 +61,81 @@ static BOOL bRaiderSoundPlaying = FALSE; static void StartRaiderSound(); static void StopRaiderSound(); -static Sound_t tcWaveRes[5]; +static Sound_t tcWaveRes[SPACEALERT_SOUND_NSOUNDS]; static Blip_t blip[SPACEALERT_BLIP_COLUMNS][SPACEALERT_BLIP_ROWS]; static Stat_t digit[2]; -static Help_t help[] = { +static Help_t SpaceAlert_help[] = { { WK_2, { 86, 122 } }, { WK_BUD, { 88, 224 } }, { WK_LR, { 156, 265 } } }; +static Help_t MissileAttack_help[] = { + { WK_2, { 73, 98 } }, + { WK_BUD, { 71, 180 } }, + { WK_LR, { 166, 284 } } +}; //---------------------------------------------------------------------------- // // void SpaceAlert_Help() { - Platform_Help(help, sizeof(help)/sizeof(*help)); + Platform_Help(SpaceAlert_help, sizeof(SpaceAlert_help)/sizeof(*SpaceAlert_help)); +} +void MissileAttack_Help() +{ + Platform_Help(MissileAttack_help, sizeof(MissileAttack_help)/sizeof(*MissileAttack_help)); } static BOOL bInited = FALSE; -void SpaceAlert_Init() +static void game_init() { int x, y; - if (bInited) return; + if (bInited) + return; // Init sounds - Sound_set(&tcWaveRes[0], spacealert_fire_raw, spacealert_fire_raw_size, 109); - Sound_set(&tcWaveRes[1], spacealert_hit_raw, spacealert_hit_raw_size, 284); - Sound_set(&tcWaveRes[2], spacealert_lose_raw, spacealert_lose_raw_size, 1243); - Sound_set(&tcWaveRes[3], spacealert_win_raw, spacealert_win_raw_size, 850); - Sound_set(&tcWaveRes[4], spacealert_raider_raw, spacealert_raider_raw_size, 3902); + Sound_set(&tcWaveRes[SPACEALERT_SOUND_FIRE], spacealert_fire_raw, spacealert_fire_raw_size, 109); + Sound_set(&tcWaveRes[SPACEALERT_SOUND_HIT], spacealert_hit_raw, spacealert_hit_raw_size, 284); + Sound_set(&tcWaveRes[SPACEALERT_SOUND_LOSE], spacealert_lose_raw, spacealert_lose_raw_size, 1243); + Sound_set(&tcWaveRes[SPACEALERT_SOUND_WIN], spacealert_win_raw, spacealert_win_raw_size, 850); + Sound_set(&tcWaveRes[SPACEALERT_SOUND_RAIDER], spacealert_raider_raw, spacealert_raider_raw_size, 3902); // load images - bmpScreen = GRRLIB_LoadTexture(spacealert_screen_png); - bmpPowerOn = GRRLIB_LoadTexture(spacealert_poweron_png); - bmpPowerOff = GRRLIB_LoadTexture(spacealert_poweroff_png); - bmpAimLeft = GRRLIB_LoadTexture(spacealert_aimleft_png); - bmpAimCenter = GRRLIB_LoadTexture(spacealert_aimcenter_png); - bmpAimRight = GRRLIB_LoadTexture(spacealert_aimright_png); + if(game == SPACE_ALERT) + bmpScreen = GRRLIB_LoadTexture(spacealert_screen_png); + else + bmpScreen = GRRLIB_LoadTexture(missileattack_screen_png); + + bmpPower = GRRLIB_LoadTexture(slide2_png); + bmpAim = GRRLIB_LoadTexture(slide3_png); // set blips for (y = 0; y < SPACEALERT_BLIP_ROWS; y++){ for (x = 0; x < SPACEALERT_BLIP_COLUMNS; x++){ Blip_t *pblip = &blip[x][y]; - pblip->x = (int)((x * ((float)spacealert_blip_xspacing/100)) + spacealert_blip_x); - pblip->y = (int)((y * ((float)spacealert_blip_yspacing/100)) + spacealert_blip_y); + if(game == SPACE_ALERT) { + pblip->x = (int)((x * ((float)spacealert_blip_xspacing/100)) + spacealert_blip_x); + pblip->y = (int)((y * ((float)spacealert_blip_yspacing/100)) + spacealert_blip_y); + } + else { + pblip->x = (int)((x * ((float)missileattack_blip_xspacing/100)) + missileattack_blip_x); + pblip->y = (int)((y * ((float)missileattack_blip_yspacing/100)) + missileattack_blip_y); + } pblip->status = -1; } } // set digits for(x = 0; x < 2; x++) { - digit[x].x = spacealert_digit_x + x * spacealert_digit_spacing; - digit[x].y = spacealert_digit_y; + if(game == SPACE_ALERT) { + digit[x].x = spacealert_digit_x + x * spacealert_digit_spacing; + digit[x].y = spacealert_digit_y; + } + else { + digit[x].x = missileattack_digit_x + x * missileattack_digit_spacing; + digit[x].y = missileattack_digit_y; + } } PlatformSetInput(0); // start with the game off @@ -122,18 +144,35 @@ void SpaceAlert_Init() bInited = TRUE; } +void SpaceAlert_Init() +{ + game = SPACE_ALERT; + game_init(); +} + +void MissileAttack_Init() +{ + game = MISSILE_ATTACK; + game_init(); +} + +void SpaceAlert_StopSound() +{ + bRaiderSoundPlaying = FALSE; + bRaiderSound = FALSE; + + // stop all sounds... + Platform_StopSound(); +} + void SpaceAlert_DeInit() { // stop all sounds... - Platform_StopSound(); - bRaiderSoundPlaying = FALSE; - + SpaceAlert_StopSound(); + SpaceAlert_PowerOff(); GRRLIB_FreeTexture(bmpScreen); - GRRLIB_FreeTexture(bmpPowerOff); - GRRLIB_FreeTexture(bmpPowerOn); - GRRLIB_FreeTexture(bmpAimLeft); - GRRLIB_FreeTexture(bmpAimCenter); - GRRLIB_FreeTexture(bmpAimRight); + GRRLIB_FreeTexture(bmpPower); + GRRLIB_FreeTexture(bmpAim); bInited = FALSE; } @@ -152,11 +191,14 @@ void SpaceAlert_Paint() } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power){ - GRRLIB_DrawImg(realx(spacealert_power_x), realy(spacealert_power_y), bmpPowerOn, 0, 1, 1, 0xFFFFFFFF); + if(game == SPACE_ALERT) + GRRLIB_DrawImg(realx(spacealert_power_x), realy(spacealert_power_y+5), bmpPower, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); + else + GRRLIB_DrawImg(realx(missileattack_power_x), realy(missileattack_power_y+5), bmpPower, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); for (y = 0; y < SPACEALERT_BLIP_ROWS; y++){ for (x = 0; x < SPACEALERT_BLIP_COLUMNS; x++){ @@ -168,24 +210,24 @@ void SpaceAlert_Paint() // Draw points for(x = 0; x < 2; x++) draw_digit(digit[x].x, digit[x].y, digit[x].val); - // Draw stick - switch (nStick) - { - case 0: - GRRLIB_DrawImg(realx(spacealert_slider_x), realy(spacealert_slider_y), bmpAimLeft, 0, 1, 1, 0xFFFFFFFF); - break; - case 1: - GRRLIB_DrawImg(realx(spacealert_slider_x), realy(spacealert_slider_y), bmpAimCenter, 0, 1, 1, 0xFFFFFFFF); - break; - case 2: - GRRLIB_DrawImg(realx(spacealert_slider_x), realy(spacealert_slider_y), bmpAimRight, 0, 1, 1, 0xFFFFFFFF); - break; - } } else { - GRRLIB_DrawImg(realx(spacealert_power_x), realy(spacealert_power_y), bmpPowerOff, 0, 1, 1, 0xFFFFFFFF); + if(game == SPACE_ALERT) + GRRLIB_DrawImg(realx(spacealert_power_x), realy(spacealert_power_y+27), bmpPower, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); + else + GRRLIB_DrawImg(realx(missileattack_power_x), realy(missileattack_power_y+27), bmpPower, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); } - + // Draw stick + if(game == SPACE_ALERT) { + x = realx(spacealert_slider_x); + y = realy(spacealert_slider_y); + } + else { + x = realx(missileattack_slider_x); + y = realy(missileattack_slider_y); + } + + GRRLIB_DrawImg(x+2+(nStick * 20), y, bmpAim, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); } void SpaceAlert_ClearScreen() @@ -220,16 +262,6 @@ void SpaceAlert_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void SpaceAlert_StopSound() -{ - bRaiderSoundPlaying = FALSE; - bRaiderSound = FALSE; - - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // @@ -346,25 +378,23 @@ BOOL SpaceAlert_GetInputFIRE(BOOL *pChange) { static BOOL bLast = FALSE; - if (pChange){ *pChange = FALSE; } + if (pChange) { + *pChange = FALSE; + } // check the keys - if (Platform_GetInput2()) - { - if (!bLast) - { - if (pChange) - { + if (Platform_GetInput2()) { + if (!bLast) { + if (pChange) { *pChange = TRUE; } } bLast = TRUE; - return TRUE; } - - bLast = FALSE; - - return FALSE; + else { + bLast = FALSE; + } + return bLast; } void SpaceAlert_GetSize(int *w, int *h) @@ -372,5 +402,3 @@ void SpaceAlert_GetSize(int *w, int *h) *w = bmpScreen->w; *h = bmpScreen->h; } - - diff --git a/source/platform/Platform_spacealert.h b/source/platform/Platform_spacealert.h index 2e31def..909365f 100644 --- a/source/platform/Platform_spacealert.h +++ b/source/platform/Platform_spacealert.h @@ -51,14 +51,29 @@ Website : http://www.peterhirschberg.com #define spacealert_slider_y 271 #define spacealert_power_x 87 #define spacealert_power_y 231 -#define spacealert_kfire_x 73 -#define spacealert_kfire_y 148 + +// [general] +#define missileattack_digit_spacing 12 +#define missileattack_digit_x 172 +#define missileattack_digit_y 65 +#define missileattack_digit_w 13 +#define missileattack_digit_h 14 +#define missileattack_blip_xspacing 1300 +#define missileattack_blip_yspacing 1700 +#define missileattack_blip_x 166 +#define missileattack_blip_y 95 +#define missileattack_slider_x 151 +#define missileattack_slider_y 292 +#define missileattack_power_x 78 +#define missileattack_power_y 188 // interface that the platform must provide for this game // functions exported to the game context void SpaceAlert_Init(); +void MissileAttack_Init(); void SpaceAlert_Help(); +void MissileAttack_Help(); void SpaceAlert_DeInit(); void SpaceAlert_Paint(); void SpaceAlert_ClearScreen(); diff --git a/source/platform/Platform_subchase.c b/source/platform/Platform_subchase.c index 5f48905..c9670c9 100644 --- a/source/platform/Platform_subchase.c +++ b/source/platform/Platform_subchase.c @@ -56,7 +56,7 @@ static GRRLIB_texImg *bmpDigits; static GRRLIB_texImg *bmpPowerOff; static GRRLIB_texImg *bmpPowerOn; -static Sound_t tcWaveRes[4]; +static Sound_t tcWaveRes[SUBCHASE_SOUND_NSOUNDS]; static Blip_t blip[SUBCHASE_BLIP_COLUMNS][SUBCHASE_BLIP_ROWS]; static Stat_t digit[2]; static Help_t help[] = { @@ -79,10 +79,10 @@ void SubChase_Init() int x, y; // Init sounds - Sound_set(&tcWaveRes[0], subchase_sonar_raw, subchase_sonar_raw_size, 119); - Sound_set(&tcWaveRes[1], subchase_charge_raw, subchase_charge_raw_size, 915); - Sound_set(&tcWaveRes[2], subchase_hit_raw, subchase_hit_raw_size, 1190); - Sound_set(&tcWaveRes[3], subchase_sink_raw, subchase_sink_raw_size, 1654); + Sound_set(&tcWaveRes[SUBCHASE_SOUND_SONAR], subchase_sonar_raw, subchase_sonar_raw_size, 119); + Sound_set(&tcWaveRes[SUBCHASE_SOUND_CHARGE], subchase_charge_raw, subchase_charge_raw_size, 915); + Sound_set(&tcWaveRes[SUBCHASE_SOUND_HIT], subchase_hit_raw, subchase_hit_raw_size, 1190); + Sound_set(&tcWaveRes[SUBCHASE_SOUND_SINK], subchase_sink_raw, subchase_sink_raw_size, 1654); // load images bmpScreen = GRRLIB_LoadTexture(subchase_screen_png); @@ -120,11 +120,17 @@ void SubChase_Init() } } -void SubChase_DeInit() +void SubChase_StopSound() { // stop all sounds... Platform_StopSound(); - +} + +void SubChase_DeInit() +{ + // stop all sounds... + SubChase_StopSound(); + SubChase_PowerOff(); GRRLIB_FreeTexture(bmpScreen); GRRLIB_FreeTexture(bmpBlipDim); GRRLIB_FreeTexture(bmpBlipBright); @@ -149,12 +155,12 @@ void SubChase_Paint() } // paint the backdrop - GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); // visualize the control states if (power) { - GRRLIB_DrawImg(realx(subchase_power_x), realy(subchase_power_y), bmpPowerOn, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(subchase_power_x), realy(subchase_power_y), bmpPowerOn, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); for (y = 0; y < SUBCHASE_BLIP_ROWS; y++){ for (x = 0; x < SUBCHASE_BLIP_COLUMNS; x++){ @@ -162,10 +168,10 @@ void SubChase_Paint() switch(pblip->status) { case BLIP_DIM: - GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlipDim, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlipDim, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); break; case BLIP_BRIGHT: - GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlipBright, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlipBright, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); break; case BLIP_OFF: default: @@ -175,12 +181,12 @@ void SubChase_Paint() } for(x = 0; x < 2; x++) { - GRRLIB_DrawTile(realx(digit[x].x), realy(digit[x].y), bmpDigits, 0, 1, 1, 0xFFFFFFFF, digit[x].val); + GRRLIB_DrawTile(realx(digit[x].x), realy(digit[x].y), bmpDigits, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, digit[x].val); } } else { - GRRLIB_DrawImg(realx(subchase_power_x), realy(subchase_power_y), bmpPowerOff, 0, 1, 1, 0xFFFFFFFF); + GRRLIB_DrawImg(realx(subchase_power_x), realy(subchase_power_y), bmpPowerOff, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF); } } @@ -209,13 +215,6 @@ void SubChase_PlaySound(int nSound, unsigned int nFlags) Platform_PlaySound(&tcWaveRes[nSound], nFlags); } -void SubChase_StopSound() -{ - // stop all sounds... - Platform_StopSound(); -} - - //---------------------------------------------------------------------------- // local fcn's // diff --git a/source/platform/ReadMe.txt b/source/platform/ReadMe.txt new file mode 100644 index 0000000..0be5b37 --- /dev/null +++ b/source/platform/ReadMe.txt @@ -0,0 +1,88 @@ +======================================================================== + MICROSOFT FOUNDATION CLASS LIBRARY : LEDhead +======================================================================== + + +AppWizard has created this LEDhead application for you. This application +not only demonstrates the basics of using the Microsoft Foundation classes +but is also a starting point for writing your application. + +This file contains a summary of what you will find in each of the files that +make up your LEDhead application. + +LEDhead.dsp + This file (the project file) contains information at the project level and + is used to build a single project or subproject. Other users can share the + project (.dsp) file, but they should export the makefiles locally. + +LEDhead.h + This is the main header file for the application. It includes other + project specific headers (including Resource.h) and declares the + CLEDheadApp application class. + +LEDhead.cpp + This is the main application source file that contains the application + class CLEDheadApp. + +LEDhead.rc + This is a listing of all of the Microsoft Windows resources that the + program uses. It includes the icons, bitmaps, and cursors that are stored + in the RES subdirectory. This file can be directly edited in Microsoft + Visual C++. + +LEDhead.clw + This file contains information used by ClassWizard to edit existing + classes or add new classes. ClassWizard also uses this file to store + information needed to create and edit message maps and dialog data + maps and to create prototype member functions. + +res\LEDhead.ico + This is an icon file, which is used as the application's icon. This + icon is included by the main resource file LEDhead.rc. + +res\LEDhead.rc2 + This file contains resources that are not edited by Microsoft + Visual C++. You should place all resources not editable by + the resource editor in this file. + + + +///////////////////////////////////////////////////////////////////////////// + +For the main frame window: + +MainFrm.h, MainFrm.cpp + These files contain the frame class CMainFrame, which is derived from + CFrameWnd and controls all SDI frame features. + +///////////////////////////////////////////////////////////////////////////// + + + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named LEDhead.pch and a precompiled types file named StdAfx.obj. + +Resource.h + This is the standard header file, which defines new resource IDs. + Microsoft Visual C++ reads and updates this file. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" to indicate parts of the source code you +should add to or customize. + +If your application uses MFC in a shared DLL, and your application is +in a language other than the operating system's current language, you +will need to copy the corresponding localized resources MFC42XXX.DLL +from the Microsoft Visual C++ CD-ROM onto the system or system32 directory, +and rename it to be MFCLOC.DLL. ("XXX" stands for the language abbreviation. +For example, MFC42DEU.DLL contains resources translated to German.) If you +don't do this, some of the UI elements of your application will remain in the +language of the operating system. + +///////////////////////////////////////////////////////////////////////////// diff --git a/source/platform/TODO.TXT b/source/platform/TODO.TXT new file mode 100644 index 0000000..c9f94c1 --- /dev/null +++ b/source/platform/TODO.TXT @@ -0,0 +1,4 @@ +BUGS +- if you switch to another program then back, focus is not set to game window +- baseball: no pro2 support +- football2: if game is tied after a quarter of overtime, game never ends! diff --git a/source/platform/help.c b/source/platform/help.c index 0f80f88..676a4c6 100644 --- a/source/platform/help.c +++ b/source/platform/help.c @@ -2,6 +2,10 @@ * LEDhead for Wii * Copyright (C) 2017-2020 Nebiun * + * Based on the handheld electronic games by Mattel Electronics. + * All trademarks copyrighted by their respective owners. This + * program is not affiliated or endorsed by Mattel Electronics. + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -24,10 +28,15 @@ #include "WKB_png.h" #include "WKBUD_png.h" #include "WKBLR_png.h" +#include "WKBLR1_png.h" #include "WKPLUS_png.h" #include "WKMINUS_png.h" #include "WKHOME_png.h" #include "WKDPAD_png.h" +#include "WKU_png.h" +#include "WKD_png.h" +#include "WKL_png.h" +#include "WKR_png.h" #include "WKUD_png.h" #include "WKLR_png.h" @@ -42,10 +51,15 @@ static void _key_init(void) key_img[WK_B] = GRRLIB_LoadTexture(WKB_png); key_img[WK_BUD] = GRRLIB_LoadTexture(WKBUD_png); key_img[WK_BLR] = GRRLIB_LoadTexture(WKBLR_png); + key_img[WK_BLR1] = GRRLIB_LoadTexture(WKBLR1_png); key_img[WK_PLUS] = GRRLIB_LoadTexture(WKPLUS_png); key_img[WK_MINUS] = GRRLIB_LoadTexture(WKMINUS_png); key_img[WK_HOME] = GRRLIB_LoadTexture(WKHOME_png); key_img[WK_DPAD] = GRRLIB_LoadTexture(WKDPAD_png); + key_img[WK_U] = GRRLIB_LoadTexture(WKU_png); + key_img[WK_D] = GRRLIB_LoadTexture(WKD_png); + key_img[WK_L] = GRRLIB_LoadTexture(WKL_png); + key_img[WK_R] = GRRLIB_LoadTexture(WKR_png); key_img[WK_UD] = GRRLIB_LoadTexture(WKUD_png); key_img[WK_LR] = GRRLIB_LoadTexture(WKLR_png); } @@ -58,7 +72,7 @@ void Platform_Help(Help_t *vect, int n) _key_init(); for(i=0; i