/*
* Skill.java
* Copyright 2001 (C) Bryan McRoberts <merton_monk@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 April 21, 2001, 2:15 PM
*
* $Id$
*/
package pcgen.core;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import pcgen.base.formula.Formula;
import pcgen.base.formula.base.VarScoped;
import pcgen.base.lang.StringUtil;
import pcgen.cdom.base.ChooseDriver;
import pcgen.cdom.base.ChooseInformation;
import pcgen.cdom.base.ChooseSelectionActor;
import pcgen.cdom.enumeration.FormulaKey;
import pcgen.cdom.enumeration.ListKey;
import pcgen.cdom.enumeration.ObjectKey;
import pcgen.cdom.enumeration.Type;
import pcgen.cdom.reference.CDOMSingleRef;
import pcgen.core.bonus.BonusObj;
import pcgen.facade.core.SkillFacade;
/**
* <code>Skill</code>.
*
* @author Bryan McRoberts <merton_monk@users.sourceforge.net>
*/
public final class Skill extends PObject implements SkillFacade, ChooseDriver,
VarScoped
{
public String getKeyStatAbb()
{
CDOMSingleRef<PCStat> keyStat = get(ObjectKey.KEY_STAT);
return keyStat == null ? "" : keyStat.get().getKeyName();
}
@Override
public boolean equals(final Object obj)
{
return obj instanceof Skill
&& getKeyName().equalsIgnoreCase(((Skill) obj).getKeyName());
}
@Override
public int hashCode()
{
return getKeyName().hashCode();
}
/* (non-Javadoc)
* @see pcgen.core.facade.SkillFacade#getKeyStat()
*/
@Override
public String getKeyStat()
{
return getKeyStatAbb();
}
/* (non-Javadoc)
* @see pcgen.core.facade.SkillFacade#isUntrained()
*/
@Override
public boolean isUntrained()
{
return getSafe(ObjectKey.USE_UNTRAINED);
}
/* (non-Javadoc)
* @see pcgen.core.facade.SkillFacade#getTypes()
*/
@Override
public String getDisplayType()
{
List<Type> trueTypeList = getTrueTypeList(true);
return StringUtil.join(trueTypeList, ".");
}
@Override
public List<BonusObj> getRawBonusList(PlayerCharacter pc)
{
List<BonusObj> list = new ArrayList<>(super.getRawBonusList(pc));
list.sort(new SkillBonusComparator(this));
return list;
}
/**
* A comparator for sorting bonuses which puts the bonuses in the order
* bonuses to this skill, bonuses without prereqs, bonuses with prereqs.
*
* @author James Dempsey <jdempsey@users.sourceforge.net>
*/
public final class SkillBonusComparator implements Comparator<BonusObj>
{
private final Skill skill;
private SkillBonusComparator(Skill skill)
{
this.skill = skill;
}
@Override
public int compare(BonusObj arg0, BonusObj arg1)
{
boolean arg0BonusThisSkill = bonusToThisSkill(arg0);
boolean arg1BonusThisSkill = bonusToThisSkill(arg1);
if (arg0BonusThisSkill != arg1BonusThisSkill)
{
if (arg0BonusThisSkill)
{
return -1;
}
return 1;
}
if (arg0.hasPrerequisites() != arg1.hasPrerequisites())
{
if (arg1.hasPrerequisites())
{
return -1;
}
return 1;
}
return arg0.toString().compareTo(arg1.toString());
}
private boolean bonusToThisSkill(BonusObj bonus)
{
if (!"SKILL".equals(bonus.getBonusName()))
{
return false;
}
for (Object target : bonus.getBonusInfoList())
{
if (String.valueOf(target).equalsIgnoreCase(skill.getKeyName()))
{
return true;
}
}
return false;
}
}
@Override
public ChooseInformation<?> getChooseInfo()
{
return get(ObjectKey.CHOOSE_INFO);
}
@Override
public Formula getSelectFormula()
{
return getSafe(FormulaKey.SELECT);
}
@Override
public List<ChooseSelectionActor<?>> getActors()
{
return getListFor(ListKey.NEW_CHOOSE_ACTOR);
}
@Override
public String getFormulaSource()
{
return getKeyName();
}
@Override
public Formula getNumChoices()
{
return getSafe(FormulaKey.NUMCHOICES);
}
@Override
public String getLocalScopeName()
{
return "SKILL";
}
}