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.utility.EIError;
import com.weem.epicinventor.utility.Rand;
import java.awt.*;
public class GoalOobabooHealer extends Goal {
private OobabooHealerState oobabooHealerState;
private long moveTime = 1000;
private int healRange = 512;
private int targetFollowDistance = 100;
private int maxFollowDistance = 1000;
public enum OobabooHealerState {
STARING, FOLLOWING, HEALING
};
public GoalOobabooHealer(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();
OobabooHealer actor = (OobabooHealer) ai.getActor();
oobabooHealerState = OobabooHealerState.STARING;
if (actor == null) {
return;
}
}
@Override
protected void process() {
super.process();
OobabooHealer actor = (OobabooHealer) ai.getActor();
Player player = registry.getPlayerManager().getPlayerById(ai.getPlayer());
if (actor == null || player == null) {
return;
}
Point p = player.getCenterPoint();
double distance = p.distance(actor.getCenterPoint());
if (distance > maxFollowDistance) {
actor.setPosition(player.getMapX(), player.getMapY());
}
int actorX = actor.getMapX();
int targetX = player.getMapX();
switch (oobabooHealerState) {
case STARING:
if (targetX > actorX) {
actor.setFacing(Actor.Facing.RIGHT);
} else {
actor.setFacing(Actor.Facing.LEFT);
}
if (distance <= healRange && player.getHitPointPercentage() < 100) {
//if player is low on life, try to heal
actor.stopMove();
oobabooHealerState = OobabooHealerState.HEALING;
} else if (distance > targetFollowDistance) {
//if healer is too far away from player, switch state to follow
oobabooHealerState = OobabooHealerState.FOLLOWING;
}
actor.checkCollide(0);
break;
case FOLLOWING:
actor.moveTowardsPoint(player.getCenterPoint());
if (distance <= healRange && player.getHitPointPercentage() < 100) {
//if player is low on life, try to heal
actor.stopMove();
oobabooHealerState = OobabooHealerState.HEALING;
} else if (distance < targetFollowDistance) {
//if healer has caught up to player, stop following
//actor.setLastMove(registry.currentTime);
actor.stopMove();
oobabooHealerState = OobabooHealerState.STARING;
}
break;
case HEALING:
if (targetX > actorX) {
actor.setFacing(Actor.Facing.RIGHT);
} else {
actor.setFacing(Actor.Facing.LEFT);
}
actor.attack();
if (distance > healRange) {
//if healer is too far away from player, switch state to follow
//actor.setLastMove(registry.currentTime);
oobabooHealerState = OobabooHealerState.FOLLOWING;
} else if (player.getHitPointPercentage() == 100) {
//if player has full health, just stare at him... Right in his stupid face
//actor.setLastMove(registry.currentTime);
actor.stopMove();
oobabooHealerState = OobabooHealerState.STARING;
}
break;
}
}
@Override
public void terminate() {
super.terminate();
ai.getActor().stopMove();
}
}