From 12330e38cb3c2a023bc1327cb89afd19efed0a43 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Wed, 10 Feb 2021 08:57:51 +0200 Subject: [PATCH] Controller menu --- gamefiles/TEXT/american.gxt | Bin 423450 -> 423838 bytes gamefiles/TEXT/french.gxt | Bin 467876 -> 468076 bytes gamefiles/TEXT/german.gxt | Bin 459590 -> 459742 bytes gamefiles/TEXT/italian.gxt | Bin 456886 -> 457046 bytes gamefiles/TEXT/spanish.gxt | Bin 454562 -> 454854 bytes src/core/ControllerConfig.cpp | 50 +- src/core/Frontend.cpp | 819 ++++++++++++++++++++++++++++++++- src/core/Frontend.h | 29 +- src/core/MenuScreensCustom.cpp | 41 +- src/core/config.h | 3 + src/render/Font.cpp | 40 +- src/render/Font.h | 5 +- utils/gxt/american.txt | 31 +- utils/gxt/french.txt | 10 +- utils/gxt/german.txt | 10 +- utils/gxt/italian.txt | 10 +- utils/gxt/spanish.txt | 10 +- 17 files changed, 1002 insertions(+), 56 deletions(-) diff --git a/gamefiles/TEXT/american.gxt b/gamefiles/TEXT/american.gxt index 1721705d03c59c549e692d13d43d2b048c48505c..f4afab9eb0f61be5dc3a9315887d4bc531836844 100644 GIT binary patch delta 5253 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 delta 4855 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 diff --git a/gamefiles/TEXT/french.gxt b/gamefiles/TEXT/french.gxt index bd9c658b68eb908a2592a174374975bf139222db..79e594ecea315973963ef93d6ec0f04d30f30e70 100644 GIT binary patch delta 4406 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 SSG?2q-t5xd4|X% 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 diff --git a/gamefiles/TEXT/italian.gxt b/gamefiles/TEXT/italian.gxt index 2c2bd3bcfec12e6abbb77d662804402d32df7af9..144356ec74442fcee446431ff7edf398cc9e3903 100644 GIT binary patch delta 4483 zcmZ9PeQXqE9>>2s-L4JNUiF|AM2-~fDd4vI((Mb-IJ-OB-F9|&n3>%c4jJGSD` zqP#BR@uG)VdAKeX1SDV#Iia#S;RphUgm{R>7>^KxLJSf^@S>b@oEme#*?DIEIFgdj z{GQ+Y^UQCaefPV2FWkJhZ%i&awgjT4B~m`1yN0tL=$pVf01ThRIS6zGIX3_|T1yZX zQyuMOJ3PXfY}ceXlWn)bnQV6~G+9lXu{LckaxR@BgN^-sfeiNU<4gvFZ*!(#4<92= zbVy{2;QJPnDK>p*F`4463&hDT!_@iy3*xk>hch#9@^T3xqEeKvylS#)iZSkoT=78> zRUa$_qopWH}9q=-trn_OC2|I!yygUPS~WY3ljkfpb=F+A*sSu{b&ILf zI0+9FHC^n=k-IE5^>6>iVpG5Vw;rfsMAC>iP9cuu;*y;3VQ<)cP~;S~s5@q|spi9k z1aUgjVJ4w>SZq4IILl(w>Bo7Z0dCHv)I%rJLrKfc2OkSnvX4x&>nm} z;Y;hGlg`1<-`Gs&;HJ$146?tKEEM9a3bpR#LWO6!V7{=DZbZpe8_@4?2nQT)#2JU1@TJ4ez`EhwQByr8tYg1C@a3p+W*mCYX&B(< z9^$NSNUBQh`|pDXU88O@0WnE50?{}=+uj!8 zBhxCWgmJ{?jD``fTOLwk9JBVY@qLv=#aMt0yKb@V+OEY%3jmka$icc5}T8||%e-DcCg)fE@GbwrJ#X#<<* zZSfCmvUH>2HuUy!mSZ^gXPag8aDUOXj*5OZJ z-CV9Fu$hgl8}B;Gn(M|-o5%HIN*Z6RvvgvL3YmwAb!u2JX!(hYVRZ4V<6#vS*lTrl zLi{Cmw$597nkSJ^X@tFOIZ9;XP;7ZNi+CR!TVFL=f7M!UPtSm#=h&V}qBYM_v^)7i0n%eJQv8?5A1bbezIgYV;&Ji8GFS0ZBHNGldgd7tg*s2{ey7>Oc z9Xby11Y{b?pR!TDDWfWRiLy!~(YB(hZm}nQ)wO5&zQ~yr+U?bhf|+*s&L|%3XZw9M zwUc@2NiB}4yd_CZhVF0@i(h6peX-h=JkylifmWO8_?GQ9k7mT6uK_~+Y_`8<^e|q3 zx?RI!o=m!<1Nvq*;IGL=d2mxb;jUz zn0n-}iUEgptmnO(o{_MUm!Z-qkL|J=rBc~4-wIWf;kB7g#TWay4we0Yl`gv@_+a@k zTStrGUu;^idQ`V9q0LmcTMg1;ItJL2v^vP!swFiXI%N6Ok~%iB*Mrs5YPWEG+A@`A zrDej{&G$;nQbRX#otX)ob~ue8_Fb^Le29+$J!(ouHjK~hc*D}yV;KzEtF%eScyDzY z59V27Go5-1LH*=QFPRB=|)GHN-iG{A@6 zG0Tz-jWX-oY6eOgF*S)4XE`0Ej2oIyjPBu*tQNt91Ey8dm_hfB-T_w8vbm!5HPd*y zp{Wvv4HWjbq+G&?9qh*`HU5>m%q7i;BojDOJQ5}=m|uL~h&2%liXRfqh>ALvZfB{f z$1_`tr-3d7bibNkteaR*;Ce9;lWFc0qv~Xq#QLHOVkw5Q;#ZDXOJV0WGdz6+$q=b0#Uozxvcy|%kX$<3%!x5Z*vMA3PzQ!oF zEVh+m*z0f`u03VT;~4C*Ie`gJ+uV+cOKk4IXAa9~n#JW!B0hCEj3tlQ@(32Mgw9FCy(QCla9H4aO-=x_{I9BxC|d|N+` zOb8~q~I&apX+;9Q#{ zxZp6|lIGcR2_HKgLzI`)=x@WAKX4r?JM1uhsvM3W+*{NM8;yY|ywBJM5_%ktVf9j5 z-iF1`+8oDA4kvK6&}>9puCr{_oM&Cf*$;DGDL=YWKsuwxbe|7b3a`$cN^IYinrmm>lf_wsN^nL#t*tJGIO&$a`P7wQR$!Wv;`w zmI>=KrHe2ZHoP{gkC&F)Pu+J-+km6nXfqD@oczpUZB4c`g0$?alW+cva2UA9rTHc-ObF+ z{PuaD=Xsxx_bVS?zWMmKH*cMnJNcsm@QRX1d4cJlF!ljO3mE%>!CJ-vV9L+95xB3l z0AW7W(N4C5Va8;8HOZK4r+XNaZP`kL<+L%EdyC1rbczhHgAI_uyaSBMpymz6G}-U| zK%D3h$QFkuEH+Ht?^{f!xbtU5=W=GAa!37WnrK!le}`IWyJEE{6%ypl6N zBwqGH`i?j)(HJoHKZ7$Vl|0qB+!oVp%YHzdp`1zHcQa#>tF??NiiRe}lt59$jaVYZ zivs!VG*}i?xdWwZ-Dne1f}G>MD0+r{@IDN_Y_lKBMr;n?-IF#qV)LXMaXw+hhJ~M7 zY*b?U9~K*xxbI)YX;l!3Yrb@BL%(LT9}T~@Ie>**3z1Cl$pjVq*a&fwoYUWmeT7JO z@}it*!`}Uckm3oE63C(S4eP_mVC^yDM0Yn&eDxG@S~e<;rn43sI#A>J&^f`pb+CO;z%wohzT#|g^dqMOi_uZ1%nMWFZRTV z(~%A%h_me$8&0LA78_3E4|<>oa+{&^?k|d$Gx3 z9}YY0$ArTHeBy8;E;$@TNjLK!457y1Cd_-vl;@)UU^AMmkElP?0M%hHRypj$dWZe^ z@)_nd6u^wbjVKwkDEK9TcfdL3S}b}CnZ1J(}mRDZcQWVI9$U>Y`8Q@2oF&KW|CG zbaDjrr|zuh#y0AscgmGpH&_D^I$u&dZ0^9OXZ6auDp#MrsIH*u?CdUO5!MV~VLn3P86vzAUwlJPe48Oti@9kcwz`7owf72;tTDScOcJ$L3g z{k{6S>V?c8A*<+Tc_cdHcz2uSG|}0KGcW45G?Z7K-D-*2(@WrEF}7!tIKD$q(eN=^ z8%CkUuon{!`|#1A{&YiC^(s~vF&sf9i$)B`v4a&_jHtM{Nq?uI%DaWdB*u6QY+_zJ zL`<>%h#e|MSpXs($)Y~jd)M4ewo{poMB9q8dRTwRTTvZm!Hby`ChXCSgb(fMvr&Au zT|eZls@~61PbzU7Vx(QSay?Rt-| zs&f4nE0J`&g7d5v>5dMZeL)}gRpm~y_#{4xN!DD6SKwxON_+;hSfeE&iicS(q?n98 zHnY?g#d3!;n6Y)*X^Yt`(qgc6LUc^D0X;qv%z;r0> zy;kV@b%EQ8*V{Tu3=imw0u^(oZ3#8=yz@bT zuYUX$V}>}Ly>Y}Cr|3N~{+cmETvOV393IgpL*?8j!}|Hqd)$Y+^`lKKiGK4i7qxa? z!WPC-TEqxrnGW#DH;uGJO`*t&%uScnVsaAinAb#76Vp+OxUuf|P|kD&^3$N-yQm^JZmu&`OOj-*%?hnTvrQzYS+=oR(vpf2a~-RiaR8K<9U!I` z*W@lMs>N-_qGmj zE_eQ`yH^(YS~@wOSb*q>> z6o%?>1PdQBE7%_7Er#<+=x zxYXt_E;t;4de3}&Ac}YHu~|S>kIga6%0IT`hwj|R%PmpR&*PS#+Z;x~;Rr4|9K}_K z1xWYV`Z07l+=g}c+wwRrJDk95)`+0L9WC^{qz2uh1*t>ZtPkQaW^AS^OZrcHl$@+t z?m|8u*BlPx@G@H-LF!(c>6PTLfH+Gpuu;s4>;+ zMOXf%dvABSR^x)vK$muk~MDw8XWc_ z<**NH9roj>!vRcY^@%>YWSlmd>4G-Vbf;eR=;Or~pEN|8FB^}dG=JdH6I{tbOQfiD zAWjbGy{qd=mRh20oG!)Tf&9VMGw$lZ5Ql6cr8U#89cCQu0%kK->ChT}Ri9YnqB0PjU1spr8B1_*CJXFI-(i9~|+VcC`$>Fy^UnogF$b r=J|`O`@~~!dY+s&)Vr3uX-Im@Q$6(jgr{|A_ybSbiJg<4Q?>sGufct& diff --git a/gamefiles/TEXT/spanish.gxt b/gamefiles/TEXT/spanish.gxt index 60012324f28785ce6f1505e2bb37f099eb606a7b..7ef6c0124b2336ea63b96e7ca56699b1aca1b780 100644 GIT binary patch delta 5096 zcmY+H4{#Lq7017~NluDzO$8GSh%v>qDxA5ya0!8?+1tI#-DU4?+17 zAwt+f*qw~$ z0&+tMB7C|nNxp;g8Ix~aD`WCKbvI-3ow~wgC1dt=V28!|Oqv{yJkA=(q2*b| z!psem-m}@vt?px+%}R7#B+h72iFm;mrAP=-L801}erQ0;LZSiWaqMOL!5qQpVd6w*Cr>=|7I8)~D~$!GZ8kMyAKPq> za>74trb^?hQZHmBV^w9S!e&$d$!#`U>tnVT3NJ)evTx;yg?v0JB?9P*n-8*-rV=e^ zGue~{P@N{u2yJE(eG6?igZ6jZYz95D)(bVNw3?djyKFW!eLu6=)O5e#g~oSKPeA?e zY!+w^p1bV>`=OoILC4=5rgiWShePPQXpEPv;_B8GYfGCs--RD?=8lbOx`5fMi@n}0 zrJhfX&nMpH>!y~7k`Q%4!m(9F|MkNq+~#EQsPC-_Tvc0fTVvHU{oIT069tLoCYcu~Zr-p0GJ3hcJu$ zOnXX>ApMlFcypQGG#so!o9==gYV(BU>*HvTy0+qK#jW=W~=?e|zw1to+I7Ee$_%-m#D z`J3{mm{g3k(q^^YL@9=YI~9^b{@lq9XcBAzzJrLrbX;z-O!nV124kr zKAO&<+^}Otl?1lhF^xa_Z{|jK7?=Gu$xoPDOwQo-jkYuymISP>9rsl?h-)OlUalbj-IkUYY)6ZPi9kC@Te`4cnMoyveT9# zKn)wF6bZoZG995Cjo!MN+A9w+w}^mi4>}x2wG&RzaP&cAysjqbWrdMqJSI5OHVNrX z%&kpB&gq$s{_tkQ7ihYvht*9|S|K`aRH>`Rl0aqcYpfPhHjQmgYgUHl^xrN*88n^= z)YJx92~%nuKV@Z3sS=)ZIfVmxqw9|>#9z%u85}I6A zu+3!+ud-4t%tn!8!kD91Rm?nMZ#*q4;E2;rdj=zHk!5L-O>&rO zu=pu!Jx+AA2qJct?^tiZVp%0t}d9# zi#pG%7-t+wNZ9qX8C=xqrHt)+jLvY=xnWh{6ccNTgmM-zC(|p2Wze2b@f@?aODX)- zc)vlft+rlbae8sZapiF{Xk1Uzjm3=>T-Rg9hQ^cJo?#<0uPJ|R zw<(tNBrjv4)wQI{841%ED_Iqn4wy3`=_(a-->9ii=|MU(r!p33rwv*oN$D{qg;8dY z(+#nkae@w)I;N569NuQz1zpOtV~B}TbPOC~BJ;XA%_?F_Ph}z)7&DVd>1n#-Ze#Xz zCXI=Ejpiml*SOc{X{wmq!Xl|c3||>fHf^l!V)1gSfEMQ05$Ql5i?@hMzhTJm&mZ>9 z{)suZg}SOlF=?oHa(>$5yYjSYQ#*AU*MecA_IowK^G{kPT}UNx*4n5lv5Xe$cq3NL zTAOuOb&=Q5`x+Dl9+s%h-rX?8|8 z8S<*J=0ww56&@oG8^g^N`5=>~sQHZ5zow^D4b|5A*Yu36Vb_oyLgusR88!3LbeS&B zIc8tj3hcHvt)^R-dTYqUw5bMuZ2KxyJ<;V14nA+inL-N-c!`ZhrO`~Eyj`bN_tj2fh0lS&5wHVk? z491pzE5CFR2U-w%Ak1UTNzV;6D3QAaL8n}m=*}&<(}g4t~)$j z`tjoBCE@G1reyJsm0pkUC~1_al%Z<^#)gW`t9F+*iwO>@CM$ZN4*f0%@Py0s9p`cg zU%On7nMvb@wTka5?KCR{?V_0pqj&8pUnljXYI?9eE@ID`;)S)ZalVI=jIEn$3cKFqW|YlFHTnwweYWJrLfs{9qNlp>YSWE5eumrvItES)mxEIUNgKqlY3)6cU){x>QtfJP{SX;R7R?jVklSjEp zm8RzZ^?uUJg%984rhK!S+#bL)*gzuF?UgsVIfe2$C8dSI3tUxUUB**aIQn2&_2H$* zxP!`$sZ&bmS4zLK!&9etxlCe!{!!JO2YoG%F|o delta 4872 zcmX|_4R93Y8OQ%wE+>O>V*v>uQk!C`F&??Q%ak_w)IjRrCdRcFi~O>N3C;MkN=hKUp{T1u^UEVT^dFi06oGYnrq ze*3)7_xrK$-Q?eIee-X(4lXRrnLQ1>rb(Fq5UpYy1lBBI90Kq?#tp#vTE>mQj_@=H ze5NHuw#S7OOE`Z2_L}AQ8*N)B+#CydL(z2k~yd!y$Nv9B#n8Lk>4$*`xoR#L5NZL>;jt zwrIKzJzNQyZ(9|k4mI5Ca1cFf91daZIfomtaj+6;iBC(^?7E*5r^z{eF1%5RY%4FT zQUY_{s)Ul1WGbM5|NPQ^uqrrnm{@9W=ZQ~zK%7;rPNU}&n=PI5=WMpBj9#{xI*lfe z7mAuKcjd$_He33)-(hokebjlO@?uOQ`NRrhv5<_(QUH4s)`KEvs6{;~i!HSPR;P)x zVvCi;xMH*A^w7gLTTZX7_d<)Q2}|ewoiM|UasAPf|Hk4p?yyuk>N_@_(^I9bRl?1M-V_H~3DHpFQtWa#T#s>=1Ne)} zLHy6<5azTn+i(MFU2en*m%~`&as<6DH{sO!vTY$63NOV)`ym>N)Wf@hIgJFc$mJj! zTn-`SasxVCZbY}sVH91CVASO%9CLXozS?jj3)WN*kNNvMKbpUABS~nZ(`kUyL&UAR z5mQz8O25AAR}~ct%?IzU;x4{w_TGK8W^#l>JjNUGbOzj@&1ofs4zjc4X+^-mkl9f; zmnP)Nx+T6bHlW4x5MDG7)-}&u{H&!b8a&Mr%zu+ol1T(Q7pD5n@I8L6=V^28J?i}0 z9$QzW1UkP(co|!kD_V2j>Yoem^_w=;y4RKX9mXJMmc;e(~8tC+fPiD@Sd%2 z{?UIMcY2$7#b2FT#IlYnSzPJ1RpW{Z&u+%5h>a{vyiLQ}U)ZjbynxHk*g8o;#nd*l zV~L;p>KU`R#9#Q56(XrRMp&^@YZ5P%XG}DtRs|!DPHQXrSQAo07MED$R5XU`tk_gq z!6HYVjbhzaJ8~+!3W6i2tUtF4j~J<38r^J)WM0OW19sZ70IX(Z%0d9^Tn?hU+uT%N zT~p6;kp&SAtU_5xqTO*P>bTZxzE@uzT)`S6$9V|7c1m)KjDa49b+kH>X?<;c#`Fc6 z=kIsCstNQtX4I*m`Cy=`=36IzE`teYG^e2G#BYmYN58o*P+il-TA0?7_>8qVt;sm+ zavERvnO_IuHTzkr8My@=4%5EbJ!CH@dhI~(H`QSEg1KAl?6WBiBP^M0OAEFY%wn*5 zW}fw4;iH&k{x(=u7-daVVo~^5=}KJ1JQhbuL@~qV9L5}-l!6OS*})W=nLbBH*6^jn znt*eTK9xD?vVv|q(Hjg!mvMTF*&eEXXvp!`7Kh@pjLj~qm~dIgW!9>dxfljn9kgjN z##Ww6Rc>XSS7{-w8!*p?=5nci^J>UHGwzINanzWBhN{AdBcWL;?yzgq;yNZ-JsR~t z!%hb+9YQdWYWdA+f^VzGH!xTBW^qJ>v{r zzEZ}Z5Ad zL!)MXSxzr)1nJDoFcxX29edGAAZ^6eG)^;ll5U9m7)x}xbTS>8&fy7LE*f&S4U>gFn_I@h+bxw7xLK5{H>zak8d~q_ZEF?U$SagX=rK;@$IFP_hu@5_2pJ;?FQA= z{jyneUv+TaPD@QQ#I%H2FFUNDw|u;jT;s8Mr`31Oi1PGK-C_3Lckqr=<^4x@J?hGg z@)Qy45}L|uz+xHo=E~(&HMK8TPIV)yW$@|GY>tuD>hhfEMndIrYO7gXKDW@toTh2m z=dh-uojJ`aIzHZRyHNNX*6+6R(hY?!&Vx+8G68&A-n6=5UFv6*OD3jGb%>>+Quq2? z&SLznvY*+su;?ORv;$~VO?;;r{^50Q^An}uiWJB7ZY=c)>a^gA1P8jHD~)s8%YPKP5rdLLl&h=5U-MI7%a%L_&z62)P|QHtY~%L!as<3~2cd`n@)aI9DbL|6a;kaV^hy;0bt#nvGP<2?u`z}YZSaakt9Cta6T2@me zNH-(a)Ckr6rpp4}by>vVkIQ~UBNB?DZ!L2gis69EalHA6BTt~X&fz4+T$V7kuGHHR zuHa5@G!Gix71iclYhLkv{y2whPLJz>04_XUnp{&`!3`8kR~`)Cz-^XFwU2r$eAh@v zjmcTMCg9xm((=yNJj?r%95h`~jX*sPx*Whsm+5z$%ONyLj(!93k~wRG>I*uEedNoG)+7G@Z`kkuLL{O@7~8Thx}MQ@EYfHeK}8TpHle zCS{DJv~LwUiY$)i=}#gi*Xht2-)UZdD#)E1dEVdC@9(KN;_uIsAffectedByController) { wchar wstr[16]; - // TODO: INI and/or menu setting for Xbox/PS switch + const char* (*Buttons)[MAX_CONTROLLERACTIONS]; + #ifdef BUTTON_ICONS - const char *(*Buttons)[MAX_CONTROLLERACTIONS] = CFont::ButtonsSlot != -1 ? XboxButtons : XboxButtons_noIcons; + #ifdef GAMEPAD_MENU + switch (FrontEndMenuManager.m_PrefsControllerType) + { + case CMenuManager::CONTROLLER_DUALSHOCK2: + case CMenuManager::CONTROLLER_DUALSHOCK3: + case CMenuManager::CONTROLLER_DUALSHOCK4: + Buttons = CFont::ButtonsSlot != -1 ? PlayStationButtons : PlayStationButtons_noIcons; + break; + default: + #endif + Buttons = CFont::ButtonsSlot != -1 ? XboxButtons : XboxButtons_noIcons; + #ifdef GAMEPAD_MENU + break; + } + #endif #else - const char *(*Buttons)[MAX_CONTROLLERACTIONS] = XboxButtons_noIcons; + switch (FrontEndMenuManager.m_PrefsControllerType) + { + case CMenuManager::CONTROLLER_DUALSHOCK2: + case CMenuManager::CONTROLLER_DUALSHOCK3: + case CMenuManager::CONTROLLER_DUALSHOCK4: + Buttons = PlayStationButtons_noIcons; + break; + default: + Buttons = XboxButtons_noIcons; + break; + } #endif assert(Buttons[CPad::GetPad(0)->Mode][action] != nil); // we cannot use these diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 4eae64b7..141f46f8 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -125,6 +125,10 @@ bool CMenuManager::m_PrefsMarketing = false; bool CMenuManager::m_PrefsDisableTutorials = false; #endif // !MASTER +#if defined(LEGACY_MENU_OPTIONS) || defined(GAMEPAD_MENU) +uint32 TimeToStopPadShaking; +#endif + const char* FrontendFilenames[][2] = { {"background", ""}, {"vc_logo", "vc_logom"}, @@ -151,7 +155,14 @@ const char* FrontendFilenames[][2] = { {"downOff", "buttonA"}, {"downOn", "buttonA"}, {"upOff", "buttonA"}, - {"upOn", "buttonA"} + {"upOn", "buttonA"}, +#ifdef GAMEPAD_MENU + {"fe_controller", "" }, + {"fe_arrows1", "" }, + {"fe_arrows2", "" }, + {"fe_arrows3", "" }, + {"fe_arrows4", "" }, +#endif }; #define MENU_X_RIGHT_ALIGNED(x) SCALE_AND_CENTER_X(DEFAULT_SCREEN_WIDTH - (x)) @@ -526,6 +537,10 @@ CMenuManager::CMenuManager() #ifdef NO_ISLAND_LOADING m_PrefsIslandLoading = ISLAND_LOADING_LOW; #endif + +#ifdef GAMEPAD_MENU + m_PrefsControllerType = CONTROLLER_XBOXONE; +#endif } void @@ -1074,7 +1089,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen) } switch (aScreens[m_nCurrScreen].m_aEntries[i].m_Action) { -#ifdef LEGACY_MENU_OPTIONS +#if defined(LEGACY_MENU_OPTIONS) || defined(GAMEPAD_MENU) case MENUACTION_CTRLVIBRATION: if (m_PrefsUseVibration) rightText = TheText.Get("FEM_ON"); @@ -1539,6 +1554,11 @@ CMenuManager::DrawStandardMenus(bool activeScreen) #endif switch (m_nCurrScreen) { +#ifdef GAMEPAD_MENU + case MENUPAGE_CONTROLLER_SETTINGS: + PrintController(); + break; +#endif case MENUPAGE_STATS: case MENUPAGE_CONTROLLER_PC: case MENUPAGE_SOUND_SETTINGS: @@ -2280,6 +2300,9 @@ CMenuManager::DrawBackground(bool transitionCall) break; case MENUPAGE_SKIN_SELECT: case MENUPAGE_KEYBOARD_CONTROLS: +#ifdef GAMEPAD_MENU + case MENUPAGE_CONTROLLER_SETTINGS: +#endif menuBg.topLeft_x = 14.0f; menuBg.topLeft_y = 39.0f; menuBg.topRight_x = 636.0f; @@ -2948,12 +2971,19 @@ CMenuManager::LoadAllTextures() CTxdStore::AddRef(frontendTxdSlot2); CTxdStore::SetCurrentTxd(frontendTxdSlot2); +#ifdef GAMEPAD_MENU + for (int i = 3; i < MENUSPRITE_CONTROLLER; i++) { +#else for (int i = 3; i < NUM_MENU_SPRITES; i++) { +#endif m_aFrontEndSprites[i].SetTexture(FrontendFilenames[i][0], FrontendFilenames[i][1]); m_aFrontEndSprites[i].SetAddressing(rwTEXTUREADDRESSBORDER); } CTxdStore::PopCurrentTxd(); +#ifdef GAMEPAD_MENU + LoadController(m_PrefsControllerType); +#endif CStreaming::IHaveUsedStreamingMemory(); } @@ -4896,6 +4926,16 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u if (changeAmount != 0) { switch (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action) { +#if defined(LEGACY_MENU_OPTIONS) || defined(GAMEPAD_MENU) + case MENUACTION_CTRLCONFIG: + CPad::GetPad(0)->Mode += changeAmount; + if (CPad::GetPad(0)->Mode > 3) + CPad::GetPad(0)->Mode = 0; + else if (CPad::GetPad(0)->Mode < 0) + CPad::GetPad(0)->Mode = 3; + SaveSettings(); + break; +#endif case MENUACTION_RADIO: ChangeRadioStation(changeAmount); break; @@ -5037,14 +5077,14 @@ void CMenuManager::ProcessOnOffMenuOptions() { switch (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action) { -#ifdef LEGACY_MENU_OPTIONS +#if defined(LEGACY_MENU_OPTIONS) || defined(GAMEPAD_MENU) case MENUACTION_CTRLVIBRATION: m_PrefsUseVibration = !m_PrefsUseVibration; - break; - case MENUACTION_CTRLCONFIG: - CPad::GetPad(0)->Mode++; - if (CPad::GetPad(0)->Mode > 3) - CPad::GetPad(0)->Mode = 0; + if (m_PrefsUseVibration) { + CPad::GetPad(0)->StartShake(350, 150); + TimeToStopPadShaking = CTimer::GetTimeInMillisecondsPauseMode() + 500; + } + SaveSettings(); break; #endif case MENUACTION_INVERTPADY: @@ -5510,6 +5550,14 @@ CMenuManager::SwitchMenuOnAndOff() m_bStartUpFrontEndRequested = false; m_bShutDownFrontEndRequested = false; + +#if defined(LEGACY_MENU_OPTIONS) || defined(GAMEPAD_MENU) + // Reset pad shaking. + if (TimeToStopPadShaking && TimeToStopPadShaking < CTimer::GetTimeInMillisecondsPauseMode()) { + CPad::StopPadsShaking(); + TimeToStopPadShaking = 0; + } +#endif } void @@ -5534,6 +5582,13 @@ CMenuManager::UnloadTextures() m_aFrontEndSprites[i].Delete(); CTxdStore::RemoveTxd(frontend2); + +#ifdef GAMEPAD_MENU + // Unload controller txd + int frontend_controller = CTxdStore::FindTxdSlot("frontend_controller"); + if (frontend_controller != -1) + CTxdStore::RemoveTxd(frontend_controller); +#endif } m_bSpritesLoaded = false; @@ -5781,5 +5836,753 @@ uint8 CMenuManager::GetNumberOfMenuOptions() } #endif +#ifdef GAMEPAD_MENU +const char* controllerTypesPaths[] = { + "MODELS/FRONTEND_DS2.TXD", + "MODELS/FRONTEND_DS3.TXD", + "MODELS/FRONTEND_DS4.TXD", + "MODELS/FRONTEND_X360.TXD", + "MODELS/FRONTEND_XONE.TXD", +}; + +void +CMenuManager::PrintController(void) +{ + // Don't print anything if controller texture is missing + if (!m_aFrontEndSprites[MENUSPRITE_CONTROLLER].m_pTexture) return; + + const float scale = 0.9f; + const float CONTROLLER_SIZE_X = 235.2f; + const float CONTROLLER_SIZE_Y = 175.2f; + const float CONTROLLER_POS_X = (DEFAULT_SCREEN_WIDTH - CONTROLLER_SIZE_X) / 2.0f; + const float CONTROLLER_POS_Y = 220.0f; + + float centerX = CONTROLLER_POS_X + CONTROLLER_SIZE_X / 2; + float centerY = CONTROLLER_POS_Y + CONTROLLER_SIZE_Y / 2; + +#define X(f) ((f)*scale + centerX) +#define Y(f) ((f)*scale + centerY) + + m_aFrontEndSprites[MENUSPRITE_CONTROLLER].Draw(MENU_X_LEFT_ALIGNED(X(-CONTROLLER_SIZE_X / 2)), MENU_Y(Y(-CONTROLLER_SIZE_Y / 2)), MENU_X(CONTROLLER_SIZE_X * scale), MENU_Y(CONTROLLER_SIZE_Y * scale), CRGBA(255, 255, 255, FadeIn(255))); + if (m_DisplayControllerOnFoot) { + if ((int)CTimer::GetTimeInMillisecondsPauseMode() & 0x400) + m_aFrontEndSprites[MENUSPRITE_ARROWS1].Draw(MENU_X_LEFT_ALIGNED(X(-CONTROLLER_SIZE_X / 2)), MENU_Y(Y(-CONTROLLER_SIZE_Y / 2)), MENU_X(CONTROLLER_SIZE_X * scale), MENU_Y(CONTROLLER_SIZE_Y * scale), CRGBA(255, 255, 255, FadeIn(255))); + else + m_aFrontEndSprites[MENUSPRITE_ARROWS3].Draw(MENU_X_LEFT_ALIGNED(X(-CONTROLLER_SIZE_X / 2)), MENU_Y(Y(-CONTROLLER_SIZE_Y / 2)), MENU_X(CONTROLLER_SIZE_X * scale), MENU_Y(CONTROLLER_SIZE_Y * scale), CRGBA(255, 255, 255, FadeIn(255))); + } + else { + if ((int)CTimer::GetTimeInMillisecondsPauseMode() & 0x400) + m_aFrontEndSprites[MENUSPRITE_ARROWS2].Draw(MENU_X_LEFT_ALIGNED(X(-CONTROLLER_SIZE_X / 2)), MENU_Y(Y(-CONTROLLER_SIZE_Y / 2)), MENU_X(CONTROLLER_SIZE_X * scale), MENU_Y(CONTROLLER_SIZE_Y * scale), CRGBA(255, 255, 255, FadeIn(255))); + else + m_aFrontEndSprites[MENUSPRITE_ARROWS4].Draw(MENU_X_LEFT_ALIGNED(X(-CONTROLLER_SIZE_X / 2)), MENU_Y(Y(-CONTROLLER_SIZE_Y / 2)), MENU_X(CONTROLLER_SIZE_X * scale), MENU_Y(CONTROLLER_SIZE_Y * scale), CRGBA(255, 255, 255, FadeIn(255))); + } + + CFont::SetFontStyle(FONT_LOCALE(FONT_STANDARD)); + + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.9f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.9f)); // X + + CFont::SetDropColor(CRGBA(0, 0, 0, FadeIn(255))); + CFont::SetDropShadowPosition(0); + CFont::SetColor(CRGBA(0, 0, 0, FadeIn(255))); + CFont::SetWrapx(SCREEN_WIDTH); + + float TEXT_L2_X = 85.0f + CONTROLLER_POS_X - centerX, TEXT_L2_Y = -14.0f + CONTROLLER_POS_Y - centerY; + float TEXT_L1_X = -4.0f + CONTROLLER_POS_X - centerX, TEXT_L1_Y = 27.0f + CONTROLLER_POS_Y - centerY, TEXT_L1_Y_VEH = 3.0f + TEXT_L1_Y; + float TEXT_DPAD_X = -4.0f + CONTROLLER_POS_X - centerX, TEXT_DPAD_Y = 67.0f + CONTROLLER_POS_Y - centerY; + float TEXT_LSTICK_X = -4.0f + CONTROLLER_POS_X - centerX, TEXT_LSTICK_Y = 97.0f + CONTROLLER_POS_Y - centerY; + float TEXT_SELECT_X = 170.0f + CONTROLLER_POS_X - centerX, TEXT_SELECT_Y = 141.0f + CONTROLLER_POS_Y - centerY; + float TEXT_START_X = 130.0f + CONTROLLER_POS_X - centerX, TEXT_START_Y = 128.0f + CONTROLLER_POS_Y - centerY; + float TEXT_R2_X = 164.0f + CONTROLLER_POS_X - centerX, TEXT_R2_Y = -14.0f + CONTROLLER_POS_Y - centerY; + float TEXT_R1_X = 242.0f + CONTROLLER_POS_X - centerX, TEXT_R1_Y = 27.0f + CONTROLLER_POS_Y - centerY; + + float TEXT_SQUARE_X = 147.0f + CONTROLLER_POS_X - centerX, TEXT_SQUARE_Y = 30.0f + CONTROLLER_POS_Y - centerY; + float TEXT_TRIANGLE_X = 242.0f + CONTROLLER_POS_X - centerX, TEXT_TRIANGLE_Y = 55.0f + CONTROLLER_POS_Y - centerY; + float TEXT_CIRCLE_X = 242.0f + CONTROLLER_POS_X - centerX, TEXT_CIRCLE_Y = 67.0f + CONTROLLER_POS_Y - centerY; + float TEXT_CROSS_X = 242.0f + CONTROLLER_POS_X - centerX, TEXT_CROSS_Y = 80.0f + CONTROLLER_POS_Y - centerY; + float TEXT_RSTICK_X = 242.0f + CONTROLLER_POS_X - centerX, TEXT_RSTICK_Y = 97.0f + CONTROLLER_POS_Y - centerY; + float TEXT_R3_X = 242.0f + CONTROLLER_POS_X - centerX, TEXT_R3_Y = 110.0f + CONTROLLER_POS_Y - centerY; + float TEXT_L3_X = 94.0f + CONTROLLER_POS_X - centerX, TEXT_L3_Y = 162.0f + CONTROLLER_POS_Y - centerY; + float TEXT_L2R2_X = 120.0f + CONTROLLER_POS_X - centerX, TEXT_L2R2_Y = -4.0f + CONTROLLER_POS_Y - centerY; + + switch (m_PrefsControllerType) + { + case CONTROLLER_DUALSHOCK4: + TEXT_L1_Y += 7.0f; + TEXT_L1_Y_VEH = TEXT_L1_Y; + TEXT_R1_Y += 7.0f; + TEXT_TRIANGLE_Y -= 1.0f; + TEXT_CIRCLE_Y -= 1.0f; + TEXT_CROSS_Y -= 1.0f; + TEXT_RSTICK_Y -= 4.0f; + TEXT_R3_Y -= 4.0f; + TEXT_DPAD_Y -= 2.0f; + TEXT_LSTICK_Y -= 6.0f; + TEXT_L3_X -= 2.0f; + break; + case CONTROLLER_XBOXONE: + TEXT_L2_X -= 2.0f; + TEXT_R2_X += 2.0f; + TEXT_L1_Y += 15.0f; + TEXT_L1_Y_VEH = TEXT_L1_Y; + TEXT_R1_Y += 15.0f; + TEXT_TRIANGLE_Y += 4.0f; + TEXT_CIRCLE_Y += 4.0f; + TEXT_CROSS_Y += 4.0f; + TEXT_RSTICK_Y += 1.0f; + TEXT_R3_Y += 1.0f; + TEXT_DPAD_Y += 29.0f; + TEXT_LSTICK_Y -= 20.0f; + TEXT_L3_X -= 36.0f; + TEXT_L2R2_Y += 5.0f; + TEXT_SELECT_X += 4.0f; + break; + case CONTROLLER_XBOX360: + TEXT_L2_X += 8.0f; + TEXT_R2_X -= 8.0f; + TEXT_L1_Y += 15.0f; + TEXT_L1_Y_VEH = TEXT_L1_Y; + TEXT_R1_Y += 15.0f; + TEXT_TRIANGLE_Y += 4.0f; + TEXT_CIRCLE_Y += 4.0f; + TEXT_CROSS_Y += 4.0f; + TEXT_RSTICK_Y += 4.0f; + TEXT_R3_Y += 4.0f; + TEXT_DPAD_Y += 30.0f; + TEXT_LSTICK_Y -= 19.0f; + TEXT_L3_X -= 36.0f; + TEXT_L2R2_Y += 5.0f; + TEXT_SELECT_X += 3.0f; + break; + }; + + if (m_DisplayControllerOnFoot) { + switch (CPad::GetPad(0)->Mode) { + case 0: + CFont::SetRightJustifyOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_L2_X -= 45.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)) - SCREEN_SCALE_X(85)); + break; + default: + CFont::SetRightJustifyWrap(0); + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_CWL")); + CFont::SetRightJustifyWrap(0); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y)), TheText.Get("FEC_LOF")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_MOV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_MOV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_CR3")); + CFont::SetRightJustifyOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_GERMAN: + TEXT_SELECT_X += 20.0f; + break; + case LANGUAGE_SPANISH: + TEXT_SELECT_X += 15.0f; + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_CAM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_R2_X += 30.0f; + CFont::SetJustifyOff(); + CFont::SetWrapx(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)) + SCREEN_SCALE_X(120)); + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_CWR")); + CFont::SetJustifyOn(); + CFont::SetWrapx(SCREEN_WIDTH); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_TAR")); + CFont::SetRightJustifyOn(); + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_JUM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_ENV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_ATT")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_RUN")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_FPC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_LB3")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y + 13.0f)), TheText.Get("FEC_R3")); + break; + case 1: + CFont::SetRightJustifyOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_L2_X -= 45.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)) - SCREEN_SCALE_X(85)); + break; + default: + CFont::SetRightJustifyWrap(0); + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_CWL")); + CFont::SetRightJustifyWrap(0); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y)), TheText.Get("FEC_LOF")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_CAM")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_MOV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_CR3")); + switch (m_PrefsLanguage) + { + case LANGUAGE_GERMAN: + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_NA")); + break; + default: + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X - 50)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_NA")); + break; + } + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_R2_X += 30.0f; + CFont::SetJustifyOff(); + CFont::SetWrapx(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)) + SCREEN_SCALE_X(120)); + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_CWR")); + CFont::SetJustifyOn(); + CFont::SetWrapx(SCREEN_WIDTH); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_TAR")); + CFont::SetRightJustifyOn(); + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_JUM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_ENV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_ATT")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_RUN")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_FPC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_LB3")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y + 13.0f)), TheText.Get("FEC_R3")); + break; + case 2: + CFont::SetRightJustifyOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_L2_X -= 45.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)) - SCREEN_SCALE_X(85)); + break; + default: + CFont::SetRightJustifyWrap(0); + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_CWL")); + CFont::SetRightJustifyWrap(0); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y)), TheText.Get("FEC_ENV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_MOV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_MOV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_CR3")); + CFont::SetRightJustifyOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_GERMAN: + TEXT_SELECT_X += 20.0f; + break; + case LANGUAGE_SPANISH: + TEXT_SELECT_X += 15.0f; + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_CAM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_R2_X += 30.0f; + CFont::SetJustifyOff(); + CFont::SetWrapx(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)) + SCREEN_SCALE_X(120)); + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_CWR")); + CFont::SetJustifyOn(); + CFont::SetWrapx(SCREEN_WIDTH); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_TAR")); + CFont::SetRightJustifyOn(); + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_JUM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_LOF")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_RUN")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_ATT")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_FPC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_LB3")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y + 13.0f)), TheText.Get("FEC_R3")); + break; + case 3: + CFont::SetRightJustifyOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_L2_X -= 45.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)) - SCREEN_SCALE_X(85)); + break; + default: + CFont::SetRightJustifyWrap(0); + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_CWL")); + CFont::SetRightJustifyWrap(0); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y)), TheText.Get("FEC_TAR")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_NA")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_MOV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_CR3")); + CFont::SetRightJustifyOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_GERMAN: + TEXT_SELECT_X += 20.0f; + break; + case LANGUAGE_SPANISH: + TEXT_SELECT_X += 15.0f; + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_CAM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + case LANGUAGE_SPANISH: + TEXT_R2_X += 30.0f; + CFont::SetJustifyOff(); + CFont::SetWrapx(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)) + SCREEN_SCALE_X(120)); + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_CWR")); + CFont::SetJustifyOn(); + CFont::SetWrapx(SCREEN_WIDTH); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_TAR")); + CFont::SetRightJustifyOn(); + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_JUM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_LOF")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_RUN")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_ATT")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_FPC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_LB3")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y + 13.0f)), TheText.Get("FEC_R3")); + break; + default: + return; + } + } + else { + CFont::SetCentreOn(); + switch (m_PrefsLanguage) + { + case LANGUAGE_ITALIAN: + if (m_PrefsControllerType != CONTROLLER_XBOX360) + break; + case LANGUAGE_FRENCH: + case LANGUAGE_GERMAN: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + break; + default: + break; + } + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(0.0f)), MENU_Y(Y(TEXT_L2R2_Y)), TheText.Get("FEC_LB")); + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.9f), MENU_Y(SMALLESTTEXT_Y_SCALE* scale * 0.9f)); + switch (CPad::GetPad(0)->Mode) { + case 0: + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_LL")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y_VEH)), TheText.Get("FEC_RSC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_VES")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_VES")); + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L3_X)), MENU_Y(Y(TEXT_L3_Y)), TheText.Get("FEC_HO3")); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SELECT_X -= 5.0f; + break; + case LANGUAGE_GERMAN: + TEXT_SELECT_X += 20.0f; + break; + case LANGUAGE_SPANISH: + TEXT_SELECT_X += 15.0f; + break; + default: + break; + } + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)) - SCREEN_SCALE_X(80)); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_CAM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_LR")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_HAB")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_EXV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_CAW")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_ACC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_TUC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_SM3")); + CFont::SetRightJustifyOn(); + switch (m_PrefsControllerType) + { + case CONTROLLER_XBOXONE: + case CONTROLLER_XBOX360: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SQUARE_X += 3.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(90)); + break; + case LANGUAGE_GERMAN: + case LANGUAGE_SPANISH: + TEXT_SQUARE_X += 18.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(90)); + break; + default: + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + } + break; + default: + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SQUARE_X -= 15.0f; + TEXT_SQUARE_Y += 5.0f; + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + case LANGUAGE_GERMAN: + TEXT_SQUARE_X -= 15.0f; + TEXT_SQUARE_Y += 10.0f; + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE* scale * 0.65f)); + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + case LANGUAGE_SPANISH: + TEXT_SQUARE_X += 15.0f; + case LANGUAGE_ITALIAN: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + default: + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(100)); + break; + } + break; + } + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_BRA")); + break; + case 1: + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_LL")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y_VEH)), TheText.Get("FEC_HOR")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_CAM")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_VES")); + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L3_X)), MENU_Y(Y(TEXT_L3_Y)), TheText.Get("FEC_NA")); + switch (m_PrefsLanguage) + { + case LANGUAGE_GERMAN: + TEXT_SELECT_X += 20.0f; + break; + case LANGUAGE_SPANISH: + TEXT_SELECT_X += 12.0f; + break; + default: + break; + } + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)) - SCREEN_SCALE_X(80)); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_RSC")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_LR")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_HAB")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_EXV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_CAW")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_ACC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_TUC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_SM3")); + CFont::SetRightJustifyOn(); + switch (m_PrefsControllerType) + { + case CONTROLLER_XBOXONE: + case CONTROLLER_XBOX360: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SQUARE_X += 3.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(90)); + break; + case LANGUAGE_GERMAN: + case LANGUAGE_SPANISH: + TEXT_SQUARE_X += 18.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(90)); + break; + default: + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + } + break; + default: + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SQUARE_X -= 15.0f; + TEXT_SQUARE_Y += 5.0f; + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + case LANGUAGE_GERMAN: + TEXT_SQUARE_X -= 15.0f; + TEXT_SQUARE_Y += 10.0f; + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + case LANGUAGE_SPANISH: + TEXT_SQUARE_X += 15.0f; + case LANGUAGE_ITALIAN: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + default: + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(100)); + break; + } + break; + } + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_BRA")); + break; + case 2: + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_LL")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y_VEH)), TheText.Get("FEC_EXV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_VES")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_VES")); + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L3_X)), MENU_Y(Y(TEXT_L3_Y)), TheText.Get("FEC_RS3")); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SELECT_X -= 5.0f; + break; + case LANGUAGE_GERMAN: + TEXT_SELECT_X += 20.0f; + break; + case LANGUAGE_SPANISH: + TEXT_SELECT_X += 15.0f; + break; + default: + break; + } + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)) - SCREEN_SCALE_X(80)); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_CAM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_LR")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_HOR")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_HAB")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_CAW")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_ACC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_TUC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_SM3")); + CFont::SetRightJustifyOn(); + switch (m_PrefsControllerType) + { + case CONTROLLER_XBOXONE: + case CONTROLLER_XBOX360: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SQUARE_X += 3.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(90)); + break; + case LANGUAGE_GERMAN: + case LANGUAGE_SPANISH: + TEXT_SQUARE_X += 18.0f; + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(90)); + break; + default: + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + } + break; + default: + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SQUARE_X -= 15.0f; + TEXT_SQUARE_Y += 5.0f; + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + case LANGUAGE_GERMAN: + TEXT_SQUARE_X -= 15.0f; + TEXT_SQUARE_Y += 10.0f; + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(60)); + break; + case LANGUAGE_SPANISH: + TEXT_SQUARE_X += 15.0f; + case LANGUAGE_ITALIAN: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + default: + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)) - SCREEN_SCALE_X(100)); + break; + } + break; + } + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_BRA")); + break; + case 3: + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L2_X)), MENU_Y(Y(TEXT_L2_Y)), TheText.Get("FEC_LL")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L1_X)), MENU_Y(Y(TEXT_L1_Y_VEH)), TheText.Get("FEC_HAB")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_DPAD_X)), MENU_Y(Y(TEXT_DPAD_Y)), TheText.Get("FEC_TUC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_LSTICK_X)), MENU_Y(Y(TEXT_LSTICK_Y)), TheText.Get("FEC_VES")); + CFont::SetRightJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_L3_X)), MENU_Y(Y(TEXT_L3_Y)), TheText.Get("FEC_HO3")); + switch (m_PrefsLanguage) + { + case LANGUAGE_FRENCH: + TEXT_SELECT_X -= 5.0f; + break; + case LANGUAGE_GERMAN: + TEXT_SELECT_X += 20.0f; + break; + case LANGUAGE_SPANISH: + TEXT_SELECT_X += 15.0f; + break; + default: + break; + } + CFont::SetRightJustifyWrap(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)) - SCREEN_SCALE_X(80)); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_SELECT_X)), MENU_Y(Y(TEXT_SELECT_Y)), TheText.Get("FEC_CAM")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_START_X)), MENU_Y(Y(TEXT_START_Y)), TheText.Get("FEC_PAU")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R2_X)), MENU_Y(Y(TEXT_R2_Y)), TheText.Get("FEC_LR")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R1_X)), MENU_Y(Y(TEXT_R1_Y)), TheText.Get("FEC_CAW")); + CFont::SetJustifyOn(); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_TRIANGLE_X)), MENU_Y(Y(TEXT_TRIANGLE_Y)), TheText.Get("FEC_EXV")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CIRCLE_X)), MENU_Y(Y(TEXT_CIRCLE_Y)), TheText.Get("FEC_RSC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_CROSS_X)), MENU_Y(Y(TEXT_CROSS_Y)), TheText.Get("FEC_NA")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_RSTICK_X)), MENU_Y(Y(TEXT_RSTICK_Y)), TheText.Get("FEC_ACC")); + CFont::PrintString(MENU_X_LEFT_ALIGNED(X(TEXT_R3_X)), MENU_Y(Y(TEXT_R3_Y)), TheText.Get("FEC_BRA")); + CFont::SetRightJustifyOn(); + CFont::SetRightJustifyWrap(0); + switch (m_PrefsControllerType) + { + case CONTROLLER_XBOXONE: + case CONTROLLER_XBOX360: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_SMT")); + break; + default: + switch (m_PrefsLanguage) + { + case LANGUAGE_GERMAN: + TEXT_SQUARE_X += 5.0f; + case LANGUAGE_FRENCH: + case LANGUAGE_ITALIAN: + CFont::SetScale(MENU_X(SMALLESTTEXT_X_SCALE * 2 * scale * 0.65f), MENU_Y(SMALLESTTEXT_Y_SCALE * scale * 0.65f)); + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_SMT")); + break; + default: + CFont::PrintStringFromBottom(MENU_X_LEFT_ALIGNED(X(TEXT_SQUARE_X + 16.0f)), MENU_Y(Y(TEXT_SQUARE_Y)), TheText.Get("FEC_SMT")); + break; + } + break; + } + break; + default: + return; + } + } + + CFont::SetDropShadowPosition(0); // X + +#undef X +#undef Y +} + + +void +CMenuManager::LoadController(int8 type) +{ + switch (type) + { + case CONTROLLER_DUALSHOCK2: + case CONTROLLER_DUALSHOCK3: + case CONTROLLER_DUALSHOCK4: + CFont::LoadButtons("MODELS/PS3BTNS.TXD"); + break; + default: + CFont::LoadButtons("MODELS/X360BTNS.TXD"); + break; + } + + // Unload current textures + for (int i = MENUSPRITE_CONTROLLER; i <= MENUSPRITE_ARROWS4; i++) + m_aFrontEndSprites[i].Delete(); + + // Unload txd + int frontend_controller = CTxdStore::FindTxdSlot("frontend_controller"); + if (frontend_controller != -1) + CTxdStore::RemoveTxd(frontend_controller); + + // Find the new txd to load + bool bTxdMissing = true; + if (controllerTypesPaths[type]) + if (int file = CFileMgr::OpenFile(controllerTypesPaths[type])) { + CFileMgr::CloseFile(file); + bTxdMissing = false; + } + + int txdSlot = -1; + + if (bTxdMissing) + // Not found, fall back to original textures + txdSlot = CTxdStore::FindTxdSlot("frontend2"); + else { + // Found, load txd + txdSlot = frontend_controller; + if (txdSlot == -1) + txdSlot = CTxdStore::AddTxdSlot("frontend_controller"); + CTxdStore::LoadTxd(txdSlot, controllerTypesPaths[type]); + CTxdStore::AddRef(txdSlot); + } + + assert(txdSlot != -1); + // Load new textures + CTxdStore::SetCurrentTxd(txdSlot); + for (int i = MENUSPRITE_CONTROLLER; i <= MENUSPRITE_ARROWS4; i++) { + m_aFrontEndSprites[i].SetTexture(FrontendFilenames[i][0], FrontendFilenames[i][1]); + m_aFrontEndSprites[i].SetAddressing(rwTEXTUREADDRESSBORDER); + } +} +#endif // GAMEPAD_MENU + #undef GetBackJustUp #undef GetBackJustDown diff --git a/src/core/Frontend.h b/src/core/Frontend.h index c1c3983e..6457ce29 100644 --- a/src/core/Frontend.h +++ b/src/core/Frontend.h @@ -137,6 +137,13 @@ enum eMenuSprites MENUSPRITE_DOWNON, MENUSPRITE_UPOFF, MENUSPRITE_UPON, +#ifdef GAMEPAD_MENU + MENUSPRITE_CONTROLLER, + MENUSPRITE_ARROWS1, + MENUSPRITE_ARROWS2, + MENUSPRITE_ARROWS3, + MENUSPRITE_ARROWS4, +#endif NUM_MENU_SPRITES }; @@ -192,8 +199,10 @@ enum eMenuScreen MENUPAGE_MOUSE_CONTROLS = 31, MENUPAGE_PAUSE_MENU = 32, MENUPAGE_NONE = 33, // Then chooses main menu or pause menu -#ifdef LEGACY_MENU_OPTIONS +#if defined(LEGACY_MENU_OPTIONS) || defined(GAMEPAD_MENU) MENUPAGE_CONTROLLER_SETTINGS, +#endif +#ifdef LEGACY_MENU_OPTIONS MENUPAGE_DEBUG_MENU, MENUPAGE_CONTROLLER_PC_OLD1, MENUPAGE_CONTROLLER_PC_OLD2, @@ -275,7 +284,7 @@ enum eMenuAction MENUACTION_DRAWDIST, MENUACTION_MOUSESENS, MENUACTION_MP3VOLUMEBOOST, -#ifdef LEGACY_MENU_OPTIONS +#if defined(LEGACY_MENU_OPTIONS) || defined(GAMEPAD_MENU) MENUACTION_CTRLVIBRATION, MENUACTION_CTRLCONFIG, #endif @@ -668,6 +677,18 @@ public: int8 m_nDisplayMSAALevel; #endif +#ifdef GAMEPAD_MENU + enum + { + CONTROLLER_DUALSHOCK2 = 0, + CONTROLLER_DUALSHOCK3, + CONTROLLER_DUALSHOCK4, + CONTROLLER_XBOX360, + CONTROLLER_XBOXONE, + }; + + int8 m_PrefsControllerType; +#endif enum LANGUAGE { LANGUAGE_AMERICAN, @@ -788,6 +809,10 @@ public: int8 GetPreviousPageOption(); // uint8 GetNumberOfMenuOptions(); +#ifdef GAMEPAD_MENU + void LoadController(int8 type); + void PrintController(void); +#endif }; #ifndef IMPROVED_VIDEOMODE diff --git a/src/core/MenuScreensCustom.cpp b/src/core/MenuScreensCustom.cpp index 770e8ec1..5b2f3d16 100644 --- a/src/core/MenuScreensCustom.cpp +++ b/src/core/MenuScreensCustom.cpp @@ -69,11 +69,17 @@ #endif #ifdef INVERT_LOOK_FOR_PAD - #define INVERT_PAD_SELECTOR MENUACTION_CFO_SELECT, "FEC_ILU", { new CCFOSelect((int8*)&CPad::bInvertLook4Pad, "Controller", "InvertPad", off_on, 2, false) }, 150, 0, MENUALIGN_LEFT, + #define INVERT_PAD_SELECTOR MENUACTION_CFO_SELECT, "FEC_ILU", { new CCFOSelect((int8*)&CPad::bInvertLook4Pad, "Controller", "InvertPad", off_on, 2, false) }, 0, 0, MENUALIGN_LEFT, #else #define INVERT_PAD_SELECTOR #endif +#ifdef GAMEPAD_MENU + #define SELECT_CONTROLLER_TYPE MENUACTION_CFO_SELECT, "FEC_TYP", { new CCFOSelect((int8*)&FrontEndMenuManager.m_PrefsControllerType, "Controller", "Type", controllerTypes, ARRAY_SIZE(controllerTypes), false, ControllerTypeAfterChange) }, 0, 0, MENUALIGN_LEFT, +#else + #define SELECT_CONTROLLER_TYPE +#endif + const char *filterNames[] = { "FEM_NON", "FEM_SIM", "FEM_NRM", "FEM_MOB" }; const char *off_on[] = { "FEM_OFF", "FEM_ON" }; @@ -332,6 +338,14 @@ void DetectJoystickGoBack() { } #endif +#ifdef GAMEPAD_MENU +const char* controllerTypes[] = { "FEC_DS2", "FEC_DS3", "FEC_DS4", "FEC_360", "FEC_ONE" }; +void ControllerTypeAfterChange(int8 before, int8 after) +{ + FrontEndMenuManager.LoadController(after); +} +#endif + CMenuScreenCustom aScreens[] = { // MENUPAGE_STATS = 0 { "FEH_STA", MENUPAGE_NONE, nil, nil, @@ -567,11 +581,13 @@ CMenuScreenCustom aScreens[] = { #else MENUACTION_KEYBOARDCTRLS,"FEC_RED", {nil, SAVESLOT_NONE, MENUPAGE_KEYBOARD_CONTROLS}, 320, 150, MENUALIGN_CENTER, #endif +#ifdef GAMEPAD_MENU + MENUACTION_CHANGEMENU, "FET_AGS", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS}, 0, 0, MENUALIGN_CENTER, +#endif #ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS MENUACTION_CHANGEMENU, "FEC_JOD", {nil, SAVESLOT_NONE, MENUPAGE_DETECT_JOYSTICK}, 0, 0, MENUALIGN_CENTER, #endif MENUACTION_CHANGEMENU, "FEC_MOU", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 0, 0, MENUALIGN_CENTER, - INVERT_PAD_SELECTOR MENUACTION_RESTOREDEF, "FET_DEF", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC}, 320, 0, MENUALIGN_CENTER, MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 0, MENUALIGN_CENTER, }, @@ -611,8 +627,12 @@ CMenuScreenCustom aScreens[] = { { "FEC_MOU", MENUPAGE_CONTROLLER_PC, nil, nil, MENUACTION_MOUSESENS, "FEC_MSH", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 40, 170, MENUALIGN_LEFT, MENUACTION_INVVERT, "FEC_IVV", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 0, 0, MENUALIGN_LEFT, +#ifndef GAMEPAD_MENU + INVERT_PAD_SELECTOR +#endif MENUACTION_MOUSESTEER, "FET_MST", {nil, SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS}, 0, 0, MENUALIGN_LEFT, - MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 260, MENUALIGN_CENTER, + MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 0, MENUALIGN_CENTER, + //MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, 0}, 320, 260, MENUALIGN_CENTER, // original y }, // MENUPAGE_PAUSE_MENU = 32 @@ -629,15 +649,24 @@ CMenuScreenCustom aScreens[] = { // MENUPAGE_NONE = 33 { "", 0, nil, nil, }, - -#ifdef LEGACY_MENU_OPTIONS +#ifdef GAMEPAD_MENU + { "FET_AGS", MENUPAGE_CONTROLLER_PC, new CCustomScreenLayout({40, 78, 25, true}), nil, + MENUACTION_CTRLCONFIG, "FEC_CCF", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, 40, 76, MENUALIGN_LEFT, + MENUACTION_CTRLDISPLAY, "FEC_CDP", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, 0, 0, MENUALIGN_LEFT, + INVERT_PAD_SELECTOR + MENUACTION_CTRLVIBRATION, "FEC_VIB", { nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS }, 0, 0, MENUALIGN_LEFT, + SELECT_CONTROLLER_TYPE + MENUACTION_GOBACK, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE }, 0, 0, MENUALIGN_LEFT, + }, +#elif defined(LEGACY_MENU_OPTIONS) // MENUPAGE_CONTROLLER_SETTINGS = 4 { "FET_CON", MENUPAGE_OPTIONS, nil, nil, MENUACTION_CTRLCONFIG, "FEC_CCF", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS}, 0, 0, 0, MENUACTION_CTRLVIBRATION, "FEC_VIB", {nil, SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS}, 0, 0, 0, MENUACTION_GOBACK, "FEDS_TB", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0, }, - +#endif +#ifdef LEGACY_MENU_OPTIONS // MENUPAGE_DEBUG_MENU = 18 { "FED_DBG", MENUPAGE_NONE, nil, nil, MENUACTION_RELOADIDE, "FED_RID", {nil, SAVESLOT_NONE, MENUPAGE_NONE}, 0, 0, 0, diff --git a/src/core/config.h b/src/core/config.h index cc82f8d6..7adbdd63 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -320,6 +320,9 @@ enum Config { //# define PS2_MENU_USEALLPAGEICONS #else # define MAP_ENHANCEMENTS // Adding waypoint and better mouse support +# ifdef XINPUT +# define GAMEPAD_MENU // Add gamepad menu +# endif # define TRIANGLE_BACK_BUTTON //# define CIRCLE_BACK_BUTTON #define LEGACY_MENU_OPTIONS // i.e. frame sync(vsync) diff --git a/src/render/Font.cpp b/src/render/Font.cpp index 0f5930ee..35ed2e56 100644 --- a/src/render/Font.cpp +++ b/src/render/Font.cpp @@ -289,11 +289,26 @@ CFont::Initialise(void) SetDropShadowPosition(0); CTxdStore::PopCurrentTxd(); +#if !defined(GAMEPAD_MENU) && defined(BUTTON_ICONS) + // loaded in CMenuManager with GAMEPAD_MENU defined + LoadButtons("MODELS/X360BTNS.TXD"); +#endif +} + #ifdef BUTTON_ICONS - if (int file = CFileMgr::OpenFile("MODELS/X360BTNS.TXD")) { +void +CFont::LoadButtons(const char *txdPath) +{ + if (int file = CFileMgr::OpenFile(txdPath)) { CFileMgr::CloseFile(file); - ButtonsSlot = CTxdStore::AddTxdSlot("buttons"); - CTxdStore::LoadTxd(ButtonsSlot, "MODELS/X360BTNS.TXD"); + if (ButtonsSlot == -1) + ButtonsSlot = CTxdStore::AddTxdSlot("buttons"); + else { + for (int i = 0; i < MAX_BUTTON_ICONS; i++) + ButtonSprite[i].Delete(); + CTxdStore::RemoveTxd(ButtonsSlot); + } + CTxdStore::LoadTxd(ButtonsSlot, txdPath); CTxdStore::AddRef(ButtonsSlot); CTxdStore::PushCurrentTxd(); CTxdStore::SetCurrentTxd(ButtonsSlot); @@ -311,12 +326,22 @@ CFont::Initialise(void) ButtonSprite[BUTTON_R1].SetTexture("r1"); ButtonSprite[BUTTON_R2].SetTexture("r2"); ButtonSprite[BUTTON_R3].SetTexture("r3"); + ButtonSprite[BUTTON_RSTICK_UP].SetTexture("thumbryu"); + ButtonSprite[BUTTON_RSTICK_DOWN].SetTexture("thumbryd"); ButtonSprite[BUTTON_RSTICK_LEFT].SetTexture("thumbrxl"); ButtonSprite[BUTTON_RSTICK_RIGHT].SetTexture("thumbrxr"); CTxdStore::PopCurrentTxd(); } -#endif // BUTTON_ICONS + else { + if (ButtonsSlot != -1) { + for (int i = 0; i < MAX_BUTTON_ICONS; i++) + ButtonSprite[i].Delete(); + CTxdStore::RemoveTxdSlot(ButtonsSlot); + ButtonsSlot = -1; + } + } } +#endif // BUTTON_ICONS #ifdef MORE_LANGUAGES void @@ -369,6 +394,7 @@ CFont::Shutdown(void) for (int i = 0; i < MAX_BUTTON_ICONS; i++) ButtonSprite[i].Delete(); CTxdStore::RemoveTxdSlot(ButtonsSlot); + ButtonsSlot = -1; } #endif Sprite[0].Delete(); @@ -1437,6 +1463,8 @@ CFont::ParseToken(wchar* str, CRGBA &color, bool &flash, bool &bold) case 'J': PS2Symbol = BUTTON_R1; break; case 'V': PS2Symbol = BUTTON_R2; break; case 'C': PS2Symbol = BUTTON_R3; break; + case 'H': PS2Symbol = BUTTON_RSTICK_UP; break; + case 'L': PS2Symbol = BUTTON_RSTICK_DOWN; break; case '(': PS2Symbol = BUTTON_RSTICK_LEFT; break; case ')': PS2Symbol = BUTTON_RSTICK_RIGHT; break; #endif @@ -1488,6 +1516,8 @@ CFont::ParseToken(wchar *s, bool japShit) case 'J': PS2Symbol = BUTTON_R1; break; case 'V': PS2Symbol = BUTTON_R2; break; case 'C': PS2Symbol = BUTTON_R3; break; + case 'H': PS2Symbol = BUTTON_RSTICK_UP; break; + case 'L': PS2Symbol = BUTTON_RSTICK_DOWN; break; case '(': PS2Symbol = BUTTON_RSTICK_LEFT; break; case ')': PS2Symbol = BUTTON_RSTICK_RIGHT; break; #endif @@ -1612,6 +1642,8 @@ CFont::ParseToken(wchar *s) case 'J': PS2Symbol = BUTTON_R1; break; case 'V': PS2Symbol = BUTTON_R2; break; case 'C': PS2Symbol = BUTTON_R3; break; + case 'H': PS2Symbol = BUTTON_RSTICK_UP; break; + case 'L': PS2Symbol = BUTTON_RSTICK_DOWN; break; case '(': PS2Symbol = BUTTON_RSTICK_LEFT; break; case ')': PS2Symbol = BUTTON_RSTICK_RIGHT; break; #endif diff --git a/src/render/Font.h b/src/render/Font.h index 57f1814d..b0cd0a27 100644 --- a/src/render/Font.h +++ b/src/render/Font.h @@ -111,6 +111,8 @@ enum BUTTON_R1, BUTTON_R2, BUTTON_R3, + BUTTON_RSTICK_UP, + BUTTON_RSTICK_DOWN, BUTTON_RSTICK_LEFT, BUTTON_RSTICK_RIGHT, MAX_BUTTON_ICONS @@ -137,7 +139,8 @@ public: static int32 ButtonsSlot; static CSprite2d ButtonSprite[MAX_BUTTON_ICONS]; static int PS2Symbol; - + + static void LoadButtons(const char *txdPath); static void DrawButton(float x, float y); #endif // BUTTON_ICONS diff --git a/utils/gxt/american.txt b/utils/gxt/american.txt index a91a3274..9bc1c96d 100644 --- a/utils/gxt/american.txt +++ b/utils/gxt/american.txt @@ -6484,8 +6484,9 @@ Press the ~h~~k~~PED_FIREWEAPON~~w~ button to ~h~fire~w~ the sniper rifle. [PLANE_H] Use the ~h~~k~~VEHICLE_ACCELERATE~~w~ button to accelerate, Left and right to turn. -[PLANE_4] -Use the ~h~~k~~VEHICLE_ACCELERATE~~w~ button to accelerate, Left and right to turn. +[PLANE_4] { reVC update } +{ Use the ~h~~k~~VEHICLE_ACCELERATE~~w~ button to accelerate, Left and right to turn. } +Use the right analog stick to accelerate, pull back on the left analog stick to climb, push forwards to descend. Left and right to turn. [HELP55] Press the ~h~~k~~PED_FIREWEAPON~~w~ button to attack the chef. @@ -13980,8 +13981,9 @@ To ~h~pick up a bomb~w~, simply maneuver the RC helicopter next to it. The RC He [TEX3_37:SERG3] Pushing ~h~back on the analog stick ~w~decreases the rotor speed, causing the helicopter to~h~ descend. -[TEX3_38:SERG3] -Pressing the ~h~~k~~VEHICLE_ACCELERATE~ ~w~button increases the rotor speed, causing the helicopter to ~h~ascend. +[TEX3_38:SERG3] { reVC update } +{ Pressing the ~h~~k~~VEHICLE_ACCELERATE~ ~w~button increases the rotor speed, causing the helicopter to ~h~ascend. } +Pushing ~h~forward on the analog stick ~w~increases the rotor speed, causing the helicopter to ~h~ascend. [TEX3_39:SERG3] ~g~To drop a bomb press the ~h~~k~~VEHICLE_HANDBRAKE~ ~g~button. @@ -14400,6 +14402,27 @@ NONE [FEA_FMN] RADIO OFF +[FEC_DS2] +DUALSHOCK 2 + +[FEC_DS3] +DUALSHOCK 3 + +[FEC_DS4] +DUALSHOCK 4 + +[FEC_360] +XBOX 360 CONTROLLER + +[FEC_ONE] +XBOX ONE CONTROLLER + +[FEC_TYP] +GAMEPAD TYPE + +[FET_AGS] +GAMEPAD SETTINGS + { end of file } [DUMMY] THIS LABEL NEEDS TO BE HERE !!! diff --git a/utils/gxt/french.txt b/utils/gxt/french.txt index a817ff41..a1bd7baa 100644 --- a/utils/gxt/french.txt +++ b/utils/gxt/french.txt @@ -6688,8 +6688,9 @@ Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ ~w~pour ~h~tirer~w~ avec le fusil [PLANE_H] Utilise la touche ~h~~k~~VEHICLE_ACCELERATE~~w~ pour accélérer. Gauche et droite pour tourner. -[PLANE_4] -Utilise la touche ~h~~k~~VEHICLE_ACCELERATE~~w~ pour accélérer. Gauche et droite pour tourner. +[PLANE_4] { reVC update } +{Utilise la touche ~h~~k~~VEHICLE_ACCELERATE~~w~ pour accélérer. Gauche et droite pour tourner.} +Utilise le joystick analogique droit pour accélérer, appuie vers le bas sur le joystick analogique gauche pour monter et vers le haut pour descendre. Gauche et droite pour tourner. [HELP55] Appuie sur la touche ~h~~k~~PED_FIREWEAPON~~w~ pour attaquer le chef. @@ -14262,8 +14263,9 @@ Pour ~h~ramasser une bombe~w~, manoeuvre l'hélico radiocommandé à côté. Il [TEX3_37:SERG3] Pousse le ~h~joystick analogique droit vers le haut ~w~pour vitesse la vitesse du rotor et ainsi faire ~h~ monter l'hélicoptère. -[TEX3_38:SERG3] -Pousse le ~h~~k~~VEHICLE_ACCELERATE~ ~w~pour augmenter la réduire du rotor et ainsi faire ~h~ descendre l'hélicoptère. +[TEX3_38:SERG3] { reVC update } +{Pousse le ~h~~k~~VEHICLE_ACCELERATE~ ~w~pour augmenter la réduire du rotor et ainsi faire ~h~ descendre l'hélicoptère.} +Pousse le ~h~joystick analogique droit vers la bas ~w~pour augmenter la réduire du rotor et ainsi faire ~h~ descendre l'hélicoptère. [TEX3_39:SERG3] ~g~Appuie sur la touche ~h~~k~~VEHICLE_HANDBRAKE~ ~g~pour larguer une bombe. diff --git a/utils/gxt/german.txt b/utils/gxt/german.txt index a2c86414..449e4993 100644 --- a/utils/gxt/german.txt +++ b/utils/gxt/german.txt @@ -6640,8 +6640,9 @@ Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr ~h~abzufeu [PLANE_H] Benutze die ~h~~k~~VEHICLE_ACCELERATE~~w~-Taste, um zu beschleunigen. Links bzw. Rechts für Richtungswechsel. -[PLANE_4] -Benutze die ~h~~k~~VEHICLE_ACCELERATE~~w~-Taste, um zu beschleunigen. Links bzw. Rechts für Richtungswechsel. +[PLANE_4] { reVC update } +{Benutze die ~h~~k~~VEHICLE_ACCELERATE~~w~-Taste, um zu beschleunigen. Links bzw. Rechts für Richtungswechsel.} +Benutze den rechten Analog-Stick, um zu beschleunigen. Ziehe den linken Analog-Stick, um zu steigen oder drücke ihn nach vorn, um zu sinken. Links bzw. Rechts für Richtungswechsel. [HELP55] Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um den Küchenchef anzugreifen. @@ -14262,8 +14263,9 @@ Um ~h~eine Bombe aufzunehmen~w~, steuere den Helikopter direkt über sie. Der He [TEX3_37:SERG3] Zieh den ~h~ Rechten Analog-Stick zurück~w~, um die Rotorgeschwindigkeit zu erhöhen, der Helikopter ~h~ gewinnt dann an Höhe. -[TEX3_38:SERG3] -Drück den ~h~ ~k~~VEHICLE_ACCELERATE~~w~, um die Rotorgeschwindigkeit zu verringern, der Helikopter ~h~ verliert dann an Höhe. +[TEX3_38:SERG3] { reVC update } +{Drück den ~h~ ~k~~VEHICLE_ACCELERATE~~w~, um die Rotorgeschwindigkeit zu verringern, der Helikopter ~h~ verliert dann an Höhe.} +Drück den ~h~ Rechten Analog-Stick nach vorn~w~, um die Rotorgeschwindigkeit zu verringern, der Helikopter ~h~ verliert dann an Höhe. [TEX3_39:SERG3] Um eine Bombe abzuwerfen, drücke die ~h~~k~~VEHICLE_HANDBRAKE~~g~-Taste. diff --git a/utils/gxt/italian.txt b/utils/gxt/italian.txt index 84804cb3..5d8f65f4 100644 --- a/utils/gxt/italian.txt +++ b/utils/gxt/italian.txt @@ -6694,8 +6694,9 @@ Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per ~h~sparare~w~ col fucile di precisi [PLANE_H] Usa il tasto ~h~~k~~VEHICLE_ACCELERATE~~w~ per accelerare e a sinistra e a destra per curvare. -[PLANE_4] -Usa il tasto ~h~~k~~VEHICLE_ACCELERATE~~w~ per accelerare e a sinistra e a destra per curvare. +[PLANE_4] { reVC update } +{Usa il tasto ~h~~k~~VEHICLE_ACCELERATE~~w~ per accelerare e a sinistra e a destra per curvare.} +Usa la levetta analogica destra per accelerare, premi la levetta analogica sinistra in basso per salire, in alto per scendere e a sinistra e a destra per curvare. [HELP55] Premi il tasto ~h~~k~~PED_FIREWEAPON~~w~ per attaccare lo chef. @@ -14271,8 +14272,9 @@ Per raccogliere una bomba, avvicinaci l'elicottero radiocomandato. L'elicottero [TEX3_37:SERG3] Sposta ~h~in basso la levetta analogica destra~w~ per aumentare la velocità del rotore e ~h~far salire~w~ l'elicottero. -[TEX3_38:SERG3] -Sposta ~h~~k~~VEHICLE_ACCELERATE~~w~ per ridurre la velocità del rotore e ~h~far scendere~w~ l'elicottero. +[TEX3_38:SERG3] { reVC update } +{Sposta ~h~~k~~VEHICLE_ACCELERATE~~w~ per ridurre la velocità del rotore e ~h~far scendere~w~ l'elicottero.} +Sposta ~h~in alto la levetta analogica destra~w~ per ridurre la velocità del rotore e ~h~far scendere~w~ l'elicottero. [TEX3_39:SERG3] ~g~Per sganciare una bomba, premi il tasto ~h~~k~~VEHICLE_HANDBRAKE~~g~. diff --git a/utils/gxt/spanish.txt b/utils/gxt/spanish.txt index 836d062a..5deb3f89 100644 --- a/utils/gxt/spanish.txt +++ b/utils/gxt/spanish.txt @@ -6485,8 +6485,9 @@ Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para ~h~disparar~w~ el rifle de francotirador. [PLANE_H] Mueve ~h~~k~~VEHICLE_ACCELERATE~~w~ hacia delante para acelerar y a izquierda o derecha para girar. -[PLANE_4] -Mueve ~h~~k~~VEHICLE_ACCELERATE~~w~ hacia delante para acelerar y a izquierda o derecha para girar. +[PLANE_4] { reVC update } +{Mueve ~h~~k~~VEHICLE_ACCELERATE~~w~ hacia delante para acelerar y a izquierda o derecha para girar.} +Utiliza el joystick analógico derecho para acelerar, tira hacia atrás el joystick analógico izquierdo para ascender, empújalo hacia adelante para descender. Para girar muévelo a izquierda o derecha. [HELP55] Pulsa ~h~~k~~PED_FIREWEAPON~~w~ para atacar al chef. @@ -13952,8 +13953,9 @@ Para ~h~recoger una bomba~w~, simplemente dirige el helicóptero RC hasta ella. [TEX3_37:SERG3] Si empujas ~h~el joystick analógico derecho hacia atrás~w~, aumentarás la velocidad del rotor y así ~h~ascenderá~w~. -[TEX3_38:SERG3] -Pulsa ~h~~k~~VEHICLE_ACCELERATE~~w~ para aumentar la velocidad del rotor y así ~h~ascender~w~. +[TEX3_38:SERG3] { reVC update } +{Pulsa ~h~~k~~VEHICLE_ACCELERATE~~w~ para aumentar la velocidad del rotor y así ~h~ascender~w~.} +Si empujas ~h~el joystick analógico derecho hacia adelante~w~disminuye la velocidad del rotor aumenta haciendo que el helicóptero ~h~descienda. [TEX3_39:SERG3] ~g~Para soltar una bomba pulsa ~h~~k~~VEHICLE_HANDBRAKE~~w~.