From db7744dad373d5cfd34c08df6d8252f7957375b9 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 24 Jun 2023 02:14:11 -0700 Subject: [PATCH] Wizard energy bolt attack implemented. --- Crawler/Animation.h | 1 + Crawler/Bullet.cpp | 10 ++++++++ Crawler/Bullet.h | 8 +++++-- Crawler/Crawler.cpp | 23 ++++++++++++++---- Crawler/Crawler.h | 4 ++-- Crawler/DEFINES.h | 3 ++- Crawler/Effect.cpp | 5 ++-- Crawler/Effect.h | 3 ++- Crawler/Player.cpp | 37 ++++++++++++++++++++++++++++- Crawler/Version.h | 2 +- Crawler/assets/energy_bolt.png | Bin 0 -> 736 bytes Crawler/assets/energy_particle.png | Bin 0 -> 564 bytes Crawler/assets/nico-wizard.png | Bin 14525 -> 14626 bytes Crawler/assets/nico-wizard.xcf | Bin 23440 -> 23324 bytes 14 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 Crawler/assets/energy_bolt.png create mode 100644 Crawler/assets/energy_particle.png diff --git a/Crawler/Animation.h b/Crawler/Animation.h index d699e007..6f2a21db 100644 --- a/Crawler/Animation.h +++ b/Crawler/Animation.h @@ -17,4 +17,5 @@ enum AnimationState{ WARRIOR_SWINGSONICSWORD_S,WARRIOR_SWINGSONICSWORD_E,WARRIOR_SWINGSONICSWORD_N,WARRIOR_SWINGSONICSWORD_W, WIZARD_IDLE_ATTACK_S,WIZARD_IDLE_ATTACK_E,WIZARD_IDLE_ATTACK_N,WIZARD_IDLE_ATTACK_W, WIZARD_ATTACK_S,WIZARD_ATTACK_E,WIZARD_ATTACK_N,WIZARD_ATTACK_W, + ENERGY_BOLT,ENERGY_PARTICLE }; \ No newline at end of file diff --git a/Crawler/Bullet.cpp b/Crawler/Bullet.cpp index 20c3633d..b6367e2a 100644 --- a/Crawler/Bullet.cpp +++ b/Crawler/Bullet.cpp @@ -18,6 +18,16 @@ Animate2D::Frame Bullet::GetFrame(){ return animation.GetFrame(internal_animState); } +void Bullet::Update(float fElapsedTime){ + if(animated){ + lastParticleSpawn=std::max(0.f,lastParticleSpawn-fElapsedTime); + if(lastParticleSpawn==0&&animation.GetFrame(internal_animState).GetSourceImage()==&game->GFX_EnergyBolt){ + lastParticleSpawn=0.03; + game->AddEffect(Effect(pos,float(rand()%500)/500,AnimationState::ENERGY_PARTICLE,float(rand()%1000)/500,0.5,{float(rand()%60)-30,float(rand()%60)-30})); + } + } +} + void Bullet::Draw(){ if(animated){ game->view.DrawPartialRotatedDecal(pos,GetFrame().GetSourceImage()->Decal(),rotates?atan2(vel.y,vel.x)-PI/2:0,GetFrame().GetSourceRect().size/2,GetFrame().GetSourceRect().pos,GetFrame().GetSourceRect().size,{1,1},col); diff --git a/Crawler/Bullet.h b/Crawler/Bullet.h index 006374cb..a85cb292 100644 --- a/Crawler/Bullet.h +++ b/Crawler/Bullet.h @@ -4,23 +4,27 @@ #include "olcUTIL_Animate2D.h" #include "Monster.h" +#define INFINITE 999999 + struct Bullet{ vf2d pos; vf2d vel; float radius; int damage; Pixel col; - float lifetime=99999; + float lifetime=INFINITE; bool hitsMultiple=false; bool rotates=false; bool animated=false; Animate2D::Animationanimation; Animate2D::AnimationState internal_animState; std::maphitList; + float lastParticleSpawn=0; Bullet(vf2d pos,vf2d vel,float radius,int damage,Pixel col=WHITE); //Initializes a bullet with an animation. - Bullet(vf2d pos,vf2d vel,float radius,int damage,AnimationState animation,bool hitsMultiple=false,float lifetime=999999,bool rotatesWithAngle=false,Pixel col=WHITE); + Bullet(vf2d pos,vf2d vel,float radius,int damage,AnimationState animation,bool hitsMultiple=false,float lifetime=INFINITE,bool rotatesWithAngle=false,Pixel col=WHITE); public: + void Update(float fElapsedTime); Animate2D::Frame GetFrame(); void Draw(); }; \ No newline at end of file diff --git a/Crawler/Crawler.cpp b/Crawler/Crawler.cpp index b4691d9e..840317d9 100644 --- a/Crawler/Crawler.cpp +++ b/Crawler/Crawler.cpp @@ -54,6 +54,8 @@ bool Crawler::OnUserCreate(){ GFX_SonicSlash.Load("assets/sonicslash.png"); GFX_BulletCircle.Load("assets/circle.png"); GFX_BulletCircleOutline.Load("assets/circle_outline.png"); + GFX_EnergyBolt.Load("assets/energy_bolt.png"); + GFX_EnergyParticle.Load("assets/energy_particle.png"); //Animations InitializeAnimations(); @@ -284,7 +286,7 @@ void Crawler::InitializeAnimations(){ ANIMATION_DATA[AnimationState::WIZARD_ATTACK_S]=pl_wizard_attack_s; Animate2D::FrameSequence pl_wizard_attack_e(0.2); for(int i=0;i<3;i++){ - pl_wizard_attack_e.AddFrame({&GFX_Wizard_Sheet,{vi2d{4,3}*24,{24,24}}}); + pl_wizard_attack_e.AddFrame({&GFX_Wizard_Sheet,{vi2d{4+i,3}*24,{24,24}}}); if(i==1){ pl_wizard_attack_e.AddFrame({&GFX_Wizard_Sheet,{vi2d{4,3}*24,{24,24}}}); } @@ -292,7 +294,7 @@ void Crawler::InitializeAnimations(){ ANIMATION_DATA[AnimationState::WIZARD_ATTACK_E]=pl_wizard_attack_e; Animate2D::FrameSequence pl_wizard_attack_w(0.2); for(int i=0;i<3;i++){ - pl_wizard_attack_w.AddFrame({&GFX_Wizard_Sheet,{vi2d{4,2}*24,{24,24}}}); + pl_wizard_attack_w.AddFrame({&GFX_Wizard_Sheet,{vi2d{4+i,2}*24,{24,24}}}); if(i==1){ pl_wizard_attack_w.AddFrame({&GFX_Wizard_Sheet,{vi2d{4,2}*24,{24,24}}}); } @@ -300,7 +302,7 @@ void Crawler::InitializeAnimations(){ ANIMATION_DATA[AnimationState::WIZARD_ATTACK_W]=pl_wizard_attack_w; Animate2D::FrameSequence pl_wizard_attack_n(0.2); for(int i=0;i<3;i++){ - pl_wizard_attack_n.AddFrame({&GFX_Wizard_Sheet,{vi2d{4,1}*24,{24,24}}}); + pl_wizard_attack_n.AddFrame({&GFX_Wizard_Sheet,{vi2d{4+i,1}*24,{24,24}}}); if(i==1){ pl_wizard_attack_n.AddFrame({&GFX_Wizard_Sheet,{vi2d{4,1}*24,{24,24}}}); } @@ -340,6 +342,15 @@ void Crawler::InitializeAnimations(){ sonicslash_effect.AddFrame({&GFX_SonicSlash,{{i*60,0},{60,60}}}); } ANIMATION_DATA[AnimationState::SONICSLASH]=sonicslash_effect; + Animate2D::FrameSequence energy_bolt; + energy_bolt.AddFrame({&GFX_EnergyBolt,{{0,0},{24,24}}}); + ANIMATION_DATA[AnimationState::ENERGY_BOLT]=energy_bolt; + + Animate2D::FrameSequence energy_particle; + for(int i=0;i<3;i++){ + energy_particle.AddFrame({&GFX_EnergyParticle,{{i*3,0},{3,3}}}); + } + ANIMATION_DATA[AnimationState::ENERGY_PARTICLE]=energy_particle; } bool Crawler::LeftHeld(){ @@ -582,6 +593,7 @@ void Crawler::UpdateEffects(float fElapsedTime){ void Crawler::UpdateBullets(float fElapsedTime){ for(std::vector::iterator it=BULLET_LIST.begin();it!=BULLET_LIST.end();++it){ Bullet&b=*it; + b.Update(fElapsedTime); b.pos+=b.vel*fElapsedTime; if(geom2d::overlaps(geom2d::circle(player.GetPos(),12*player.GetSizeMult()/2),geom2d::circle(b.pos,b.radius))){ if(player.Hurt(b.damage)){ @@ -608,6 +620,7 @@ void Crawler::UpdateBullets(float fElapsedTime){ } for(std::vector::iterator it=PLAYER_BULLET_LIST.begin();it!=PLAYER_BULLET_LIST.end();++it){ Bullet&b=*it; + b.Update(fElapsedTime); b.pos+=b.vel*fElapsedTime; for(Monster&m:MONSTER_LIST){ if(geom2d::overlaps(geom2d::circle(m.GetPos(),12*m.GetSizeMult()),geom2d::circle(b.pos,b.radius))){ @@ -615,7 +628,7 @@ void Crawler::UpdateBullets(float fElapsedTime){ if(!b.hitsMultiple){ it=PLAYER_BULLET_LIST.erase(it); if(it==PLAYER_BULLET_LIST.end()){ - break; + goto outsidePlayerBulletLoop; } } b.hitList[&m]=true; @@ -637,6 +650,8 @@ void Crawler::UpdateBullets(float fElapsedTime){ } b.animation.UpdateState(b.internal_animState,fElapsedTime); } + outsidePlayerBulletLoop: + int a; } void Crawler::HurtEnemies(vf2d pos,float radius,int damage){ for(Monster&m:MONSTER_LIST){ diff --git a/Crawler/Crawler.h b/Crawler/Crawler.h index 3d5d550b..3fc0db9a 100644 --- a/Crawler/Crawler.h +++ b/Crawler/Crawler.h @@ -22,9 +22,9 @@ class Crawler : public olc::PixelGameEngine Renderable GFX_Warrior_Sheet,GFX_Slime_Sheet,GFX_Circle, GFX_Effect_GroundSlam_Back,GFX_Effect_GroundSlam_Front, GFX_Heart,GFX_BLOCK_BUBBLE,GFX_Ranger_Sheet,GFX_Wizard_Sheet, - GFX_Battlecry_Effect,GFX_Mana,GFX_SonicSlash; + GFX_Battlecry_Effect,GFX_Mana,GFX_SonicSlash,GFX_EnergyParticle; public: - Renderable GFX_BulletCircle,GFX_BulletCircleOutline; + Renderable GFX_BulletCircle,GFX_BulletCircleOutline,GFX_EnergyBolt; private: std::vectorforegroundEffects,backgroundEffects; std::mapMAP_DATA; diff --git a/Crawler/DEFINES.h b/Crawler/DEFINES.h index f85e877e..1de04f5a 100644 --- a/Crawler/DEFINES.h +++ b/Crawler/DEFINES.h @@ -7,4 +7,5 @@ #define INCLUDE_MONSTER_DATA extern std::mapMONSTER_DATA; #define INCLUDE_BULLET_LIST extern std::vectorBULLET_LIST; #define INCLUDE_CLASS_DATA extern std::mapCLASS_DATA; -#define INCLUDE_PLAYER_BULLET_LIST extern std::vectorPLAYER_BULLET_LIST; \ No newline at end of file +#define INCLUDE_PLAYER_BULLET_LIST extern std::vectorPLAYER_BULLET_LIST; +#define INCLUDE_PARTICLE_LIST extern std::vectorPARTICLE_LIST; \ No newline at end of file diff --git a/Crawler/Effect.cpp b/Crawler/Effect.cpp index 5c5750b5..07934fa8 100644 --- a/Crawler/Effect.cpp +++ b/Crawler/Effect.cpp @@ -5,8 +5,8 @@ INCLUDE_ANIMATION_DATA INCLUDE_game -Effect::Effect(vf2d pos,float lifetime,AnimationState animation,float size,float fadeout) - :pos(pos),lifetime(lifetime),size(size),fadeout(fadeout),original_fadeoutTime(fadeout){ +Effect::Effect(vf2d pos,float lifetime,AnimationState animation,float size,float fadeout,vf2d spd) + :pos(pos),lifetime(lifetime),size(size),fadeout(fadeout),original_fadeoutTime(fadeout),spd(spd){ this->animation.AddState(animation,ANIMATION_DATA[animation]); } @@ -18,6 +18,7 @@ bool Effect::Update(float fElapsedTime){ return false; } } + pos+=spd*fElapsedTime; animation.UpdateState(internal_animState,fElapsedTime); return true; } diff --git a/Crawler/Effect.h b/Crawler/Effect.h index dcc36038..128af56d 100644 --- a/Crawler/Effect.h +++ b/Crawler/Effect.h @@ -8,7 +8,8 @@ struct Effect{ float lifetime=0; float fadeout=0; float size=1; - Effect(vf2d pos,float lifetime,AnimationState animation,float size=1.0f,float fadeout=0.0f); + vf2d spd={}; + Effect(vf2d pos,float lifetime,AnimationState animation,float size=1.0f,float fadeout=0.0f,vf2d spd={}); bool Update(float fElapsedTime); Animate2D::Frame GetFrame(); void Draw(); diff --git a/Crawler/Player.cpp b/Crawler/Player.cpp index fc4d04c6..2fb1de93 100644 --- a/Crawler/Player.cpp +++ b/Crawler/Player.cpp @@ -147,6 +147,40 @@ void Player::Update(float fElapsedTime){ if(it==buffList.end())break; } } + //Class-specific update events. + switch (cl) { + case WARRIOR: { + }break; + case THIEF: { + }break; + case RANGER: { + }break; + case BARD: { + }break; + case WIZARD: { + if(attack_cooldown_timer>0){ + CLASS_DATA[cl].idle_n=AnimationState::WIZARD_IDLE_ATTACK_N; + CLASS_DATA[cl].idle_e=AnimationState::WIZARD_IDLE_ATTACK_E; + CLASS_DATA[cl].idle_s=AnimationState::WIZARD_IDLE_ATTACK_S; + CLASS_DATA[cl].idle_w=AnimationState::WIZARD_IDLE_ATTACK_W; + CLASS_DATA[cl].walk_n=AnimationState::WIZARD_ATTACK_N; + CLASS_DATA[cl].walk_e=AnimationState::WIZARD_ATTACK_E; + CLASS_DATA[cl].walk_s=AnimationState::WIZARD_ATTACK_S; + CLASS_DATA[cl].walk_w=AnimationState::WIZARD_ATTACK_W; + } else { + CLASS_DATA[cl].idle_n=AnimationState::WIZARD_IDLE_N; + CLASS_DATA[cl].idle_e=AnimationState::WIZARD_IDLE_E; + CLASS_DATA[cl].idle_s=AnimationState::WIZARD_IDLE_S; + CLASS_DATA[cl].idle_w=AnimationState::WIZARD_IDLE_W; + CLASS_DATA[cl].walk_n=AnimationState::WIZARD_WALK_N; + CLASS_DATA[cl].walk_e=AnimationState::WIZARD_WALK_E; + CLASS_DATA[cl].walk_s=AnimationState::WIZARD_WALK_S; + CLASS_DATA[cl].walk_w=AnimationState::WIZARD_WALK_W; + } + }break; + case WITCH: { + }break; + } switch(state){ case SPIN:{ switch(facingDirection){ @@ -292,7 +326,8 @@ void Player::Update(float fElapsedTime){ }break; case WIZARD: { attack_cooldown_timer=MAGIC_ATTACK_COOLDOWN; - //PLAYER_BULLET_LIST.push_back(Bullet(); + float angleToCursor=atan2(game->GetWorldMousePos().y-pos.y,game->GetWorldMousePos().x-pos.x); + PLAYER_BULLET_LIST.push_back(Bullet(pos,{cos(angleToCursor)*200,sin(angleToCursor)*200},12,GetAttack(),AnimationState::ENERGY_BOLT,false,INFINITE,true)); }break; case WITCH: { }break; diff --git a/Crawler/Version.h b/Crawler/Version.h index 6bfe2dff..e6f83963 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 301 +#define VERSION_BUILD 316 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/assets/energy_bolt.png b/Crawler/assets/energy_bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e638a90ecf8ee405dd63106b2dd3af408b6e93 GIT binary patch literal 736 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 Xl2OhI)Qs{8|6MD|smnG>TZI1)Bd>`S diff --git a/Crawler/assets/nico-wizard.xcf b/Crawler/assets/nico-wizard.xcf index 45461076de7033588dc80d0154ad717012a8e5df..244d6022b103cd1d933828d33117032882ee32da 100644 GIT binary patch delta 963 zcmaJ=&1(}u9G%J6X0yreYFZBpO=z?!sI^*?#`u{i{RlSEVnHoPJt~?Co{C@*J$NV> znTtpddht+1kP$@%k6sKEFFn`_(!ZeKC4|!P&CE8bQe1ZC{buI9-*4v4ZtVk|e@|;g zI{Ef&#i3(QzsLD2=cgU;5klB(*Drd9O(phRoW~GPIpbkLqw3$GpVH&RipGO?H4dK8 zSUjz9=!?eD%eO@CZTLsriV2SefxWLt$)kv^CRt5K0WYq zQ}^JSK{f=5i47t`BqU6PVd5ahY)}nN5(Ua7Oqr7CMNtv}R|p?5(1fsnG2)ku2#7JX zC~IbB4kubA4CG9<)2Bd*Aobq1vRkQMXK(i)O&AqYBrF8+fwwMDBn7G?LjqM$xa{2E zk511Ozw$rCwoq|t1^>|Q@yb2@@lOUkbTz7e%THAKtmnrUG)}B)yt1b8 NYR$tsPhYrU{Q>@XMe6_n delta 1121 zcma)5O=uHQ5T4g;n$2#Ljm@Q}MiVP)FfnSm6JR?9w1VDaO!~PN*4I8x@s26ITb|y6^+5@mc4qDkQ_$&RoWg0W7 zg#CTzl~pOTyVj)K+TEIR^-K^#Qipb_kca;-yDlLp>p)S@@>7kJZ4jU#C2hB9>!7J* zgK9!F3@XCq?4|xq4!>V|*vhtXEknFfJ)4_K8pN6aUH+y#6ILWa!d={PL2d@W)F^CV zviC#Razi#y+Bp*X)E9>ax7zu>#{w6MVSHH(+G1dvSU24s8hqDGMKMsosePZ<&34Fd z?)S)@iaW!Fy-L^!7>=+W>P=Nmnr)TR(c7Ys1wjmroZPdT;J*ud@WseP)&%Bf@mRzN zwOqB%bk|kB&+!=}b}s)z(|@vdDNGmcd(PWd=kkFYeQ{dB1RwQ8NJ(vCn-7IaF**=& zBG;%#9faFmOk!s2Bfjt7fYoBbK7BAGn$F@Ob{