From 12066963f0deeb1b1ddd57d48dfa88ba1795a86e Mon Sep 17 00:00:00 2001 From: oz Date: Sun, 13 Dec 2020 16:05:19 +0300 Subject: [PATCH] key mapper dialog, ready. --- Doc/FuncStats.xlsx | Bin 37486 -> 37509 bytes SpaceCadetPinball/SpaceCadetPinball.rc | 33 +-- SpaceCadetPinball/high_score.cpp | 8 +- SpaceCadetPinball/high_score.h | 9 +- SpaceCadetPinball/options.cpp | 275 +++++++++++++++++++++++-- SpaceCadetPinball/options.h | 17 +- SpaceCadetPinball/pinball.h | 6 + SpaceCadetPinball/resource.h | 13 +- 8 files changed, 311 insertions(+), 50 deletions(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index 2de37c23d4b777ef145e9af2bacc8e6985b47cfb..aef5d36857cd88107b78d662cf762d924b597018 100644 GIT binary patch delta 28707 zcmYIvV|ZQP({|FvMq}GaJ%gPvq|)~+XLCqeoSoSrZ`5&2>HZ2k%i{0lNSm~>om5LB~=iTfiv zAD^$Q0H1AijJSNPef;bF;Ymh^mow=UwPw%3VZUm}Ncr1~fNol>aw20FxpZ$tMSZsC z&GZuhyd=09tEYi+G60@+<;9+tyI*n2dMWAOQg=vuQ;b!ty5QdERcwb^Q8u!*;N`8O zIe&XSogmwC=%==S3aS<^mZyUT`9WREr@%0v68G>6yHacE2PA z93B(3NIHgcC2fL!>WshMXDQTKQ7vm&y>m$YhzGHCM8 zy*38w#=$SK$-)Jkw<-7p;az^6G@^AV!<90$Bf1}A!mcM1oTFpqqo9aH{TJ1YWU)vA zBp9Qplj)-Tg)1hrUygclkUxk4Y zEJ-yDG)VALi=zY4`o-@=UT`(bTxq^LtcP}QJAu9La$4ok>>fQ$UhWWm?Fqz`RZ!UO zZW+H2*@Rjt2UYWiPlxy>88=8a`menKvJ4jXLzCYSrX^N{D+G*#8$TFh6p$QH$g%{B zy8ChmXHF?3lav=!l9sTtdfHJ1Dod8c%)3Om>^I1rEGlyRl!_L;+sNVS{~Z{;H@;h@;bOd}}a* zk0UV>BPPku_IdGDlu}^@zd}_>ooo%;!^#a^YFy~q%3>1&Y^ z8Uy%tK31?E!3yh;Ku-g6`Xrdvq}EP&%)=Zzq$_KFlb>Y7gV&5zI``-gfkKOhkVq!c zeKX|Do0U_Fm*Xxn|fN-J5+A8jPN1%hYR#AZ^8| z=og_jy&6i6gV*8(Hyqkby^f_%dD+|?KWy4J?Ck@YET*3I0*THFcy^IK#YkKtk4api zdrHXf!i*NRnAx4Do>5DLaxp?ZhOwJlK4LqHqjZ=^wxLcHET_I{z2Z_{Y!07{?sfbI z?r%c$7XY&20H>cdE0tZG`bb2`s+iml4-_H+24D3Z&BMm^e$wK)+8v8$P95r#KZbeI z&xqt8D|9m%sGDN}%&pGr-f#eNXfG;<->1*nEB72gf35IK&_`>#J6oYBIo?K`?gpqN zp{o)VGv=Tt0^0eD9Go6hk?JM-=RWkL5OMvvVR50%WJ~HHxTghh_xYU+1_>nQP}N9e)hhdU*LOIQeU4tE+bKL%f<0aGpUK2`ENo&vX@^%P zH9$^<2l+Moe3TeGt0Vyf*XW}oJ4JX8voBL>fW5%*E*tq9|7cW@PG6MJPBn^k>Nw59 z(4jh>MZA9gH6S!U@s`S1pk}M+FfE$dl6dLLfhHR$q}n)>F^&q zTN$pYiX+e!3-dL>^Slqk7WQ`Lzlhf)=wmEZ9i|l?k^+2E`e)Q)*m&lW+d0AvlEy}* zvt0xjR;$Jf#;6Uee$i4C3^DYjV>55ad%YjBbdANzV$v*7YgR&|Ig&=PbI^o?>-hgQy3&ZuHZv6`RnF=FRUMc*EZyw<=?} zLcaJ&@&R2;U#mo+N{}-mjjleDd~GkQtTK`IE!4}a#GoHgxB&ZvvLFhMj}arf*3!i$ z!*Y+qTDz!srTRc2bLwP(n_27G9#-Yt;ow$v@M*XhnXdG?k0Ij6TkbSweqjA78SyCW z4rQW0e|7ajF_*RZ#h_*0=*ZgoHHi$GT-iVn!Z>j0JP}y%@M*vM%9G&wtS;sA>VO2K6XJ5+9sO1zdtt)`aEH0 zn2R}O3|^xBl48u$^;EH1+f1Y@Y2bsfL{u+4Ru}{yyD>Zq#$Y1F*N&YN6ipdAU%Nr@BeBHjb2BZ~v0kZYjxt&_- z!L-y-RsEZRWwDd1iC-dbZQrL?4Y9Wbg;Jx&zy_;iY%G~BIao!Sc~l7s@x?7^1T+K1 zUdAm*1?DnuTxsn4WtV9+Fm&u+Ov`#i`eskkECQjDb#|z=Pz!_LRYb%1EL6}>Omt<| z8ta{$g|CKGdy<+yYD|4ZX`Y*~CUh_uv@8vWSI-ve5k=)k)Y~J{V$!O~l5W@@i^$-! z5X-l3H&Jd~dDKke=XYN|h3IGc`Cv_%I=D?lEg(tU0>8~djncdQvJW8ZEOV)6j)p0*!Pfl~blla)|+$Pr>TT_2(d4YH5a$V2Ir=0%i?${d+i zDo4TVW=Jc4bEg-@ynLVrPFB868_q>KYhdfc@Z4`0pu*U(7FO%69qwc;jFDF7njb65 zBm1XnnHElw`13=Ihb%+qrx7>kMB0Zq;q+dz3CRhJ%rf@Py%!E{jlx`en)-ZGEOeCh znjr3E!s=^rRPZg#L5W%(UHZO{QzHoZt78Ewk>Q-+J#Bi)k z-Rq7iwtcqIDo$_0$sT+bbxFvO)R zT6-`*ahlp_;HS+q17U5SiKI2&tY?V%@(qe|Kf+97Oj#gdE$K^WK}qaWndOJcf2WmK z0+6pKO`Vs_2NmyQjr0KKpcxtQNYiubPw+ObA=RtiL&e0V*Zs0zi)@Z}5W=(9;KmpB zzu2@b=BNzt6ABBC?T<&wKWS1f-Q~PgtcAEa;*-v^n066X5^O5(9bE#{$9WNNa zCxgs8$YeS)GIW3j5@95G2koCXvByl!lV8KlPV_t{QSL$+wrw&p7$!5LWqo?4vbd=Djbkohr2^G>jlblmyHzpa&h~cDvI;a2 z3VHMd59{2_Ag50#z)bI;C#{)yj>&v~2FZtyQ(5%mOcvNZIS85UkIx_r;IK%Lp*cX^ z=r!try<|grX$sa1Z(wmPsF}QPBk5t@4*OcX*n{+QQmk{7oC_`DTf8W+ zkh61AU;`+Ww@}5r#9;*FL*+Xt8f{e-$2H`iFZMFNlsE}4vwnT9b=B<%rTt2a;TSG> z%lvC~_miPBR}5nxjQ9#gWzQ)W=9W9_nUb}|vX~Xq6#vESv)}38db}dAZoC65`rd#aJN0%g<`1O?Cmll0M--(KwHqCAc1WzTVDk zXM+Z!uJ}dxdzi6>qaAqg<0Jqd^Br3^i%;8G&^*Q7QlC{VT2s-e5Bab1|KQuUoz3U2 zShtgC1_g3=kVlL4ZmQ3H$)YHj?I>(Y=FtdpA4pN z4>&9$J(f8RZWiMxoTetrmcgO)>Qts$1&ZTHmPxJAYE}gv9gPB^c^2e*ZLO~bmJqK( zQ*fd+_mmi%e&qQ0``#g&e zZ103z#!$VhQH=0pX+oDa0-G%-?c)-h^9k9Qv=2Hy4qFSJNNX7CB}=hgBCwvVDqX-Q`8L53-ABTs%vt71_Cx z7pFWEUa^lX*O)&K=W3KRb)QKS*8?C<(`HPI6NNP)f<1_n9gSBy84=0GD*pqt00`ZG4tyoG@72_A3|4cRMaPm zJdP|8Xk?(fIYa_aK0V&@MQA#Xac%By;8HRqDxGF3Q2P86kr7IB^~uVllMopB5fi+N zq*>-j3vIk29Ft~p=#FS`bh+Hg=Hs|x7PU4cY?^vJr96~?HB#uC*~E*x{B80*OPrGj z8#GNsCggV0s_mcwtL;}Vyh*n5J?gW#8c#FZ~uwDW0ps=+b`m!Ei`D zeMq!BNo9qmO8s|nY7#LPEYZhQFg*uhC2V1KpLbZCtoshPJN4Ns!-$y24@)rfeTg+i zr6C3(2dV8%(kr@%2%At182UjpHYyxTWb@EryCR|iEd|V4ec4<2w%-7x@Q`+A?ce4l z0bY002K6-f^cx?2BnZQJlmVwGw+gP;k%FJC!nLtj1;qu~zZKmqDc-fsON zmT&1~7Gyp$V#0|<0_)H{;GsDmG&!B#mukhN^O58#DEsc3d-PwkXS%=Db2auD?^^y2 zhkQ>D|Na-cfAdj9jJrBu+=Rtjy>r$2RXJ7_`puc)96GfY!)$T z=|qv^#6{ZKUmG=$Tp>Z|6}9!X{f3W$YL4gyDd*fW2{?wvxbF6jys07?sIO281i~(y zlK$CT9&(1Q$1g>QB<~>5?UVZTKr+OvHBkn(XJsZ5Ep^5?+jdXp!@ zR&C}VFkKj*EY>)*IGD8-e|Vk4Ip^1-8f0w<-V`YK^s|^yewbI>*gg6D!GDXD0Qd7) zeXA1$)rR%#oE-9HxuQ!s8^nwH<{UdG;tY7myQ*t`+HDr!=;p2b_a!=3s0|yhKpAmq zrn}?HQ3d7iURwWms$cGkxuATo%7o|Cw+^j`RgDy-$H3+vICrNS|6oS+!8SN1aJIS1_Dco_7k4+?Fz|7PkV!r& zI(^(1j;LxgAa2TQ1=i*SxqZutq>M(wwhXCEgem-2baD3DWU z^10vc0uP5T{tk*h+ZKD!g0;rx3{WbB4vyC8S4QLeH71ZoqxhbpLK}sj518vjCHomL z7t%aXlnI_$Eufj4Qv7)qi%I|q6WN3tLnQ$`$&MiFWAl8#5+p6sp4E4POIsbX)FjhJ z!DS96C?Q6Cqq(5H$kS$soNB%JaNM9$_+fE&Pjk;)`%0%@*J3{S*fD!}&>dK^`+(hJWXx>I#61(`i19p<9B>T_^>V3%HX;qrZUrdmEVjr+ z_+&g21cF3j*gc6O=?Etjj=TdW7`+6Gq7Ds*NOEu}ey2eigSzl@mricA=~f@Jh@nBU z9kaX1)M3X=Mw&q6pgH8mHp@B{{nAx5Vrnm#j8&HV-C{_j)Hwq>4Zy~ZDZyTTQ&FgJ zP&7erO&vQI;A#>vb*6zhB`TD;^1}oo*T1s#x!Hk`Y{#Fw{1f zSUh>9sB8}S`Rl1fZ&QBOY2AJ&u5_T@-1}UB$$8l2lx9}7Oogyt@#R~MHw9IYDft>l zELi?|NDULjH4hpiOuaGMpheJB5B3Mf(0~i}LA{?!SdnwSR-pioBf&;#Q+1?Ej+{09 z(RQbUwLE^RFiQxrvlNW3$n23BizD&k zoT+eq0+A=dk>uvk@_vqx@3{RiN>i%EC1NN+vlizbG2BjH)g_4*6>6G+J~n8*IJ*np zCM7CS?gFD;S0ezqyPgGsQ7_@vl4G{$?0Js6L(%V&c*zoRTLJc)hDjLh`@Gx)Wh}@_ z;)+g~8uw6bk(HZ6@9`&Ee>yV%uT4ItS;rZ@bdY&TXYO>qpXD-T(a#P7f0886;cv6? zG`0UaC#%BBy)i+```!D%K{1p-f+}P%eYumSE%P(Ouig=OLFAGJpo54*a{^{iH{T+OxawHse1 zR;APFi|A8SQ}Q?;d+M^PEhM7^<#NSBzG^|*`I<9N?e|61{5qMH6;JDI&{2>E{FW0Y zOn}R6RnN^3!N?j?buYYM#x>2|_joRr>w2oL@5I&sb&SuC*H6uO(e;e?H_=%;W{0jz zbu%P$=_sFll2$n&O%cCzP3$JJ;QquG6xyk^?m{<1h=E;y1nx4UcI$E$Spm8Smckx#|Wp2U=BGEvXoPk&6?=+Mmln< z9+5RGTcZlR!D_#h&NF}EtQB7YCmzuWz)u5$LK3l>xL9;1eWA{YT_f92LUTLlcv7WEw% zHdqW}6fThJr5!=uU$xo-{ubEF3xoFAzTnZ)ggP4QupG5qPjkL8+A~9ZIIDJoF=0(x zJ{s}ORoq0x$a7bz-z$kiHocsmij|hExcSrL5%AFe0$4xAO(21?RZV7czfO0(iM2w zd3d;@sJtBTj&&O$=^OuO7 z^Xq_!)i)~q*Oz5ZA_33G^OrrQ4Z8|?v+L*c#|?J;gXM}24|t@d+K$Kj=NC@S4xM&) z-ZVlR9pK41BkS$v_TemJ2IzQvzAgZM3v_sRUp+kVs1>HDzU_4f-gN+1Gd&C*YV{Xy z9hQo(KPT$H0FUPz6(@Eb{#a{WJiuX~`PuXJ?$vTeI@9>s_x4l0yf@eRcW-c% z9qQAzk6o|h5f$woudfHTXZ&wZfgNv0SIYu#JFKl2sFcN{^QymJ9KBwzp)diswfo`K zDuSEQKvz4M`=`T~WlZ~zld^C7Z?7*Wt{HEaqoX!&I~S)e9bg2cXBnfvUw3CS(gnO; zN0(jBQ&eqVZx5~l@7{h~`y+(}zDItsJ7*%WX&Obk>mpeneI!}eN0v_rlt zS4R%KIk=i`&;_2)?^NxYyEHr>FN)HhhgFH`bsg1?`(B*M?(+OZpRXUtdN%HUuRU*c z?-jV}u09_hyhL=k-<-YO5_P;iY;BbE@7&(rVs*4WFB1WGfmguW%^C2T@?E#%^>w)d zc*N9o`IOe~{h~N6er7N8+t5EebS<0cvZ3SQ;o*F?scjI8)B1cD%V}Y3<>c9#h%K#o%q+1-6S?g;pWGx?rs z;bwArfNwn+KCvOAeRcI`_bnI?Rcx;Uqr?xlgq&k~tlAWnxAX) zngJQ$`2N8K|HkQT?IG1p=5DT&VuSY{Mr5qIKZ&F-58#(}v%y@K_Ha zl7&YM!3XO3Wy@^_4_K-NX|7H}2g+MJl-Hl5qG{yBd_a`z$2>R^WMR9y|_B=J}`;Q*2R?oLZ>GwRlWv}oiog7rI{TG zb>QjVFK%N|&BdxN!mj?VLSB61mj0{oerL51Ld!a3xOvUq=Iq}x6qaZkDfghXh-_fbM@X|Hp?H=tYqyyiW zmW@lXC44EUU<9$*hh<28vIF{@XYgaaj!N^kj?(lm=ioP@q&uYH8-|}=&eD}(viuiT z1AcWH?#C?*TBtWM9O*DMRK0Lew0siv282R}f03(0ikPLqQ5+!!-f+~VD1o)aD_7k4 zajWIut>{)zJ)=d&q3}DqM%U1ooEH+ir?&8@Q?@`bsOm6bv6jRiMGcRU(UEu_HnXfp z1%zwZ8_m{#_|~@6cMDFIB>^52Y4D3Y*8}#ucdm0Fc}NydlAXo}{D2Nac_e7=0N`Sg z-@Ikb)buEl8+!ZChcx1LWO6fga5;xbO;h4DhekX`@@a$KIlvA`!PxS+@`sqM3}E~O zDat)ExW~bpAdD#d3}44=kJ!q0PN{lV+Vkp5eA{cRKi+G(!=}ceq^}xA;!PjvaJjf> zb~WoT=5rDtfb7p#jn-9lBmhWzN+qRPn{wuk{8ES2Z$kFqj@Z`<fF?AL z-=fJqZwC7@qYH^4f5s8p1yQQ#3`Ic~v^oG<9_Eh7m4B*H9U_Sqgz~f!#owI;b^kt1 z(j?uOCk{Hl;M}i$zIX>+)0RwF&Iwipm}Eg*L1CERF?Hi2yiX0;=8n`B5M3b@oSV*E39;615=9dwp` ziK~MYp)_}OP1#x`*?W+!ue-K__&sazxw$xSrD!g(6^#Cxg`}wk8%gqKZ1&KQKYOEh zHxEbs>gQ9N9k#yGm`EA>_Zwt`P(Co$#IFwv;-89F1u5q>`xR(UtngS~eJ;?r=tydz z?nr>H3zT(9hg^|3Z6AdY-hdA{knL9<&>QLI*dW0&c2Tdd zMO}@E7cE8mSiR$s;s%ACijYJZ(9B3u=LVCbQa*aJ5`Vb{%e1-PioJJsASko`dJ1x) zOS2#@4*`i5t-tJ^nU<}y_@ZuUk%9xSKJN0zxXA1xziVQ_)dJJJhOHx*n+;3`Lc*T= z*qHuDdgEEef#QFGA^f!~Xr?c>Sjx2obMxXc*WJR(!@zC(j}3s`54|FV>`~CQU@Fhw24!WJ;F^;T%_K`TLj+qIM0fke!-N^P@9GZ!#CeXz1 zuk$ycy6)z*hRA*9Jh)`CH_BsKd6wajxLH9);&PKM{|w}UaDj=OSNaXB#-x>BLgM04 zFH&rd+^>2t+vZVzX5FK^iJ9eAa5bVvf0|`{c5jTgQZf$Z3ttki+HX{=Dz zl=6PziQ_Qw{M7mFG{!Q^yN8nSTfqnSX(DP!EPK z^}M-OMoxjGvB!M$%1uF`Z1CQzJAvw-Y+(0cF#hW>-~-JrPwxL+J?=?i>Da351phCT zB+8cP!6(t)SB{Yzn#Tw|4Slv6HkMA`gE!sl5`ERY-e5}{}*oQ+QCxE+PsBv zbmSlf>lw3c(J|WJwbaV3Fv+oyi+75lu}hZ}7_ELcHY_{;4WXoBpw}0-E+!Q8b;e^W zk8FP}Y!E2$oAhmBl&B}I_b}y`hdo6054h8BUT#-tU=Dp%bh|1|5J$78oY zSw8wG!xhNY&v8+B`kla{Z>m|Bh_}=8FCl8rTq!!GZ!m{x1!LjC=lQu1p=td6JdT4g zkS1v}V&>}Lthdb{%c5bLvWPf9K}<)Y*u++Ds>*j|wiC~?Bs^gD*X~A)SP>T6G73Gy zG&z5gXU5i_+{u!Fr3m>C07_1H8%_?W=`o7#p(fon z#|mjIzfQr^D`K^+cAK~^G=M+QY*$eE7+>A>jwMv}qc?afPo>N3e8C8R%}P9rz*NJk z0WBv8(Z#o-_Ra5jDCpOlYpXJFfjjj|+{9kXjPdU@U6Rb5tucG+oO5n54-FPm&AqbTjct%+s#ySGv#lC0t+SF?@b z$vWRK9M#OR^^jHzZt#oSb}@=tl}pP4PgpYD(>)V$etAf^X%E36F%+%wrGS@2Vah$e zsr|`@1ia>nwWQ=-tfdy~AzH#TsXFTvw#9u;fGI95U56af?!wmR}_q?x_X?1o$HB=3}Zwici<(8qL#460k}+$>9G!r~Y3*o-4SB8^ARt=C#DJ1%o8xyh8PB&;zPuSXpEGXOXY7o288MEdyY zr&D{V7|=kqWAlxrWczxAMZo{pwtDA$**?#;Z}FVAn!EJuB%DRmyk*fa0Bk2>`MMU; zOW~i$d~T@ZkK-$hUws5i5JWdKL!Lc!rN@83@mz0qR|%YC=wo^FlR@8$8QUs2A{h1IW|wJ)gQ>s_KtHPk8uU z?4mimCt7CwUFvjDRtfhiR&`MgGOXX;pB+XCWZ*VBCpdGKXt_U?__WAdwjML)P@F=2 zZ6ZTh^+)zO$71v}P}OB{?OZ(c^J$Z}XtiR>p}2+mx(JYk9S`<$WO%UIsLEdE)XWck z2kFiK)02f6u-Y)N*_@0X#;-}0=plzf-SbFk+&e>ic&Bb;ouy+V&@m@eb_oZ1(zkyj z=XYbjpq4{K5QV;}Gi^vLGox57g&OBTC(?ob@KJ0i%+iF9f?_j z*lL}$BEOAcCx%KdK7J3s6(^j(vgcg>>W*IFV?vKELTq+BK_QfxbO>)XTV$g&sUE|I zt|)8S^sQW(C`%dJtj|Hv>bnW@4-uYMz|SCI z75aeZag)ZJZboi4c^K=Et*OHp)W>Ec;sNtV$a=s}c-(|V$U1}K*$zeCmykA3uJRqZ zsfI84A9xWrnRBUG1a@{$zc#^-`_fZ zFYQ-K`;{Dr10hGlPv?a5WY@0HRjPMbrOTj&JT>{Q{WS|~lC+VVQthhdstr3eb6UPQ z7bK6?H2KAgE@y%uqAwIm^y)~)mgpa)fPCm#bL*Z_b#!9C%tC+}{3njklNSsTPI_a4 z`^(xEo#o0naXq1rf#TU=v!pirKQUGdEsK6XGS*-JYT{~VxjKVs6INg689T_%aP>FB zKBOHEbH%2r`P^`pXuDh13b`qKn(wMP|6-QZA*lEYBMh{}e0YBx0W+6jRdIT4S=789 zq3{;p;TQja$F>vk@!IvWO^p!i^fmwGt1aoxoF$}(5`@FavOQ)-a8#LTs+N8BCBD2%kQeN@l;&bQ)jJRq0@r&@Go0frBLN6=1 z`(TslklCoDlXr&)aG2o`WbVyT-9AbpoXsib$Un?L;^&sXmGedNtl_}Ac+IWs<8(V4)nmPiwSK!ze7Xcd{8q+`GaKPcv8 zTdpz@#*MAw{z1a^6@2kZh+vtGZqW!z`WD;g-dpO+g~)eN9MHuZUfI zq0h}ZN-4BZE#aZ7)Hgo6mC`_Rfr6$T;Fpidmn5jBjJm~j;@Uletx-2b!FCNbRa0Ye{D2Ee!_^f`VCF57F)FY*E<=oTeN zEJ!497mnA4ZJ5Eapee7_XIHGDh`l!O{b)L5GOEGog(N>I_GI*M>i(binBPlL|N37z zh-54G%kU%Gub9O<&RU#$Etk*ZKX#=hfc zB=bT15!B6ZnB1i}{dK!rC&yw|wgW0C1k?J*yER5%cMPWR=_Qlv`S4SlNdgSUcx5`U zrdt{?S|6NX{>C0C^cH|zoHJ^a&hi0z@EZE|!9J-z)Luqdl0iOnqSkGi8$+BVZSU<&iIyH8;4)s1IZvF%K= z6L)vuzkVU>LSB?tI8v|e>y`Sj7o=?>?FK<#tMPC=P>E(cqOgWSYWp-n>YkPF{232~ zoTkbAwl$VhciS0#n{Lg%kTodjR@5FM^FrO?oJ4Y;8%nCYD;4R3nQ)t7yj|OFsa9s` zZ#g{?1)vs3?fP{tMWp;{PQgKc^`kG|tUX=Ut4lzf+m<1XtrBr&L(Ys^s}+|`Y0()z zmn8$hidCvl%9)M+|2vyOwNXV6z9VZDiR)cwNZYDNiF&ldAX5|Ki@tu)PB*O;92l51 z6~qf)`WQ5a&mb+;kgz8QtN+)PxGipS<`vmyXmcci@0A%p_;Aw0)whDQcr~${egi3w zH}X0h_ziO=?2@)ssz7C*vmbc^Jt?}1LAd%5u8`45;i9GCJjv{NDTRLo@1*D?aT7e2s+XLm5KynS=N)N7qvsv<6&5B$bBCDmR zG13WsYRXlR-NYkjNjMWExFjlGbTtwMFsOO}o<71?Vv}OcUB<#b5nCk>m_I@$QoMmP zmKCT>)>)jsigZfw23O21iZ@I6?vKDA&MKHyTac^G)Hp%F zjU&0Th-wrr;_w?pL9=m>&tc+cVGkj>6ZJoaDLeI;)It{woRoJ)axB&~pewvBLf!q( zZe{KVH5TM%vlBOl_hWn8bs@RC=0$DdvOtBVXUG_A7}%lxVo%a?XD)8F9{ef~QyS=eN}(*YB0$ zGkiea>|`ViW%^>2vd7+KUt@S`lBa(5UQLZ`B*P@-?)Rs64FD{ieM%)-Lu}Q7Ih?WI z32En2+N@I>kzOYwSv$EniEiD=)!nscsIVBZ6TSY0;J{zgK9XM4;xZZe<(ALdj*+Rp< zSsf8Ynm1g)c;1q}_z8608n5_18p*_oMIbdEY~@{HTy)!Dkqyn$;jfh&j=@WkHXc40r<>z*X3uIvQZ-Xt`wyh*3Ar;VVXszvJz)A zyan=)KjJ6BZiesfRvrZg^cOW2RxoqVGI(L`;?|Tce&+q_3e?ReBqE)UAlR?$EX+1P zlB|xhQ))23`{O1Wf-A)+`(|Zzje&)i*uqmenYk~AIKIJa2G!g5XVxgczT~Cd8lE98E`|( zJ8^-#n0tREg#f1VbFNgdt&@nu(8Mu~VGT%2ex@#WH<-C@;Yvc7N%!L}WC>P5rU82a zX%V}`Xp0PN5P1J#_k6rT_wCyH-T*y9b25gmM!PJ7VCv-OT0|xZ3gVfy1AUN~86$3g z*}giihK2%NPoQk*$7#ZMlOTbq0?d+xm&VOkLeh=1^72Z3%tkUH&=Rbt@pXV-oSI>LwHPdcEmzUZ zXK=~1-O@UBn^N}VWqIf(2Ft`W#J>}7_!Pee{EO55NjUorgEv-WU9Bv^TG)PLxDjX= z#exPUZv03G#{^Zx{xWubZc7FNtaoTNcky-qmJdKthaX=!E^JAy<0wJ27~OG6JGF%! zs-4^gGOExl)fiWPQ(GztPBc;0@mApe)U=F#St+g?(N<&sa$V+4w0uUh_PPw3$F#&0 z8KRrBocqPQmx1WM1tx;tl_y2yZtm_fT59ZkQiEYTF=+(T+MbV-CIRLPxarD_b-Ru& zrDa<8>83+c$6br7XW=F5qCsQQX12!_+50bm^)=iu1LXv5=;Hoq&zJw|Q~;;sDt-|t zqPMoWi$isf%I?ft_~nYqQWj-%8p1Hz5aZp*f?8L5rA0{9Y+2rqY0_cAtyMNJT*m)b z(5u|CT%6~YO5KXsGnVBe8W}9L;w9F5phdUUhLUM?Zb_3#qt}2nHAN!G7UdEQrWq-l zVcY}?CQXn(0#GV6Bz&)L=aP-|P0Qlo{l9Pf2nWl^)ceIjkpG$e-N@u43@@umI^9#0 znc60`I`LHTnf?s_e|dwbhVz^V9*a=ZveDv%HM4R(L^}Vnpf75F>!VVTo_;A`B7Q@~keEJJ9lryr!hQ&bu54E>~NU?r6DKXS#zy%CUWs>^(|NYr3qa0!b`~S z-|jKnr*mbqVE)eC(SiWK5W_J<^YJ^-G;pV>FMgTF*9PU%iE4e04)438G#?Va#yQTH z5bY@xJz343wPYZlu==cE0b9-=xc5B=D`}YJrY3MqS9-%=d4pDP_jDT&xZpY~R80#W z-nQB_ED9118l$90Zrf;t<#JZ+Rkx&R*9#BzOZbm-8Axts?Vqy)1<|ZRn}>EME*314 zCdll68;_{E^YC1Po28mLlRBj{9o5P{(XQb+wEydDTHB;)I!gk!K#+((WH^SKTYrXC z2h>Tk>ApKM=u`Zqjo5Vmc*W@5N)uG=P}AIg`+CrS?^}%)JoOW>pT1v`0PkNMU+kJU zlv*qNK{&F;_I~qSbwdf`e!;m;+0o=H6*_>c5tYbH4xVcHLz=CS;c9|*&)kp6QNM#MG)0qb2fDlNUXFdIQP$n?KtWRnmnLCrC(&oy(NN)rFaapY$#*{flHTBS__jqhN zpU=gy8RB_xi257rsMt&^D2{yihF&ypp~9Vg6Tbhz>M|?aBy;#uX=2hVV!NdJQFzgN z_=}kIoW;Zf>pdC53xh+~Ii=v%+*)bo{>vNOE%lb|;;>o!6&5{+&GGQdYRh@6L^X&4 z4XGwnBw5V?}9 zsCC3*b}NF|CVX5e88?jzzH=yD$4h7Qj)BLN)uICiDEL?EW!r~gv*7<5h&Ombc}|ne zKE8<5RwGsj0vK_n*ac_M0k8KD$~>n2fIZ zOC6cr5RwaDEs8@N$#SUgRm?&{0y(vAi@IXc@gTiG*F;7}b3Xy6VJ(O^OKnrZ{BRsT zv}x>t!%zj9*$MT{WF2ss2oW`1t37yJ%jBpV@#^}9PgyiJZ6;!Qx~RE;t$BgM9Yc>k zK|Ic5hYHMx=Wq>SB=1X9h$0Y6^a}O$0c6&+&CAJu4w(gq^vIcWThtMgK1NKg z26-z(i5x!-#1X-cE*%jdS2Xk!eBfm9olv_o#;S7G+utExOlm#1EX5kU8Ivx7h10=Z zU0snSje4XMDg*Lc!xC8jg39A<*et?VZ#2l%G#>*Dk~Js5jrp_?GKZa2r+6gsa!XJK zNe3IZLC0iA{7hf%oCPi*q0Ok)4N3mJs4>pmP%P1_JhvJxF6XUM16P9*LlV|;xX;G_ zS;FE5CWk?23`^$^!DuooZfmSo8CdtjvlMV$lV=tAp~rbnul9kK_MC_QZUY)832aey zDw?)zCA*efTP~bio80GrozVW(;EPwP75T5qmZ+SL*f6^t2sOP{OSHN z?CQjVT4Y@D&eANa7p2GmM@>5oT ztf}Mpk5?7n?-M$E2AGQeI-ZAjZR=mZk?&`KC)o&(lmXF_MlXJpuh=<=^tnWY4Z~Dy z9tyL~q^E_h8*`V&wIezTwCB>3YiQp5))JMkChS_anrdq8QD?e3?SF}wI!`}&8gdFG zQ7TS@+FQVA&uMr*+P;%;*Jc4+$*y_aa*XG&xKKTbn?L?iEDxN&roLzC$4>;Rb+@-1 z_t)WXmPw84i0BO}X}mv$+OXK^uKrAgg^a|uhtP{|8=w()w76YkTI@cFED`P{Oaks)Ff|gS12pH1(`nYg#aTVK*@dhD!XOGbEfn zPs97l_7@2?j`|wm%do~#n?=lwgG4fvuC$U5bMdwS7VE3&6k;8L*%?+;OvmHa!PCUb z=vDhlBUkbuqS+uG0aU%!zNaHy?>ZjfEKlt`fJQk`-fRMfZd1LIG&c02*y0Qi;A83R zo3xTWD?@`XW>&}jzm3Nl%inYYJQzx3orNkyWQ|QW<|Uc9HL3ETiR|xCCfd;q=>F=A z*ixxI&XRGG_J*9~SM8!X`qRs!grl7O+;HXiGY>LCdWiSh@+*IV0xFv>h(CO25t}7R<^n+^NP74oP#L!_xQal&cCR*sXAE5L3Yd6o zzt^-xV`n7Q9Q%J&eRn*S@BhD<^_GzlWs|aH71?`la+Hxm$4X`n?u01YiOR{|dmb~R zgoLc)2pJLCBYV~FI!d44x5xSGT<5y)`?{{z>-l;ywAaYMf(Hmeq+<6cc5v|6^p+Q7S^MkGS5s zH#j37dQKh+GZfkCLS_Fh|AB_7_*-qcalZbA$rf08&SMA0Mgtvcp z${AH=2Onk*+Tu~Fb-Caf*p}w8$m1~wSPE#bg8#J)Aug4Smzf{yK(ybO43_EbZ>ig*HKI+IvWw9$Vy9lQz&#vPEGKN=f6Z03 zx1evLzMNe;M-~3dQ3b(pVuM~vyy2?abuSLJkXQ^X(x%|oJJj7(VG80(+|oyVctGz} znpiD;tIb`FyjsjY>Y#v2T$lK1E7|S#jUZr5RI5o1DHQ5>Wsd2_B=O?R7+{v9yI=Yg z*j@m{G!H+-YM<{vTw%ze;NKKnw?mx=K5F5F+~Nv0Kn)`@QA>$Yzz%s&cnXGbiw(a0 z3Sb?)dmV=d41qf(94ms|_?{X<#04B;@&6KUiBo@IRN1%_L;Aq~5wzWSrh&6DcWQe= zZA{5)d0x;?)h(E3f|S#3F)2uo24b$keph*jg(orV7)L@Tc~+DAOYDne%p=0r^lnjSsis@EqTe#{k$mAk2lI#SYW2U6^;@|8 zJIOm9-|^xvCh{%eDrtlW1wA6lb;%6wm$!t)D@Hu2bv2b2Yma!Mj@_)zL&%wVxiR?$ zv>1jd#`#W=%+sa=pQ16ONk~Vez`^CwE_xzVqsBv5khG07uRTNG=Lgp z4@~@5CNlggN0q7@I&~3l3^(}3Dg4KeNaR5MOYE{rEf{`Dc< zZ!VF{IsV`}v)&E`HePfvk3-Kvhk8C0qKBPF!Om1c&RQ9JiebGC)L2|*JajBBo=joh zd8YJ5NhF`_#7(-goj$L+Jv^O{E4>ZbgO*eD)6zL=@C*kN1Opf?r;6A1y?#ym8=q2K zTkChL8?3~4KMjh-zu;#QykZ`5X_nmXW=V)cHuP<``|#P2+>`U)AfuNwpRKfAh!HQy zz{%69?uiq=E{hhZ^2NmTj-X1cx`IIC)&Dj2FLv60+Hw3^G_jn%5wI3-UiPDMg()U& zw-N_<^N~+d_cw^C(MyA1&9D!I=3o^9c{>XXr*7?sf>ua)@+w%81eeCr+luJk8l26G z``n#PR*_UE1-Mh0QS4L6AO1A6K1=6#eJk+-J9U)s_pFO+$LBytQ6P>QGZ_wwrfabeUG*s^+3~V}u1|_Q?(CrB^(lB47S=+-qx9B1PwsNM2eO^RwH>i= zfYA-q_7CmsfNs>y23x!tKlzoCzqLUH#bJy4lJd>Z>Rpb+Y_ITY{6)0)*Qxgu!u`3I zf@ZKC0)pEUPN3yywLf=JAGw>p%Ov+f3-i5O|Dj1bwce@#Yo4r2kmij=0uS61GKcAP zl;G(x+2`~8#9buuvK3Qb?Y5}4L*qM`?K2U`)K!qC@&y%D5LL)Wb^mKm+lyl?zyaG) za=Dgw^h@sqW?Pk~2sz~Lsc>}AM_aNDW|35B-I6%)z9stiv4*+iEVPKy@*8~{9ROF$sv$rg`a8Um(kth_YmRcy;t#GZl&4?c)C+fL3CCLa!8VM(XEzhD)PQEm6io!y#)H z`-DcPt$r@!k`uwZ?vVo$K#%N5R;kOXXOO~3^=o`2Z<_4#ipGYSZ2%Qy$P zVAK`R%nh1znW6vT`kv#(D6oot1yX7tUWlCjx2a|qsyNdUzh^L31PT!=*f>KmpT?FJRG4_J~D3dlNggb0<~T_)eDoo#`-Uu-kA?_01yePL{VV=f+zq>b&S@ zaqQ8teJ&x^cBa}}GDCv4^wZF2?hPCn2IjR>h{m?9u#zWa3}{?^a*P8;`R($DMbgG-m0!vr5*^nHyc z2%F1A&#phBNdzwLMO=zS^-&?XqEWL3FPDX$0yDM<0&Xmhr~IKREX@u&IHEEXrRUjY z0S>!NcVC+M%f_EY%j>s;y325Y7P@=*B~(BOcSt5~aZl&=K*+NA@u<<-qSvvB@i`IM zA$)>&?(cL^n0(etcF+m;Ab$_@C=YPF z;2ljJ9{n20p0u!cn;*~?2V&c`eN$4ZR9eLoz_-cKoi<^ty)lS`<;8asn}vXMsNhHk zj(7aDUuISTTH*zfckdEQBYDQRyt!$-e_`~ErrBC+riJ;+hWPP-k=vRnFv?k=zc`{6 zZYS+8t_lYKP#6&j!mI%BoeIK#VK%Rdem|Xt1AG3rPCYFc>M{@WlvKV=8M$nU4 zD#O&vHRr%!>1U|tu}0_hlj+$o2}41kCJqs10A^=xPVzB*_wZps0Kv)j4rv@5+KX>2 z+ z2?FN>e7TTUaPup!#3jdVWg$U3we~S0qTa+?MxzVYoe9_dPv9G|u$IgKXpd*4su5(N zS2>I%`QP@+141!pga!zE4^QLqpQfNH_?|oxZsRZo{>(g@>f&&QPmNLD&Hl#b!R?HE zmKR#kT-eFxxJt%Qhc|apbcX5@8_F}o>3-bkHKu+!k|(%mK{6ckR^u2zZ^a$AT9a4z zbzG?*&j>U(B=ju}ddnFw^6t~o`>#`U^zc5NpEJI?zegL6+OU!tGWx0;*kujCdbQeL z#q4dVHy)vHjGl#ZxV$qZil^}d3mf~E9{q=Qq5F&{rAhFid&QD^Xw`y5l1@m86lfmiuP;@SuwmRa_QDE{l4AA^_E z@6DYYJc5FG{1?5Zo|+y=-Sn=BzyGE&QH_Eh{CUJqzWdz7KGk*Gm*>SHEajL=3p*)U z=42Nc8$aa}39-7k2lFghaqiL3>3-I+@lqzGQ+F zZx!u&r*J1r9*9zQK5H*-wD4YJ$tkhshieSce%B5HhszL3=Ma&)FJs8CsXD>8nY*a1w%7bMYtOaghD%KjfM+zo*Kiv9t(xx;Q;N`-U5%=R?*aQ zViUdU9N8I76VUs;`!(eNBydE34 z*tei3VJ|L*<3y6rL?^bhK+aTK3?FE*NRL0;(WE}f$M0<_;t*h1Mz`zs92fGaF>*7> z-yU6g>G_A+(y^si;v`o5(>IQ3rvK+8&tbR&C(xUn&ldwr&W*<#+UESxW;ied$5#r~ z&c6+q0(DLMd1J4UVwJuR4&VPmd`jLA@Gyzz5T#j998;kc+|5ps|KgzNjR&}mxR)^P z9Oe0D&uDOjj9;1CkN1!ul!WC=c!~t~wJkM`;a<;qG*L#tuM>2XvOfG+hg#gZ4n(@b8!3&z zAWHrL?uL#!s0=D=4whDHPry|@POmD-Bzp9U4@dU|OLrCcaJ)3~JWTjctoG{&?;5qZ z`?KT!($ab(d)04VHx{VJieMZw#gWr_;voP~xiVf|ro=;XV?l7}uY|wp_0|uZ9RM4& zlCg=Apilij#aX^Mw)gly(W2!MhJmpQw}nyl9GWAL9MOsBiDwz)WN8aekxfO+>qdZ@ z@&0rOmjo|mxP$2={#c$}2xfZy-$egTMQ<)eEnTbFGpB*J=m;ZjioL0O@!y!jQ_P*? zvI{Mr7^g<7bc?v)S4L6a2iF!XO=}AEybw8fav|kEEsk>a46Llu9sJ* zbY*uoJpL7gY;dN72nU>tW0@~-{j?z?d{28ug&U>T(e(H{nkWR{eR$~^vn~B118eVP z;{A{f`ZwxR#jC!zI-`CA1&gll5_4sX_#P@`H`WC85}4B|xj$ zV|!~N@js0tM;gN4UrknVWV7*Y2-*ixG|ASo)cw#}kLwqekYKh$k4YnCr$_`M7Urwc?VY zlrg_SrQnk!9^7T)UX0ddc%iFE9Cz#S6s7d}6)O1&l6Vv9~H4>{V zuD(%;DkJxzh)Kz#4_DI1O^VUt4Vf$^`G$ttwNS1(d)3es`$}c~%8(R$vTjZn+2kD^ zX6pRIHpvWEE7LUl8bS$e+(L0)*_M-ssQU5&Ql)$bm19At1CWNc!TK)VlPnz0 zkbi0H6qP0ysvpLEGAk&KeNCg|R|+d7*p4P}s8ibUI8~vCffP(9%Pn^wPb%fYR!5Z& ztAnX!C>DBY6eU%14{ezRLA8dYYK1UdAzqVK>!AD7CXO6`K2mxhg4SPLf#OK zbQZbd<90T3`#)==7aP#zRDd7nSM33#IHIdhx=jUc14c*U_H~wj3^yOLEYjyukOO_* z$Tsdq76fRG(c$6!iWg^87Du8>%{1m?wTOa}qNqVfX+JLc-lGWuPOnM3wk9izy;~E* z`D%R&u~{gA@uaMPWZ}#Ik&~^AFU=B-3l!q@}>7h+iHJZP5{}X|dd4qCd9?A~f zYxDG8)giSFR`t+2CFob`Fz6?^Zk%S{`*&^LF~yAk{0}y2XWr}W@3fynAa2Q;W4LhP<5tv0gsc)ORWjQqSd71)xsu7SyC7q(;6azB zIvU+3XYKMt1252(H>ztZ-ndw;PmxvoxJ9_Sx5?Wrzldl)z+I6|qL#T?b-QqbZ$U<( z0crn$2j3AH`QQqEFtYlAB6K$2um6g+ltsNnCxeR+6PS{tgRtF8HR$9sS#|eq6~2@z z{+&y$#@bCclo~BqI)`X9pL&={Gbv{I+X+NqNpi)Qr}B4)jTh~6L!0bd&-@L^`_|UG z=`|%Mt2%kRi-JCFBmeGFeh$q^cDycztamr*G86HRzGC|tBQoxfU#wN=aj2O86Dz8t zIosYZn5wGO=bNr`I~Li{&oi+4806>u>26{EBiB<6w`+!{$2}V+3ITxdETV8ZTPJbf|M>4 z9_=zczM)z_O2E1OVKW9Ttxl_l@pq-bC4;`tp`m@>0BbsL*F?G5oW^^yBwgx00etDb zI|piaaF-PPSZ+3p`(F0s`_bv9n73YNB9P_Ewj(mwPZu?>8CH_uV1>j|g+~nr6#-z~ zy_});Wj114)KowJzWck%t`eP97^HP&3n6{DZ@e^ z#8b+xhw@l*7R}n!GUzWbqS#6zqm8KeSXLb9Ib)oNGrAh2aaV0PxvEIJXJJ2x-Cg`= z$a=Gd`8?u?dN0D$v1cHSxoVq) zwh8{T8!7aYlY4)Y2_>=3zFJ`ph{zO@Gzi0*NKJ|vG&}p zqsgjp{#JCcs*k@l@50=xEK6k0ITff)*}6{sn6$pm6hG;B)w8?Jzk+Cf{&~Pse%N%{ ztKNjdA6k7qQRIEgK46Hr3#(R;4GfC~Cwfl~B7EeZrlBn9(?-^CID)$+d1F@tbcu2u zV_tHR(@?4b;PtnEcs(i`?|fTug~qR1@pi;A-T&$K{bXMB0~YUxnEKU+s+;SCBJg?) zA2VpCS6+e3WJnsn^%EPDDCY4dm+kQm16AW>+EAF)rdK^wWZ{_OBtkE*9(v+`| z_#_(5zh>7z0Xc*)4ELq9=^jQ`iBgV6f3$tYv*6h#SEl%^e?pe_9A$@7#l6K9d zk@PR6(R^EJ@x4Q?)qzFyp5%QabjBmBID87el9RE7WkvW&<`0w05Ib%Nb@#1^G9sPeeD&?39ZuDCiTq{FS6WtJmnzOttVI&`q8 z*3ca{ar?dVxdxLZn}dyFFOfl$E2s;8pGjBGezPJZ=`iV4ZA%&cZ0lYW?K`O7OfxGKyu#x;TwIOe-U6po zoVb+FqOBeGiYR)dEeriq-!}4tQE!xCG;_ASp^!wJ0D9FgF{!EpV~@&(v1Hg4h=e4Z zef0F0ZjM>|JXM_YCPujHd{vd5$${37&rk0caMXM-&mXAnLQmmhmtMEqDN^&tO4-@+?y1qXHW&a?)a z^HoP$^Y?dkXtq5odkCs(i<;A73vie18{}lFLOlAM#{^V#aF;%yVWIv?L8f!%C(4>(}NDd5ZQ7vsWpiQ`o}$wBDq?Kd?1x_3D6f88$t(+GzNjd#%h&z`L5*FdXt%EO zQNQyZ&8({~n2lM@bd9|J%@D)>jTIXF?;yN@y|NA>g&&0!*ZT1 zUNcSCcP7PGya&Z!23YfXDwbQ5*VPKL&knq4isg=2z4-Zig({QOLrvy~hPn?sf4E~= zjTdsiztHm7QR1thxhA!Q6!Ntt2=bj(BFKyXbx$Wn^p=L1u#43h2A68i-57-a0D3&hnC z&C=b-vPW)^dDv@`((HV4%yiOU=s;U$>$&N{6y}|Fsa4-_plNS*n5-?n$j0%SyMy(m zl+uc4=*vpJZdMSD7p?p((L)#G3C?{%u$^E;upa%oAiMXrvs4*2na?1i)l20MuP(-3 zKF1wko`hDPmt)5aNm%P76yx`F%T85(ZC9|~LWyUM;NGqnxLiW6q@k1th$jUJJ+9iIc5&B2({p5@NrcT_%!>D z_9u1c>cy?#!Jn}^uR6M4VegoR-uOV@I~$jI#-RzuTc|Ieb*VWof3`d8`rSD*LS~K- zQ?)#h{P!7V)xvqQIO3xWq#FjjRkpd>S-^i@fa;+mY%zjfAgXY#~%X8pox&ChhoaSRqD9PQ?UaF{gGfr<<6hBrtilO zA^7lg!uXJF=rIYRiJ~1H#w0hat zT&j}KQ(|m<;guFFC@E8cMMrcJg9T$p4LMol6Nopk{CUK)Dc9!jg9s5rSVX9S0=aVf zeBPJmPRanN07N=((XiDVw^)EvwREL(NQhC%)e-}eqe;qJ~#MgrCd4hyVeePVPaDRME*tAy7n@YO zSBE)c7>p74lzk~ar&>G4MM$J^ZcDVLlPB_?V6*8*T`9twgw^zWqX~{ThZm6ke2r(3 zYgg+iG2>;4&4&r6%~6gR+HKP?^g>RwF^WawPM@0{LV+Q&ONxd1=}NDpnR{k z;9@HzJH*|X%>VIjYc9TMbJJnuez9tc5L=Up{c;ue3Cme<-Mel5KEcl*a(PP2h{kjC zH$jy%<5$%U9!9P%+O%0ldTCk8dny{1wXf$9Mc*9^E;?}50-dxeaTVw!y@xf@t6gj*$Rv844DhWM~I!0h-V zAe3_Xr?ISQ<5DiF^Dv$Yo&*+|dnfaA#nUgcWt7X)x`(WuU@jbaFNhs_l)ZBPW7PbV z6=SwDD)hEoX|>kf<4X0B=fWvn-qdZ|2eHK}3uH!e@&h}sR=R_oLO(MUtIWk@aN8=` zQ<-&Q3#&fD8&YE<8lI{sW8RjFs4SPf3c$txR+WZ_BgmNmQ?B{B0AfdP^V8>3+?^df zdj{8ZgA@Wj6VQsn@0~WvE<4yaUV>GkTQzPx^W_O$|TFH_q8F859TgLBTBP+PV z>i1gqO;eF-Bl)0mQH2kG4#_DP&JXJX@y@li+&%!S1a`nG`6+78kC(_K7-~Pxm0PyQ zpr>uMg;*0ot%X3b#kkIcn2}wcdKeKl4I5he*`(+7PER{tLGbfPE=}H$&bEdA52TtP zetGGkS!$k>YZ7^I5Nx@G3rENcuaIvG$@Vzl2l-9%-=X#rD+82#@^6ig^L&~$T8ITP z^IY$LisPicr08H*A1xOnfXDf5$r8C=;;!!vhTrX`w;Q z`n)K~i7TU8@%giqp9G%mI8!o2>*bLJ?)D?S^p7Ib%->zDNa&#k%ArzMqxdXill`^b zzXG2LjgS~Rp`G3wPLB#ewT%rKtCUIH-r>(wTjB}Yl)JCEb=eTel7N7Uj*=FU^A$t zrW~ef6(Z-Ftsgq#So$`&Q~^s666$k-5O$fz~fN`!;t6cV$srF<6ff#}q+^6Ku1ncHx5A@|X8 zd5%{>Ut4qOM2Fkbl-i>!gEZG*v4rO@d5Qrn>(=3$C!&dML3^(iynW>?C2gD{?z$CqJ>qh|uG6TCcOPa6D%5QaYO~Jb(A3_4JtcW2w>#};F5&OhF%48~ zRo-N(5tje`5c=(p*!2gNLMmHo3M7AHQg*WW;M?lvaoAx@Dq9L$U~`AEW2v?5`0uTr zrRIxG?{%Osx4SOsQZa0hO3RG;egD!Z_M?Y~S#Hh0-es%?9`APKHc!gR%ljYg5B>Ok zTYkOjaMAO4vC8Q;Vt28sL*7tz#-%VVc=BlBa5AtF+CJ*lS7_+~_w_$If@%(-8_j{+ zGxC84tLl%gtqu;h&J4D0%5Mn!j?d&C<~IE3;QbZqa5O4a>c%ENF%t|CbhtH71RPpJ z$788YhwHx%*M1)yr^>zk-L)(AdxMv3zh-bXLbz$~K%3&|K-*T)zSZ;dz5SgE=k+(q zU1ySi8I8OR=yx97OJ%#DBLlts&j^u!ccRhpsxR_eymMLfmUHZ=HcusDvtndf=+hYr zzuq(XjW;EQ5nrYrH{Er%>5;vVwR2}=+1lHAGE+O@^(wxi^GShWzYOJ9g52JspNm(`F(t}ci+_A_xJA1 z=H|@gigokX$z$J`;x8z9JMZJIy*=mOEez!Wt6_&fCgmCrJi}zi!onb1TYOy_KLzi{j)^; z&)qoc#-8-B#XHuxxsAG_gE_vw{Oa+uf%oN$!eBU(?SU2ZZH^?G7mw%EG#U&0EGzZa z45kSOpP<#0L!+nq3z{0Q)CtzQuTMu3Gji{7$5#p07Wc^!S=ub`v(jx^c+OvTjWQPa z0A-HZcI`2a;agExd>|({Cm`~b&{&41pX|zBNY!Ks3*HkuN5!DCtb>u$@@{y!M?)0B zS3UTcq9vOa=zKmi_|x(3zU%7z;&mH4s~q_%bvmYJb7>u8vKVN7(cm_@)dLcN^X4yo z1H&VnUQ?lJXNrk79z-4_q)aJ)r6J&ahW}hjbk*WfFI#GoM8P3T&Ud-&uBWkg@_GZm zw;jv%eKE*=_nVfHJ3HdV9Ayv1z;LARnaDa}dBtN2Bn=N8@?{)#<b?X#T%eJUkzyN1Pn~60#yr7QY?29%q8DgH(;@IzthI``P~kMz^{f delta 28684 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 VnMjggh%c6Ck-&LjGY0pz{{i!Z`bz)+ diff --git a/SpaceCadetPinball/SpaceCadetPinball.rc b/SpaceCadetPinball/SpaceCadetPinball.rc index f6e1dca..a955a6b 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.rc +++ b/SpaceCadetPinball/SpaceCadetPinball.rc @@ -212,26 +212,26 @@ BEGIN 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 +KEYMAPPER DIALOGEX 2, 9, 284, 183 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU CAPTION "3D Pinball: Player Controls" -FONT 8, "MS Shell Dlg" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - PUSHBUTTON "OK",1,119,163,50,14 - PUSHBUTTON "Cancel",2,173,163,50,14 - PUSHBUTTON "&Default",501,227,163,50,14 + PUSHBUTTON "OK",KEYMAPPER_Ok,119,163,50,14 + PUSHBUTTON "Cancel",KEYMAPPER_Cancel,173,163,50,14 + PUSHBUTTON "&Default",KEYMAPPER_Default,227,163,50,14 LTEXT "&Left Flipper",901,20,87,39,10 - COMBOBOX 401,66,85,53,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX KEYMAPPER_FlipperL,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 + COMBOBOX KEYMAPPER_FlipperR,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 + COMBOBOX KEYMAPPER_BumpLeft,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 + COMBOBOX KEYMAPPER_BumpRight,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 + COMBOBOX KEYMAPPER_BumpBottom,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 + COMBOBOX KEYMAPPER_Plunger,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 @@ -313,6 +313,10 @@ BEGIN "DLG_HIGHSCORES", DIALOG BEGIN END + + "KEYMAPPER", DIALOG + BEGIN + END END #endif // APSTUDIO_INVOKED @@ -327,6 +331,11 @@ BEGIN 0 END +KEYMAPPER AFX_DIALOG_LAYOUT +BEGIN + 0 +END + ///////////////////////////////////////////////////////////////////////////// // diff --git a/SpaceCadetPinball/high_score.cpp b/SpaceCadetPinball/high_score.cpp index 411fa6b..9311781 100644 --- a/SpaceCadetPinball/high_score.cpp +++ b/SpaceCadetPinball/high_score.cpp @@ -4,7 +4,6 @@ #include "fullscrn.h" #include "memory.h" #include "options.h" -#include "pinball.h" #include "resource.h" #include "winmain.h" @@ -14,7 +13,7 @@ int high_score::position; LPCSTR high_score::default_name; high_score_struct* high_score::dlg_hst; -winhelp_entry high_score::winHelpArgs[21] +winhelp_entry high_score::help[21] { winhelp_entry{0x70, 0x3E9}, winhelp_entry{0x191, 0x3EB}, @@ -201,10 +200,11 @@ INT_PTR __stdcall high_score::HighScore(HWND hWnd, UINT msg, WPARAM wParam, LPAR SendMessageA(hWnd, WM_COMMAND, WM_DESTROY, 0); break; case WM_HELP: - WinHelpA(*(HWND*)(lParam + 12), "pinball.hlp", HELP_WM_HELP, (ULONG_PTR)winHelpArgs); + WinHelpA(static_cast(reinterpret_cast(lParam)->hItemHandle), "pinball.hlp", HELP_WM_HELP, + (ULONG_PTR)help); break; case WM_CONTEXTMENU: - WinHelpA((HWND)wParam, "pinball.hlp", HELP_CONTEXTMENU, (ULONG_PTR)winHelpArgs); + WinHelpA((HWND)wParam, "pinball.hlp", HELP_CONTEXTMENU, (ULONG_PTR)help); break; case WM_INITDIALOG: show_high_scores(hWnd, dlg_hst); diff --git a/SpaceCadetPinball/high_score.h b/SpaceCadetPinball/high_score.h index 8e80592..a136fd6 100644 --- a/SpaceCadetPinball/high_score.h +++ b/SpaceCadetPinball/high_score.h @@ -1,4 +1,5 @@ #pragma once +#include "pinball.h" struct high_score_struct { @@ -6,12 +7,6 @@ struct high_score_struct int Score; }; -struct winhelp_entry -{ - int ControlId; - int ContextId; -}; - class high_score { @@ -34,5 +29,5 @@ private : static int position; static LPCSTR default_name; static high_score_struct* dlg_hst; - static winhelp_entry winHelpArgs[21]; + static winhelp_entry help[21]; }; diff --git a/SpaceCadetPinball/options.cpp b/SpaceCadetPinball/options.cpp index cc5ff64..27bf97e 100644 --- a/SpaceCadetPinball/options.cpp +++ b/SpaceCadetPinball/options.cpp @@ -4,7 +4,6 @@ #include "fullscrn.h" #include "memory.h" #include "midi.h" -#include "pinball.h" #include "resource.h" #include "Sound.h" #include "winmain.h" @@ -14,6 +13,60 @@ LPSTR options::OptionsRegPathCur; HMENU options::MenuHandle; optionsStruct options::Options; +winhelp_entry options::keymap_help[18] +{ + winhelp_entry{0x1F5, 0x3EA}, + winhelp_entry{0x191, 0x3EC}, + winhelp_entry{0x192, 0x3ED}, + winhelp_entry{0x193, 0x3F1}, + winhelp_entry{0x194, 0x3EE}, + winhelp_entry{0x195, 0x3EF}, + winhelp_entry{0x196, 0x3F0}, + winhelp_entry{0x385, 0x3EC}, + winhelp_entry{0x386, 0x3ED}, + winhelp_entry{0x387, 0x3F1}, + winhelp_entry{0x388, 0x3EE}, + winhelp_entry{0x389, 0x3EF}, + winhelp_entry{0x38A, 0x3F0}, + winhelp_entry{0x38C, -1}, + winhelp_entry{0x38D, -1}, + winhelp_entry{0x321, -1}, + winhelp_entry{0x322, -1}, + winhelp_entry{0, 0}, +}; + +short options::vk_list[28] +{ + 0x8041, + 0x5A, + 0x8030, + 0x39, + 0x402E, + 0x402F, + 0x403B, + 0x4027, + 0x405B, + 0x405D, + 0x20, + 0x0D, + 0x9, + 0x14, + 0x25, + 0x27, + 0x26, + 0x28, + 0x2D, + 0x2E, + 0x24, + 0x23, + 0x21, + 0x22, + 0x90, + 0x91, + 0x13, + -1 +}; + void options::init(HMENU menuHandle) { MenuHandle = menuHandle; @@ -22,25 +75,25 @@ void options::init(HMENU menuHandle) Options.FullScreen = 0; Options.Average = 5; Options.PriorityAdj = 2; - Options.LeftFlipperKey2 = 90; - Options.RightFlipperKey2 = 191; - Options.PlungerKey2 = 32; - Options.LeftTableBumpKey2 = 88; - Options.RightTableBumpKey2 = 190; - Options.BottomTableBumpKey2 = 38; - pinball::get_rc_int(159, &Options.LeftFlipperKey2); - pinball::get_rc_int(160, &Options.RightFlipperKey2); - pinball::get_rc_int(161, &Options.PlungerKey2); - pinball::get_rc_int(162, &Options.LeftTableBumpKey2); - pinball::get_rc_int(163, &Options.RightTableBumpKey2); - pinball::get_rc_int(164, &Options.BottomTableBumpKey2); - Options.LeftFlipperKey = Options.LeftFlipperKey2; - Options.RightFlipperKey = Options.RightFlipperKey2; - Options.PlungerKey = Options.PlungerKey2; - Options.LeftTableBumpKey = Options.LeftTableBumpKey2; - Options.RightTableBumpKey = Options.RightTableBumpKey2; + Options.LeftFlipperKeyDft = 90; + Options.RightFlipperKeyDft = 191; + Options.PlungerKeyDft = 32; + Options.LeftTableBumpKeyDft = 88; + Options.RightTableBumpKeyDft = 190; + Options.BottomTableBumpKeyDft = 38; + pinball::get_rc_int(159, &Options.LeftFlipperKeyDft); + pinball::get_rc_int(160, &Options.RightFlipperKeyDft); + pinball::get_rc_int(161, &Options.PlungerKeyDft); + pinball::get_rc_int(162, &Options.LeftTableBumpKeyDft); + pinball::get_rc_int(163, &Options.RightTableBumpKeyDft); + pinball::get_rc_int(164, &Options.BottomTableBumpKeyDft); + Options.LeftFlipperKey = Options.LeftFlipperKeyDft; + Options.RightFlipperKey = Options.RightFlipperKeyDft; + Options.PlungerKey = Options.PlungerKeyDft; + Options.LeftTableBumpKey = Options.LeftTableBumpKeyDft; + Options.RightTableBumpKey = Options.RightTableBumpKeyDft; Options.Players = 1; - Options.BottomTableBumpKey = Options.BottomTableBumpKey2; + Options.BottomTableBumpKey = Options.BottomTableBumpKeyDft; Options.Sounds = get_int(nullptr, "Sounds", Options.Sounds); Options.Music = get_int(nullptr, "Music", Options.Music); Options.Average = get_int(nullptr, "Average", Options.Average); @@ -261,5 +314,189 @@ void options::keyboard() INT_PTR _stdcall options::KeyMapDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { + char keyName[20]; + int keyBindings[6]; + char rcString[256]; + + switch (msg) + { + case WM_HELP: + WinHelpA(static_cast(reinterpret_cast(lParam)->hItemHandle), "pinball.hlp", HELP_WM_HELP, + (ULONG_PTR)keymap_help); + return 1; + case WM_CONTEXTMENU: + WinHelpA((HWND)wParam, "pinball.hlp", HELP_CONTEXTMENU, (ULONG_PTR)keymap_help); + return 1; + case WM_INITDIALOG: + for (auto vkPtr = vk_list; *vkPtr != -1; vkPtr++) + { + short vk = *vkPtr; + auto vk2And = vk & 0x4000; + auto vkChar = static_cast(vk); + unsigned short maxVk; + + if (vk2And) + { + auto index = 128; + do + { + if (vkChar == MapVirtualKeyA(index, MAPVK_VK_TO_CHAR)) + break; + ++index; + } + while (index < 256); + + if (index == 256) + { + continue; + } + + keyName[0] = static_cast(vkChar); + keyName[1] = 0; + vkChar = index; + maxVk = index; + } + else + { + if (vk >= 0) + { + maxVk = vkChar; + } + else + { + ++vkPtr; + maxVk = *vkPtr; + } + if (vkChar > maxVk) + { + continue; + } + } + + for (int curVK = vkChar; curVK <= maxVk; curVK++) + { + if (vk2And || get_vk_key_name(curVK, keyName)) + { + auto ind = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperL,CB_INSERTSTRING, -1, (LPARAM)keyName); + SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperL, CB_SETITEMDATA, ind, curVK); + if (curVK == Options.LeftFlipperKey) + SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperL, CB_SETCURSEL, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperR, CB_INSERTSTRING, -1, (LPARAM)keyName); + SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperR, CB_SETITEMDATA, ind, curVK); + if (curVK == Options.RightFlipperKey) + SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperR, CB_SETCURSEL, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_Plunger, CB_INSERTSTRING, -1, (LPARAM)keyName); + SendDlgItemMessageA(hDlg, KEYMAPPER_Plunger, CB_SETITEMDATA, ind, curVK); + if (curVK == Options.PlungerKey) + SendDlgItemMessageA(hDlg, KEYMAPPER_Plunger, CB_SETCURSEL, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpLeft, CB_INSERTSTRING, -1, (LPARAM)keyName); + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpLeft, CB_SETITEMDATA, ind, curVK); + if (curVK == Options.LeftTableBumpKey) + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpLeft, CB_SETCURSEL, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpRight, CB_INSERTSTRING, -1, (LPARAM)keyName); + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpRight, CB_SETITEMDATA, ind, curVK); + if (curVK == Options.RightTableBumpKey) + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpRight, CB_SETCURSEL, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpBottom, CB_INSERTSTRING, -1, (LPARAM)keyName); + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpBottom, CB_SETITEMDATA, ind, curVK); + if (curVK == Options.BottomTableBumpKey) + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpBottom, CB_SETCURSEL, ind, 0); + } + } + } + return 1; + case WM_COMMAND: + switch (wParam) + { + case KEYMAPPER_Ok: + { + auto ind = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperL, CB_GETCURSEL, 0, 0); + keyBindings[0] = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperL, CB_GETITEMDATA, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperR, CB_GETCURSEL, 0, 0); + keyBindings[1] = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperR, CB_GETITEMDATA, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_Plunger, CB_GETCURSEL, 0, 0); + keyBindings[2] = SendDlgItemMessageA(hDlg, KEYMAPPER_Plunger, CB_GETITEMDATA, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpLeft, CB_GETCURSEL, 0, 0); + keyBindings[3] = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpLeft, CB_GETITEMDATA, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpRight, CB_GETCURSEL, 0, 0); + keyBindings[4] = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpRight, CB_GETITEMDATA, ind, 0); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpBottom, CB_GETCURSEL, 0, 0); + keyBindings[5] = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpBottom, CB_GETITEMDATA, ind, 0); + + auto sameKeyBound = 0; + auto index = 1; + auto optPtr = keyBindings; + while (!sameKeyBound) + { + for (auto keyInd = index; keyInd < 6; keyInd++) + { + if (sameKeyBound) + break; + if (*optPtr == keyBindings[keyInd]) + { + lstrcpyA(rcString, pinball::get_rc_string(43, 0)); + MessageBoxA(hDlg, pinball::get_rc_string(39, 0), rcString, 0x2000u); + sameKeyBound = 1; + } + } + ++index; + ++optPtr; + if (index - 1 >= 5) + { + if (sameKeyBound) + return 1; + Options.LeftFlipperKey = keyBindings[0]; + Options.RightFlipperKey = keyBindings[1]; + Options.PlungerKey = keyBindings[2]; + Options.LeftTableBumpKey = keyBindings[3]; + Options.RightTableBumpKey = keyBindings[4]; + Options.BottomTableBumpKey = keyBindings[5]; + EndDialog(hDlg, wParam); + return 1; + } + } + return 1; + } + case KEYMAPPER_Cancel: + EndDialog(hDlg, wParam); + return 1; + case KEYMAPPER_Default: + { + auto name = (LPARAM)get_vk_key_name(Options.LeftFlipperKeyDft, keyName); + auto ind = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperL, CB_FINDSTRINGEXACT, 0, name); + SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperL, CB_SETCURSEL, ind, 0); + name = (LPARAM)get_vk_key_name(Options.RightFlipperKeyDft, keyName); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperR, CB_FINDSTRINGEXACT, 0, name); + SendDlgItemMessageA(hDlg, KEYMAPPER_FlipperR, CB_SETCURSEL, ind, 0); + name = (LPARAM)get_vk_key_name(Options.PlungerKeyDft, keyName); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_Plunger, CB_FINDSTRINGEXACT, 0, name); + SendDlgItemMessageA(hDlg, KEYMAPPER_Plunger, CB_SETCURSEL, ind, 0); + name = (LPARAM)get_vk_key_name(Options.LeftTableBumpKeyDft, keyName); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpLeft, CB_FINDSTRINGEXACT, 0, name); + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpLeft, CB_SETCURSEL, ind, 0); + name = (LPARAM)get_vk_key_name(Options.RightTableBumpKeyDft, keyName); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpRight, CB_FINDSTRINGEXACT, 0, name); + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpRight, CB_SETCURSEL, ind, 0); + name = (LPARAM)get_vk_key_name(Options.BottomTableBumpKeyDft, keyName); + ind = SendDlgItemMessageA(hDlg, KEYMAPPER_BumpBottom, CB_FINDSTRINGEXACT, 0, name); + SendDlgItemMessageA(hDlg, KEYMAPPER_BumpBottom, CB_SETCURSEL, ind, 0); + return 0; + } + default: + return 0; + } + default: + break; + } + return 0; } + + +LPSTR options::get_vk_key_name(unsigned __int16 vk, LPSTR keyName) +{ + LONG scanCode = MapVirtualKeyA(vk, MAPVK_VK_TO_VSC) << 16; + if (vk >= 0x21u && vk <= 0x2Eu) + scanCode |= 0x1000000u; + return GetKeyNameTextA(scanCode, keyName, 19) != 0 ? keyName : nullptr; +} diff --git a/SpaceCadetPinball/options.h b/SpaceCadetPinball/options.h index 95037ae..b210c38 100644 --- a/SpaceCadetPinball/options.h +++ b/SpaceCadetPinball/options.h @@ -1,4 +1,5 @@ #pragma once +#include "pinball.h" struct __declspec(align(4)) optionsStruct { @@ -14,12 +15,12 @@ struct __declspec(align(4)) optionsStruct int LeftTableBumpKey; int RightTableBumpKey; int BottomTableBumpKey; - int LeftFlipperKey2; - int RightFlipperKey2; - int PlungerKey2; - int LeftTableBumpKey2; - int RightTableBumpKey2; - int BottomTableBumpKey2; + int LeftFlipperKeyDft; + int RightFlipperKeyDft; + int PlungerKeyDft; + int LeftTableBumpKeyDft; + int RightTableBumpKeyDft; + int BottomTableBumpKeyDft; }; @@ -37,8 +38,10 @@ public: static void menu_check(UINT uIDCheckItem, int check); static void menu_set(UINT uIDEnableItem, int enable); static void toggle(UINT uIDCheckItem); + static void keyboard(); static INT_PTR _stdcall KeyMapDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); + static LPSTR get_vk_key_name(unsigned __int16 vk, LPSTR keyName); static optionsStruct Options; private: @@ -47,4 +50,6 @@ private: static LPCSTR path(LPCSTR regPath); static void path_free(); static HMENU MenuHandle; + static winhelp_entry keymap_help[18]; + static short vk_list[28]; }; diff --git a/SpaceCadetPinball/pinball.h b/SpaceCadetPinball/pinball.h index 403a43b..e6dfb96 100644 --- a/SpaceCadetPinball/pinball.h +++ b/SpaceCadetPinball/pinball.h @@ -1,6 +1,12 @@ #pragma once #include "TTextBox.h" +struct winhelp_entry +{ + int ControlId; + int ContextId; +}; + class pinball { public: diff --git a/SpaceCadetPinball/resource.h b/SpaceCadetPinball/resource.h index 4f7adb8..c8b2b97 100644 --- a/SpaceCadetPinball/resource.h +++ b/SpaceCadetPinball/resource.h @@ -5,8 +5,10 @@ #define IDS_STRING101 0 #define IDS_STRING102 1 #define DLG_HIGHSCORES_Ok 1 +#define KEYMAPPER_Ok 1 #define IDS_STRING103 2 #define DLG_HIGHSCORES_Cancel 2 +#define KEYMAPPER_Cancel 2 #define IDS_STRING104 3 #define IDS_STRING105 4 #define IDS_STRING106 5 @@ -203,20 +205,27 @@ #define Menu1_Help_Topics 301 #define Menu1_Launch_Ball 401 #define DLG_HIGHSCORES_StaticName1 401 +#define KEYMAPPER_FlipperL 401 #define Menu1_Pause_Resume_Game 402 #define DLG_HIGHSCORES_StaticName2 402 +#define KEYMAPPER_FlipperR 402 #define Menu1_Full_Screen 403 #define DLG_HIGHSCORES_StaticName3 403 +#define KEYMAPPER_Plunger 403 #define Menu1_Demo 404 #define DLG_HIGHSCORES_StaticName4 404 +#define KEYMAPPER_BumpLeft 404 #define Menu1_Select_Table 405 #define DLG_HIGHSCORES_StaticName5 405 +#define KEYMAPPER_BumpRight 405 #define Menu1_Player_Controls 406 +#define KEYMAPPER_BumpBottom 406 #define Menu1_1Player 408 #define Menu1_2Players 409 #define Menu1_3Players 410 #define Menu1_4Players 411 #define DLG_HIGHSCORES_Score1 501 +#define KEYMAPPER_Default 501 #define DLG_HIGHSCORES_Score2 502 #define DLG_HIGHSCORES_Score3 503 #define DLG_HIGHSCORES_Score4 504 @@ -231,9 +240,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 203 +#define _APS_NEXT_RESOURCE_VALUE 204 #define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_SYMED_VALUE 102 #endif #endif