|
|
|
#include "BulletTypes.h"
|
|
|
|
#include "Effect.h"
|
|
|
|
#include "Crawler.h"
|
|
|
|
#include "DEFINES.h"
|
|
|
|
#include "Emitter.h"
|
|
|
|
#include "utils.h"
|
|
|
|
|
|
|
|
INCLUDE_game
|
|
|
|
INCLUDE_MONSTER_LIST
|
|
|
|
INCLUDE_EMITTER_LIST
|
|
|
|
|
|
|
|
LightningBolt::LightningBolt(vf2d pos,vf2d vel,float radius,int damage,bool upperLevel,bool friendly,Pixel col)
|
|
|
|
:Bullet(pos,vel,radius,damage,
|
|
|
|
"LIGHTNING_BOLT",upperLevel,false,INFINITE,true,friendly,col){}
|
|
|
|
|
|
|
|
void LightningBolt::Update(float fElapsedTime){
|
|
|
|
lastParticleSpawn=std::max(0.f,lastParticleSpawn-fElapsedTime);
|
|
|
|
uint8_t brightness=uint8_t("Wizard.Ability 2.ParticleColorRange"_FRange);
|
|
|
|
if(lastParticleSpawn==0){
|
|
|
|
lastParticleSpawn="Wizard.Ability 2.ParticleFrequency"_F;
|
|
|
|
uint8_t brightness=uint8_t("Wizard.Ability 2.ParticleColorRange"_FRange);
|
|
|
|
switch(rand()%4){
|
|
|
|
case 0:{
|
|
|
|
game->AddEffect(std::make_unique<Effect>(pos+vf2d{"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange,"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange},"Wizard.Ability 2.ParticleLifetimeRange"_FRange,"LIGHTNING_BOLT_PARTICLE1",upperLevel,"Wizard.Ability 2.ParticleSizeRange"_FRange,"Wizard.Ability 2.ParticleFadeoutTime"_F,vel*"Wizard.Ability 2.ParticleSpeedMultRange"_FRange,Pixel{brightness,brightness,brightness}));
|
|
|
|
}break;
|
|
|
|
case 1:{
|
|
|
|
game->AddEffect(std::make_unique<Effect>(pos+vf2d{"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange,"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange},"Wizard.Ability 2.ParticleLifetimeRange"_FRange,"LIGHTNING_BOLT_PARTICLE2",upperLevel,"Wizard.Ability 2.ParticleSizeRange"_FRange,"Wizard.Ability 2.ParticleFadeoutTime"_F,vel*"Wizard.Ability 2.ParticleSpeedMultRange"_FRange,Pixel{brightness,brightness,brightness}));
|
|
|
|
}break;
|
|
|
|
case 2:{
|
|
|
|
game->AddEffect(std::make_unique<Effect>(pos+vf2d{"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange,"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange},"Wizard.Ability 2.ParticleLifetimeRange"_FRange,"LIGHTNING_BOLT_PARTICLE3",upperLevel,"Wizard.Ability 2.ParticleSizeRange"_FRange,"Wizard.Ability 2.ParticleFadeoutTime"_F,vel*"Wizard.Ability 2.ParticleSpeedMultRange"_FRange,Pixel{brightness,brightness,brightness}));
|
|
|
|
}break;
|
|
|
|
case 3:{
|
|
|
|
game->AddEffect(std::make_unique<Effect>(pos+vf2d{"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange,"Wizard.Ability 2.ParticleSpawnRadiusRange"_FRange},"Wizard.Ability 2.ParticleLifetimeRange"_FRange,"LIGHTNING_BOLT_PARTICLE4",upperLevel,"Wizard.Ability 2.ParticleSizeRange"_FRange,"Wizard.Ability 2.ParticleFadeoutTime"_F,vel*"Wizard.Ability 2.ParticleSpeedMultRange"_FRange,Pixel{brightness,brightness,brightness}));
|
|
|
|
}break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool LightningBolt::PlayerHit(Player*player)
|
|
|
|
{
|
|
|
|
deactivated=true;
|
|
|
|
fadeOutTime="Wizard.Ability 2.BulletFadeoutTime"_F;
|
|
|
|
game->AddEffect(std::make_unique<Effect>(player->GetPos(),"Wizard.Ability 2.SplashLifetime"_F,"LIGHTNING_SPLASH",upperLevel,player->GetSizeMult(),"Wizard.Ability 2.SplashFadeoutTime"_F,vf2d{},WHITE,"Wizard.Ability 2.SplashRotationRange"_FRange));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool LightningBolt::MonsterHit(Monster& monster)
|
|
|
|
{
|
|
|
|
deactivated=true;
|
|
|
|
fadeOutTime="Wizard.Ability 2.BulletFadeoutTime"_F;
|
|
|
|
game->AddEffect(std::make_unique<Effect>(monster.GetPos(),"Wizard.Ability 2.SplashLifetime"_F,"LIGHTNING_SPLASH",upperLevel,monster.GetSizeMult(),"Wizard.Ability 2.SplashFadeoutTime"_F,vf2d{},WHITE,"Wizard.Ability 2.SplashRotationRange"_FRange));
|
|
|
|
int targetsHit=0;
|
|
|
|
for(Monster&m:MONSTER_LIST){
|
|
|
|
if(&m==&monster||monster.OnUpperLevel()!=m.OnUpperLevel())continue;
|
|
|
|
geom2d::line<float>lineToTarget=geom2d::line<float>(monster.GetPos(),m.GetPos());
|
|
|
|
float dist=lineToTarget.length();
|
|
|
|
if(dist<="Wizard.Ability 2.LightningChainRadius"_F/100*24){
|
|
|
|
if(m.Hurt(game->GetPlayer()->GetAttack()*"Wizard.Ability 2.LightningChainDamageMult"_F,OnUpperLevel(),0)){
|
|
|
|
EMITTER_LIST.push_back(std::make_unique<LightningBoltEmitter>(LightningBoltEmitter(monster.GetPos(),m.GetPos(),"Wizard.Ability 2.LightningChainFrequency"_F,"Wizard.Ability 2.LightningChainLifetime"_F,upperLevel)));
|
|
|
|
game->AddEffect(std::make_unique<Effect>(m.GetPos(),"Wizard.Ability 2.LightningChainSplashLifetime"_F,"LIGHTNING_SPLASH",upperLevel,monster.GetSizeMult(),"Wizard.Ability 2.LightningChainSplashFadeoutTime"_F,vf2d{},WHITE,"Wizard.Ability 2.LightningChainSplashRotationRange"_FRange));
|
|
|
|
targetsHit++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(targetsHit>=2)break;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|