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

INCLUDE_BULLET_LIST
INCLUDE_game

void Monster::STRATEGY::RUN_AWAY(Monster&m,float fElapsedTime,int strategyNumber){
	m.targetAcquireTimer=std::max(0.f,m.targetAcquireTimer-fElapsedTime);
	m.attackCooldownTimer=std::max(0.f,m.attackCooldownTimer-fElapsedTime);
	geom2d::line line(m.pos,game->GetPlayer()->GetPos());
	if(m.targetAcquireTimer==0&&m.queueShotTimer==0){
		m.targetAcquireTimer=1;
		if(line.length()<24.f*ConfigInt("Range")/100.f){
			m.target=line.upoint(-1.2);
			if(m.canMove){
				m.SetState(State::MOVE_AWAY);
			} else {
				m.SetState(State::NORMAL);
			}
		} else
			if(line.length()>24.f*ConfigInt("CloseInRange")/100.0f){
				m.target=line.upoint(1.2);
				m.SetState(State::MOVE_TOWARDS);
			} else {
				m.SetState(State::NORMAL);
			}
	}
	m.canMove=true;
	geom2d::line moveTowardsLine=geom2d::line(m.pos,m.target);
	bool pathfindingDecision=false;
	switch(m.state){
		case State::MOVE_TOWARDS:{
			if(moveTowardsLine.length()>1){
				vf2d newPos=m.pos+moveTowardsLine.vector().norm()*100*fElapsedTime*m.GetMoveSpdMult();
				bool movedX=m.SetX(newPos.x);
				bool movedY=m.SetY(newPos.y);
				pathfindingDecision=movedX|movedY;
				m.canMove=movedX&&movedY;
			}
			if(!pathfindingDecision){
				m.StartPathfinding(2.5);
			}else
				if(line.length()<=24.f*ConfigInt("CloseInRange")/100.0f){
					m.SetState(State::NORMAL);
				}
			if(moveTowardsLine.vector().x>0){
				m.facingDirection=RIGHT;
			} else {
				m.facingDirection=LEFT;
			}
			m.PerformJumpAnimation();
		}break;
		case State::MOVE_AWAY:{
			if(moveTowardsLine.length()>1){
				vf2d newPos=m.pos+moveTowardsLine.vector().norm()*100*fElapsedTime*m.GetMoveSpdMult();
				bool movedX=m.SetX(newPos.x);
				bool movedY=m.SetY(newPos.y);
				pathfindingDecision=movedX|movedY;
				m.canMove=movedX&&movedY;
			}
			if(!pathfindingDecision){
				m.StartPathfinding(2.5);
			}else
				if(line.length()>=24.f*ConfigInt("Range")/100.f){
					m.SetState(State::NORMAL);
				}
			if(moveTowardsLine.vector().x>0){
				m.facingDirection=RIGHT;
			} else {
				m.facingDirection=LEFT;
			}
			m.PerformJumpAnimation();
		}break;
		case State::PATH_AROUND:{
			m.PathAroundBehavior(fElapsedTime);
		}break;
	}
}