From adf78200931ce6f2203b04e0de776668040defe6 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Tue, 19 Sep 2023 05:58:55 -0500 Subject: [PATCH] Projectile shot Phase 2 attack and casting animation implemented. --- Crawler/Animation.cpp | 2 ++ Crawler/MonsterAttribute.h | 1 + Crawler/SlimeKing.cpp | 22 +++++++++++++++++- Crawler/Version.h | 2 +- Crawler/assets/config/MonsterStrategies.txt | 2 ++ Crawler/assets/config/Monsters.txt | 3 ++- Crawler/assets/config/gfx/gfx.txt | 1 + Crawler/assets/monsters/Slime King - Cast.png | Bin 0 -> 1755 bytes Crawler/utils.cpp | 4 ++++ Crawler/utils.h | 2 ++ 10 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 Crawler/assets/monsters/Slime King - Cast.png diff --git a/Crawler/Animation.cpp b/Crawler/Animation.cpp index e5e64e10..365de1ae 100644 --- a/Crawler/Animation.cpp +++ b/Crawler/Animation.cpp @@ -197,6 +197,8 @@ void sig::Animation::InitializeAnimations(){ CreateHorizontalAnimationSequence("lightning_splash_effect.png",5,{24,24}); + CreateHorizontalAnimationSequence("monsters/Slime King - Cast.png",10,{24,24}); + CreateStillAnimation("meteor.png",{192,192}); for(int i=0;i<5;i++){ diff --git a/Crawler/MonsterAttribute.h b/Crawler/MonsterAttribute.h index b35159b1..9b896196 100644 --- a/Crawler/MonsterAttribute.h +++ b/Crawler/MonsterAttribute.h @@ -21,4 +21,5 @@ enum class Attribute{ JUMP_ORIGINAL_POS, RECOVERY_TIME, SHOOT_ANIMATION_TIME, + SHOOT_TIMER, }; \ No newline at end of file diff --git a/Crawler/SlimeKing.cpp b/Crawler/SlimeKing.cpp index 9dc30f14..5b7b8efe 100644 --- a/Crawler/SlimeKing.cpp +++ b/Crawler/SlimeKing.cpp @@ -19,6 +19,7 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe float bulletSpd=ConfigFloat("BulletSpd")/100*24; + m.F(A::SHOOT_TIMER)=std::max(0.f,m.F(A::SHOOT_TIMER)-fElapsedTime); m.F(A::SHOOT_RING_TIMER)=std::max(0.f,m.F(A::SHOOT_RING_TIMER)-fElapsedTime); m.F(A::SHOOT_RING_DELAY)=std::max(0.f,m.F(A::SHOOT_RING_DELAY)-fElapsedTime); m.F(A::JUMP_LANDING_TIMER)=std::max(0.f,m.F(A::JUMP_LANDING_TIMER)-fElapsedTime); @@ -138,13 +139,18 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe return; } + if(m.state==State::CASTING){ + m.UpdateAnimation("monsters/Slime King - Cast.png"); + return; + } + switch(m.phase){ case 0:{ m.size=ConfigInt("Phase1.Size")/100; m.diesNormally=false; m.F(A::IFRAME_TIME_UPON_HIT)=0; m.iframe_timer=ConfigFloat("Phase5.IframeTimePerHit"); - m.phase=1; + m.phase=ConfigInt("StartPhase"); }break; case 1:{ if(m.hp<=m.maxhp*ConfigFloat("Phase2.Change")/100){ @@ -186,6 +192,20 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe TransitionPhase(m.phase); return; } + if(m.F(A::SHOOT_TIMER)==0){ + m.F(A::SHOOT_TIMER)=ConfigInt("Phase2.ShootRate"); + m.I(A::PATTERN_REPEAT_COUNT)++; + int bulletCount=ConfigInt("Phase2.ShootProjectileCount"); + for(int i=0;iGetPlayer()->GetPos()); + float angle=(i-(bulletCount/2))*util::degToRad(ConfigFloat("Phase2.ShootAngleSpread"))+initialAngle; + BULLET_LIST.emplace_back(std::make_unique(m.GetPos(),vf2d{cos(angle),sin(angle)}*bulletSpd,6,ConfigInt("ProjectileDamage"),m.OnUpperLevel(),false,YELLOW,vf2d{6,6})); + } + } + if(m.I(A::PATTERN_REPEAT_COUNT)>ConfigInt("Phase2.ShootCount")){ + m.I(A::PATTERN_REPEAT_COUNT)=0; + m.SetState(State::CASTING); + } }break; case 3:{ if(m.hp<=m.maxhp*ConfigFloat("Phase4.Change")/100){ diff --git a/Crawler/Version.h b/Crawler/Version.h index 0bb38e2f..b48d2554 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -2,7 +2,7 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 0 -#define VERSION_BUILD 1364 +#define VERSION_BUILD 1371 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/assets/config/MonsterStrategies.txt b/Crawler/assets/config/MonsterStrategies.txt index 82664907..2cf3b4aa 100644 --- a/Crawler/assets/config/MonsterStrategies.txt +++ b/Crawler/assets/config/MonsterStrategies.txt @@ -74,6 +74,8 @@ MonsterStrategy { # The Slime King Boss script. Name = Slime King + # Which phase to start on. Should be 1 most of the time. + StartPhase = 1 # How much time a jump will be pre-telegraphed. JumpWarningIndicatorTime = 1.0 # Distance to jump up into the sky. A higher value causes it to launch up and down seemingly faster. diff --git a/Crawler/assets/config/Monsters.txt b/Crawler/assets/config/Monsters.txt index ceadcb00..1df2a201 100644 --- a/Crawler/assets/config/Monsters.txt +++ b/Crawler/assets/config/Monsters.txt @@ -139,6 +139,7 @@ Monsters Size = 800 Strategy = Slime King + StartPhase = 2 #Size of each animation frame SheetFrameSize = 24,24 @@ -150,6 +151,6 @@ Monsters DeathAnimation = 10, 0.1, OneShot #Additional custom animations go down below. Start with ANIMATION[0] - #ANIMATION[0] = MY_NEW_ANIMATION + ANIMATION[0] = monsters/Slime King - Cast.png } } \ No newline at end of file diff --git a/Crawler/assets/config/gfx/gfx.txt b/Crawler/assets/config/gfx/gfx.txt index 38b8bfe0..a2956f0b 100644 --- a/Crawler/assets/config/gfx/gfx.txt +++ b/Crawler/assets/config/gfx/gfx.txt @@ -35,4 +35,5 @@ Images GFX_Splash_Effect = splash_effect.png GFX_Warrior_Sheet = nico-warrior.png GFX_Wizard_Sheet = nico-wizard.png + GFX_SlimeKing_Cast = monsters/Slime King - Cast.png } \ No newline at end of file diff --git a/Crawler/assets/monsters/Slime King - Cast.png b/Crawler/assets/monsters/Slime King - Cast.png new file mode 100644 index 0000000000000000000000000000000000000000..1e29014f833db7cdc792d225e88e92dc457f0b09 GIT binary patch literal 1755 zcmV<11|<23P)EX>4Tx04R}tkv&MmKpe$iQ>9ue4lO9+kfDl$T~x%eRIvyaN?V~-2a`*`ph-j0 z;^HW{799LotU9+0Yt2!bCVt}afBE>hzEl0u6Z503ls?%w0>9UwF-Of`F=fU4Du zR6HhTbE~5775xapj|mJ(%+wR<#SC1>*F8LZy^HWH_j7-a0VQuTz#|eznQqjGH;899 zYdYtB;t(rI3h_Ddq(K)Xe&o9B@Ehl%%>vI18JW~PafnzfcCp;WtYoOfGsIy<)hJ)c zI;?Qs;;dHctbI@Z!a!bINpqd%DB@T`0!fIFQAZgS)DWRnBgI6D_G2#o5!;_6mrSlQ z7&#VDg$l{`ga5(rZq35*Q0lhDl^)Uwcc7ayIvc8Wkt91f+pMfi_xlhs? z9W8tW3~mD#*BwpX11@)f;U`@(BwO;*6bc34{fxdT2Lx{c|C-ZVdmpC{K!&24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j>YB3M(oob*l3K000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}000ECNklv;tuKrk#OX_7MG> zg11+>!0P^*Fz3IBj{+_3{g2``?M(0*|2HLnuW}J^Q;HXlo`?3%);KovqnjLh8REn5 zGx|_cT#y4V%E4r{pI74Y9gNDwCPj7-5`bIwg8xZ!EsVE!aDdhQH2^@baxs2yO}J3V zj*ralHsJNEQ>!XE?xxD#80x$P5ew`?D@Rc!WT5&4SSUftR5cvPcDywYoOjg zMSNx%0hZkWmUYCtm-GOr+QUWhUnefMR?=3H54cmPa85G*B zz!BZDhsz%tiFjql=dO(a%QoVrk{rMy9gLix(7||tt>`rXKx?ZI7RJX{Li{{80E|!t z0Gw=9gdK(#Os<)M)_^pJm(iWvC5KPC|Fmd@rkcTI@JAEWE%Kk&U=oWL0P^j906>4> zpi}hVK6@#A$m`k1IPZQB#JiETan>#4&8H72z3vN%H`nxw+KOI7t6U(9Pjnr(?7_4r zyOU^vSjPJgvS)aa{m(35nFk<)pHI;3C#N{qTPU=B2iwTnc>my`u(){f{;BWzX}@a$ z01VxNX*(qM2hO_XK)mcZ1=#-AvyXAstp>%1Dn8L77w%4I3dCKx$(MBh>3I%;(!mzN z&)ns_`#mHuCV*jGTwqLCOt`lVBUC2}0!4hH4i5l@b_*j^NxPHV?(pn$!yQ0t%)kHi ztnKHDUPGY`{2Yvh(16eZOyj3IVCImE7TB=v+$w&?M;Rx+J?D#^p8TarvKQgh|hG0NYPaao+V0z|gH=1~Vb%U~w&|F;1X-o5mr34)$Q^mJ|VW ziXL*!Ngk~My#4(P08o;!2IDWi?vrpEx-}u(Vcqf95Zu3^TNt4_Q6LQ6!Vr#df#8cn zzJ2xH$ySBLV3-E(>oxqT?~yuuw7{_uCc6Kd_CED%q!qmuw4m$|sAjNGQtn#hF4-AZ z{k6)zK660o3liXJ*e4_X7kgNaL2VEh_!{34wR&m9*ZiUPsMKJI));vc=q$73UF zBj4T+T3iu>;RPn+Ydqe-cvIo`e-oz8z_MpN{^krNp1LQgV>3VUT_zJsQVlc?#t!V* z%#ZjAToP>i^9PAUl%P>ii%jOcE0bSVfr!SQFA!|462bn1!n`vs z3VqxxUh~Rp(4>>m%x5{++|gHi4?OT7C@3f>C@3f>C@3f>C@3f>C@3f-z+dTCwHoOzn`{68002ovPDHLkV1i)HH?#l% literal 0 HcmV?d00001 diff --git a/Crawler/utils.cpp b/Crawler/utils.cpp index 94eb7383..a368bddf 100644 --- a/Crawler/utils.cpp +++ b/Crawler/utils.cpp @@ -8,6 +8,10 @@ vf2d util::pointTo(vf2d posFrom,vf2d posTo){ return geom2d::line(posFrom,posTo).vector().norm(); } +float util::angleTo(vf2d posFrom,vf2d posTo){ + return geom2d::line(posFrom,posTo).vector().polar().y; +} + float util::degToRad(float deg){ return deg*(PI/180); } diff --git a/Crawler/utils.h b/Crawler/utils.h index e9576924..42e2763b 100644 --- a/Crawler/utils.h +++ b/Crawler/utils.h @@ -6,6 +6,8 @@ namespace util{ float random(float range); //Returns a normalized vector pointing from posFrom towards posTo. vf2d pointTo(vf2d posFrom,vf2d posTo); + //Returns the angle (in radians) pointing from posFrom towards posTo. + float angleTo(vf2d posFrom,vf2d posTo); float degToRad(float deg); float radToDeg(float rad); float lerp(float n1,float n2,double t);