diff --git a/Crawler/Crawler.cpp b/Crawler/Crawler.cpp index f8247a36..e05d916a 100644 --- a/Crawler/Crawler.cpp +++ b/Crawler/Crawler.cpp @@ -1109,15 +1109,43 @@ void Crawler::RenderWorld(float fElapsedTime){ dn->lifeTime+=fElapsedTime; if(dn->lifeTime<=1){ if(dn->lifeTimepos.y-=20*fElapsedTime; + if(dn->invertedDirection){ + dn->pos.y+=20*fElapsedTime; + }else{ + dn->pos.y-=20*fElapsedTime; + } } } } - std::string text=std::to_string(dn->damage); - if(!dn->friendly){ - view.DrawStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,DARK_RED); - }else{ - view.DrawShadowStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,RED,VERY_DARK_GREY); + switch(dn->type){ + case HEALTH_LOSS:{ + std::string text=std::to_string(dn->damage); + if(!dn->friendly){ + view.DrawStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,DARK_RED); + }else{ + view.DrawShadowStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,RED,VERY_DARK_GREY); + } + }break; + case HEALTH_GAIN:{ + std::string text="+"+std::to_string(dn->damage); + if(!dn->friendly){ + view.DrawStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,DARK_GREEN); + }else{ + view.DrawShadowStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,GREEN,VERY_DARK_GREY); + } + }break; + case MANA_GAIN:{ + std::string text="+"+std::to_string(dn->damage); + if(dn->friendly){ + view.DrawShadowStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,BLUE,VERY_DARK_GREY); + } + }break; + case INTERRUPT:{ + std::string text="Interrupted!"; + if(dn->friendly){ + view.DrawShadowStringPropDecal(dn->pos-GetTextSizeProp(text)/2,text,BLACK,VERY_DARK_GREY,{0.5,1}); + } + }break; } } diff --git a/Crawler/DamageNumber.cpp b/Crawler/DamageNumber.cpp index 55626017..e7825cad 100644 --- a/Crawler/DamageNumber.cpp +++ b/Crawler/DamageNumber.cpp @@ -39,6 +39,6 @@ DamageNumber::DamageNumber() :damage(0){ } -DamageNumber::DamageNumber(vf2d pos,int damage,bool friendly): - pos(pos),damage(damage),friendly(friendly){ +DamageNumber::DamageNumber(vf2d pos,int damage,bool friendly,DamageNumberType type): + pos(pos),damage(damage),friendly(friendly),type(type),invertedDirection(type==INTERRUPT){ } \ No newline at end of file diff --git a/Crawler/DamageNumber.h b/Crawler/DamageNumber.h index 7a0ba5b4..1ad637e5 100644 --- a/Crawler/DamageNumber.h +++ b/Crawler/DamageNumber.h @@ -34,13 +34,22 @@ SUCH DAMAGE. #pragma once #include "olcPixelGameEngine.h" +enum DamageNumberType{ + HEALTH_LOSS, + HEALTH_GAIN, + MANA_GAIN, + INTERRUPT +}; + struct DamageNumber{ vf2d pos; int damage; float lifeTime=0; float pauseTime=0; bool friendly=false; + bool invertedDirection=false; + DamageNumberType type=HEALTH_LOSS; const static float MOVE_UP_TIME; DamageNumber(); - DamageNumber(vf2d pos,int damage,bool friendly=false); + DamageNumber(vf2d pos,int damage,bool friendly=false,DamageNumberType type=HEALTH_LOSS); }; \ No newline at end of file diff --git a/Crawler/Monster.h b/Crawler/Monster.h index 238bfbf6..3518143d 100644 --- a/Crawler/Monster.h +++ b/Crawler/Monster.h @@ -37,7 +37,6 @@ SUCH DAMAGE. #include "State.h" #include "Buff.h" #include "olcUTIL_Animate2D.h" -#include "DamageNumber.h" #include "DEFINES.h" #include "Attributable.h" #include "Item.h" @@ -45,6 +44,7 @@ SUCH DAMAGE. INCLUDE_ITEM_DATA +struct DamageNumber; struct Player; class Crawler; diff --git a/Crawler/Player.cpp b/Crawler/Player.cpp index 3746cf52..b81457ae 100644 --- a/Crawler/Player.cpp +++ b/Crawler/Player.cpp @@ -248,7 +248,7 @@ void Player::Update(float fElapsedTime){ } while(manaTickTimer<=0){ manaTickTimer+=0.2; - RestoreMana(1); + RestoreMana(1,true); } for(std::vector::iterator it=buffList.begin();it!=buffList.end();++it){ Buff&b=*it; @@ -565,7 +565,7 @@ vf2d Player::GetVelocity(){ } bool Player::CanMove(){ - return state!=State::CASTING&&state!=State::ANIMATION_LOCK; + return state!=State::ANIMATION_LOCK; } bool Player::CanAct(){ @@ -632,6 +632,11 @@ Key Player::GetFacingDirection(){ } void Player::Moved(){ + if(state==State::CASTING){ + state=State::NORMAL; + castInfo={"",0}; + DAMAGENUMBER_LIST.push_back(std::make_shared(GetPos(),0,true,INTERRUPT)); + } for(MonsterSpawner&spawner:SPAWNER_LIST){ if(!spawner.SpawnTriggered()&&spawner.DoesUpperLevelSpawning()==OnUpperLevel()&&geom2d::contains(geom2d::rect{spawner.GetPos(),spawner.GetRange()},pos)){ spawner.SetTriggered(true); @@ -769,11 +774,17 @@ void Player::SetIframes(float duration){ bool Player::Heal(int damage){ hp=std::clamp(hp+damage,0,maxhp); + if(damage>0){ + DAMAGENUMBER_LIST.push_back(std::make_shared(GetPos(),damage,true,HEALTH_GAIN)); + } return true; } -void Player::RestoreMana(int amt){ +void Player::RestoreMana(int amt,bool suppressDamageNumber){ mana=std::clamp(mana+amt,0,maxmana); + if(amt>0&&!suppressDamageNumber){ + DAMAGENUMBER_LIST.push_back(std::make_shared(GetPos(),amt,true,MANA_GAIN)); + } } void Player::ConsumeMana(int amt){ diff --git a/Crawler/Player.h b/Crawler/Player.h index 3993136b..903c37f0 100644 --- a/Crawler/Player.h +++ b/Crawler/Player.h @@ -39,13 +39,13 @@ SUCH DAMAGE. #include "Ability.h" #include "Buff.h" #include "Pathfinding.h" -#include "DamageNumber.h" #include "config.h" #include "Key.h" #include "Class.h" #include "Item.h" #undef GetClassName +struct DamageNumber; struct CastInfo{ std::string name; @@ -170,7 +170,7 @@ public: bool CanAct(Ability&ability); void Knockback(vf2d vel); void SetIframes(float duration); - void RestoreMana(int amt); + void RestoreMana(int amt,bool suppressDamageNumber=false); void ConsumeMana(int amt); //Returns true if the move was valid and successful. bool SetX(float x); diff --git a/Crawler/Version.h b/Crawler/Version.h index aef483d9..946f54f5 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -35,7 +35,7 @@ SUCH DAMAGE. #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 1 -#define VERSION_BUILD 3127 +#define VERSION_BUILD 3137 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/x64/Release/Crawler.exe b/x64/Release/Crawler.exe index aeb32184..462eaccd 100644 Binary files a/x64/Release/Crawler.exe and b/x64/Release/Crawler.exe differ