|
|
|
@ -40,13 +40,58 @@ All rights reserved. |
|
|
|
|
#include "Monster.h" |
|
|
|
|
#include "MonsterStrategyHelpers.h" |
|
|
|
|
#include "BulletTypes.h" |
|
|
|
|
#include "util.h" |
|
|
|
|
|
|
|
|
|
INCLUDE_ANIMATION_DATA |
|
|
|
|
INCLUDE_BULLET_LIST |
|
|
|
|
INCLUDE_game |
|
|
|
|
|
|
|
|
|
using A=Attribute; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Every 2 seconds after completing an attack do one of the following attacks: |
|
|
|
|
Casts a Stone Pillar on the location of the Player: radius 350. Hits with 3 seconds delay. Becomes an solid object (Player colision) and decays after 5 seconds again. |
|
|
|
|
If the Stone pillar would hit the Stone Elemental it will move out of its range. |
|
|
|
|
Shoot a Stone (bullet) in the direction of the target.
|
|
|
|
|
The Stone gets created in form of a Cone and tracks the player movement without moving for the first second.
|
|
|
|
|
Once it locks it doesnt move for another second. then it starts flying towards the player with 3x the normal Bullet speed. |
|
|
|
|
Dive under earth and show up 1 second later in a random location 400-700 away from player. while emerging shoot a ring of bullets (0.5x Attack) |
|
|
|
|
(maybe emerge with 200 away from anything with colision to avoid the Elemental getting stuck? Other solutions for that are welcome aswell) |
|
|
|
|
if range to player > 1200 always use 3rd attack |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
void Monster::STRATEGY::STONE_ELEMENTAL(Monster&m,float fElapsedTime,std::string strategy){ |
|
|
|
|
enum PhaseName{ |
|
|
|
|
WAITING, |
|
|
|
|
STONE_PILLAR_CAST, |
|
|
|
|
STONE_PILLAR_ATTACK, |
|
|
|
|
SHOOT_STONE_CAST, |
|
|
|
|
SHOOT_STONE_ATTACK, |
|
|
|
|
DIVE_UNDERGROUND_DIG, |
|
|
|
|
DIVE_UNDERGROUND_SURFACE, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
switch(m.phase){ |
|
|
|
|
case WAITING:{ |
|
|
|
|
m.F(A::ATTACK_COOLDOWN)+=fElapsedTime; |
|
|
|
|
|
|
|
|
|
float distToPlayer=util::distance(m.GetPos(),game->GetPlayer()->GetPos()); |
|
|
|
|
if(distToPlayer>=ConfigPixels("Auto Dive Range"))m.phase=DIVE_UNDERGROUND_DIG; |
|
|
|
|
|
|
|
|
|
if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Wait Time")){ |
|
|
|
|
switch(util::random()%3){ |
|
|
|
|
case 0:m.phase=STONE_PILLAR_CAST;break; |
|
|
|
|
case 1:m.phase=SHOOT_STONE_CAST;break; |
|
|
|
|
case 2:m.phase=DIVE_UNDERGROUND_DIG;break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}break; |
|
|
|
|
case STONE_PILLAR_CAST:{ |
|
|
|
|
|
|
|
|
|
}break; |
|
|
|
|
case SHOOT_STONE_CAST:{ |
|
|
|
|
|
|
|
|
|
}break; |
|
|
|
|
case DIVE_UNDERGROUND_DIG:{ |
|
|
|
|
|
|
|
|
|
}break; |
|
|
|
|
} |
|
|
|
|
} |