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.*; public class GoalOobabooGatherer extends Goal { private OobabooGathererState oobabooGathererState; private long moveTime = 1000; private int healRange = 512; private int targetFollowDistance = 100; private int maxFollowDistance = 1000; private long nextMove = 0; private Point searchPoint; private double lastDistance; private int stillMovements = 0; public enum OobabooGathererState { GATHERING, MOVING_TOWARDS_RESOURCE, KEEP_SEARCHING, ARRIVING, LEAVING }; public GoalOobabooGatherer(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(); OobabooGatherer actor = (OobabooGatherer) ai.getActor(); oobabooGathererState = OobabooGathererState.LEAVING; if (actor == null) { return; } } @Override protected void process() { super.process(); OobabooGatherer actor = (OobabooGatherer) ai.getActor(); Player player = registry.getPlayerManager().getPlayerById(ai.getPlayer()); if (actor == null || player == null) { return; } if (actor.getActionMode() == Actor.ActionMode.GATHERING) { return; } switch (oobabooGathererState) { case MOVING_TOWARDS_RESOURCE: Resource r = registry.getResourceManager().getClosest(actor.getCenterPoint()); if (r == null) { actor.stopMove(); } else { actor.moveTowardsPoint(r.getCenterPoint()); Point p = player.getCenterPoint(); double distance = r.getCenterPoint().distance(actor.getCenterPoint()); if (distance <= 35) { actor.stopMove(); nextMove = 0; oobabooGathererState = OobabooGathererState.ARRIVING; } else if (distance >= lastDistance && lastDistance > 0) { stillMovements++; if (stillMovements >= 2) { stillMovements = 0; //he hasn't found a resource in 15 seconds, move right and then check again nextMove = 0; searchPoint = new Point(actor.getMapX() + 3000, actor.getMapY()); oobabooGathererState = OobabooGathererState.KEEP_SEARCHING; } } lastDistance = distance; } break; case KEEP_SEARCHING: actor.moveTowardsPoint(searchPoint); if (nextMove == 0) { nextMove = registry.currentTime + Rand.getRange(10000, 15000); } else { if (nextMove < registry.currentTime) { actor.stopMove(); lastDistance = 0; oobabooGathererState = OobabooGathererState.MOVING_TOWARDS_RESOURCE; } } break; case GATHERING: String id = registry.getResourceManager().startGather(player, actor.getCenterPoint(), 35, true); if (id.equals("")) { actor.stopMove(); lastDistance = 0; oobabooGathererState = OobabooGathererState.MOVING_TOWARDS_RESOURCE; } else { actor.setActionMode(Actor.ActionMode.GATHERING); actor.setCurrentResourceType(registry.getPlayerManager().getResourceTypeByResourceId(id)); nextMove = 0; oobabooGathererState = OobabooGathererState.LEAVING; } break; case ARRIVING: if (nextMove == 0) { nextMove = registry.currentTime + Rand.getRange(250, 750); } else { if (nextMove < registry.currentTime) { actor.stopMove(); oobabooGathererState = OobabooGathererState.GATHERING; } } break; case LEAVING: if (Rand.getRange(1, 20) == 1) { turnAround(actor); } if (nextMove == 0) { nextMove = registry.currentTime + Rand.getRange(1500, 4000); } else { if (nextMove < registry.currentTime) { actor.stopMove(); lastDistance = 0; oobabooGathererState = OobabooGathererState.MOVING_TOWARDS_RESOURCE; } } break; } } private void turnAround(Actor actor) { if (actor != null) { if (actor.getFacing() == Actor.Facing.RIGHT) { actor.setFacing(Actor.Facing.LEFT); } else { actor.setFacing(Actor.Facing.RIGHT); } actor.stopMove(); } } @Override public void terminate() { super.terminate(); ai.getActor().stopMove(); } }