/*
* StatToken.java
* Copyright 2003 (C) Devon Jones <soulcatcher@evilsoft.org>
*
* 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
*
* Created on December 15, 2003, 12:21 PM
*
* Current Ver: $Revision$
*
*/
package pcgen.io.exporttoken;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import pcgen.core.PCStat;
import pcgen.core.PlayerCharacter;
import pcgen.core.SettingsHandler;
import pcgen.core.analysis.StatAnalysis;
import pcgen.io.ExportHandler;
import pcgen.util.Delta;
import pcgen.util.Logging;
//STAT.x
//STAT.x.STAT
//STAT.x.BASE
//STAT.x.MOD
//STAT.x.BASEMOD
//STAT.x.NOTEMP
//STAT.x.NOTEMPMOD
//STAT.x.NAME
//STAT.x.LONGNAME
//STAT.x.LEVEL.x[.NOEQUIP][.NOPOST]
// Changed so that you can use any of the following arguments to
// get what you want:
// NOTEMP
// NOEQUIP
// NOPOST
// LEVEL.x
//
// You must supply either STAT, BASE or MOD somewhere in the line
// If neither is found, it will assume you want the STAT
public class StatToken extends Token
{
public static final String TOKENNAME = "STAT";
/**
* @see pcgen.io.exporttoken.Token#getTokenName()
*/
@Override
public String getTokenName()
{
return TOKENNAME;
}
/**
* @see pcgen.io.exporttoken.Token#getToken(java.lang.String, pcgen.core.PlayerCharacter, pcgen.io.ExportHandler)
*/
@Override
public String getToken(String tokenSource, PlayerCharacter pc,
ExportHandler eh)
{
String retString = "";
StringTokenizer aTok = new StringTokenizer(tokenSource, ".");
if (aTok.countTokens() < 2)
{
Logging.errorPrint("Invalid STAT token:" + tokenSource, new Throwable());
return "";
}
aTok.nextToken();
int indexOfStat;
indexOfStat = Integer.parseInt(aTok.nextToken());
if ((indexOfStat < 0) || (indexOfStat >= pc.getDisplay().getStatCount()))
{
return "";
}
List<PCStat> statList = new ArrayList<>(pc.getDisplay().getStatSet());
PCStat stat = statList.get(indexOfStat);
String findType = "STAT";
boolean useBase = false;
boolean useLevel = false;
int aLevel = 0;
boolean useEquip = true;
boolean useTemp = true;
boolean usePost = true;
while (aTok.hasMoreTokens())
{
String token = aTok.nextToken();
if ("NAME".equals(token))
{
return stat.getKeyName();
}
if ("LONGNAME".equals(token))
{
return stat.getDisplayName();
}
if ("ISNONABILITY".equals(token))
{
return pc.getDisplay().isNonAbility(stat) ? "Y" : "N";
}
if ("STAT".equals(token))
{
findType = "STAT";
}
else if ("MOD".equals(token))
{
findType = "MOD";
}
else if ("BASE".equals(token))
{
useBase = true;
}
else if ("BASEMOD".equals(token))
{
findType = "MOD";
useBase = true;
}
else if ("NOTEMP".equals(token))
{
useTemp = false;
}
else if ("NOTEMPMOD".equals(token))
{
findType = "MOD";
useTemp = false;
}
else if ("NOEQUIP".equals(token))
{
useEquip = false;
}
else if ("NOPOST".equals(token))
{
usePost = false;
}
else if ("LEVEL".equals(token))
{
try
{
aLevel = Integer.parseInt(aTok.nextToken());
}
catch (NumberFormatException nfe)
{
Logging.errorPrint("Malformed LEVEL.x tag");
}
useLevel = true;
}
}
if (findType.equals("MOD"))
{
if (useBase)
{
retString = getBaseModToken(pc, stat);
}
else
{
retString =
getModToken(pc, stat, useTemp, useEquip,
usePost, useLevel, aLevel);
}
}
else
{
if (useBase)
{
retString = getBaseToken(pc, stat);
}
else
{
retString =
getStatToken(pc, stat, useTemp, useEquip,
usePost, useLevel, aLevel);
}
}
return retString;
}
public static String getStatToken(PlayerCharacter pc, PCStat stat,
boolean useTemp, boolean useEquip, boolean usePost, boolean useLevel,
int aLevel)
{
return getStatToken(pc, stat, useTemp, useEquip, usePost, useLevel,
aLevel, true);
}
public static String getStatToken(PlayerCharacter pc, PCStat stat,
boolean useTemp, boolean useEquip, boolean usePost, boolean useLevel,
int aLevel, final boolean checkGameMode)
{
if (pc.getDisplay().isNonAbility(stat))
{
return "*";
}
int aTotal = 0;
if (useLevel)
{
if (useEquip && useTemp)
{
aTotal = pc.getTotalStatAtLevel(stat, aLevel, usePost);
}
else
{
aTotal =
pc.getPartialStatAtLevel(stat, aLevel,
usePost, useTemp, useEquip);
}
}
else if (useEquip && useTemp)
{
aTotal = pc.getTotalStatFor(stat);
}
else
{
aTotal =
StatAnalysis.getPartialStatFor(pc, stat, useTemp,
useEquip);
}
if (checkGameMode)
{
return SettingsHandler.getGame().getStatDisplayText(aTotal);
}
return Integer.toString(aTotal);
}
public static String getModToken(PlayerCharacter pc, PCStat stat,
boolean useTemp, boolean useEquip, boolean usePost, boolean useLevel,
int aLevel)
{
if (pc.getDisplay().isNonAbility(stat))
{
return "+0";
}
int aTotal =
Integer.parseInt(getStatToken(pc, stat, useTemp, useEquip,
usePost, useLevel, aLevel, false));
int temp = pc.getModForNumber(aTotal, stat);
return Delta.toString(temp);
}
public static String getBaseToken(PlayerCharacter pc, PCStat stat)
{
if (pc.getDisplay().isNonAbility(stat))
{
return "*";
}
return Integer.toString(pc.getBaseStatFor(stat));
}
public static String getBaseModToken(PlayerCharacter pc, PCStat stat)
{
if (pc.getDisplay().isNonAbility(stat))
{
return "+0";
}
int aTotal = Integer.parseInt(getBaseToken(pc, stat));
int temp = pc.getModForNumber(aTotal, stat);
return Delta.toString(temp);
}
/*
* Wrapper functions for calls with old arguments
*/
public static String getModToken(PlayerCharacter pc, PCStat stat)
{
return getModToken(pc, stat, true, true, true, false, 0);
}
}