/* * PrereqHandler.java * Copyright 2001 (C) Bryan McRoberts <merton_monk@yahoo.com> * Copyright 2003 (C) Chris Ward <frugal@purplewombat.co.uk> * * 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 November 28, 2003 * * Current Ver: $Revision$ * */ package pcgen.core.prereq; import java.util.Collection; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; import pcgen.core.Ability; import pcgen.core.AbilityUtilities; import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.RuleConstants; import pcgen.system.LanguageBundle; import pcgen.util.Logging; /** * This class tests if the character passes the prerequisites for the caller. */ public final class PrereqHandler { /** * empty private constructor prevents instantiation. */ private PrereqHandler() { } /** * Test if the character passes the prerequisites for the caller. The caller * is used to check if prereqs can be bypassed by either preferences or via * Qualifies statements in templates or other objects applied to the * character. * * @param prereqList The list of prerequisites to be tested. * @param aPC The character to be checked. * @param caller The object that we are testing qualification for. * @return True if the character passes all prereqs. */ public static boolean passesAll( final Collection<Prerequisite> prereqList, final PlayerCharacter aPC, final Object caller) { if (prereqList == null || prereqList.isEmpty()) { return true; } if ((caller instanceof Ability) && (AbilityUtilities.isFeat(caller)) && Globals.checkRule(RuleConstants.FEATPRE)) { return true; } if (caller instanceof CDOMObject && aPC != null) { // Check for QUALIFY: if (aPC.checkQualifyList((CDOMObject) caller)) { return true; } } for (Prerequisite prereq : prereqList) { if (!passes(prereq, aPC, caller)) { return false; } } return true; } /** * * @param prereqList The list of prerequisites to be tested. * @param equip The Equipment that is the source of the prerequisite. * @param aPC The character to be checked. * @return true if all of the prerequisites pss. */ public static boolean passesAll( final Collection<Prerequisite> prereqList, final Equipment equip, PlayerCharacter aPC) { if (prereqList == null) { return true; } for (Prerequisite prereq : prereqList) { if (!passes(prereq, equip, aPC)) { return false; } } return true; } /** * Returns true if the character passes the prereq. * @param prereq The prerequisite to test. * @param aPC The character to test against * @param caller The CDOMObject that is calling this method * @return true if the character passes the prereq */ public static boolean passes( final Prerequisite prereq, final PlayerCharacter aPC, final Object caller) { if (aPC == null && prereq.isCharacterRequired()) { return true; } final PrerequisiteTestFactory factory = PrerequisiteTestFactory.getInstance(); final PrerequisiteTest test = factory.getTest(prereq.getKind()); if (test == null) { Logging.errorPrintLocalised( "PrereqHandler.Unable_to_find_implementation", prereq.toString()); //$NON-NLS-1$ return false; } final boolean overrideQualify = prereq.isOverrideQualify(); boolean autoQualifies = false; int total = 0; if (caller instanceof CDOMObject && aPC != null && aPC.checkQualifyList((CDOMObject) caller) && (!overrideQualify)) { autoQualifies = true; } if (autoQualifies) { return true; } try { CDOMObject cdomCaller = (caller instanceof CDOMObject) ? (CDOMObject) caller : null; total = test.passes(prereq, aPC, cdomCaller); } catch (PrerequisiteException pe) { Logging.errorPrintLocalised("PrereqHandler.Exception_in_test", pe); //$NON-NLS-1$ } catch (Exception e) { final String callerString = (caller != null) ? " for " + String.valueOf(caller) : Constants.EMPTY_STRING; Logging.errorPrint( "Problem encountered when testing PREREQ " + String.valueOf(prereq) + callerString + ". See following trace for details.", e); } return total > 0; } /** * * @param preReq The prerequisite to test. * @param equip The Equipment that is the source of the prerequisite. * @param aPC The character to be checked. * @return Whether the prerequisite passes. */ public static boolean passes( final Prerequisite preReq, final Equipment equip, PlayerCharacter aPC) { if (equip == null) { return true; } final PrerequisiteTestFactory factory = PrerequisiteTestFactory.getInstance(); final PrerequisiteTest test = factory.getTest(preReq.getKind()); if (test == null) { final String message = "PrereqHandler.Unable_to_find_implementation"; //$NON-NLS-1$ Logging.errorPrintLocalised(message, preReq.toString()); return false; } int total = 0; try { total = test.passes(preReq, equip, aPC); } catch (PrerequisiteException pe) { final String message = "PrereqHandler.Exception_in_test"; //$NON-NLS-1$ Logging.errorPrintLocalised(message , pe); } return total>0; } /** * Generates an HTML representation of a list of PreRequisite objects. * @param anArrayList the list of PreRequisite objects to be represented. * @return An HTML representation of the input. */ public static String toHtmlString(final Collection<Prerequisite> anArrayList) { if (anArrayList==null || anArrayList.isEmpty()) { return Constants.EMPTY_STRING; } final PrerequisiteTestFactory factory = PrerequisiteTestFactory.getInstance(); final StringBuilder pString = new StringBuilder(anArrayList.size() * 20); String delimiter = Constants.EMPTY_STRING; for (Prerequisite preReq : anArrayList) { final PrerequisiteTest preReqTest = factory.getTest(preReq.getKind()); if (preReqTest == null) { final String message = "PrereqHandler.No_known_formatter"; //$NON-NLS-1$ Logging.errorPrintLocalised(message, preReq.getKind()); } else { pString.append(delimiter); pString.append(preReqTest.toHtmlString(preReq)); final String property = "PrereqHandler.HTML_prerequisite_delimiter"; //$NON-NLS-1$ delimiter = LanguageBundle.getString(property); } } return pString.toString(); } }