/** * Remove a domain from the character. * * @param pc The character * @param domain The domain. */ public static void removeDomain(PlayerCharacter pc, Domain domain) { ClassSource source = pc.getDomainSource(domain); PCClass aClass = pc.getClassKeyed(source.getPcclass().getKeyName()); if (aClass != null) { int maxLevel; for (maxLevel = 0; maxLevel < 10; maxLevel++) { if (pc.getSpellSupport(aClass).getCastForLevel(maxLevel, pc) == 0) { break; } } if (maxLevel > 0) { removeSpellsFromClassForLevels(pc, domain, aClass); } if ((maxLevel > 1) && (aClass.getSafe(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY) == 0)) { DomainSpellList domainSpellList = domain.get(ObjectKey.DOMAIN_SPELLLIST); final List<Spell> aList = pc.getAllSpellsInLists(Collections.singletonList(domainSpellList)); for (Spell gcs : aList) { if (SpellLevel.getFirstLvlForKey(gcs, domainSpellList, pc) < maxLevel) { pc.removeDomainSpellCount(aClass); break; } } } } if (!pc.isImporting()) { BonusActivation.deactivateBonuses(domain, pc); } }
@Override public boolean testApply(Kit aKit, PlayerCharacter aPC, List<String> warnings) { skillsToAdd = new ArrayList<KitSkillAdd>(); List<Skill> skillChoices = getSkillChoices(aPC); if (skillChoices == null || skillChoices.size() == 0) { // They didn't make a choice so don't add any ranks. return false; } for (Skill skill : skillChoices) { BigDecimal ranksLeftToAdd = getRank(); if (ranksLeftToAdd == null) { ranksLeftToAdd = BigDecimal.ONE; } double ranksLeft = ranksLeftToAdd.doubleValue(); List<PCClass> classList = new ArrayList<PCClass>(); if (className != null) { String classKey = className.resolvesTo().getKeyName(); // Make sure if they specified a class to add from we try that // class first. PCClass pcClass = aPC.getClassKeyed(classKey); if (pcClass != null) { classList.add(pcClass); } else { warnings.add( "SKILL: Could not find specified class " + classKey + " in PC to add ranks from."); } } for (PCClass pcClass : aPC.getClassSet()) { if (!classList.contains(pcClass)) { classList.add(pcClass); } } // Try and find a class we can add them from. boolean oldImporting = aPC.isImporting(); aPC.setImporting(true); for (PCClass pcClass : classList) { final KitSkillAdd sta = addRanks(aPC, pcClass, skill, ranksLeft, isFree(), warnings); if (sta != null) { skillsToAdd.add(sta); ranksLeft -= sta.getRanks(); if (ranksLeft <= 0.0) { break; } } } aPC.setImporting(oldImporting); if (ranksLeft > 0.0) { warnings.add( "SKILL: Could not add " + ranksLeft + " ranks to " + skill.getKeyName() + ". Not enough points."); } } return true; }
/** * Sets the locked flag on a PC * * @param pc */ public static void applyDomain(PlayerCharacter pc, Domain d) { ClassSource source = pc.getDomainSource(d); PCClass aClass = pc.getClassKeyed(source.getPcclass().getKeyName()); if (aClass != null) { int maxLevel; for (maxLevel = 0; maxLevel < 10; maxLevel++) { if (pc.getSpellSupport(aClass).getCastForLevel(maxLevel, pc) == 0) { break; } } if (maxLevel > 0) { addSpellsToClassForLevels(pc, d, aClass, 0, maxLevel - 1); } if ((maxLevel > 1) && (aClass.getSafe(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY) == 0)) { DomainSpellList domainSpellList = d.get(ObjectKey.DOMAIN_SPELLLIST); final List<Spell> aList = pc.getAllSpellsInLists(Collections.singletonList(domainSpellList)); for (Spell gcs : aList) { if (SpellLevel.getFirstLvlForKey(gcs, domainSpellList, pc) < maxLevel) { pc.setDomainSpellCount(aClass, 1); break; } } } } Collection<CDOMReference<Spell>> mods = d.getSafeListMods(Spell.SPELLS); for (CDOMReference<Spell> ref : mods) { Collection<Spell> spells = ref.getContainedObjects(); Collection<AssociatedPrereqObject> assoc = d.getListAssociations(Spell.SPELLS, ref); for (AssociatedPrereqObject apo : assoc) { if (!PrereqHandler.passesAll(apo.getPrerequisiteList(), pc, d)) { continue; } for (Spell s : spells) { String book = apo.getAssociation(AssociationKey.SPELLBOOK); List<CharacterSpell> aList = pc.getCharacterSpells(aClass, s, book, -1); if (aList.isEmpty()) { Formula times = apo.getAssociation(AssociationKey.TIMES_PER_UNIT); CharacterSpell cs = new CharacterSpell(d, s); int resolvedTimes = times.resolve(pc, d.getQualifiedKey()).intValue(); cs.addInfo(1, resolvedTimes, book); pc.addCharacterSpell(aClass, cs); } } } } }