From 7c11ffa2af6bf1555658ca0e974ac5d9a1e86a45 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 21 Oct 2025 00:21:46 -0400 Subject: [PATCH] Now have animated torches that are defined from json, and smoother animations in the arena. --- animation.cpp | 18 +++--- assets/animations.json | 104 +++++++++++++++++++++--------- assets/bosses.json | 4 +- assets/fixtures/torch_fixture.png | Bin 4451 -> 9870 bytes boss/fight.cpp | 3 +- boss/ui.cpp | 34 ++++------ boss/ui.hpp | 3 +- components.hpp | 11 ++-- scripts/build_assets.ps1 | 4 +- tools/arena.cpp | 3 +- 10 files changed, 111 insertions(+), 73 deletions(-) diff --git a/animation.cpp b/animation.cpp index 3ea924b..32e7177 100644 --- a/animation.cpp +++ b/animation.cpp @@ -38,12 +38,12 @@ namespace components { float tick = twitching(); if(stationary) { - scale_out.x = std::lerp(scale, max_scale, tick); - scale_out.y = std::lerp(scale, max_scale, tick); + scale_out.x = std::lerp(scale_x, max_scale, tick); + scale_out.y = std::lerp(scale_y, max_scale, tick); pos_out.y = pos_out.y - (pos_out.y * scale_out.y - pos_out.y); } else { - scale_out.x = std::lerp(scale_out.x * scale, scale_out.x * max_scale, tick); - scale_out.y = std::lerp(scale_out.y * scale, scale_out.y * max_scale, tick); + scale_out.x = std::lerp(scale_out.x * scale_x, scale_out.x * max_scale, tick); + scale_out.y = std::lerp(scale_out.y * scale_y, scale_out.y * max_scale, tick); } if(!simple) { @@ -51,8 +51,8 @@ namespace components { } subframe += speed; - current = int(subframe); - } else if(!looped) { + current = looped ? int(subframe) % frames : int(subframe); + } else if(toggled) { playing = false; current = frames - 1; subframe = float(frames - 1); @@ -61,8 +61,8 @@ namespace components { rect_out.position.x += current * frame_width; } } else { - scale_out.x = scale; - scale_out.y = scale; + scale_out.x = scale_x; + scale_out.y = scale_y; playing = false; current = 0; subframe = 0.0f; @@ -80,7 +80,7 @@ namespace animation { bool apply(Animation& anim, sf::Sprite& sprite, sf::Vector2f pos) { sf::IntRect rect{{0,0}, {anim.frame_width, anim.frame_height}}; - sf::Vector2f scale{anim.scale, anim.scale}; + sf::Vector2f scale{anim.scale_x, anim.scale_y}; anim.step(scale, pos, rect); diff --git a/assets/animations.json b/assets/animations.json index f44eaeb..62b7d09 100644 --- a/assets/animations.json +++ b/assets/animations.json @@ -3,154 +3,196 @@ "_type": "Animation", "easing": 0, "ease_rate": 0.5, - "scale": 1.0, + "scale_x": 1.0, + "scale_y": 1.0, "max_scale": 1.0, "simple": false, "frames": 5, "speed": 0.1, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "male_hand": { "_type": "Animation", "easing": 0, "ease_rate": 0.5, - "scale": 1.0, + "scale_x": 1.0, + "scale_y": 1.0, "max_scale": 1.0, "simple": false, "frames": 3, "speed": 0.08, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "female_hand": { "_type": "Animation", "easing": 0, "ease_rate": 0.5, - "scale": 1.0, + "scale_x": 1.0, + "scale_y": 1.0, "max_scale": 1.0, "simple": false, "frames": 3, "speed": 0.08, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "lightning_animation": { "_type": "Animation", "easing": 0, "ease_rate": 0.5, - "scale": 1.0, + "scale_x": 1.0, + "scale_y": 1.0, "max_scale": 1.0, "simple": false, "frames": 5, "speed": 0.5, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "ritual_crafting_area": { "_type": "Animation", "easing": 0, "ease_rate": 0.5, - "scale": 1.0, + "scale_x": 1.0, + "scale_y": 1.0, "max_scale": 1.0, "simple": false, "frames": 3, "speed": 0.2, - "stationary": true + "stationary": true, + "toggled": true, + "looped": false }, "peasant_girl_rear_view": { "_type": "Animation", "easing": 3, "ease_rate": 0.2, - "scale": 0.5, + "scale_x": 0.5, + "scale_y": 0.5, "max_scale": 0.5, "simple": true, "frames": 1, "speed": 0.03, - "stationary": true + "stationary": true, + "toggled": false, + "looped": false }, "gold_savior": { "_type": "Animation", "easing": 1, "ease_rate": 0.2, - "scale": 1.1, + "scale_x": 1.1, + "scale_y": 1.1, "max_scale": 1.2, "simple": true, "frames": 10, "speed": 0.3, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "armored_knight" : { "_type": "Animation", "easing": 1, "ease_rate": 0.2, - "scale": 1.1, + "scale_x": 1.1, + "scale_y": 1.1, "max_scale": 1.2, "simple": true, "frames": 10, "speed": 0.3, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "axe_ranger": { "_type": "Animation", "easing": 3, "ease_rate": 0.5, - "scale": 1.1, + "scale_x": 1.1, + "scale_y": 1.1, "max_scale": 1.2, "simple": true, "frames": 1, "speed": 0.6, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "rat_with_sword": { "_type": "Animation", "easing": 3, "ease_rate": 0.5, - "scale": 1.0, + "scale_x": 1.0, + "scale_y": 1.0, "max_scale": 0.9, "simple": true, "frames": 1, "speed": 1.0, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "hairy_spider": { "_type": "Animation", "easing": 2, "ease_rate": 0.5, - "scale": 0.9, + "scale_x": 0.9, + "scale_y": 0.9, "max_scale": 1.1, "simple": true, "frames": 10, "speed": 1.0, - "stationary": false + "stationary": false, + "toggled": false, + "looped": false }, "test_boss": { "_type": "Animation", "easing": 1, "ease_rate": 0.5, - "scale": 0.4, + "scale_x": 0.4, + "scale_y": 0.4, "max_scale": 0.4, "simple": true, "frames": 1, "speed": 0.02, - "stationary": true + "stationary": true, + "toggled": false, + "looped": false }, "rat_king_boss": { "_type": "Animation", "easing": 4, "ease_rate": 0.9, - "scale": 0.6, + "scale_x": 0.6, + "scale_y": 0.6, "max_scale": 0.7, "simple": false, "frames": 2, "speed": 0.02, - "stationary": true + "stationary": true, + "toggled": false, + "looped": false }, "torch_fixture": { "_type": "Animation", "easing": 0, "ease_rate": 0.5, - "scale": 0.4, + "scale_x": 0.5, + "scale_y": 0.5, "max_scale": 0.4, - "simple": true, - "frames": 1, - "speed": 0.02, - "stationary": true + "simple": false, + "frames": 3, + "speed": 0.2, + "stationary": true, + "toggled": false, + "looped": true } } diff --git a/assets/bosses.json b/assets/bosses.json index 70b40e1..e8cccc7 100644 --- a/assets/bosses.json +++ b/assets/bosses.json @@ -18,8 +18,8 @@ "sprite": "rat_king_boss" }, "fixtures": [ - {"name": "torch_fixture", "scale_x": 0.5, "scale_y": 0.5, "cell": "torch1", "x": 66, "y": -10}, - {"name": "torch_fixture", "scale_x": -0.5, "scale_y": 0.5, "cell": "torch2", "x": 130, "y": -10} + {"name": "torch_fixture", "scale_x": 0.5, "scale_y": 0.5, "cell": "torch1", "x": 66, "y": -50}, + {"name": "torch_fixture", "scale_x": -0.5, "scale_y": 0.5, "cell": "torch2", "x": 132, "y": -30} ] }, {"_type": "Combat", "hp": 20, "max_hp": 20, "damage": 20, "dead": false}, diff --git a/assets/fixtures/torch_fixture.png b/assets/fixtures/torch_fixture.png index 472941ac470d6a6ea55c55441e71a110d20d48f9..1296f21c2bfc05235a2a28321cf56e8222286022 100644 GIT binary patch literal 9870 zcmZ`_t*W;na|8U=UmtKT+8=d*9kFzX>sr6-wOZ$w~n^@EdXHO z{>TRG-nBh&9Oup69z<-lZ|MVoj~D<1JO=>U_E!N50N^PN087>YpcoGT5ZC0-hRWMN z?7F9`rM^9GKUB49GysS}bkwgIdyf#uZ$1(nPWir?#*)o+*nBnT#uswQOd&y>`v7Sq za5&}w=8$->1{c?<>OGSm-s%RZ1S#%p30J-^)f$u%c9TtX*Pf5T7X2T2MYKPL@K5Z# zS66@CPQa@B#L>mVX?@X=;{>w|u?G!<+E-px6PW(`x1&!+b1Y;d2no;5Z!CV20KNf-{U-Zt$bTv9c?ht?0=QpN2r|BJj%w+9f%4gY%aj zt{&S8Za>FtcKjOd&ny=}fw`M}mgM=dhF!HTD1h9)({kE8v}n(fC{_XVWWZM&Cl+xQ zt+Bp=Yu^CBPwoHpzt_Cm_yNFG&416v4P-6xJ-()16mbt?Cntoo8the2w>`(>WfSO2ei=^VQ`=TeNERRgv4ro#{LcwGgW&D7NIX4K80&l)xc z9l~`_?})zyOFp+FqRWDmv2M>iRtz0u`=yY~7mi=U-|7{x)%oY}Tf1d-Blt|%1yA|~ zJdM6rCczyg+iaTvVzVldV||vW z^u{BLcBhvTj(F21P!nYSRXS!EaDX*Y=57tlTLr6u{YWx!Cd zBM}pgeaT`k=HpQ)J& zI3vaP2HpqzCqVih3Kee7w0!--;_YDN3PzZiT0UnQ z2TWM@IPEHO)!l757zI^yl zie@pge5rd7AbfQ7Vh1i|twEcx!RCcQKQi0HT95R&10d<8#@TOE-$2t(>`F zdO3$}SH!Wm4M8lAo`u8t} zLynVt<-;Km2)MGaaeh8cGF15(0{z5ISBQ`So_E9(c`62qAz;OEPHA)4%qLp?6Kb48 zB{kjGcAd6fGXJ1kvaQOHVHXXWo4@z}_^?ZY=lBA}$3OoZo3f|T?FURtpvp|v&Apo1 zC(FuhXuLn_zW6;BhIX**38rs!5}~@&NY!|6CBZ{_fQ+Z+{S)C3bnOPZ*W0E(TmYS> zavt+?TOM5H$Bc-Lkwb=bRq8@W-oY`Nk;;DSxpfVy1Xb9fk|~nAF2q_&gPTcHab>5K z=IWNd3!{}+Ij^1o?Ct9t=2Mf6(1VE6Nxo|qU`l01AN)v)>X`X_YK|OR95nIQ>M`3H z`9BHh`N4O38o48kkeBQ79s+gor8|WrFIYTWzF>Ts4OYP<2j!H*C0jOR_X|~Jl;d6H zn`|%k9^9wkb1oz-Jm)Sw)O|=(3eUpY6t5H9Eb@f|UD%hCUG^=!U*QteAGJ z*U4Bc=I(~&qy4kk*?R8_9DW5~78CK-gB;p$V?UdhJ%Vg?hMzHgmb9#*is}5%EF$hy zT&nitT50--g1QlW*<-ZZNZ!t2-N$nvmuyhcUd5*HDBsGsNsByxHR{5;`CWcx6kXSR zu_^S@5V~6I=ZZwhE|D#_2>9ZQi2__$@^4{F@0YXzuRiV)F(T#=)?J!%99Lb$v8*I+ zET+${`k=nBYlxvKAH)X?ZXMM1;NXlHdz0ITb9$rr(p(rj@uakG%;)X^fU4dl0&B>N zfX45brdKew5_Sw#yV(xncfL;YGKas_b#qKfmHOgcGtB4a&^1~M_AFj{b_H7CxxxQ* zG`~Len)Jy(<)jwlS6%%8;Y+QoqxN>1oc_Le5FaAP2GcXLSL>{!<7Tttq2T6b!yP$U%UM=Ndl z*>T1tzWklq6OBghQSpLw`K^SO*&f1Ze#%g9vB3C*Rtd``;E=W*@vD@SM5Y`0@DurP zVQ5ho&x0;yQ>qkZ!B;r((De)l*zQrTCG6$6yza*juuPbumtP@RUw}I^`N3>eQQTZt z;xNxlU$A5F3{C3h&9qn>ALbBMm5&QB$?^=i$bHu*5Vw`UNO3f$7EvE&0^Y;M zgRC_SmNnGpy;#Etll9*ia6E#4oy{F}4xH7uWLK6Je?ItWJDoI=9kwzm^1G*=`5zB? zS$MLDy{^DM+p#qkaJ79Nc_ojz=K z=a9$qGi<+@5>b*ivJ@(jg_a8%^Nr3>tbLr8sr?BAH8|l64bKw&kvQ}rO$+EC^Z-MX^ zj?4!o@;7WIEYoz`CTR|1R>*0M9Xv`_DHmd6cgWS(>3TiD8c>C%8*Zq)4Niy8{%j26 zenL`-dz6bIUF^qDSBdZAnoM0{3+PwG{=|4(udA&4o2e&ecz@LzpNA*svAybvS<@OW z;qhKCe~xdcb#4m0641YXl=J8NqL&xKT7nFH^Oy6lGpn=2?mTPlkT8j?8yfyCt?=q zNAT-Uljb+)E9`5N>MjwR{=o>g_4(2jT&65 za+Hpju{2^AR5!N$2|M9vXfTYN{(}EhKsvF1a?+(}1C$OY;SD31yyBU(dUYvqo$+%{ zBMON=f2=ePL9Ph8)V=fUdbAqNZe!viEE(9Qc+dZgv?Xa1OnT{y;=>^IaLx$xRf6hd zdchJc5pmg$>Lj=tnWYsyz0ktmacf9L-EH$kYi)j=#l_1-ny@ z=%jK<4^wcgVpYjlNA9aXrW7PoGUm`P{v@w-bFxE=K=gIi0S|81AC|JCd0$k_n@Ddo z>%vXDFRNSRj|{HwtMGf;S$uCF>c}3|8cXGy)0qOZxe0#hb-r%&37L3Jd^+aMAU#4g z?$m>@If!K2+EAYAc*D9yrb+qxPF&oWAN_@RPPeyK!RL3kA-y z4>P_Bw`_V#uP>87Z>U@~FOPmDpC*-s1jI={hs6U0dddclOXeMXN}~q>o1aKyRsJQ2 zQRlq!0LqYl$kq2(_;k2-+xANYMi-@uiXKdMIkeE5`bG5C3x%Q+50(5bKUr8$czE`) zKd|}LYZInK*L24sCt_B2Mfd59Rk~igYl^u&3LE4i*d{;^BqIo`udTpoXR_0U&NZbD z?mw~CxjXpMZ=VNZ-JnGnhCVd|!H8ho=NtWmwT=V&8?(6Y^g6Gb?iGR+@Jfeq^ai7= z*-K?OK1v}G7{&u$>bT+Za$Cxs#LIPx+-kSj84V%Hy21Ja*5m9b4!-a`b!9r2z`TM{WWuAR4K8%_Hb8dD_w#t7KVie*&J7jsd;6Ut3x} zlw9;W7OD95`yrkPzCTJIRu~ti=xX9N0l_gy=-Q9cl3mDaP&d?jQ-q;WsJtvmcJ-`> z{yRTd0Qs}FLb+*^dBch(99Rx+%Lo?ZaYD_-sTk$J!Jqr#{RM=CTV+ayWPy(68xu;K zv~wWlQA1KNd4P>v=q!Vgy*cS1Zbq9%Faptj6=s&;X^ywwwuL<&?|s4GO-6W@wv$=- zk{>Y@woz-s{Fo^fqc<<6LRFuHEdzpE%t)F)FkdG zyMf(XK$_#@v7kK8DkohnZWqC+3eFDsw>r9RBu9pm{AGWs?KrX4O;LTb{HZ8g5+ppq z4DmF)i=(d7O*&l-Jv#0MhNlAYj*ZH%#fw^K3mf84D!G2}OQzct_0E#=rS6rNFrFbv z@~ShPU1($@$g4E~BS}pkvgNM(omKorzLFC+IP2yqt|oCyL1(6?YPdx6vo-R*sKVjd z5OEq{>Q>StC|ME9IZ&Pz@XdJNi(8bPo5ao3q-HBqzt`agRyxxzajNxoVV`j;>-+&B z=kQp1fUc3cv9POAIfA2)g0JXI4ES{S&^OYHGLM4skbDQVbwiSxWib>(lcG*#4pb6DrA z^WTxI{Mw7)pedXloH1mMQAUyb6C4ZVj^_B8x0{*>3fx?;kM2w>?@B#ZdKX1ulT~Xc zVIMSgZbG;0Kj-r^={R3Y;@Dd_Yt_&%txjk4Tgag(_lzwm4_dqWWvQ_7cO%ou$%muJ zDAJ?-8xsO$(}nfeRRVr7nZ@*2j&52+D{ku(55Zqt&FBd;>Yk;G%B--f9^F?P>!Kh% zw0&~vUA1;+tSt|_KW5d8dg`f*=?2^_OW*f~fwx=F!F?^b$QEy#_DIJFoas==PfJxP z$zc)q2RpWFlAm2kJUga)8O>VmU$n_6ri{PWR14}1n|uCEdKB#~HEt4~it=BY;zfto z>3G0CC_>}c)9!bj>V0U8N=`VM4~?ldP?|WZnrEd%Y4liTNB$Tsp?(gaK6X|+zAWd3 z)bN+Q70%PS$NC`#49{9#>_4WWI#vW)hmRPXY6Z{U6s$Xu!LfUrDE(dci2*u`z4|?s zdK&ZMO!EhfE0*+wB8N?q`#m-v$!@S*ZajdYOfmLk%NL4bD?(iroXHm|luXcFY2e!- zoZDtcE>0y>+@*B%vt_aKj(kggeWOj`uQ9d>3jHZk>vwo((}x2t2h_1WA>qVCaY~_q zovnA!+!P%cPo~W|@^p;tl}mc!r0GzlUuTE^)b0Ma3iwAK}HqU+^;dG+2Thh$r#LW6)~N-Fy=NfehfR| zPyMvh1#F z_`#u{)>0+4ZS7444Y?XX-(BPgIZz0X0uMNF`NaG&Id<eySXmt~~t9<{l3w>3Z!R*zBA$h>hb! zk(8N%xgXP#eQH|4I?;D08-;#BDsu9#!0_(^5P!gxBl>Q{Yl;h>@3qw)>SjCI!Ww{b ziir7rac;%4wZ%Uz5IO}C`9Uv>pAL9xA0{%b*$YK8bzBJz!fuTQcgCYp=FBHaXnay;hsV^)|btm z_%HQO2z+<)9yi%sjFA^`84_-9aA3(xSs2@nj(+BN=+r`;l>X(iN$i$!V5Y8vu(b-? z(bCv~^0-GjU}h}!+Nb(#MZO0WDVhkJ@5a*B1{UFO9?l#Xj7i}cdwx_QeShMM+_O|% z@*smJSah+fN#f>}_}o1%WgUZyn?8@+$ydX|f#s=a^1R(03Uo;iR{PDw>tn8M_3Lgy zrA}}*pOjnNiD2c1rg3y}28SFJ`M(=yutT=F#u<~atI*Ce-wDw^46{0vLVrUPP~(jo z3rXs|{%GxvTidQh?GK%hPc!NjHDNNDv*YR&*d@-w+q(QZd#-u}O?*%0u^6isCK)8k zyw+WuA0zugm2NZlq>q~&!%4Q+@^j5~^j}5{Wpf-j5M?R(Rn9M9x^!@?zI;znuWMyt zzV9+!Zw8EcF|$}Hwf>~_c(p()mXgxdnm1r!MbEn_UQA-UkP7 z!olG8=1iDwD~%G`npkJBWMmbuEK5bd{G;zSk2SahkA#0N9UH4(pIh%FudL*lE z@wnjD(E5=ezovjV=9<0vURD4zM2=_jVTg8y*Qn14u_wb@18iEhnO(Q=m;LHeX-^v~9Rp+?cM;U-KmucDk#spVSgdWq-F;)MMbZ`$jZKEVsOQzhC*t zsrZd+LD4S!l>Mu8_W$Kl1^;&1ze@E^z}y|#jp96Eu+GKO=w*fOva!Hq*1mft9Lrqh z6$ogsvrG+=>4sN*4b;`fWVuujDP5Q34YLJ4L{Lo7D?}pKr>ZA%SK`f3e8ei-8?0=( zIzP){GCu?|bu9wpW}@&%%yUI}!F$oh}$qNwHIW(JR^LY4pv+g_f8Ic0k|;i;+a?7!h+;}l^PTneKNhm-wTB7F z#N7UrBNBi7OL^_L&CR$()k)nUmo>b|N2Rw46}QJEF6DIbIPhCJm(5(y5CfIOg6&9( zOk#RV)?FiGFgdc7Aun*MSqywSK1={Lzd5gxiWCPZ(9WN+r5~cKK%(4t0)t|eChURo zCyTt!CG6R##F!G4tNtKVc@+G|ephKDM>rqtp@YCjq8876@&vM}m_i&;3(jc^7a!Ttbd;Vk zWST?e+{~?IS}FPk(vLgLUd_M=+!=vuMW+PXAuWi#=igdlB_|2DEO|^#8r|TTJF)y`qp>I8IE7CZ# zG^N)sFF|;L_ydd^^5M2s#feQ_CR8+S?CMz6eRKBXW2xS#9Sa28!>yH1_Pt)GE83-) zLC<8W#+D$CKclj zL!X}}b7nnEYX3=ND*`2`%ZoxMH~F#e;|^)>M$H#kvRh-o#u#4=%74!gIQ(0t{Hvdt z&RRNZhN#|lel^I{G$}BTNUW^;n(@?CMSPd(^yGs z*B1Fa4>$BP*{aQ)tIZw8cs{*pil$LVnha#lHqZVs}S#wlVt!P@voo#XtWvWB6G^d` z=bpPGG$8Jqqxz~4vK)VRCM5C-Q=aY9{WVU7K^j&|P0V^q`yC%1pu!dgK zJ0%8k!sP?;KCN&8S5d(v0%)tk!g3A}D* zo0fUq3S#uNR1rpJp;96)6K2)7#Z9>$-Pj(o(z%Tn>F(Ttl)uSOUZ&Q~#>>}aj7 zv%dw)znY^X0k!XxoXu`dPpYdNrQbF`zNF$ov`pxqdy?IJTdxNWz2Pun<$NF|uaRkw zlcF@GO%KwX%d#sD2VL`9`B;3hNLDAvKNSy{8_U+c#)NY3k87-Xs{ z{RfoJg9qgo&4oHExC9Y>YiK{KBJkQg`a&xx_*;AaFPi%ex3P2FOe!_o?Ls>{5ijAC zM9;fhePCKn?x?uqYECD6!~rVL3}KRrA!E&PSE!L{|7_D=_yf+aOjuP(ih_Q8aam2> zC=BxD=Y3MKeupV~orsa}3dnl;^;Zl!oBcx>(DMzfv`-v-dMJ}Cn)zZ4=aja-ip(`F(E|T{tW?CD;Dkk`OENXqt5DtnY zmmuN1t!#5227)o$44w@~Y-UzddVr2P1rT{z-fq577KAtw7CSlXGYjF;wpgJG zZlp1q-8Ax+VYf#@%1dSyUo8 zZ(sP(JC+*Kr-+M$(zK8J{;XG!3@jRUhYf9oXh-dG@~cuM;DuX;!)8IXCqL^cO>V~o zsXQILMc|*>_plEBfQ@qDA*!VnBlm*jhwjPCa{k2f&~__$qakJI@z54)zV&AoI-F`B zBBi9AW}vSz8EqhUG#JHb7M$L{jm3Y!_$v%2B*_8!L8u(`!EqL)2;X16Gva+H0Dc&a z!*tUqoR7UqsZwI#$!)o|jjhJ_x48A!eUfH-?mC~*!fdx!pYkq$wDaX$s3l~XaA}_H zb1i%|WY6>iuABg$`bL3uJ-Hh6}2ON{W=v|h=e<{+GAgCZ*B{E@}-a+tNKeMTuQQSyDE0yi7)z(_**S) zB?m!0b8EP9@u7;S2unC&Jb5FI-5PwvqMxP0`5d+n801$B&N;6C z#&PYIZom;KghbZrU{`|}_`#lnDq+b0H81NkWk(Xn0vMdI3)>DWF6Fu7K$vhc7eIwqKL^_1b?&`~gXUVeCo@*`l&U$e=SZOtvv2ODHYk(6MD1AxpAmkijS- z%MfE^ovG|Jjco`s=AUzQoImHk{`s!C-ud3|dfxYb@ArQ0=l$m4B`XuY{UZAT0N^t- zHMRu+Hr7uzU@sS|arQ6rVl@&FQ(H>_K*<3>WDEdovbrK?0U!tj0P}7Dppymwg7D0G z8$H$oE_ZViV}SYBmD5=Gl-08jZt55S0OD`|`m(h^uUuwzatE4Op68z1e`Jq{Y@%+_ z1pqjxY-W7+O2`Ohyw}g!(XM%Eq8j})_-fLd=MSIWI5Ydg=>gw-pSR>6KPrpqdz60L z+ge}c-dffGdE17$VA{$PZ2Cb~My8eB`SCF$5y=<#?Mh4{#QfA&CWS>w1u{zLW z<7J3m>~D@QD9 zl`zqAasi6v#oS=ayu1nk?R$YpNInoEd{_Xf1}mM7#)UaHm6L`NnVIW?ZC#RpTfvP# z^#wK(qJvdFwU<-7s0EZC>Acg7tR;U_ww-XT8a)mTy#2HG2$RIZyMmm*Ac#|Cp%jlo zHPpuC%5jCNzMSaZm+iVUGY1Q58vr8M*&80vQ#8MNOz%F(Vzg0j_We6g(cUe;<}b5s zK)k@;IOEvdYAVYXuTHMTG(4^8bgrL=Ylr)hBG?a@@B{F;zd3>M0AKO6=xO>&R42 znkn^n=j6@sa8I>|)Yh!%;OrSMYIzYiTes0??70*!wEb=tB&4J~2O#W77mamK<}G1F z1Qg|49I)+cLO%8E9#HdSC3*)uYoTpIk(cFQskwPPVSFZ6N5rp5ZCvv&b>uo|c^^Hq znPsiBIgxU|N}Gy1LC)d+sTFBX_&g*LQyoU>IE`_xB__3Vm#bXA)+FV>w7i=3?PcH> z!ua4swOIEnGJnMQ9WDMn=;ItfVbc-l3ksFqD>xrP>3sA}yurn#sY0=;%23}R9~>~?AO-4>*&5(WDRc4DKhS}>n7H75?hovIjBP4M z*SWOtVBrY|5O_BYne*%CrzkI!c(SV_YGfVjkNo)KW+>5V%Cwf}b)ti?wCuZ{eY7$+}{ zgqq7iw}xN)Y;JBG7c{ne+2WW|>|{A<8L%?aovr=lYv7F~J6x!&zW+@S{SL|Si982T zp519!fR6}s4enoSi6vG?3_ddrE!7$GT{vRc$qHmvp}nje7^V43=K_>zY&{1Rb`;xO zQdICY-!%pnG-g48dQJCOY(8`p7R_stXakAK)SVXUpF&Ijiy5Cl4{6xUd6N04XYtBr z0|EY8Xj02v;1eNuNRLF*(%((J%jL8AN>YULTavSxWGj*h_73j(CHrp6EI-wRJ%aa? zc??8~C-R*8k5@SU5bfIoh)M%LlT&CX6eSo{+twRD z?fd-GC$zrMbX36IUx=?!r>aB}1fpEHD~PAQ7q+h$rE;cLW|vsU0(O37olnShiDP5= zi*H}?RCvB?Zz-Z)PnN(1-MnKd=Iwkp^67JD=k4HDhP3 zzsGtUk-#=&K8*2@jLd37S1L=SOviwf4B$+cB{S6I;B|euNW%G@f%aE4?_?`bJ177Zf_a>z#Gna2}ZzBUrp`F@h=qi*{LheWTjbGO>o*+Ph~in`xMMajmkXXqTV!E%}v5SSaP?8ya@nWqQ?wc_r%<3ROwwpa1$+B0NMBS76N%$+^~1 zSe06{qOox=f1^MLsn#c0?gDGt$lni`tE4DgstiElI)A2bBX z8HyXn90A}@{wffxO>R3&<^41ER(n=g>J+xCtN)|DpYzpMCpPeEm#4jbdXz-`h}C32 z=pY{=Z?%8zjE9Vt#_l{h=3qn4uMJ&XUI^aG7-KkL)b+qfZ1Kd4RH~IsR(HA5@tXB` zOyk>l`f+#l_D8uTWVgMa)psY1gWGxW@5Nvdf67SWZ5S4whm!A7gO((@d6`g$DoTeW z!73%4p0@EOYgfei4bJ@wz)<(b53c8svQmAKOJcRU(fIBB=^5V6d{IY7rwDi^j=lWR zjuwu%-PPB)8eS$(49b4|;ql~9>y@SSZ*!rZj-_hWQ}1iRnb~>^8FPofHQJM3KHApP zAV$4=l|fwK`Ev9iaBOJLRHUY;08Sdk5Xw$EC^1 z3GbbLKEva%ZONlytZnt^djk74r$_Ui9Pni0yPU-7WvdSS?(h zZQ(Bo(9LSg7?$mHZ@MW^kKlJvNnGjuHvxy*#FCw7?v>?a6_6sf&P;wGyc}2RZu}-) z55Y{HN#^WTV;ECE3>>NT=B?MqL^=AuzH>v*8JDUK6NYC>{!)X6`WtXS{GclTi0|r( zJTw%fgF=6=FDE@*IKs=jn=Q2C^oT)S-b!gf%+ zPvE-?BjPFj)}t8O)t{R!c^i z3OmcNjnv*+NtjBA*BkQnxrkL#p%iGZiv=tl2h)~LF!E81Ec4!}tc>0Qib@I%ql?*u zVEjF(Xu3-5(=$NY>q6H~l@myix6j2vP_JJjw5QQsxoNq;AUmJ#f7|Rtgl|)au}A;v za4q*z^kL=~xYW+ETCqd##;Dk^)hMFPUmk{doFhJGnMw@C2abHSz&Ez4yQ1Fn2{@KM z+x+Tsdo{0B3PtkulUhD$w(wZ$K!1Q=c{}a$hU)G4-Im^vONlQs3F(q(tQPa}hw-)% zzch7pK?YLebK~$+^D#p1*W9bkASC?YUDZy)=g;h%h6s1|FVfLuq%vxyo_jd;dUi=%Da2^-CdyG_ii4oAc)NipFc z#WO?=YiSi0>1A4jPEdZ!9&}IJD2C~oe@D|wa3?p9-aSxB7kuSMP3@P*AQBlVGM7GGO#g)65) zn{5UNk;uIT$IHe0lB>2uK;z-vd^_-1uGRhCmOyzD-?Kp(tSb;pD)mQ)ZNJf@n_;X6 z>jtz#KYG>~8()Ez(h|qA*U9{%_jVkbRhHI9;@Erwm!a9XL6l-?av)z>$C9oXQJkM9 zjkPJ~Ni(e?)4UXFSKo9`KyLr)JIB0ubNp(E#~!{0cV*u)AS&}bK!t5{N88+qAVnC$ zMSk6$882S9yu$;UqpBBOvljPT_r*Hqae9qXXqBWWo{;N1!{RkKXXU#PEpg!}MSP7m zpTgM^Vp4K)atr^X51S9f5P$$HGra$PK^iJf;iMvXFn7Rd-TL@$h`RQ6+!Qug1Vo*j z)5RwFj07Prkq!aB7SPJWVta;Wg9iLv9-bB-wlw#ZFv<=|>zphZe{(!_IUP7>dI~bPg<#@&> zpORBE+|+2$pi4c$9WuVN#H`=MBi z7N)grPHTftE3sut+5UVR9C}y)NM4kOk%tu(aD17N|LU3b*8%JESz|pSrZp#5bYAK? z>sB`KyhEVJjX+Nwh`%SR0n|Wh8cM1lB~`U6s$d;eH61mzQy`EI2-M$EPuLXz^Yegu zA^!Dp9}|#bNMpqSX6LPp%Z%Kj F{sY9Y4G;hT diff --git a/boss/fight.cpp b/boss/fight.cpp index 9ca5743..7d421b0 100644 --- a/boss/fight.cpp +++ b/boss/fight.cpp @@ -128,7 +128,8 @@ namespace boss { } void Fight::render(sf::RenderWindow& window) { - $ui.play_animations(window); + window.clear(); + $ui.play_animations(); $ui.render(window); } } diff --git a/boss/ui.cpp b/boss/ui.cpp index 7a6ccee..9ff863d 100644 --- a/boss/ui.cpp +++ b/boss/ui.cpp @@ -35,10 +35,14 @@ namespace boss { auto st = textures::get_sprite(name); // clone the sprite so it can be positioned st.sprite = std::make_shared(*st.texture); - - auto anim = animation::load(name); float scale_x = fixture["scale_x"]; float scale_y = fixture["scale_y"]; + + auto anim = animation::load(name); + anim.scale_x = scale_x; + anim.scale_y = scale_y; + anim.play(); + std::string cell = fixture["cell"]; float x = fixture["x"]; float y = fixture["y"]; @@ -72,6 +76,7 @@ namespace boss { for(auto& fixture : $fixtures) { position_sprite(fixture.st, fixture.cell, fixture.scale_x, fixture.scale_y, false, fixture.x, fixture.y); + fixture.pos = fixture.st.sprite->getPosition(); } $arena.init(); @@ -147,27 +152,14 @@ namespace boss { position_sprite($player_sprite, cell_name, scale, scale, $scene.player["mid_cell"]); } - void UI::play_animations(sf::RenderWindow& window) { - if($boss_anim.playing) { - using namespace std::chrono_literals; - auto& sound = $world->get($boss_id); - - animation::apply($boss_anim, *$boss_sprite.sprite, $boss_pos); - - if($boss_anim.current == 1 && !sound::playing(sound.attack)) { - sound::play(sound.attack); + void UI::play_animations() { + for(auto& fixture : $fixtures) { + if(fixture.anim.playing) { + animation::apply(fixture.anim, *fixture.st.sprite, fixture.pos); } + } - // https://www.construct.net/en/blogs/ashleys-blog-2/using-lerp-delta-time-924 - - // frame start - render(window); - window.display(); - // frame end - // deltaTime = end - start - // lerp(a, b, 1 - f ^ deltaTime) - // std::this_thread::sleep_for(16ms); - } else { + if($boss_anim.playing) { animation::apply($boss_anim, *$boss_sprite.sprite, $boss_pos); } } diff --git a/boss/ui.hpp b/boss/ui.hpp index 2084077..6945d22 100644 --- a/boss/ui.hpp +++ b/boss/ui.hpp @@ -16,6 +16,7 @@ struct AnimatedFixture { float x; float y; bool at_mid=false; + sf::Vector2f pos{0,0}; }; namespace boss { @@ -47,6 +48,6 @@ namespace boss { void status(const std::wstring& msg); void move_boss(const std::string& cell_name); void move_player(const std::string& cell_name); - void play_animations(sf::RenderWindow& window); + void play_animations(); }; } diff --git a/components.hpp b/components.hpp index 971a046..d2dc3bd 100644 --- a/components.hpp +++ b/components.hpp @@ -117,7 +117,8 @@ namespace components { }; struct Animation { - float scale = 1.0f; + float scale_x = 1.0f; + float scale_y = 1.0f; float max_scale = 1.0f; bool simple = true; int frames = 10; @@ -125,10 +126,12 @@ namespace components { ease::Style easing = ease::IN_OUT_BACK; float ease_rate = 0.5f; bool stationary = false; + bool toggled = false; + bool looped = false; + int current = 0; bool playing = false; float subframe = 0.0f; - bool looped = false; // BUG: this is weirdly not used in most animations but also named wrong should be frame_width int frame_width = -1; int frame_height = -1; @@ -159,8 +162,8 @@ namespace components { ENROLL_COMPONENT(Motion, dx, dy, random); ENROLL_COMPONENT(Combat, hp, max_hp, damage, dead); ENROLL_COMPONENT(Device, config, events); - ENROLL_COMPONENT(Animation, scale, max_scale, simple, frames, - speed, easing, ease_rate, stationary); + ENROLL_COMPONENT(Animation, scale_x, scale_y, max_scale, simple, frames, + speed, easing, ease_rate, stationary, toggled, looped); ENROLL_COMPONENT(Sound, attack, death); ENROLL_COMPONENT(Collision, has); diff --git a/scripts/build_assets.ps1 b/scripts/build_assets.ps1 index 66c1c07..efa9508 100644 --- a/scripts/build_assets.ps1 +++ b/scripts/build_assets.ps1 @@ -28,10 +28,10 @@ function Build-Images { # Build-Images -Source "Textures" -pixel_count 12 # Build-Images -Source "Sprites" -pixel_count 6 # Build-Images -Source "Items" -pixel_count 2 -# Build-Images -Source "Animations" -pixel_count 6 +Build-Images -Source "Animations" -pixel_count 24 # Build-Images -Source "Hands" -pixel_count 6 # Build-Images -Source "Boss2" -pixel_count 4 -Build-Images -Source "Fixtures" -pixel_count 24 +# Build-Images -Source "Fixtures" -pixel_count 24 #magick montage -tile 3x1 -geometry +0+0 -background transparent .\assets\hands\female_hand_*.png .\assets\hands\female_hand.png diff --git a/tools/arena.cpp b/tools/arena.cpp index 7bdb451..99dab40 100644 --- a/tools/arena.cpp +++ b/tools/arena.cpp @@ -36,7 +36,7 @@ int main(int, char*[]) { gui::routing::Router router; - sound::mute(true); + sound::mute(false); sound::play("ambient_1", true); GameDB::create_level(); @@ -71,7 +71,6 @@ int main(int, char*[]) { } } - window.clear(); main->render(window); window.display(); }