/*
* Copyright 2008 (C) Thomas Parker <thpr@users.sourceforge.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package plugin.lsttokens;
import java.util.StringTokenizer;
import pcgen.cdom.base.CDOMObject;
import pcgen.cdom.base.Constants;
import pcgen.cdom.base.Ungranted;
import pcgen.cdom.enumeration.ObjectKey;
import pcgen.rules.context.LoadContext;
import pcgen.rules.persistence.token.AbstractTokenWithSeparator;
import pcgen.rules.persistence.token.CDOMPrimaryToken;
import pcgen.rules.persistence.token.ParseResult;
import pcgen.util.enumeration.Load;
/**
* @author djones4
*/
public class UnencumberedmoveLst extends AbstractTokenWithSeparator<CDOMObject>
implements CDOMPrimaryToken<CDOMObject>
{
@Override
public String getTokenName()
{
return "UNENCUMBEREDMOVE";
}
@Override
protected char separator()
{
return '|';
}
@Override
protected ParseResult parseTokenWithSeparator(LoadContext context,
CDOMObject obj, String value)
{
if (obj instanceof Ungranted)
{
return new ParseResult.Fail("Cannot use " + getTokenName()
+ " on an Ungranted object type: "
+ obj.getClass().getSimpleName(), context);
}
StringTokenizer tok = new StringTokenizer(value, Constants.PIPE);
boolean hasArmor = false;
boolean hasMove = false;
Load loadMove = null;
Load loadArmor = null;
while (tok.hasMoreTokens())
{
String loadString = tok.nextToken();
if (loadString.equalsIgnoreCase("MediumLoad"))
{
ParseResult pr = validateOnlyMove(hasMove);
if (!pr.passed())
{
return pr;
}
loadMove = Load.MEDIUM;
hasMove = true;
}
else if (loadString.equalsIgnoreCase("HeavyLoad"))
{
ParseResult pr = validateOnlyMove(hasMove);
if (!pr.passed())
{
return pr;
}
loadMove = Load.HEAVY;
hasMove = true;
}
else if (loadString.equalsIgnoreCase("Overload"))
{
ParseResult pr = validateOnlyMove(hasMove);
if (!pr.passed())
{
return pr;
}
loadMove = Load.OVERLOAD;
hasMove = true;
}
else if (loadString.equalsIgnoreCase("MediumArmor"))
{
ParseResult pr = validateOnlyArmor(hasArmor);
if (!pr.passed())
{
return pr;
}
loadArmor = Load.MEDIUM;
hasArmor = true;
}
else if (loadString.equalsIgnoreCase("HeavyArmor"))
{
ParseResult pr = validateOnlyArmor(hasArmor);
if (!pr.passed())
{
return pr;
}
loadArmor = Load.OVERLOAD;
hasArmor = true;
}
else if (loadString.equalsIgnoreCase("LightLoad"))
{
ParseResult pr = validateOnlyMove(hasMove);
if (!pr.passed())
{
return pr;
}
loadMove = Load.LIGHT;
hasMove = true;
}
else if (loadString.equalsIgnoreCase("LightArmor"))
{
ParseResult pr = validateOnlyMove(hasArmor);
if (!pr.passed())
{
return pr;
}
loadArmor = Load.LIGHT;
hasArmor = true;
}
else
{
return new ParseResult.Fail("Invalid value of \""
+ loadString + "\" for UNENCUMBEREDMOVE in \""
+ obj.getDisplayName() + "\".", context);
}
}
context.getObjectContext().put(obj, ObjectKey.UNENCUMBERED_LOAD,
loadMove);
context.getObjectContext().put(obj, ObjectKey.UNENCUMBERED_ARMOR,
loadArmor);
return ParseResult.SUCCESS;
}
private ParseResult validateOnlyArmor(boolean hasArmor)
{
if (hasArmor)
{
return new ParseResult.Fail("Encountered Second Armor Load Type in "
+ getTokenName() + " this is not valid.");
}
return ParseResult.SUCCESS;
}
private ParseResult validateOnlyMove(boolean hasMove)
{
if (hasMove)
{
return new ParseResult.Fail("Encountered Second Move Load Type in "
+ getTokenName() + " this is not valid.");
}
return ParseResult.SUCCESS;
}
@Override
public String[] unparse(LoadContext context, CDOMObject obj)
{
Load load = context.getObjectContext().getObject(obj,
ObjectKey.UNENCUMBERED_LOAD);
Load at = context.getObjectContext().getObject(obj,
ObjectKey.UNENCUMBERED_ARMOR);
if (load == null && at == null)
{
return null;
}
StringBuilder sb = new StringBuilder();
if (load != null)
{
if (Load.OVERLOAD.equals(load))
{
sb.append("Overload");
}
else if (Load.HEAVY.equals(load))
{
sb.append("HeavyLoad");
}
else if (Load.MEDIUM.equals(load))
{
sb.append("MediumLoad");
}
else if (Load.LIGHT.equals(load))
{
sb.append("LightLoad");
}
else
{
context.addWriteMessage(getTokenName()
+ " encountered unknown Movement Load: " + load);
return null;
}
}
if (at != null)
{
if (sb.length() != 0)
{
sb.append(Constants.PIPE);
}
if (Load.OVERLOAD.equals(at))
{
sb.append("HeavyArmor");
}
else if (Load.MEDIUM.equals(at))
{
sb.append("MediumArmor");
}
else if (Load.LIGHT.equals(at))
{
sb.append("LightArmor");
}
else
{
context.addWriteMessage(getTokenName()
+ " encountered invalid Armor Load: " + load);
return null;
}
}
return new String[] { sb.toString() };
}
@Override
public Class<CDOMObject> getTokenClass()
{
return CDOMObject.class;
}
}