package com.weem.epicinventor.ai;
import com.weem.epicinventor.*;
import com.weem.epicinventor.actor.*;
import com.weem.epicinventor.actor.monster.*;
import com.weem.epicinventor.utility.Rand;
import java.awt.*;
public class GoalResourceMonster extends Goal {
private Point targetPoint;
private long nextMove;
private ResourceMonsterState resourceMonsterState;
private int originalXMoveSize = 0;
private int chargeSpeedBonus = 9;
private long thinkTime = 3000;
private long hideTime = 5000;
private long moveTime = 5000;
public enum ResourceMonsterState {
PEACEFUL, CHARGING, HIDING, THINKING
};
public GoalResourceMonster(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();
Monster actor = (Monster) ai.getActor();
resourceMonsterState = ResourceMonsterState.PEACEFUL;
if (actor == null) {
return;
}
originalXMoveSize = actor.getXMoveSize();
nextMove = registry.currentTime + moveTime;
}
@Override
protected void process() {
super.process();
Monster actor = (Monster) ai.getActor();
Player player = registry.getClosestPlayer(actor.getCenterPoint(), actor.getMaxAggroRange());
if (actor == null || player == null) {
return;
}
switch (resourceMonsterState) {
case PEACEFUL:
if (actor.getHitPoints() < actor.getTotalHitPoints() || actor.getCenterPoint().distance(player.getCenterPoint()) <= 100) {
targetPoint = null;
nextMove = registry.currentTime + moveTime;
actor.attack();
actor.setXMoveSize(originalXMoveSize + chargeSpeedBonus);
resourceMonsterState = ResourceMonsterState.CHARGING;
} else {
actor.updatePosition();
}
break;
case CHARGING:
if (doCharge(actor, player)) {
actor.stopMove();
actor.stopAttack();
actor.setXMoveSize(originalXMoveSize);
nextMove = registry.currentTime + thinkTime;
resourceMonsterState = ResourceMonsterState.THINKING;
} else {
actor.updatePosition();
}
break;
case HIDING:
if (registry.currentTime >= nextMove) {
actor.updatePosition();
targetPoint = null;
nextMove = registry.currentTime + moveTime;
actor.attack();
actor.setXMoveSize(originalXMoveSize + chargeSpeedBonus);
resourceMonsterState = ResourceMonsterState.CHARGING;
} else {
if (doHide(actor, player)) {
targetPoint = null;
nextMove = registry.currentTime + moveTime;
actor.attack();
actor.setXMoveSize(originalXMoveSize + chargeSpeedBonus);
resourceMonsterState = ResourceMonsterState.CHARGING;
} else {
actor.updatePosition();
}
}
break;
case THINKING:
actor.updatePosition();
if (registry.currentTime >= nextMove) {
if (Rand.getRange(1, 5) <= 2) {
targetPoint = null;
nextMove = registry.currentTime + moveTime;
actor.stopMove();
resourceMonsterState = ResourceMonsterState.HIDING;
} else {
targetPoint = null;
nextMove = registry.currentTime + moveTime;
actor.attack();
actor.setXMoveSize(originalXMoveSize + chargeSpeedBonus);
resourceMonsterState = ResourceMonsterState.CHARGING;
}
} else {
actor.updatePosition();
}
break;
}
}
private boolean doCharge(Actor actor, Player player) {
//returns true if done charging
if (registry.currentTime >= nextMove) {
return true;
} else if (targetPoint != null) {
if (actor.getCenterPoint().distance(targetPoint) <= 100) {
return true;
} else {
if (actor != null && targetPoint != null) {
actor.moveTowardsPoint(targetPoint);
}
}
} else {
if (player != null) {
targetPoint = player.getCenterPoint();
if (actor.getCenterPoint().x > player.getCenterPoint().x) {
targetPoint.x -= 300;
} else {
targetPoint.x += 300;
}
}
}
if (actor.getMapX() <= 0) {
return true;
}
return false;
}
private boolean doHide(Actor actor, Player player) {
//returns true if done charging
if (registry.currentTime >= nextMove) {
if (actor.getIsHiding()) {
actor.updatePosition();
return true;
}
} else {
actor.hide();
actor.updatePosition();
}
return false;
}
@Override
public void terminate() {
super.terminate();
ai.getActor().stopMove();
}
}