diff --git a/Crawler/Ability.h b/Crawler/Ability.h index 85a2f587..d791a4f7 100644 --- a/Crawler/Ability.h +++ b/Crawler/Ability.h @@ -8,7 +8,7 @@ struct Ability{ float COOLDOWN_TIME=0; int manaCost=0; Pixel barColor1,barColor2; - std::functionaction; + std::functionaction=[&](){return false;}; Ability(); Ability(std::string name,float cooldownTime,int manaCost,Pixel barColor1=VERY_DARK_RED,Pixel barColor2=DARK_RED); }; \ No newline at end of file diff --git a/Crawler/BulletTypes.h b/Crawler/BulletTypes.h index 45a6b3a0..f14d4e0d 100644 --- a/Crawler/BulletTypes.h +++ b/Crawler/BulletTypes.h @@ -5,7 +5,7 @@ struct EnergyBolt:public Bullet{ float lastParticleSpawn=0; EnergyBolt(vf2d pos,vf2d vel,float radius,int damage,bool upperLevel,bool friendly=false,Pixel col=WHITE); void Update(float fElapsedTime)override; - bool PlayerHit(Player&player)override; + bool PlayerHit(Player*player)override; bool MonsterHit(Monster&monster)override; }; @@ -13,7 +13,7 @@ struct FireBolt:public Bullet{ float lastParticleSpawn=0; FireBolt(vf2d pos,vf2d vel,float radius,int damage,bool upperLevel,bool friendly=false,Pixel col=WHITE); void Update(float fElapsedTime)override; - bool PlayerHit(Player&player)override; + bool PlayerHit(Player*player)override; bool MonsterHit(Monster&monster)override; }; @@ -21,6 +21,6 @@ struct LightningBolt:public Bullet{ float lastParticleSpawn=0; LightningBolt(vf2d pos,vf2d vel,float radius,int damage,bool upperLevel,bool friendly=false,Pixel col=WHITE); void Update(float fElapsedTime)override; - bool PlayerHit(Player&player)override; + bool PlayerHit(Player*player)override; bool MonsterHit(Monster&monster)override; }; \ No newline at end of file diff --git a/Crawler/Class.cpp b/Crawler/Class.cpp deleted file mode 100644 index e924bd2f..00000000 --- a/Crawler/Class.cpp +++ /dev/null @@ -1,277 +0,0 @@ - -#include "DEFINES.h" -#include "Crawler.h" -#include "BulletTypes.h" - -INCLUDE_game -INCLUDE_MONSTER_LIST -INCLUDE_BULLET_LIST - -std::map>CLASS_DATA; - -void ClassData::InitializeClassData(){ - CLASS_DATA[WARRIOR]=std::make_unique(Warrior("Warrior",WARRIOR, - , - , - , - , - WARRIOR_WALK_N,WARRIOR_WALK_E,WARRIOR_WALK_S,WARRIOR_WALK_W, - WARRIOR_IDLE_N,WARRIOR_IDLE_E,WARRIOR_IDLE_S,WARRIOR_IDLE_W)); - CLASS_DATA[RANGER]=std::make_unique(Ranger("Ranger",RANGER, - {"Retreat",7,0,VERY_DARK_BLUE,DARK_BLUE}, - {"Rapid Fire",12,35}, - {"Charged Shot",15,40}, - {"Multishot",25,50}, - RANGER_WALK_N,RANGER_WALK_E,RANGER_WALK_S,RANGER_WALK_W, - RANGER_IDLE_N,RANGER_IDLE_E,RANGER_IDLE_S,RANGER_IDLE_W)); - CLASS_DATA[TRAPPER]=std::make_unique(Bard("Bard",TRAPPER, - {"???",7,0,VERY_DARK_BLUE,DARK_BLUE}, - {"???",12,0}, - {"???",15,0}, - {"???",25,0}, - WARRIOR_WALK_N,WARRIOR_WALK_E,WARRIOR_WALK_S,WARRIOR_WALK_W, - WARRIOR_IDLE_N,WARRIOR_IDLE_E,WARRIOR_IDLE_S,WARRIOR_IDLE_W)); - CLASS_DATA[WIZARD]=std::make_unique(Wizard("Wizard",WIZARD, - {"Teleport",8,5,VERY_DARK_BLUE,DARK_BLUE}, - {"Firebolt",6,30}, - {"Lightning Bolt",6,25}, - {"Meteor",40,75}, - WIZARD_WALK_N,WIZARD_WALK_E,WIZARD_WALK_S,WIZARD_WALK_W, - WIZARD_IDLE_N,WIZARD_IDLE_E,WIZARD_IDLE_S,WIZARD_IDLE_W)); - CLASS_DATA[WITCH]=std::make_unique(Witch("Witch",WITCH, - {"???",8,0,VERY_DARK_BLUE,DARK_BLUE}, - {"???",6,0}, - {"???",6,0}, - {"???",40,0}, - WARRIOR_WALK_N,WARRIOR_WALK_E,WARRIOR_WALK_S,WARRIOR_WALK_W, - WARRIOR_IDLE_N,WARRIOR_IDLE_E,WARRIOR_IDLE_S,WARRIOR_IDLE_W)); -} - -ClassData::ClassData(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w) - :name(name),cl(cl),rightClickAbility(rightClickAbility),ability1(ability1),ability2(ability2),ability3(ability3), - walk_n(walk_n),walk_e(walk_e),walk_s(walk_s),walk_w(walk_w),idle_n(idle_n),idle_w(idle_w),idle_s(idle_s),idle_e(idle_e) -{} - -Warrior::Warrior(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w) - :ClassData(name,cl,rightClickAbility,ability1,ability2,ability3, - walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w) -{} - -Thief::Thief(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w) - :ClassData(name,cl,rightClickAbility,ability1,ability2,ability3, - walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w) -{} - -void Thief::Update(float fElapsedTime){ -} - -bool Thief::AutoAttack(){ - return true; -} - -bool Thief::Ability1(){ - return true; -} - -bool Thief::Ability2(){ - return true; -} - -bool Thief::Ability3(){ - return true; -} - -bool Thief::RightClickAbility(){ - return true; -} - -Ranger::Ranger(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w) - :ClassData(name,cl,rightClickAbility,ability1,ability2,ability3, - walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w) -{} - -void Ranger::Update(float fElapsedTime){ -} - -bool Ranger::AutoAttack(){ - return true; -} - -bool Ranger::Ability1(){ - return true; -} - -bool Ranger::Ability2(){ - return true; -} - -bool Ranger::Ability3(){ - return true; -} - -bool Ranger::RightClickAbility(){ - return true; -} - -Bard::Bard(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w) - :ClassData(name,cl,rightClickAbility,ability1,ability2,ability3, - walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w) -{} - -void Bard::Update(float fElapsedTime){ -} - -bool Bard::AutoAttack(){ - return true; -} - -bool Bard::Ability1(){ - return true; -} - -bool Bard::Ability2(){ - return true; -} - -bool Bard::Ability3(){ - return true; -} - -bool Bard::RightClickAbility(){ - return true; -} - -Wizard::Wizard(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w) - :ClassData(name,cl,rightClickAbility,ability1,ability2,ability3, - walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w) -{} - -void Wizard::Update(float fElapsedTime){ - ACCESS_PLAYER - if(p->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; - } - if(p->GetState()==State::CASTING){ - switch(p->GetFacingDirection()){ - case UP:{ - p->UpdateAnimation(AnimationState::WIZARD_CAST_N); - }break; - case DOWN:{ - p->UpdateAnimation(AnimationState::WIZARD_CAST_S); - }break; - case LEFT:{ - p->UpdateAnimation(AnimationState::WIZARD_CAST_W); - }break; - case RIGHT:{ - p->UpdateAnimation(AnimationState::WIZARD_CAST_E); - }break; - } - } -} - -bool Wizard::AutoAttack(){ - ACCESS_PLAYER - p->attack_cooldown_timer=p->MAGIC_ATTACK_COOLDOWN; - float angleToCursor=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x); - BULLET_LIST.push_back(std::make_unique(EnergyBolt(p->GetPos(),{cos(angleToCursor)*200,sin(angleToCursor)*200},12,p->GetAttack(),p->upperLevel,true,WHITE))); - return true; -} - -bool Wizard::Ability1(){ - ACCESS_PLAYER - float angleToCursor=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x); - BULLET_LIST.push_back(std::make_unique(FireBolt(p->GetPos(),{cos(angleToCursor)*275,sin(angleToCursor)*275},12,p->GetAttack(),p->upperLevel,true,{240,120,60}))); - return true; -} - -bool Wizard::Ability2(){ - ACCESS_PLAYER - float angleToCursor=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x); - BULLET_LIST.push_back(std::make_unique(LightningBolt(p->GetPos(),{cos(angleToCursor)*230,sin(angleToCursor)*230},12,p->GetAttack()*4,p->upperLevel,true,WHITE))); - return true; -} - -bool Wizard::Ability3(){ - ACCESS_PLAYER - p->SetState(State::CASTING); - game->AddEffect(std::make_unique(p->GetPos(),3,AnimationState::METEOR,p->OnUpperLevel(),vf2d{1,1},2)); - return true; -} - -bool Wizard::RightClickAbility(){ - ACCESS_PLAYER - float pointMouseDirection=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x); - vf2d pointTowardsMouse={cos(pointMouseDirection),sin(pointMouseDirection)}; - float dist=std::clamp(geom2d::line{p->GetPos(),game->GetWorldMousePos()}.length(),0.f,6.5f*24); - if(dist<12)return false; - vf2d teleportPoint=p->GetPos()+pointTowardsMouse*dist; - while(dist>0&&game->HasTileCollision(game->GetCurrentLevel(),teleportPoint)&&p->CanPathfindTo(p->GetPos(),teleportPoint)){ - dist-=24; - teleportPoint=p->GetPos()+pointTowardsMouse*dist; - } - if(dist>0&&p->CanPathfindTo(p->GetPos(),teleportPoint)){ - p->SetState(State::TELEPORT); - p->teleportAnimationTimer=0.35; - p->teleportTarget=teleportPoint; - p->teleportStartPosition=p->GetPos(); - p->iframe_time=0.35; - for(int i=0;i<16;i++){ - game->AddEffect(std::make_unique(p->GetPos()+vf2d{(rand()%160-80)/10.f,(rand()%160-80)/10.f},float(rand()%300)/1000,AnimationState::DOT_PARTICLE,p->upperLevel,0.3,0.2,vf2d{float(rand()%1000-500)/100,float(rand()%1000-500)/100},BLACK)); - } - return true; - } else { - p->notificationDisplay={"Cannot Teleport to that location!",0.5}; - return false; - } -} - -Witch::Witch(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w) - :ClassData(name,cl,rightClickAbility,ability1,ability2,ability3, - walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w) -{} - -void Witch::Update(float fElapsedTime){ -} - -bool Witch::AutoAttack(){ - return true; -} - -bool Witch::Ability1(){ - return true; -} - -bool Witch::Ability2(){ - return true; -} - -bool Witch::Ability3(){ - return true; -} - -bool Witch::RightClickAbility(){ - return true; -} diff --git a/Crawler/Class.h b/Crawler/Class.h index b88846a2..155f44af 100644 --- a/Crawler/Class.h +++ b/Crawler/Class.h @@ -3,79 +3,13 @@ #include "Animation.h" #include "olcPixelGameEngine.h" +//Classes have bit-wise operator capabilities. enum Class{ - WARRIOR,THIEF,RANGER,TRAPPER,WIZARD,WITCH -}; -struct ClassData{ - static void InitializeClassData(); - ClassData(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w); - virtual ~ClassData()=default; - virtual void Update(float fElapsedTime)=0; - virtual bool AutoAttack()=0; - virtual bool Ability1()=0; - virtual bool Ability2()=0; - virtual bool Ability3()=0; - virtual bool RightClickAbility()=0; -}; - -struct Warrior:public ClassData{ - Warrior(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w); - void Update(float fElapsedTime)override; - bool AutoAttack()override; - bool Ability1()override; - bool Ability2()override; - bool Ability3()override; - bool RightClickAbility()override; -}; -struct Thief:public ClassData{ - Thief(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w); - void Update(float fElapsedTime)override; - bool AutoAttack()override; - bool Ability1()override; - bool Ability2()override; - bool Ability3()override; - bool RightClickAbility()override; -}; -struct Ranger:public ClassData{ - Ranger(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w); - void Update(float fElapsedTime)override; - bool AutoAttack()override; - bool Ability1()override; - bool Ability2()override; - bool Ability3()override; - bool RightClickAbility()override; -}; -struct Bard:public ClassData{ - Bard(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w); - void Update(float fElapsedTime)override; - bool AutoAttack()override; - bool Ability1()override; - bool Ability2()override; - bool Ability3()override; - bool RightClickAbility()override; -}; -struct Wizard:public ClassData{ - Wizard(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w); - void Update(float fElapsedTime)override; - bool AutoAttack()override; - bool Ability1()override; - bool Ability2()override; - bool Ability3()override; - bool RightClickAbility()override; -}; -struct Witch:public ClassData{ - Witch(std::string name,Class cl,Ability rightClickAbility,Ability ability1,Ability ability2,Ability ability3, - AnimationState walk_n,AnimationState walk_e,AnimationState walk_s,AnimationState walk_w,AnimationState idle_n,AnimationState idle_e,AnimationState idle_s,AnimationState idle_w); - void Update(float fElapsedTime)override; - bool AutoAttack()override; - bool Ability1()override; - bool Ability2()override; - bool Ability3()override; - bool RightClickAbility()override; + ANY=0, + WARRIOR=1, + THIEF=2, + RANGER=4, + TRAPPER=8, + WIZARD=16, + WITCH=32 }; \ No newline at end of file diff --git a/Crawler/Crawler b/Crawler/Crawler index 575555c6..55b44be9 100755 Binary files a/Crawler/Crawler and b/Crawler/Crawler differ diff --git a/Crawler/Crawler.cpp b/Crawler/Crawler.cpp index 37d56521..44c8df5e 100644 --- a/Crawler/Crawler.cpp +++ b/Crawler/Crawler.cpp @@ -15,7 +15,6 @@ #include #include "Emitter.h" -INCLUDE_CLASS_DATA INCLUDE_EMITTER_LIST //#define DEBUG_COLLISIONS //Shows collision hitboxes. @@ -40,11 +39,9 @@ bool Crawler::OnUserCreate(){ InitializeLevel("assets/Campaigns/1_1.tmx",CAMPAIGN_1_1); - #ifdef OLC_PLATFORM_EMSCRIPTEN - ConsoleCaptureStdOut(true); - #endif - - ClassData::InitializeClassData(); + std::cout<<"Player loading."<(); + std::cout<<"Player loaded."<ChangeClass(WARRIOR); + std::cout<<"Done Loading."<0){ switch(player->GetClass()){ case WARRIOR:{ - player->ChangeClass(RANGER); + ChangePlayerClass(RANGER); }break; case RANGER:{ - player->ChangeClass(WIZARD); + ChangePlayerClass(WIZARD); }break; case WIZARD:{ - player->ChangeClass(WARRIOR); + ChangePlayerClass(WARRIOR); }break; } } if(GetMouseWheel()<0){ switch(player->GetClass()){ case WARRIOR:{ - player->ChangeClass(WIZARD); + ChangePlayerClass(WIZARD); }break; case RANGER:{ - player->ChangeClass(WARRIOR); + ChangePlayerClass(WARRIOR); }break; case WIZARD:{ - player->ChangeClass(RANGER); + ChangePlayerClass(RANGER); }break; } } @@ -540,7 +540,7 @@ void Crawler::RenderWorld(float fElapsedTime){ if(player->GetZ()>0){ vf2d shadowScale=vf2d{8/3.f,1}/std::max(1.f,player->GetZ()/4); - view.DrawDecal(player->GetPos()-vf2d{3,3}*shadowScale/2+vf2d{0,6},GFX_Circle.Decal(),shadowScale); + view.DrawDecal(player->GetPos()-vf2d{3,3}*shadowScale/2+vf2d{0,6},GFX_Circle.Decal(),shadowScale,BLACK); } for(Effect*e:backgroundEffectsLower){ e->Draw(); @@ -679,10 +679,11 @@ void Crawler::RenderHud(){ return newName; }; std::vectorcooldowns{ - player->rightClickAbility, - player->ability1, - player->ability2, - player->ability3 + player->GetRightClickAbility(), + player->GetAbility1(), + player->GetAbility2(), + player->GetAbility3(), + player->GetAbility4(), }; std::vectoractiveCooldowns; std::copy_if(cooldowns.begin(),cooldowns.end(),std::back_inserter(activeCooldowns),[](Ability a){ @@ -752,6 +753,7 @@ void Crawler::SetupWorldShake(float duration){ void Crawler::InitializeLevel(std::string mapFile,MapName map){ TMXParser level(mapFile); + std::cout<<"Done parsing."<Load("assets/maps/"+tileset.GetData().ImageData.data["source"]); + std::cout<<"Done loading. "<>monster_list; @@ -789,6 +795,7 @@ void Crawler::LoadLevel(MapName map){ } SPAWNER_LIST.push_back(MonsterSpawner{{spawnData.ObjectData.GetFloat("x"),spawnData.ObjectData.GetFloat("y")},spawnerRadius*2,monster_list,spawnData.upperLevel}); } + std::cout<<"Spawner lists done."<foregroundTilesAdded,upperForegroundTilesAdded; for(int x=0;xupperLevel=false; //Assume player starts on lower level. player->SetPos(MAP_DATA[map].MapData.playerSpawnLocation); + std::cout<<"Player spawn info set."<MONSTER_DATA; #define INCLUDE_BULLET_LIST extern std::vector>BULLET_LIST; -#define INCLUDE_CLASS_DATA extern std::map>CLASS_DATA; #define INCLUDE_PARTICLE_LIST extern std::vectorPARTICLE_LIST; #define INCLUDE_EMITTER_LIST extern std::vector>EMITTER_LIST; @@ -15,10 +14,19 @@ #define INFINITE 999999 #define SETUP_CLASS(class) \ +class::class(){InitializeClassAbilities();} \ Class class::GetClass(){return cl;} \ std::string class::GetClassName(){return name;} \ Ability&class::GetRightClickAbility(){return rightClickAbility;}; \ Ability&class::GetAbility1(){return ability1;}; \ Ability&class::GetAbility2(){return ability2;}; \ Ability&class::GetAbility3(){return ability3;}; \ -Ability&class::GetAbility4(){return ability4;}; \ No newline at end of file +Ability&class::GetAbility4(){return ability4;}; \ +AnimationState&class::GetWalkNAnimation(){return walk_n;}; \ +AnimationState&class::GetWalkEAnimation(){return walk_e;}; \ +AnimationState&class::GetWalkSAnimation(){return walk_s;}; \ +AnimationState&class::GetWalkWAnimation(){return walk_w;}; \ +AnimationState&class::GetIdleNAnimation(){return idle_n;}; \ +AnimationState&class::GetIdleEAnimation(){return idle_e;}; \ +AnimationState&class::GetIdleSAnimation(){return idle_s;}; \ +AnimationState&class::GetIdleWAnimation(){return idle_w;}; \ No newline at end of file diff --git a/Crawler/Emitter.cpp b/Crawler/Emitter.cpp index f619ff55..b852a5ed 100644 --- a/Crawler/Emitter.cpp +++ b/Crawler/Emitter.cpp @@ -15,4 +15,5 @@ bool Emitter::Update(float fElapsedTime){ if(timer<0){ return false; } + return true; } \ No newline at end of file diff --git a/Crawler/Emitter.h b/Crawler/Emitter.h index 7ae7fcf2..df7e6f33 100644 --- a/Crawler/Emitter.h +++ b/Crawler/Emitter.h @@ -1,5 +1,5 @@ -#include "olcPixelGameEngine.h" #pragma once +#include "olcPixelGameEngine.h" struct Emitter{ float frequency; diff --git a/Crawler/EnergyBolt.cpp b/Crawler/EnergyBolt.cpp index 0b463fe1..fe8f787d 100644 --- a/Crawler/EnergyBolt.cpp +++ b/Crawler/EnergyBolt.cpp @@ -17,11 +17,11 @@ void EnergyBolt::Update(float fElapsedTime){ } } -bool EnergyBolt::PlayerHit(Player& player) +bool EnergyBolt::PlayerHit(Player*player) { deactivated=true; fadeOutTime=0.2f; - game->AddEffect(std::make_unique(player.GetPos(),0,AnimationState::SPLASH_EFFECT,upperLevel,player.GetSizeMult(),0.25)); + game->AddEffect(std::make_unique(player->GetPos(),0,AnimationState::SPLASH_EFFECT,upperLevel,player->GetSizeMult(),0.25)); return false; } diff --git a/Crawler/FireBolt.cpp b/Crawler/FireBolt.cpp index 8a66a456..bcfb0d69 100644 --- a/Crawler/FireBolt.cpp +++ b/Crawler/FireBolt.cpp @@ -18,11 +18,11 @@ void FireBolt::Update(float fElapsedTime){ } } -bool FireBolt::PlayerHit(Player& player) +bool FireBolt::PlayerHit(Player*player) { deactivated=true; fadeOutTime=0.2f; - game->AddEffect(std::make_unique(player.GetPos(),0,AnimationState::SPLASH_EFFECT,upperLevel,5,0.25,vf2d{},Pixel{240,120,60})); + game->AddEffect(std::make_unique(player->GetPos(),0,AnimationState::SPLASH_EFFECT,upperLevel,5,0.25,vf2d{},Pixel{240,120,60})); return false; } diff --git a/Crawler/LightningBolt.cpp b/Crawler/LightningBolt.cpp index e7d248b3..b4b04cfe 100644 --- a/Crawler/LightningBolt.cpp +++ b/Crawler/LightningBolt.cpp @@ -34,11 +34,11 @@ void LightningBolt::Update(float fElapsedTime){ } } -bool LightningBolt::PlayerHit(Player& player) +bool LightningBolt::PlayerHit(Player*player) { deactivated=true; fadeOutTime=0.2f; - game->AddEffect(std::make_unique(player.GetPos(),0.3,AnimationState::LIGHTNING_SPLASH,upperLevel,player.GetSizeMult(),0.25,vf2d{},WHITE,util::random(PI))); + game->AddEffect(std::make_unique(player->GetPos(),0.3,AnimationState::LIGHTNING_SPLASH,upperLevel,player->GetSizeMult(),0.25,vf2d{},WHITE,util::random(PI))); return false; } diff --git a/Crawler/Monster.cpp b/Crawler/Monster.cpp index e3be35fd..f557572c 100644 --- a/Crawler/Monster.cpp +++ b/Crawler/Monster.cpp @@ -285,10 +285,10 @@ void Monster::Draw(){ game->view.DrawPartialDecal(GetPos()-vf2d{12,12}*GetSizeMult(),GetFrame().GetSourceImage()->Decal(),GetFrame().GetSourceRect().pos,GetFrame().GetSourceRect().size,vf2d(GetSizeMult(),GetSizeMult()),GetBuffs(BuffType::SLOWDOWN).size()>0?Pixel{uint8_t(255*abs(sin(1.4*GetBuffs(BuffType::SLOWDOWN)[0].duration))),uint8_t(255*abs(sin(1.4*GetBuffs(BuffType::SLOWDOWN)[0].duration))),uint8_t(128+127*abs(sin(1.4*GetBuffs(BuffType::SLOWDOWN)[0].duration)))}:WHITE); } } -void Monster::Collision(Player&p){ +void Monster::Collision(Player*p){ if(MONSTER_DATA[type].GetCollisionDmg()>0&&!hasHitPlayer){ hasHitPlayer=true; - p.Hurt(MONSTER_DATA[type].GetCollisionDmg()); + p->Hurt(MONSTER_DATA[type].GetCollisionDmg()); } Collision(); } diff --git a/Crawler/Monster.h b/Crawler/Monster.h index 698859b5..37a81c11 100644 --- a/Crawler/Monster.h +++ b/Crawler/Monster.h @@ -2,9 +2,11 @@ #include "olcPixelGameEngine.h" #include "Animation.h" #include "State.h" -#include "Player.h" +#include "Buff.h" #include "olcUTIL_Animate2D.h" +struct Player; + enum MonsterStrategy{ RUN_TOWARDS, SHOOT_AFAR @@ -101,7 +103,7 @@ protected: vf2d&GetTargetPos(); Key GetFacingDirection(); void Draw(); - void Collision(Player&p); + void Collision(Player*p); void Collision(Monster&p); void Collision(); void SetVelocity(vf2d vel); diff --git a/Crawler/Player.cpp b/Crawler/Player.cpp index e58d7ced..cf4bb8f0 100644 --- a/Crawler/Player.cpp +++ b/Crawler/Player.cpp @@ -12,13 +12,12 @@ INCLUDE_ANIMATION_DATA INCLUDE_SPAWNER_LIST INCLUDE_BULLET_LIST INCLUDE_DAMAGENUMBER_LIST -INCLUDE_CLASS_DATA INCLUDE_game const float Player::GROUND_SLAM_SPIN_TIME=0.6f; -Player::Player(): - state(State::NORMAL),lastReleasedMovementKey(DOWN),facingDirection(DOWN){} +Player::Player() + :state(State::NORMAL),lastReleasedMovementKey(DOWN),facingDirection(DOWN){} bool Player::SetX(float x){ vf2d newPos={x,pos.y}; @@ -151,10 +150,10 @@ State Player::GetState(){ void Player::Update(float fElapsedTime){ Ability&rightClickAbility=GetRightClickAbility(), - ability1=GetAbility1(), - ability2=GetAbility2(), - ability3=GetAbility3(), - ability4=GetAbility4(); + &ability1=GetAbility1(), + &ability2=GetAbility2(), + &ability3=GetAbility3(), + &ability4=GetAbility4(); attack_cooldown_timer=std::max(0.f,attack_cooldown_timer-fElapsedTime); iframe_time=std::max(0.f,iframe_time-fElapsedTime); notEnoughManaDisplay.second=std::max(0.f,notEnoughManaDisplay.second-fElapsedTime); @@ -173,7 +172,7 @@ void Player::Update(float fElapsedTime){ } } //Class-specific update events. - Update(fElapsedTime); + OnUpdate(fElapsedTime); switch(state){ case SPIN:{ switch(facingDirection){ @@ -258,7 +257,7 @@ void Player::Update(float fElapsedTime){ for(Monster&m:MONSTER_LIST){ if(iframe_time==0&&OnUpperLevel()==m.OnUpperLevel()&&geom2d::overlaps(geom2d::circle(pos,12*size/2),geom2d::circle(m.GetPos(),12*m.GetSizeMult()/2))){ if(m.IsAlive()){ - m.Collision(*this); + m.Collision(this); } geom2d::line line(pos,m.GetPos()); float dist = line.length(); @@ -390,8 +389,10 @@ void Player::AddAnimation(AnimationState state){ animation.AddState(state,ANIMATION_DATA[state]); } -void Player::UpdateAnimation(AnimationState animState){ - animation.ChangeState(internal_animState,animState); +void Player::UpdateAnimation(AnimationState animState,int specificClass){ + if(specificClass==ANY||specificClass&GetClass()){ + animation.ChangeState(internal_animState,animState); + } } Animate2D::Frame Player::GetFrame(){ diff --git a/Crawler/Player.h b/Crawler/Player.h index 211413ed..be8c051f 100644 --- a/Crawler/Player.h +++ b/Crawler/Player.h @@ -31,8 +31,8 @@ struct Player{ Animate2D::Animationanimation; Animate2D::AnimationState internal_animState; Key lastReleasedMovementKey; - void AddAnimation(AnimationState state); void Update(float fElapsedTime); + void AddAnimation(AnimationState state); std::vectorbuffList; protected: const float ATTACK_COOLDOWN=0.35f; @@ -90,7 +90,8 @@ public: std::vectorGetBuffs(BuffType buff); bool Hurt(int damage); - void UpdateAnimation(AnimationState animState); + //specificClass is a bitwise-combination of classes from the Class enum. It makes sure certain animations only play if you are a certain class. + void UpdateAnimation(AnimationState animState,int specificClass=ANY); Animate2D::Frame GetFrame(); Key GetLastReleasedMovementKey(); float GetSwordSwingTimer(); @@ -100,6 +101,7 @@ public: virtual ~Player()=default; virtual Class GetClass()=0; virtual bool AutoAttack()=0; + virtual void OnUpdate(float fElapsedTime)=0; virtual void InitializeClassAbilities()=0; virtual std::string GetClassName()=0; virtual Ability&GetRightClickAbility()=0; @@ -107,14 +109,14 @@ public: virtual Ability&GetAbility2()=0; virtual Ability&GetAbility3()=0; virtual Ability&GetAbility4()=0; - virtual AnimationState GetWalkNAnimation()=0; - virtual AnimationState GetWalkEAnimation()=0; - virtual AnimationState GetWalkSAnimation()=0; - virtual AnimationState GetWalkWAnimation()=0; - virtual AnimationState GetIdleNAnimation()=0; - virtual AnimationState GetIdleEAnimation()=0; - virtual AnimationState GetIdleSAnimation()=0; - virtual AnimationState GetIdleWAnimation()=0; + virtual AnimationState&GetWalkNAnimation()=0; + virtual AnimationState&GetWalkEAnimation()=0; + virtual AnimationState&GetWalkSAnimation()=0; + virtual AnimationState&GetWalkWAnimation()=0; + virtual AnimationState&GetIdleNAnimation()=0; + virtual AnimationState&GetIdleEAnimation()=0; + virtual AnimationState&GetIdleSAnimation()=0; + virtual AnimationState&GetIdleWAnimation()=0; }; struct Warrior:Player{ @@ -122,8 +124,140 @@ struct Warrior:Player{ static Class cl; static Ability rightClickAbility,ability1,ability2,ability3,ability4; static AnimationState walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w; + Warrior(); + Class GetClass()override; + bool AutoAttack()override; + void OnUpdate(float fElapsedTime)override; + void InitializeClassAbilities()override; + std::string GetClassName()override; + Ability&GetRightClickAbility()override; + Ability&GetAbility1()override; + Ability&GetAbility2()override; + Ability&GetAbility3()override; + Ability&GetAbility4()override; + AnimationState&GetWalkNAnimation()override; + AnimationState&GetWalkEAnimation()override; + AnimationState&GetWalkSAnimation()override; + AnimationState&GetWalkWAnimation()override; + AnimationState&GetIdleNAnimation()override; + AnimationState&GetIdleEAnimation()override; + AnimationState&GetIdleSAnimation()override; + AnimationState&GetIdleWAnimation()override; +}; + +struct Thief:Player{ + static std::string name; + static Class cl; + static Ability rightClickAbility,ability1,ability2,ability3,ability4; + static AnimationState walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w; + Thief(); + Class GetClass()override; + bool AutoAttack()override; + void OnUpdate(float fElapsedTime)override; + void InitializeClassAbilities()override; + std::string GetClassName()override; + Ability&GetRightClickAbility()override; + Ability&GetAbility1()override; + Ability&GetAbility2()override; + Ability&GetAbility3()override; + Ability&GetAbility4()override; + AnimationState&GetWalkNAnimation()override; + AnimationState&GetWalkEAnimation()override; + AnimationState&GetWalkSAnimation()override; + AnimationState&GetWalkWAnimation()override; + AnimationState&GetIdleNAnimation()override; + AnimationState&GetIdleEAnimation()override; + AnimationState&GetIdleSAnimation()override; + AnimationState&GetIdleWAnimation()override; +}; + +struct Ranger:Player{ + static std::string name; + static Class cl; + static Ability rightClickAbility,ability1,ability2,ability3,ability4; + static AnimationState walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w; + Ranger(); + Class GetClass()override; + bool AutoAttack()override; + void OnUpdate(float fElapsedTime)override; + void InitializeClassAbilities()override; + std::string GetClassName()override; + Ability&GetRightClickAbility()override; + Ability&GetAbility1()override; + Ability&GetAbility2()override; + Ability&GetAbility3()override; + Ability&GetAbility4()override; + AnimationState&GetWalkNAnimation()override; + AnimationState&GetWalkEAnimation()override; + AnimationState&GetWalkSAnimation()override; + AnimationState&GetWalkWAnimation()override; + AnimationState&GetIdleNAnimation()override; + AnimationState&GetIdleEAnimation()override; + AnimationState&GetIdleSAnimation()override; + AnimationState&GetIdleWAnimation()override; +}; + +struct Trapper:Player{ + static std::string name; + static Class cl; + static Ability rightClickAbility,ability1,ability2,ability3,ability4; + static AnimationState walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w; + Trapper(); + Class GetClass()override; + bool AutoAttack()override; + void OnUpdate(float fElapsedTime)override; + void InitializeClassAbilities()override; + std::string GetClassName()override; + Ability&GetRightClickAbility()override; + Ability&GetAbility1()override; + Ability&GetAbility2()override; + Ability&GetAbility3()override; + Ability&GetAbility4()override; + AnimationState&GetWalkNAnimation()override; + AnimationState&GetWalkEAnimation()override; + AnimationState&GetWalkSAnimation()override; + AnimationState&GetWalkWAnimation()override; + AnimationState&GetIdleNAnimation()override; + AnimationState&GetIdleEAnimation()override; + AnimationState&GetIdleSAnimation()override; + AnimationState&GetIdleWAnimation()override; +}; + +struct Wizard:Player{ + static std::string name; + static Class cl; + static Ability rightClickAbility,ability1,ability2,ability3,ability4; + static AnimationState walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w; + Wizard(); + Class GetClass()override; + bool AutoAttack()override; + void OnUpdate(float fElapsedTime)override; + void InitializeClassAbilities()override; + std::string GetClassName()override; + Ability&GetRightClickAbility()override; + Ability&GetAbility1()override; + Ability&GetAbility2()override; + Ability&GetAbility3()override; + Ability&GetAbility4()override; + AnimationState&GetWalkNAnimation()override; + AnimationState&GetWalkEAnimation()override; + AnimationState&GetWalkSAnimation()override; + AnimationState&GetWalkWAnimation()override; + AnimationState&GetIdleNAnimation()override; + AnimationState&GetIdleEAnimation()override; + AnimationState&GetIdleSAnimation()override; + AnimationState&GetIdleWAnimation()override; +}; + +struct Witch:Player{ + static std::string name; + static Class cl; + static Ability rightClickAbility,ability1,ability2,ability3,ability4; + static AnimationState walk_n,walk_e,walk_s,walk_w,idle_n,idle_e,idle_s,idle_w; + Witch(); Class GetClass()override; bool AutoAttack()override; + void OnUpdate(float fElapsedTime)override; void InitializeClassAbilities()override; std::string GetClassName()override; Ability&GetRightClickAbility()override; @@ -131,12 +265,12 @@ struct Warrior:Player{ Ability&GetAbility2()override; Ability&GetAbility3()override; Ability&GetAbility4()override; - AnimationState GetWalkNAnimation()override; - AnimationState GetWalkEAnimation()override; - AnimationState GetWalkSAnimation()override; - AnimationState GetWalkWAnimation()override; - AnimationState GetIdleNAnimation()override; - AnimationState GetIdleEAnimation()override; - AnimationState GetIdleSAnimation()override; - AnimationState GetIdleWAnimation()override; + AnimationState&GetWalkNAnimation()override; + AnimationState&GetWalkEAnimation()override; + AnimationState&GetWalkSAnimation()override; + AnimationState&GetWalkWAnimation()override; + AnimationState&GetIdleNAnimation()override; + AnimationState&GetIdleEAnimation()override; + AnimationState&GetIdleSAnimation()override; + AnimationState&GetIdleWAnimation()override; }; \ No newline at end of file diff --git a/Crawler/Ranger.cpp b/Crawler/Ranger.cpp new file mode 100644 index 00000000..cd532d89 --- /dev/null +++ b/Crawler/Ranger.cpp @@ -0,0 +1,62 @@ +#include "Class.h" +#include "olcPixelGameEngine.h" +#include "DEFINES.h" +#include "Player.h" +#include "Effect.h" +#include "Crawler.h" + +INCLUDE_MONSTER_LIST +INCLUDE_BULLET_LIST +INCLUDE_game + +std::string Ranger::name="Ranger"; +Class Ranger::cl=RANGER; +Ability Ranger::rightClickAbility={"Retreat",7,0,VERY_DARK_BLUE,DARK_BLUE}; +Ability Ranger::ability1={"Rapid Fire",12,35}; +Ability Ranger::ability2={"Charged Shot",15,40}; +Ability Ranger::ability3={"Multishot",25,50}; +Ability Ranger::ability4={"???",0,0}; +AnimationState Ranger::idle_n=RANGER_IDLE_N; +AnimationState Ranger::idle_e=RANGER_IDLE_E; +AnimationState Ranger::idle_s=RANGER_IDLE_S; +AnimationState Ranger::idle_w=RANGER_IDLE_W; +AnimationState Ranger::walk_n=RANGER_WALK_N; +AnimationState Ranger::walk_e=RANGER_WALK_E; +AnimationState Ranger::walk_s=RANGER_WALK_S; +AnimationState Ranger::walk_w=RANGER_WALK_W; + +SETUP_CLASS(Ranger) + +void Ranger::OnUpdate(float fElapsedTime){ + +} + +bool Ranger::AutoAttack(){ + return false; +} +void Ranger::InitializeClassAbilities(){ + #pragma region Ranger Right-click Ability (???) + Ranger::rightClickAbility.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Ranger Ability 1 (???) + Ranger::ability1.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Ranger Ability 2 (???) + Ranger::ability2.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Ranger Ability 3 (???) + Ranger::ability3.action= + [&](){ + return false; + }; + #pragma endregion +} \ No newline at end of file diff --git a/Crawler/TSXParser.h b/Crawler/TSXParser.h index 3830f70e..90167551 100644 --- a/Crawler/TSXParser.h +++ b/Crawler/TSXParser.h @@ -18,7 +18,7 @@ struct Tileset{ class TSXParser{ public: - Tileset GetData(); + Tileset&GetData(); private: Tileset parsedTilesetInfo; void ParseTag(std::string tag); @@ -31,7 +31,7 @@ class TSXParser{ #ifdef TSX_PARSER_SETUP #undef TSX_PARSER_SETUP - Tileset TSXParser::GetData() { + Tileset&TSXParser::GetData() { return parsedTilesetInfo; } std::ostream&operator<<(std::ostream& os, Tileset& rhs){ diff --git a/Crawler/Thief.cpp b/Crawler/Thief.cpp new file mode 100644 index 00000000..bfc25cbe --- /dev/null +++ b/Crawler/Thief.cpp @@ -0,0 +1,62 @@ +#include "Class.h" +#include "olcPixelGameEngine.h" +#include "DEFINES.h" +#include "Player.h" +#include "Effect.h" +#include "Crawler.h" + +INCLUDE_MONSTER_LIST +INCLUDE_BULLET_LIST +INCLUDE_game + +std::string Thief::name="Thief"; +Class Thief::cl=THIEF; +Ability Thief::rightClickAbility={"???",15,0,VERY_DARK_BLUE,DARK_BLUE}; +Ability Thief::ability1={"???",12,40}; +Ability Thief::ability2={"???",15,50}; +Ability Thief::ability3={"???",40,60}; +Ability Thief::ability4={"???",0,0}; +AnimationState Thief::idle_n=WARRIOR_IDLE_N; +AnimationState Thief::idle_e=WARRIOR_IDLE_E; +AnimationState Thief::idle_s=WARRIOR_IDLE_S; +AnimationState Thief::idle_w=WARRIOR_IDLE_W; +AnimationState Thief::walk_n=WARRIOR_WALK_N; +AnimationState Thief::walk_e=WARRIOR_WALK_E; +AnimationState Thief::walk_s=WARRIOR_WALK_S; +AnimationState Thief::walk_w=WARRIOR_WALK_W; + +SETUP_CLASS(Thief) + +void Thief::OnUpdate(float fElapsedTime){ + +} + +bool Thief::AutoAttack(){ + return false; +} +void Thief::InitializeClassAbilities(){ + #pragma region Thief Right-click Ability (???) + Thief::rightClickAbility.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Thief Ability 1 (???) + Thief::ability1.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Thief Ability 2 (???) + Thief::ability2.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Thief Ability 3 (???) + Thief::ability3.action= + [&](){ + return false; + }; + #pragma endregion +} \ No newline at end of file diff --git a/Crawler/Trapper.cpp b/Crawler/Trapper.cpp new file mode 100644 index 00000000..ce7100ac --- /dev/null +++ b/Crawler/Trapper.cpp @@ -0,0 +1,62 @@ +#include "Class.h" +#include "olcPixelGameEngine.h" +#include "DEFINES.h" +#include "Player.h" +#include "Effect.h" +#include "Crawler.h" + +INCLUDE_MONSTER_LIST +INCLUDE_BULLET_LIST +INCLUDE_game + +std::string Trapper::name="Trapper"; +Class Trapper::cl=TRAPPER; +Ability Trapper::rightClickAbility={"???",15,0,VERY_DARK_BLUE,DARK_BLUE}; +Ability Trapper::ability1={"???",12,40}; +Ability Trapper::ability2={"???",15,50}; +Ability Trapper::ability3={"???",40,60}; +Ability Trapper::ability4={"???",0,0}; +AnimationState Trapper::idle_n=WARRIOR_IDLE_N; +AnimationState Trapper::idle_e=WARRIOR_IDLE_E; +AnimationState Trapper::idle_s=WARRIOR_IDLE_S; +AnimationState Trapper::idle_w=WARRIOR_IDLE_W; +AnimationState Trapper::walk_n=WARRIOR_WALK_N; +AnimationState Trapper::walk_e=WARRIOR_WALK_E; +AnimationState Trapper::walk_s=WARRIOR_WALK_S; +AnimationState Trapper::walk_w=WARRIOR_WALK_W; + +SETUP_CLASS(Trapper) + +void Trapper::OnUpdate(float fElapsedTime){ + +} + +bool Trapper::AutoAttack(){ + return false; +} +void Trapper::InitializeClassAbilities(){ + #pragma region Trapper Right-click Ability (???) + Trapper::rightClickAbility.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Trapper Ability 1 (???) + Trapper::ability1.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Trapper Ability 2 (???) + Trapper::ability2.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Trapper Ability 3 (???) + Trapper::ability3.action= + [&](){ + return false; + }; + #pragma endregion +} \ No newline at end of file diff --git a/Crawler/Warrior.cpp b/Crawler/Warrior.cpp index 9788ed8f..57a814ea 100644 --- a/Crawler/Warrior.cpp +++ b/Crawler/Warrior.cpp @@ -16,9 +16,21 @@ Ability Warrior::ability1={"Battlecry",12,40}; Ability Warrior::ability2={"Ground Slam",15,50}; Ability Warrior::ability3={"Sonic Slash",40,60}; Ability Warrior::ability4={"???",0,0}; +AnimationState Warrior::idle_n=WARRIOR_IDLE_N; +AnimationState Warrior::idle_e=WARRIOR_IDLE_E; +AnimationState Warrior::idle_s=WARRIOR_IDLE_S; +AnimationState Warrior::idle_w=WARRIOR_IDLE_W; +AnimationState Warrior::walk_n=WARRIOR_WALK_N; +AnimationState Warrior::walk_e=WARRIOR_WALK_E; +AnimationState Warrior::walk_s=WARRIOR_WALK_S; +AnimationState Warrior::walk_w=WARRIOR_WALK_W; SETUP_CLASS(Warrior) +void Warrior::OnUpdate(float fElapsedTime){ + +} + bool Warrior::AutoAttack(){ if(GetState()!=State::SPIN){ bool attack=false; @@ -39,16 +51,16 @@ bool Warrior::AutoAttack(){ SetState(State::SWING_SWORD); switch(facingDirection){ case DOWN:{ - UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_S); + UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_S,WARRIOR|THIEF); }break; case RIGHT:{ - UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_E); + UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_E,WARRIOR|THIEF); }break; case LEFT:{ - UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_W); + UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_W,WARRIOR|THIEF); }break; case UP:{ - UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_N); + UpdateAnimation(AnimationState::WARRIOR_SWINGSWORD_N,WARRIOR|THIEF); }break; } } @@ -100,22 +112,22 @@ void Warrior::InitializeClassAbilities(){ case UP:{ vel.y=70; bulletVel.y=-400; - UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_N); + UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_N,WARRIOR); }break; case LEFT:{ vel.x=70; bulletVel.x=-400; - UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_W); + UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_W,WARRIOR); }break; case RIGHT:{ vel.x=-70; bulletVel.x=400; - UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_E); + UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_E,WARRIOR); }break; case DOWN:{ vel.y=-70; bulletVel.y=400; - UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_S); + UpdateAnimation(AnimationState::WARRIOR_SWINGSONICSWORD_S,WARRIOR); }break; } BULLET_LIST.push_back(std::make_unique(GetPos(),bulletVel,30,GetAttack()*8,AnimationState::SONICSLASH,upperLevel,true,2.25,true,true,WHITE)); diff --git a/Crawler/Witch.cpp b/Crawler/Witch.cpp new file mode 100644 index 00000000..5b4668a2 --- /dev/null +++ b/Crawler/Witch.cpp @@ -0,0 +1,62 @@ +#include "Class.h" +#include "olcPixelGameEngine.h" +#include "DEFINES.h" +#include "Player.h" +#include "Effect.h" +#include "Crawler.h" + +INCLUDE_MONSTER_LIST +INCLUDE_BULLET_LIST +INCLUDE_game + +std::string Witch::name="Witch"; +Class Witch::cl=WITCH; +Ability Witch::rightClickAbility={"???",15,0,VERY_DARK_BLUE,DARK_BLUE}; +Ability Witch::ability1={"???",12,40}; +Ability Witch::ability2={"???",15,50}; +Ability Witch::ability3={"???",40,60}; +Ability Witch::ability4={"???",0,0}; +AnimationState Witch::idle_n=WARRIOR_IDLE_N; +AnimationState Witch::idle_e=WARRIOR_IDLE_E; +AnimationState Witch::idle_s=WARRIOR_IDLE_S; +AnimationState Witch::idle_w=WARRIOR_IDLE_W; +AnimationState Witch::walk_n=WARRIOR_WALK_N; +AnimationState Witch::walk_e=WARRIOR_WALK_E; +AnimationState Witch::walk_s=WARRIOR_WALK_S; +AnimationState Witch::walk_w=WARRIOR_WALK_W; + +SETUP_CLASS(Witch) + +void Witch::OnUpdate(float fElapsedTime){ + +} + +bool Witch::AutoAttack(){ + return false; +} +void Witch::InitializeClassAbilities(){ + #pragma region Witch Right-click Ability (???) + Witch::rightClickAbility.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Witch Ability 1 (???) + Witch::ability1.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Witch Ability 2 (???) + Witch::ability2.action= + [&](){ + return false; + }; + #pragma endregion + #pragma region Witch Ability 3 (???) + Witch::ability3.action= + [&](){ + return false; + }; + #pragma endregion +} \ No newline at end of file diff --git a/Crawler/Wizard.cpp b/Crawler/Wizard.cpp new file mode 100644 index 00000000..39df1c67 --- /dev/null +++ b/Crawler/Wizard.cpp @@ -0,0 +1,128 @@ +#include "Class.h" +#include "olcPixelGameEngine.h" +#include "DEFINES.h" +#include "Player.h" +#include "Effect.h" +#include "Crawler.h" +#include "BulletTypes.h" + +INCLUDE_MONSTER_LIST +INCLUDE_BULLET_LIST +INCLUDE_game + +std::string Wizard::name="Wizard"; +Class Wizard::cl=WIZARD; +Ability Wizard::rightClickAbility={"Teleport",8,5,VERY_DARK_BLUE,DARK_BLUE}; +Ability Wizard::ability1={"Firebolt",6,30}; +Ability Wizard::ability2={"Lightning Bolt",6,25}; +Ability Wizard::ability3={"Meteor",40,75}; +Ability Wizard::ability4={"???",0,0}; +AnimationState Wizard::idle_n=WIZARD_IDLE_N; +AnimationState Wizard::idle_e=WIZARD_IDLE_E; +AnimationState Wizard::idle_s=WIZARD_IDLE_S; +AnimationState Wizard::idle_w=WIZARD_IDLE_W; +AnimationState Wizard::walk_n=WIZARD_WALK_N; +AnimationState Wizard::walk_e=WIZARD_WALK_E; +AnimationState Wizard::walk_s=WIZARD_WALK_S; +AnimationState Wizard::walk_w=WIZARD_WALK_W; + +SETUP_CLASS(Wizard) + +void Wizard::OnUpdate(float fElapsedTime){ + if(attack_cooldown_timer>0){ + idle_n=AnimationState::WIZARD_IDLE_ATTACK_N; + idle_e=AnimationState::WIZARD_IDLE_ATTACK_E; + idle_s=AnimationState::WIZARD_IDLE_ATTACK_S; + idle_w=AnimationState::WIZARD_IDLE_ATTACK_W; + walk_n=AnimationState::WIZARD_ATTACK_N; + walk_e=AnimationState::WIZARD_ATTACK_E; + walk_s=AnimationState::WIZARD_ATTACK_S; + walk_w=AnimationState::WIZARD_ATTACK_W; + } else { + idle_n=AnimationState::WIZARD_IDLE_N; + idle_e=AnimationState::WIZARD_IDLE_E; + idle_s=AnimationState::WIZARD_IDLE_S; + idle_w=AnimationState::WIZARD_IDLE_W; + walk_n=AnimationState::WIZARD_WALK_N; + walk_e=AnimationState::WIZARD_WALK_E; + walk_s=AnimationState::WIZARD_WALK_S; + walk_w=AnimationState::WIZARD_WALK_W; + } + if(GetState()==State::CASTING){ + switch(GetFacingDirection()){ + case UP:{ + UpdateAnimation(AnimationState::WIZARD_CAST_N,WIZARD|WITCH); + }break; + case DOWN:{ + UpdateAnimation(AnimationState::WIZARD_CAST_S,WIZARD|WITCH); + }break; + case LEFT:{ + UpdateAnimation(AnimationState::WIZARD_CAST_W,WIZARD|WITCH); + }break; + case RIGHT:{ + UpdateAnimation(AnimationState::WIZARD_CAST_E,WIZARD|WITCH); + }break; + } + } +} + +bool Wizard::AutoAttack(){ + attack_cooldown_timer=MAGIC_ATTACK_COOLDOWN; + float angleToCursor=atan2(game->GetWorldMousePos().y-GetPos().y,game->GetWorldMousePos().x-GetPos().x); + BULLET_LIST.push_back(std::make_unique(EnergyBolt(GetPos(),{cos(angleToCursor)*200,sin(angleToCursor)*200},12,GetAttack(),upperLevel,true,WHITE))); + return true; +} +void Wizard::InitializeClassAbilities(){ + #pragma region Wizard Right-click Ability (???) + Wizard::rightClickAbility.action= + [&](){ + float pointMouseDirection=atan2(game->GetWorldMousePos().y-GetPos().y,game->GetWorldMousePos().x-GetPos().x); + vf2d pointTowardsMouse={cos(pointMouseDirection),sin(pointMouseDirection)}; + float dist=std::clamp(geom2d::line{GetPos(),game->GetWorldMousePos()}.length(),0.f,6.5f*24); + if(dist<12)return false; + vf2d teleportPoint=GetPos()+pointTowardsMouse*dist; + while(dist>0&&game->HasTileCollision(game->GetCurrentLevel(),teleportPoint)&&CanPathfindTo(GetPos(),teleportPoint)){ + dist-=24; + teleportPoint=GetPos()+pointTowardsMouse*dist; + } + if(dist>0&&CanPathfindTo(GetPos(),teleportPoint)){ + SetState(State::TELEPORT); + teleportAnimationTimer=0.35; + teleportTarget=teleportPoint; + teleportStartPosition=GetPos(); + iframe_time=0.35; + for(int i=0;i<16;i++){ + game->AddEffect(std::make_unique(GetPos()+vf2d{(rand()%160-80)/10.f,(rand()%160-80)/10.f},float(rand()%300)/1000,AnimationState::DOT_PARTICLE,upperLevel,0.3,0.2,vf2d{float(rand()%1000-500)/100,float(rand()%1000-500)/100},BLACK)); + } + return true; + } else { + notificationDisplay={"Cannot Teleport to that location!",0.5}; + return false; + } + }; + #pragma endregion + #pragma region Wizard Ability 1 (???) + Wizard::ability1.action= + [&](){ + float angleToCursor=atan2(game->GetWorldMousePos().y-GetPos().y,game->GetWorldMousePos().x-GetPos().x); + BULLET_LIST.push_back(std::make_unique(FireBolt(GetPos(),{cos(angleToCursor)*275,sin(angleToCursor)*275},12,GetAttack(),upperLevel,true,{240,120,60}))); + return true; + }; + #pragma endregion + #pragma region Wizard Ability 2 (???) + Wizard::ability2.action= + [&](){ + float angleToCursor=atan2(game->GetWorldMousePos().y-GetPos().y,game->GetWorldMousePos().x-GetPos().x); + BULLET_LIST.push_back(std::make_unique(LightningBolt(GetPos(),{cos(angleToCursor)*230,sin(angleToCursor)*230},12,GetAttack()*4,upperLevel,true,WHITE))); + return true; + }; + #pragma endregion + #pragma region Wizard Ability 3 (???) + Wizard::ability3.action= + [&](){ + SetState(State::CASTING); + game->AddEffect(std::make_unique(GetPos(),3,AnimationState::METEOR,OnUpperLevel(),vf2d{1,1},2)); + return true; + }; + #pragma endregion +} \ No newline at end of file diff --git a/Crawler/sig b/Crawler/sig index a36ba4ff..07802e23 100755 --- a/Crawler/sig +++ b/Crawler/sig @@ -1,4 +1,4 @@ -export AUTO_UPDATE=true +export AUTO_UPDATE=false source utils/define.sh