|
|
|
@ -30,7 +30,7 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
|
|
|
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
|
|
|
SUCH DAMAGE. |
|
|
|
|
|
|
|
|
|
Portions of this software are copyright © 2023 The FreeType |
|
|
|
|
Portions of this software are copyright <EFBFBD> 2023 The FreeType |
|
|
|
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information. |
|
|
|
|
All rights reserved. |
|
|
|
|
*/ |
|
|
|
@ -59,13 +59,13 @@ void Monster::STRATEGY::BEAR(Monster&m,float fElapsedTime,std::string strategy){ |
|
|
|
|
m.I(A::PHASE)=1; |
|
|
|
|
m.PerformShootAnimation(); |
|
|
|
|
m.F(A::CASTING_TIMER)=ConfigFloat("Chargeup Time"); |
|
|
|
|
m.V(A::LOCKON_POS)=geom2d::line<float>(m.GetPos(),game->GetPlayer()->GetPos()).vector(); |
|
|
|
|
m.V(A::LOCKON_POS)=game->GetPlayer()->GetPos(); |
|
|
|
|
m.SetStrategyDrawFunction([](AiL*game,Monster&m,const std::string&strategy){ |
|
|
|
|
if(m.IsAlive()){ |
|
|
|
|
game->view.DrawRotatedDecal(m.GetPos()+m.V(A::LOCKON_POS),GFX["range_indicator.png"].Decal(),0.f,{12.f,12.f},vf2d{ConfigFloat("Smash Attack Diameter"),ConfigFloat("Smash Attack Diameter")}/100.f,{255,255,0,160}); |
|
|
|
|
game->view.DrawRotatedDecal(m.V(A::LOCKON_POS),GFX["range_indicator.png"].Decal(),0.f,{12.f,12.f},vf2d{ConfigFloat("Smash Attack Diameter"),ConfigFloat("Smash Attack Diameter")}/100.f,{255,255,0,160}); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
m.RotateTowardsPos(m.GetPos()+m.V(A::LOCKON_POS)); |
|
|
|
|
m.RotateTowardsPos(m.V(A::LOCKON_POS)); |
|
|
|
|
}else{ |
|
|
|
|
m.target=game->GetPlayer()->GetPos(); |
|
|
|
|
RUN_TOWARDS(m,fElapsedTime,"Run Towards"); |
|
|
|
@ -82,14 +82,13 @@ void Monster::STRATEGY::BEAR(Monster&m,float fElapsedTime,std::string strategy){ |
|
|
|
|
case 2:{ |
|
|
|
|
m.F(A::CASTING_TIMER)=std::max(0.f,m.F(A::CASTING_TIMER)-fElapsedTime); |
|
|
|
|
if(m.F(A::CASTING_TIMER)==0.f){ |
|
|
|
|
SoundEffect::PlaySFX("Bear Slam Attack",m.GetPos()+m.V(A::LOCKON_POS)); |
|
|
|
|
SoundEffect::PlaySFX("Bear Slam Attack",m.V(A::LOCKON_POS)); |
|
|
|
|
m.I(A::PHASE)=0; |
|
|
|
|
geom2d::circle<float>attackCircle={m.GetPos()+m.V(A::LOCKON_POS),float(operator""_Pixels(ConfigFloat("Smash Attack Diameter"))/2.f)}; |
|
|
|
|
float lockOnDistToPlayer=geom2d::line<float>(game->GetPlayer()->GetPos(),m.V(A::LOCKON_POS)).length(); |
|
|
|
|
geom2d::circle<float>attackCircle={m.V(A::LOCKON_POS),float(operator""_Pixels(ConfigFloat("Smash Attack Diameter"))/2.f)}; |
|
|
|
|
if(geom2d::overlaps(attackCircle,game->GetPlayer()->Hitbox())){ |
|
|
|
|
if(game->GetPlayer()->Hurt(m.GetAttack(),m.OnUpperLevel(),0.f)){ |
|
|
|
|
game->GetPlayer()->Knockup(ConfigFloat("Attack Knockup Duration")); |
|
|
|
|
vf2d playerDirVecNorm=geom2d::line<float>(game->GetPlayer()->GetPos(),m.V(A::LOCKON_POS)).vector().norm(); |
|
|
|
|
vf2d playerDirVecNorm=geom2d::line<float>(m.V(A::LOCKON_POS),game->GetPlayer()->GetPos()).vector().norm(); |
|
|
|
|
game->GetPlayer()->Knockback(playerDirVecNorm*ConfigFloat("Attack Knockback Amount")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|