@Override public void affectCharStats(MOB affected, CharStats affectableStats) { super.affectCharStats(affected, affectableStats); affectableStats.setStat( CharStats.STAT_SAVE_MAGIC, affectableStats.getStat(CharStats.STAT_SAVE_MAGIC) + (affectableStats.getClassLevel(this))); if (CMath.bset(affected.basePhyStats().disposition(), PhyStats.IS_BONUS)) affectableStats.setStat( CharStats.STAT_CHARISMA, affectableStats.getStat(CharStats.STAT_CHARISMA) + 30); }
@Override public void initializeClass() { super.initializeClass(); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Skill_Recall", 50, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Skill_Write", 50, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Specialization_EdgedWeapon", 50, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Apothecary", false, "+WIS 12"); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "ThievesCant", 25, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Skill_Swim", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "ScrollScribing", 10, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Skill_Climb", 50, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Alchemy", false, "+INT 12 +WIS 12"); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_ReadMagic", true); // clan magic CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqAcid", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqCold", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqElectric", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqFire", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqGas", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqMind", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqParalysis", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqPoison", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqWater", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 1, "Spell_CEqDisease", 0, "", false, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 2, "Thief_Hide", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 2, "Spell_Erase", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 3, "Skill_WandUse", 25, true); CMLib.ableMapper().addCharAbilityMapping(ID(), 3, "Spell_EnchantArrows", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 4, "Spell_ClarifyScroll", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 4, "Thief_Sneak", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 5, "PaperMaking", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 5, "Skill_Revoke", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 5, "Thief_DetectTraps", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 6, "Skill_Dodge", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 6, "Thief_Pick", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 7, "Skill_Spellcraft", true); CMLib.ableMapper() .addCharAbilityMapping( ID(), 7, "Skill_IdentifyPoison", false, CMParms.parseSemicolons("Apothecary", true)); CMLib.ableMapper().addCharAbilityMapping(ID(), 8, "Skill_Disarm", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 8, "Thief_UsePoison", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 9, "Skill_Parry", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 9, "Thief_RemoveTraps", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 10, "Spell_RechargeWand", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 10, "Spell_RepairingAura", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 11, "Thief_Lore", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 11, "Skill_Trip", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 12, "Spell_Scribe", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 13, "Spell_DisenchantWand", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 13, "Skill_Map", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 14, "Fighter_RapidShot", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 15, "Spell_EnchantWand", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 15, "Thief_PowerGrab", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 16, "Spell_WardArea", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 16, "Spell_DetectInvisible", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 17, "Skill_Attack2", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 17, "Thief_Shadow", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 18, "Spell_Knock", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 19, "Spell_Refit", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 19, "Thief_Detection", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 20, "Spell_EnchantArmor", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 21, "Thief_Observation", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 22, "Spell_EnchantWeapon", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 22, "Thief_DampenAuras", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 23, "Spell_Mend", true); CMLib.ableMapper().addCharAbilityMapping(ID(), 24, "Spell_Disenchant", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 24, "Spell_ComprehendLangs", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 25, "Spell_StoreSpell", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 25, "Thief_SlipperyMind", false); CMLib.ableMapper().addCharAbilityMapping(ID(), 30, "Spell_MagicItem", true); }
@Override public void executeMsg(final Environmental myHost, final CMMsg msg) { super.executeMsg(myHost, msg); if ((myHost == null) || (!(myHost instanceof MOB))) return; final MOB mob = (MOB) myHost; if (msg.amISource(mob)) { if (((msg.sourceMinor() == CMMsg.TYP_LOOK) || (msg.sourceMinor() == CMMsg.TYP_EXAMINE)) && (msg.target() instanceof Wand) && (mob.charStats().getClassLevel(this) >= 30)) { final String message = "<O-NAME> has " + ((Wand) msg.target()).usesRemaining() + " charges remaining."; msg.addTrailerMsg( CMClass.getMsg( mob, null, msg.target(), CMMsg.MSG_OK_VISUAL, CMMsg.NO_EFFECT, CMMsg.NO_EFFECT, message)); } else if (msg.tool() != null) { if (msg.tool().ID().equals("Skill_Spellcraft")) { if ((msg.tool().text().length() > 0) && (msg.target() instanceof MOB)) { Ability A = ((MOB) msg.target()).fetchAbility(msg.tool().text()); if (A == null) return; final Ability myA = mob.fetchAbility(A.ID()); if (myA != null) { if ((!A.isSavable()) && ((A.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_SPELL) && (CMLib.ableMapper().lowestQualifyingLevel(A.ID()) < 30)) addAbilityToSpellcraftList(mob, A); } else if (CMLib.ableMapper().lowestQualifyingLevel(A.ID()) < 30) { final Vector<Ability> otherChoices = new Vector<Ability>(); for (int a = 0; a < mob.numAbilities(); a++) { final Ability A2 = mob.fetchAbility(a); if ((A2 != null) && (!A2.isSavable()) && ((A2.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_SPELL)) otherChoices.addElement(A2); } A = (Ability) A.copyOf(); A.setProficiency(0); A.setSavable(false); if (otherChoices.size() > (mob.charStats().getClassLevel(this) / 3)) { final Ability A2 = otherChoices.elementAt(CMLib.dice().roll(1, otherChoices.size(), -1)); clearAbilityFromSpellcraftList(mob, A2); } addAbilityToSpellcraftList(mob, A); } } } else if (msg.tool().ID().equals("Spell_Scribe") || msg.tool().ID().equals("Spell_EnchantWand") || msg.tool().ID().equals("Spell_MagicItem") || msg.tool().ID().equals("Spell_StoreSpell") || msg.tool().ID().equals("Spell_WardArea")) { final Ability A = mob.fetchAbility(msg.tool().text()); if ((A != null) && (!A.isSavable())) clearAbilityFromSpellcraftList(mob, A); } else if (msg.tool() instanceof Ability) { final Ability A = mob.fetchAbility(msg.tool().ID()); if ((A != null) && (!A.isSavable()) && ((A.classificationCode() & Ability.ALL_ACODES) == Ability.ACODE_SPELL)) clearAbilityFromSpellcraftList(mob, A); } } } }