The open source repository for the action RPG game in development by Sig Productions titled 'Adventures in Lestoria'! https://forums.lestoria.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
AdventuresInLestoria/Crawler/Wizard.cpp

131 lines
5.5 KiB

#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
void Wizard::Initialize(){
Wizard::name="Wizard";
Wizard::cl=WIZARD;
Wizard::rightClickAbility={"Teleport",8,5,VERY_DARK_BLUE,DARK_BLUE};
Wizard::ability1={"Firebolt",6,30};
Wizard::ability2={"Lightning Bolt",6,25};
Wizard::ability3={"Meteor",40,75,VERY_DARK_RED,VERY_DARK_RED,PrecastData(1.5,9*24,4*24)};
Wizard::ability4={"???",0,0};
Wizard::idle_n=WIZARD_IDLE_N;
Wizard::idle_e=WIZARD_IDLE_E;
Wizard::idle_s=WIZARD_IDLE_S;
Wizard::idle_w=WIZARD_IDLE_W;
Wizard::walk_n=WIZARD_WALK_N;
Wizard::walk_e=WIZARD_WALK_E;
Wizard::walk_s=WIZARD_WALK_S;
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>(EnergyBolt(GetPos(),{cos(angleToCursor)*200,sin(angleToCursor)*200},12,GetAttack(),upperLevel,true,WHITE)));
return true;
}
void Wizard::InitializeClassAbilities(){
#pragma region Wizard Right-click Ability (Teleport)
Wizard::rightClickAbility.action=
[](Player*p,vf2d pos={}){
if(p->GetState()==State::CASTING)return false;
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<float>{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<Effect>(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;
}
};
#pragma endregion
#pragma region Wizard Ability 1 (Fire Bolt)
Wizard::ability1.action=
[](Player*p,vf2d pos={}){
float angleToCursor=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x);
BULLET_LIST.push_back(std::make_unique<FireBolt>(FireBolt(p->GetPos(),{cos(angleToCursor)*275,sin(angleToCursor)*275},12,p->GetAttack(),p->upperLevel,true,{240,120,60})));
return true;
};
#pragma endregion
#pragma region Wizard Ability 2 (Lightning Bolt)
Wizard::ability2.action=
[](Player*p,vf2d pos={}){
float angleToCursor=atan2(game->GetWorldMousePos().y-p->GetPos().y,game->GetWorldMousePos().x-p->GetPos().x);
BULLET_LIST.push_back(std::make_unique<LightningBolt>(LightningBolt(p->GetPos(),{cos(angleToCursor)*230,sin(angleToCursor)*230},12,p->GetAttack()*4,p->upperLevel,true,WHITE)));
return true;
};
#pragma endregion
#pragma region Wizard Ability 3 (Meteor)
Wizard::ability3.action=
[](Player*p,vf2d pos={}){
p->CastSpell(Wizard::ability3);
game->AddEffect(std::make_unique<Meteor>(pos,3,AnimationState::METEOR,p->OnUpperLevel(),vf2d{1,1},2));
return true;
};
#pragma endregion
}