From a05e26bf0529ccdf6d94e8b547c537a777cd23ef Mon Sep 17 00:00:00 2001 From: funto66 <funto66@178a84e3-b1eb-0310-8ba1-8eac791a3b58> Date: Fri, 21 Dec 2012 21:04:10 +0000 Subject: [PATCH] Soccer mode - WIP git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/christmas@12296 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- data/gui/mode_soccer.png | Bin 9328 -> 12497 bytes src/modes/soccer_world.cpp | 276 ++--------------------- src/modes/soccer_world.hpp | 34 +-- src/race/race_manager.hpp | 7 + src/states_screens/race_setup_screen.cpp | 15 ++ 5 files changed, 44 insertions(+), 288 deletions(-) diff --git a/data/gui/mode_soccer.png b/data/gui/mode_soccer.png index 8441dcae5e9699a38fc73803871eb7a1ac822833..957338904c71ba03c5c3234e972a3cb21bd5c6ca 100644 GIT binary patch literal 12497 zcmWlfWmH>B6onJq-8DEAcXxM+dvSLuP~0uJThZcP+#TAY#oeX2yS%&~H?!7VN$$+t znSH*q&qS-K$f6<<AprmYRCzfmbx0fZ|Ahbt`5Y86{R3&>%oJs%0G|Mr09h5wpf8X+ zh%Rz^?vP(B{(k`_=ySXwH{m_xm8Id=P;hY=K}IacS^xkDATK4Z>AiC1@0F`5y>PG5 z+F4dcCrj`*F;zSnsul)O0c%JMM@MI|s|wU}Q2)E*r1iKG1VSi(q%@PzG1Woot3`+j zVH8i|VnfM_Rzf2^e|kS6u5>!;5k@J^$o}$C`f`7^+Ik}7d7OKgD*&5oYrT^7wKVVl z=032Y!REs2_n8NUd7&a;0bh&-u$krbvK)Iy4Shy2K<lQ+h=hcMHjEN9c_#1>g!7G1 z?1Pi^S<wjxrXJK#xV?Q56JtjTEYOHV3$zI12kcCGY}J*XMV=D1eq6qjVgjezB_lUO z>xWz(jV^xrq>!3V_OH2>=DknacLh$#1OBZQnzfP~cOPDEo2LWD>^FPNF&@!O<d4}Q z-?k3BMs|*SxR|+;)-`e|cWHv+mV1pBuh+8<`#7=hA|V_s|LG>EqW;AmaP+sukr<%! z9rL}89EQUt8xhdB*Zw#@$E-5kt526S(}zYXFa#ZB@Y1g&@{mCrSlo>>5l~cs(oPYj z=7{0uk3o%{IRtuIbD`;=81C#}OQs6h!$$+Q=9Ci$F+0`XxCPjXX6tpOzfo|V*G1H6 zN~q`I+qyEynMD^=0_;9jQBaUYBSy>J(iC~-@QjU*Lt(0Uc46Vpr`gyzh=uoJX%*_{ z-s%*wPy{{WQFsfMiCxR}(xNUJ1A<^^->~M%e!&Eqq9#9dCWdS7l{Srzy;E&bA{w+f zi0kPwsB6r+yeHnwv|c>PDJkKIs+Q=FMl5cB{P;ohXgZ}*z5eP<QXvqpUV+7(XF234 z2bHqKx`0X>KI8eJj!D8)F8%C;F7UWwqWNL(GP4(}rmr89#wglnZT}wnUD$W0<D^#B z%BnQ3Pd*EsFbV-2F5X9gJvs6F_ekP61p$W(0-&Iy1L=gfb~Jn5KIw}(;3Hh5O^`-r zPD%9eKqL;q{yrW-`!VTJ8KFi}k6<+rs`fE3gNkJ`_Vv}T>v2bDZ*Olag4jtyUq74H zr1;VYn3IrHia2Nf`XUv!w})dWV8=89?!rMuMa{f=EarQCV&`gtJAQ88Qn`6Ag8OR= z4X~FHgNY?hY|tBc;y*N9>29Us<U|IjX=#N&-5eG=u6}KM*m&8#@~-Y5i@QG(n=XTS z_xo%RmM}Uxx|>y&KR8NWHvk#w=LbpX9>&$^7+?_N>PsLoU<R;V0vo?T;r=tM&<B4f zp6-15;36UdZv4A2GBK~yP%@2TQc@BHLJWQjHc0oQ6)yNlC47pM(~4=O#W7N=N@OU+ z*SPQRzGA)WTcB%WFN$hT7$+dA`4_5q+v0+m!;84L$$@`V>`h2iz3JegZifeh$onG| z3=|O1H;678g#X15p>@?UB<u5*_GsJ+hzJ2J_SqnTOgJe!JA&WcYWutI`Do3#sL4h$ zetp0nt1uZF$?J}QbinlaCn{z~%AoH=95R+~kLe7UOQl4HE=9=3U0ysgUxbhf)exM! z?`TVvJE4*BnED`t2mNWh&sy*FDsF0mDV8yU8UYCb;6^fO#dh7P_^Q8GMOJTOC;TWW zDKKay)2%llW9f2XgEL|y80<tHuH83K(^f}Hf0<Q5F66d+{qvxztsOv43V^|Y&g6-X z%*SA0&EsGnnt+Y42a1)CB%~&Uv^no-D!sgs+Bi52A+wGTJGQPzq%rCgR9BDRM>=ly zkm~8_9nF>{h|^oK5d@pSgG)m|?Cikx&WFC&r<>{Cz(8sm8q>MNq%kMCVf3mVX-R|3 zCSd<sZ#<axopY#YvRNCDn0r}>^7~HyiSqBh&7LxMjoh&-RsfhS?bBki*WA|HM9o#d zyYp^Quq3<vg3|3pAn?2YJz;7_2EW7um@r}c<)RlK#ttSlt?x9<ZUHCC=F25B6&3d4 zmk;0ZJV67&z@bD;-PbY7+#6}Uy^E@}bHoSKSviDm)wzcOf2Xa|XhE^BZd9>TnK?M} zq$j-cMHbOwAhvx)xhJSIY!1YQrf0%(Ih{3TJzBY{PcG&Q-d&d&%eo!6+_&fcEZ+m3 z86aI5E!iL<CU!lkX)S1IpcpvPCbx1l;pXPcrv)!U>o?oQ%@nf^6FYa+=8=<=C-jQm za@DGI;CxT03NBc2mXS~9s2_xm*9>M10+~HWMVeB(nNT``)W>=HqL|q3WU>1CVDhFk znSWG}l_KcO-Kv$Mn-wj90ug#}J-yG<dntt3ad|iWs5Sy#nCBK3d41vqeHuwvGKfRr z(OWRV%?b(ky$n-8kYFclJh^CmQ4!_d!GYc3?a>OhHH}xF&V^rum<~F1G{f5<Qwc6y zs*94(MC#=Je&0hoEw!}eC>Ly^KvDC{XE`j~hLQkV0y9(Yk+v6eD6A|f6}SksG;)TE zm#cB|_n5<cU$ouPgxR@=ik8Ft{BXzB7DTF5l^<0reJV!_5)o9Oa#q;{vQX9@U1zAT z7slP}7vB$)UR6k;<^$L)OHvj#m1g?}P$+~j(Xai<7FwuRa2k|=9qJTDKMBZ6Dp<7y zlg@IBdyrDO3x;L;3RLh-*4h{wzTF)kSR#jtulXEu!Gww%gibinbBxLuSL=(VTY6k< zKtF5-w*H9lzH0CpGakmEw+B#J?qMBPCNEF^70g4i3bxZYI)K(Flwwx_)?#L{v+?g7 z@sjBzgsbory=5Tsb^XA|4|t9Sl^i(G(9p=KsL1pNypig^zs?<yz$9(hL-t0aW!-K+ z{KfF~zH@Ow0YFPji-60f-o@B37r&T=B)TrWM%t25w8Xo$NR-eToo%?sY|VEs%6Wc@ zI&2|*bPFziZ2AzS43GF;@FY0@5N^JG*pDRY#{1~9=v-zxQv_SKez@M|N+nT<(c<ug z2ak?dR9UHiGk;d?O$U`g>!+7~H7V%4eZTq<q$=`+fQyTp+u4EI>2)!3xlOh0*4{ML zzU~C>aKYi}YJp30gmM{f7XuSU;Dk0`psx3YoEKKm5;JIUnxhmpTM_p;Izt}~P_u>F zn>O8RR>f#=mr#k-qEniqZqFZn8JXAl;<*xjaW}Gix0qqNH<pADF2U!z1A|5`0<P<Q zM~Xxz*FMk>Sv`}10L#n|MY2he7Y8<4X<Qz1&MjzJsj%1A?o9UG&kifM&1atPZx`Hc zC$$xs-1aOxySx0#7?D}%Lb0p)nK8$%DC%9KYf}=7H~M0lSCz~KNaWztE-_LC>*k9~ zIN+iU@9o~QRYB4=2ImG$8AWOe13i_irLghKAI7C_U;I)f{%$~2!ozkP??zt~CY6Kv z>+y#eC}?0n;&h{%7&1FhnEfYrW_>}(uIKHCNFH@aL|5ERCrpNqln0Y}sJ)vPM<Orx z!sM}d%n?(E*tI@8Lx^jF55PH9x#`9f%E=B)Ybe@F*mv1$pVjk~kWlzdFalu5(g7&I z7xmaKQZW*;YF%Vt%&U~k2PEdH7LB9Yj9vWlC1R#n78#BqNf-evQBzkpivPtgy2hY4 zoaqnWVXhMazgsGvE!X#6`$d*D{|BR`_M6Dei&p2&O_Q0TjO`m57XbAA-bH`$#XBq) zkMcuN<}iTkX${k&AMi0~1y~{u9^@PtfddZ7&73otrK-YE16PkPMWLOBr-70#TYbRs z%&R3^>;QFjEbVIDXw$)n<u<2DKfi?0P?bCZ)2%*a*X{7o>7}J0%RlMcCw09N5UNNw z!9ogW^Sx(M$`?T$9+p<_ID~9-)7jEG*IzW|82DwZ1HXTdhjeC}zPw-bx$SUWgRe9g zci*^ZIj)D=t4eNQ3O`au?V#zMVA%bS5BvH&WIt0e&6yXPiL#Xc860ZZ1p+R5I@dT# zR!Ern`C-ZZE`iSv7tS$D|881#42UUxw5OijeeX}h$%MZZ_4JT2YWoF26i@Q=CUS%4 zNxDYQ1B8vY(F5BEAumgNVBM6NEnwW+A*UI4RWV^8WgnF@MCtIod4mqFl+BR{$NNC} zY7l{4y<dsKE6QDL&gVOyh(5LmAbGHCi~?j|9M&s(T|yh=wc+#9gdi#`3{CETiwTE9 zU{dt8<`+3$5=|4wJAwJ-lV98O@ut}bc(lQ3-Fkx3uNfkExF0v7vrQPSD`Y*prWOIU zOc#3$K06K=P#|{)W;wbv3r6cT2FxLL@2vx2E!^<W!)-y~BL@AQ4M5fPr!cF1r{!yA z$X;4I9Z;2*@Atjvj_mP&k=eV=IbPB0rjy4a^L2<QXv``0znhnVED(<{35x!l_KWNn zjMfTcgyC`v%-J)4W-Cd`ZL}CH<R~Ik>OuRsiXCVnA#9zEsP|vp)7=K>XG_m_6V8v8 zmX@Xy+06ueE(KI0Q}Mr>t#42J6Vub<w+CgpUYzw?&qckjf6;~co@6iLc2C3hrv${| z?nR4*jE!(mDqgVP+kl*}lWg{`{J5yZfgu0lu+dV{Paemm$~oEVTQ8%c8?trA-463U zOrM46s5T$p!w|7m|D?9~J*|50r%4Yq{Nr5<pJTOPM>9dez(7Yb$4Sh_Kvo+}9C8)P zou(iNirHB<NFbIqM$Vrqi)%7rBS<2!jk(mRc}949zWb^5GV}C2HV}t*0Urce$W;9N zPfbBv;rLeOXDjm(1U`nFf5d!Gr1E1;(54Aw1w{qSn}G!~FW#Zhx#Z*0SqNfP(DIpn z!_?axu&^(m4GdP9NO!Ni>plLd-(GA^rM}OnsyQ`Taif;kbsMwRw(b0$g#u6x<iFp7 z?k_gWNIT7L)5bPZKoLOhEc$aG`=BcseFIT2c=w}U42+^#$8nryejQKr>N>z&`UeL; zgG;eYE;(#C7T^4IsiB2XG$~mim%wjklDCDimcVPpJMQ`Uo6u#Suzm=#If@Q?4$6ww zsI6515lGlPR%e-r0mEGe<5md=14Q+@r6w(9;`Rt`8J%VG8*|Z!<VmAuZ?XRF1E*1{ z)R22pv({yE!)G6%#Rv_DBG&n}y$luR>FFtx`-K1OZVM<meXZ6=fCpL^KI9H%;AYh( z4%#KTMZlJVmeRm_@_bw`-_$p@-t6%&Tf=PK_(pu*b)%A#G-dYnFuRI<#AVqsBY)w- z`!J99>aQZQnw}mapzZXP9btbFF<6|^C0OwDrK#Uo3&2G-J8}qx+(pEiPpUeC$$(60 zU`cQ^yY{o1T2QfUg4y{RzRTViCW(Lt20S|1(ADnfXJg~|%F4=e(!`96$Slr$cZ|G2 zTXP~Rpu^6PJOpUpZC}VJx26jvy^jiCFi_xJri9T!_CL|-rYKo9)Bh#O>zUf8fhpq# ztl6Q&RF!GNoivk5%a}L;{V_7Pzs{_QTz~xdq1*L{EA(>ee)+9C9nY5@M@m{6*3Qlj zqIrPc&4kKIySashqS8{hP5)L>$TEvuJb9auZJkYrbm?aDBo4C2zqeepU5(_-RA^YI zrlsw?zg&o`TX8^X#ktUp{(A~8EoXDhf*I!_Ic;eL;?f3Xj<B)EBhe1;fHyG*CT5+n zL{_J#gCMEF?u;yX>{uowI9pg-Qwa*Lx~WY4{w<-P5cA{fbA@=HEG(VscfS=tVrpts zJgFcMp)9BO`Zv~^?}d?zvmJmKvuv#Y^d{%#rx|Sss3es0JMmV*!tea>bY=sj{5(M~ zv{Kc4wEQVA1=5_%%&6mIJBnIo{E;{I`QC;&VqRmpbDPPpll<!x@<o|eley3>y`Rf` z<~OIx!t4>dJ}Iw-=?2NO4Vb}5TzU($h<GKsY($d3BSWS{^6S^wr~zC@)RT0`|E{bM zt)672aGloq3ILOHb3>A-Wb@MPA5NG5Tt6<EW>D&CqW_Ts6laJjPXlN%5}zu2g!_j6 z(Atn18XHHD3Vt;?nvOL)_h57>DJv_kt~MO&iKg{q#~dPq@k^F-Z<0@;&Bp^kKyL6_ zgq7SAwyV>^J)(XF7Tgpv77Yi&Zm7nVT276bo8vm8ip6IgA^-69MS)5{iQsWu**cn` z8hFyqZ%}-T(ZVJWCqR~iLnpJ#M#?F^JDQoj=7l6n6r7nwoXy#Vvacis)s!68&}{O* z!9~Ew{V)1o+arMdpkhY_#<NpMM+=NPzse~p{?r_u5fDiZ8u#&G6QZ}P%vgUIwG-6^ z#vr(~8xn~2_&`fB>o<w1s4%WR7(6$M0sqpQ&{|lB!82fA^S33DQ-0AzEoetS))%9U zGeyB&*hvniYF5#0*zs5T?x&R^qel%IYrHFOQTYq520s29U;vrh?vAS3XajDKJ)MRg z;PZG1`X!rXuo96m6QQ7PoRevA1dBol^A9G%!&4H5O~ra$m;z1~n2**w6MpG?Lcw)@ zt`%`!tYt<c;WH8Z$N^gVS2OTL3ER|6P5e2DVKM69A_hD^kYilE^&I9U3`sh%z*S?2 zzs8ucaE@K(ys{GoQ<oH!HA*r6@R`V-C*VBzTVA}XLSrzoeSAY98DX~G;h7#1SAu!k z6v8gKWPH>>+yIF!V-t=Em{c-(ZsnQux!feSY&5jAlnki_H2*HGh<df*>%T1FHb|jx zstsf(QE-;D4RZfLMn;~g)H;cpZ>7ZKO;TtAh(RdQ6@o2)s3&bAzNcNDH6_g7Zd<(T z7|`PkjAu>lv>$$#RZu_*=?AqqZ$_~8zCwKoc!F(lT($fC6g#Ki;t&nt8d+GQ7(t+A zInVT+62fL|SAhnA{@)f6V>vT75;BOJMf&E&x$BBnqfCnNFC=Eym2+F&f9p2Z)X{+i zmF1+M(*u7xIBPCuQ#kR*k3X!e1D=aUb?g}|8OYtf58@Xa{%oGddF3@Vg9j5i^{(aw z7*9{WR7elWiX(hb3Pq_1WAh!Pecn@Xwz>Y;T!8+*7aLuq)P-XEG9e61JG)BddEPkS z4;PYPrdVcvV83OCQG`~Nw(0Lw26ls^nbOQsaKNq)1R-Vh^#wY<3Xd)*%E`&~O&8*u zjwKcXg08RK{B9;_9X3b;PB(j1%l)~W*1{0(BLm*z9R<zom-}6g`RaZ&Yw1sCJPcO? znM5T43Q$KPO@i+)o6aupPrcEV_fO$SNp`o0m~y3F9uMd1SNE&VyOmY7ZbIaO4Xi~z z2s5aIE^RMWbv!#gFJw`_&XiSEN5_&fOopO9gDAPU=BPviS-+mGgeQo;Bh(nQy5fQD zHes*NRfDU&YcZffR*4)4^Mbh?!9%V{e)?Hu{o$w8Ob$!+#*!Xfi;USAMH7qd?d?lH ztyMJ{jd3h)XU^v&>#<H7%tz}TmenDG_r|`8K7vPnA(=qd&1U--N9g?#`|)vCD_$f& zDJi;5AOi%_z>KD)2`568sC7xA>w{=!m<bz9!sxEtn97_B^}u1aeeM4|b=Zg6M1H3t zcIa`dqorlG(bWzKCbE=7Z8J+MRqm@0Psn^UUck)&8w+dOX-<~$*EB+5RDWLijF=N@ z&^Oo8aYjvM^Sfi!q_i~B=E2;`-7zuHqaWg>w@`U`d6Nm$1eHifeIDZGu`URsZ&p<_ z{N*BWI<;!ru-e?p3NI!`MM_u{;*pFyZvk+h@%;jMm7y<@MLn<z8cOgIgsw3ffBsZm zCQ6|8*gdT4zV~|E{P5?tlAzb#mgNK-j%UT?ICW^zE0FSE;^f%NOA!cpBk(xAa#YGh zCp-jm9|seksTvB0Ed305;<g#E5Brk?gsjUr+dZkO33B-$sj%E!5=fGagO4vu6IvAf z`}cwi)RxbUaUaCnnrU}G)F^7F(z_qA1z`nI%ZJFiF*3FjW=z&iy)g}NQ`1R-IDceE z=3n(x=aFI{Bjkeja-4f$>v}r)DhpJliI+)pgnjW?I*!b4&)3WJ)<#Q-;zl+Jk}cW4 zg#JN^=h>Fxh9YFbD;NqFZSj3zF(?^Df)WH}4i+##Sel-R$peMx#MkA3qI~Lb+=q-x z2Fx{lSWMVmhUE@X-B~-7Wg|`u1hI6KusCf+K)RNHE>KJlzJTQk&qKmbcldO@bM#8c zj`hgqB8R+n{T`mlunn}sp9G5z&kp_e1{s{mQvLSP2(x$GEpc&sf{JkXhtfB=id z*4kRULOzaaT#HiaZb+1RJywlZ0{{`X2Po-Oa{C|wjYRKn67$E{6SPd>HzBenr*$IU zwM*Zwk9W~}^HDS|E-tCK74BhSzkffZj~465JG?Ib$!RPt<2E$LONITM6hMaH7iP1R zkrAl{>%Vl-YQMn7ZU!%|ebtiZv}gQ8)mHl6_it3R${nAee!?3dEs?BYDz*~|%6F@{ zx?)1o(b(&24!_6k-Y|fIv9ZqH{ysxO?a@Yeq>PsAPmLiV7{Z^{q6rWwF7UeOiI=aj zsjXc<Y87B*W+qKb!-YIpSs69NiI7EH#sV0kTVbO0IQ}Y-Nm%PxR{NUA=gL8+gs|3| zR$oK;O<QcMzt8J$ldT4GRTMrhZee*j!pUNwQ%v>#{(hlihD(<SD=Rug@OgofZ<`Q~ zflw#WqS1rz-a$)37QaJnlz9{VCjbe5070-tNNnAH3GDft{*;9xY$sKFu+kE~m~5ut zXk=;=PHINFy<+chUpyg<_6HSwM0HZ9#V;(s`(<nP;RR2VsPIqvO=`h2(ms2IMxBQL zo6u{nqnZ}ht>9nvam+h5qR(fP@!E%HpO#=%;q&>nei2Nzsv;)<0Hq*>3JYe&3TbeE z-j<A^1Rwf41R43h-6E_s*%EUioJtNZ_}=}Goq=yByEe7jhK6A~JCubUdDQZchoU-p zjh8usJ2qa%u9ggjBKVIAVkKpWc6M{MN~wFPABX-(P@%kfUl1As-VWoLoaoy9lB%C% z$$Z+D?NFBlL>s{$?+-bdM*4IiP0&hBH<tVs_KI^6$EhT7^))i3F|~6|^Zn11YH#hO z))r8T(`lo>(-@2Nha0TUiGcNxL{hi&D{26^#dPqwT&5^5Cf<_^lDj}0O$ZA%-Qn1U zaCf-Y4m%DZ6-I=JPKJsD{#Az6VGRJ<<IsYfdzQi2bShG=4Y^fvyVh?3qGaEWfUmla zkW?KLDVzj0*-Y!LA^yF(+95SHRTt`VsiC<1avssx*ZZ6<Rv0#0lX67Dv;2;-!zU>@ zyQpG<chm5I?Py2o?1uE}xGMIuuI^(oumA$bFZcWTjhDqUGc%(2Ea5svMwa}~q95N# zq4Eq5)ce^jniW4&0ZS(k2h?vZUJ_H2D)YMio&*tKpjzxi^cy3L$~3jL%_egXugqH^ z;X>dO&e<GZlr-P#T}pEDXCos=pKhZ_ufY^DXScUAILFfl07nUKQrlaGps-4P`8;ZJ zuGN-Q%yv~mhOvH$*61Vq>PB~GvCO$ytZ!nm*5rYAU=bX^d^2?}Bf24=c$-c(0ZyJo zVNJWXz&K{Qh{XurRsMD$99d0A2cMntkUCb@UsF?aD^16EM0Mu+=7ws7C0p@vMkuTv zuAC!yw=Wn<vy}T7F5kt-DIbH<NwyUM0E#fYK@ltM65E#W$4<;EW`$;DU>JcAiHuqf z4vjvYh;hIZ&D@;k2Q^>`;)9R-peX<12jgj0mh(k>ZTb`E`!ym3^nMY1e?NW@H|i!* zR)uTNk_h@-28ci@zSl`nB$T54+}-l$M8;3i6?WXd?yc^imV5p}2epAl(Rf&O9%AK| z+WyqQ?a`Qb-h2K3Rr}vkkO+T+34FiFcbV7Pz1)su#6*E>=<Na|>-_zSr}02Y-MBnS zK?ES6u&{(qy!=upT{QvI?LW|RCKaY*?1Q-4>g?_SYY@C$)4JiIDRu0@O*s$@4cj7L zsuEpTitxoh@c#6$-u(~_m>T%9`o(21Zn3D#v)eR-jYI1zRc&gWku>QBf)EfJdMZpB z7R;ztu8rcJml8Hk;#&L<5u4T&0&}|cThjd@o*kL97Y{kd`|mhsM>FPVGF~NjF_Tc@ z+M_%Uk0ck}5Apl{^E?X!p4vriyouFJ+jI?Gs!jU+UE5x3_oYon41}`qk)EjT?B4Dv z!Gq7E?r!>~(*^zXEG#2C!>pm~5fCXX(y4QAUT>@(=sNa#Kl#GQZT7FsVWirSE><-U zVRMp7J%JQ5TM%F=ukpv&q>x8{`1hH-L9@EYk>K<sOh%97lM-lTy^>%+PZEql^c`I7 zzf8~k>2rV-pKOhEEMBI_n-io6<goS#i^t;k85!<ZBlz|fg_@2IIc<o*JX17~EC8*h zq=c{X7-G?O&N!7lLk9z_#=VE6-piS*ERn~k)VDb%F8uHkbvffHF)+?;gfIdpE)C5} z3D@PxsGC$_aRBA+t<O}#WatrS-2{@6#?^3T7zi+s+FytXTiD2m3>OcN4d8zhYNw*? z{XRwe9cqA3btYNK{0b+xKAO||ofMM9PTYUT5-62W@Q9W83`?=+#Ac+8nZ4@je8~?x zVAflYmnch3RSbgO|FKX1=~E2W4(yr}I;3Xdm<<=?Vp;-`lP!qn`?RbIETi-@f4Lk? zdmI%_U)@lZ(WbSrh*3vPrL)W&n_)Auw-0TpIDrbwS@@K|8Jf|zr4lD8(dpt}0P*Ie zJ%JMez25Jk=ptd8uLmLd1OVxl2s?L#{0~T-uJh`l_k(%oje4)NKkpP%jz8eUXXleI zyQ9XRsD^?g#!xwKN=<w<TGQs}psI!nn;8LkgH|WkRA>`)II(2IO#T}m3k!?a5*{%R zvcc?Ou=Hbdb2G$bHig9Hr47Z{1^z@9)x})lo!^7ltvF!tSK<momGLx*`9^c4C87xS zQXgoT28kbx%dw9ew)Bu~+`9SBd#uhZ$W~68nlej-jMv3<i6UxMRb4IR?{5U7K+Nug zpgrIWasIm>RAj~b173Vq&VuWlff$02(*YRj|DOdAFpMUnnNxh`aofTcFF3oYKKo|{ z6|u`8cB|U-RzB7iia;I;sz=sHoUK5G_(}M)MW~$*-yY6G;mQ5>=w_jYhlk_wn)y_@ z7e(p*a6oEa41O<XyqFh-(vj&V&>BsB30tc<A>wvs2(u>ws~PZ7^<M!0EVsij`{+n7 zS7czrhPKF(;)8I&123{)wkp1Rt$X&4h9RZ|U;)ahX4@=;@gAmC9wGGtood6UfT0Uj zdF5bh3p^0J|CXNj5x5vy2^MOv)CS<xsl`#tMnkh>VQRz%l}McM(DH`e`Ec%}{+uxn zaWJg6PJd3le-0P*IFf#Zqz&wW@5uB_LM8^aEeuqF8(qtv!!NG96Bk->b$#pF*hYUV zAHJkU!$Rw6cmtB3x{tF8-wApR_+Y%$*4<iq5{LtRpX9r47sDaeeU_nw;<)tEWB;LI zUkEJgE`;D44N2E>nQ3TX(S<JAYP;OJure!$>GJ);a2Z9!s<dm^{T>lY%B-cRLr=rL z=;=iha*~aV#C?(KPB@*c>5C{MGIVBPm8_{6awd=;$s5cxlHrqm8tn4rQ+A{YiX-%* z-I_;l^@{$=LIqRx%2!t}{Qh2M%>?TRA0#)5MkW+xUzZos*!b59zYD?&XU=uQa}{2c z{QSdiGbat^vJf9QQ0+6Oal`EYg%5!f2M8$26tvfXho(e7P#}mFNhMo!QM6K|jMl~5 z6v4=VCQ;Ozm^t{+%14^$nhgi-dqr@uDZL@`{oKaVh)#iT?80_Z3QM9p&L1`N@4cHL z?~}l&MEw0mJn80cx`C5Ti%sF5{Q;T`aKAF|dPrASEvAm(%@jmuzMj7V;n8pk+S&-f z;dPdu{(Qo|zIia2$W|q7$f>ZkmFw;zEpb9TU}-({;4)-m<Oilh{JNcB0&DS@u^r7G zJ5vsGkiNL}p?6p3jU;ugLf@kz9a2h0-fv#Kc&?W7bzg`oWb8otASFHgix#;@IyRj^ zGysZLDKkvFW<`qHqZ+XNwR7gDHET_2Aho*9a^qtCw>vtt(tOPlG<)cOxiA`WbSXla z^o$}R7O5I36()?^C$SirwN`SA00{>o6t`ABrZ+48Mot4WwO(-nN$EY^qmlpZDo93X zkjZoQ6$g*Zh3R%^h#G~Mhs1ouFa`(>msOOa0^{tNul*_i<BNvI?$O3y_*S?{Rj%2W zuA~~LtzxE4b12`zFhJoXDp!L#y+);Sq*iQ40)}k_EJNbnA?e6r2}3XCv>+O%Xl5L^ z3B}{jiIr)px{?MoW}#$cy!T1Xe%nQl@8y05vBT8ew{A%OMbFZG%Yj0~HPqA{oAQZF z<x`?8Ww?SOm2<(ryAi5lFSMmT9O1(dJ#E{+F`l*@>U#yX+tmH$CSqYhE<^ME;M=$z zZ~qcjBAT~|0y=7<-gt(vu-;zu1Xdp?bR&QAZx6@jNEp)S^4SLJ>Ku4X-iR07tt3-I zH>omZ3dv#Op%Gg#j3cHH4~@CXNBS?H3U9uP9V-qV-qL%-<D<7l{wm&SvPS?xmf6$L zKQr~;PX_0gXh~Q+b?sk;U=y8m5s=ZMBSTvJnVhq(=NabXP-zg$iMK{H$R~zSX%@}K z>)A17yKijR2212MTp-hbwH5kcGFQ&t_ImAlwA5femvjb$GovsqLm4=C7>P#On0Lbo z-yG~`+Bnuhbl~=v^xL3S;U~GwmV!kO_iBc1lSX<j+b#x~h`5UAKls~^w)^eh^d))m zjhC+l6#gi<tnZze^K6`+hC8iy>?SL+3^&<&@e}Q<z>>yp)x<+$$>Lw#iSgf3JBfIS zFVxW|FD7fXzg!XtZNEw1tujoMrbR`Eq5NGIALMaMEKJM5wlN!ggX!?Td~Z;_S{ty2 zxW?vYuxGk$YV;-TrVT^HMH%UZQAxcvGot4GNC2CeO59|b7PylXrt4>IsW?~51P6+B zImXaw8~{Nm%E0;Dcq-UTTTn@gp1e&>1=-VW_vcVe+kTRPOF=!zOsP-kA$zK-rbb*{ z-A&1)F;*ewkYXg9bZ1xeL+_9D{hG}@4ZiDQ3&1m$7sqvPuq&dU3KYx~DmG%Yag_QM zRU?{oIZF2JPgZT9ht71E`VO`xUmBhW=*Ks;71prM!}Z9t{A#cs^kqWjCx1vp4lW%t zHMF)}PdfMr{P5+zKSN&BP*PNtjO}T6F<OUGSIAA*Lls%g=IhAl{jN07BK&GYN6^#| zL}(>&zJxq2+qhgb_qEb&XKZnqzSJNNtR%vO{^=L$SZK=Cv6r*Sy3Wbv<y>T9-a6$$ zu9zMgKgT8IDzJe#B8f}F$VeEn*}-|?f}efy#E-MaYMR5Gj2PYd%!hvLq-a;lcGLFa zqJ;KfNL3vc&|DFqxN&haqz=Wh72o}8hg4x<fJ_Vc)*-<PVmjp4Z#0<#7c93^|6*-< zRe5PbrB<S)Htl#?_H|YM43AKHa}Pd<%>ez#*J2|Yu1uWd<$lic`q9S8&F9(oP{Sko z|48!P(KkXB8aETM`TJe`nAaB9N)Dzb(aE8Jrui{dKR+UtghLWZa5p4YJs0`Chs96( zmbu6Gk;gD_|E|sZayVYb&CD!WO@j7sI$PNeCf^JUagTli`a*XC6)EHPF~$^P=4xa# ziaM;A!U!Fe>w;E=uy`Ox|F>y*eltqaag3MqZEArWsI@T{Lpo}YdGnRt4HyNHunK^Z zw#Fo&;s-vR0o2bH)*;1<p0MEc=k0rgQau)??NEV!6Ob8&4V{y*hB#ztUiHg<^gXYC zDQfdXU2@*plIY@hkHIc#pv+dtwpEJl2rRC)6E&jZq+rl&9h5R;sEW`{$rKZLwu$HE zkjWL;J@j)4X$EloWMiN6Nt6_X-m<%pl=R)29f*58ZJC;(V8rKrJ-2dH)KWYQ&!)Z9 zJu-Rs^z_8l4(Na)_6mqgZfSP8i-)HY23Kk8Ys^#aeyX>{^)@-eF?~SCny02xA;yTx zqH2I)cjdK0Eg+;^7!RAoBI1gOa<fe3bOMHnlPAHhN>Qw%CL;oVx$Jvml8{EOYtdaU zC5wjUAyCZcgg6;>_8;Derz3`k!!9-3)6uHrg2%_1Mk7p^stcYw3JZZBuNJU9&*%0y z#U#!Az_!VFWc19GxNRJkQn3EWEoxVZ%VPxfWK??U1Ilc0{S~8Y`1h!2nRa;@8KP+J zI7BXrzc`v^eq+Bdc&Ou`;1~#HD1!Dd=%oq@Ld^7%8mn{3|0X0gBGdk|b2513>|X%5 z5!fmGad8`!8RMpy)6%w2YlhfvpOo?hNFg<<@YORX4h(P|I;lXE=NG?-yce&X$6vej zX8R_#=k<w-!D2qe3-Dm}KHPJ`Qb15U0f?cFW?y)}7Y;1}hE_g^@s$V*`NNBy4IetC zq@LZ@(vVXSF45tii8W)Wl4M?1lGV5pD(2n@#u#fTRAGHz*08Juhea<6(%5zqE4H;- z#2FOQn5jvk@w3!C-+awLm}L1z>}e&B%c4ReF;pgRAkV>6ek?M}Q9^?`E2P+Zm<1*A zm8u(3B8Mokl=!yD=}ITEG|lK|eWUnB6WHUfxI{lE5F$W+dvnyxd~*P#2E!WOKVXQ$ zH2H(r3k%v^(Nt_mzUW~PaF7HVZtvR}_)rdtB7yNRfsx2RjLwneLe6K;yhimVqnApw zhc?~5B9zR{Hh~Evl7yT`!r3Vm$m+Du8W_+4f($+=Gp0~`(Jv+8wn9iQC2G;lZW@@E zo(Fi^B(T<;@Yh(-yNp?Pgj^v-lSD(TJ_3s{j8sX4h>-HT#X=Q3F=qQ9#(q*VSNTuw z2Q67x<`hhAmaAB^|M>LK629s+SngryMr|b%Y+<6>+M!VFW%TbDCGHp=5CIzR_~J~F zKooBY4{FUWZ1}Ky?lRFpmR1-YZJ|930Hm9#6p<dLmByia?x8eoX*D(j`au@WDXB*F zI~Fw>Tr3jvFpcLJDb+vYAzG2TB||S%MPDq45CI7KhMk~1La7UC+nz^Zq@bM2l>T1w zK2xtea<){_RafDQXo7T^2{U0FR8skL>00V7w5MK%1J_0)S9_@mY%TFt?l55Biy6^R zXix^moB(G9)P}uHi4aRB?o4w36svV(1$jdb?>fr=v>FVff!2f5jRG-3X@)Bds4T_g zGyWkG)65A{LZ(KbCQepwdh9rw<OmqFv<jHyv(DyQQ1R4(b=Tp1_Acb~PgPWJ6Q$ng zL%yM|oah52#)_L^$x)(GClCFYWamaE_@<4~J5eXjT=k0rKbP-iotZxClmKAXmVp=_ zb8vElNM!<bQsPe9QD`%6LorPGwH<JM#B2Ur6z51a$v>=RLYNS%cut@*!jA}doTGo- zWvP2X_9xo}$9M4dZ+1p!wrD~EVFafFI4&&50B$)dO<UZi`s<gu>&pmg%pF1=yz?Aq z{qwwWPI|0xo%1&SxG%6)jwBU7WShCzm`#JreEEaMFnEY}0wOus+RS8LCpAl@te^=j z;-L>wDMw(elqoGOfTk|4SBQ=Eahb#J??Tb1t)}?@^aceGXF3;=eJ-;^sA)Gd$7y1f z$X%I1hrzb`68;Hb<gvS#ui=VNt}|jSvuwbqBw0yQ1dbmu(OeBGw9!4E2p3t{SRBE9 zz}Pm=DC$!yC$K+qSDSR9gH_TNWmp^P2}yNP)k?BGhmH~zvUop6cQd%|YBnK_(fL(q zm+SjTbMzfC;p~fAKGwJvlu^J3dI+2emOs@u-*G8+H{0H#BAOYwy}<zs-7!%0CoCvg zLzrNbT|1%*8zcLp;*cr%JsYc<6eg_0Uk<`IcMo#9R)t;3^S6w&V4m&^u#&((9_&np zOqq0JUhHwrcRpKUj;OcFUvZgo*s%!oOa8YuSp~p*T)Y5iF$4GgfSMu0kW{HLWLKLz zcqCU_G@&8n^&KG&2S2G03e!C9LDIuAN{;n90qLmflD5`(zOG?AgM&F*j&cgh(wZ^c zLyR79Ya0+>@12Ya>k-Uobw3X~6;5pESBm#p_xm%vjvh@|7~npP8PVd1tFe%@5SPtl zEny$iZra`=NuT;L)xwJQm)}}yj+_woz?9%Pij}EF|F`%?g?6j}q>mh?9*s=fF-n7& z5Bi_4B0K%`L=JGOV{UU*8CBt{Z`GteN5^YDgWmwqPoe!MKlz@Bw97dLKT(D<_Z_lw z=w_}4nf5a%F-|J|bJmYqb`b=7tyZUNUY+0%i|m}i(2jo{Z^AJ~2!uXBF&<Htvap&Y z+(k8WPmIg7Q6!8rMWD$Za4NJN(KPPNNGHmBv3)@!%XNkac>J0;!!i471<2x?4bX}U z7FqMU+`{du<=Tfi7xpL@OJ8yUyi9p4*Hw0F;Ug%q>l3xO4j3~V&@POOilWx9Lc-PU zCTj~WyV>jmsX+Z&{AKKtz}M4Ex?k5909$~VKd>b4-)z1=BWN0LWNGDbWr#O`{;7}_ zYnNE#<omjC#fr`u|LmyfRC;c%;S1z+@#EC(P}V{DTi~Q)`4ewmVJO620LV+LNYzT1 Gg!~8DPuRBr literal 9328 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 diff --git a/src/modes/soccer_world.cpp b/src/modes/soccer_world.cpp index 036efa252..0041f054f 100644 --- a/src/modes/soccer_world.cpp +++ b/src/modes/soccer_world.cpp @@ -39,14 +39,10 @@ SoccerWorld::SoccerWorld() : WorldWithRank() { WorldStatus::setClockMode(CLOCK_CHRONO); m_use_highscores = false; - m_insert_tire = 0; - - m_tire = irr_driver->getMesh( file_manager->getModelFile("tire.b3d") ); - irr_driver->grabAllTextures(m_tire); } // SoccerWorld //----------------------------------------------------------------------------- -/** Initialises the three strikes battle. It sets up the data structure +/** Initializes the soccer world. It sets up the data structure * to keep track of points etc. for each kart. */ void SoccerWorld::init() @@ -65,9 +61,9 @@ void SoccerWorld::init() for(unsigned int n=0; n<kart_amount; n++) { - // create the struct that ill hold each player's lives + // create the struct that ill hold each player's number of goals SoccerInfo info; - info.m_goals = 3; + info.m_goals = 0; m_kart_info.push_back(info); // no positions in this mode @@ -75,155 +71,19 @@ void SoccerWorld::init() }// next kart - BattleEvent evt; + SoccerEvent evt; evt.m_time = 0.0f; evt.m_kart_info = m_kart_info; - m_battle_events.push_back(evt); + m_soccer_events.push_back(evt); } // SoccerWorld -//----------------------------------------------------------------------------- -/** Destructor. Clears all internal data structures, and removes the tire mesh - * from the mesh cache. - */ -SoccerWorld::~SoccerWorld() -{ - m_tires.clearWithoutDeleting(); - - irr_driver->grabAllTextures(m_tire); - // Remove the mesh from the cache so that the mesh is properly - // freed once all refernces to it (which will happen once all - // karts are being freed, which would have a pointer to this mesh) - irr_driver->removeMeshFromCache(m_tire); -} // ~SoccerWorld - -//----------------------------------------------------------------------------- -/** Adds two tires to each of the kart. The tires are used to represent - * lifes. - * \param kart The pointer to the kart (not used here). - * \param node The scene node of this kart. - */ -void SoccerWorld::kartAdded(AbstractKart* kart, scene::ISceneNode* node) -{ - float coord = -kart->getKartLength()*0.5f; - - scene::IMeshSceneNode* tire_node = irr_driver->addMesh(m_tire, node); - tire_node->setPosition(core::vector3df(-0.16f, 0.3f, coord - 0.25f)); - tire_node->setScale(core::vector3df(0.4f, 0.4f, 0.4f)); - tire_node->setRotation(core::vector3df(90.0f, 0.0f, 0.0f)); - tire_node->setName("tire1"); - - tire_node = irr_driver->addMesh(m_tire, node); - tire_node->setPosition(core::vector3df(0.16f, 0.3f, coord - 0.25f)); - tire_node->setScale(core::vector3df(0.4f, 0.4f, 0.4f)); - tire_node->setRotation(core::vector3df(90.0f, 0.0f, 0.0f)); - tire_node->setName("tire2"); -} // kartAdded - -//----------------------------------------------------------------------------- -/** Called when a kart is hit. - * \param kart_id The world kart id of the kart that was hit. - */ -void SoccerWorld::kartHit(const int kart_id) -{ - assert(kart_id >= 0); - assert(kart_id < (int)m_karts.size()); - - // make kart lose a life - m_kart_info[kart_id].m_goals--; - - // record event - BattleEvent evt; - evt.m_time = getTime(); - evt.m_kart_info = m_kart_info; - m_battle_events.push_back(evt); - - updateKartRanks(); - - // check if kart is 'dead' - if (m_kart_info[kart_id].m_goals < 1) - { - m_karts[kart_id]->finishedRace(WorldStatus::getTime()); - scene::ISceneNode** wheels = m_karts[kart_id]->getKartModel() - ->getWheelNodes(); - if(wheels[0]) wheels[0]->setVisible(false); - if(wheels[1]) wheels[1]->setVisible(false); - if(wheels[2]) wheels[2]->setVisible(false); - if(wheels[3]) wheels[3]->setVisible(false); - eliminateKart(kart_id, /*notify_of_elimination*/ true); - m_insert_tire = 4; - } - - const unsigned int NUM_KARTS = getNumKarts(); - int num_karts_many_lives = 0; - - for (unsigned int n = 0; n < NUM_KARTS; ++n) - { - if (m_kart_info[n].m_goals > 1) num_karts_many_lives++; - } - - // when almost over, use fast music - if (num_karts_many_lives<=1 && !m_faster_music_active) - { - music_manager->switchToFastMusic(); - m_faster_music_active = true; - } - - scene::ISceneNode* kart_node = m_karts[kart_id]->getNode(); - - // FIXME: sorry for this ugly const_cast, irrlicht doesn't seem to allow - // getting a writable list of children, wtf?? - core::list<scene::ISceneNode*>& children = - const_cast<core::list<scene::ISceneNode*>&>(kart_node->getChildren()); - for (core::list<scene::ISceneNode*>::Iterator it = children.begin(); - it != children.end(); it++) - { - scene::ISceneNode* curr = *it; - - if (core::stringc(curr->getName()) == "tire1") - { - curr->setVisible(m_kart_info[kart_id].m_goals >= 3); - } - else if (core::stringc(curr->getName()) == "tire2") - { - curr->setVisible(m_kart_info[kart_id].m_goals >= 2); - } - } - - // schedule a tire to be thrown away (but can't do it in this callback - // because the caller is currently iterating the list of track objects) - m_insert_tire++; - core::vector3df wheel_pos(m_karts[kart_id]->getKartWidth()*0.5f, - 0.0f, 0.0f); - m_tire_position = kart_node->getPosition() + wheel_pos; - m_tire_rotation = 0; - if(m_insert_tire > 1) - { - m_tire_position = kart_node->getPosition(); - m_tire_rotation = m_karts[kart_id]->getHeading(); - } - - for(unsigned int i=0; i<4; i++) - { - m_tire_offsets[i] = m_karts[kart_id]->getKartModel() - ->getWheelGraphicsPosition(i).toIrrVector(); - m_tire_offsets[i].rotateXZBy(-m_tire_rotation / M_PI * 180 + 180); - m_tire_radius[i] = m_karts[kart_id]->getKartModel() - ->getWheelGraphicsRadius(i); - } - - m_tire_dir = m_karts[kart_id]->getKartProperties()->getKartDir(); - if(m_insert_tire == 5 && m_karts[kart_id]->isWheeless()) - m_insert_tire = 0; - -} // kartHit - //----------------------------------------------------------------------------- /** Returns the internal identifier for this race. */ const std::string& SoccerWorld::getIdent() const { - return IDENT_STRIKES; + return IDENT_SOCCER; } // getIdent //----------------------------------------------------------------------------- @@ -235,59 +95,7 @@ void SoccerWorld::update(float dt) WorldWithRank::update(dt); WorldWithRank::updateTrack(dt); - core::vector3df tire_offset; - std::string tire; - float scale = 0.5f; - float radius = 0.5f; - PhysicalObject::bodyTypes tire_model; - - // insert blown away tire(s) now if was requested - while (m_insert_tire > 0) - { - if(m_insert_tire == 1) - { - tire_offset = core::vector3df(0.0f, 0.0f, 0.0f); - tire = file_manager->getModelFile("tire.b3d"); - scale = 0.5f; - radius = 0.5f; - tire_model = PhysicalObject::MP_CYLINDER_Y; - } - else - { - scale = 1.0f; - tire_model = PhysicalObject::MP_CYLINDER_X; - radius = m_tire_radius[m_insert_tire-2]; - tire_offset = m_tire_offsets[m_insert_tire-2]; - if (m_insert_tire == 2) - tire = m_tire_dir+"/wheel-rear-left.b3d"; - else if(m_insert_tire == 3) - tire = m_tire_dir+"/wheel-front-left.b3d"; - else if(m_insert_tire == 4) - tire = m_tire_dir+"/wheel-front-right.b3d"; - else if(m_insert_tire == 5) - tire = m_tire_dir+"/wheel-rear-right.b3d"; - } - - TrackObjectManager* tom = m_track->getTrackObjectManager(); - PhysicalObject* obj = - tom->insertObject(tire, - tire_model, - 15 /* mass */, - radius /* radius */, - core::vector3df(800.0f,0,m_tire_rotation - / M_PI * 180 + 180) , - m_tire_position + tire_offset, - core::vector3df(scale,scale,scale) /* scale */); - - // FIXME: orient the force relative to kart orientation - obj->getBody()->applyCentralForce(btVector3(60.0f, 0.0f, 0.0f)); - - m_insert_tire--; - if(m_insert_tire == 1) - m_insert_tire = 0; - - m_tires.push_back(obj); - } + // TODO } // update //----------------------------------------------------------------------------- @@ -379,46 +187,20 @@ void SoccerWorld::restartRace() for(unsigned int n=0; n<kart_amount; n++) { - m_kart_info[n].m_goals = 3; + m_kart_info[n].m_goals = 0; // no positions in this mode m_karts[n]->setPosition(-1); - - scene::ISceneNode* kart_node = m_karts[n]->getNode(); - - // FIXME: sorry for this ugly const_cast, irrlicht doesn't seem to allow getting a writable list of children, wtf?? - core::list<scene::ISceneNode*>& children = const_cast<core::list<scene::ISceneNode*>&>(kart_node->getChildren()); - for (core::list<scene::ISceneNode*>::Iterator it = children.begin(); it != children.end(); it++) - { - scene::ISceneNode* curr = *it; - - if (core::stringc(curr->getName()) == "tire1") - { - curr->setVisible(true); - } - else if (core::stringc(curr->getName()) == "tire2") - { - curr->setVisible(true); - } - } - }// next kart - // remove old battle events - m_battle_events.clear(); + // remove old soccer events + m_soccer_events.clear(); - // add initial battle event - BattleEvent evt; + // add initial occer event + SoccerEvent evt; evt.m_time = 0.0f; evt.m_kart_info = m_kart_info; - m_battle_events.push_back(evt); - - PhysicalObject *obj; - for_in(obj, m_tires) - { - m_track->getTrackObjectManager()->removeObject(obj); - } - m_tires.clearWithoutDeleting(); + m_soccer_events.push_back(evt); } // restartRace //----------------------------------------------------------------------------- @@ -435,34 +217,14 @@ void SoccerWorld::getKartsDisplayInfo( // reset color rank_info.lap = -1; - switch(m_kart_info[i].m_goals) - { - case 3: - rank_info.r = 0.0; - rank_info.g = 1.0; - rank_info.b = 0.0; - break; - case 2: - rank_info.r = 1.0; - rank_info.g = 0.9f; - rank_info.b = 0.0; - break; - case 1: - rank_info.r = 1.0; - rank_info.g = 0.0; - rank_info.b = 0.0; - break; - case 0: - rank_info.r = 0.5; - rank_info.g = 0.5; - rank_info.b = 0.5; - break; - } + rank_info.r = 0.5; + rank_info.g = 0.5; + rank_info.b = 0.5; - char lives[4]; - sprintf(lives, "%i", m_kart_info[i].m_goals); + char goals[4]; + sprintf(goals, "%i", m_kart_info[i].m_goals); - rank_info.m_text = lives; + rank_info.m_text = goals; } } // getKartsDisplayInfo diff --git a/src/modes/soccer_world.hpp b/src/modes/soccer_world.hpp index 91daa5bd6..9108cf755 100644 --- a/src/modes/soccer_world.hpp +++ b/src/modes/soccer_world.hpp @@ -45,43 +45,19 @@ private: /** This vector contains an 'SoccerInfo' struct for every kart in the race. */ std::vector<SoccerInfo> m_kart_info; - - /** The mesh of the tire which is displayed when a kart loses a life. */ - irr::scene::IMesh* m_tire; - - /** Indicates the number of tires that should be - * inserted into the track. */ - int m_insert_tire; - - /** For tires that are blown away. */ - core::vector3df m_tire_position; - - /** The original locations of the tires of a kart. */ - core::vector3df m_tire_offsets[4]; - - /** The radius of the karts original tires. */ - float m_tire_radius[4]; - - /** The directory of the original kart tires. */ - std::string m_tire_dir; - - /** A rotation to apply to the tires when inserting them. */ - float m_tire_rotation; - - PtrVector<PhysicalObject, REF> m_tires; public: /** Used to show a nice graph when battle is over */ - struct BattleEvent + struct SoccerEvent { float m_time; std::vector<SoccerInfo> m_kart_info; }; - std::vector<BattleEvent> m_battle_events; + std::vector<SoccerEvent> m_soccer_events; SoccerWorld(); - virtual ~SoccerWorld(); + virtual ~SoccerWorld() {} virtual void init(); @@ -92,7 +68,6 @@ public: // overriding World methods virtual void restartRace(); - //virtual void getDefaultCollectibles(int& collectible_type, int& amount); virtual bool useFastMusicNearEnd() const { return false; } virtual void getKartsDisplayInfo( std::vector<RaceGUIBase::KartIconDisplayInfo> *info); @@ -101,10 +76,7 @@ public: virtual const std::string& getIdent() const; - virtual void kartHit(const int kart_id); virtual void update(float dt); - - virtual void kartAdded(AbstractKart* kart, scene::ISceneNode* node); void updateKartRanks(); diff --git a/src/race/race_manager.hpp b/src/race/race_manager.hpp index f6bdea383..c5aa9a397 100644 --- a/src/race/race_manager.hpp +++ b/src/race/race_manager.hpp @@ -42,6 +42,7 @@ static const std::string IDENT_STD ("STANDARD" ); static const std::string IDENT_TTRIAL ("STD_TIMETRIAL" ); static const std::string IDENT_FTL ("FOLLOW_LEADER" ); static const std::string IDENT_STRIKES ("BATTLE_3_STRIKES"); +static const std::string IDENT_SOCCER ("SOCCER" ); static const std::string IDENT_OVERWORLD("OVERWORLD" ); static const std::string IDENT_CUSTSCENE("CUTSCENE" ); @@ -133,6 +134,7 @@ public: case MINOR_MODE_TIME_TRIAL: return IDENT_TTRIAL; case MINOR_MODE_FOLLOW_LEADER: return IDENT_FTL; case MINOR_MODE_3_STRIKES: return IDENT_STRIKES; + case MINOR_MODE_SOCCER: return IDENT_SOCCER; default: assert(false); return IDENT_STD; // stop compiler warning } @@ -150,6 +152,7 @@ public: case MINOR_MODE_TIME_TRIAL: return "/gui/mode_tt.png"; case MINOR_MODE_FOLLOW_LEADER: return "/gui/mode_ftl.png"; case MINOR_MODE_3_STRIKES: return "/gui/mode_3strikes.png"; + case MINOR_MODE_SOCCER: return "/gui/mode_soccer.png"; default: assert(false); return NULL; } } // getIconOf @@ -170,6 +173,8 @@ public: case MINOR_MODE_FOLLOW_LEADER: return _("Follow the Leader"); //I18N: Game mode case MINOR_MODE_3_STRIKES: return _("3 Strikes Battle"); + //I18N: Game mode + case MINOR_MODE_SOCCER: return _("Soccer"); default: assert(false); return NULL; } } @@ -183,6 +188,7 @@ public: case MINOR_MODE_TIME_TRIAL: return true; case MINOR_MODE_FOLLOW_LEADER: return true; case MINOR_MODE_3_STRIKES: return false; + case MINOR_MODE_SOCCER: return false; default: assert(false); return NULL; } } @@ -200,6 +206,7 @@ public: else if (name==IDENT_TTRIAL ) return MINOR_MODE_TIME_TRIAL; else if (name==IDENT_FTL ) return MINOR_MODE_FOLLOW_LEADER; else if (name==IDENT_STRIKES) return MINOR_MODE_3_STRIKES; + else if (name==IDENT_SOCCER) return MINOR_MODE_SOCCER; assert(0); return MINOR_MODE_NONE; diff --git a/src/states_screens/race_setup_screen.cpp b/src/states_screens/race_setup_screen.cpp index 970dd4895..091cd41a8 100644 --- a/src/states_screens/race_setup_screen.cpp +++ b/src/states_screens/race_setup_screen.cpp @@ -33,6 +33,7 @@ const int CONFIG_CODE_NORMAL = 0; const int CONFIG_CODE_TIMETRIAL = 1; const int CONFIG_CODE_FTL = 2; const int CONFIG_CODE_3STRIKES = 3; +const int CONFIG_CODE_SOCCER = 4; using namespace GUIEngine; DEFINE_SCREEN_SINGLETON( RaceSetupScreen ); @@ -127,6 +128,13 @@ void RaceSetupScreen::eventCallback(Widget* widget, const std::string& name, con race_manager->setNumKarts( race_manager->getNumLocalPlayers() ); // no AI karts; StateManager::get()->pushScreen( ArenasScreen::getInstance() ); } + else if (selectedMode == IDENT_SOCCER) + { + race_manager->setMinorMode(RaceManager::MINOR_MODE_SOCCER); + UserConfigParams::m_game_mode = CONFIG_CODE_SOCCER; + race_manager->setNumKarts( race_manager->getNumLocalPlayers() ); // no AI karts; + StateManager::get()->pushScreen( ArenasScreen::getInstance() ); + } else if (selectedMode == "locked") { unlock_manager->playLockSound(); @@ -229,6 +237,10 @@ void RaceSetupScreen::init() w2->addItem( name4, IDENT_STRIKES, RaceManager::getIconOf(RaceManager::MINOR_MODE_3_STRIKES)); } + irr::core::stringw name5 = irr::core::stringw( + RaceManager::getNameOf(RaceManager::MINOR_MODE_SOCCER)) + L"\n"; + name5 += _("Push the ball to the opposite cage to score goals. (Only in multiplayer games)"); + w2->addItem( name5, IDENT_SOCCER, RaceManager::getIconOf(RaceManager::MINOR_MODE_SOCCER)); w2->updateItemDisplay(); @@ -247,6 +259,9 @@ void RaceSetupScreen::init() case CONFIG_CODE_3STRIKES : w2->setSelection(IDENT_STRIKES, PLAYER_ID_GAME_MASTER, true); break; + case CONFIG_CODE_SOCCER : + w2->setSelection(IDENT_SOCCER, PLAYER_ID_GAME_MASTER, true); + break; } m_mode_listener = new GameModeRibbonListener(this);