Fix up MonsterStrategy ambiguous naming. Added operator<< overload for the enum for safemap compatibility. Release Build 13582.
This commit is contained in:
parent
ffeab76719
commit
443434c30c
@ -69,7 +69,7 @@ DEFINE_STRATEGY(BEAR)
|
||||
m.RotateTowardsPos(m.GetPos()+m.V(A::LOCKON_POS).cart());
|
||||
}else{
|
||||
m.target=game->GetPlayer()->GetPos();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}
|
||||
}break;
|
||||
case 1:{
|
||||
|
||||
@ -61,14 +61,14 @@ DEFINE_STRATEGY(BOAR)
|
||||
float distToPlayer=m.GetDistanceFrom(game->GetPlayer()->GetPos());
|
||||
if(m.canMove&&distToPlayer>=ConfigInt("Closein Range")/100.f*24){
|
||||
m.RemoveBuff(BuffType::SELF_INFLICTED_SLOWDOWN);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(m.HasLineOfSight(game->GetPlayer()->GetPos())&&m.canMove&&distToPlayer<=ConfigInt("Backpedal Range")/100.f*24){
|
||||
m.RemoveBuff(BuffType::SELF_INFLICTED_SLOWDOWN);
|
||||
m.AddBuff(BuffType::SELF_INFLICTED_SLOWDOWN,INFINITE,(100-ConfigInt("Backpedal Movespeed"))/100.f);
|
||||
m.target=geom2d::line<float>(m.GetPos(),game->GetPlayer()->GetPos()).rpoint(-100);
|
||||
if(m.attackedByPlayer)goto ScratchPhaseTransition;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.UpdateFacingDirection(game->GetPlayer()->GetPos());
|
||||
}else{
|
||||
ScratchPhaseTransition:
|
||||
@ -109,7 +109,7 @@ DEFINE_STRATEGY(BOAR)
|
||||
if(m.F(A::TARGET_TIMER)<=0||m.bumpedIntoTerrain||distToTarget<12.f){
|
||||
TransitionToRecoveryPhase();
|
||||
}else{
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
//m.PerformShootAnimation();
|
||||
if(!m.canMove)TransitionToRecoveryPhase();
|
||||
}
|
||||
|
||||
@ -78,11 +78,11 @@ DEFINE_STRATEGY(CRAB)
|
||||
}else
|
||||
if(outsideMaxShootingRange){
|
||||
m.target=game->GetPlayer()->GetPos();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(distToPlayer<ConfigPixels("Run Away Range")){
|
||||
m.target=geom2d::line<float>(m.GetPos(),game->GetPlayer()->GetPos()).upoint(-1);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(distToPlayer>=ConfigPixelsArr("Random Direction Range",0)&&distToPlayer<ConfigPixelsArr("Random Direction Range",1)){
|
||||
#define CW true
|
||||
@ -91,7 +91,7 @@ DEFINE_STRATEGY(CRAB)
|
||||
float dirFromPlayer=util::angleTo(game->GetPlayer()->GetPos(),m.GetPos());
|
||||
float targetDir=m.B(A::RANDOM_DIRECTION)==CW?dirFromPlayer+PI/4:dirFromPlayer-PI/4;
|
||||
m.target=game->GetPlayer()->GetPos()+vf2d{m.F(A::RANDOM_RANGE),targetDir}.cart();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.F(A::CHASE_TIMER)=1.f;
|
||||
}
|
||||
}break;
|
||||
@ -105,7 +105,7 @@ DEFINE_STRATEGY(CRAB)
|
||||
}break;
|
||||
case CHARGE:{
|
||||
m.F(A::CHASE_TIMER)-=fElapsedTime;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
if(m.F(A::CHASE_TIMER)<=0.f||m.ReachedTargetPos()){
|
||||
SETPHASE(MOVE);
|
||||
m.B(A::RANDOM_DIRECTION)=util::random()%2;
|
||||
|
||||
@ -60,7 +60,7 @@ DEFINE_STRATEGY(FROG)
|
||||
goto phase;
|
||||
}
|
||||
m.RotateTowardsPos(m.target);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.PerformJumpAnimation();
|
||||
}break;
|
||||
case 1:{
|
||||
|
||||
@ -310,7 +310,7 @@ DEFINE_STRATEGY(GHOST_OF_PIRATE_CAPTAIN)
|
||||
}
|
||||
}break;
|
||||
case FINAL:{
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.target=ConfigVec("Final Standing Spot");
|
||||
m.PerformAnimation("SLASH",Direction::SOUTH);
|
||||
m.SetStrategyOnHitFunction({});
|
||||
@ -321,7 +321,7 @@ DEFINE_STRATEGY(GHOST_OF_PIRATE_CAPTAIN)
|
||||
|std::views::filter([&PIRATES_TREASURE](std::shared_ptr<Monster>&m){return m->GetStrategyName()==PIRATES_TREASURE;})){
|
||||
m.target=treasure->GetPos();
|
||||
}
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.PerformAnimation("DEATH");
|
||||
game->GetPlayer()->RemoveAllBuffs(BuffType::PIRATE_GHOST_CAPTAIN_CURSE_DOT);
|
||||
return true;
|
||||
|
||||
@ -78,7 +78,7 @@ DEFINE_STRATEGY(GIANT_CRAB)
|
||||
}
|
||||
}
|
||||
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}break;
|
||||
}
|
||||
END_STRATEGY
|
||||
@ -64,7 +64,7 @@ DEFINE_STRATEGY(GOBLIN_BOAR_RIDER)
|
||||
m.deathData.emplace_back(ConfigString("Spawned Monster"),1U);
|
||||
}
|
||||
|
||||
m.RunStrategy(BOAR);
|
||||
m.RunStrategy(MonsterStrategy::BOAR);
|
||||
|
||||
m.F(A::ATTACK_COOLDOWN)+=fElapsedTime;
|
||||
if(m.F(A::SHOOT_TIMER)>0.f){
|
||||
|
||||
@ -79,7 +79,7 @@ DEFINE_STRATEGY(GOBLIN_BOMB)
|
||||
m.F(A::SHOOT_TIMER)=0.f;
|
||||
}
|
||||
if(m.F(A::SHOOT_ANIMATION_TIME)<0.f)m.B(A::IGNORE_DEFAULT_ANIMATIONS)=false;
|
||||
m.RunStrategy(RUN_AWAY);
|
||||
m.RunStrategy(MonsterStrategy::RUN_AWAY);
|
||||
}break;
|
||||
}
|
||||
END_STRATEGY
|
||||
@ -86,14 +86,14 @@ DEFINE_STRATEGY(GOBLIN_BOW)
|
||||
|
||||
if(outsideMaxShootingRange){
|
||||
m.target=game->GetPlayer()->GetPos();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Reload Time")){
|
||||
PrepareToShoot();
|
||||
}else
|
||||
if(distToPlayer<ConfigPixels("Run Away Range")){
|
||||
m.target=geom2d::line<float>(m.GetPos(),game->GetPlayer()->GetPos()).upoint(-1);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(distToPlayer>=ConfigPixelsArr("Random Direction Range",0)&&distToPlayer<ConfigPixelsArr("Random Direction Range",1)){
|
||||
#define CW true
|
||||
@ -102,7 +102,7 @@ DEFINE_STRATEGY(GOBLIN_BOW)
|
||||
float dirFromPlayer=util::angleTo(game->GetPlayer()->GetPos(),m.GetPos());
|
||||
float targetDir=m.B(A::RANDOM_DIRECTION)==CW?dirFromPlayer+PI/4:dirFromPlayer-PI/4;
|
||||
m.target=game->GetPlayer()->GetPos()+vf2d{m.F(A::RANDOM_RANGE),targetDir}.cart();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Reload Time")/2.f){ //Only the stand still and shoot range remains, which is twice as fast...
|
||||
PrepareToShoot();
|
||||
|
||||
@ -69,7 +69,7 @@ DEFINE_STRATEGY(GOBLIN_DAGGER)
|
||||
case MOVE:{
|
||||
float distToPlayer=m.GetDistanceFrom(game->GetPlayer()->GetPos());
|
||||
if(distToPlayer>ConfigFloat("Attack Spacing")/100.f*24){
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else{
|
||||
SETPHASE(WINDUP);
|
||||
m.I(A::ATTACK_TYPE)=util::random()%2; //Choose randomly between stab or slash.
|
||||
|
||||
@ -81,7 +81,7 @@ DEFINE_STRATEGY(HAWK)
|
||||
float dirToPlayer{util::pointTo(game->GetPlayer()->GetPos(),m.GetPos()).polar().y};
|
||||
dirToPlayer+=m.B(A::RANDOM_DIRECTION)?0.25*PI:-0.25*PI;
|
||||
m.target=game->GetPlayer()->GetPos()+vf2d{ConfigFloat("Flight Distance"),dirToPlayer}.cart();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}
|
||||
}break;
|
||||
case PREPARE_CHARGE:{
|
||||
@ -99,7 +99,7 @@ DEFINE_STRATEGY(HAWK)
|
||||
m.B(A::IGNORE_DEFAULT_ANIMATIONS)=true;
|
||||
if(m.F(A::FLYING_HEIGHT)>-ConfigFloat("Flight Oscillation Amount"))m.F(A::FLYING_HEIGHT)=std::max(-ConfigFloat("Flight Oscillation Amount"),m.F(A::FLYING_HEIGHT)-ConfigFloat("Attack Z Speed")*fElapsedTime);
|
||||
m.targetAcquireTimer=1.f;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
float distToTarget=geom2d::line<float>(m.GetPos(),m.target).length();
|
||||
if(distToTarget<12.f){
|
||||
m.F(A::TARGET_FLYING_HEIGHT)=ConfigFloat("Flight Height")-ConfigFloat("Flight Height Variance")+util::random_range(0,ConfigFloat("Flight Height Variance")*2);
|
||||
|
||||
@ -79,7 +79,7 @@ DEFINE_STRATEGY(MAJOR_HAWK)
|
||||
float dirToPlayer{util::pointTo(game->GetPlayer()->GetPos(),m.GetPos()).polar().y};
|
||||
dirToPlayer+=m.B(A::RANDOM_DIRECTION)?0.25*PI:-0.25*PI;
|
||||
m.target=game->GetPlayer()->GetPos()+vf2d{ConfigFloat("Aggressive Flight Distance"),dirToPlayer}.cart();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}
|
||||
}break;
|
||||
case PREPARE_CHARGE:{
|
||||
@ -97,7 +97,7 @@ DEFINE_STRATEGY(MAJOR_HAWK)
|
||||
m.B(A::IGNORE_DEFAULT_ANIMATIONS)=true;
|
||||
if(m.F(A::FLYING_HEIGHT)>-ConfigFloat("Aggressive Flight Oscillation Amount"))m.F(A::FLYING_HEIGHT)=std::max(-ConfigFloat("Aggressive Flight Oscillation Amount"),m.F(A::FLYING_HEIGHT)-ConfigFloat("Aggressive Attack Z Speed")*fElapsedTime);
|
||||
m.targetAcquireTimer=1.f;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
float distToTarget=geom2d::line<float>(m.GetPos(),m.target).length();
|
||||
if(distToTarget<12.f){
|
||||
m.F(A::TARGET_FLYING_HEIGHT)=ConfigFloat("Aggressive Flight Height")-ConfigFloat("Aggressive Flight Height Variance")+util::random_range(0,ConfigFloat("Aggressive Flight Height Variance")*2);
|
||||
@ -108,5 +108,5 @@ DEFINE_STRATEGY(MAJOR_HAWK)
|
||||
m.B(A::IGNORE_DEFAULT_ANIMATIONS)=false;
|
||||
}break;
|
||||
}
|
||||
}else m.RunStrategy(HAWK); //Use normal hawk behaviors when there are too many Major Hawks.
|
||||
}else m.RunStrategy(MonsterStrategy::HAWK); //Use normal hawk behaviors when there are too many Major Hawks.
|
||||
END_STRATEGY
|
||||
@ -82,7 +82,7 @@ class Monster:public IAttributable{
|
||||
friend const bool Entity::IsBoss()const;
|
||||
friend class Entity;
|
||||
public:
|
||||
enum MonsterStrategy{
|
||||
enum class MonsterStrategy{
|
||||
RUN_TOWARDS,
|
||||
SHOOT_AFAR,
|
||||
TURRET,
|
||||
@ -135,6 +135,7 @@ public:
|
||||
////////////////////////////////////
|
||||
END_ENUM //THIS SHOULD ALWAYS BE THE LAST ITEM
|
||||
};
|
||||
friend std::ostream&operator<<(std::ostream&out,const Monster::MonsterStrategy&strategy);
|
||||
struct STRATEGY{
|
||||
static std::string ERR;
|
||||
static int _GetInt(Monster&m,const std::string¶m,const std::string&strategy,int index=0);
|
||||
@ -532,4 +533,6 @@ struct MonsterSpawner{
|
||||
vf2d GetPos();
|
||||
bool DoesUpperLevelSpawning();
|
||||
void SetTriggered(bool trigger,bool spawnMonsters=true);
|
||||
};
|
||||
};
|
||||
|
||||
std::ostream&operator<<(std::ostream&out,const Monster::MonsterStrategy&strategy);
|
||||
@ -53,7 +53,7 @@ DEFINE_STRATEGY(PARROT)
|
||||
case RUN:{
|
||||
if(!m.attachedTarget.expired()&&m.attachedTarget.lock()->IsAlive()){
|
||||
m.PerformAnimation("FLYING");
|
||||
m.RunStrategy(HAWK);
|
||||
m.RunStrategy(MonsterStrategy::HAWK);
|
||||
}else{
|
||||
m.lifetime=10.f;
|
||||
SETPHASE(FLY_AWAY);
|
||||
|
||||
@ -79,14 +79,14 @@ DEFINE_STRATEGY(PIRATE_BUCCANEER)
|
||||
|
||||
if(outsideMaxShootingRange){
|
||||
m.target=game->GetPlayer()->GetPos();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Reload Time")){
|
||||
PrepareToShoot();
|
||||
}else
|
||||
if(distToPlayer<ConfigPixels("Run Away Range")){
|
||||
m.target=geom2d::line<float>(m.GetPos(),game->GetPlayer()->GetPos()).upoint(-1);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else
|
||||
if(m.F(A::ATTACK_COOLDOWN)>=ConfigFloat("Attack Reload Time")/2.f){ //Only the stand still and shoot range remains, which is twice as fast...
|
||||
PrepareToShoot();
|
||||
|
||||
@ -108,7 +108,7 @@ DEFINE_STRATEGY(PIRATE_CAPTAIN)
|
||||
else{
|
||||
float distToPlayer=m.GetDistanceFrom(game->GetPlayer()->GetPos());
|
||||
if(distToPlayer>ConfigFloat("Attack Spacing")/100.f*24){
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else{
|
||||
SETPHASE(WINDUP);
|
||||
m.I(A::ATTACK_TYPE)=util::random()%2; //Choose randomly between stab or slash.
|
||||
|
||||
@ -108,7 +108,7 @@ DEFINE_STRATEGY(PIRATE_MARAUDER)
|
||||
}
|
||||
NormalBehavior:
|
||||
if(distToPlayer>ConfigFloat("Attack Spacing")/100.f*24){
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}else{
|
||||
SETPHASE(WINDUP);
|
||||
m.F(A::CASTING_TIMER)=ConfigFloat("Slash Windup Time");
|
||||
|
||||
@ -49,6 +49,7 @@ void Monster::InitializeStrategies(){
|
||||
#define ADD_STRATEGY(enum,name) \
|
||||
Monster::monsterStrategies.insert(enum,StrategyFunction{name,Monster::STRATEGY::enum}); \
|
||||
Monster::stringToStrategyMap.insert(name,enum);
|
||||
using enum Monster::MonsterStrategy;
|
||||
ADD_STRATEGY(RUN_TOWARDS,"Run Towards");
|
||||
ADD_STRATEGY(SHOOT_AFAR,"Shoot Afar");
|
||||
ADD_STRATEGY(TURRET,"Turret");
|
||||
@ -209,4 +210,8 @@ float Monster::STRATEGY::_GetPixels(Monster&m,const std::string¶m,const std:
|
||||
ERR(std::format("Monster {} trying to read non-existent Real Property {}[{}] (for pixel conversion) for Strategy {}. THIS SHOULD NOT BE HAPPENING!",m.GetName(),param,index,strategy))
|
||||
return{};
|
||||
}
|
||||
}
|
||||
|
||||
std::ostream&operator<<(std::ostream&out,const Monster::MonsterStrategy&strategy){
|
||||
return out<<Monster::monsterStrategies.at(strategy).name;
|
||||
}
|
||||
@ -73,7 +73,7 @@ DEFINE_STRATEGY(SANDWORM)
|
||||
}break;
|
||||
case UNDERGROUND:{
|
||||
m.SetCollisionRadius(0.f);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.PerformAnimation("SWIM",m.GetFacingDirection());
|
||||
if(m.ReachedTargetPos()){
|
||||
m.PerformAnimation("EMERGE",game->GetPlayer()->GetPos());
|
||||
|
||||
@ -69,7 +69,7 @@ DEFINE_STRATEGY(SKELETON_BARBARIAN)
|
||||
SETPHASE(WINDUP_WHIRLWIND);
|
||||
break;
|
||||
}
|
||||
m.RunStrategy(GOBLIN_DAGGER);
|
||||
m.RunStrategy(MonsterStrategy::GOBLIN_DAGGER);
|
||||
}break;
|
||||
case WINDUP_WHIRLWIND:{
|
||||
m.F(A::CASTING_TIMER)-=fElapsedTime;
|
||||
|
||||
@ -94,7 +94,7 @@ DEFINE_STRATEGY(SKELETON_CAPTAIN)
|
||||
m.PerformJumpAnimation();
|
||||
}else{
|
||||
m.target=m.V(A::LOCKON_POS);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}
|
||||
}break;
|
||||
case RECOVERY:{
|
||||
|
||||
@ -44,6 +44,6 @@ INCLUDE_game
|
||||
DEFINE_STRATEGY(SKELETON_MAGE)
|
||||
if(!m.currentCast){
|
||||
|
||||
m.RunStrategy(RUN_AWAY);
|
||||
m.RunStrategy(MonsterStrategy::RUN_AWAY);
|
||||
}
|
||||
END_STRATEGY
|
||||
@ -154,7 +154,7 @@ DEFINE_STRATEGY(SLIMEKING)
|
||||
};
|
||||
|
||||
if(m.F(A::RUN_AWAY_TIMER)>0){
|
||||
m.RunStrategy(RUN_AWAY);
|
||||
m.RunStrategy(MonsterStrategy::RUN_AWAY);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -377,7 +377,7 @@ DEFINE_STRATEGY(SLIMEKING)
|
||||
}break;
|
||||
case 5:{
|
||||
float targetSize=ConfigFloat("Phase5.SizeLossPerHit")/100*m.I(A::HITS_UNTIL_DEATH);
|
||||
m.RunStrategy(RUN_AWAY);
|
||||
m.RunStrategy(MonsterStrategy::RUN_AWAY);
|
||||
if(targetSize>0){
|
||||
m.SetSize(targetSize,false);
|
||||
}else{
|
||||
|
||||
@ -53,7 +53,7 @@ DEFINE_STRATEGY(SPIDER)
|
||||
}break;
|
||||
case RUN:{
|
||||
const bool isHidden{util::distance(game->GetPlayer()->GetPos(),m.GetPos())>=ConfigPixels("Hide Range")};
|
||||
m.RunStrategy(GOBLIN_DAGGER);
|
||||
m.RunStrategy(MonsterStrategy::GOBLIN_DAGGER);
|
||||
const float fadeSpd{255*(1/ConfigFloat("Hide Fade Speed"))};
|
||||
if(isHidden)m.SetTransparency(std::max(0.f,m.F(A::ALPHA_AMOUNT)-fadeSpd*game->GetElapsedTime()));
|
||||
else m.SetTransparency(std::min(255.f,m.F(A::ALPHA_AMOUNT)+fadeSpd*game->GetElapsedTime()));
|
||||
|
||||
@ -299,7 +299,7 @@ DEFINE_STRATEGY(STONE_GOLEM)
|
||||
}break;
|
||||
case BEAR_ATTACK:{
|
||||
m.F(A::CHASE_TIMER)+=fElapsedTime;
|
||||
m.RunStrategy(BEAR);
|
||||
m.RunStrategy(MonsterStrategy::BEAR);
|
||||
//Extending the bear script's variables to read the state of it...
|
||||
const bool SlamHasFinished=m.I(A::ATTACK_COUNT)!=m.I(A::BEAR_STOMP_COUNT); //The bear script uses the internal phase variable to determine the state of things.
|
||||
if(SlamHasFinished){
|
||||
|
||||
@ -140,7 +140,7 @@ DEFINE_STRATEGY(STONE_ELEMENTAL)
|
||||
geom2d::line<float>stonePillarCastLine{m.V(A::LOCKON_POS),m.GetPos()};
|
||||
const vf2d targetWalkPos=stonePillarCastLine.rpoint(stonePillarCastLine.length()+48.f);
|
||||
m.target=targetWalkPos;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.PerformAnimation("STONE PILLAR CAST");
|
||||
m.UpdateFacingDirection(targetWalkPos);
|
||||
}else{
|
||||
@ -192,7 +192,7 @@ DEFINE_STRATEGY(STONE_ELEMENTAL)
|
||||
}break;
|
||||
case DIVE_UNDERGROUND_MOVE:{
|
||||
m.F(A::CASTING_TIMER)-=fElapsedTime;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
|
||||
if(m.F(A::CASTING_TIMER)<=0.f){
|
||||
m.B(A::IGNORE_DEFAULT_ANIMATIONS)=false;
|
||||
|
||||
@ -129,7 +129,7 @@ DEFINE_STRATEGY(URSULE)
|
||||
if(distToCenter>4.0f){
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.target=mapCenter;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
break;
|
||||
}else{ //Now we're finally good for phase 2.
|
||||
TransitionToPhase2();
|
||||
@ -147,7 +147,7 @@ DEFINE_STRATEGY(URSULE)
|
||||
}
|
||||
|
||||
bear:
|
||||
m.RunStrategy(BEAR);
|
||||
m.RunStrategy(MonsterStrategy::BEAR);
|
||||
}break;
|
||||
case 2:{
|
||||
m.PerformAnimation("GLARE");
|
||||
@ -289,7 +289,7 @@ DEFINE_STRATEGY(URSULE)
|
||||
if(distToCenter>4.0f){
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.target=mapCenter;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
break;
|
||||
}else{ //Now we're finally good for phase 2.
|
||||
TransitionToPhase5();
|
||||
@ -336,7 +336,7 @@ DEFINE_STRATEGY(URSULE)
|
||||
}
|
||||
|
||||
bear2:
|
||||
m.RunStrategy(BEAR);
|
||||
m.RunStrategy(MonsterStrategy::BEAR);
|
||||
}break;
|
||||
case 4:{ //A charging phase.
|
||||
m.F(A::TARGET_TIMER)=std::max(0.f,m.F(A::TARGET_TIMER)-fElapsedTime);
|
||||
@ -424,7 +424,7 @@ DEFINE_STRATEGY(URSULE)
|
||||
m.F(A::RUN_AWAY_TIMER)=std::max(0.f,m.F(A::RUN_AWAY_TIMER)-fElapsedTime);
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.target=game->GetPlayer()->GetPos();
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
if(m.F(A::RUN_AWAY_TIMER)==0.f){
|
||||
SETPHASE(m.I(A::PREVIOUS_PHASE));
|
||||
m.RemoveBuff(SPEEDBOOST);
|
||||
|
||||
@ -39,7 +39,7 @@ All rights reserved.
|
||||
#define VERSION_MAJOR 1
|
||||
#define VERSION_MINOR 3
|
||||
#define VERSION_PATCH 0
|
||||
#define VERSION_BUILD 13575
|
||||
#define VERSION_BUILD 13582
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
||||
@ -64,7 +64,7 @@ DEFINE_STRATEGY(WARRIORTHIEF)
|
||||
}break;
|
||||
case SPIN:{
|
||||
m.target=game->GetPlayer()->GetPos();
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.F(A::SPIN_ANGLE)+=ConfigFloat("Warrior.Ability 2.SpinSpd")*game->GetElapsedTime();
|
||||
if((m.F(A::SPIN_ATTACK_TIMER)-=game->GetElapsedTime())>0){
|
||||
m.SetZ(float("Warrior.Ability 2.SpinMaxHeight"_I)*sin(PI*(ConfigFloat("Warrior.Ability 2.SpinTime")-m.F(A::SPIN_ATTACK_TIMER))/ConfigFloat("Warrior.Ability 2.SpinTime")));
|
||||
|
||||
@ -56,7 +56,7 @@ DEFINE_STRATEGY(WOLF)
|
||||
m.AddBuff(BuffType::LOCKON_SPEEDBOOST,INFINITE,ConfigFloat("Lockon Speed Boost")/100);
|
||||
m.F(A::TARGET_TIMER)=5.0f;
|
||||
}
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.target=game->GetPlayer()->GetPos();
|
||||
}break;
|
||||
case 1:{ //Charge the player.
|
||||
@ -68,7 +68,7 @@ DEFINE_STRATEGY(WOLF)
|
||||
m.PerformIdleAnimation();
|
||||
}else{
|
||||
m.target=m.V(A::LOCKON_POS);
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
}
|
||||
}break;
|
||||
case 2:{ //Recovery period after charging.
|
||||
|
||||
@ -165,7 +165,7 @@ DEFINE_STRATEGY(ZEPHY)
|
||||
}break;
|
||||
case FLY_ACROSS_PREPARE:{
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
if(m.ReachedTargetPos()){
|
||||
const bool RightDirectionChosen=m.I(A::ATTACK_CHOICE)==int(AttackChoice::RIGHT);
|
||||
|
||||
@ -179,7 +179,7 @@ DEFINE_STRATEGY(ZEPHY)
|
||||
}break;
|
||||
case FLY_ACROSS:{
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
m.F(A::SHOOT_TIMER)-=fElapsedTime;
|
||||
if(m.F(A::SHOOT_TIMER)<=0.f){
|
||||
CreateBullet(Bullet)(m.GetPos(),vf2d{0.f,ConfigFloat("Fly Across Attack.Attack Y Speed")},4,ConfigInt("Fly Across Attack.Poop Damage"),"birdpoop.png",m.OnUpperLevel(),false,INFINITY,false,NON_FRIENDLY,WHITE,vf2d{1.f,1.25f})EndBullet;
|
||||
@ -204,7 +204,7 @@ DEFINE_STRATEGY(ZEPHY)
|
||||
}break;
|
||||
case TORNADO_ATTACK_PREPARE:{
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
if(m.ReachedTargetPos()){
|
||||
SETPHASE(TORNADO_ATTACK);
|
||||
m.PerformAnimation("ATTACK",Direction::SOUTH);
|
||||
@ -237,7 +237,7 @@ DEFINE_STRATEGY(ZEPHY)
|
||||
}break;
|
||||
case WIND_ATTACK_FLY:{
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
if(m.ReachedTargetPos()){
|
||||
SETPHASE(WIND_ATTACK_LAND);
|
||||
m.F(A::TARGET_FLYING_HEIGHT)=0.f;
|
||||
@ -328,7 +328,7 @@ DEFINE_STRATEGY(ZEPHY)
|
||||
}break;
|
||||
case HALFHEALTH_PREPARE_PHASE:{
|
||||
m.targetAcquireTimer=20.f;
|
||||
m.RunStrategy(RUN_TOWARDS);
|
||||
m.RunStrategy(MonsterStrategy::RUN_TOWARDS);
|
||||
if(m.ReachedTargetPos()){
|
||||
m.F(A::TARGET_FLYING_HEIGHT)=0.f;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user