/*
* KitClass.java
* Copyright 2005 (C) Aaron Divinsky <boomer70@yahoo.com>
*
* 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 August 20, 2005, 1640h
*
* $Id$
*/
package pcgen.core.kit;
import java.util.List;
import pcgen.base.formula.Formula;
import pcgen.cdom.base.CDOMReference;
import pcgen.cdom.base.Constants;
import pcgen.cdom.reference.CDOMSingleRef;
import pcgen.core.Kit;
import pcgen.core.PCClass;
import pcgen.core.PlayerCharacter;
import pcgen.core.SettingsHandler;
import pcgen.core.SubClass;
import pcgen.core.analysis.SubClassApplication;
import pcgen.core.prereq.PrereqHandler;
import pcgen.gui2.UIPropertyContext;
/**
* {@code KitClass} <strong>needs documentation</strong>.
*
* @author boomer70
*/
public class KitClass extends BaseKit
{
private CDOMSingleRef<PCClass> pcClass;
private Formula levelFormula;
private CDOMReference<SubClass> subClass;
// These members store the state of an instance of this class. They are
// not cloned.
private transient PCClass theClass = null;
private String theOrigSubClass = null;
private transient int theLevel = -1;
private transient boolean doLevelAbilities = true;
@Override
public String toString()
{
StringBuilder ret = new StringBuilder(100);
ret.append(pcClass.getLSTformat(false));
if (subClass != null)
{
ret.append("(").append(subClass.getLSTformat(false)).append(")");
}
ret.append(levelFormula);
return ret.toString();
}
@Override
public boolean testApply(Kit aKit, PlayerCharacter aPC,
List<String> warnings)
{
theLevel = -1;
doLevelAbilities = true;
theClass = pcClass.get();
theOrigSubClass = aPC.getSubClassName(theClass);
applySubClass(aPC);
if (!PrereqHandler.passesAll(theClass.getPrerequisiteList(), aPC, aKit))
{
PrereqHandler.toHtmlString(theClass.getPrerequisiteList());
warnings.add("CLASS: Not qualified for class \""
+ theClass.getKeyName() + "\".");
return false;
}
doLevelAbilities = aKit.doLevelAbilities();
// Temporarily increase the PCs level.
theLevel = levelFormula.resolve(aPC, "").intValue();
addLevel(aPC, theLevel, theClass, doLevelAbilities);
return true;
}
private void applySubClass(PlayerCharacter aPC)
{
if (subClass != null)
{
// Ensure the character has the class
PCClass heldClass = aPC.getClassKeyed(theClass.getKeyName());
if (heldClass == null)
{
aPC.incrementClassLevel(0, theClass);
heldClass = aPC.getClassKeyed(theClass.getKeyName());
}
// try and set a subclass too.
SubClassApplication.setSubClassKey(aPC, heldClass, getSubClass().getLSTformat(false));
}
}
@Override
public void apply(PlayerCharacter aPC)
{
applySubClass(aPC);
addLevel(aPC, theLevel, theClass, doLevelAbilities);
if (theOrigSubClass != null)
{
SubClassApplication.setSubClassKey(aPC, theClass, theOrigSubClass);
}
theClass = null;
}
private void addLevel(final PlayerCharacter pc, final int numLevels,
final PCClass aClass, final boolean doLevelAbilitiesIn)
{
// We want to level up as quietly as possible for kits.
boolean tempShowHP = SettingsHandler.getShowHPDialogAtLevelUp();
SettingsHandler.setShowHPDialogAtLevelUp(false);
// boolean tempFeatDlg = SettingsHandler.getShowFeatDialogAtLevelUp();
// SettingsHandler.setShowFeatDialogAtLevelUp(false);
int tempChoicePref = UIPropertyContext.getSingleChoiceAction();
UIPropertyContext.setSingleChoiceAction(Constants.CHOOSER_SINGLE_CHOICE_METHOD_SELECT_EXIT);
boolean tempDoLevelAbilities = pc.doLevelAbilities();
pc.setDoLevelAbilities(doLevelAbilitiesIn);
pc.incrementClassLevel(numLevels, aClass, true);
pc.setDoLevelAbilities(tempDoLevelAbilities);
UIPropertyContext.setSingleChoiceAction(tempChoicePref);
// SettingsHandler.setShowFeatDialogAtLevelUp(tempFeatDlg);
SettingsHandler.setShowHPDialogAtLevelUp(tempShowHP);
}
@Override
public String getObjectName()
{
return "Classes";
}
public void setPcclass(CDOMSingleRef<PCClass> ref)
{
pcClass = ref;
}
public CDOMReference<PCClass> getPcclass()
{
return pcClass;
}
public void setLevel(Formula formula)
{
levelFormula = formula;
}
public Formula getLevel()
{
return levelFormula;
}
public void setSubClass(CDOMReference<SubClass> sc)
{
subClass = sc;
}
public CDOMReference<SubClass> getSubClass()
{
return subClass;
}
}