From 8063e25f3b5eab88514d11f8d9d224411a592b3b Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 13:13:44 +1300 Subject: [PATCH 01/14] Add a new RA AttackMove cursor by @pizzaoverhead. --- mods/ra/bits/attackmove.shp | Bin 0 -> 5958 bytes mods/ra/cursors.yaml | 16 +++++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 mods/ra/bits/attackmove.shp diff --git a/mods/ra/bits/attackmove.shp b/mods/ra/bits/attackmove.shp new file mode 100644 index 0000000000000000000000000000000000000000..f8a2f0be84345bad4eb9061f3dc905a452794508 GIT binary patch literal 5958 zcmeHKOKux63?)#Y2vFHVfdb8{7wNvo=)Sk`*szTxRxXf3^ayi@9wL~I3=l=<(C%zr+~{Cg?$;j_%YzR3LJ zD~GX1YZ5^BOrvv|O2n`Y0B)e+5T%t4^beb6muYs*CR>G#_p}yg09-B;ylqt z0nm8AzBfGVHjRJKtpI$pU4)cg2#1H3V9E=p5W-_Z&5c6aA_`VyUO#pq8a@xe5i>Vj zqn3xDV!-|=R$#K9MB5^q5=JQtjrk>rb7@JTX&+&1K)sEEO|f6J&g-XcQ}1KLxZCEl z#iMELWbCBWpU#I|lSi$h#(wq}`jud^ zpG2A57%g)iG1ze?iee~KW@n_QRdFT__5 zf%TdPy719_jEXacZYjQTYUIX_G7++evSoC*iSrqs)G1SmC?WLbK7o7N6QvVWoS9sLsX|sM zVU$G0d7zje*32Sz>=y+nl3N-!kKFN`-yONRTd#cN&3UCOn_t}jj<>lps*RG|`<4N} zFXPU29p0=*gt8Fb;M&11VN$OMXC@SUsHFFR|f@x1q#k^{=R{%4ZA@A^8qd*@n*cx6nJoBa9-a`VpR$X9Y(U#{c^sN7;N z-`xB$g|}pJ;J0b(^n>Emf{>Tc>dQ_4{wv$UmE6|sE4j}g_x0vB9u Date: Sat, 8 Mar 2014 13:58:21 +1300 Subject: [PATCH 02/14] Add a new TD AttackMove cursor. --- mods/cnc/bits/attackmove.shp | Bin 2329 -> 0 bytes mods/cnc/bits/mouse4.shp | Bin 2747 -> 20037 bytes mods/cnc/cursors.yaml | 15 +++++++-------- 3 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 mods/cnc/bits/attackmove.shp diff --git a/mods/cnc/bits/attackmove.shp b/mods/cnc/bits/attackmove.shp deleted file mode 100644 index ebd994ada765e899482933d26a74743fe4fcb76d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2329 zcmd6p&u<%55XWbdc;mFScS{Iq+GM?LR8fS8){r!nj9WXn9C}K{1y!nWM8zowSAc|f z?R9qTx*YgXA;AG5#DxPK2oirmx{kE|5n8EWce7C?q*9@R5aI~cEAzZoutOb$L=ish z?DM{vH=p-?GrM8nKN$|R?K=P~{N_CRc4ol0zjdrL=#SqY^6e`D-_8lXg<;>`>Db4E z{`f-2e$ufwI(A~Dz3lddr2xzd8v-Z^t}E~x^C}YotTj=IFae-wi)$=I&%>f_R_>MO&8N~av*D#t5+zL^D#ioYJ^yrV%U}Rvb9#JegW(xfbw~B8claYMN@#$ z+s~sHMRtm&U9~TUt#Wx|6O)&dXROeA^%}H8%lMiliq)|J)2S7pv@VL5cq*ooiAl2a zGOz#*8r9R#r~^ArTiLb zs1L$P5Kg9bjBu(+jwAk%Lhl)5@gAIBX(T!NBbTU;HnkM+wEi(m^#b%TK)g)`FLs?U zMNW57NXvvJmCW`bOA^ToH=abA4W^qJC796N=g^x)_G}N#4sAe=_SL4oFz|2D>?jpQ z_GRm$*)A6ixSv!1rsjF_5KJ9nV9v;k& zx`$<7xQ;MSv~ik4`1K6(<88X?IN^-^oJ8+9dIykA?xs(=ZzK56fVP$4ZKK^Pso%gn ziKGm(M>&zA!0;~#^ycx_IDX4^X$Ai$oMRoF)&Qmh9HiueAVA>PQ|O&Q?;x^+4?&qw z^8`qeX**}3wgieqN169y2vsuxQ?S3d8Z@Yg3uaCY*RH_3wie9ibuFvu`9jXN8)u=E zUCjp*dy2V2j=!#8%F>O**tOemNi+29s`ES4?}DZ0rNrW_snr8$Wew@|bflQojamw= zysjE*q;Uk5bD4;x6_lqkUnSmCM;g-z@x@mmV&>`}p&C&~i`l%f(Ly})R#wXydM;lu zf|_2hLiCMdR?B0_(z4e-gPSX`^%86?0594Vc8_+l0)h(x_84uTE%KgZi8h<%XNA95 zO@Tj2j3yX|ly^Up@}G~T{NocTf4MK^_n%4m_2*LF|AMF2eYD-) zemkPSsi8d@k4IFV(?_tKO-NkRX3TnW7Kz(ClgXM|My$J@Ozs5olLGpJ zX40~lj|Sbxx9J#etLycqJKEXigbi>)lw^^cKkWyiExT+h_i_4|fY%?_L4~@F>aika z{YX4YEvduNQY%S6ZDYffkMp(n$O(Mu?T5lST)1|IV*mDqt3Zf)Al*<6;!eN*ouuf` zfvhhklkY;iAm))}auUxV8k4i9GGW{>G`^Q57BD7Zbzo&O@76S^aKjR~cspNJE>Ber`aL*HWJ++QxQ z0B(+j4mZa_gWFP|!EGr};C3?$Cww#Dww7sdckE~3mPzYyv%gii+1*!~xqY5?a7S#% z{HE|mQs^gaQ$rBGgzc2&_Q}{ra^4|xJ9p+YH(RH|ErHbFmOvT}ZVSoN26xAP7H;vF z3b(jSg_~og!_C2>AzWtIskAg(xD&P`etYnS(zefbM0bzvgzokU%@(-DBkE-d`vUIF z!Y#2-;U-7cMuXeBc7Pj>=&rfhDJtCJZw+p7w+=T)nnRMKnnIP`glB=f$9BMPhV4Mw zX2o6Z&afTPUALNb8Ix!l0yj_UOoO{~XBKX8rwX_DYJi*k(A`jqQvhi8nwzC6+?{Ur znpQ)hhZr~fPlZ49j#n1nKwIUSbbh9g0aVu&Jw@gaS+@dtVZJoQrYKe98 z&4XJE)8JMqAvMs4%$?2KBnH1K+fJ%oR?ygmp=-7aUm8m07JSKwWRuGhZXDoFeABBc z&h7Qn8jh~NL6$Qc#k}=|1e3KQMsvabv1pC*%C@<+z4D#3R&Q7S_!~1GsgsHZ&Fe>9 zij`yQA7Cl4IRB#X*v@I0>jKB+?>B$I4SLD0ynb;~Q9SbcQI}%n z*!lz9h45^J8@dI!N5#wwx>dGWG*;kbgMqKMZO`1$)Xvyw&||}S+2apzN8yYsmxQ|n zCk|BL6Hb8{YYH#TwQ0BbvPRNA>2qmZ42e;{`KEbav;@pZke3+ z5XT~!HQOI_y{F&*DcV284Uw}ZQD zA?=9YgzZ>L`VreyjZBHy?vV`rsP{J8uK;e2g}%J%V?VpjEtA&aW`C=2v%{_yZV)IFa&Wu4on}OL0&he&^n2on?u6}>pN_~jaxibs5xKo8& zjyb?hemKCpB@!zYZV48BW>`QL&44Q%Ng(f*WV_falPtU)-BlajYI*}K-C4GUZhK0) z%ObBTd)jmuZtD>(bBjl`%q`;&aEl*q_`4+%X$@`(bc&AD!E}Yp+g*Pry@+o71?wbX z2WG#jTSZK&tRCug`#2GaUi>L=%cQ#geuv?fNvWAzdJk}0=RUpfmZ+2v0iX}pyxF`> zV(_c7?WF3vB^bLfbj^0*t3!cX@FgRX?Fv>)c*JKYb0;2rf~pdnokzH|{>D^|`Y_Kw zEYS=q9KR8rDz9prTiYw&No)0X<&VEHO{GpM8Z@sTbtzVkt$%=}z~cOi!ecvU>k~?# zUwHhkWlo-RL!S!UR?zG>f4~iThj&Yi8Q?CQUR&XYZUOG9n0Z0B$~KFd(#ZjQwQYOm zhUV~Y$$pu`JNOr;oyj}U@7bg{sl-G~C6f4Kp zKS1Wb-W$r(YSmy{WFO+ps^xM%o6hFTX3=~6K0RI9^fz5J3*2Refr4B&M;cS=46@_jWxx zn`Ebrb)hwP2ZiyASeFK!+otJq)y$LC7W{6>bhcQ{7t3Z<&E~m>IMdk@k(f=Np&QC5 z^PRgm*b+;Dz6FopeFb~G&h1<1A&#%vCzLVVp%_2PlfWHFu~H^*KYUmdKnc8nN8o1W z`|@pYW6ToV^+Oz;kBOZg+>koBA&vpXi6bVFdR<=!-0;Y5a0l*0Xz;T;G2G!d5B(^Q z;U!ASA@rj>fwD39Q668%6G~g@GXG;QHRg6$DefO2a~F?a6n2v<_R@uy)-Qg8UG+c+t;s zPS*~iIEH}>L%dcKGcSx9(2Mnyq#xT@Hnth`!V8EZqERAOoxQXN!E^_W_!uenO~b$9vu+EVTJlJ#WY^1A`njUamz)}FVHd#0fBVJ9j zc?S=U*qY|eod7fKsGx;9;1yBL^iUwl(pke#qX2@|RK5OmKV7o3{e#KLY?}9od5v?^ z_rPfZ;GZtGprx{@HcTo^y>$>x<=W4XJC3t1yzN3OW1sL^>2&d1G&9)QJlfT3)nCos zN6>Tb8a!!fT5fZV#d5k2^yW;8UDdQyVG7Kg5j1X?SMl@0eYDsV4?fp!vO*F1f9!6* zbp=l?Gt*|wO#UDUcu6Z2fZAjQE;I-UbiY*r%scd;nW;wZlel$NxH~28TLSkf0R8Mz ztH3QBkhnkf5N=VW4YI-z&baWG3gT}hal@z-k}Xpk{^oQQ_MvnYbeppZ9SZVVLZ0~w zZ>~?A>w#+4vH;coLWhvRf+}L}PlBQtf*N)T-|ehEs0T+t`0Nqj{NfuGv-jw7-8fv3ik_!=FJ z`sq67`_Zni)gbo~wXn7LXG*~!!>MO5ryhVjX53}Coy|n7DD!TFZP3K`&iO>-`4%C- z?;#SvI7U7{sMiVjE35|4* z-~~uU64CGk1dLr)Y*+}93`gT|#GL5cV@8TDOobC3HU=@?2z6F8QRqP{9tD4>6a2*% z)Q|FUJ&LBXmX&n6cs|Gy<>*y{T|KK|eSQ*!x~M5=%s5@!^Cg z5^d<69;XE(aU8KC;n`0BGbU?zNq0AA^3yOg0CXQwXk9Mb%uz&#-d`cv_CV!6>( Date: Sat, 8 Mar 2014 14:18:50 +1300 Subject: [PATCH 03/14] Add a new TD guard cursor. --- mods/cnc/bits/mouse5.shp | Bin 0 -> 11886 bytes mods/cnc/cursors.yaml | 14 ++++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 mods/cnc/bits/mouse5.shp diff --git a/mods/cnc/bits/mouse5.shp b/mods/cnc/bits/mouse5.shp new file mode 100644 index 0000000000000000000000000000000000000000..51aa0f77c1449568c3c462c897ca59db8f9a2db8 GIT binary patch literal 11886 zcmeI1zl!8W5XJ>Y21AeJGY2+?Gsa*r99(v}ALH`N?**J}G=C|9e@5($G2bW_~Q#5Uwo_MKi}#2*Y`U9@q>=PywvgCD{&)!tnuvH z$*70R=SBTR#7iL#lP8Losg|z8Jh^#>e3|CiO>@xj<7u8I=iGwdX_`-k)ScGZ`99#EGKi14`L@C+xfNw}KS_xvJ$mGUn2>gm#On|H&p&Y9a5++iw5 z54Skqgd5Rr!yPhZ!%ZneS2CzRh%k#(_HYTi4b^lL>G^*HcWSXdH@2md6mB1rR^^s} zb}Bd7@4!u1%F4~!%?!kc(`Aqd-N`oKLBD$7w- z?H6u`$}QeW5CI|KnG3ES6 z@C{{;`)Vrh09TgPZCRS8(UxQnj)zsMTL4{JZAr+K4R^@%0XMM;JvU<3 z>$y>Lnw6Wm;;XO$x1KH-4P-oP}6kAyCB&0nQbc{iV{2_!lpnY#RsMJtnWqBstfo zeXwwctrdvHis<)m!i~D`>t;c(ze{$Ta0kN;xP$nBJ4B)$?{0*%*7SECNgrj(7dgvP ztYWp0_Rrh6ojowsjO~IVciC+5=2m%qJ3~IY^Tlgj&Q2@vzWO+BQdeo;ZI$ooZqjpI zfXaTUbug5>ma(0n4Hv}!-7PtD*z+)8&%sD8cN#Ah8u{x)8w)W}Nia%%zEK)>b1(c= zsc%l|+kRri)Sk40#Xku@5)15pYSD9uv5ebowd2X`ubkd}PXzfQ*G) z8CR>R+_k)WD{!Y)^_+0ao?CEByqa)#qK)+#t%Tm2@>jbU?>toh!-qSDqCR18y4lz+ z5O*s#T3ZwDVPpYhA}=-Dv`ReGzJii@2di>7jG2(iB6afDl3a!>vCO-sW$~7)6Yffv zZxX*}!!1l_We)bWEy~vrdTrHwBCjm_^{n=thw6XyaG$ri*OnlY_k&yNr@(E!7q%U4 ztM1Pc?!4jFJVQCaZ7C;}+o0^BaBIADVFRuM?(i%c!3m<9#>ddV0ymP?gIlVYMc6>Z z@P2m#dhU8N8~bqdyu)bLef~EOwD4iVE$d?S)l`OMt~)r>GF9kxr*i9_4X?2e^xP~4 z2i$c|i#v}2XR+jaUDE!;;6{=gZHd%R5^5qQ-`C{t)Fz)m8vGGK8*Uh7KZGxo27-Od zVvlgP+Y&l04jREc;5LF{-umd_=C1DvH)<~*jRxHMQs}@L7Hqg;g;{J9k`p8qrC&}KHUET*0&CL literal 0 HcmV?d00001 diff --git a/mods/cnc/cursors.yaml b/mods/cnc/cursors.yaml index 3045f71eca..1dc346888a 100644 --- a/mods/cnc/cursors.yaml +++ b/mods/cnc/cursors.yaml @@ -78,12 +78,6 @@ Cursors: c4-minimap: start:127 length:3 - guard: - start:153 - length:1 - guard-minimap: - start:152 - length:1 # Cursors that need minimap variants deploy: @@ -137,6 +131,14 @@ Cursors: start:25 length:1 + mouse5.shp: cursor + guard: + start:0 + length:8 + guard-minimap: + start:8 + length:8 + mouse3.shp: cursor2 enter-blocked: start:212 From cf75240c7e08fa5e17b06bf1a9e1343b4d36811b Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 15:07:09 +1300 Subject: [PATCH 04/14] Add new TD goldwrench / capture cursors. --- mods/cnc/bits/mouse6.shp | Bin 0 -> 13368 bytes mods/cnc/cursors.yaml | 40 ++++++++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 mods/cnc/bits/mouse6.shp diff --git a/mods/cnc/bits/mouse6.shp b/mods/cnc/bits/mouse6.shp new file mode 100644 index 0000000000000000000000000000000000000000..5bb572a861b79a8088fcce4b2a391c1dcc4b3d48 GIT binary patch literal 13368 zcmeI1y^h>A5XS|qvsed*00|5@2#_F15FmhI0|8w41>C3i3#3maiK2vSQ*WB9@&ex4 zm6|+;`#gp{ADWd!&T#3~-pM(fild|-|0L&&y5oIQ;PpfCEwyipqQjfNHr)QP<@WVs zZhyMs_QO})zWxs$N!YtV}SkES{gaxo*T080pC>SXky2=`(fG?M7~tw#yw{Tr#r^ z1{A&UPMHK=nI0STfy=@{Y>&zOp(5)UN~#}fR;{dziUqwY#rbn8cG3D_4n;4a2tzfv zL~uvXvEB?7>w`!|dOK9Z{PQN#&+*Bphvc?g1cADTJGYdiQFem4CgbE{o?Eez-u}p{ zQHbEbS+r)ZeL!2Q#Pu=DK`)Uul2<0jTmztKT=;9c-)`q&{n&wiYl z$JX^ZGxJh({dAe>`?dA=J-Nq7t8qvNx-TflROP9cSXF(Za?)kRRdrr+j3(>)w9QkK zb^R&JN4~cHA-TIT7~$QL2EXjBQH3H z>>TDXWv3o?zJ<$aF7B&c)6`X2)s51jJTyC2l`g^nYu^u}#=P=%dGL;n0z8|&teawA z9$JTgkixpF`RJvGX^GRuUek+V`*`7+=z(wgU|~gB4@*Jr z=33AJuF0gb@d(4@EGy@0*R+0D&8C(4%c_A$RHZzJdW@tMN6bnKQ6 z{yFHWG;EIowqakm);l$h=r-TN59hB`7eWqTa_?QOa$oGdgPEO5w-9Ma)4tfM*kOYE zw$a5`TP!*c(C~lLZoO#~%zSi+p;ztIUaqabNOJFR@1$$k3I|KYIN@`8bO&Pv4tnGY z75&bHGQafvq_%dhcYLXt0Guur76oF^8T5d&PbelS+i%c_l)3Fei>dgkW35l>*G zC#&+K5b5)!)bl3Mzsnt5Tr#r^1{S^WiQUs_O^*%wz-3b@-rF9N`9nq4Gn7=%6{{Cd zM#X~OEXtgUU9^5MQqfB&!cYw^5zLW_^=7D8A4DqB+o4iJ66w`m_RELlwtNGDx`#Wr zl%!F1g1IK+5oj;YF1FR`ln zMCGK*imU3plbF)#wQ8XMEH^q+5xq-vFE9IPNriO%1-H%EtD!v9%;HaabxKe=;% E1Wd?DL;wH) literal 0 HcmV?d00001 diff --git a/mods/cnc/cursors.yaml b/mods/cnc/cursors.yaml index 1dc346888a..08e609d97c 100644 --- a/mods/cnc/cursors.yaml +++ b/mods/cnc/cursors.yaml @@ -139,19 +139,39 @@ Cursors: start:8 length:8 - mouse3.shp: cursor2 - enter-blocked: - start:212 + mouse6.shp: cursor + goldwrench: + start:0 + length:3 + goldwrench-minimap: + start:3 + length:3 + goldwrench-blocked: + start:6 length:1 - enter-blocked-minimap: - start:33 + goldwrench-blocked-minimap: + start:7 length:1 capture: - start:164 + start:8 length:3 capture-minimap: - start:167 + start:11 length:3 + capture-blocked: + start:14 + length:1 + capture-blocked-minimap: + start:15 + length:1 + enter-blocked: + start:16 + length:1 + enter-blocked-minimap: + start:17 + length:1 + + mouse3.shp: cursor2 heal: start:160 length:4 @@ -164,12 +184,6 @@ Cursors: deploy-blocked: start:211 length:1 - goldwrench: - start:170 - length:24 - goldwrench-blocked: - start:213 - length:1 nopower.shp: cursor powerdown-blocked: From 059ba575ee44e1f6a6fea71ad74276aafe157ece Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 15:37:36 +1300 Subject: [PATCH 05/14] Add a new attackoutsiderange cursor to TD. --- mods/cnc/bits/mouse7.shp | Bin 0 -> 11886 bytes mods/cnc/cursors.yaml | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 mods/cnc/bits/mouse7.shp diff --git a/mods/cnc/bits/mouse7.shp b/mods/cnc/bits/mouse7.shp new file mode 100644 index 0000000000000000000000000000000000000000..27601f490820ecf36069c5bbc5e671c2f3862742 GIT binary patch literal 11886 zcmeI1F^e=s5QZ0o1)+CZMNouKL=XhQ%-o-0a*?@QZgP7I9vd19=H}+Z!G`AM_Xo_4 zeBY|BneLvh-t|`W z7qtCj(Dt`?wf*INZGZSc+iyS8_Ukv=zWGGkKR?y>_s_Kb^>b~1{6gFBz7#j6k8!#? zceB+il=EhN5r;}_lZOa#9G22?gVBh;Z5U$2pJ}9a7l$F}H4JfANyBc8W-`QGy?kac z?uM9)X^xtc|3Q4P^%u@EfJq;*nAM~oI5aC~9S(A9a;YgpMEy!R^P0+~WxCB#yT-z8 zY*el-F=obKD%)Vp40HUlAa>Z!Xu!^!k0n1dwejyiL8NKMycA23yXqy7SpXzhL{Ux=E~X)4w|0X@Id!9nO+y()6)rTTErsfqvG5w9ee6c$v9#zYK2CaWl90 z>%q-vwl3Tvg~x5U8}v@erEv4|&P#wB&pNI$8A=2RZVB6kTei&4+>-i`vz)R-&|ktm zWo|u)f(p16p*HXFHk3?3s$w}D+%LtZ4(A(EJN=OhEtE~lv|dToZSyR!EU^w-3q!0+ zS&~a3=4`rz2>EoEaN(FxAo26R%*n$fIMBu<(MIaDTfD%YGy^!khhmp%vVp>kb;;yPg z2)6*L&N*rdK?M5dWksXuz$dI44$?Q&;JA;ntv5xYOZ2vngvfcai@s+!j%V*pv}d{H@Fl zRRJGuMXx=MXkEC?umiV=oy@J`6>i(6=d~BY?JoY0=p((}Iu_#T@n(DTcq;L-$)`9z zh1>8HPl-1ZX#4miFZZX%mUMeVA^Z(SNb*4o zEq#t(di~e>uO03Kt`6K_zXvxcbPzj$OZh_CW*-j~0L6pVrdQ}j&F+W+H`E==fZM!o z!3DTGF|Tl6`ry9!Cm#oWe}CVDo2l8)+S1h)k-0mT znYokK4&3|w-ivvKdxe`jz_P^8+wXVb6-(&Uk5i2!iSsE6>jdr^RF)4e*s-Xmr(!! literal 0 HcmV?d00001 diff --git a/mods/cnc/cursors.yaml b/mods/cnc/cursors.yaml index 08e609d97c..1a98af89a8 100644 --- a/mods/cnc/cursors.yaml +++ b/mods/cnc/cursors.yaml @@ -171,6 +171,13 @@ Cursors: start:17 length:1 + mouse7.shp: cursor + attackoutsiderange: + start:0 + length:8 + attackoutsiderange-minimap: + start:8 + mouse3.shp: cursor2 heal: start:160 From b28ba09728e807559bbe04d06cc8339b29963786 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 15:34:07 +1300 Subject: [PATCH 06/14] Remove TD dependency on the RA cursors. --- mods/cnc/bits/mouse3.shp | Bin 164532 -> 1512 bytes mods/cnc/bits/nopower.shp | Bin 2410 -> 0 bytes mods/cnc/bits/racursor.pal | Bin 768 -> 0 bytes mods/cnc/cursors.yaml | 38 +++++++++---------------------------- 4 files changed, 9 insertions(+), 29 deletions(-) delete mode 100644 mods/cnc/bits/nopower.shp delete mode 100644 mods/cnc/bits/racursor.pal diff --git a/mods/cnc/bits/mouse3.shp b/mods/cnc/bits/mouse3.shp index 976593e5ef2b13a4a918e56bd87f31e515ca8654..8d85aba1430a169011c719d27e83004766749e5b 100644 GIT binary patch literal 1512 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 diff --git a/mods/cnc/bits/racursor.pal b/mods/cnc/bits/racursor.pal deleted file mode 100644 index bb63fcdd50490a6ace83199cf15196a1e551c57e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 768 zcmWlX>5{7;5QV#v78wGj7yAT)^T#DeE+w)r215IPWK<`0|4kh^=V|qs}{yR z)(Lb-lJ&FKUJv_zUDw@qyWJUvvA0aqv~1gUJjZc7*Y*7nAt!YFz;OeFbVv?icwh&#yrBF(A>NpHXDaS@#I@Nd0Wgd^`;d&jf%X9gAl*_evOxb)+ z$By(3u4P>FKolrvh+r4Tb`)C3H+|P|tPP!Cw7b&dNO||^+K;aZ;Qrmtqq_9sd@8#- zS6`{jlPZngKhM`~zFp3juIXx_szMa3APJ3v6y7y}eu4 z)B1pQgjK@N@^`!cj?=5{uSa#M#E|ipWGciGMU@wD2j!NV?p?gK!j0jJZs6*~z9i0h zNKzEVw&xp`9oAJKIO4gPr+X5cL9q3Gu&nX9R@1*wEl&Bg@ogWD#^JQ{VI`+=<421MGttfJm#3KaJG+ Date: Sat, 8 Mar 2014 12:10:08 +1300 Subject: [PATCH 07/14] Clean up AttackCharge. --- OpenRA.Mods.RA/Attack/AttackCharge.cs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.RA/Attack/AttackCharge.cs b/OpenRA.Mods.RA/Attack/AttackCharge.cs index 363bdc914b..de6a5c14b9 100644 --- a/OpenRA.Mods.RA/Attack/AttackCharge.cs +++ b/OpenRA.Mods.RA/Attack/AttackCharge.cs @@ -8,8 +8,8 @@ */ #endregion -using OpenRA.Mods.RA.Activities; using OpenRA.FileFormats; +using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Render; using OpenRA.Traits; @@ -29,34 +29,36 @@ namespace OpenRA.Mods.RA class AttackCharge : AttackOmni, ITick, INotifyAttack, ISync { + readonly AttackChargeInfo aci; + [Sync] int charges; [Sync] int timeToRecharge; public AttackCharge(Actor self) : base(self) { - charges = self.Info.Traits.Get().MaxCharges; + aci = self.Info.Traits.Get(); + charges = aci.MaxCharges; } - public override void Tick( Actor self ) + public override void Tick(Actor self) { - if( --timeToRecharge <= 0 ) - charges = self.Info.Traits.Get().MaxCharges; + if (--timeToRecharge <= 0) + charges = aci.MaxCharges; - base.Tick( self ); + base.Tick(self); } public void Attacking(Actor self, Target target, Armament a, Barrel barrel) { --charges; - timeToRecharge = self.Info.Traits.Get().ReloadTime; + timeToRecharge = aci.ReloadTime; } public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove) { return new ChargeAttack(newTarget); } - public override void ResolveOrder(Actor self, Order order) { @@ -82,7 +84,7 @@ namespace OpenRA.Mods.RA var initDelay = self.Info.Traits.Get().InitialChargeDelay; var attack = self.Trait(); - if(attack.charges == 0 || !attack.CanAttack(self, target)) + if (attack.charges == 0 || !attack.CanAttack(self, target)) return this; self.Trait().PlayCharge(self); @@ -106,7 +108,7 @@ namespace OpenRA.Mods.RA var chargeDelay = self.Info.Traits.Get().ChargeDelay; var attack = self.Trait(); - if(attack.charges == 0) + if (attack.charges == 0) return NextActivity; attack.DoAttack(self, target); From 93c8be4e79b017cc1edffc5f08d6efdc90725af0 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 12:10:45 +1300 Subject: [PATCH 08/14] Clean up AttackOmni. --- OpenRA.Mods.RA/Attack/AttackOmni.cs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/OpenRA.Mods.RA/Attack/AttackOmni.cs b/OpenRA.Mods.RA/Attack/AttackOmni.cs index 80389ca35b..bb56fe35e8 100644 --- a/OpenRA.Mods.RA/Attack/AttackOmni.cs +++ b/OpenRA.Mods.RA/Attack/AttackOmni.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -23,30 +23,37 @@ namespace OpenRA.Mods.RA [Sync] bool buildComplete = false; public void BuildingComplete(Actor self) { buildComplete = true; } - public AttackOmni(Actor self) : base(self) { } + public AttackOmni(Actor self) + : base(self) { } - protected override bool CanAttack( Actor self, Target target ) + protected override bool CanAttack(Actor self, Target target) { - var isBuilding = ( self.HasTrait() && !buildComplete ); - return base.CanAttack( self, target ) && !isBuilding; + var isBuilding = self.HasTrait() && !buildComplete; + return base.CanAttack(self, target) && !isBuilding; } public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove) { - return new SetTarget( newTarget ); + return new SetTarget(newTarget, this); } class SetTarget : Activity { readonly Target target; - public SetTarget( Target target ) { this.target = target; } + readonly AttackOmni ao; - public override Activity Tick( Actor self ) + public SetTarget(Target target, AttackOmni ao) + { + this.target = target; + this.ao = ao; + } + + public override Activity Tick(Actor self) { if (IsCanceled || !target.IsValidFor(self)) return NextActivity; - self.Trait().DoAttack(self, target); + ao.DoAttack(self, target); return this; } } From a8bd25a6a56e3fdbb88c358c5be54dda8b1f683e Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 12:11:02 +1300 Subject: [PATCH 09/14] Clean up AttackPopupTurreted. --- OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs | 65 ++++++++++---------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs b/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs index b0a993d610..aa832144ca 100644 --- a/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs +++ b/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -16,73 +16,74 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA { - class AttackPopupTurretedInfo : AttackTurretedInfo + class AttackPopupTurretedInfo : AttackTurretedInfo, Requires, Requires { public int CloseDelay = 125; public int DefaultFacing = 0; public float ClosedDamageMultiplier = 0.5f; - public override object Create(ActorInitializer init) { return new AttackPopupTurreted( init, this ); } + + public override object Create(ActorInitializer init) { return new AttackPopupTurreted(init, this); } } class AttackPopupTurreted : AttackTurreted, INotifyBuildComplete, INotifyIdle, IDamageModifier { - enum PopupState { Open, Rotating, Transitioning, Closed }; + enum PopupState { Open, Rotating, Transitioning, Closed } - AttackPopupTurretedInfo Info; - int IdleTicks = 0; - PopupState State = PopupState.Open; + AttackPopupTurretedInfo info; + RenderBuilding rb; + + int idleTicks = 0; + PopupState state = PopupState.Open; Turreted turret; - public AttackPopupTurreted(ActorInitializer init, AttackPopupTurretedInfo info) : base(init.self) + public AttackPopupTurreted(ActorInitializer init, AttackPopupTurretedInfo info) + : base(init.self) { - Info = info; + this.info = info; buildComplete = init.Contains(); turret = turrets.FirstOrDefault(); + rb = init.self.Trait(); } - protected override bool CanAttack( Actor self, Target target ) + protected override bool CanAttack(Actor self, Target target) { - if (State == PopupState.Transitioning) + if (state == PopupState.Transitioning || !buildComplete) return false; - if( self.HasTrait() && !buildComplete ) + if (!base.CanAttack(self, target)) return false; - if (!base.CanAttack( self, target )) - return false; - - IdleTicks = 0; - if (State == PopupState.Closed) + idleTicks = 0; + if (state == PopupState.Closed) { - State = PopupState.Transitioning; - var rb = self.Trait(); + state = PopupState.Transitioning; rb.PlayCustomAnimThen(self, "opening", () => { - State = PopupState.Open; + state = PopupState.Open; rb.PlayCustomAnimRepeating(self, "idle"); }); return false; } - if (!turret.FaceTarget(self,target)) return false; + if (!turret.FaceTarget(self, target)) + return false; return true; } public void TickIdle(Actor self) { - if (State == PopupState.Open && IdleTicks++ > Info.CloseDelay) + if (state == PopupState.Open && idleTicks++ > info.CloseDelay) { - turret.desiredFacing = Info.DefaultFacing; - State = PopupState.Rotating; + turret.desiredFacing = info.DefaultFacing; + state = PopupState.Rotating; } - else if (State == PopupState.Rotating && turret.turretFacing == Info.DefaultFacing) + else if (state == PopupState.Rotating && turret.turretFacing == info.DefaultFacing) { - State = PopupState.Transitioning; - var rb = self.Trait(); + state = PopupState.Transitioning; rb.PlayCustomAnimThen(self, "closing", () => { - State = PopupState.Closed; + state = PopupState.Closed; rb.PlayCustomAnimRepeating(self, "closed-idle"); turret.desiredFacing = null; }); @@ -94,17 +95,17 @@ namespace OpenRA.Mods.RA // Set true for SkipMakeAnimsInit if (buildComplete) { - State = PopupState.Closed; - self.Trait() - .PlayCustomAnimRepeating(self, "closed-idle"); + state = PopupState.Closed; + rb.PlayCustomAnimRepeating(self, "closed-idle"); turret.desiredFacing = null; } + buildComplete = true; } public float GetDamageModifier(Actor attacker, WarheadInfo warhead) { - return State == PopupState.Closed ? Info.ClosedDamageMultiplier : 1f; + return state == PopupState.Closed ? info.ClosedDamageMultiplier : 1f; } } } From 116e4acda33ea4961a03cdd0b11edacf272a7ec0 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 12:11:23 +1300 Subject: [PATCH 10/14] Fix style nits in other Attack traits (no logic changes). --- OpenRA.Mods.RA/Air/AttackHeli.cs | 7 ++++--- OpenRA.Mods.RA/Air/AttackPlane.cs | 5 +++-- OpenRA.Mods.RA/Attack/AttackFrontal.cs | 2 +- OpenRA.Mods.RA/Attack/AttackLeap.cs | 2 +- OpenRA.Mods.RA/Attack/AttackLoyalty.cs | 4 ++-- OpenRA.Mods.RA/Attack/AttackMedic.cs | 2 +- OpenRA.Mods.RA/Attack/AttackTurreted.cs | 14 +++++++++----- OpenRA.Mods.RA/AttackBomber.cs | 2 +- 8 files changed, 22 insertions(+), 16 deletions(-) diff --git a/OpenRA.Mods.RA/Air/AttackHeli.cs b/OpenRA.Mods.RA/Air/AttackHeli.cs index 763ae160e9..b14bb33bf4 100755 --- a/OpenRA.Mods.RA/Air/AttackHeli.cs +++ b/OpenRA.Mods.RA/Air/AttackHeli.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -19,11 +19,12 @@ namespace OpenRA.Mods.RA.Air class AttackHeli : AttackFrontal { - public AttackHeli(Actor self, AttackHeliInfo info) : base(self, info) { } + public AttackHeli(Actor self, AttackHeliInfo info) + : base(self, info) { } public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove) { - return new HeliAttack( newTarget ); + return new HeliAttack(newTarget); } } } diff --git a/OpenRA.Mods.RA/Air/AttackPlane.cs b/OpenRA.Mods.RA/Air/AttackPlane.cs index 87588e8daf..c259ad2b3a 100755 --- a/OpenRA.Mods.RA/Air/AttackPlane.cs +++ b/OpenRA.Mods.RA/Air/AttackPlane.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -19,7 +19,8 @@ namespace OpenRA.Mods.RA.Air class AttackPlane : AttackFrontal { - public AttackPlane(Actor self, AttackPlaneInfo info) : base(self, info) { } + public AttackPlane(Actor self, AttackPlaneInfo info) + : base(self, info) { } public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove) { diff --git a/OpenRA.Mods.RA/Attack/AttackFrontal.cs b/OpenRA.Mods.RA/Attack/AttackFrontal.cs index 360e002be5..eb6d3848c5 100644 --- a/OpenRA.Mods.RA/Attack/AttackFrontal.cs +++ b/OpenRA.Mods.RA/Attack/AttackFrontal.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, diff --git a/OpenRA.Mods.RA/Attack/AttackLeap.cs b/OpenRA.Mods.RA/Attack/AttackLeap.cs index 386d406e69..0a657a74c3 100644 --- a/OpenRA.Mods.RA/Attack/AttackLeap.cs +++ b/OpenRA.Mods.RA/Attack/AttackLeap.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, diff --git a/OpenRA.Mods.RA/Attack/AttackLoyalty.cs b/OpenRA.Mods.RA/Attack/AttackLoyalty.cs index e216ff0196..28537fc62a 100644 --- a/OpenRA.Mods.RA/Attack/AttackLoyalty.cs +++ b/OpenRA.Mods.RA/Attack/AttackLoyalty.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA public class AttackLoyalty : AttackFrontal { public AttackLoyalty(Actor self, AttackLoyaltyInfo info) - : base( self, info ) {} + : base(self, info) { } public override void DoAttack(Actor self, Target target) { diff --git a/OpenRA.Mods.RA/Attack/AttackMedic.cs b/OpenRA.Mods.RA/Attack/AttackMedic.cs index c9fbc1fc31..461047f6a1 100644 --- a/OpenRA.Mods.RA/Attack/AttackMedic.cs +++ b/OpenRA.Mods.RA/Attack/AttackMedic.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, diff --git a/OpenRA.Mods.RA/Attack/AttackTurreted.cs b/OpenRA.Mods.RA/Attack/AttackTurreted.cs index f57d86072a..15ca6d32ed 100644 --- a/OpenRA.Mods.RA/Attack/AttackTurreted.cs +++ b/OpenRA.Mods.RA/Attack/AttackTurreted.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -28,7 +28,8 @@ namespace OpenRA.Mods.RA protected IEnumerable turrets; [Sync] protected bool buildComplete; - public AttackTurreted(Actor self) : base(self) + public AttackTurreted(Actor self) + : base(self) { turrets = self.TraitsImplementing(); } @@ -41,11 +42,13 @@ namespace OpenRA.Mods.RA if (!target.IsValidFor(self)) return false; - bool canAttack = false; + var canAttack = false; foreach (var t in turrets) if (t.FaceTarget(self, target)) canAttack = true; - if (!canAttack) return false; + + if (!canAttack) + return false; return base.CanAttack(self, target); } @@ -88,7 +91,8 @@ namespace OpenRA.Mods.RA if (IsCanceled || !target.IsValidFor(self)) return NextActivity; - if (self.IsDisabled()) return this; + if (self.IsDisabled()) + return this; var attack = self.Trait(); const int RangeTolerance = 1; /* how far inside our maximum range we should try to sit */ diff --git a/OpenRA.Mods.RA/AttackBomber.cs b/OpenRA.Mods.RA/AttackBomber.cs index 1c97616a4b..fdc268ab0b 100644 --- a/OpenRA.Mods.RA/AttackBomber.cs +++ b/OpenRA.Mods.RA/AttackBomber.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, From 113bfe53118c371e22db7ddf030c69a6f9d41ba7 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 12:24:02 +1300 Subject: [PATCH 11/14] Make Attack*Info plumbing consistent. --- OpenRA.Mods.RA/Attack/AttackBase.cs | 2 +- OpenRA.Mods.RA/Attack/AttackCharge.cs | 6 +++--- OpenRA.Mods.RA/Attack/AttackFrontal.cs | 2 +- OpenRA.Mods.RA/Attack/AttackOmni.cs | 6 +++--- OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs | 2 +- OpenRA.Mods.RA/Attack/AttackTurreted.cs | 6 +++--- OpenRA.Mods.RA/AttackBomber.cs | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.RA/Attack/AttackBase.cs b/OpenRA.Mods.RA/Attack/AttackBase.cs index fedba8af2c..9c8f80ec25 100644 --- a/OpenRA.Mods.RA/Attack/AttackBase.cs +++ b/OpenRA.Mods.RA/Attack/AttackBase.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA Lazy> armaments; protected IEnumerable Armaments { get { return armaments.Value; } } - public AttackBase(Actor self) + public AttackBase(Actor self, AttackBaseInfo info) { this.self = self; armaments = Lazy.New(() => self.TraitsImplementing()); diff --git a/OpenRA.Mods.RA/Attack/AttackCharge.cs b/OpenRA.Mods.RA/Attack/AttackCharge.cs index de6a5c14b9..a566d89bc0 100644 --- a/OpenRA.Mods.RA/Attack/AttackCharge.cs +++ b/OpenRA.Mods.RA/Attack/AttackCharge.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA public readonly int InitialChargeDelay = 22; [Desc("Delay for additional charges if MaxCharge is larger than 1.")] public readonly int ChargeDelay = 3; - public override object Create(ActorInitializer init) { return new AttackCharge(init.self); } + public override object Create(ActorInitializer init) { return new AttackCharge(init.self, this); } } class AttackCharge : AttackOmni, ITick, INotifyAttack, ISync @@ -34,8 +34,8 @@ namespace OpenRA.Mods.RA [Sync] int charges; [Sync] int timeToRecharge; - public AttackCharge(Actor self) - : base(self) + public AttackCharge(Actor self, AttackChargeInfo info) + : base(self, info) { aci = self.Info.Traits.Get(); charges = aci.MaxCharges; diff --git a/OpenRA.Mods.RA/Attack/AttackFrontal.cs b/OpenRA.Mods.RA/Attack/AttackFrontal.cs index eb6d3848c5..3899ce30b1 100644 --- a/OpenRA.Mods.RA/Attack/AttackFrontal.cs +++ b/OpenRA.Mods.RA/Attack/AttackFrontal.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA readonly AttackFrontalInfo info; public AttackFrontal(Actor self, AttackFrontalInfo info) - : base(self) + : base(self, info) { this.info = info; } diff --git a/OpenRA.Mods.RA/Attack/AttackOmni.cs b/OpenRA.Mods.RA/Attack/AttackOmni.cs index bb56fe35e8..03ae111b4a 100644 --- a/OpenRA.Mods.RA/Attack/AttackOmni.cs +++ b/OpenRA.Mods.RA/Attack/AttackOmni.cs @@ -15,7 +15,7 @@ namespace OpenRA.Mods.RA { class AttackOmniInfo : AttackBaseInfo { - public override object Create(ActorInitializer init) { return new AttackOmni(init.self); } + public override object Create(ActorInitializer init) { return new AttackOmni(init.self, this); } } class AttackOmni : AttackBase, INotifyBuildComplete, ISync @@ -23,8 +23,8 @@ namespace OpenRA.Mods.RA [Sync] bool buildComplete = false; public void BuildingComplete(Actor self) { buildComplete = true; } - public AttackOmni(Actor self) - : base(self) { } + public AttackOmni(Actor self, AttackOmniInfo info) + : base(self, info) { } protected override bool CanAttack(Actor self, Target target) { diff --git a/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs b/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs index aa832144ca..3cc3c05bb7 100644 --- a/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs +++ b/OpenRA.Mods.RA/Attack/AttackPopupTurreted.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA Turreted turret; public AttackPopupTurreted(ActorInitializer init, AttackPopupTurretedInfo info) - : base(init.self) + : base(init.self, info) { this.info = info; buildComplete = init.Contains(); diff --git a/OpenRA.Mods.RA/Attack/AttackTurreted.cs b/OpenRA.Mods.RA/Attack/AttackTurreted.cs index 15ca6d32ed..052bc67486 100644 --- a/OpenRA.Mods.RA/Attack/AttackTurreted.cs +++ b/OpenRA.Mods.RA/Attack/AttackTurreted.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.RA { class AttackTurretedInfo : AttackBaseInfo, Requires { - public override object Create(ActorInitializer init) { return new AttackTurreted(init.self); } + public override object Create(ActorInitializer init) { return new AttackTurreted(init.self, this); } } class AttackTurreted : AttackBase, INotifyBuildComplete, ISync @@ -28,8 +28,8 @@ namespace OpenRA.Mods.RA protected IEnumerable turrets; [Sync] protected bool buildComplete; - public AttackTurreted(Actor self) - : base(self) + public AttackTurreted(Actor self, AttackTurretedInfo info) + : base(self, info) { turrets = self.TraitsImplementing(); } diff --git a/OpenRA.Mods.RA/AttackBomber.cs b/OpenRA.Mods.RA/AttackBomber.cs index fdc268ab0b..622b8840d0 100644 --- a/OpenRA.Mods.RA/AttackBomber.cs +++ b/OpenRA.Mods.RA/AttackBomber.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.RA [Sync] Target target; public AttackBomber(Actor self, AttackBomberInfo info) - : base(self) + : base(self, info) { this.info = info; this.camera = null; From 2fd47ee743ec7507c169f1b81127d39b27166262 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 12:38:09 +1300 Subject: [PATCH 12/14] Remove some unnecessary trait/info lookups from AttackBase. --- OpenRA.Mods.RA/Attack/AttackBase.cs | 23 ++++++++++++++--------- OpenRA.Mods.RA/Attack/AttackFrontal.cs | 8 ++++---- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.RA/Attack/AttackBase.cs b/OpenRA.Mods.RA/Attack/AttackBase.cs index 9c8f80ec25..edede38566 100644 --- a/OpenRA.Mods.RA/Attack/AttackBase.cs +++ b/OpenRA.Mods.RA/Attack/AttackBase.cs @@ -29,14 +29,20 @@ namespace OpenRA.Mods.RA [Sync] public bool IsAttacking { get; internal set; } readonly Actor self; + readonly AttackBaseInfo info; + protected Lazy facing; Lazy> armaments; protected IEnumerable Armaments { get { return armaments.Value; } } + List> delayedActions = new List>(); public AttackBase(Actor self, AttackBaseInfo info) { this.self = self; + this.info = info; + armaments = Lazy.New(() => self.TraitsImplementing()); + facing = Lazy.New(() => self.TraitOrDefault()); } protected virtual bool CanAttack(Actor self, Target target) @@ -60,8 +66,6 @@ namespace OpenRA.Mods.RA public bool IsReloading() { return Armaments.Any(a => a.IsReloading); } - List> delayedActions = new List>(); - public virtual void Tick(Actor self) { for (var i = 0; i < delayedActions.Count; i++) @@ -88,9 +92,8 @@ namespace OpenRA.Mods.RA if (!CanAttack(self, target)) return; - var facing = self.TraitOrDefault(); foreach (var a in Armaments) - a.CheckFire(self, this, facing, target); + a.CheckFire(self, this, facing.Value, target); } public IEnumerable Orders @@ -101,7 +104,7 @@ namespace OpenRA.Mods.RA yield break; var negativeDamage = Armaments.First().Weapon.Warheads[0].Damage < 0; - yield return new AttackOrderTargeter("Attack", 6, negativeDamage); + yield return new AttackOrderTargeter(this, "Attack", 6, negativeDamage); } } @@ -168,9 +171,11 @@ namespace OpenRA.Mods.RA class AttackOrderTargeter : IOrderTargeter { readonly bool negativeDamage; + readonly AttackBase ab; - public AttackOrderTargeter(string order, int priority, bool negativeDamage) + public AttackOrderTargeter(AttackBase ab, string order, int priority, bool negativeDamage) { + this.ab = ab; this.OrderID = order; this.OrderPriority = priority; this.negativeDamage = negativeDamage; @@ -183,12 +188,12 @@ namespace OpenRA.Mods.RA { IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); - cursor = self.Info.Traits.Get().Cursor; + cursor = ab.info.Cursor; if (target.Type == TargetType.Actor && target.Actor == self) return false; - if (!self.Trait().HasAnyValidWeapons(target)) + if (!ab.HasAnyValidWeapons(target)) return false; if (modifiers.HasModifier(TargetModifiers.ForceAttack)) @@ -210,7 +215,7 @@ namespace OpenRA.Mods.RA IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); - cursor = self.Info.Traits.Get().Cursor; + cursor = ab.info.Cursor; if (negativeDamage) return false; diff --git a/OpenRA.Mods.RA/Attack/AttackFrontal.cs b/OpenRA.Mods.RA/Attack/AttackFrontal.cs index 3899ce30b1..4008a5f6e2 100644 --- a/OpenRA.Mods.RA/Attack/AttackFrontal.cs +++ b/OpenRA.Mods.RA/Attack/AttackFrontal.cs @@ -15,7 +15,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA { [Desc("Unit got to face the target")] - public class AttackFrontalInfo : AttackBaseInfo + public class AttackFrontalInfo : AttackBaseInfo, Requires { public readonly int FacingTolerance = 1; @@ -37,10 +37,10 @@ namespace OpenRA.Mods.RA if (!base.CanAttack(self, target)) return false; - var facing = self.Trait().Facing; - var facingToTarget = Util.GetFacing(target.CenterPosition - self.CenterPosition, facing); + var f = facing.Value.Facing; + var facingToTarget = Util.GetFacing(target.CenterPosition - self.CenterPosition, f); - if (Math.Abs(facingToTarget - facing) % 256 > info.FacingTolerance) + if (Math.Abs(facingToTarget - f) % 256 > info.FacingTolerance) return false; return true; From ce49d5df5e2065a9747e3d19cc94534bec25dff4 Mon Sep 17 00:00:00 2001 From: Pizzaoverhead Date: Thu, 6 Mar 2014 19:15:00 +0000 Subject: [PATCH 13/14] Display an "outside range" cursor for attacks. --- OpenRA.Mods.RA/Attack/AttackBase.cs | 15 +++++++++++++-- mods/d2k/cursors.yaml | 10 ++++++++++ mods/ra/cursors.yaml | 6 ++++++ mods/ts/cursors.yaml | 6 ++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/OpenRA.Mods.RA/Attack/AttackBase.cs b/OpenRA.Mods.RA/Attack/AttackBase.cs index edede38566..1ef88832f4 100644 --- a/OpenRA.Mods.RA/Attack/AttackBase.cs +++ b/OpenRA.Mods.RA/Attack/AttackBase.cs @@ -20,6 +20,7 @@ namespace OpenRA.Mods.RA public abstract class AttackBaseInfo : ITraitInfo { public readonly string Cursor = "attack"; + public readonly string OutsideRangeCursor = "attackoutsiderange"; public abstract object Create(ActorInitializer init); } @@ -188,7 +189,10 @@ namespace OpenRA.Mods.RA { IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); - cursor = ab.info.Cursor; + var a = ab.ChooseArmamentForTarget(target); + cursor = a != null && !target.IsInRange(self.CenterPosition, a.Weapon.Range) + ? ab.info.OutsideRangeCursor + : ab.info.Cursor; if (target.Type == TargetType.Actor && target.Actor == self) return false; @@ -220,11 +224,18 @@ namespace OpenRA.Mods.RA if (negativeDamage) return false; - if (!self.Trait().HasAnyValidWeapons(Target.FromCell(location))) + if (!ab.HasAnyValidWeapons(Target.FromCell(location))) return false; if (modifiers.HasModifier(TargetModifiers.ForceAttack)) + { + var maxRange = ab.GetMaximumRange().Range; + var targetRange = (location.CenterPosition - self.CenterPosition).HorizontalLengthSquared; + if (targetRange > maxRange * maxRange) + cursor = ab.info.OutsideRangeCursor; + return true; + } return false; } diff --git a/mods/d2k/cursors.yaml b/mods/d2k/cursors.yaml index 758cd367ec..604cac5eae 100644 --- a/mods/d2k/cursors.yaml +++ b/mods/d2k/cursors.yaml @@ -119,6 +119,16 @@ Cursors: length: 8 x: 24 y: 24 + attackoutsiderange: + start:16 + length: 8 + x: 24 + y: 24 + attackoutsiderange-minimap: + start:16 + length: 8 + x: 24 + y: 24 attackmove: start:16 length: 8 diff --git a/mods/ra/cursors.yaml b/mods/ra/cursors.yaml index 0d73983068..3b874f6dc4 100644 --- a/mods/ra/cursors.yaml +++ b/mods/ra/cursors.yaml @@ -70,6 +70,12 @@ Cursors: attack-minimap: start:203 length: 8 + attackoutsiderange: + start:21 + length: 8 + attackoutsiderange-minimap: + start:134 + length: 8 harvest: start:21 length: 8 diff --git a/mods/ts/cursors.yaml b/mods/ts/cursors.yaml index dcd50bde72..8693ba203c 100644 --- a/mods/ts/cursors.yaml +++ b/mods/ts/cursors.yaml @@ -72,6 +72,12 @@ Cursors: attack-minimap: start: 63 length: 5 + attackoutsiderange: + start: 58 + length: 5 + attackoutsiderange-minimap: + start: 63 + length: 5 attackmove: #TODO start: 58 length: 5 From 1d95f5331df7fbbfef72700e213dea78023ae60d Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 8 Mar 2014 13:16:51 +1300 Subject: [PATCH 14/14] Update changelog. --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 55bc4e72d1..ecf80cdea1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -24,6 +24,7 @@ NEW: Fixed chat synchronization in replays. Fixed the game sometimes crashing when deploying and activating the guard cursor at the same time. Build time is now set when an item reaches the front of a queue, instead of immediately when queued. + The attack cursor now changes if the target is out of range. Dune 2000: Added the Atreides grenadier from the 1.06 patch. Added randomized tiles for Sand and Rock terrain. @@ -56,6 +57,7 @@ NEW: Fixed spies staying on the minimap after infiltration. Added maps: Blitzkrieg and Burlesca by s1w. Both Allied and Soviet factions now build general-purpose mines instead of AT and AP mines respectively. + Added new attack-move cursor artwork. Tiberian Dawn: Chinook rotors now counter-rotate. Commando can now plant C4 on bridges. @@ -83,6 +85,7 @@ NEW: Increased the chance of Tiberium or chemical deaths spawning a Visceroid from 2% to 10%. Increased Obelisk of Light laser damage from 200 to 360. Fixed Obelisk of Light charge animation and sound not playing. + Replaced or improved several mouse cursors. Engine: Converted Aircraft CruiseAltitude to world coordinates. Converted Health Radius to world coordinates.