From 2447cd6becbfc44d57f5f580eb73f83885660b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pale=C4=8Dek?= Date: Mon, 31 Jul 2023 21:16:43 +0200 Subject: [PATCH] Improvements to Dart and DartTrap (#2554) Removes all hard-coded coordinates and offsets in darttrap.cpp, now the darts will always spawn in the centre of the hitbox's height (width for up and down darts). This makes it much more intuitive to create custom sprites for DartTrap. The default sprite is adjusted for this in a way that won't affect existing levels. It also makes it possible to change the sprite of the dispensed Dart from DartTrap's menu in the editor. Darts and DartTraps now also support UP and DOWN directions, in addition to LEFT and RIGHT. This PR also cleans up darttrap.cpp/hpp according to the guidelines, namely adding the m_ prefix to member variables. --- data/images/creatures/dart/dart.sprite | 18 ++- data/images/creatures/dart/flying-down.png | Bin 0 -> 10823 bytes .../dart/{flying.png => flying-left.png} | Bin .../images/creatures/darttrap/darttrap.sprite | 76 ++++++++---- data/images/creatures/darttrap/down-1.png | Bin 0 -> 11296 bytes data/images/creatures/darttrap/down-2.png | Bin 0 -> 11639 bytes data/images/creatures/darttrap/down-3.png | Bin 0 -> 11704 bytes data/images/creatures/darttrap/down-4.png | Bin 0 -> 10963 bytes data/images/creatures/darttrap/down-idle.png | Bin 0 -> 10897 bytes .../creatures/darttrap/{d1.png => left-1.png} | Bin .../creatures/darttrap/{d2.png => left-2.png} | Bin .../darttrap/{d3-.png => left-3.png} | Bin .../creatures/darttrap/{d4.png => left-4.png} | Bin .../darttrap/{d-idle.png => left-idle.png} | Bin data/images/engine/editor/objects.stoi | 4 +- src/badguy/dart.cpp | 29 ++++- src/badguy/dart.hpp | 3 +- src/badguy/darttrap.cpp | 117 +++++++++++------- src/badguy/darttrap.hpp | 18 +-- 19 files changed, 181 insertions(+), 84 deletions(-) create mode 100644 data/images/creatures/dart/flying-down.png rename data/images/creatures/dart/{flying.png => flying-left.png} (100%) create mode 100644 data/images/creatures/darttrap/down-1.png create mode 100644 data/images/creatures/darttrap/down-2.png create mode 100644 data/images/creatures/darttrap/down-3.png create mode 100644 data/images/creatures/darttrap/down-4.png create mode 100644 data/images/creatures/darttrap/down-idle.png rename data/images/creatures/darttrap/{d1.png => left-1.png} (100%) rename data/images/creatures/darttrap/{d2.png => left-2.png} (100%) rename data/images/creatures/darttrap/{d3-.png => left-3.png} (100%) rename data/images/creatures/darttrap/{d4.png => left-4.png} (100%) rename data/images/creatures/darttrap/{d-idle.png => left-idle.png} (100%) diff --git a/data/images/creatures/dart/dart.sprite b/data/images/creatures/dart/dart.sprite index b98b7ef44ab..88c8f79114a 100644 --- a/data/images/creatures/dart/dart.sprite +++ b/data/images/creatures/dart/dart.sprite @@ -2,11 +2,23 @@ (action (name "flying-left") (hitbox 10 6 12 7) - (images "flying.png") - ) + (images "flying-left.png") + ) (action (name "flying-right") (hitbox 10 6 12 7) (mirror-action "flying-left") - ) ) + (action + (name "flying-down") + (hitbox 6 10 7 12) + (images "flying-down.png") + ) + ;; This will never show up since the editor uses the flipped down texture + ;; But it prevents warnings for missing actions + (action + (name "editor-up") + (hitbox 6 10 7 12) + (images "flying-down.png") + ) +) diff --git a/data/images/creatures/dart/flying-down.png b/data/images/creatures/dart/flying-down.png new file mode 100644 index 0000000000000000000000000000000000000000..e2452125de214eae021c6245788c62e0a85dfc0b GIT binary patch literal 10823 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 n`*_}25~}uDwHWnyegg= z@JT+u05vj9jm_${H)kNq5Km7H`)t@cISNK0X4#w9qJqn;N2Gd^YUngH3(vn566RLX z%6@)UM8_crKA~0`BKxtT(68;Z9Kb@8b+K%-n9~bZP;0*I!%@z?t7wBq(iGzap8*N# z1_9-F$A;-=vonH`QLel&>X7j72GJ*o6K*!pzA}YgBOUH6%4O7aw0*3nH=U&mD?`Mq zCpV)ElLl3jeYwey_QjKh>uOi1rMs1yWN0-jS=8uUq0HXra!zGaYNB|7oUO6GB3qp6 zHJj&ckG%!J84PXv!*^-pbzsW^YMdvj=t8|ex1B_OT}|L?deFJ7uAEQHJvo(^I;yc* zQV7ZDrKiUjZWDqdFUQD8{;VEbd_(U&#Zr=A4m0v%q1 z?h62nH}Ir)i&h2~kQjoeI2ucE!ifiYdLO-e1e8>RywMnU91-e-bHRHl!`2&Lz@T`n zGR#uO0B+!|fpf*{hWO&lLJZ9@A?_FjEKF5}MkxqMBJji!(a<1I4=+DtkTUF;7fHH5 z>Xv{(k0C^NWtf$LF;s)#i-SswON+zBw1V&f2$%{DRLK|Xj5O8M{)2+lQiiz_iQY&F ziNL@>@jxkYg0G8&q=JHi1RNoOK!}kLVt&D1M0Ajtmml8|#qS)NI6sUp-kXRgctMXi z(M|+^qB0Cd8i)QtP8!8%1(7=caB$QnXz!;_$zEj6KjqXM(S%GVB80%RlI^0du@3&WwmY5=~N8UO_=dP7;n#kdl&@{l(e> z=j%sG@*_@3xHtlFY>veswMmR7Gcqqe;Vuc=29+wnU>5pPTULatO4UfS%>`}e_QE@1=i^OqLN#b9D{~ME; zD-`Ut`af_=zo)A% z$(G<7{EL4xoX_vA-!~)={IOI}=1azr z>K$dCnZLKU2Oj79cVYgKDE}ASFZO>V<^N>R%X|BD_-)cg(>e7Bn6Ac5+ucnuz;qYiWej{ z)wCHhT1WaP+2&zQ`jyBWUH->}H&rqCa^_gxd?7G~EYWF^xRw>R;}WR)wq1>$EzrPJrh=S_wu`@<`okr;%T)hcjP}Z zq4KJ$S%z{|AJ)20)FrlFl~rt7n|j)qwbtxX#nP+`k=?EF~qiw9s{H zXMev*5OzIZmxMWqnqPiZAaqy%nfE)CLulpNn`#}GYHMWZmgw%@9#?gB^>mde0}z91 z-B2Q!kWT>H&Fe3#M5S_v%w#jQYHec1ZERDu)R~&(hfMXqeft*W#{hG)bH&~hWWJr4 zFH~Yt>i-gMTIbp4^u$$Gjw0g%B~a-(B|H7hM+4;O8L)h?_hWQ%v2gH%Z@YrTL(@m* zD!JFtkdTlNq?ITmnVN~P*22O9ZDZiNp-rmRPS_cJ;VRF@57slT(m+%+6WoA>@r+W- z%IHIrb9Zg-8$EyiJOg##@yq0sh4=+|jw17=p5(Lf+6ADgx_G}t|JCtUX#>i468h#E}I%M{D|_)`59T6Xa~<$h-um)~AnI)I}5zkhn&oUIrbnSM}6|m5`6wfk{2sZ#$bG@o%bdo&Eh6+9B>ATHE`mo#z%Z9RSy+ zouy1l=6KUbg<*3On&f>|YMS1ssqF0RAl%#?r1`uHJ_Er>eBF5A$=})4HSnP?Eg5Hx z%(zfOM3#dbvDjz`24Je4l1Cs;KDK{uqnLOVi|8TMk$n|5-eYNVF`s5jX5OU|+kj&CJYLH4ud}v$H+l9Acj+(+zEQf==gV zW=f5hStnPEuCB+Tqibyp-qw{DrT|f`t?GbUV4&Q+oZZ-ABJ$?o;GhNW!TL<&!;sL> z9)CM(Ubv*B&+6DCGv27dy8AP^5xb96eBMWcfl=v|n{uYTvACF{|$yeuSc*ARVp7|}m4fd0^XmkH&FMuYT)A+ew? zpZPtNrKKffA=WFct*zQcraijCT&TEjQ-l`>X1wi@rjJ+=8FV${#TKPjRoD}=;Xmx^++LrP${cvVwKjE^QDqw%{_`;W&BVmD`1lic zkIW4LH5ZqUPkMTKTn~1?6W89#Aid`SN-8RA*zKT8=k8i;H&?Kiryh!5nmC}3Vg^d% zTwiZ&R6-z-dD4E@Nm{m*8xqYx6gx%leT{2yC8aV&Br<8}<1108_Q}b~Hqr*;mvNy} zj_zfusj02lK?eTbfe9n~LnLtR@v1 znT|F%Ynp_^11thhuCDgTyyT+(9VYMxUk*P%zrxzi(T7GXW@cvGKr>~fnLeKNM#rtU zsXNw?*yq3};6XIg1ZaQjt`cKp-o#Io=2X0HLSo|er?Vja$6(Hi+Y`K#I0i{)?EW@MWxU@2IIse@RNPI&;((=yb2jB>p4U*LE15&!@I literal 0 HcmV?d00001 diff --git a/data/images/creatures/darttrap/down-2.png b/data/images/creatures/darttrap/down-2.png new file mode 100644 index 0000000000000000000000000000000000000000..06fd8edec4d875d65d8cefc167ddd7fa61e9e215 GIT binary patch literal 11639 zcmeHrXIPWlwr=RX7XcMQ5CMUZP(rVv3rLeDA|V74=^-J2f`CXzP^whvMG>SI>4*p@ zRZzN!A|f3`K;#5mdo9;J`|fl1^W5`q=Xp}T`Mu*EW4?2YG4stxV)Q0I=^H9dryE#@_iIYl#9L5`b?>%kw`aG8?$}a-3FK z^HU3d_*w1x_s_;TI4|~ZXnv6C)^gvryU2ONHnNvdWLb0yT~cH?=3tXAyW#%hY4ZA~ z6^}*^9=5f%Bq+qnSVZpdyJ*YLk7~Q63vgoy!SAWVRTHfq$wc|Xg$t~#tAw*jr{>nm zXOBe6Bk7Y*ed?wR&(7v|qPbR6pr9`?6iG){o^3~0+e!)4?7wPdpzGLXMkzQtC$3Ew zEC<_^;wpZg_~9HyPGY?^s$b;t{gK>HpLprkCamTc-5}ALiRPFx?GVZa)(R8V&c|gWI!AnV*zecq=;8> zWm^hd;4|{7Zpwe9c5?0ey_z`{%wbXaEmfEIiY^-{{ZkWhkG&qf+htbwG)Zo0%tk$}ruv zbbKv>KLU9lWz?xUx<$JsUs^@!x)nd%*F5lQ#|YH&n;z6%n?BkOYo*#JT)W2wg{wkm ztsP!AYv{~mH^e3@2@2?c{Z1$LvB|}T-J=BawenM8hmTUD%A16-3oBzh8hMQVY#Q2a zdv6PSip%^o8Un{>E~TCB&uepsrX$0>UGWyius3kRlw53x_^uU=J7?a5&X=6~U#K1% z_zn0wPv1yt6dIYqkGn4iH63nG`YLWDL?T4fyB9ZZxXh$e9In2oWQ)1KBjnLMV(Kt= z!{MuswP#gQJ^QfO?zFnV>T(dr*uoCtQCA5e;4OvRhnm~Y(v6FTscdA|$GYl+wO%E$ z0(}RtwnNysr-#cR8o?*S-hN*hqTCAimt% zWAJN|Z8j=FYcx1rBGd*ni3U^5y4dnk9i%pnM5xaOa1TXFD7esT<*kpUJ>C)jsc4u} zm76^--!g9P8Glj}+)mMti~6j~ zl;Z)LRBi=B&zTBjJqN94lKac>ov~)M_ddxbp6OJ+w``EBtqT}TbHrm&r_^yLpOlVs z?fB>VQ*qr&fz?`c@e3|RDGJwks42ZiJV*5rU_~e4a{HZckh3={z7N>X`<$OtN)DvG zWn-|-QO_N=qHZ~*p}F;ru&F|_l$d%k(AWv5^)A}l`1bWa5*1IXy*x;9^n=nNwkh1( z?GTZ9JHN>;jv$H#JYf#{sOZuiezR*2m}3k*#%P*jd42j^;Exl1Xf;_2XO+v+N~(=t z+b@q>ro0Y=nB_cMM%6fEM7X!mG*yA)bF$ExHHD`{Y!HcU^ScW(fK~Dwb`Xe^UBv0R z>_oSPAnT!7OV7u+-uen~^F&=^a%Hn}U};&C8#KoJbO{PRdNlVM8+0a7iJ__O844bd z+%XWqIk}M}7td?#T3=FlDchvnBlBZN83&BQXt6R45XnIO998Xi3E2CVG>3I_NgWeg zB|&fyT8emO+c8j1@pWWfD~aI21J`4L4S|JB+`58DUGO*TnTnO0SLETXdJh}SDszG$ zKhE20hJ7JVlPHc{wW{x!BD}?zKH;udc9~E`{*tb5-23PG@?w)SiA%?K2B?wC64yVG;H6^W}WjT~S&s&vCou3oZ*R zK3@vt)$o-a6?{DDNe@gkPWi1aW@Xoy2p>M-y}Qsa&op1$^4+>^(p?+gN3p2^%7&X#SC$!@J)poIOf{1Ql?$i%#9)n%TFq?OnMDvPUNo)x?FNB)s zC9M#@y)5NEoGrRH>}?}6>>I5}1#{3B+-(y*u!&SPc|gi%fapUTZi45Xcs023a-yb+ z`xC?WQ!NfOY|~KqvKH#~_dDmZ#@;bivjB4CE5^eQKX5K}zoxgpS>XG~OdJ%W=|E0f zBfS`0`y;=*PLsAxp)T}hQ6UX0bB(^i^rAmt)n@J>v6=1$r}?OL{1$g4mtb#fM@e>+ zxHL)fdG|`0IQ;~s27lwbRGH+xN${FM7imjdS;D^3?TXCv{4jfw_pQ>bgX##V>0Tnn z_x*H^j(rujlVOF_^*%)dB3EVJN$)Md@3L-!``L56ERxFtlodgn1sz)eH8TL_0y;(8 zYb0@VG=gK$)tsCQs6HWz?-RDls^HxmT%ot4ocH8Z71oaDhTM^IaJ!bA;s-XvIh9b^ImYGgxme%Nv=t)fDsBydnh^#p3N>efmJQUl zol2(s&UPm!=8OB0exBzf)Y*K<)f7G-O5@eZneX7jJis+@!MY=zr=aoiP&+j;MOvZ_ zb{@&KqONLkUpRV9TAVBBS!#m65KdMSVSJ#U-DS`Ze;z?2K;?%G)$XJm~?qz`l<+ zE%(zF(c`LblclaY#J)}~XrdSbA_?f=hD18_0T{4n7z5|7EvtQ|Dm|kV)hu+i8b6h) zzCoHj)Ix|co3Kb>rJ-!*H)Tj@oT!I-6+{nuXT5EWYE)I2Qj0lNU7{&PJqhG5rb|5& z6E~hP)yA9^jd#g~&#hH|SU0lZYRbjG`T^%>H5GlT@tD-lb4jWsJo$D8A1#n8DmgUixDMp& z3&z^+c}{AoXwk3nQRN_vPrNg4{7cZ_sVlVC+Zo6@*Y@bc5Z4YVdEAZXzRN!`n%CJw!XyRCopb=CqdbG1H>nT@9M46^&YSXj453y6f(|uct91CI5D6%~A1bP~%&woou6bMOR zOgMjWQR!8`LB$1&3rQA&!zt{_VJ;4Hif+S0gTDF6aJ=I__ZMC+y;lj$@6QFCDpd9h z$-j6A70w`$$gwcCsI~(RH+^SRD~-)GX2P9SFAK5*=B3Qs2ACwYRC1#6;tLt}zW(A$ zzNAJ0bNz)`3D4|q!*4NXkq00cxk?$a_wapGcLVNN;`O(13)C5bl_Pq< z*J4P`RDNXY+>ATLBxO@??$CL;^bdWdsp(s`;#EZ#J`hxN1pIWJ%>Z&r`(EP8ybqOe z-LEO%|G28cI~jK7S*Uc{MuOF|rVDp?wbD4lU30O9QQJ@oFY?iQAV71q&_u2Z(1eMk zvenf7=SJ9pzfRoKF2AE6JTK@A{OhS3yZc$EP42Cp{TN{*uAtsAUEjTVuON;IocyuJ zIftpAnZ8;X8@D>k!oHNNqNLOdtfhZ%@^pbyM^E95VC-pA-Rm~IH4HqYDV0;9NEI$Y zi>WJAKMHFL)^N1|dd`v>d|UQHBYV(icQIdI0NF6_Sydy!(-BdZ^iVf=*tndt*e3=h zMZzKoUCcMWEPaXpD0wxKSxj8J-Fb-1kaB@H?Clt>F4^|e=-}|@WD9Q;N<%{^8rn_h zn++KDX=i#Bj_i@#WNIz~VIQB^U-i_W;*pN=J&VpiM9FUVlxsY;QovDwNVDTgzBFIm zx15gCDfC-n301nzukxI}^Cdcr{rycpC|{{#v5<7%n9uydoi+gzvmiILC_5!7@F3TM zWECx=r^XCRyW3Lw`t%Uo^Xc%}NDq9-V1GPtEMzS8>{xCrCBOKW>a?m;4qfN=dcddb zC_F|$^d@zs(|w{lGscrNOtz-hAicbvv_4iU z^hrBoH}op*3z=vxP^BnXI47SJZ}=UssE(Jd^icz-k#T?i!XKE;RxKURfz~43aeu|N z*sCs67H&uS_H3HHyYwz+&@<#)lR?)t@|t&pBy<9%JNkSx&~zhKo+spbYOPC&6ob+5On2V>3 zb^O>Kdu3 zU!{&JNmucG(g1Ls49ng=}(YZ0QGViqKEO^o1l z)yxdViqkO^Kxon1>s`_<6v8jtx9GYtZVGYWv=*wjUPud5wvA^Wd`!|3&AlF&r>ToQ ze4)sFxP_U|zNV+L)DXp&G>yN|t3R%8TkHb~sdm;)?`>O^p)GqPSX3_DzHH{}oMBGd z!S~8QT~N879evi11ya1K`_caK8*Ydn_4b;EvX!mqha)H&^p=7UmB$*!%t1jbpVQ8(X`ON-JdZAf1XU1CvE^>lUBIIf9oGta?$h|&T$*m_L=FHy=!(+|v;+OSc#^RwocYTJ3gzor| zxPth6EQjpi0)SQyq`G8VF-?@1gd_Sw65}Mcs-nIGC{x9oJyMmhHy#SVpT%QXMoQsL zF&qIn#EdFi!A-g7!t#J{fxu|3=M%O?d>Wb>n30Qd%bz(Yk$`$0R^Wi?DYz}&i`*-e z!4R0ZgsSE!*O@j}cLA(M3=JGziI@^$<;S6n@wx+nGZ@e^ zB+#xXI~8|po4LqvFyi572@YH$Q+0w%1aGmXn*HTqz7~oz`%Pp_@9oPzjX=aOM{ia$F<}OU(AP9CLG%D)u(J`(Ispjy?J!7q22HQ z^{`Eh1)ow9uAIZjN4K*E6O2RJpZ>f-j0RWOv3>5^ImpVX?EwMQ0%B5qsR{Yy6L-sReE;r$>ZA3_z@fbV=;P;rY+a>3`jPW9z^s{S zhSvvO{1)+-=e_5l31HnHJ^1GzWMBKGP-JmSn!WU!XMURMfhf3R-98#o6d_PrXx0+{ z&FbT`=hmW^tv+P^xYPc)rLrHN))|3hxfl=BP^ZvJv=`8SWE6Gh+{%lI@8Pzsn&3OO zS`e(*LwbhFWvZjwv(q*WFKHx1xX2W)omoVZQ-3AhDgAJhPtoX*d|j2y(tqUI6B4QH ze9Ls31?tb!l;9`nX_ZvAtAN{=!d!cwEEI_>VA~G31I#Etw^B5YKbzq>kP85qj$WRp zl#?UZ-b!qq`80jCtoiUp;m|CTe<`+f?x+h305C;khzGS+h6V~q4>vHv(Zc}+_I2|- zKF9?qsrq^%kS-`3&;jL)aaRVdHMN3(7)NE0rHmoO&=ZbAV|4woC^LT}bELluQr;1y zszR&et3V`hL*WoWUpH5GZv|gv&s@%Qnt1PFKn!MP}dtPG8Ta1SgBC=HedL&UXw zF+P$Y66{~#ycMQZsH2mf$ze0@Ui zjdPUHBVI@o=R*WYNJ1cT;t)x3NqLFi?TL2{4ga)u_x?jgqMj1I2u}$p7$V{3_BRV} zoR-gD{{E?jw>j~=T*4IP?SaQ4QCdDIcbvfQPCZ@m-oN|Ad!vqrPU3cTbdn$jb>jJV z8y!7E<3DYVWpu{4d7fAtqkl&_BLBpB;<2tL7)PW8$`$2C48)tr4E-A(hjIFAf&Mn1 z<2(N?5Td(3`TvIghh8VKoam~c>4C%_JJr)v1|7$%;OK$GI4Yd{L^?r`@=_={aVaE9 zN?aO2{MRK9g`&h!Fd2k2R0b+1BM147O3&RJhj2%tj;V;`U<{GR2`1?Xadd=;BODP3 zacKvXtT@8S0V*yn1%p9l9OWhDq$Pi&xP-+JD*@s9dsN3%jzlVmjEs|%3<4=GheFAV zOCN`XkaCh1hssGK9pz*k9b{lKCsfDlprCH7rwoz=|BCNq#Ml*qbMnBtDT53!?s(t7 zpyn7ilo<|jEE*IhCoeA}3x&$aO2T0BQh$LgP*`tbk{@$IAz;a0K|3N9w26!eVzOb} z5Y8wGPj}}NljCJkAWnuTEaJE}h|DMB#JMQIu_y%218eT#;i?QejtqEAc~Vk9r9X;A z!N3D~Vt4{ZIUd*B9~Gy8aF#f^RFe2t;Qz*ChV~%1|G)A41^tsn9g8D)U|lX@FF9OC zA#wkj=bwT9WHKf8I&U1-Pw#)2)c=7~`jxJ_L|YH6-*5iSP+q^Tel;Xl%!yP$;7Jou zKp=m~?~U+5Ii4&5QO94mkZ6RvGm6-4|0uP8jAQ;u8Y7@`P&rwolsF73FDWkV2yqZc zI7p$02`%R+BMp<3h5k_qf3kafIN=BgEK1#(m;=OhCYIL8Is=7IvQOmiu@KNGVvdMH zBo!bK(68kMDoGqS)PGD*>A2+>8Y=uQfYNbGQqVijJTttfrz-}9{kt&#NRpyb+TMGPJ;QwUT z|2Mg4|9ZkkxfB2B5s1&vH%Tmk#Ak0xhl@Iz#}DBEz#hEm7V(S5Q`g!X000Xdze#)x zRDFnpR5(3DEviK-4rV^t8&#X##E~vNO?7kh%u4E2^qFz)u-Uc#cYE*nR#tm7Bz*;F z`cBm_S6-d%0u2_6v|}_X7&=sqU5BFWx}=*cJPg`k;PbHh!hBGUYzxcx!cbOfVTJ}> zO*I+|=JP(T^K#MG6>Z91G(CFr`gQ-_k{01=U48m!DSqfR85vop{9?cW;q}c~c{PJS zU;Rf)2?+@|%L0sx;+`yjQ@FcD!{Wvm5=0V|$XbZ$fY65`r~!jEaF=QKLX!9~9?k7_ zMF8`?^B{B?4S)-o76B??caDLI6gb6TLR{O!U$O#I8Z$Gq+nGKSIq+~CEWLp46xbe(E^c`CtY5ru9$+lYPCu}f)#G_KXzf5n ztWR=lPYG3JJ$hXRT~>p#W+!j&JQOR?ympOGZV{OKjVab(XiuK@on(ogiHC**RPLXf5djlm*<<7n5$%mBe?v%yr90r z)MRQVB3dIOBaf(WfsmHJ!Ddc7>4yg)&17+3MVEd~)I^gg#Fq zd!Wy>#F3hxI>;Z?nYAba;A?zxV{Np=?DRF?_Y^}TBgnV4hB44{33_j98363$B%#dI zoy==32jIfO!u8LUHghI0An}Snq})fW?R3N1qSy?$XHMQ-5l=GY)FBg(&YrWOrTwzhstDipuE5$AfCFms?70Cc% z;^Nql^nhHWv==X4bh=H}VqSQ~8=SWWr;MD2xyG0M$g)j93~aTKulFS-B{dz`Lvo_EKdez&=ao$Q;g(dNopG$fO|3{Ht%nXFqB z>)U^X;6gOprPR8KiUW^6NE48k{%%qPVJu=pBhtSL2C7azf0jHP< zvxnTfch9ND=9R8Ux<wH|)EA|orS^X7Vz!N};{4}(dfmYzpH101WYadyc{*_pj*g*%tdWWZrkJX=gZ)UCrL|7{^feMLs*0qD+Pkr_k?-Fl z0)Kq>`a08`?mqL32Eas@h-?e3MV#b$;%w{g5%+0NZ}@7^(Sa&lU6h0Sk% z>`OE_9}A=wPSUTrsK=^7Y-kT{!3kqL#EiKpCMJd>`Oes;B2qwX-l|KGua`O?X8?nM z3Sj7WKwJ5d=!;IFnEmVsG!si?WF*bTW}iej91f>koMP7CO42W|E-`oQs~mm7cS~%> zZ}IG-A+!=;{mQ^r;8FF!=(e;1{_3s{fRXgOp{T?#ayWtVVf9!m*?P{RpVYEfq}rt$ zfN?w>AaJNR&S=?qlOw1VfcDQS8s8doRHjb{n3iSm)m*uDKjKGCob`7e89!C(LY literal 0 HcmV?d00001 diff --git a/data/images/creatures/darttrap/down-3.png b/data/images/creatures/darttrap/down-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b516cfa38a64b93e502760a3dd440d0fe682330f GIT binary patch literal 11704 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 YhIUrKs{PJ(ob3O4TE?2?>drU+3mjCC-~a#s literal 0 HcmV?d00001 diff --git a/data/images/creatures/darttrap/down-idle.png b/data/images/creatures/darttrap/down-idle.png new file mode 100644 index 0000000000000000000000000000000000000000..87588aeb743c13eb4f582123ed9f75cdefac2f2d GIT binary patch literal 10897 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 Y0Pf*RM2bR^$mxEsp`xo?rf41fUz$~OU;qFB literal 0 HcmV?d00001 diff --git a/data/images/creatures/darttrap/d1.png b/data/images/creatures/darttrap/left-1.png similarity index 100% rename from data/images/creatures/darttrap/d1.png rename to data/images/creatures/darttrap/left-1.png diff --git a/data/images/creatures/darttrap/d2.png b/data/images/creatures/darttrap/left-2.png similarity index 100% rename from data/images/creatures/darttrap/d2.png rename to data/images/creatures/darttrap/left-2.png diff --git a/data/images/creatures/darttrap/d3-.png b/data/images/creatures/darttrap/left-3.png similarity index 100% rename from data/images/creatures/darttrap/d3-.png rename to data/images/creatures/darttrap/left-3.png diff --git a/data/images/creatures/darttrap/d4.png b/data/images/creatures/darttrap/left-4.png similarity index 100% rename from data/images/creatures/darttrap/d4.png rename to data/images/creatures/darttrap/left-4.png diff --git a/data/images/creatures/darttrap/d-idle.png b/data/images/creatures/darttrap/left-idle.png similarity index 100% rename from data/images/creatures/darttrap/d-idle.png rename to data/images/creatures/darttrap/left-idle.png diff --git a/data/images/engine/editor/objects.stoi b/data/images/engine/editor/objects.stoi index df295ab97ea..0880d34252b 100644 --- a/data/images/engine/editor/objects.stoi +++ b/data/images/engine/editor/objects.stoi @@ -155,7 +155,7 @@ (icon "images/creatures/angrystone/charging-0.png")) (object (class "darttrap") - (icon "images/creatures/darttrap/d1.png")) + (icon "images/creatures/darttrap/left-1.png")) (object (class "dispenser") (icon "images/creatures/dispenser/cannon_left.png")) @@ -192,7 +192,7 @@ (icon "images/creatures/skydive/skydive1.png")) (object (class "dart") - (icon "images/creatures/dart/flying.png")) + (icon "images/creatures/dart/flying-left.png")) ) (objectgroup diff --git a/src/badguy/dart.cpp b/src/badguy/dart.cpp index 59afdf8cc4a..1dbc1194ebd 100644 --- a/src/badguy/dart.cpp +++ b/src/badguy/dart.cpp @@ -39,13 +39,14 @@ Dart::Dart(const ReaderMapping& reader) : SoundManager::current()->preload("sounds/stomp.wav"); } -Dart::Dart(const Vector& pos, Direction d, const BadGuy* parent_ = nullptr) : - BadGuy(pos, d, "images/creatures/dart/dart.sprite"), +Dart::Dart(const Vector& pos, Direction d, const BadGuy* parent_, const std::string& sprite, Flip flip) : + BadGuy(pos, d, sprite), parent(parent_), sound_source() { m_physic.enable_gravity(false); m_countMe = false; + m_flip = flip; SoundManager::current()->preload(DART_SOUND); SoundManager::current()->preload("sounds/darthit.wav"); SoundManager::current()->preload("sounds/stomp.wav"); @@ -64,8 +65,10 @@ Dart::updatePointers(const GameObject* from_object, GameObject* to_object) void Dart::initialize() { - m_physic.set_velocity_x(m_dir == Direction::LEFT ? -::DART_SPEED : ::DART_SPEED); - set_action("flying", m_dir); + m_physic.set_velocity_x(m_dir == Direction::LEFT ? -::DART_SPEED : m_dir == Direction::RIGHT ? ::DART_SPEED : 0); + m_physic.set_velocity_y(m_dir == Direction::UP ? -::DART_SPEED : m_dir == Direction::DOWN ? ::DART_SPEED : 0); + set_action("flying", m_dir == Direction::UP ? Direction::DOWN : m_dir); + if (m_dir == Direction::UP) m_flip = VERTICAL_FLIP; } void @@ -143,11 +146,29 @@ Dart::play_looping_sounds() } } +void +Dart::after_editor_set() +{ + BadGuy::after_editor_set(); + if ((m_dir == Direction::UP && m_flip == NO_FLIP) || (m_dir == Direction::DOWN && m_flip == VERTICAL_FLIP)) + FlipLevelTransformer::transform_flip(m_flip); +} + void Dart::on_flip(float height) { BadGuy::on_flip(height); FlipLevelTransformer::transform_flip(m_flip); + if (m_dir == Direction::UP) + { + m_dir = Direction::DOWN; + m_physic.set_velocity_y(::DART_SPEED); + } + else if (m_dir == Direction::DOWN) + { + m_dir = Direction::UP; + m_physic.set_velocity_y(-::DART_SPEED); + } } /* EOF */ diff --git a/src/badguy/dart.hpp b/src/badguy/dart.hpp index 49e1263f748..489d441977a 100644 --- a/src/badguy/dart.hpp +++ b/src/badguy/dart.hpp @@ -26,7 +26,7 @@ class Dart final : public BadGuy { public: Dart(const ReaderMapping& reader); - Dart(const Vector& pos, Direction d, const BadGuy* parent); + Dart(const Vector& pos, Direction d, const BadGuy* parent, const std::string& sprite = "images/creatures/dart/dart.sprite", Flip flip = NO_FLIP); virtual void initialize() override; virtual void activate() override; @@ -51,6 +51,7 @@ class Dart final : public BadGuy virtual void stop_looping_sounds() override; virtual void play_looping_sounds() override; + virtual void after_editor_set() override; virtual void on_flip(float height) override; protected: diff --git a/src/badguy/darttrap.cpp b/src/badguy/darttrap.cpp index 97c5692c6eb..4b886a90629 100644 --- a/src/badguy/darttrap.cpp +++ b/src/badguy/darttrap.cpp @@ -26,64 +26,62 @@ #include "util/log.hpp" #include "util/reader_mapping.hpp" -namespace { -const float MUZZLE_Y = 25; /**< [px] muzzle y-offset from top */ -} - DartTrap::DartTrap(const ReaderMapping& reader) : BadGuy(reader, "images/creatures/darttrap/darttrap.sprite", LAYER_TILES-1), - enabled(true), - initial_delay(), - fire_delay(), - ammo(), - state(IDLE), - fire_timer() + m_enabled(true), + m_initial_delay(), + m_fire_delay(), + m_ammo(), + m_dart_sprite("images/creatures/dart/dart.sprite"), + m_state(IDLE), + m_fire_timer() { - reader.get("enabled", enabled, true); - reader.get("initial-delay", initial_delay, 0.0f); - reader.get("fire-delay", fire_delay, 2.0f); - reader.get("ammo", ammo, -1); + reader.get("enabled", m_enabled, true); + reader.get("initial-delay", m_initial_delay, 0.0f); + reader.get("fire-delay", m_fire_delay, 2.0f); + reader.get("ammo", m_ammo, -1); + reader.get("dart-sprite", m_dart_sprite, "images/creatures/dart/dart.sprite"); m_countMe = false; SoundManager::current()->preload("sounds/dartfire.wav"); if (m_start_dir == Direction::AUTO) { log_warning << "Setting a DartTrap's direction to AUTO is no good idea" << std::endl; } - state = IDLE; + m_state = IDLE; set_colgroup_active(COLGROUP_DISABLED); if (!Editor::is_active()) { - if (initial_delay == 0) initial_delay = 0.1f; + if (m_initial_delay == 0) m_initial_delay = 0.1f; } } void DartTrap::initialize() { - set_action("idle", m_dir); + set_action("idle", m_dir == Direction::UP ? Direction::DOWN : m_dir); + if (m_dir == Direction::UP) m_flip = VERTICAL_FLIP; } void DartTrap::activate() { - fire_timer.start(initial_delay); + m_fire_timer.start(m_initial_delay); } HitResponse -DartTrap::collision_player(Player& , const CollisionHit& ) +DartTrap::collision_player(Player&, const CollisionHit& ) { return ABORT_MOVE; } void -DartTrap::active_update(float ) +DartTrap::active_update(float) { - if (!enabled) { - return; - } - switch (state) { + if (!m_enabled) return; + + switch (m_state) { case IDLE: - if ((ammo != 0) && (fire_timer.check())) { - if (ammo > 0) ammo--; + if ((m_ammo != 0) && (m_fire_timer.check())) { + if (m_ammo > 0) m_ammo--; load(); - fire_timer.start(fire_delay); + m_fire_timer.start(m_fire_delay); } break; @@ -101,25 +99,41 @@ DartTrap::active_update(float ) void DartTrap::load() { - state = LOADING; - set_action("loading", m_dir, 1); + m_state = LOADING; + set_action("loading", m_dir == Direction::UP ? Direction::DOWN : m_dir, 1); } void DartTrap::fire() { - float px = get_pos().x; - if (m_dir == Direction::RIGHT) px += 5; - float py = get_pos().y; - if (m_flip == NO_FLIP) - py += MUZZLE_Y; - else - py += (m_col.m_bbox.get_height() - MUZZLE_Y - 7.0f); - SoundManager::current()->play("sounds/dartfire.wav", get_pos()); - Sector::get().add(Vector(px, py), m_dir, this); - state = IDLE; - set_action("idle", m_dir); + Dart &dart = Sector::get().add(Vector(0.f, 0.f), m_dir, this, m_dart_sprite, m_flip); + + Vector pos; + switch (m_dir) + { + case Direction::RIGHT: + pos = Vector(get_pos().x, + get_pos().y + m_col.m_bbox.get_height() / 2 - dart.get_bbox().get_height() / 2); + break; + case Direction::UP: + pos = Vector(get_pos().x + m_col.m_bbox.get_width() / 2 - dart.get_bbox().get_width() / 2, + get_pos().y + m_col.m_bbox.get_height() - dart.get_bbox().get_height()); + break; + case Direction::DOWN: + pos = Vector(get_pos().x + m_col.m_bbox.get_width() / 2 - dart.get_bbox().get_width() / 2, + get_pos().y); + break; + default: + pos = Vector(get_pos().x + m_col.m_bbox.get_width() - dart.get_bbox().get_width(), + get_pos().y + m_col.m_bbox.get_height() / 2 - dart.get_bbox().get_height() / 2); + break; + } + + dart.set_pos(pos); + + m_state = IDLE; + set_action("idle", m_dir == Direction::UP ? Direction::DOWN : m_dir); } ObjectSettings @@ -127,21 +141,34 @@ DartTrap::get_settings() { ObjectSettings result = BadGuy::get_settings(); - result.add_float(_("Initial delay"), &initial_delay, "initial-delay"); - result.add_bool(_("Enabled"), &enabled, "enabled", true); - result.add_float(_("Fire delay"), &fire_delay, "fire-delay"); - result.add_int(_("Ammo"), &ammo, "ammo"); + result.add_float(_("Initial delay"), &m_initial_delay, "initial-delay"); + result.add_bool(_("Enabled"), &m_enabled, "enabled", true); + result.add_float(_("Fire delay"), &m_fire_delay, "fire-delay"); + result.add_int(_("Ammo"), &m_ammo, "ammo"); + result.add_sprite(_("Dart sprite"), &m_dart_sprite, "dart-sprite", "images/creatures/dart/dart.sprite"); - result.reorder({"initial-delay", "fire-delay", "ammo", "direction", "x", "y"}); + result.reorder({"initial-delay", "fire-delay", "ammo", "direction", "x", "y", "dart-sprite"}); return result; } +void +DartTrap::after_editor_set() +{ + BadGuy::after_editor_set(); + if ((m_dir == Direction::UP && m_flip == NO_FLIP) || (m_dir == Direction::DOWN && m_flip == VERTICAL_FLIP)) + FlipLevelTransformer::transform_flip(m_flip); +} + void DartTrap::on_flip(float height) { BadGuy::on_flip(height); FlipLevelTransformer::transform_flip(m_flip); + if (m_dir == Direction::UP) + m_dir = Direction::DOWN; + else if (m_dir == Direction::DOWN) + m_dir = Direction::UP; } /* EOF */ diff --git a/src/badguy/darttrap.hpp b/src/badguy/darttrap.hpp index cae9e83dcde..a5d31e4cf5e 100644 --- a/src/badguy/darttrap.hpp +++ b/src/badguy/darttrap.hpp @@ -37,6 +37,7 @@ class DartTrap final : public BadGuy virtual ObjectSettings get_settings() override; + virtual void after_editor_set() override; virtual void on_flip(float height) override; protected: @@ -44,17 +45,18 @@ class DartTrap final : public BadGuy IDLE, LOADING }; - void load(); /**< load a shot */ - void fire(); /**< fire a shot */ + void load(); + void fire(); private: - bool enabled; /** Is DartTrap enabled **/ - float initial_delay; /**< time to wait before firing first shot */ - float fire_delay; /**< reload time */ - int ammo; /**< ammo left (-1 means unlimited) */ + bool m_enabled; + float m_initial_delay; + float m_fire_delay; + int m_ammo; // ammo left (-1 means unlimited) + std::string m_dart_sprite; - State state; /**< current state */ - Timer fire_timer; /**< time until new shot is fired */ + State m_state; + Timer m_fire_timer; private: DartTrap(const DartTrap&) = delete;