From e0644fe809795266e4f1a33e7079c99f53c31f7b Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Tue, 15 Oct 2024 19:18:58 -0500 Subject: [PATCH] Sandworm implementation + Monster collision radius changing implemented. --- Adventures in Lestoria/Animation.cpp | 1 + Adventures in Lestoria/Monster.cpp | 10 ++++++++-- Adventures in Lestoria/Monster.h | 3 +++ Adventures in Lestoria/Sandworm.cpp | 14 +++++++++++++- .../assets/config/gfx/gfx.txt | 1 + Adventures in Lestoria/assets/sand_suction.png | Bin 0 -> 12418 bytes 6 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 Adventures in Lestoria/assets/sand_suction.png diff --git a/Adventures in Lestoria/Animation.cpp b/Adventures in Lestoria/Animation.cpp index 13efa5cc..4837dfc1 100644 --- a/Adventures in Lestoria/Animation.cpp +++ b/Adventures in Lestoria/Animation.cpp @@ -401,6 +401,7 @@ void sig::Animation::InitializeAnimations(){ CreateHorizontalAnimationSequence("bomb_boom.png",5,{36,36},AnimationData{.frameDuration{0.2f},.style{Animate2D::Style::OneShot}}); CreateHorizontalAnimationSequence("tornado2.png",4,{24,48},AnimationData{.frameDuration{0.1f},.style{Animate2D::Style::Repeat}}); CreateHorizontalAnimationSequence("large_tornado.png",4,{72,144},AnimationData{.frameDuration{0.1f},.style{Animate2D::Style::Repeat}}); + CreateHorizontalAnimationSequence("sand_suction.png",4,{72,72},AnimationData{.frameDuration{0.2f},.style{Animate2D::Style::Repeat}}); CreateStillAnimation("meteor.png",{192,192}); diff --git a/Adventures in Lestoria/Monster.cpp b/Adventures in Lestoria/Monster.cpp index 5b571359..97496a73 100644 --- a/Adventures in Lestoria/Monster.cpp +++ b/Adventures in Lestoria/Monster.cpp @@ -70,7 +70,7 @@ safemap>STRATEGY_DAT std::unordered_mapMonsterData::imgs; Monster::Monster(vf2d pos,MonsterData data,bool upperLevel,bool bossMob): - pos(pos),spawnPos(pos),hp(data.GetHealth()),size(data.GetSizeMult()),targetSize(data.GetSizeMult()),strategy(data.GetAIStrategy()),name(data.GetInternalName()),upperLevel(upperLevel),isBoss(bossMob),facingDirection(Direction::WEST),lifetime(GetTotalLifetime()){ + pos(pos),spawnPos(pos),hp(data.GetHealth()),size(data.GetSizeMult()),targetSize(data.GetSizeMult()),strategy(data.GetAIStrategy()),name(data.GetInternalName()),upperLevel(upperLevel),isBoss(bossMob),facingDirection(Direction::WEST),lifetime(GetTotalLifetime()),collisionRadius(data.GetCollisionRadius()){ for(const std::string&anim:data.GetAnimations()){ animation.AddState(anim,ANIMATION_DATA[std::format("{}_{}",name,anim)]); } @@ -1368,7 +1368,7 @@ const std::optionalMonster::GetTotalLifetime()const{ return MONSTER_DATA.at(GetName()).GetLifetime(); } const float Monster::GetCollisionRadius()const{ - return MONSTER_DATA.at(GetName()).GetCollisionRadius()*GetSizeMult(); + return collisionRadius; } void Monster::MarkForDeletion(){ @@ -1664,4 +1664,10 @@ const int Monster::GetPhase(const std::string&strategyName){ } const bool Monster::HasBuff(BuffType buff)const{ return std::find_if(buffList.begin(),buffList.end(),[type=buff](const Buff&buff){return buff.type==type;})!=buffList.end(); +} +const float Monster::GetOriginalCollisionRadius()const{ + return MONSTER_DATA.at(GetName()).GetCollisionRadius()*GetSizeMult(); +} +void Monster::SetCollisionRadius(const float collisionRadius){ + this->collisionRadius=collisionRadius; } \ No newline at end of file diff --git a/Adventures in Lestoria/Monster.h b/Adventures in Lestoria/Monster.h index 18f28d28..873bb672 100644 --- a/Adventures in Lestoria/Monster.h +++ b/Adventures in Lestoria/Monster.h @@ -234,6 +234,8 @@ public: void MoveForward(const vf2d&moveForwardVec,const float fElapsedTime); //Moves the monster forward in given vector direction (will be auto-normalized) applying speeed boosts and other proper movement requirements as if you wanted to move on a frame-by-frame basis. void SetPhase(const std::string&strategyName,int phase); const int GetPhase(const std::string&strategyName); + const float GetOriginalCollisionRadius()const; + void SetCollisionRadius(const float collisionRadius); private: //NOTE: Marking a monster for deletion does not trigger any death events. It just simply removes the monster from the field!! // The way this works is that monsters marked for deletion will cause the monster update loop to detect there's at least one or more monsters that must be deleted and will call erase_if on the list at the end of the iteration loop. @@ -330,6 +332,7 @@ private: const bool IsUnconscious()const; const float UnconsciousTime()const; bool manualIgnoreTerrain{false}; //A manual flag that can be toggled on to dynamically make this monster ignore terrain collision. + float collisionRadius{}; //The collision radius can be modified, it's just set initially to the monster database entry. struct STRATEGY{ static std::string ERR; diff --git a/Adventures in Lestoria/Sandworm.cpp b/Adventures in Lestoria/Sandworm.cpp index eb1a40dd..4d09936f 100644 --- a/Adventures in Lestoria/Sandworm.cpp +++ b/Adventures in Lestoria/Sandworm.cpp @@ -47,5 +47,17 @@ using A=Attribute; INCLUDE_game void Monster::STRATEGY::SANDWORM(Monster&m,float fElapsedTime,std::string strategy){ - + enum PhaseName{ + INITIALIZE, + UNDERGROUND, + }; + + switch(PHASE()){ + case INITIALIZE:{ + SETPHASE(UNDERGROUND); + }break; + case UNDERGROUND:{ + m.SetCollisionRadius(0.f); + }break; + } } \ No newline at end of file diff --git a/Adventures in Lestoria/assets/config/gfx/gfx.txt b/Adventures in Lestoria/assets/config/gfx/gfx.txt index 3f123cb6..5bc8c5c3 100644 --- a/Adventures in Lestoria/assets/config/gfx/gfx.txt +++ b/Adventures in Lestoria/assets/config/gfx/gfx.txt @@ -137,6 +137,7 @@ Images GFX_MusketTrail = musket_trail.png GFX_LineIndicator = line_indicator.png GFX_MusketBullet = musket_bullet.png + GFX_SandSuction = sand_suction.png GFX_Thief_Sheet = nico-thief.png GFX_Trapper_Sheet = nico-trapper.png diff --git a/Adventures in Lestoria/assets/sand_suction.png b/Adventures in Lestoria/assets/sand_suction.png new file mode 100644 index 0000000000000000000000000000000000000000..d60b383708de8fd0e85bc509c98783f931beeb9e GIT binary patch literal 12418 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%0DU<0}4gb$%;#x+!r9`%knbvqNK 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