package com.weem.epicinventor.ai;
import com.weem.epicinventor.*;
import com.weem.epicinventor.actor.*;
import com.weem.epicinventor.actor.monster.*;
import com.weem.epicinventor.actor.oobaboo.*;
import com.weem.epicinventor.resource.*;
import com.weem.epicinventor.utility.EIError;
import com.weem.epicinventor.utility.Rand;
import java.awt.*;
import java.awt.geom.Arc2D;
public class GoalOobabooWarrior extends Goal {
private OobabooWarriorState oobabooWarriorState;
private String currentTarget;
private long moveTime = 1000;
private int healRange = 512;
private int targetFollowDistance = 50;
private int maxFollowDistance = 1000;
private long nextMove = 0;
private Point searchPoint;
private double lastDistance;
private int stillMovements = 0;
public enum OobabooWarriorState {
STARING, FOLLOWING, ATTACKING
};
public GoalOobabooWarrior(AI a, Registry r, String t, float b) {
super(a, r, t, b);
}
@Override
public float calculateDesire() {
float desire = 0;
desire *= bias;
desire = validateDesire(desire);
return desire;
}
@Override
protected void activate() {
super.activate();
OobabooWarrior actor = (OobabooWarrior) ai.getActor();
oobabooWarriorState = OobabooWarriorState.STARING;
if (actor == null) {
return;
}
}
@Override
protected void process() {
super.process();
OobabooWarrior actor = (OobabooWarrior) ai.getActor();
Player player = registry.getPlayerManager().getPlayerById(ai.getPlayer());
Monster m = registry.getMonsterManager().getClosestWithinMax(actor.getCenterPoint(), 1000);
if (actor == null || player == null) {
return;
}
if (m == null) {
currentTarget = "";
} else {
currentTarget = m.getId();
}
Point p = player.getCenterPoint();
double distance = p.distance(actor.getCenterPoint());
if (distance > maxFollowDistance) {
actor.setPosition(player.getMapX(), player.getMapY());
}
switch (oobabooWarriorState) {
case STARING:
int actorX = actor.getMapX();
int targetX = player.getMapX();
if (targetX > actorX) {
actor.setFacing(Actor.Facing.RIGHT);
} else {
actor.setFacing(Actor.Facing.LEFT);
}
if (!currentTarget.equals("")) {
actor.stopMove();
oobabooWarriorState = OobabooWarriorState.ATTACKING;
} else if (distance > targetFollowDistance) {
actor.stopMove();
oobabooWarriorState = OobabooWarriorState.FOLLOWING;
}
actor.checkCollide(0);
break;
case FOLLOWING:
actor.moveTowardsPoint(player.getCenterPoint());
if (!currentTarget.equals("")) {
actor.stopMove();
oobabooWarriorState = OobabooWarriorState.ATTACKING;
} else if (distance < targetFollowDistance) {
actor.stopMove();
oobabooWarriorState = OobabooWarriorState.STARING;
}
break;
case ATTACKING:
boolean shouldAttack = false;
Monster monster = registry.getMonsterManager().getMonsterById(currentTarget);
if (monster == null) {
actor.stopMove();
oobabooWarriorState = OobabooWarriorState.FOLLOWING;
} else {
Arc2D.Double attackArc = actor.getAttackArc(actor.getAttackRange());
if (attackArc != null) {
Rectangle sr = monster.getSpriteRect();
if (sr != null) {
if (attackArc.intersects(sr)) {
shouldAttack = true;
}
}
}
if (shouldAttack) {
if (actor.getActionMode() == Actor.ActionMode.NONE) {
actor.attack();
}
} else {
actor.moveTowardsPoint(monster.getCenterPoint());
}
}
break;
}
}
@Override
public void terminate() {
super.terminate();
ai.getActor().stopMove();
}
}