/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.server.ai.goal;
import java.util.Iterator;
import java.util.logging.Logger;
import org.freecolandroid.xml.stream.XMLStreamException;
import org.freecolandroid.xml.stream.XMLStreamReader;
import org.freecolandroid.xml.stream.XMLStreamWriter;
import net.sf.freecol.common.model.PathNode;
import net.sf.freecol.common.model.Tile;
import net.sf.freecol.common.model.Unit.MoveType;
import net.sf.freecol.server.ai.AIMessage;
import net.sf.freecol.server.ai.AIPlayer;
import net.sf.freecol.server.ai.AIUnit;
public class GotoAdjacentGoal extends Goal {
private static final Logger logger = Logger.getLogger(GotoAdjacentGoal.class.getName());
//the destination tile
private Tile target;
public GotoAdjacentGoal(AIPlayer p, Goal g, float w, AIUnit u, Tile t) {
super(p,g,w,u);
target = t;
}
protected Iterator<AIUnit> getOwnedAIUnitsIterator() {
//we're keeping units on the availableUnitsList,
//so all our own units at any moment are these
return availableUnitsList.iterator();
}
protected Iterator<Goal> getSubGoalIterator() {
return null;
}
protected void removeUnit(AIUnit u) {
Iterator<AIUnit> uit = availableUnitsList.iterator();
while (uit.hasNext()) {
AIUnit unit = uit.next();
if (unit.equals(u)) {
uit.remove();
}
}
}
protected void plan() {
isFinished = false;
//Run through available units. For each unit, find a path to the
//target and move towards it. Return to parent if adjacent to target,
//or no path can be found.
Iterator<AIUnit> uit = availableUnitsList.iterator();
nextUnit: while (uit.hasNext()) {
AIUnit u = uit.next();
PathNode pathNode = u.getUnit().findPath(target);
if (pathNode==null) {
uit.remove();
addUnitToParent(u);
} else {
while (pathNode.next != null
&& pathNode.getTurns() == 0
&& pathNode.getTile() != target
&& (u.getUnit().getMoveType(pathNode.getDirection()) == MoveType.MOVE
||u.getUnit().getMoveType(pathNode.getDirection()) == MoveType.EXPLORE_LOST_CITY_RUMOUR)) {
if(u.getUnit().getMoveType(pathNode.getDirection()) == MoveType.EXPLORE_LOST_CITY_RUMOUR) {
logger.warning("Accidental rumour exploration!");
}
AIMessage.askMove(u, pathNode.getDirection());
if (u.getUnit() == null
|| u.getUnit().isDisposed()) {
continue nextUnit;
}
pathNode = pathNode.next;
}
if (u.getUnit().getTile().isAdjacent(target)) {
//If unit is adjacent after moving, return to parent
uit.remove();
addUnitToParent(u);
}
}
}
if (availableUnitsList.size()==0) {
//we don't have any units left to deal with,
//signal that we may safely be cancelled now
isFinished = true;
}
}
public String getGoalDescription() {
String descr = super.getGoalDescription();
if (target!=null) {
descr += ":"+target.getX()+","+target.getY();
} else {
descr += ":null";
}
return descr;
}
protected void toXMLImpl(XMLStreamWriter out) throws XMLStreamException {
}
protected void readFromXMLImpl(XMLStreamReader in) throws XMLStreamException {
}
}