#include "Monster.h"
#include "DEFINES.h"
#include "Crawler.h"
#include "MonsterStrategyHelpers.h"

INCLUDE_game
INCLUDE_MONSTER_DATA

void Monster::STRATEGY::RUN_TOWARDS(Monster&m,float fElapsedTime,int strategyNumber){
	m.targetAcquireTimer=std::max(0.f,m.targetAcquireTimer-fElapsedTime);
	if(m.targetAcquireTimer==0){
		m.targetAcquireTimer=ConfigFloat("WaitTime");

		auto desiredTargetLine = geom2d::line(m.pos,game->GetPlayer()->GetPos());
		if(desiredTargetLine.length()>=ConfigInt("MaxDistance")/100.f*24){
			//Trim to max distance desired.
			m.target=desiredTargetLine.rpoint(ConfigInt("MaxDistance")/100.f*24);
		} else {
			m.target=desiredTargetLine.upoint(1.2);
		}
		m.SetState(State::MOVE_TOWARDS);
		m.hasHitPlayer=false;
	}
	switch(m.state){
		case State::MOVE_TOWARDS:{
			if(geom2d::line(m.pos,m.target).length()>100*fElapsedTime*m.GetMoveSpdMult()){
				vf2d newPos=m.pos+geom2d::line(m.pos,m.target).vector().norm()*100*fElapsedTime*m.GetMoveSpdMult();
				if(!m.SetX(newPos.x)||!m.SetY(newPos.y)){
					m.StartPathfinding(4);
				}
				m.PerformJumpAnimation();
			} else {
				m.SetState(State::NORMAL);//Revert state once we've finished moving towards target.
				m.UpdateAnimation(MONSTER_DATA[m.id].GetIdleAnimation());
			}
		}break;
		case State::PATH_AROUND:{
			m.PathAroundBehavior(fElapsedTime);
		}break;
		default:{
		}
	}
}