/** * 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); } } } } }
public static void addSpellsToClassForLevels( PlayerCharacter pc, Domain d, PCClass aClass, int minLevel, int maxLevel) { if (aClass == null) { return; } for (int aLevel = minLevel; aLevel <= maxLevel; aLevel++) { Collection<Spell> domainSpells = pc.getSpellsIn(d.get(ObjectKey.DOMAIN_SPELLLIST), aLevel); for (Spell spell : domainSpells) { List<CharacterSpell> slist = pc.getCharacterSpells(aClass, spell, Globals.getDefaultSpellBook(), aLevel); boolean flag = true; for (CharacterSpell cs1 : slist) { flag = !(cs1.getOwner().equals(d)); if (!flag) { break; } } if (flag) { CharacterSpell cs = new CharacterSpell(d, spell); cs.addInfo(aLevel, 1, Globals.getDefaultSpellBook()); pc.addCharacterSpell(aClass, cs); } } } }
/** * 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); } }
private static void addDomain(final PlayerCharacter aPC, PCClass cl, Domain d) { if (d.qualifies(aPC, d)) { // TODO Not entirely correct, as this takes this level, not // the level where BONUS DOMAINS was present ClassSource cs = new ClassSource(cl, aPC.getLevel(cl)); aPC.addDomain(d, cs); applyDomain(aPC, d); } }
@Override protected void setUp() throws Exception { super.setUp(); Domain goodDomain = new Domain(); goodDomain.setName("Good"); Globals.getContext().ref.importObject(goodDomain); Domain animalDomain = new Domain(); animalDomain.setName("Animal"); Globals.getContext().ref.importObject(animalDomain); deity = new Deity(); deity.setName("Test Deity"); deity.put(ObjectKey.ALIGNMENT, ng); deity.putToList( Deity.DOMAINLIST, CDOMDirectSingleRef.getRef(goodDomain), new SimpleAssociatedObject()); deity.putToList( Deity.DOMAINLIST, CDOMDirectSingleRef.getRef(animalDomain), new SimpleAssociatedObject()); }
/* (non-Javadoc) * @see pcgen.core.facade.SpellSupportFacade#getClassInfo(pcgen.core.facade.ClassFacade) */ @Override public String getClassInfo(ClassFacade spellcaster) { if (!(spellcaster instanceof PCClass)) { return ""; } PCClass aClass = (PCClass) spellcaster; SpellSupportForPCClass spellSupport = pc.getSpellSupport(aClass); int highestSpellLevel = spellSupport.getHighestLevelSpell(pc); final HtmlInfoBuilder b = new HtmlInfoBuilder(); b.append("<table border=1><tr><td><font size=-2><b>"); // $NON-NLS-1$ b.append(OutputNameFormatting.piString(aClass, false)).append(" ["); // $NON-NLS-1$ b.append( String.valueOf( charDisplay.getLevel(aClass) + (int) pc.getTotalBonusTo("PCLEVEL", aClass.getKeyName()))); // $NON-NLS-1$ b.append("]</b></font></td>"); // $NON-NLS-1$ for (int i = 0; i <= highestSpellLevel; ++i) { b.append("<td><font size=-2><b><center> "); // $NON-NLS-1$ b.append(String.valueOf(i)); b.append(" </b></center></font></td>"); // $NON-NLS-1$ } b.append("</tr>"); // $NON-NLS-1$ b.append("<tr><td><font size=-1><b>Cast</b></font></td>"); // $NON-NLS-1$ for (int i = 0; i <= highestSpellLevel; ++i) { b.append("<td><font size=-1><center>"); // $NON-NLS-1$ b.append(getNumCast(aClass, i, pc)); b.append("</center></font></td>"); // $NON-NLS-1$ } b.append("</tr>"); // $NON-NLS-1$ // Making sure KnownList can be handled safely and produces the correct behaviour if (spellSupport.hasKnownList() || spellSupport.hasKnownSpells(pc)) { b.append("<tr><td><font size=-1><b>Known</b></font></td>"); // $NON-NLS-1$ for (int i = 0; i <= highestSpellLevel; ++i) { final int a = spellSupport.getKnownForLevel(i, pc); final int bonus = spellSupport.getSpecialtyKnownForLevel(i, pc); b.append("<td><font size=-1><center>"); // $NON-NLS-1$ b.append(String.valueOf(a)); if (bonus > 0) { b.append('+').append(Integer.toString(bonus)); } b.append("</center></font></td>"); // $NON-NLS-1$ } b.append("</tr>"); // $NON-NLS-1$ } b.append("<tr><td><font size=-1><b>DC</b></font></td>"); // $NON-NLS-1$ for (int i = 0; i <= highestSpellLevel; ++i) { b.append("<td><font size=-1><center>"); // $NON-NLS-1$ b.append(String.valueOf(getDC(aClass, i, pc))); b.append("</center></font></td>"); // $NON-NLS-1$ } b.append("</tr></table>"); // $NON-NLS-1$ b.appendI18nElement("InfoSpells.caster.type", aClass.getSpellType()); // $NON-NLS-1$ b.appendLineBreak(); b.appendI18nElement("InfoSpells.stat.bonus", aClass.getSpellBaseStat()); // $NON-NLS-1$ if (pc.hasAssocs(aClass, AssociationKey.SPECIALTY) || charDisplay.hasDomains()) { boolean needComma = false; StringBuilder schoolInfo = new StringBuilder(); String spec = pc.getAssoc(aClass, AssociationKey.SPECIALTY); if (spec != null) { schoolInfo.append(spec); needComma = true; } for (Domain d : charDisplay.getSortedDomainSet()) { if (needComma) { schoolInfo.append(','); } needComma = true; schoolInfo.append(d.getKeyName()); } b.appendLineBreak(); b.appendI18nElement("InfoSpells.school", schoolInfo.toString()); // $NON-NLS-1$ } Set<String> set = new TreeSet<>(); for (SpellProhibitor sp : aClass.getSafeListFor(ListKey.PROHIBITED_SPELLS)) { set.addAll(sp.getValueList()); } Collection<? extends SpellProhibitor> prohibList = charDisplay.getProhibitedSchools(aClass); if (prohibList != null) { for (SpellProhibitor sp : prohibList) { set.addAll(sp.getValueList()); } } if (!set.isEmpty()) { b.appendLineBreak(); b.appendI18nElement( "InfoSpells.prohibited.school", //$NON-NLS-1$ StringUtil.join(set, ",")); // $NON-NLS-1$ } String bString = SourceFormat.getFormattedString(aClass, Globals.getSourceDisplay(), true); if (bString.length() > 0) { b.appendLineBreak(); b.appendI18nElement("in_source", bString); // $NON-NLS-1$ } return b.toString(); }