|
|
@ -6,6 +6,7 @@ |
|
|
|
#include "safemap.h" |
|
|
|
#include "safemap.h" |
|
|
|
#include "Effect.h" |
|
|
|
#include "Effect.h" |
|
|
|
#include "FallingDebris.h" |
|
|
|
#include "FallingDebris.h" |
|
|
|
|
|
|
|
#include "MonsterAttribute.h" |
|
|
|
|
|
|
|
|
|
|
|
INCLUDE_game |
|
|
|
INCLUDE_game |
|
|
|
INCLUDE_BULLET_LIST |
|
|
|
INCLUDE_BULLET_LIST |
|
|
@ -15,8 +16,6 @@ INCLUDE_MONSTER_NAME_DATA |
|
|
|
typedef Attribute A; |
|
|
|
typedef Attribute A; |
|
|
|
|
|
|
|
|
|
|
|
void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumber){ |
|
|
|
void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumber){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float bulletSpd=ConfigFloat("BulletSpd")/100*24; |
|
|
|
float bulletSpd=ConfigFloat("BulletSpd")/100*24; |
|
|
|
|
|
|
|
|
|
|
|
m.F(A::SHOOT_TIMER)=std::max(0.f,m.F(A::SHOOT_TIMER)-fElapsedTime); |
|
|
|
m.F(A::SHOOT_TIMER)=std::max(0.f,m.F(A::SHOOT_TIMER)-fElapsedTime); |
|
|
@ -76,13 +75,22 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const auto StartJump=[&](float jumpDuration,vf2d targetPos,float recoveryTime,float jumpMoveSpd,bool teleportToPlayer=false){ |
|
|
|
const auto StartJumpTowardsPlayer=[&](float jumpDuration,float recoveryTime,float jumpMoveSpd){ |
|
|
|
|
|
|
|
m.V(A::JUMP_ORIGINAL_POS)=m.GetPos(); |
|
|
|
|
|
|
|
m.F(A::JUMP_ORIGINAL_LANDING_TIMER)=m.F(A::JUMP_LANDING_TIMER)=jumpDuration; |
|
|
|
|
|
|
|
m.B(A::JUMP_TOWARDS_PLAYER)=true; |
|
|
|
|
|
|
|
m.F(A::RECOVERY_TIME)=recoveryTime; |
|
|
|
|
|
|
|
m.F(A::JUMP_MOVE_SPD)=jumpMoveSpd; |
|
|
|
|
|
|
|
m.SetState(State::JUMP); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const auto StartJump=[&](float jumpDuration,vf2d targetPos,float recoveryTime,float jumpMoveSpd){ |
|
|
|
m.V(A::JUMP_ORIGINAL_POS)=m.GetPos(); |
|
|
|
m.V(A::JUMP_ORIGINAL_POS)=m.GetPos(); |
|
|
|
m.F(A::JUMP_ORIGINAL_LANDING_TIMER)=m.F(A::JUMP_LANDING_TIMER)=jumpDuration; |
|
|
|
m.F(A::JUMP_ORIGINAL_LANDING_TIMER)=m.F(A::JUMP_LANDING_TIMER)=jumpDuration; |
|
|
|
m.V(A::JUMP_TARGET_POS)=targetPos; |
|
|
|
m.V(A::JUMP_TARGET_POS)=targetPos; |
|
|
|
|
|
|
|
m.B(A::JUMP_TOWARDS_PLAYER)=false; |
|
|
|
m.F(A::RECOVERY_TIME)=recoveryTime; |
|
|
|
m.F(A::RECOVERY_TIME)=recoveryTime; |
|
|
|
m.F(A::JUMP_MOVE_SPD)=jumpMoveSpd; |
|
|
|
m.F(A::JUMP_MOVE_SPD)=jumpMoveSpd; |
|
|
|
m.B(A::TELEPORT_TO_PLAYER)=teleportToPlayer; |
|
|
|
|
|
|
|
m.SetState(State::JUMP); |
|
|
|
m.SetState(State::JUMP); |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -95,8 +103,7 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe |
|
|
|
m.I(A::JUMP_COUNT)++; |
|
|
|
m.I(A::JUMP_COUNT)++; |
|
|
|
float jumpTime=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",0); |
|
|
|
float jumpTime=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",0); |
|
|
|
float jumpSpd=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",1); |
|
|
|
float jumpSpd=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",1); |
|
|
|
bool jumpTeleport=bool(ConfigIntArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",2)); |
|
|
|
StartJumpTowardsPlayer(jumpTime,0.2,jumpSpd); |
|
|
|
StartJump(jumpTime,game->GetPlayer()->GetPos(),0.2,jumpSpd,jumpTeleport); |
|
|
|
|
|
|
|
}break; |
|
|
|
}break; |
|
|
|
default:{ |
|
|
|
default:{ |
|
|
|
m.PerformIdleAnimation(); |
|
|
|
m.PerformIdleAnimation(); |
|
|
@ -124,17 +131,21 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe |
|
|
|
|
|
|
|
|
|
|
|
if(m.GetState()==State::JUMP){ |
|
|
|
if(m.GetState()==State::JUMP){ |
|
|
|
float jumpLandingTimerRatio=m.F(A::JUMP_LANDING_TIMER)/m.F(A::JUMP_ORIGINAL_LANDING_TIMER); |
|
|
|
float jumpLandingTimerRatio=m.F(A::JUMP_LANDING_TIMER)/m.F(A::JUMP_ORIGINAL_LANDING_TIMER); |
|
|
|
if(m.GetPos().x>m.V(A::JUMP_TARGET_POS).x){ |
|
|
|
vf2d jumpTargetPos=m.V(A::JUMP_TARGET_POS); |
|
|
|
m.SetX(std::max(m.V(A::JUMP_TARGET_POS).x,m.GetPos().x-m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
if(m.B(A::JUMP_TOWARDS_PLAYER)){ |
|
|
|
|
|
|
|
jumpTargetPos=game->GetPlayer()->GetPos(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(m.GetPos().x>jumpTargetPos.x){ |
|
|
|
|
|
|
|
m.SetX(std::max(jumpTargetPos.x,m.GetPos().x-m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
} else |
|
|
|
} else |
|
|
|
if(m.GetPos().x<m.V(A::JUMP_TARGET_POS).x){ |
|
|
|
if(m.GetPos().x<jumpTargetPos.x){ |
|
|
|
m.SetX(std::min(m.V(A::JUMP_TARGET_POS).x,m.GetPos().x+m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
m.SetX(std::min(jumpTargetPos.x,m.GetPos().x+m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
} |
|
|
|
} |
|
|
|
if(m.GetPos().y>m.V(A::JUMP_TARGET_POS).y){ |
|
|
|
if(m.GetPos().y>m.V(A::JUMP_TARGET_POS).y){ |
|
|
|
m.SetY(std::max(m.V(A::JUMP_TARGET_POS).y,m.GetPos().y-m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
m.SetY(std::max(jumpTargetPos.y,m.GetPos().y-m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
} else |
|
|
|
} else |
|
|
|
if(m.GetPos().y<m.V(A::JUMP_TARGET_POS).y){ |
|
|
|
if(m.GetPos().y<m.V(A::JUMP_TARGET_POS).y){ |
|
|
|
m.SetY(std::min(m.V(A::JUMP_TARGET_POS).y,m.GetPos().y+m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
m.SetY(std::min(jumpTargetPos.y,m.GetPos().y+m.F(A::JUMP_MOVE_SPD)*game->GetElapsedTime())); |
|
|
|
} |
|
|
|
} |
|
|
|
if(m.F(A::JUMP_LANDING_TIMER)>=m.F(A::JUMP_ORIGINAL_LANDING_TIMER)/2){ |
|
|
|
if(m.F(A::JUMP_LANDING_TIMER)>=m.F(A::JUMP_ORIGINAL_LANDING_TIMER)/2){ |
|
|
|
m.SetZ(util::lerp(0,ConfigInt("JumpHeight"),1-jumpLandingTimerRatio)); |
|
|
|
m.SetZ(util::lerp(0,ConfigInt("JumpHeight"),1-jumpLandingTimerRatio)); |
|
|
@ -165,10 +176,6 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe |
|
|
|
m.SetStrategyDrawFunction([](Crawler*game){}); |
|
|
|
m.SetStrategyDrawFunction([](Crawler*game){}); |
|
|
|
} else |
|
|
|
} else |
|
|
|
if(m.F(A::JUMP_LANDING_TIMER)<=ConfigFloat("JumpWarningIndicatorTime")){ |
|
|
|
if(m.F(A::JUMP_LANDING_TIMER)<=ConfigFloat("JumpWarningIndicatorTime")){ |
|
|
|
if(m.B(A::TELEPORT_TO_PLAYER)){ |
|
|
|
|
|
|
|
m.B(A::TELEPORT_TO_PLAYER)=false; |
|
|
|
|
|
|
|
m.SetPos(game->GetPlayer()->GetPos()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
m.SetStrategyDrawFunction([&](Crawler*game){ |
|
|
|
m.SetStrategyDrawFunction([&](Crawler*game){ |
|
|
|
Decal*dec=ANIMATION_DATA["range_indicator.png"].GetFrame(game->GetElapsedTime()).GetSourceImage()->Decal(); |
|
|
|
Decal*dec=ANIMATION_DATA["range_indicator.png"].GetFrame(game->GetElapsedTime()).GetSourceImage()->Decal(); |
|
|
|
game->view.DrawRotatedDecal(m.GetPos(),dec,0,dec->sprite->Size()/2,vf2d{m.GetSizeMult(),m.GetSizeMult()},RED); |
|
|
|
game->view.DrawRotatedDecal(m.GetPos(),dec,0,dec->sprite->Size()/2,vf2d{m.GetSizeMult(),m.GetSizeMult()},RED); |
|
|
@ -184,7 +191,7 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe |
|
|
|
m.I(A::JUMP_COUNT)++; |
|
|
|
m.I(A::JUMP_COUNT)++; |
|
|
|
float jumpTime=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",0); |
|
|
|
float jumpTime=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",0); |
|
|
|
float jumpSpd=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",1); |
|
|
|
float jumpSpd=ConfigFloatArr("Phase2.Jump["+std::to_string(m.I(A::JUMP_COUNT))+"]",1); |
|
|
|
StartJump(jumpTime,game->GetPlayer()->GetPos(),0.2,jumpSpd); |
|
|
|
StartJumpTowardsPlayer(jumpTime,0.2,jumpSpd); |
|
|
|
} |
|
|
|
} |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
@ -206,7 +213,7 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe |
|
|
|
} |
|
|
|
} |
|
|
|
if(m.F(A::SHOOT_RING_TIMER)==0){ |
|
|
|
if(m.F(A::SHOOT_RING_TIMER)==0){ |
|
|
|
if(m.I(A::PATTERN_REPEAT_COUNT)>=ConfigInt("Phase1.JumpAfter")){ |
|
|
|
if(m.I(A::PATTERN_REPEAT_COUNT)>=ConfigInt("Phase1.JumpAfter")){ |
|
|
|
StartJump(ConfigFloat("Phase1.AirborneTime"),game->GetPlayer()->GetPos(),ConfigFloat("Phase1.LandingRecoveryTime"),ConfigFloat("JumpMoveSpd")); |
|
|
|
StartJumpTowardsPlayer(ConfigFloat("Phase1.AirborneTime"),ConfigFloat("Phase1.LandingRecoveryTime"),ConfigFloat("JumpMoveSpd")); |
|
|
|
m.I(A::PATTERN_REPEAT_COUNT)=0; |
|
|
|
m.I(A::PATTERN_REPEAT_COUNT)=0; |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
@ -258,12 +265,12 @@ void Monster::STRATEGY::SLIMEKING(Monster&m,float fElapsedTime,int strategyNumbe |
|
|
|
if(m.hp<=m.maxhp*ConfigFloat("Phase4.Change")/100){ |
|
|
|
if(m.hp<=m.maxhp*ConfigFloat("Phase4.Change")/100){ |
|
|
|
m.phase=4; |
|
|
|
m.phase=4; |
|
|
|
m.SetSize(ConfigFloat("Phase4.Size")/100,false); |
|
|
|
m.SetSize(ConfigFloat("Phase4.Size")/100,false); |
|
|
|
m.AddBuff(BuffType::SLOWDOWN,9999999,ConfigFloat("Phase4.MoveSpdModifier")/100); |
|
|
|
m.AddBuff(BuffType::SLOWDOWN,99999,ConfigFloat("Phase4.MoveSpdModifier")/100); |
|
|
|
TransitionPhase(m.phase); |
|
|
|
TransitionPhase(m.phase); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
if(m.I(A::PATTERN_REPEAT_COUNT)==0){ |
|
|
|
if(m.I(A::PATTERN_REPEAT_COUNT)==0){ |
|
|
|
StartJump(ConfigFloat("Phase3.JumpDelayTime"),game->GetPlayer()->GetPos(),ConfigFloat("Phase3.JumpRecoveryTime"),ConfigFloat("Phase3.JumpMoveSpd")); |
|
|
|
StartJumpTowardsPlayer(ConfigFloat("Phase3.JumpDelayTime"),ConfigFloat("Phase3.JumpRecoveryTime"),ConfigFloat("Phase3.JumpMoveSpd")); |
|
|
|
m.I(A::PATTERN_REPEAT_COUNT)++; |
|
|
|
m.I(A::PATTERN_REPEAT_COUNT)++; |
|
|
|
}else |
|
|
|
}else |
|
|
|
if(m.I(A::PATTERN_REPEAT_COUNT)<4&&m.F(A::SHOOT_TIMER)==0){ |
|
|
|
if(m.I(A::PATTERN_REPEAT_COUNT)<4&&m.F(A::SHOOT_TIMER)==0){ |
|
|
|