protected boolean isLearnableWithoutPrereqs(ICharm charm) { if (!isLearnable(charm)) { return false; } for (ICharm parentCharm : charm.getLearnPrerequisitesCharms(this)) { if (!isLearned(parentCharm)) { return false; } } return true; }
@Override public final boolean isLearnable(ICharm charm) { if (isAlienCharm(charm)) { ICasteType casteType = context.getBasicCharacterContext().getCasteType(); if (!getCharmTemplateForCharacterType().isAllowedAlienCharms(casteType)) { return false; } if (charm.hasAttribute(ICharmData.NATIVE)) { return false; } } if (charm.isBlockedByAlternative(context.getMagicCollection())) { return false; } if (isMartialArtsCharm(charm)) { boolean isSiderealFormCharm = isFormCharm(charm) && hasLevel(Sidereal, charm); MartialArtsCharmConfiguration martialArtsConfiguration = new DefaultMartialArtsCharmConfiguration( this, context.getMagicCollection(), context.getBasicCharacterContext()); if (isSiderealFormCharm && !martialArtsConfiguration.isAnyCelestialStyleCompleted()) { return false; } if (!getMartialArtsRulesForCharacterType() .isCharmAllowed(charm, martialArtsConfiguration, isExperienced())) { return false; } } ICharm[] learnedCharms = getLearnedCharms(true); for (IndirectCharmRequirement requirement : charm.getAttributeRequirements()) { if (!requirement.isFulfilled(learnedCharms)) { return false; } } if (!(new CharmTraitRequirementChecker(getPrerequisiteModifyingCharms(), context, this) .areTraitMinimumsSatisfied(charm))) { return false; } for (ICharm parentCharm : charm.getLearnPrerequisitesCharms(this)) { if (!isLearnable(parentCharm)) { return false; } } return true; }
public final boolean isLearnable(ICharm charm) { if (isAlienCharm(charm)) { ICasteType casteType = context.getBasicCharacterContext().getCasteType(); if (!getCharmTemplate(getNativeCharacterType()).isAllowedAlienCharms(casteType)) { return false; } if (charm.hasAttribute(ICharmData.NOT_ALIEN_LEARNABLE)) { return false; } } if (charm.isBlockedByAlternative(context.getMagicCollection())) { return false; } if (MartialArtsUtilities.isMartialArtsCharm(charm)) { boolean isSiderealFormCharm = MartialArtsUtilities.isFormCharm(charm) && MartialArtsUtilities.hasLevel(MartialArtsLevel.Sidereal, charm); if (isSiderealFormCharm && !arbitrator.isCelestialMartialArtsGroupCompleted(getMartialArtsGroups())) { return false; } if (!getCharmTemplate(getNativeCharacterType()) .getMartialArtsRules() .isCharmAllowed( charm, context.getCharmContext().getCharmConfiguration(), context.getBasicCharacterContext().isExperienced())) { return false; } } for (ICharmAttributeRequirement requirement : charm.getAttributeRequirements()) { if (!requirement.isFulfilled(getLearnedCharms(true))) { return false; } } for (IGenericTrait prerequisite : charm.getPrerequisites()) { IGenericTrait prerequisiteTrait = context.getTraitCollection().getTrait(prerequisite.getType()); int prereq = prerequisite.getCurrentValue(); for (ISpecialCharm specialCharm : getPrerequisiteModifyingCharms()) if (specialCharm instanceof IPrerequisiteModifyingCharm && isLearned(specialCharm.getCharmId())) prereq = ((IPrerequisiteModifyingCharm) specialCharm) .getTraitModifier(charm, prerequisiteTrait.getType(), prereq); if (prerequisiteTrait == null || prereq > prerequisiteTrait.getCurrentValue()) { return false; } } IGenericTrait essenceTrait = context.getTraitCollection().getTrait(OtherTraitType.Essence); int essencePrereq = charm.getEssence().getCurrentValue(); for (ISpecialCharm specialCharm : getPrerequisiteModifyingCharms()) if (specialCharm instanceof IPrerequisiteModifyingCharm && isLearned(specialCharm.getCharmId())) essencePrereq = ((IPrerequisiteModifyingCharm) specialCharm) .getTraitModifier(charm, OtherTraitType.Essence, essencePrereq); if (essencePrereq > essenceTrait.getCurrentValue()) { return false; } for (ICharm parentCharm : charm.getLearnPrerequisitesCharms(this)) { if (!isLearnable(parentCharm)) { return false; } } return true; }