package com.planet_ink.coffee_mud.CharClasses; import com.planet_ink.coffee_mud.core.interfaces.*; import com.planet_ink.coffee_mud.core.*; import com.planet_ink.coffee_mud.core.collections.*; import com.planet_ink.coffee_mud.Abilities.interfaces.*; import com.planet_ink.coffee_mud.Areas.interfaces.*; import com.planet_ink.coffee_mud.Behaviors.interfaces.*; import com.planet_ink.coffee_mud.CharClasses.interfaces.*; import com.planet_ink.coffee_mud.Commands.interfaces.*; import com.planet_ink.coffee_mud.Common.interfaces.*; import com.planet_ink.coffee_mud.Exits.interfaces.*; import com.planet_ink.coffee_mud.Items.interfaces.*; import com.planet_ink.coffee_mud.Libraries.interfaces.*; import com.planet_ink.coffee_mud.Locales.interfaces.*; import com.planet_ink.coffee_mud.MOBS.interfaces.*; import com.planet_ink.coffee_mud.Races.interfaces.*; import java.util.*; /* Copyright 2001-2019 Bo Zimmerman Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ public class Mage extends StdCharClass { @Override public String ID() { return "Mage"; } private final static String localizedStaticName = CMLib.lang().L("Mage"); @Override public String name() { return localizedStaticName; } @Override public String baseClass() { return ID(); } @Override public int getBonusPracLevel() { return 4; } @Override public int getBonusAttackLevel() { return 0; } @Override public int getAttackAttribute() { return CharStats.STAT_INTELLIGENCE; } @Override public int getLevelsPerBonusDamage() { return 30; } @Override public int getPracsFirstLevel() { return 6; } @Override public int getTrainsFirstLevel() { return 3; } @Override public String getMovementFormula() { return "3*((@x2<@x3)/18)"; } @Override public String getHitPointsFormula() { return "((@x6<@x7)/6)+(1*(1?5))"; } @Override public String getManaFormula() { return "((@x4<@x5)/3)+(1*(1?4))"; } @Override protected String armorFailMessage() { return L("<S-NAME> watch(es) <S-HIS-HER> armor absorb <S-HIS-HER> magical energy!"); } @Override public int allowedArmorLevel() { return CharClass.ARMOR_CLOTH; } @Override public int allowedWeaponLevel() { return CharClass.WEAPONS_MAGELIKE; } private final Set<Integer> disallowedWeapons = buildDisallowedWeaponClasses(); @Override protected Set<Integer> disallowedWeaponClasses(final MOB mob) { return disallowedWeapons; } @Override public int requiredArmorSourceMinor() { return CMMsg.TYP_CAST_SPELL; } protected boolean grantSomeSpells() { return true; } public Mage() { super(); maxStatAdj[CharStats.STAT_INTELLIGENCE]=7; } @Override public void initializeClass() { super.initializeClass(); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Skill_Write",100,true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Skill_WandUse",25,true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Skill_Recall",25,true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Skill_Revoke",true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Skill_Swim",false); CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Skill_Climb",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Skill_Spellcraft",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Skill_ScrollCopy",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"ScrollScribing",75,true); // level 1 CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_MagicMissile",true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_ResistMagicMissiles",true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_ReadMagic",true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_Shield",true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_IronGrip",true); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_Erase",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_MagicalAura",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_Ventriloquate",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_Prestidigitation",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_SpiderClimb",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_WizardsChest",false); CMLib.ableMapper().addCharAbilityMapping(ID(),1,"Spell_RepairingAura",false); // level 2 CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_Blur",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_Infravision",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_DetectUndead",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_ObscureSelf",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_SummonSteed",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_ResistPoison",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_EnchantArrows",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_Enlarge",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_Shrink",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_Light",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_Clog",false); CMLib.ableMapper().addCharAbilityMapping(ID(),2,"Spell_AnimateItem",false); // level 3 CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_KnowAlignment",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_DetectMetal",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_Dream",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_ResistGas",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_Grease",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_SummoningWard",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_SummonCompanion",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_WizardLock",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_Deafness",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_Knock",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_FeatherFall",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_Sleep",false); CMLib.ableMapper().addCharAbilityMapping(ID(),3,"Spell_FloatingDisc",false); // level 4 CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_FakeFood",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_FakeSpring",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_Frost",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_AcidArrow",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_Hunger",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_DetectWater",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_DetectPoison",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_ResistAcid",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_MageArmor",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_BurningHands",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_Friends",false); CMLib.ableMapper().addCharAbilityMapping(ID(),4,"Spell_WaterBreathing",false); // level 5 CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_DetectMagic",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_DetectGold",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_WallOfStone",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_Spook",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_CharmWard",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_ResistCold",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_Mend",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_WeaknessGas",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_DispelMagic",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_FaerieFire",false); CMLib.ableMapper().addCharAbilityMapping(ID(),5,"Spell_MysticShine",false); // level 6 CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_WeaknessAcid",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_Augury",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_Charm",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_Meld",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_IllusoryWall",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_FindFamiliar",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_StinkingCloud",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_DetectInvisible",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_ResistElectricity",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_GraceOfTheCat",false); CMLib.ableMapper().addCharAbilityMapping(ID(),6,"Spell_ShockingGrasp",false); // level 7 CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_WeaknessCold",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_Darkness",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_Invisibility",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_GhostSound",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_Tourettes",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_Refit",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_ResistFire",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_DetectHidden",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_PassDoor",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_Fireball",false); CMLib.ableMapper().addCharAbilityMapping(ID(),7,"Spell_SummonMonster",false); // level 8 CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_WeaknessElectricity",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_FaerieFog",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_Lightning",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_ResistDisease",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_TeleportationWard",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_Shatter",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_ElementalStorm",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_WallOfDarkness",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_Fear",false); CMLib.ableMapper().addCharAbilityMapping(ID(),8,"Spell_IdentifyObject",false); // level 9 CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_WeaknessFire",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_Blindness",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_Mirage",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_Awe",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_ComprehendLangs",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_MagicMouth",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_Daydream",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_IceSheet",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_Farsight",false); CMLib.ableMapper().addCharAbilityMapping(ID(),9,"Spell_Flameshield",false); // level 10 CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_LocateObject",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_Slow",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_ArcaneMark",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_PhantomHound",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_ResistArrows",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_Teleport",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_GustOfWind",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_Ugliness",false); CMLib.ableMapper().addCharAbilityMapping(ID(),10,"Spell_Mute",false); // level 11 CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_Claireaudience",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_Feeblemind",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_Stoneskin",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_WallOfIce",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_AcidFog",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_HeatMetal",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_Weaken",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_MirrorImage",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_ChangeSex",false); CMLib.ableMapper().addCharAbilityMapping(ID(),11,"Spell_ImprovedRepairingAura",0,false,CMParms.parseSemicolons("Spell_RepairingAura(100)",true)); // level 12 CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Laughter",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Clairevoyance",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Haste",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_DestroyObject",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Enlightenment",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_MinorGlobe",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Shelter",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Confusion",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Delirium",false); CMLib.ableMapper().addCharAbilityMapping(ID(),12,"Spell_Fly",false); //level 13 CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_DistantVision",false); CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_Reinforce",false); CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_ResistParalyzation",false); CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_FeignDeath",false); CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_Earthquake",false); CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_Gate",false); CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_GiantStrength",false); CMLib.ableMapper().addCharAbilityMapping(ID(),13,"Spell_Frenzy",false); // level 14 CMLib.ableMapper().addCharAbilityMapping(ID(),14,"Spell_KnowValue",false); CMLib.ableMapper().addCharAbilityMapping(ID(),14,"Spell_Silence",false); CMLib.ableMapper().addCharAbilityMapping(ID(),14,"Spell_ArcanePossession",false); CMLib.ableMapper().addCharAbilityMapping(ID(),14,"Spell_WallOfAir",false); CMLib.ableMapper().addCharAbilityMapping(ID(),14,"Spell_AnimateWeapon",false); CMLib.ableMapper().addCharAbilityMapping(ID(),14,"Spell_MassInvisibility",false); CMLib.ableMapper().addCharAbilityMapping(ID(),14,"Spell_Scribe",false); // level 15 CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Spell_Ensnare",false); CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Spell_Hold",false); CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Spell_FakeWeapon",false); CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Spell_Blink",false); CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Spell_Polymorph",false); CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Spell_Youth",0,"",false,true); CMLib.ableMapper().addCharAbilityMapping(ID(),15,"Spell_Irritation",false); // level 16 CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Spell_ChainLightening",false); CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Spell_Choke",false); CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Spell_Dismissal",false); CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Skill_Meditation",false); CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Spell_MageClaws",false); CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Spell_FreeMovement",false); CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Spell_PredictWeather",false); CMLib.ableMapper().addCharAbilityMapping(ID(),16,"Spell_FakeArmor",false); // level 17 CMLib.ableMapper().addCharAbilityMapping(ID(),17,"Spell_ClarifyScroll",false); CMLib.ableMapper().addCharAbilityMapping(ID(),17,"Spell_FoolsGold",false); CMLib.ableMapper().addCharAbilityMapping(ID(),17,"Spell_WallOfFire",false); CMLib.ableMapper().addCharAbilityMapping(ID(),17,"Spell_Siphon",false); CMLib.ableMapper().addCharAbilityMapping(ID(),17,"Spell_Portal",false); CMLib.ableMapper().addCharAbilityMapping(ID(),17,"Spell_RechargeWand",false); // level 18 CMLib.ableMapper().addCharAbilityMapping(ID(),18,"Spell_SeeAura",false); CMLib.ableMapper().addCharAbilityMapping(ID(),18,"Spell_ReverseGravity",false); CMLib.ableMapper().addCharAbilityMapping(ID(),18,"Spell_Web",false); CMLib.ableMapper().addCharAbilityMapping(ID(),18,"Spell_Delude",false); CMLib.ableMapper().addCharAbilityMapping(ID(),18,"Spell_ResistPetrification",false); CMLib.ableMapper().addCharAbilityMapping(ID(),18,"Spell_Summon",false); // level 19 CMLib.ableMapper().addCharAbilityMapping(ID(),19,"Spell_FleshStone",false); CMLib.ableMapper().addCharAbilityMapping(ID(),19,"Spell_Forget",false); CMLib.ableMapper().addCharAbilityMapping(ID(),19,"Spell_StoneFlesh",false); CMLib.ableMapper().addCharAbilityMapping(ID(),19,"Spell_WallOfForce",false); CMLib.ableMapper().addCharAbilityMapping(ID(),19,"Spell_ImprovedInvisibility",false); // level 20 CMLib.ableMapper().addCharAbilityMapping(ID(),20,"Spell_Scry",false); CMLib.ableMapper().addCharAbilityMapping(ID(),20,"Spell_ImprovedPolymorph",false); CMLib.ableMapper().addCharAbilityMapping(ID(),20,"Spell_Nightmare",false); CMLib.ableMapper().addCharAbilityMapping(ID(),20,"Spell_Cloudkill",false); CMLib.ableMapper().addCharAbilityMapping(ID(),20,"Spell_Repulsion",false); CMLib.ableMapper().addCharAbilityMapping(ID(),20,"Spell_EnchantArmor",false); // level 21 CMLib.ableMapper().addCharAbilityMapping(ID(),21,"Alchemy",false); CMLib.ableMapper().addCharAbilityMapping(ID(),21,"Spell_Command",false); CMLib.ableMapper().addCharAbilityMapping(ID(),21,"Spell_Immunity",false); CMLib.ableMapper().addCharAbilityMapping(ID(),21,"Spell_SummonEnemy",false); CMLib.ableMapper().addCharAbilityMapping(ID(),21,"Spell_MassHaste",false); // level 22 CMLib.ableMapper().addCharAbilityMapping(ID(),22,"Spell_Disenchant",false); CMLib.ableMapper().addCharAbilityMapping(ID(),22,"Spell_MajorGlobe",false); CMLib.ableMapper().addCharAbilityMapping(ID(),22,"Spell_Hungerless",false); CMLib.ableMapper().addCharAbilityMapping(ID(),22,"Spell_MeteorStorm",false); CMLib.ableMapper().addCharAbilityMapping(ID(),22,"Spell_EnchantWeapon",false); CMLib.ableMapper().addCharAbilityMapping(ID(),22,"Spell_DetectSentience",false); // level 23 CMLib.ableMapper().addCharAbilityMapping(ID(),23,"Spell_Dragonfire",false); CMLib.ableMapper().addCharAbilityMapping(ID(),23,"Spell_MindBlock",false); CMLib.ableMapper().addCharAbilityMapping(ID(),23,"Spell_Cogniportive",false); CMLib.ableMapper().addCharAbilityMapping(ID(),23,"Spell_TimeStop",false); CMLib.ableMapper().addCharAbilityMapping(ID(),23,"Spell_CombatPrecognition",false); // level 24 CMLib.ableMapper().addCharAbilityMapping(ID(),24,"Spell_Delay",false); CMLib.ableMapper().addCharAbilityMapping(ID(),24,"Spell_Frailty",false); CMLib.ableMapper().addCharAbilityMapping(ID(),24,"Spell_Boomerang",false); CMLib.ableMapper().addCharAbilityMapping(ID(),24,"Spell_Thirstless",false); CMLib.ableMapper().addCharAbilityMapping(ID(),24,"Spell_SummonFlyer",false); CMLib.ableMapper().addCharAbilityMapping(ID(),24,"Spell_Anchor",false); // level 25 CMLib.ableMapper().addCharAbilityMapping(ID(),25,"Spell_SpellTurning",false); CMLib.ableMapper().addCharAbilityMapping(ID(),25,"Spell_Disintegrate",false); CMLib.ableMapper().addCharAbilityMapping(ID(),25,"Spell_DemonGate",false); CMLib.ableMapper().addCharAbilityMapping(ID(),25,"Spell_MassFly",false); CMLib.ableMapper().addCharAbilityMapping(ID(),25,"Spell_Geas",false); // level 30 if(ID().equals(baseClass())) CMLib.ableMapper().addCharAbilityMapping(ID(),30,"Spell_Spellbinding",true); } @Override public int availabilityCode() { return Area.THEME_FANTASY; } private final String[] raceRequiredList=new String[]{ "Human","Elf","Dragon","Humanoid","Illithid", "Gnome","Fairy-kin","HalfElf","Mindflayer","Svirfneblin", "Githyanki","Merfolk","Faerie","Orc" }; @Override public String[] getRequiredRaceList() { return raceRequiredList; } @SuppressWarnings("unchecked") private final Pair<String,Integer>[] minimumStatRequirements=new Pair[] { new Pair<String,Integer>("Intelligence",Integer.valueOf(9)) }; @Override public Pair<String,Integer>[] getMinimumStatRequirements() { return minimumStatRequirements; } @Override public void grantAbilities(final MOB mob, final boolean isBorrowedClass) { super.grantAbilities(mob,isBorrowedClass); if(!grantSomeSpells()) return; final Vector<String> grantable=new Vector<String>(); final int level=mob.charStats().getClassLevel(this); int numSpells=3; if(level<8) numSpells=3; else if(level<19) numSpells=2; else numSpells=1; for(final Enumeration<Ability> a=CMClass.abilities();a.hasMoreElements();) { final Ability A=a.nextElement(); if((CMLib.ableMapper().getQualifyingLevel(ID(),true,A.ID())==level) &&((CMLib.ableMapper().getQualifyingLevel(ID(),true,A.ID())<=25) &&(!CMLib.ableMapper().getSecretSkill(ID(),true,A.ID())) &&(!CMLib.ableMapper().getDefaultGain(ID(),true,A.ID())) &&((A.classificationCode()&Ability.ALL_ACODES)==Ability.ACODE_SPELL))) { if (!grantable.contains(A.ID())) grantable.addElement(A.ID()); } } for(int a=0;a<mob.numAbilities();a++) { final Ability A=mob.fetchAbility(a); if(grantable.contains(A.ID())) { grantable.remove(A.ID()); numSpells--; } } for(int i=0;i<numSpells;i++) { if(grantable.size()==0) break; final String AID=grantable.elementAt(CMLib.dice().roll(1,grantable.size(),-1)); if(AID!=null) { grantable.removeElement(AID); giveMobAbility(mob, CMClass.getAbility(AID), CMLib.ableMapper().getDefaultProficiency(ID(),true,AID), CMLib.ableMapper().getDefaultParm(ID(),true,AID), isBorrowedClass); } } } @Override public List<Item> outfit(final MOB myChar) { if(outfitChoices==null) { final Weapon w=CMClass.getWeapon("Quarterstaff"); if(w == null) return new Vector<Item>(); outfitChoices=new Vector<Item>(); outfitChoices.add(w); } return outfitChoices; } }