From 2da95a2e8aefa80b4bbb99d094c8b67854deca0b Mon Sep 17 00:00:00 2001 From: oz Date: Sat, 12 Dec 2020 16:36:20 +0300 Subject: [PATCH] score, high_score ready. Added dialog rc. --- Doc/FuncStats.xlsx | Bin 37337 -> 37486 bytes SpaceCadetPinball/SpaceCadetPinball.rc | 214 +++++++++++++++++- SpaceCadetPinball/high_score.cpp | 296 ++++++++++++++++++++++++- SpaceCadetPinball/high_score.h | 36 ++- SpaceCadetPinball/pb.cpp | 2 +- SpaceCadetPinball/pb.h | 3 +- SpaceCadetPinball/resource.h | 21 +- SpaceCadetPinball/score.cpp | 160 ++++++++++++- SpaceCadetPinball/score.h | 27 +-- 9 files changed, 720 insertions(+), 39 deletions(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index 7be464b2c6d026f6b0f9297b5f70ea60fe9ff3bc..2de37c23d4b777ef145e9af2bacc8e6985b47cfb 100644 GIT binary patch delta 30687 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%0D00l8GSQ2VTS~220jB9xT#95J>U|A^~pB6VF_w; za7q_>?OHzU`^(R;?+?-%+`d2-j>3esS9`;{DQWD*7^iFff^-N_*9aHyBCa>7A!-Sg z7MYb%Bu#!*GI^vbnQj?!rzy{T=Ql(cAvfjqs462~Lu!PSN&T$@fp`MhFWH2V93OiZf4 zGca{DjyQr5bQt(i9k49%@E8hG#!b<>1X@mV@1Boh`vixFw@#2-fYH2@m-N=(fL%CJ z`z4HK&T?om8_bdx9dWvwANSOR;Ub%gzqRCm>p#HOlsRzGd zM7cW=bA5%Xu|Q=L-zI*4u>IJE*f9YI9IFiI&!_on_7-yC$TsmeHfbqgdJ2V0#@GJk zVyLNXE=G}MDnvi1JUN^8-~uv*>2#$@_okPfz|DG-l!1OE9g=R}q^N@=0H+1B)mA{p z>H_R}=XBHeNiZw%NhaDl4>HY+syE)|T0rM65DZ#x3=r=Yvd9Ax^?Y)hFTQT`(rtE8 zXXfyGEe$B@Ve8N}Z%DO4pnWTtu;!f-aF{Fxo88<7hE}t7R|CkmJsy|fi5@a#n&E-w zq3tqme&@_^W%KsiN8w7CWiWw<{!8HSUA1b^{SV7!-iGy)G&bnrrW{{9OIe8A0YGzC z3hRuR0vUOZQarGJ@#nWg1Lv-Tg|u6B<_BX<&FnAxmthh}%VF5Pf`MTdZ|rKYrmI$8 zSw&pMChYN%{MwJ&&%k-liZ`*zR9@p#tnbt5={Ubg!xLj<1}hsjUDu6SPBg+M@VDH= z<)iGX4O19Y^26Jxi4=9Ie9^!WN#W^BLB=&u0jE6(wL+C?gqnd3aC+svDvy@Y1= z^${-`C6x+Er(J6&$6Vax7tD;37Wm>8&Q6)|DooAiWVCq)o+h-CBr!Q7*~7P;hE9a_cJEv_louY@QV2(h21osmN^>C!4Z~ZM=J2^s`V8PWw~; zvbt*Tin)N8Q*_ZbK0@Ew*hEe1&4vY>_WnSUzkp4+(vWm{HHEX>om?U3*CbJO8tf41 zfU4i~!e8`qZd6~_q-%I#XN$^mjmU-Oi#H|J82{moh%sGk0H39tgA(|X#~qu829K!% zaXU#9E}MoWiXIv?p_M~y{goN*7Pc2=*g>HCH^GA=h3{P%Op+x3@D)bau>JbFha2t{kZi zOC>>IcE)phdP*!&tRjd<$%Lx?luGj%pdoD|i71BaZaPAw84j-3%A;7t5RZyp0J*_) zX#Uh_a3@k5tjc7D)Vr^xF^VA<0VsAS$U@Ug^-g?xO5GhD2U4PGqeQDPkCQ2~iGsle zh{SjdtcyZskb@eUV6{@xcOxnJfo?B4YDSWqvl8nC`zIM$2T?R|)JL};I6WXZ7A>OB zSd%wx5~2qltVMl%K02WWBvR%l=#vs|JZ{e^ly8TYQWiMDC}j`R2%m3FX$fgmJoRCN zj^n-2bVuA=O^u6xJkhXeFf5wrZ_Vc+UlsTYF^Q)y*tyt+`7ztG@(TYO2BHGhlYT}V8O9xH`;!Yuxkis~YiDK^ zyNZ-nqmq~FTtjVa(OeWo&nc7w>_#RO`BvK>-pMmAT+H3h?GyM3EiQwwt9|5k1yZQTs%enSDqaYF2}&<~#UwTjl{2e7D{q28<3cl$#j7YIwrQ%d8DNKyAbo#VG1-j!vCAqa*&q3dqK% zcDOJBF}c6#USVyD(H&$)AUX|$@$1kOe&WLia~+637ON!7HfJ%x)TUvxJ;9?x;3q!p z{aacl%Jd5)cp$7>wM@R@?0v6b7fKC^y*<@O#=tcu@j<-=HXRv65;eOB$p79zGTcQd}oLiFk%>S#TEnXF1(OXNo&bm{+@xC`5xa64cJv`_P)6sXFD}DRhQtjmw63tOq`z&8z5o}Lm1Kg zzGNbus2auaW*?qbDs%iQmX0`kpXGqNST3RM$VSXkDW zq#B8)_qO;X4X>@!hEXr|khtnWqd74X4o=KXC4T9JtygY7)MUCpM85I6Awk30G9%U_ z4#Y4H(+#TA+a!ZH*Vf8U901h=*e+QA(#g&Y6fCkfG+Jv0BEzdHWjLd}@n}4;Lt${k zJuByq=JM-Q=f|f5%6yIH;o_F(`w2r%)=VC~0ukDz4r_MGB47`SgA40=7P3Ejuv`>`O+}aeQHVaa@ytj<$Cpblhk=w>xQX;+ts@ z->o8~LDtGAhxkPJ7lr6Mdh>SA)qogvwUPisUWx+=pgS+^`NZyegCo?J3NdjaF+LDM z&)c==?BA#}D8ZT6r;|5dp)@~!R7lex=@btX;Xu4bxxibQcYL|}Q!I^@0VLN2CA9}e z1s1J*nwfq1g|VKVyN*K z?6_+gLJ+s&#{eY4R`@PZN;M0df`t%m>q9qiBOb9=qTnX#x8#xdSpH9Ja3{Ln%s0@B zrwujSix5m_*5uRhOyiQ{(GgYmZCqQwuVMb!F1>VEv+Pm)a|2c63CQC;JSsmLSksdG z+_HARN{jPmxCW)G?q;Dzg^_diA<@PEzooohu4ytBGBLxpQ2RsZr4JJ3-V(vE3|x{93HaOo28ZJ zLB)-dVx0HJZ5Wj)9$mKfswa9*q|>_OTDW!P8R7G(Dg1*C$CCJASPdV#;o;?qi+aIR z0$(Ci)lwLN@~uH?Z3(4@HFLU}AByxjFjGgd86S|HXxIa&beM|-yMSb_z8dO?f{Wq@EIP;uhWcn6%=ls z+qzNTBA-2#(nR-YxEBW<=t|h~h>HOYcpmsvWn0Mz%-r{|5riI-{r3A>#i9ns-5LC| z@P4-Rb5AvTfiJgUlBgf5;eJV6!=3Cgwu)}^IxILf>8yQi2@6!Aj4QqA19>y8&yXiU z!kAYd(y(P1w>2e|l8|24xpnZAIxpgTjW&>Uci&%lO{Snd1U4eEIgxdrW{!9ZUHHS zF)r+mpd9eG+--ZLgR9N-_777U=zU2#@ZAC%%-BG=B56rgzk{>V;>52o$`=DES|0l= z2`ChFl9Yl)YUE93s)6P7Fie-+wt-2A%z6>5Hvk)721`Wt6I|6gc;2IcRV&<44%5jS zuNVghn*}w-#mV^X_@n541N3%M;SAu;$D-DOsn|3+QuH-g?!GBABJNsq;g zRHi3*Q8xE5Yg?nUtwI*qjK`a3hJ(+H;^MQl#C^68woYZ^pa$hl_?Oc1Zn=%7eJSL6 zZ@}U$vIyI#sepoPp{9u1!qAC@h8KD90&XuLbB85=|oq?&;cV^Wgx zj8f5d9Y{iZ9dMud%<$j4kRC$^KMUD)>U6+#{!`XW@P4|rn&VO?5L@%SZRsDFM#F4@-r+Q zEFb0n22^-4t;OYZyMj2X&Ua2NUBR{#)5)ox>r1=wqVTz1_^lmmF}@#!wkmFt#8m||0roXF0h=6e?O1ws7RJUzr6><9xOrqY}kw4p$S0V_v$Va-q56zE0j|-SRXl z6d68k&##?dPk^-++ZCxx1-Nxi-1Lq1E*dG1T}O7NpoXT{jkI1O2ak`Tj>Lb2*E7me;cA^zkcaNlZ%GK@^AI~c+Kz>Tx_pitlNY{}w~1ObF^B>DGbO2Itzowu)GWU{g@pum};3^bsWs!_ky zThQp24O(>6&y5~AfBW_L-%zctdjIP2x9T_nZlN^-emB0B%mg&F0xiwHExx-e?$J8^ zEa_|MYu3k4b|;U+4s}|g(y~Vnqr(QQT74Q%_ApDbEUj&K0ED}pYnBA~fJue-vpi0I z72pFT;D@>1Gk*X_J@3{(hqJ>otLYgmGRH@Y^(U6H>pr`^+ao1QmWMNwCZoPbmyJYQ z+-N-3Q(1t$7S3%!h)RKRzeBzeXzp4h}olfY`8E8Cj^b3{?6A|0HM> z8qfkX`Ud!Yw|>%5;lF#ZvoQ>n+2gnsaI(FM0giuGSOb11-;OC|kA8*;$-Fz+q?9<> z2zh=qxxLyg)OxhTPX_+j$lHJL=)1qaeSiGxZK*^G$>Y50{R3sB(<~6+BD`X8Q*9+L z_UU1E*H^7j&FVJEA*4K9D86U4x7!}sbe&OP9?F=zb8r0JvQ04lL2T7Cv0ax}6Nvjr zV7$sn3TWBvq}WkA`;%){;;B2R^?jF0&DC+%TDtDJz3TCr!;D|ZHYfFdqM~L~@q)zO zxtqJsEqBi5c;_Nc*I3X$$K{PD~0BR)C7 z9g3T3$jLAsT)hGubNPT0hZt zsZXo#aPGGIMP3u)aTVFSX#>RyX0h2MSB5PLEkmYLJl`qBY#KhCfD_V41}T;t?Bv^p z3cG&$1jk2{Jglh0Y*Z6bMnK~w%H#Uy)LBB6LsE3}sV=nbD5hDN6!y6)-vYu}+bvqTQ_hyQi zhue14Q{9C8hQc3mz$M)}te`_-yXjuwVysBJfNq7W<@bFyf%3dQ_x7lIyuA-M=1qLw zP&`y6S-(!edfRpi`P)ibM$Fl8S1Mxo@Rqr#lSb&lvZ~e88h#|jQ-&j<8#=QBlp}V8 zysK(0Z>ahMZ|wf$DFkqlw_l18{?C7v>m6-?N5>T>$i)@65zU8pl{-$Dn}%Ok6BiGH za|MS8hXmXKHk|*Se2#-df!&mU|EA+CU$HX&|IZu#cNr%$F6kBjHSEU8;^N@w;o;y= o{dW=k%_=-@<`ond6~`0<#jS`lk1@m(i-@a=VJF&(!v5j^0Uu(&GXMYp delta 30564 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 diff --git a/SpaceCadetPinball/SpaceCadetPinball.rc b/SpaceCadetPinball/SpaceCadetPinball.rc index 50d6d33..f6e1dca 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.rc +++ b/SpaceCadetPinball/SpaceCadetPinball.rc @@ -113,7 +113,219 @@ PBMSG_FT RCDATA "PB_MSGFT.bin" // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -ICON_1 ICON "icon_1.ico" +ICON_1 ICON "icon_1.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +DIALOG_1 DIALOG 18, 18, 157, 78 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "About" +BEGIN + CTEXT "3D-Pinball for Windows",-1,11,6,135,8 + CTEXT "Version 1.0",-1,40,37,76,8 + ICON "ICON_1",-1,69,18,16,16 + DEFPUSHBUTTON "Ok",1,66,60,24,12 +END + +DLG_HIGHSCORES DIALOGEX 20, 22, 274, 141 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "High Scores" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + DEFPUSHBUTTON "OK",DLG_HIGHSCORES_Ok,109,120,50,14 + PUSHBUTTON "Cancel",DLG_HIGHSCORES_Cancel,163,120,50,14 + PUSHBUTTON "&Clear",DLG_HIGHSCORES_Clear,217,120,50,14 + LTEXT "Name",701,49,7,24,8 + LTEXT "Score",702,200,7,20,8 + LTEXT "Rank",703,13,7,20,8 + RTEXT "1",704,13,31,16,12 + RTEXT "2",705,13,47,16,12 + RTEXT "3",706,13,63,16,12 + RTEXT "4",707,13,79,16,12 + RTEXT "5",708,13,95,16,12 + LTEXT "",DLG_HIGHSCORES_StaticName1,49,31,120,12 + LTEXT "",DLG_HIGHSCORES_StaticName2,49,47,120,12 + LTEXT "",DLG_HIGHSCORES_StaticName3,49,63,120,12 + LTEXT "",DLG_HIGHSCORES_StaticName4,49,79,120,12 + LTEXT "",DLG_HIGHSCORES_StaticName5,49,95,120,12 + RTEXT "",DLG_HIGHSCORES_Score1,180,31,58,12 + RTEXT "",DLG_HIGHSCORES_Score2,180,47,58,12 + RTEXT "",DLG_HIGHSCORES_Score3,180,63,58,12 + RTEXT "",DLG_HIGHSCORES_Score4,180,79,58,12 + RTEXT "",DLG_HIGHSCORES_Score5,180,95,58,12 + EDITTEXT DLG_HIGHSCORES_EditName1,47,29,120,12,WS_DISABLED + EDITTEXT DLG_HIGHSCORES_EditName2,47,45,120,12,WS_DISABLED + EDITTEXT DLG_HIGHSCORES_EditName3,47,61,120,12,WS_DISABLED + EDITTEXT DLG_HIGHSCORES_EditName4,47,77,120,12,WS_DISABLED + EDITTEXT DLG_HIGHSCORES_EditName5,47,93,120,12,WS_DISABLED + CONTROL "",606,"Static",SS_BLACKFRAME,7,21,259,92 +END + +EDIT_COMPONENTS DIALOG 0, 0, 312, 94 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU +CAPTION "Edit Pinball Components FOR TESTING ONLY" +BEGIN + LISTBOX 100,1,12,68,79,LBS_SORT | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK",1,81,75,41,14 + GROUPBOX "",103,136,0,175,93 + EDITTEXT 130,141,10,34,12 + EDITTEXT 131,141,23,34,12 + EDITTEXT 132,141,36,34,12 + EDITTEXT 133,141,49,34,12 + EDITTEXT 134,141,62,34,12 + EDITTEXT 135,141,75,34,12 + LTEXT "Text",136,178,12,130,8 + LTEXT "Text",137,178,25,130,8 + LTEXT "Text",138,178,38,130,8 + LTEXT "Text",139,178,51,130,8 + LTEXT "Text",140,178,64,130,8 + LTEXT "Text",141,178,77,130,8 + EDITTEXT 149,142,10,38,12 + EDITTEXT 150,142,23,38,12 + EDITTEXT 151,142,36,38,12 + EDITTEXT 152,142,49,38,12 + EDITTEXT 153,142,62,38,12 + EDITTEXT 154,142,75,38,12 + LTEXT "1",156,184,12,120,8 + LTEXT "2",157,184,25,120,8 + LTEXT "3",158,184,38,120,8 + LTEXT "4",159,184,51,120,8 + LTEXT "5",160,184,64,120,8 + LTEXT "6",161,184,77,120,8 + PUSHBUTTON "Reset",163,81,56,41,12 + LTEXT "Text",164,146,26,162,8 + LTEXT "Text",165,146,54,162,8 + LTEXT "Text",166,146,81,162,8 + PUSHBUTTON "Change...",167,245,10,62,14 + PUSHBUTTON "Change...",168,245,38,62,14 + PUSHBUTTON "Change...",169,245,65,62,14 + CONTROL "Sound Effects",170,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,74,10,58,10 + CONTROL "Physics",171,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,73,24,59,10 + CONTROL "Scoring",172,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,73,38,40,10 + LTEXT "Text",173,146,13,97,8 + LTEXT "Text",174,146,41,97,8 + LTEXT "Text",175,146,68,97,8 + LTEXT "Components:",176,2,3,43,8 +END + +KEYMAPPER DIALOG 2, 9, 284, 183 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU +CAPTION "3D Pinball: Player Controls" +FONT 8, "MS Shell Dlg" +BEGIN + PUSHBUTTON "OK",1,119,163,50,14 + PUSHBUTTON "Cancel",2,173,163,50,14 + PUSHBUTTON "&Default",501,227,163,50,14 + LTEXT "&Left Flipper",901,20,87,39,10 + COMBOBOX 401,66,85,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Right &Flipper",902,146,87,44,10 + COMBOBOX 402,192,85,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Left &Table Bump",904,20,107,34,17 + COMBOBOX 404,66,108,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Right Table Bump",905,146,107,38,19 + COMBOBOX 405,192,108,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&BottomTable Bump",906,20,131,41,18 + COMBOBOX 406,66,133,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Plunger",903,146,136,39,8 + COMBOBOX 403,192,133,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "To change game controls, choose the control options you want, click the Arrow buttons to change specific keys, and then choose OK.",801,14,17,249,18 + LTEXT "To restore 3D Pinball to its original settings, choose Default, and then choose OK. To use the Arrow keys on the numeric keypad, make sure NUMLOCK is off.",802,14,38,256,25 + GROUPBOX "Control Options",908,7,71,269,87 + GROUPBOX "Instructions",909,7,5,269,61 +END + +XXDLG_HIGHSCORES DIALOG 20, 22, 211, 116 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "High Scores" +BEGIN + DEFPUSHBUTTON "OK",1,32,97,33,14,BS_LEFTTEXT + PUSHBUTTON "Cancel",2,89,97,33,14 + PUSHBUTTON "&Clear",112,146,97,33,14 + LTEXT "Name",-1,51,8,24,8 + LTEXT "Score",-1,160,8,20,8 + LTEXT "Rank",-1,15,8,20,8 + RTEXT "1",-1,15,28,16,12 + RTEXT "2",-1,15,40,16,12 + RTEXT "3",-1,15,52,16,12 + RTEXT "4",-1,15,64,16,12 + RTEXT "5",-1,15,76,16,12 + LTEXT "",401,51,28,88,12 + LTEXT "",402,51,40,88,12 + LTEXT "",403,51,52,88,12 + LTEXT "",404,51,64,88,12 + LTEXT "",405,51,76,88,12 + RTEXT "",501,140,28,58,12 + RTEXT "",502,140,40,58,12 + RTEXT "",503,140,52,58,12 + RTEXT "",504,140,64,58,12 + RTEXT "",505,140,76,58,12 + EDITTEXT 601,49,26,88,12,WS_DISABLED + EDITTEXT 602,49,38,88,12,WS_DISABLED + EDITTEXT 603,49,50,88,12,WS_DISABLED + EDITTEXT 604,49,62,88,12,WS_DISABLED + EDITTEXT 605,49,74,88,12,WS_DISABLED + CONTROL "",-1,"Static",SS_BLACKFRAME,9,22,195,69 +END + +XXKEYMAPPER DIALOG 2, 9, 277, 158 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU +CAPTION "3D Pinball: Player Controls" +FONT 8, "MS Shell Dlg" +BEGIN + PUSHBUTTON "OK",1,221,84,50,14 + PUSHBUTTON "Cancel",2,221,105,50,14 + PUSHBUTTON "Default",501,221,127,50,14 + COMBOBOX 401,50,82,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX 402,157,82,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX 404,50,105,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX 405,157,105,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX 406,50,130,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX 403,157,130,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Plunger",811,114,133,39,8 + RTEXT "Right Flipper",807,107,84,46,10 + CTEXT "Left Table Bump",912,12,102,34,19 + CTEXT "Right Table Bump",914,115,102,38,19 + LTEXT "To change game controls, choose the control options you want, click the Arrow buttons to change specific keys, and then choose OK.",801,12,13,249,18 + LTEXT "To restore 3D Pinball to its original settings, choose Default, and then choose OK. To use the Arrow keys on the numeric keypad, make sure NUMLOCK is off.",802,12,32,256,25 + GROUPBOX "Control Options",908,5,67,214,87 + RTEXT "Left Flipper",803,9,84,39,10 + GROUPBOX "Instructions",909,5,1,265,61 + CTEXT "BottomTable Bump",916,7,127,41,19 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + "DIALOG_1", DIALOG + BEGIN + END + + "DLG_HIGHSCORES", DIALOG + BEGIN + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// AFX_DIALOG_LAYOUT +// + +DLG_HIGHSCORES AFX_DIALOG_LAYOUT +BEGIN + 0 +END ///////////////////////////////////////////////////////////////////////////// diff --git a/SpaceCadetPinball/high_score.cpp b/SpaceCadetPinball/high_score.cpp index e00ab80..411fa6b 100644 --- a/SpaceCadetPinball/high_score.cpp +++ b/SpaceCadetPinball/high_score.cpp @@ -1,16 +1,306 @@ #include "pch.h" #include "high_score.h" -int high_score::read(CHAR* table, int* ptrToSmth) +#include "fullscrn.h" +#include "memory.h" +#include "options.h" +#include "pinball.h" +#include "resource.h" +#include "winmain.h" + +int high_score::dlg_enter_name; +int high_score::dlg_score; +int high_score::position; +LPCSTR high_score::default_name; +high_score_struct* high_score::dlg_hst; + +winhelp_entry high_score::winHelpArgs[21] { + winhelp_entry{0x70, 0x3E9}, + winhelp_entry{0x191, 0x3EB}, + winhelp_entry{0x1F5, 0x3EB}, + winhelp_entry{0x259, 0x3EB}, + winhelp_entry{0x192, 0x3EB}, + winhelp_entry{0x193, 0x3EB}, + winhelp_entry{0x194, 0x3EB}, + winhelp_entry{0x195, 0x3EB}, + winhelp_entry{0x1F6, 0x3EB}, + winhelp_entry{0x1F7, 0x3EB}, + winhelp_entry{0x1F8, 0x3EB}, + winhelp_entry{0x1F9, 0x3EB}, + winhelp_entry{0x2BD, 0x3EB}, + winhelp_entry{0x2BE, 0x3EB}, + winhelp_entry{0x2BF, 0x3EB}, + winhelp_entry{0x2C0, 0x3EB}, + winhelp_entry{0x2C1, 0x3EB}, + winhelp_entry{0x2C2, 0x3EB}, + winhelp_entry{0x2C3, 0x3EB}, + winhelp_entry{0x2C4, 0x3EB}, + winhelp_entry{0, 0}, +}; + +int high_score::read(high_score_struct* table, int* ptrToSmth) +{ + char Buffer[20]; + + int scoreSum = 0; + clear_table(table); + char* buf1 = memory::allocate(300u); + if (!buf1) + return 1; + char* buf2 = memory::allocate(300u); + int position = 0; + high_score_struct* tablePtr = table; + const CHAR* optPath = pinball::get_rc_string(166, 0); + do + { + _itoa_s(position, Buffer, 10); + lstrcatA(Buffer, ".Name"); + options::get_string(optPath, Buffer, buf1, pinball::WindowName, 32); + buf1[32] = 0; + lstrcpyA(tablePtr->Name, buf1); + _itoa_s(position, Buffer, 10); + lstrcatA(Buffer, ".Score"); + options::get_string(optPath, Buffer, buf1, pinball::WindowName, 300); + tablePtr->Score = atol(buf1); + for (int i = lstrlenA(tablePtr->Name); --i >= 0; scoreSum += tablePtr->Name[i]) + { + } + scoreSum += tablePtr->Score; + ++position; + ++tablePtr; + } + while (position < 5); + scramble_number_string(scoreSum, buf1); + options::get_string(optPath, "Verification", buf2, pinball::WindowName, 300); + if (lstrcmpA(buf1, buf2)) + clear_table(table); + memory::free(buf1); + memory::free(buf2); return 0; } -int high_score::write(CHAR* table, int* ptrToSmth) +int high_score::write(high_score_struct* table, int* ptrToSmth) { + char Buffer[20]; + + high_score_struct* tablePtr = table; + int scoreSum = 0; + CHAR* buf = memory::allocate(300u); + if (!buf) + return 1; + int position = 0; + const CHAR* optPath = pinball::get_rc_string(166, 0); + do + { + _itoa_s(position, Buffer, 10); + lstrcatA(Buffer, ".Name"); + options::set_string(optPath, Buffer, tablePtr->Name); + _itoa_s(position, Buffer, 10); + lstrcatA(Buffer, ".Score"); + _ltoa_s(tablePtr->Score, buf, 300, 10); + options::set_string(optPath, Buffer, buf); + for (int i = lstrlenA(tablePtr->Name); --i >= 0; scoreSum += tablePtr->Name[i]) + { + } + scoreSum += tablePtr->Score; + ++position; + ++tablePtr; + } + while (position < 5); + scramble_number_string(scoreSum, buf); + options::set_string(optPath, "Verification", buf); + memory::free(buf); return 0; } -void high_score::show_high_score_dialog(CHAR* table) +void high_score::clear_table(high_score_struct* table) { + for (int index = 5; index; --index) + { + table->Score = -999; + table->Name[0] = 0; + ++table; + } +} + +int high_score::get_score_position(high_score_struct* table, int score) +{ + if (score <= 0) + return -1; + + for (int position = 0; position < 5; position++) + { + if (table[position].Score < score) + return position; + } + return -1; +} + +int high_score::place_new_score_into(high_score_struct* table, int score, LPSTR scoreStr, int position) +{ + if (position >= 0) + { + if (position <= 4) + { + high_score_struct* tablePtr = table + 4; + int index = 5 - position; + do + { + --index; + memcpy(tablePtr, &tablePtr[-1], sizeof(high_score_struct)); + --tablePtr; + } + while (index); + } + high_score_struct* posTable = &table[position]; + posTable->Score = score; + if (lstrlenA(scoreStr) >= 31) + scoreStr[31] = 0; + lstrcpyA(posTable->Name, scoreStr); + posTable->Name[31] = 0; + } + return position; +} + +void high_score::scramble_number_string(int Value, char* Buffer) +{ + _ltoa_s(Value, Buffer, 300, 10); +} + +void high_score::show_high_score_dialog(high_score_struct* table) +{ + dlg_enter_name = 0; + dlg_score = 0; + dlg_hst = table; + DialogBoxParamA(winmain::hinst, "dlg_highscores", winmain::hwnd_frame, HighScore, 0); +} + +void high_score::show_and_set_high_score_dialog(high_score_struct* table, int score, int pos, LPCSTR defaultName) +{ + position = pos; + dlg_score = score; + dlg_hst = table; + dlg_enter_name = 1; + default_name = defaultName; + while (DialogBoxParamA(winmain::hinst, "dlg_highscores", winmain::hwnd_frame, HighScore, 0)) + { + } +} + +INT_PTR __stdcall high_score::HighScore(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HWND parent; + int nIDDlgItem; + CHAR String1[256]; + CHAR name[32]; + + switch (msg) + { + case WM_CLOSE: + SendMessageA(hWnd, WM_COMMAND, WM_DESTROY, 0); + break; + case WM_HELP: + WinHelpA(*(HWND*)(lParam + 12), "pinball.hlp", HELP_WM_HELP, (ULONG_PTR)winHelpArgs); + break; + case WM_CONTEXTMENU: + WinHelpA((HWND)wParam, "pinball.hlp", HELP_CONTEXTMENU, (ULONG_PTR)winHelpArgs); + break; + case WM_INITDIALOG: + show_high_scores(hWnd, dlg_hst); + for (nIDDlgItem = DLG_HIGHSCORES_EditName1; nIDDlgItem < 611; ++nIDDlgItem) + { + ShowWindow(GetDlgItem(hWnd, nIDDlgItem), 0); + } + if (dlg_enter_name == 1) + { + if (position == -1) + { + dlg_enter_name = 0; + return 1; + } + HWND nameTextBox = GetDlgItem(hWnd, position + DLG_HIGHSCORES_EditName1); + ShowWindow(nameTextBox, 5); + EnableWindow(nameTextBox, 1); + SetFocus(nameTextBox); + if (default_name) + { + SetWindowTextA(nameTextBox, default_name); + SendMessageA(nameTextBox, EM_SETSEL, 0, -1); + } + SendMessageA(nameTextBox, EM_SETLIMITTEXT, 31u, 0); + } + else + { + SetFocus(hWnd); + } + parent = GetParent(hWnd); + if (parent) + fullscrn::center_in(parent, hWnd); + return 0; + case WM_COMMAND: + switch (wParam) + { + case DLG_HIGHSCORES_Ok: + if (dlg_enter_name != 1) + { + break; + } + GetDlgItemTextA(hWnd, position + DLG_HIGHSCORES_EditName1, name, 32); + name[31] = 0; + place_new_score_into(dlg_hst, dlg_score, name, position); + break; + case DLG_HIGHSCORES_Cancel: + break; + case DLG_HIGHSCORES_Clear: + lstrcpyA(String1, pinball::get_rc_string(41, 0)); + if (MessageBoxA(hWnd, pinball::get_rc_string(40, 0), String1, MB_DEFBUTTON2 | MB_OKCANCEL) == 1) + { + clear_table(dlg_hst); + if (dlg_enter_name) + EndDialog(hWnd, 1); + else + EndDialog(hWnd, 0); + } + return 0; + default: + return 0; + } + + dlg_enter_name = 0; + EndDialog(hWnd, 0); + return 1; + } + return 0; +} + + +void high_score::show_high_scores(HWND hDlg, high_score_struct* table) +{ + high_score_struct* tablePtr = table; + int nextPosition = 0; + for (int i = 0; i < 5; ++i) + { + if (dlg_enter_name == 1 && position == i) + { + hsdlg_show_score(hDlg, " ", dlg_score, i); + nextPosition = 1; + } + hsdlg_show_score(hDlg, tablePtr->Name, tablePtr->Score, i + nextPosition); + ++tablePtr; + } +} + +void high_score::hsdlg_show_score(HWND hDlg, LPCSTR name, int score, int position) +{ + CHAR scoreStr[36]; + if (position < 5) + { + score::string_format(score, scoreStr); + if (scoreStr[0]) + { + SetWindowTextA(GetDlgItem(hDlg, position + DLG_HIGHSCORES_StaticName1), name); + SetWindowTextA(GetDlgItem(hDlg, position + DLG_HIGHSCORES_Score1), scoreStr); + } + } } diff --git a/SpaceCadetPinball/high_score.h b/SpaceCadetPinball/high_score.h index 667905a..8e80592 100644 --- a/SpaceCadetPinball/high_score.h +++ b/SpaceCadetPinball/high_score.h @@ -1,8 +1,38 @@ #pragma once + +struct high_score_struct +{ + char Name[32]; + int Score; +}; + +struct winhelp_entry +{ + int ControlId; + int ContextId; +}; + + class high_score { public: - static int read(CHAR* table, int* ptrToSmth); - static int write(CHAR* table, int* ptrToSmth); - static void show_high_score_dialog(CHAR* table); + static int read(high_score_struct* table, int* ptrToSmth); + static int write(high_score_struct* table, int* ptrToSmth); + static void clear_table(high_score_struct* table); + static int get_score_position(high_score_struct* table, int score); + static int place_new_score_into(high_score_struct* table, int score, LPSTR scoreStr, int position); + static void scramble_number_string(int Value, char* Buffer); + + static void show_high_score_dialog(high_score_struct* table); + static void show_and_set_high_score_dialog(high_score_struct* table, int score, int pos, LPCSTR defaultName); + static INT_PTR __stdcall HighScore(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + static void show_high_scores(HWND hDlg, high_score_struct* table); + static void hsdlg_show_score(HWND hDlg, LPCSTR name, int score, int position); +private : + static int dlg_enter_name; + static int dlg_score; + static int position; + static LPCSTR default_name; + static high_score_struct* dlg_hst; + static winhelp_entry winHelpArgs[21]; }; diff --git a/SpaceCadetPinball/pb.cpp b/SpaceCadetPinball/pb.cpp index 047d077..4fa0d1b 100644 --- a/SpaceCadetPinball/pb.cpp +++ b/SpaceCadetPinball/pb.cpp @@ -19,7 +19,7 @@ datFileStruct* pb::record_table = nullptr; int pb::time_ticks = 0, pb::demo_mode = 0, pb::cheat_mode = 0, pb::game_mode = 2, pb::mode_countdown_, pb:: ball_speed_limit, pb::state; float pb::time_now, pb::time_next; -char pb::highscore_table[32]; +high_score_struct pb::highscore_table[5]; int pb::init() { diff --git a/SpaceCadetPinball/pb.h b/SpaceCadetPinball/pb.h index 18bc3f2..e2fe988 100644 --- a/SpaceCadetPinball/pb.h +++ b/SpaceCadetPinball/pb.h @@ -1,4 +1,5 @@ #pragma once +#include "high_score.h" #include "partman.h" #include "TPinballTable.h" @@ -35,6 +36,6 @@ public: private : static int demo_mode, mode_countdown_; static float time_now, time_next; - static char highscore_table[32]; + static high_score_struct highscore_table[5]; static int state; }; diff --git a/SpaceCadetPinball/resource.h b/SpaceCadetPinball/resource.h index 8cb7725..4f7adb8 100644 --- a/SpaceCadetPinball/resource.h +++ b/SpaceCadetPinball/resource.h @@ -4,7 +4,9 @@ // #define IDS_STRING101 0 #define IDS_STRING102 1 +#define DLG_HIGHSCORES_Ok 1 #define IDS_STRING103 2 +#define DLG_HIGHSCORES_Cancel 2 #define IDS_STRING104 3 #define IDS_STRING105 4 #define IDS_STRING106 5 @@ -119,6 +121,7 @@ #define IDS_STRING211 110 #define IDS_STRING212 111 #define IDS_STRING213 112 +#define DLG_HIGHSCORES_Clear 112 #define IDS_STRING214 113 #define IDS_STRING215 114 #define IDS_STRING216 115 @@ -199,22 +202,36 @@ #define Menu1_Music 202 #define Menu1_Help_Topics 301 #define Menu1_Launch_Ball 401 +#define DLG_HIGHSCORES_StaticName1 401 #define Menu1_Pause_Resume_Game 402 +#define DLG_HIGHSCORES_StaticName2 402 #define Menu1_Full_Screen 403 +#define DLG_HIGHSCORES_StaticName3 403 #define Menu1_Demo 404 +#define DLG_HIGHSCORES_StaticName4 404 #define Menu1_Select_Table 405 +#define DLG_HIGHSCORES_StaticName5 405 #define Menu1_Player_Controls 406 #define Menu1_1Player 408 #define Menu1_2Players 409 #define Menu1_3Players 410 #define Menu1_4Players 411 -#define ID_GAME_D 40003 +#define DLG_HIGHSCORES_Score1 501 +#define DLG_HIGHSCORES_Score2 502 +#define DLG_HIGHSCORES_Score3 503 +#define DLG_HIGHSCORES_Score4 504 +#define DLG_HIGHSCORES_Score5 505 +#define DLG_HIGHSCORES_EditName1 601 +#define DLG_HIGHSCORES_EditName2 602 +#define DLG_HIGHSCORES_EditName3 603 +#define DLG_HIGHSCORES_EditName4 604 +#define DLG_HIGHSCORES_EditName5 605 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_RESOURCE_VALUE 203 #define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/SpaceCadetPinball/score.cpp b/SpaceCadetPinball/score.cpp index dd037c8..7119923 100644 --- a/SpaceCadetPinball/score.cpp +++ b/SpaceCadetPinball/score.cpp @@ -3,6 +3,7 @@ #include "loader.h" #include "memory.h" #include "partman.h" +#include "TDrain.h" #include "winmain.h" score_msg_font_type* score::msg_fontp; @@ -17,7 +18,7 @@ scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp) scoreStruct* score = (scoreStruct*)memory::allocate(sizeof(scoreStruct)); if (!score) return nullptr; - score->Unknown1 = -9999; + score->Score = -9999; score->BackgroundBmp = renderBgBmp; __int16* shortArr = (__int16*)partman::field_labeled(loader::loader_table, fieldName, datFieldTypes::ShortArray); if (!shortArr) @@ -26,20 +27,17 @@ scoreStruct* score::create(LPCSTR fieldName, gdrv_bitmap8* renderBgBmp) return nullptr; } int groupIndex = *shortArr++; - score->Short1 = *shortArr++; - score->Short2 = *shortArr++; - score->Short3 = *shortArr++; - score->Short4 = *shortArr; - char** bmpPtr = &score->Bitmap8Bit1; - int index = 10; - do + score->OffsetX = *shortArr++; + score->OffsetY = *shortArr++; + score->Width = *shortArr++; + score->Height = *shortArr; + + for (int index = 0; index < 10; index++) { - *bmpPtr = partman::field(loader::loader_table, groupIndex, datFieldTypes::Bitmap8bit); - ++bmpPtr; + score->CharBmp[index] = reinterpret_cast(partman::field( + loader::loader_table, groupIndex, datFieldTypes::Bitmap8bit)); ++groupIndex; - --index; } - while (index); return score; } @@ -150,3 +148,141 @@ void score::unload_msg_font() msg_fontp = nullptr; } } + +void score::erase(scoreStruct* score, int blitFlag) +{ + if (score) + { + if (score->BackgroundBmp) + gdrv::copy_bitmap( + &render::vscreen, + score->Width, + score->Height, + score->OffsetX, + score->OffsetY, + score->BackgroundBmp, + score->OffsetX, + score->OffsetY); + else + gdrv::fill_bitmap(&render::vscreen, score->Width, score->Height, score->OffsetX, score->OffsetY, 0); + if (blitFlag) + gdrv::blit( + &render::vscreen, + score->OffsetX, + score->OffsetY, + score->OffsetX + render::vscreen.XPosition, + score->OffsetY + render::vscreen.YPosition, + score->Width, + score->Height); + } +} + +void score::set(scoreStruct* score, int value) +{ + if (score) + { + score->Score = value; + score->DirtyFlag = true; + } +} + + +void score::update(scoreStruct* score) +{ + char scoreBuf[12]; + if (score && score->DirtyFlag && score->Score <= 1000000000) + { + score->DirtyFlag = false; + int x = score->Width + score->OffsetX; + int y = score->OffsetY; + erase(score, 0); + if (score->Score >= 0) + { + _ltoa_s(score->Score, scoreBuf, 10); + int len = strlen(scoreBuf); + for (int index = len - 1; index >= 0; index--) + { + unsigned char curChar = scoreBuf[index]; + curChar -= '0'; + gdrv_bitmap8* bmp = score->CharBmp[curChar]; + x -= bmp->Width; + int height = bmp->Height; + int width = bmp->Width; + if (render::background_bitmap) + gdrv::copy_bitmap_w_transparency(&render::vscreen, width, height, x, y, bmp, 0, 0); + else + gdrv::copy_bitmap(&render::vscreen, width, height, x, y, bmp, 0, 0); + } + } + gdrv::blit( + &render::vscreen, + score->OffsetX, + score->OffsetY, + score->OffsetX + render::vscreen.XPosition, + score->OffsetY + render::vscreen.YPosition, + score->Width, + score->Height); + } +} + +void score::string_format(int score, char* str) +{ + CHAR separator[12]; + + if (score == -999) + { + *str = 0; + } + else + { + lstrcpyA(separator, ","); + + HKEY phkResult; + DWORD dwDisposition; + if (!RegCreateKeyExA( + HKEY_CURRENT_USER, + "Control Panel\\International", + 0, + nullptr, + 0, + KEY_ALL_ACCESS, + nullptr, + &phkResult, + &dwDisposition)) + { + DWORD cbData = 10; + RegQueryValueExA(phkResult, "sThousand", nullptr, nullptr, (LPBYTE)separator, &cbData); + RegCloseKey(phkResult); + } + int scoreMillions = score % 1000000000 / 1000000; + if (score / 1000000000 <= 0) + { + if (static_cast(scoreMillions) <= 0) + { + if (score % 1000000 / 1000 <= 0) + sprintf_s(str, 36, "%ld", score); + else + sprintf_s(str, 36, "%ld%s%03ld", score % 1000000 / 1000, separator, score % 1000); + } + else + { + sprintf_s(str, 36, "%ld%s%03ld%s%03ld", scoreMillions, separator, score % 1000000 / 1000, separator, + score % 1000); + } + } + else + { + sprintf_s( + str, + 36, + "%ld%s%03ld%s%03ld%s%03ld", + score / 1000000000, + separator, + scoreMillions, + separator, + score % 1000000 / 1000, + separator, + score % 1000); + } + } +} diff --git a/SpaceCadetPinball/score.h b/SpaceCadetPinball/score.h index 7790e1f..83212f9 100644 --- a/SpaceCadetPinball/score.h +++ b/SpaceCadetPinball/score.h @@ -3,23 +3,14 @@ struct scoreStruct { - int Unknown1; - int Unknown2; + int Score; + bool DirtyFlag; gdrv_bitmap8* BackgroundBmp; - int Short1; - int Short2; - int Short3; - int Short4; - char* Bitmap8Bit1; - char* Bitmap8Bit2; - char* Bitmap8Bit3; - char* Bitmap8Bit4; - char* Bitmap8Bit5; - char* Bitmap8Bit6; - char* Bitmap8Bit7; - char* Bitmap8Bit8; - char* Bitmap8Bit9; - char* Bitmap8Bit10; + int OffsetX; + int OffsetY; + int Width; + int Height; + gdrv_bitmap8* CharBmp[10]; }; struct score_msg_font_type @@ -47,4 +38,8 @@ public: static scoreStruct* dup(scoreStruct* score, int scoreIndex); static void load_msg_font(LPCSTR lpName); static void unload_msg_font(); + static void erase(scoreStruct* score, int blitFlag); + static void set(scoreStruct* score, int value); + static void update(scoreStruct* score); + static void string_format(int score, char* str); };