package net.sf.colossus.ai.helper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.colossus.client.CritterMove;
import net.sf.colossus.util.Glob;
/** LegionMove has a List of one CritterMove per mobile critter
* in the legion.
* Originally in SimpleAI, which at the time had the following authors.
* @author Bruce Sherrod, David Ripton, Romain Dolbeau
*/
public class LegionMove implements Comparable<LegionMove>
{
private final List<CritterMove> critterMoves = new ArrayList<CritterMove>();
private Map<CritterMove, String> evaluation = null;
private String lmeval = null;
private int value;
public void add(CritterMove cm)
{
critterMoves.add(cm);
}
public List<CritterMove> getCritterMoves()
{
return Collections.unmodifiableList(critterMoves);
}
public void resetEvaluate()
{
evaluation = null;
lmeval = null;
value = Integer.MIN_VALUE;
}
public int getValue()
{
return value;
}
public void setValue(int v)
{
value = v;
}
public void setEvaluate(CritterMove cm, String val)
{
if (evaluation == null)
evaluation = new HashMap<CritterMove, String>();
evaluation.put(cm, val);
}
public void setEvaluate(String val)
{
lmeval = val;
}
@Override
public String toString()
{
List<String> cmStrings = new ArrayList<String>();
for (CritterMove cm : critterMoves)
{
cmStrings.add(cm.toString());
}
return Glob.glob(", ", cmStrings);
}
public String getStringWithEvaluation()
{
List<String> cmStrings = new ArrayList<String>();
for (CritterMove cm : critterMoves)
{
StringBuffer buf = new StringBuffer();
buf.append(cm.toString());
if (evaluation != null)
{
if (evaluation.containsKey(cm))
{
buf.append(" [");
buf.append(evaluation.get(cm));
buf.append("]");
}
}
cmStrings.add(buf.toString());
}
if (lmeval != null)
cmStrings.add(" {" + lmeval + "}");
return Glob.glob(", \n", cmStrings);
}
@Override
public boolean equals(Object ob)
{
if (!(ob instanceof LegionMove))
{
return false;
}
LegionMove lm = (LegionMove)ob;
return toString().equals(lm.toString());
}
public int compareTo(LegionMove m)
{
if (this.equals(m))
return 0; // we're trying to guarantee consistency with equals
if (this.getValue() < m.getValue())
return -1;
if (this.getValue() > m.getValue())
return 1;
return this.toString().compareTo(m.toString());
}
@Override
public int hashCode()
{
return toString().hashCode();
}
}