diff --git a/Notes/NUI Spellbook Notes.txt b/Notes/NUI Spellbook Notes.txt new file mode 100644 index 00000000..6aa65b98 --- /dev/null +++ b/Notes/NUI Spellbook Notes.txt @@ -0,0 +1,18 @@ +hp_pa_events -> prc_nui_pa_event* +hp_pa_script -> prc_nui_pa_trggr +hp_pa_view -> prc_nui_pa_view +hp_sb_events -> prc_nui_sb_event +hp_sb_otscript -> prc_nui_sb_trggr +hp_sb_view -> prc_nui_sb_view + + +//:: INCLUDES +hp_nui_consts -> prc_nui_consts +hp_sb_script -> prc_nui_sb_inc +hp_string_util -> prc_string_inc +hp_sb_desc_view -> prc_nui_sbd_inc + +//:: Events +hp_chatscript -> prc_onplayerchat +hp_nui_events -> prc_onplayernui +hp_otevent -> prc_onplaytarget \ No newline at end of file diff --git a/nwn/nwnprc/trunk/2das/loadhints.2da b/nwn/nwnprc/trunk/2das/loadhints.2da index 181c3a02..f398a19c 100644 --- a/nwn/nwnprc/trunk/2das/loadhints.2da +++ b/nwn/nwnprc/trunk/2das/loadhints.2da @@ -1,103 +1,106 @@ 2DA V2.0 - LABEL HINT CAMPAIGNONLY -0 Hint1 67053 0 -1 Hint2 67054 1 -2 Hint3 67055 0 -3 Hint3 67653 0 -4 Hint3 67655 1 -5 Hint3 67656 1 -6 Hint3 67657 0 -7 Hint3 67658 0 -8 Hint3 67659 0 -9 Hint3 67660 0 -10 Hint3 67661 0 -11 Hint3 67662 1 -12 Hint3 67663 0 -13 Hint3 67664 0 -14 Hint3 67665 1 -15 Hint3 67666 1 -16 Hint3 67667 1 -17 Hint3 67668 0 -18 Hint3 67669 1 -19 Hint3 67670 1 -20 Hint3 67671 0 -21 Hint3 67672 0 -22 Hint3 67673 1 -23 Hint3 67707 1 -24 Hint 68481 0 -25 Hint 68486 0 -26 Qbar2Wp 45 0 -27 DeadHen 68700 1 -28 Hint 40109 0 -29 Hint 40112 0 -30 Hint 40113 2 -31 Hint 40114 1 -32 Hint 40115 2 -33 Hint 40116 2 -34 Hint 40117 2 -35 Hint 40118 2 -36 Hint 40119 2 -37 Hint 40120 2 -38 Hint 40121 2 -39 Hint 40122 2 -40 Hint 40123 2 -41 Hint 40124 2 -42 Hint 40125 2 -43 Hint 40126 2 -44 Hint 40127 2 -45 Hint 40128 2 -46 Hint 40129 2 -47 Hint 40130 2 -48 Hint 40131 2 -49 Hint 40132 2 -50 Hint 40133 2 -51 Hint 40134 2 -52 Hint 40135 2 -53 Hint 40136 2 -54 Hint 40137 2 -55 Hint 40545 2 -56 RestHint 40552 2 -57 HealingHint 40575 2 -58 DeathHint 40576 2 -59 WeaponHint 40580 2 -60 HenchEquipHint 76393 2 -61 RaiseDead 83458 3 -62 CraftFeatHint 83613 1 -63 ContinualLight 83786 0 -64 UseHenches 85567 3 -65 RestHint2 85569 3 -66 PowerAttack 85575 3 -67 PaleMaster1 85703 3 -68 PaleMaster2 85704 3 -69 Wounding 85765 0 -70 Geography101 86778 3 -71 spellcasting 86871 3 -72 lowac 86872 3 -73 shapeshift 86873 3 -74 lightgems 86874 3 -75 useRelic 86881 3 -76 PoolOfsouls 86882 3 -77 Rest 86883 3 -78 AC30 86884 3 -79 Armor 86885 3 -80 SpellMantle 86886 0 -81 InvisiblityCounter 86887 3 -82 UseProperWeapons 86888 3 -83 IllithidBrainSuck 86889 3 -84 AlchemistsFire 100938 0 -85 WeaponFinesse 110100 3 -86 StoresAndShifter 110118 0 -87 PRC8_LETO 16852017 0 -88 PRC8_SPONTANEOUS 16852018 0 -89 PRC8_SPELLSLOTS 16852019 0 -90 PRC8_TWOHANDED 16852020 0 -91 PRC8_DELEVEL 16852021 0 -92 PRC8_EXALTED_VILE 16852022 0 -93 PRC8_OPTIONS 16852023 0 -94 PRC8_INVALID_FEATS_SKILLS 16852024 0 -95 PRC8_MARKER_FEATS 16852025 0 -96 PRC8_INVOKING 16852026 0 -97 PRC8_SPELLCRAFT 16852027 0 -98 PRC8_TUMBLE 16852028 0 -99 PRC8_MASTERFEATS 16852029 0 + LABEL HINT CAMPAIGNONLY +0 Hint1 67053 0 +1 Hint2 67054 1 +2 Hint3 67055 0 +3 Hint3 67653 0 +4 Hint3 67655 1 +5 Hint3 67656 1 +6 Hint3 67657 0 +7 Hint3 67658 0 +8 Hint3 67659 0 +9 Hint3 67660 0 +10 Hint3 67661 0 +11 Hint3 67662 1 +12 Hint3 67663 0 +13 Hint3 67664 0 +14 Hint3 67665 1 +15 Hint3 67666 1 +16 Hint3 67667 1 +17 Hint3 67668 0 +18 Hint3 67669 1 +19 Hint3 67670 1 +20 Hint3 67671 0 +21 Hint3 67672 0 +22 Hint3 67673 1 +23 Hint3 67707 1 +24 Hint 68481 0 +25 Hint 68486 0 +26 Qbar2Wp 45 0 +27 DeadHen 68700 1 +28 Hint 40109 0 +29 Hint 40112 0 +30 Hint 40113 2 +31 Hint 40114 1 +32 Hint 40115 2 +33 Hint 40116 2 +34 Hint 40117 2 +35 Hint 40118 2 +36 Hint 40119 2 +37 Hint 40120 2 +38 Hint 40121 2 +39 Hint 40122 2 +40 Hint 40123 2 +41 Hint 40124 2 +42 Hint 40125 2 +43 Hint 40126 2 +44 Hint 40127 2 +45 Hint 40128 2 +46 Hint 40129 2 +47 Hint 40130 2 +48 Hint 40131 2 +49 Hint 40132 2 +50 Hint 40133 2 +51 Hint 40134 2 +52 Hint 40135 2 +53 Hint 40136 2 +54 Hint 40137 2 +55 Hint 40545 2 +56 RestHint 40552 2 +57 HealingHint 40575 2 +58 DeathHint 40576 2 +59 WeaponHint 40580 2 +60 HenchEquipHint 76393 2 +61 RaiseDead 83458 3 +62 CraftFeatHint 83613 1 +63 ContinualLight 83786 0 +64 UseHenches 85567 3 +65 RestHint2 85569 3 +66 PowerAttack 85575 3 +67 PaleMaster1 85703 3 +68 PaleMaster2 85704 3 +69 Wounding 85765 0 +70 Geography101 86778 3 +71 spellcasting 86871 3 +72 lowac 86872 3 +73 shapeshift 86873 3 +74 lightgems 86874 3 +75 useRelic 86881 3 +76 PoolOfsouls 86882 3 +77 Rest 86883 3 +78 AC30 86884 3 +79 Armor 86885 3 +80 SpellMantle 86886 0 +81 InvisiblityCounter 86887 3 +82 UseProperWeapons 86888 3 +83 IllithidBrainSuck 86889 3 +84 AlchemistsFire 100938 0 +85 WeaponFinesse 110100 3 +86 StoresAndShifter 110118 0 +87 PRC8_LETO 16852017 0 +88 PRC8_SPONTANEOUS 16852018 0 +89 PRC8_SPELLSLOTS 16852019 0 +90 PRC8_TWOHANDED 16852020 0 +91 PRC8_DELEVEL 16852021 0 +92 PRC8_EXALTED_VILE 16852022 0 +93 PRC8_OPTIONS 16852023 0 +94 PRC8_INVALID_FEATS_SKILLS 16852024 0 +95 PRC8_MARKER_FEATS 16852025 0 +96 PRC8_INVOKING 16852026 0 +97 PRC8_SPELLCRAFT 16852027 0 +98 PRC8_TUMBLE 16852028 0 +99 PRC8_MASTERFEATS 16852029 0 +100 PRC_NUI_SPELLBOOK 16852030 0 +101 PRC_NUI_POWERATTACK 16852031 0 +102 **** **** **** diff --git a/nwn/nwnprc/trunk/include/prc_feat_const.nss b/nwn/nwnprc/trunk/include/prc_feat_const.nss index 5401ca18..cf0f1d1c 100644 --- a/nwn/nwnprc/trunk/include/prc_feat_const.nss +++ b/nwn/nwnprc/trunk/include/prc_feat_const.nss @@ -187,7 +187,7 @@ const int FEAT_SANCTIFY_MARTIAL_ELVEN_THINBLADE = 24864; const int FEAT_SANCTIFY_MARTIAL_ELVEN_COURTBLADE = 24865; //:: Web Enhancement Feats -const int FEAT_CHARMING_THE_ARROW = 25997; +const int FEAT_CHARMING_THE_ARROW = 25998; //:: Skill Based Feats const int FEAT_JUMP = 2884; @@ -3906,7 +3906,7 @@ const int FEAT_IMPROVED_TRIP = 2807; const int FEAT_PRC_IMP_DISARM = 5196; const int FEAT_AWESOME_BLOW = 5370; const int FEAT_IMPROVED_SHIELD_BASH = 3250; -const int FEAT_INVESTIGATOR = 25997; +const int FEAT_INVESTIGATOR = 25998; // Player's Handbook II Feats const int FEAT_STEADFAST_DETERMINATION = 3267; diff --git a/nwn/nwnprc/trunk/include/prc_nui_consts.nss b/nwn/nwnprc/trunk/include/prc_nui_consts.nss new file mode 100644 index 00000000..0cb0efa2 --- /dev/null +++ b/nwn/nwnprc/trunk/include/prc_nui_consts.nss @@ -0,0 +1,113 @@ +//:://///////////////////////////////////////////// +//:: NUI Constants +//:: prc_nui_consts +//::////////////////////////////////////////////// +/* + This file holds all the constants used by the various PRC NUI scripts. +*/ +//::////////////////////////////////////////////// +//:: Created By: Rakiov +//:: Created On: 24.05.2005 +//::////////////////////////////////////////////// + +const int NUI_PAYLOAD_BUTTON_LEFT_CLICK = 0; +const int NUI_PAYLOAD_BUTTON_MIDDLE_CLICK = 1; +const int NUI_PAYLOAD_BUTTON_RIGHT_CLICK = 2; + + +////////////////////////////////////////////////// +// // +// NUI Spellbook // +// // +////////////////////////////////////////////////// + +// This is the NUI Spellbook window ID +const string PRC_SPELLBOOK_NUI_WINDOW_ID = "prcSpellbookNui"; + +// This is the base Id for the Class buttons in the NUI Spellbook, the ID will +// have the ClassID attached to it (i.e. spellbookClassButton_123) +const string PRC_SPELLBOOK_NUI_CLASS_BUTTON_BASEID = "spellbookClassButton_"; + +// This is the base Id for the Spell Circle buttons in the NUI Spellbook, the ID will +// have the Circle attached to it (i.e. spellbookCircleButton__6) +const string PRC_SPELLBOOK_NUI_CIRCLE_BUTTON_BASEID = "spellbookCircleButton_"; + +// This is the base Id for the Spell Buttons in the NUI Spellbook, the ID will +// have the SpellbookId (the row of the class's spell's 2da or equivalent) +// attached to it (i.e. spellbookSpellButton_6) +const string PRC_SPELLBOOK_NUI_SPELL_BUTTON_BASEID = "spellbookSpellButton_"; + +// This is the base Id for the Meta Feat buttons in the NUI Spellbook, the ID will +// have the FeatID attached to it (i.e. spellbookMetaButton_12345) +const string PRC_SPELLBOOK_NUI_META_BUTTON_BASEID = "spellbookMetaButton_"; + +// This is the selected ClassID var used to store what class was selected to the Player +// locally +const string PRC_SPELLBOOK_SELECTED_CLASSID_VAR = "prcSpellbookSelectedClassID"; + +// This is the selected Circle var used to store what spell circle was selected +// to the Player locally +const string PRC_SPELLBOOK_SELECTED_CIRCLE_VAR = "prcSpellbookSelectedCircle"; + +// This is the Spellbook NUI geomeotry var, used to allow the location and sizing +// of the NUI to be remembered if it is ever rerendered. +const string PRC_SPELLBOOK_NUI_GEOMETRY_VAR = "sbNuiGeometry"; + +// This is the Selected SpellID Var, used to tell the OnTarget script what spell +// we are using after manual targetting +const string NUI_SPELLBOOK_SELECTED_SPELLID_VAR = "NUI_Spellbook_SpellId"; + +// This is the Selected FeatID Var, used to tell the OnTarget script what feat +// we are using after manual targetting +const string NUI_SPELLBOOK_SELECTED_FEATID_VAR = "NUI_Spellbook_FeatID"; + +// This is the Selected SubSpellID Var, used in conjuncture with the Selected FeatID +// to allow radial spells to work (it needs the master spell's featID and the sub spell's +// SpellID for it to work. +const string NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR = "NUI_Spellbook_SubSpellID"; + +// This is the OnTarget action var saved to the player locally to say if we are +// using the NUI Spellbook spell or not. +const string NUI_SPELLBOOK_ON_TARGET_ACTION_VAR = "ONPLAYERTARGET_ACTION"; + +// This is a Boolean to tell the target script if the selected feat is a persoanl feat +// and can only be used on the executing object. +const string NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT = "NUI_Spellbook_IsPersonalFeat"; + +const string NUI_SPELL_DESCRIPTION_WINDOW_ID = "NUI_Spell_Description"; +const string NUI_SPELL_DESCRIPTION_OK_BUTTON = "NUIDescriptionOKButton"; + +// This is the limit of how many spell buttons we can have in a row before we +// need to start a new row on the NUI Spellbook. +const int NUI_SPELLBOOK_SPELL_BUTTON_LENGTH = 9; + +const string NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR = "NUI_Spellbook_GetBinderSpellToFeatDictionaryCache"; +const string NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR = "NUI_Spellbook_GetToBStanceSpellListCache_"; +const string NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR = "NUI_Spellbook_GetInvokerShapeSpellListCache_"; +const string NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR = "NUISpellbookClassEssence_"; + + + +////////////////////////////////////////////////// +// // +// NUI Power Attack // +// // +////////////////////////////////////////////////// + +// The Window ID for the Power Attack NUI +const string NUI_PRC_POWER_ATTACK_WINDOW = "nui_prc_power_attack_window"; + +// LocalVar for the geometry of the Power Attack NUI window +const string NUI_PRC_PA_GEOMETRY_VAR = "paNuiGeometry"; + +// Event For Left "-" button of the Power Attack NUI +const string NUI_PRC_PA_LEFT_BUTTON_EVENT = "nui_prc_pa_left_button_event"; +// Event For Right "+" Button of the Power Attack NUI +const string NUI_PRC_PA_RIGHT_BUTTON_EVENT = "nui_prc_pa_right_button_event"; + +// Bind for Text of the Power Attack NUI saying what the current Power Attack level is +const string NUI_PRC_PA_TEXT_BIND = "nui_prc_pa_text_bind"; +// Left Button Enabled Bind for Power Attack NUI +const string NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND = "leftButtonEnabled"; +// Right Button Enabled Bind for Power Attack NUI +const string NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND = "rightButtonEnabled"; \ No newline at end of file diff --git a/nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss b/nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss new file mode 100644 index 00000000..81768b61 --- /dev/null +++ b/nwn/nwnprc/trunk/include/prc_nui_sb_inc.nss @@ -0,0 +1,1124 @@ +//:://///////////////////////////////////////////// +//:: PRC Spellbook Script +//:: prc_nui_sb_inc +//::////////////////////////////////////////////// +/* + This is the script that handles some backend work for the PRC Spellbook + NUI View +*/ +//::////////////////////////////////////////////// +//:: Created By: Rakiov +//:: Created On: 24.05.2005 +//::////////////////////////////////////////////// +#include "inc_newspellbook" +#include "psi_inc_psifunc" +#include "inc_lookups" +#include "prc_nui_consts" + +// +// GetSpellListForCircle +// Gets the spell list for a specified class at the specified circle. +// +// Arguments: +// oPlayer:object the player +// nClass:int the ClassID +// circle:int the circle we want to grab for +// +// Returns: +// json:Array a list of all the spellIDs of the given circle +// +json GetSpellListForCircle(object oPlayer, int nClass, int circle); + +// +// GetSupportedNUISpellbookClasses +// Gets the list of support PRC classes that can use the NUi spellbook that +// the player has. +// +// Arguments: +// oPlayer:object the player this is being determined for +// +// Returns: +// json:int list of class ids that have the player has that can use the +// NUI spellbook. +// +json GetSupportedNUISpellbookClasses(object oPlayer); + +// +// GetCurrentSpellLevel +// Gets the current spell level the class can achieve at the current +// caster level (ranging from 0-9) +// +// Arguments: +// nClass:int the ClassID +// nLevel:int the caster level +// +// Returns: +// int the circle the class can achieve currently +// +int GetCurrentSpellLevel(int nClass, int nLevel); + +// +// GetMaxSpellLevel +// Gets the highest possible circle the class can achieve (from 0-9) +// +// Arguments: +// nClass:int the ClassID +// +// Returns: +// int the highest circle that can be achieved +// +int GetMaxSpellLevel(int nClass); + +// +// GetMinSpellLevel +// Gets the lowest possible circle the class can achieve (from 0-9) +// +// Arguments: +// nClass:int the ClassID +// +// Returns: +// int the lowest circle that can be achieved +// +int GetMinSpellLevel(int nClass); + +// +// GetHighestLevelPossibleInClass +// Given a class Id this will determine what the max level of a class can be +// achieved +// +// Arguments: +// nClass:int the ClassID +// +// Returns: +// int the highest possible level the class can achieve +// +int GetHighestLevelPossibleInClass(int nClass); + +// +// GetClassSpellbookFile +// Gets the class 2da spellbook/ability for the given class Id +// +// Arguments: +// nClass:int the classID +// +// Returns: +// string the 2da file name for the spell/abilities of the ClassID +// +string GetClassSpellbookFile(int nClass); + +// +// IsSpellKnown +// Returns whether the player with the given class, spell file, and spellbook id +// knows the spell or not +// +// Arguments: +// oPlayer;Object the player +// nClass:int the class ID +// spellId:int the spell ID to check +// +// Returns: +// int:Boolean TRUE if spell is known, FALSE otherwise +// +int IsSpellKnown(object oPlayer, int nClass, int spellId); + +// +// IsClassAllowedToUseNUISpellbook +// Takes a player and a classId and determines if thee class is allowed to +// be using the NUI spellbook. +// +// Arguments: +// oPlayer:Object the player +// nClass:int the ClassID +// +// Returns: +// int:Boolean TRUE if allowed to use the spellbook, FALSE otherwise +// +int IsClassAllowedToUseNUISpellbook(object oPlayer, int nClass); + +// +// CanClassUseMetamagicFeats +// Given a class id determines if it is allowed to use the Metamagic feats +// +// Arguments: +// nClass:int the ClassID +// +// Returns: +// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise +// +int CanClassUseMetamagicFeats(int nClass); + +// +// CanClassUseSuddenMetamagicFeats +// Given a class id determines if it is allowed to use the Sudden Metamagic feats +// +// Arguments: +// nClass:int the ClassID +// +// Returns: +// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise +// +int CanClassUseSuddenMetamagicFeats(int nClass); + +// +// CanClassUseMetaPsionicFeats +// Given a class id determines if it is allowed to use the MetaPsionic feats +// +// Arguments: +// nClass:int the ClassID +// +// Returns: +// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise +// +int CanClassUseMetaPsionicFeats(int nClass); + +// +// CanClassUseMetaMysteryFeats +// Given a class id determines if it is allowed to use the MetaMystery feats +// +// Arguments: +// nClass:int the ClassID +// +// Returns: +// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise +// +int CanClassUseMetaMysteryFeats(int nClass); + +// +// GetMetaMagicFeatList +// Gets the list of MetaMagic featIDs +// +// Returns: +// json:Array the list of FeatIDs associated with the meta feats +// +json GetMetaMagicFeatList(); + +// +// GetSuddenMetaMagicFeatList +// Gets the list of Sudden MetaMagic featIDs +// +// Returns: +// json:Array the list of FeatIDs associated with the meta feats +// +json GetSuddenMetaMagicFeatList(); + +// +// GetMetaPsionicFeatList +// Gets the list of MetaPsionic featIDs +// +// Returns: +// json:Array the list of FeatIDs associated with the meta feats +// +json GetMetaPsionicFeatList(); + +// +// GetMetaMagicMysteryList +// Gets the list of MetaMystery featIDs +// +// Returns: +// json:Array the list of FeatIDs associated with the meta feats +// +json GetMetaMysteryFeatList(); + +// +// GetTrueClassIfRHD +// Checks to make sure if the provided RHD class and player's race +// match up to give them their proper spell caster class (ie Glouras have +// bard spells and thus should be treated like a bard class) +// +// Arguments: +// oPlayer:object the player +// nClass:int the ClassID +// +// Returns: +// int the true ClassID to use, otherwise nClass +// +int GetTrueClassIfRHD(object oPlayer, int nClass); + +// +// GetBinderSpellToFeatDictionary +// Sets up the Binder Spell Dictionary that is used to match a binder's vestige +// to their feat. This is constructed based off the binder's known location of +// their feat and spell ranges in the base 2das respectivly. After constructing +// this it will be saved to the player locally as a cached result since we do +// not need to call this again. +// +// Argument: +// oPlayer:object the player +// +// Returns: +// json:Dictionary a dictionary of mapping between the SpellID +// and the FeatID of a vestige ability +// +json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF); + +// +// ShouldAddSpell +// Given a spellId and a class, determines if the spell should be added to the +// spellbook (as some are added in it's own special row or for other reasons) +// +// Arguments: +// nClass:int the ClassID +// spellId:int the SpellID +// oPlayer:object the player +// +// Returns: +// int:Boolean TRUE if the spell should be added, FALSE otherwise +// +int ShouldAddSpell(int nClass, int spellId, object oPlayer=OBJECT_SELF); + +// +// GetToBStanceSpellList +// Gets the ToB Stance Spell List for the given class +// +// Arguments: +// nClass:int ClassID +// oPlayer:object the player +// +// Returns: +// json:Array the list of stances' SpellIDs +// +json GetToBStanceSpellList(int nClass, object oPlayer=OBJECT_SELF); + +// +// GetInvokerShapeSpellList +// Gets the Invoker Shapes Spell List for the given class +// +// Arguments: +// nClass:int ClassID +// oPlayer:object the player +// +// Returns: +// json:Array the list of shapes' SpellIDs +// +json GetInvokerShapeSpellList(int nClass, object oPlayer=OBJECT_SELF); + +// +// GetInvokerEssenceSpellList +// Gets the Invoker Essences Spell List for the given class +// +// Arguments: +// nClass:int ClassID +// oPlayer:object the player +// +// Returns: +// json:Array the list of essences' SpellIDs +// +json GetInvokerEssenceSpellList(int nClass, object oPlayer=OBJECT_SELF); + +// +// JsonArrayContainsInt +// A helper function that takes a json array list and sees if the int item is within i +// +// Arguments: +// list:json:Array the list of ints +// item:int the item we are looking for +// +// Returns: +// int:Boolean TRUE if item is found, FALSE otherwise +// +int JsonArrayContainsInt(json list, int item); + +json GetSpellListForCircle(object oPlayer, int nClass, int circle) +{ + json retValue = JsonArray(); + string sFile = GetClassSpellbookFile(nClass); + int totalSpells; + json binderDictKeys; + //Special case for Binder since they don't have their own spellbook 2da + if (nClass == CLASS_TYPE_BINDER) + { + json binderDict = GetBinderSpellToFeatDictionary(oPlayer); + + // we loop through the list of SpellIDs + binderDictKeys = JsonObjectKeys(binderDict); + totalSpells = JsonGetLength(binderDictKeys); + } + else + totalSpells = Get2DARowCount(sFile); + + int i; + for (i = 0; i < totalSpells; i++) + { + int currentSpell; + if (nClass == CLASS_TYPE_BINDER) + currentSpell = StringToInt(JsonGetString(JsonArrayGet(binderDictKeys, i))); + else + currentSpell = StringToInt(Get2DACache(sFile, "SpellID", i)); + + if (ShouldAddSpell(nClass, currentSpell, oPlayer)) + { + string sSpellLevel = Get2DACache("spells", "Innate", currentSpell); + int iSpellLevel = StringToInt(sSpellLevel); + + if (nClass == CLASS_TYPE_BINDER && IsSpellKnown(oPlayer, nClass, currentSpell)) + { + retValue = JsonArrayInsert(retValue, JsonInt(currentSpell)); + } + else if ((iSpellLevel == circle && IntToString(iSpellLevel) == sSpellLevel)) + { + // We add the spell if it is known and is not a radial master spell (since those don't work) + if (IsSpellKnown(oPlayer, nClass, currentSpell)) + retValue = JsonArrayInsert(retValue, JsonInt(i)); + } + } + } + + return retValue; +} + +int ShouldAddSpell(int nClass, int spellId, object oPlayer=OBJECT_SELF) +{ + int isRadialMasterSpell = StringToInt(Get2DACache("spells", "SubRadSpell1", spellId)); + // We don't add radial master spells + if (isRadialMasterSpell) + return FALSE; + // we don't add essences and shapes + if (nClass == CLASS_TYPE_WARLOCK + || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT + || nClass == CLASS_TYPE_DRAGON_SHAMAN) + { + json ignoreList = GetInvokerShapeSpellList(nClass, oPlayer); + if (JsonArrayContainsInt(ignoreList, spellId)) + return FALSE; + ignoreList = GetInvokerEssenceSpellList(nClass, oPlayer); + if (JsonArrayContainsInt(ignoreList, spellId)) + return FALSE; + } + // we don't add stances + if (nClass == CLASS_TYPE_WARBLADE + || nClass == CLASS_TYPE_SWORDSAGE + || nClass == CLASS_TYPE_CRUSADER) + { + json ignoreList = GetToBStanceSpellList(nClass, oPlayer); + if (JsonArrayContainsInt(ignoreList, spellId)) + return FALSE; + } + + return TRUE; +} + +json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF) +{ + // a dictionary of + json binderDict = GetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR); + // if this hasn't been created, create it now. + if (binderDict == JsonNull()) + binderDict = JsonObject(); + else + return binderDict; + + // the starting row for binder spells + int spellIndex = 19070; + // the starting row for binder feats + int featIndex = 9030; + //the end of the binder spells/feats + while (spellIndex <= 19156 && featIndex <= 9104) + { + // get the SpellID tied to the feat + int spellID = StringToInt(Get2DACache("feat", "SPELLID", featIndex)); + // if the spellID matches the current index, then this is the spell + // attached to the feat + if (spellID == spellIndex) + { + binderDict = JsonObjectSet(binderDict, IntToString(spellID), JsonInt(featIndex)); + + // move to next spell/feat + featIndex++; + spellIndex++; + } + // else we have reached a subdial spell + else + { + // loop through until we reach back at spellID + while (spellIndex < spellID) + { + int masterSpell = StringToInt(Get2DACache("spells", "Master", spellIndex)); + + // add the sub radial to the dict, tied to the master's FeatID + int featId = JsonGetInt(JsonObjectGet(binderDict, IntToString(masterSpell))); + binderDict = JsonObjectSet(binderDict, IntToString(spellIndex), JsonInt(featId)); + + spellIndex++; + } + + + // some feats overlap the same FeatID, can cause this to get stuck. + // if it happens then move on + if (spellIndex > spellID) + featIndex++; + } + } + + // cache the result + SetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR, binderDict); + return binderDict; +} + +string GetClassSpellbookFile(int nClass) +{ + string sFile; + // Spontaneous casters use a specific file name structure + if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS + || nClass == CLASS_TYPE_ARCHIVIST) + { + sFile = GetFileForClass(nClass); + } + // everyone else uses this structure + else + { + sFile = GetAMSDefinitionFileName(nClass); + + if (nClass == CLASS_TYPE_BINDER) + { + sFile = "vestiges"; + } + } + + return sFile; +} + +json GetSupportedNUISpellbookClasses(object oPlayer) +{ + json retValue = JsonArray(); + int i = 1; + while(i >= 1) + { + int classId = GetClassByPosition(i, oPlayer); + if (classId != CLASS_TYPE_INVALID) + { + if (IsClassAllowedToUseNUISpellbook(oPlayer, classId)) + { + classId = GetTrueClassIfRHD(oPlayer, classId); + retValue = JsonArrayInsert(retValue, JsonInt(classId)); + } + i++; + } + else + { + i = -1; + } + } + + return retValue; +} + +int IsSpellKnown(object oPlayer, int nClass, int spellId) +{ + // special case for Binders since they don't have a spell book 2da. + if (nClass == CLASS_TYPE_BINDER) + { + json binderDict = GetBinderSpellToFeatDictionary(oPlayer); + int featID = JsonGetInt(JsonObjectGet(binderDict, IntToString(spellId))); + return GetHasFeat(featID, oPlayer); + } + + int currentSpell = spellId; + int masterSpell = StringToInt(Get2DACache("spells", "Master", currentSpell)); + if (masterSpell) // If this is not 0 then this is a radial spell, check the radial master + currentSpell = masterSpell; + + string sFeatID = Get2DACache("spells", "FeatID", currentSpell); + int iFeatID = StringToInt(sFeatID); + + if (IntToString(iFeatID) == sFeatID) + return GetHasFeat(iFeatID, oPlayer); + + return FALSE; +} + +int GetCurrentSpellLevel(int nClass, int nLevel) +{ + int currentLevel = nLevel; + + // ToB doesn't have a concept of spell levels, but still match up to it + if(nClass == CLASS_TYPE_WARBLADE + || nClass == CLASS_TYPE_SWORDSAGE + || nClass == CLASS_TYPE_CRUSADER) + { + return 9; + } + + // Binders don't really have a concept of spell level + if (nClass == CLASS_TYPE_BINDER + || nClass == CLASS_TYPE_DRAGON_SHAMAN) + return 1; + + //Shadowsmith has no concept of spell levels + if (nClass == CLASS_TYPE_SHADOWSMITH) + return 2; + + //Shadowcaster has no concept of spell levels + if (nClass == CLASS_TYPE_SHADOWCASTER) + return 9; + + if (nClass == CLASS_TYPE_WARLOCK + || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) + return 4; + + // Spont casters have their own function + if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS + || nClass == CLASS_TYPE_ARCHIVIST) + { + + int maxLevel = GetMaxSpellLevelForCasterLevel(nClass, currentLevel); + return maxLevel; + } + else + { + // everyone else uses this + string spellLevel2da = GetAMSKnownFileName(nClass); + + currentLevel = nLevel - 1; // Level is 1 off of the row in the 2da + + //Psionics have MaxPowerLevel as their column name + string columnName = "MaxPowerLevel"; + + //Invokers have MaxInvocationLevel + if (nClass == CLASS_TYPE_WARLOCK + || nClass == CLASS_TYPE_DRAGON_SHAMAN + || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) + columnName = "MaxInvocationLevel"; + + // Truenamers have 3 sets of utterances, ranging from 1-6, EvolvingMind covers the entire range + if (nClass == CLASS_TYPE_TRUENAMER) + { + columnName = "EvolvingMind"; + spellLevel2da = "cls_true_maxlvl"; //has a different 2da we want to look at + } + + if (nClass == CLASS_TYPE_BINDER) + { + columnName = "VestigeLvl"; + spellLevel2da = "cls_bind_binder"; + } + + // ToB doesn't have a concept of this, but we don't care. + + int maxLevel = StringToInt(Get2DACache(spellLevel2da, columnName, currentLevel)); + return maxLevel; + } +} + +int GetMinSpellLevel(int nClass) +{ + + // ToB doesn't have a concept of spell levels, but still match up to it + if(nClass == CLASS_TYPE_WARBLADE + || nClass == CLASS_TYPE_SWORDSAGE + || nClass == CLASS_TYPE_CRUSADER + || nClass == CLASS_TYPE_SHADOWCASTER //Shadowsmiths doesn't have a progression 2da :) + || nClass == CLASS_TYPE_SHADOWSMITH //Shadowcasters doesn't have a progression 2da :) + || nClass == CLASS_TYPE_BINDER // Binders don't really have a concept of spell level + || nClass == CLASS_TYPE_DRAGON_SHAMAN //Invokers have an issue with tracking accurate spell levels, so this is a work around + || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT + || nClass == CLASS_TYPE_WARLOCK) + { + return 1; + } + + // again sponts have their own function + if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS + || nClass == CLASS_TYPE_ARCHIVIST) + { + return GetMinSpellLevelForCasterLevel(nClass, GetHighestLevelPossibleInClass(nClass)); + } + else + { + return GetCurrentSpellLevel(nClass, 1); + } + +} + +int GetMaxSpellLevel(int nClass) +{ + return GetCurrentSpellLevel(nClass, GetHighestLevelPossibleInClass(nClass)); +} + +int GetHighestLevelPossibleInClass(int nClass) +{ + string sFile; + + //sponts have their spells in the classes.2da + if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS + || nClass == CLASS_TYPE_ARCHIVIST) + { + sFile = Get2DACache("classes", "SpellGainTable", nClass); + } + else + { + // everyone else uses this + sFile = GetAMSKnownFileName(nClass); + + if (nClass == CLASS_TYPE_TRUENAMER) + { + sFile = "cls_true_maxlvl"; //has a different 2da we want to look at + } + + if (nClass == CLASS_TYPE_BINDER) + { + sFile = "cls_bind_binder"; + } + } + + return Get2DARowCount(sFile); +} + +int IsClassAllowedToUseNUISpellbook(object oPlayer, int nClass) +{ + // This controls who can use the Spellbook NUI, if for some reason you don't + // want a class to be allowed to use this you can comment out their line here + + // Bard and Sorc are allowed if they took a PRC that makes them use the spellbook + if ((nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER) + && GetPrCAdjustedClassLevel(nClass, oPlayer) > GetLevelByClass(nClass, oPlayer)) + return TRUE; + + // Arcane Spont + if (nClass == CLASS_TYPE_ASSASSIN + || nClass == CLASS_TYPE_BEGUILER + || nClass == CLASS_TYPE_CELEBRANT_SHARESS + || nClass == CLASS_TYPE_DREAD_NECROMANCER + || nClass == CLASS_TYPE_DUSKBLADE + || nClass == CLASS_TYPE_HARPER + || nClass == CLASS_TYPE_HEXBLADE + || nClass == CLASS_TYPE_KNIGHT_WEAVE + || nClass == CLASS_TYPE_SHADOWLORD + || nClass == CLASS_TYPE_SUBLIME_CHORD + || nClass == CLASS_TYPE_SUEL_ARCHANAMACH + || nClass == CLASS_TYPE_WARMAGE) + return TRUE; + + // Psionics + if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN + || nClass == CLASS_TYPE_PSION + || nClass == CLASS_TYPE_PSYWAR + || nClass == CLASS_TYPE_WILDER + || nClass == CLASS_TYPE_PSYCHIC_ROGUE + || nClass == CLASS_TYPE_WARMIND) + return TRUE; + + // Invokers + if (nClass == CLASS_TYPE_WARLOCK + || nClass == CLASS_TYPE_DRAGON_SHAMAN + || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) + return TRUE; + + // Divine Spont + if (nClass == CLASS_TYPE_ARCHIVIST //while technically prepared, they use the spont system of casting + || nClass == CLASS_TYPE_FAVOURED_SOUL + || nClass == CLASS_TYPE_JUSTICEWW) + return TRUE; + + // ToB Classes + if (nClass == CLASS_TYPE_WARBLADE + || nClass == CLASS_TYPE_SWORDSAGE + || nClass == CLASS_TYPE_CRUSADER) + return TRUE; + + // Mystery Classes + if (nClass == CLASS_TYPE_SHADOWCASTER + || nClass == CLASS_TYPE_SHADOWSMITH) + return TRUE; + + // Truenamers + if (nClass == CLASS_TYPE_TRUENAMER) + return TRUE; + + // RHD Casters + if ((nClass == CLASS_TYPE_SHAPECHANGER + && GetRacialType(oPlayer) == RACIAL_TYPE_ARANEA + && !GetLevelByClass(CLASS_TYPE_SORCERER)) + || (nClass == CLASS_TYPE_OUTSIDER + && GetRacialType(oPlayer) == RACIAL_TYPE_RAKSHASA + && !GetLevelByClass(CLASS_TYPE_SORCERER)) + || (nClass == CLASS_TYPE_ABERRATION + && GetRacialType(oPlayer) == RACIAL_TYPE_DRIDER + && !GetLevelByClass(CLASS_TYPE_SORCERER)) + || (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_ARKAMOI + && !GetLevelByClass(CLASS_TYPE_SORCERER)) + || (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_HOBGOBLIN_WARSOUL + && !GetLevelByClass(CLASS_TYPE_SORCERER)) + || (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_REDSPAWN_ARCANISS + && !GetLevelByClass(CLASS_TYPE_SORCERER)) + || (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_MARRUTACT + && !GetLevelByClass(CLASS_TYPE_SORCERER)) + || (nClass == CLASS_TYPE_FEY + && GetRacialType(oPlayer) == RACIAL_TYPE_GLOURA + && !GetLevelByClass(CLASS_TYPE_BARD))) + return TRUE; + + // Binders + if (nClass == CLASS_TYPE_BINDER) + return TRUE; + + return FALSE; +} + +int GetTrueClassIfRHD(object oPlayer, int nClass) +{ + if (nClass == CLASS_TYPE_SHAPECHANGER + && GetRacialType(oPlayer) == RACIAL_TYPE_ARANEA) + return CLASS_TYPE_SORCERER; + if (nClass == CLASS_TYPE_OUTSIDER + && GetRacialType(oPlayer) == RACIAL_TYPE_RAKSHASA) + return CLASS_TYPE_SORCERER; + if (nClass == CLASS_TYPE_ABERRATION + && GetRacialType(oPlayer) == RACIAL_TYPE_DRIDER) + return CLASS_TYPE_SORCERER; + if (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_ARKAMOI) + return CLASS_TYPE_SORCERER; + if (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_HOBGOBLIN_WARSOUL) + return CLASS_TYPE_SORCERER; + if (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_REDSPAWN_ARCANISS) + return CLASS_TYPE_SORCERER; + if (nClass == CLASS_TYPE_MONSTROUS + && GetRacialType(oPlayer) == RACIAL_TYPE_MARRUTACT) + return CLASS_TYPE_SORCERER; + if (nClass == CLASS_TYPE_FEY + && GetRacialType(oPlayer) == RACIAL_TYPE_GLOURA) + return CLASS_TYPE_BARD; + + return nClass; +} + +int CanClassUseMetamagicFeats(int nClass) +{ + // I don't want to spend the time looping through each class's + // feat 2da so this is the list of all classes that are allowed to use the + // Spellbook NUI and can use Metamagic + return (nClass == CLASS_TYPE_ASSASSIN + || nClass == CLASS_TYPE_BARD + || nClass == CLASS_TYPE_SORCERER + || nClass == CLASS_TYPE_BEGUILER + || nClass == CLASS_TYPE_DREAD_NECROMANCER + || nClass == CLASS_TYPE_DUSKBLADE + || nClass == CLASS_TYPE_HEXBLADE + || nClass == CLASS_TYPE_JUSTICEWW + || nClass == CLASS_TYPE_SUBLIME_CHORD + || nClass == CLASS_TYPE_SUEL_ARCHANAMACH + || nClass == CLASS_TYPE_FAVOURED_SOUL + || nClass == CLASS_TYPE_WARMAGE); +} + +int CanClassUseSuddenMetamagicFeats(int nClass) +{ + // I don't want to spend the time looping through each class's + // feat 2da so this is the list of all classes that are allowed to use the + // Spellbook NUI and can use Sudden Metamagic + return (nClass == CLASS_TYPE_SHADOWLORD + || nClass == CLASS_TYPE_ARCHIVIST + || nClass == CLASS_TYPE_ASSASSIN + || nClass == CLASS_TYPE_BARD + || nClass == CLASS_TYPE_BEGUILER + || nClass == CLASS_TYPE_DREAD_NECROMANCER + || nClass == CLASS_TYPE_DUSKBLADE + || nClass == CLASS_TYPE_FAVOURED_SOUL + || nClass == CLASS_TYPE_HEXBLADE + || nClass == CLASS_TYPE_JUSTICEWW + || nClass == CLASS_TYPE_KNIGHT_WEAVE + || nClass == CLASS_TYPE_SUBLIME_CHORD + || nClass == CLASS_TYPE_SORCERER + || nClass == CLASS_TYPE_SUEL_ARCHANAMACH + || nClass == CLASS_TYPE_WARMAGE); +} + +int CanClassUseMetaPsionicFeats(int nClass) +{ + // I don't want to spend the time looping through each class's + // feat 2da so this is the list of all classes that are allowed to use the + // Spellbook NUI and can use Metapsionics + return (nClass == CLASS_TYPE_FIST_OF_ZUOKEN + || nClass == CLASS_TYPE_PSION + || nClass == CLASS_TYPE_PSYCHIC_ROGUE + || nClass == CLASS_TYPE_PSYWAR + || nClass == CLASS_TYPE_WARMIND + || nClass == CLASS_TYPE_WILDER); +} + +int CanClassUseMetaMysteryFeats(int nClass) +{ + // I don't want to spend the time looping through each class's + // feat 2da so this is the list of all classes that are allowed to use the + // Spellbook NUI and can use Metamysteries + return (nClass == CLASS_TYPE_SHADOWCASTER + || nClass == CLASS_TYPE_SHADOWSMITH); +} + +json GetMetaMagicFeatList() +{ + json metaFeats = JsonArray(); + int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_SPELL_ABILITY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_SPELL_ABILITY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_SPELL_ABILITY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_SPELL_ABILITY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_STILL_SPELL_ABILITY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SILENT_SPELL_ABILITY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + + return metaFeats; +} + +json GetSuddenMetaMagicFeatList() +{ + json metaFeats = JsonArray(); + int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_EXTEND)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_EMPOWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_MAXIMIZE)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_WIDEN)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + + return metaFeats; +} + +json GetMetaPsionicFeatList() +{ + json metaFeats = JsonArray(); + int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_POWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_POWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_POWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_POWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_WIDEN_POWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_CHAIN_POWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_TWIN_POWER)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SPLIT_PSIONIC_RAY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + + return metaFeats; +} + +json GetMetaMysteryFeatList() +{ + json metaFeats = JsonArray(); + int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_MYSTERY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_MYSTERY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_MYSTERY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_MYSTERY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_STILL_MYSTERY)); + metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId)); + + return metaFeats; +} + +json GetToBStanceSpellList(int nClass, object oPlayer=OBJECT_SELF) +{ + // caching + json stanceSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR + IntToString(nClass)); + if (stanceSpells == JsonNull()) + stanceSpells = JsonArray(); + else + return stanceSpells; + + string sFile = GetClassSpellbookFile(nClass); + int totalRows = Get2DARowCount(sFile); + + int i; + for (i = 0; i < totalRows; i++) + { + int Type = StringToInt(Get2DACache(sFile, "Type", i)); + if (Type == 1) + { + int spellId = StringToInt(Get2DACache(sFile, "SpellID", i)); + stanceSpells = JsonArrayInsert(stanceSpells, JsonInt(spellId)); + } + } + + SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR + IntToString(nClass), stanceSpells); + return stanceSpells; +} + +json GetInvokerShapeSpellList(int nClass, object oPlayer=OBJECT_SELF) +{ + // caching + json shapeSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR + IntToString(nClass)); + if (shapeSpells == JsonNull()) + shapeSpells = JsonArray(); + else + return shapeSpells; + + string sFile = GetClassSpellbookFile(nClass); + int totalRows = Get2DARowCount(sFile); + + if (nClass == CLASS_TYPE_WARLOCK) + { + // Add the ELdritch Blast shapes + // TODO: Replace these magic SpellID ints with consts + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(INVOKE_ELDRITCH_BLAST)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18216)); // Eldritch Chain + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18245)); // Eldritch Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18261)); // Eldritch Doom + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18172)); // Glaive + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18246)); // Eldritch Line + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18173)); // Eldritch Spear + } + + if (nClass == CLASS_TYPE_DRAGON_SHAMAN) + { + // Add the Dragon Shaman Auras + int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_ENERGY)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_ENERGYSHLD)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_INSIGHT)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_MAGICPOWER)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_POWER)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_PRESENCE)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_RESISTANCE)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_RESOLVE)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_SENSES)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_STAMINA)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_SWIFTNESS)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_TOUGHNESS)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_VIGOR)); + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId)); + } + + if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) + { + // Add Dragon Adept Breaths + // TODO: Replace these magic SpellID ints with consts + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2102)); // Fire Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2103)); // Fire Line + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2104)); // Frost Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2105)); // Electric Line + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2106)); // Sickness Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2108)); // Acid Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2109)); // Acid Line + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2111)); // Slow Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2112)); // Weakening Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2115)); // Sleep Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2116)); // Thunder Cone + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2117)); // Bahamut Line + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2118)); // Force Line + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2119)); // Paralyzation Line + shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2120)); // Tiamat Breath + } + + + SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR + IntToString(nClass), shapeSpells); + return shapeSpells; +} + +json GetInvokerEssenceSpellList(int nClass, object oPlayer=OBJECT_SELF) +{ + //caching + json essenceSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR + IntToString(nClass)); + if (essenceSpells == JsonNull()) + essenceSpells = JsonArray(); + else + return essenceSpells; + + if (nClass == CLASS_TYPE_WARLOCK) + { + // Add Eldritch Essences + // TODO: Replace these magic SpellID ints with consts + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18177)); // Hideous Blow + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18189)); // Baneful Abberation + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18190)); // Baneful Beast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18191)); // Baneful Construct + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18192)); // Baneful Dragon + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18193)); // Baneful Dwarf + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18194)); // Baneful Elemental + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18195)); // Baneful Elf + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18196)); // baneful Fey + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18197)); // Baneful Giant + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18198)); // Baneful Goblinoid + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18199)); // Baneful Gnome + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18200)); // Baneful Halfling + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18201)); // Baneful Human + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18202)); // Baneful Monsterous + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18203)); // Baneful Orc + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18204)); // Baneful Outsider + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18205)); // Baneful Plant + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18206)); // Baneful Reptilian + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18207)); // Baneful Shapechanger + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18208)); // Baneful Undead + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18209)); // Baneful Vermin + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18210)); // Beshadowed Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18240)); // Bewitching Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18257)); // Binding Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18211)); // Brimstone Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18175)); // Frightful Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18176)); // Hammer Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18183)); // Sickening Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HEALING_BLAST)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_BLAST)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_BLOW)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_CHAIN)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_CONE)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_DOOM)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_GLAIVE)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_LINE)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_SPEAR)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18220)); // Hellrime Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18177)); // Hideous Blow + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18249)); // Hindering Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18251)); // Noxious Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18253)); // Penetrating Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18267)); // Utterdark Blast + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18255)); // Vitriolic Blast + } + + if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT) + { + // Add the Dragonfire Adept Shapes + int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SHAPED_ADEPTBREATH)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_CLOUD_ADEPTBREATH)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId)); + spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_ENDURE_ADEPTBREATH)); + essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId)); + } + + SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR + IntToString(nClass), essenceSpells); + return essenceSpells; +} + +int JsonArrayContainsInt(json list, int item) +{ + int totalCount = JsonGetLength(list); + + int i; + for (i = 0; i < totalCount; i++) + { + if (JsonGetInt(JsonArrayGet(list, i)) == item) + return TRUE; + } + + return FALSE; +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/include/prc_nui_sbd_inc.nss b/nwn/nwnprc/trunk/include/prc_nui_sbd_inc.nss new file mode 100644 index 00000000..4f846586 --- /dev/null +++ b/nwn/nwnprc/trunk/include/prc_nui_sbd_inc.nss @@ -0,0 +1,98 @@ +//:://///////////////////////////////////////////// +//:: PRC Spellbook Description NUI +//:: prc_nui_sbd_inc +//::////////////////////////////////////////////// +/* + This is the view for the Spell Description NUI +*/ +//::////////////////////////////////////////////// +//:: Created By: Rakiov +//:: Created On: 29.05.2005 +//::////////////////////////////////////////////// +#include "nw_inc_nui" +#include "prc_nui_consts" +#include "inc_2dacache" + +// +// CreateSpellDescriptionNUI +// Creates a Spell Description NUI mimicing the description GUI of NWN +// +// Arguments: +// oPlayer:Object the player object +// featID:int the FeatID +// spellId:int the SpellID +// realSpellId:int the RealSpellID +// +void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0); + +void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0) +{ + // look for existing window and destroy + int nPreviousToken = NuiFindWindow(OBJECT_SELF, NUI_SPELL_DESCRIPTION_WINDOW_ID); + if(nPreviousToken != 0) + { + NuiDestroy(OBJECT_SELF, nPreviousToken); + } + + // in order of accuracy for names it goes RealSpellID > SpellID > FeatID + string spellName; + if (realSpellId) + spellName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", realSpellId))); + else if (spellId) + spellName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId))); + else + spellName = GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", featID))); + // Descriptions and Icons are accuratly stored on the feat + string spellDesc = GetStringByStrRef(StringToInt(Get2DACache("feat", "DESCRIPTION", featID))); + string spellIcon = Get2DACache("feat", "ICON", featID); + + json jRoot = JsonArray(); + json jGroup = JsonArray(); + + json jRow = JsonArray(); + + json jImage = NuiImage(JsonString(spellIcon), JsonInt(NUI_ASPECT_EXACT), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_TOP)); + jImage = NuiWidth(jImage, 32.0f); + jRow = JsonArrayInsert(jRow, jImage); + jRow = NuiCol(jRow); + jGroup = JsonArrayInsert(jGroup, jRow); + + jRow = JsonArray(); + json jText = NuiText(JsonString(spellDesc), FALSE, NUI_SCROLLBARS_AUTO); + jRow = JsonArrayInsert(jRow, jText); + jRow = NuiCol(jRow); + jGroup = JsonArrayInsert(jGroup, jRow); + + jGroup = NuiRow(jGroup); + jGroup = NuiGroup(jGroup, TRUE, NUI_SCROLLBARS_NONE); + jRoot = JsonArrayInsert(jRoot, jGroup); + + jRow = JsonArray(); + jRow = JsonArrayInsert(jRow, NuiSpacer()); + json jButton = NuiId(NuiButton(JsonString("OK")), NUI_SPELL_DESCRIPTION_OK_BUTTON); + jButton = NuiWidth(jButton, 175.0f); + jButton = NuiHeight(jButton, 48.0f); + jRow = JsonArrayInsert(jRow, jButton); + jRow = NuiRow(jRow); + + jRoot = JsonArrayInsert(jRoot, jRow); + jRoot = NuiCol(jRoot); + + + // This is the main window with jRoot as the main pane. It includes titles and parameters (more on those later) + json nui = NuiWindow(jRoot, JsonString(spellName), NuiBind("geometry"), NuiBind("resizable"), JsonBool(FALSE), NuiBind("closable"), NuiBind("transparent"), NuiBind("border")); + + // finally create it and it'll return us a non-zero token. + int nToken = NuiCreate(oPlayer, nui, NUI_SPELL_DESCRIPTION_WINDOW_ID); + + // get the geometry of the window in case we opened this before and have a + // preference for location + json geometry = NuiRect(893.0f,346.0f, 426.0f, 446.0f); + + // Set the binds to their default values + NuiSetBind(oPlayer, nToken, "geometry", geometry); + NuiSetBind(oPlayer, nToken, "resizable", JsonBool(FALSE)); + NuiSetBind(oPlayer, nToken, "closable", JsonBool(FALSE)); + NuiSetBind(oPlayer, nToken, "transparent", JsonBool(FALSE)); + NuiSetBind(oPlayer, nToken, "border", JsonBool(TRUE)); +} diff --git a/nwn/nwnprc/trunk/users/jaysyn/hp_string_util.nss b/nwn/nwnprc/trunk/include/prc_string_inc.nss similarity index 73% rename from nwn/nwnprc/trunk/users/jaysyn/hp_string_util.nss rename to nwn/nwnprc/trunk/include/prc_string_inc.nss index 4a17e000..f590b4c8 100644 --- a/nwn/nwnprc/trunk/users/jaysyn/hp_string_util.nss +++ b/nwn/nwnprc/trunk/include/prc_string_inc.nss @@ -1,6 +1,6 @@ //:://///////////////////////////////////////////// //:: String Util -//:: hp_string_util +//:: prc_string_inc //::////////////////////////////////////////////// /* A util class for providing useful string functions. @@ -10,6 +10,8 @@ //:: Created On: 22.05.2005 //::////////////////////////////////////////////// +#include "inc_utility" + // // StringSplit // Takes a string and splits it by " " into a json list of strings @@ -29,27 +31,13 @@ // json StringSplit(string input); -// -// TrimString -// Takes a string and trims any leading whitespace characters -// i.e. " this is a test" returns -// "this is a test" -// -// Parameters: -// input string the input string to trim -// -// Returns: -// string the trimmed string -// -string TrimString(string input); - json StringSplit(string input) { json retValue = JsonArray(); string subString = ""; //trim any whitespace characters first - string currString = TrimString(input); + string currString = PRCTrimString(input); // loop until we process the whole string while(currString != "") @@ -84,16 +72,3 @@ json StringSplit(string input) return retValue; } - -string TrimString(string input) -{ - string retValue = input; - - // while the string is not empty and we are looking at a whitespace, pop it. - while(retValue != "" && GetStringLeft(retValue, 1) == " ") - { - retValue = GetStringRight(retValue, GetStringLength(retValue)-1); - } - - return retValue; -} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/scripts/prc_feats.nss b/nwn/nwnprc/trunk/scripts/prc_feats.nss index e651ca50..99af232c 100644 --- a/nwn/nwnprc/trunk/scripts/prc_feats.nss +++ b/nwn/nwnprc/trunk/scripts/prc_feats.nss @@ -115,6 +115,7 @@ void PRCFeat_Equip(object oPC, object oSkin, int iEquip) SetCompositeAttackBonus(oPC, "BrutalThrow", 0); } } + //:: Charming the Arrow - Apply bonus if Charisma > Dexterity for bows & crossbows if (GetHasFeat(FEAT_CHARMING_THE_ARROW, oPC)) { @@ -134,6 +135,11 @@ void PRCFeat_Equip(object oPC, object oSkin, int iEquip) SetCompositeAttackBonus(oPC, "CharmingTheArrow", 0); } } + else + { + // Remove the bonus if Charisma is not greater + SetCompositeAttackBonus(oPC, "CharmingTheArrow", 0); + } } } } diff --git a/nwn/nwnprc/trunk/users/jaysyn/prc_onnui.nss b/nwn/nwnprc/trunk/scripts/prc_nui_pa_event.nss similarity index 81% rename from nwn/nwnprc/trunk/users/jaysyn/prc_onnui.nss rename to nwn/nwnprc/trunk/scripts/prc_nui_pa_event.nss index 4a0077a3..9238a97f 100644 --- a/nwn/nwnprc/trunk/users/jaysyn/prc_onnui.nss +++ b/nwn/nwnprc/trunk/scripts/prc_nui_pa_event.nss @@ -1,27 +1,18 @@ //:://///////////////////////////////////////////// -//:: Power Attack Events -//:: hp_pa_events +//:: Power Attack NUI Events +//:: prc_nui_pa_event //::////////////////////////////////////////////// /* - The NUI events for the Power Attack NUI Window + A class that handles the event firings from + the Power Attack NUI */ //::////////////////////////////////////////////// //:: Created By: Rakiov -//:: Created On: 22.05.2005 +//:: Created On: 24.05.2005 //::////////////////////////////////////////////// -#include "nw_inc_nui" -#include "hp_pa_view" +#include "prc_nui_consts" -// -// SetWindowGeometry -// Sets the window geometry for the Power Attack NUI to the player -// so it can be remembered when opened next time -// -// Arguments: -// oPlayer object the player that owns the window -// nToken int the windowId -// void SetWindowGeometry(object oPlayer, int nToken); void main() @@ -31,14 +22,7 @@ void main() string sEvent = NuiGetEventType(); string sElement = NuiGetEventElement(); int nIndex = NuiGetEventArrayIndex(); - string sWindowId = NuiGetWindowId(oPlayer, nToken); - //HandleWindowInspectorEvent(); // used to debug - - if(sWindowId != NUI_PRC_POWER_ATTACK_WINDOW) - { - return; - } // Get the current Power Attack value for player int currentPAAmount = GetLocalInt(oPlayer, "PRC_PowerAttack_Level"); @@ -56,6 +40,9 @@ void main() return; } + // set the geometry to the player since we only get mouseup events on button presses :( + SetWindowGeometry(oPlayer, nToken); + int currentBAB = GetBaseAttackBonus(oPlayer); if (sElement == NUI_PRC_PA_LEFT_BUTTON_EVENT) @@ -64,7 +51,7 @@ void main() if(currentPAAmount-1 >= 0) { SetLocalInt(oPlayer, "PRC_PowerAttack_Level", currentPAAmount-1); - ExecuteScript("hp_pa_script", oPlayer); + ExecuteScript("prc_nui_pa_trggr", oPlayer); // if decreased pwoer attack is lower than the current BAB then allow // the incrase button if(currentPAAmount-1 <= currentBAB) @@ -86,7 +73,7 @@ void main() if(currentPAAmount+1 <= currentBAB) { SetLocalInt(oPlayer, "PRC_PowerAttack_Level", currentPAAmount+1); - ExecuteScript("hp_pa_script", oPlayer); + ExecuteScript("prc_nui_pa_trggr", oPlayer); // if the increased power attack amount is greater than 0 then enable // the decrease button if (currentPAAmount+1 > 0) @@ -103,13 +90,11 @@ void main() currentPAAmount = GetLocalInt(oPlayer, "PRC_PowerAttack_Level"); - // set the geometry to the player since we only get mouseup events on button presses :( NuiSetBind(oPlayer, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(currentPAAmount))); - SetWindowGeometry(oPlayer, nToken); } void SetWindowGeometry(object oPlayer, int nToken) { json dimensions = NuiGetBind(oPlayer, nToken, "geometry"); SetLocalJson(oPlayer, NUI_PRC_PA_GEOMETRY_VAR, dimensions); -} \ No newline at end of file +} diff --git a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_script.nss b/nwn/nwnprc/trunk/scripts/prc_nui_pa_trggr.nss similarity index 52% rename from nwn/nwnprc/trunk/users/jaysyn/hp_pa_script.nss rename to nwn/nwnprc/trunk/scripts/prc_nui_pa_trggr.nss index f338c845..95b0cfc9 100644 --- a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_script.nss +++ b/nwn/nwnprc/trunk/scripts/prc_nui_pa_trggr.nss @@ -1,6 +1,6 @@ //:://///////////////////////////////////////////// //:: Power Attack Script -//:: hp_pa_script +//:: prc_nui_pa_trggr //::////////////////////////////////////////////// /* A script that sets the power attack on a player based on the amount @@ -12,8 +12,18 @@ //::////////////////////////////////////////////// #include "prc_spell_const" +#include "inc_2dacache" -void SetPowerAttack(); +// +// ExecutePowerAttackChange +// Takes a Power Attack SpellID and checks to see what it's spell2da Master is. +// it then takes the Master's FeatID and the spell's spellId and does UseActionFeat +// to execute the power attack change. +// +// Arguments: +// spellId:int the Power attack spell Id this is being executed for +// +void ExecutePowerAttackChange(int spellId); // // Sets the power attack for a player, if the player has power attack and the @@ -27,43 +37,25 @@ void SetPowerAttack(); // void main() { - - ExecuteScript("prc_nui_pwrattk"); - -/* int amount = GetLocalInt(OBJECT_SELF, "PRC_PowerAttack_Level"); + int amount = GetLocalInt(OBJECT_SELF, "PRC_PowerAttack_Level"); int prevPowerAttack5 = GetLocalInt(OBJECT_SELF, "prevPowerAttack5"); int prevPowerAttack1 = GetLocalInt(OBJECT_SELF, "prevPowerAttack1"); int powerAttack5Amount = amount / 5; int powerAttack1Amount = amount % 5; - // Current actions can cause this to not run right away, so clear the queue - // and force this to happen. - ClearAllActions(); - - //sets the 5 values for Power attack ranging from 0,5,10,15,20 respectivly if (prevPowerAttack5 != powerAttack5Amount) { if (powerAttack5Amount == 0) // Power Attack 0 - { - ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK6, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK6); if (powerAttack5Amount == 1) // Power Attack 5 - { - ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK7, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK7); if (powerAttack5Amount == 2) // Power Attack 10 - { - ActionCastSpellAtObject(SPELL_POWER_ATTACK8, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK8); if (powerAttack5Amount == 3) // Power Attack 15 - { - ActionCastSpellAtObject(SPELL_POWER_ATTACK9, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK9); if (powerAttack5Amount == 4) // Power Attack 20 - { - ActionCastSpellAtObject(SPELL_POWER_ATTACK10, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK10); SetLocalInt(OBJECT_SELF, "prevPowerAttack5", powerAttack5Amount); } @@ -71,26 +63,32 @@ void main() { //sets the 1 values for Power attack ranging from 0,1,2,3,4 respectivly if (powerAttack1Amount == 0) // Power Attack 0 - { - ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK1, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK1); if (powerAttack1Amount == 1) // Power Attack 1 - { - ActionDoCommand(ActionCastSpellAtObject(SPELL_POWER_ATTACK2, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK2); if (powerAttack1Amount == 2) // Power Attack 2 - { - ActionCastSpellAtObject(SPELL_POWER_ATTACK3, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK3); if (powerAttack1Amount == 3) // Power Attack 3 - { - ActionCastSpellAtObject(SPELL_POWER_ATTACK4, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK4); if (powerAttack1Amount == 4) // Power Attack 4 - { - ActionCastSpellAtObject(SPELL_POWER_ATTACK5, OBJECT_SELF, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE); - } + ExecutePowerAttackChange(SPELL_POWER_ATTACK5); SetLocalInt(OBJECT_SELF, "prevPowerAttack1", powerAttack1Amount); } - */ - } \ No newline at end of file +} + +void ExecutePowerAttackChange(int spellId) +{ + int masterSpellId = StringToInt(Get2DACache("spells", "Master", spellId)); + int featID; + int subSpellId = 0; + + if (masterSpellId) + { + featID = StringToInt(Get2DACache("spells", "FeatID", masterSpellId)); + subSpellId = spellId; + } + else + featID = StringToInt(Get2DACache("spells", "FeatID", spellId)); + + ActionUseFeat(featID, OBJECT_SELF, subSpellId); +} diff --git a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_view.nss b/nwn/nwnprc/trunk/scripts/prc_nui_pa_view.nss similarity index 59% rename from nwn/nwnprc/trunk/users/jaysyn/hp_pa_view.nss rename to nwn/nwnprc/trunk/scripts/prc_nui_pa_view.nss index 8a843600..534fd60d 100644 --- a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_view.nss +++ b/nwn/nwnprc/trunk/scripts/prc_nui_pa_view.nss @@ -12,44 +12,16 @@ //::////////////////////////////////////////////// #include "nw_inc_nui" +#include "prc_nui_consts" // #include "nw_inc_nui_insp" // used to debug -// -// NuiPRCPowerAttackView -// The NUI window for the Power Attack interface, running this function -// creates the window itself -// -// Arguments: -// oPlayer object the player referenced for the NUI -// -void NuiPRCPowerAttackView(object oPlayer); - - -// The Window ID -const string NUI_PRC_POWER_ATTACK_WINDOW = "nui_prc_power_attack_window"; - -// LocalVar for the geometry of the window -const string NUI_PRC_PA_GEOMETRY_VAR = "paNuiGeometry"; - -// Event For Left Button -const string NUI_PRC_PA_LEFT_BUTTON_EVENT = "nui_prc_pa_left_button_event"; -// Event For Right Button -const string NUI_PRC_PA_RIGHT_BUTTON_EVENT = "nui_prc_pa_right_button_event"; - -// Bind for Text -const string NUI_PRC_PA_TEXT_BIND = "nui_prc_pa_text_bind"; -// Left Button Enabled Bind -const string NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND = "leftButtonEnabled"; -// Right Button Enabled Bind -const string NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND = "rightButtonEnabled"; - -void NuiPRCPowerAttackView(object oPlayer) +void main() { // First we look for any previous windows, if found (ie, non-zero) we destory them so we can start fresh. - int nPreviousToken = NuiFindWindow(oPlayer, NUI_PRC_POWER_ATTACK_WINDOW); + int nPreviousToken = NuiFindWindow(OBJECT_SELF, NUI_PRC_POWER_ATTACK_WINDOW); if (nPreviousToken != 0) { - NuiDestroy(oPlayer, nPreviousToken); + NuiDestroy(OBJECT_SELF, nPreviousToken); } // base element for NUI @@ -88,11 +60,11 @@ void NuiPRCPowerAttackView(object oPlayer) // Create the window and set binds for parameters in case we want to change them later json nui = NuiWindow(jRoot, JsonString("Power Attack"), NuiBind("geometry"), NuiBind("resizable"), NuiBind("collapsed"), NuiBind("closable"), NuiBind("transparent"), NuiBind("border")); - int nToken = NuiCreate(oPlayer, nui, NUI_PRC_POWER_ATTACK_WINDOW); + int nToken = NuiCreate(OBJECT_SELF, nui, NUI_PRC_POWER_ATTACK_WINDOW); // get the geometry of the window in case we opened this before and have a // preference for location - json geometry = GetLocalJson(oPlayer, NUI_PRC_PA_GEOMETRY_VAR); + json geometry = GetLocalJson(OBJECT_SELF, NUI_PRC_PA_GEOMETRY_VAR); // Default to put this near the middle and let the person adjust its location if (geometry == JsonNull()) @@ -101,15 +73,15 @@ void NuiPRCPowerAttackView(object oPlayer) } // Set the binds to their default values - NuiSetBind(oPlayer, nToken, "geometry", geometry); - NuiSetBind(oPlayer, nToken, "collapsed", JsonBool(FALSE)); - NuiSetBind(oPlayer, nToken, "resizable", JsonBool(FALSE)); - NuiSetBind(oPlayer, nToken, "closable", JsonBool(TRUE)); - NuiSetBind(oPlayer, nToken, "transparent", JsonBool(TRUE)); - NuiSetBind(oPlayer, nToken, "border", JsonBool(FALSE)); + NuiSetBind(OBJECT_SELF, nToken, "geometry", geometry); + NuiSetBind(OBJECT_SELF, nToken, "collapsed", JsonBool(FALSE)); + NuiSetBind(OBJECT_SELF, nToken, "resizable", JsonBool(FALSE)); + NuiSetBind(OBJECT_SELF, nToken, "closable", JsonBool(TRUE)); + NuiSetBind(OBJECT_SELF, nToken, "transparent", JsonBool(TRUE)); + NuiSetBind(OBJECT_SELF, nToken, "border", JsonBool(FALSE)); - int paAmount = GetLocalInt(oPlayer, "PRC_PowerAttack_Level"); - int currentBAB = GetBaseAttackBonus(oPlayer); + int paAmount = GetLocalInt(OBJECT_SELF, "PRC_PowerAttack_Level"); + int currentBAB = GetBaseAttackBonus(OBJECT_SELF); // if we reach the left or right limits of the power attack, then disable the buttons json leftButtonEnabled = (paAmount == 0) ? JsonBool(FALSE) : JsonBool(TRUE); @@ -117,10 +89,10 @@ void NuiPRCPowerAttackView(object oPlayer) // set the current PA amount to the window - NuiSetBind(oPlayer, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(paAmount))); + NuiSetBind(OBJECT_SELF, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(paAmount))); - NuiSetBind(oPlayer, nToken, NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND, leftButtonEnabled); - NuiSetBind(oPlayer, nToken, NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND, rightButtonEnabled); -} \ No newline at end of file + NuiSetBind(OBJECT_SELF, nToken, NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND, leftButtonEnabled); + NuiSetBind(OBJECT_SELF, nToken, NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND, rightButtonEnabled); +} diff --git a/nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss b/nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss new file mode 100644 index 00000000..85c428e1 --- /dev/null +++ b/nwn/nwnprc/trunk/scripts/prc_nui_sb_event.nss @@ -0,0 +1,372 @@ +//:://///////////////////////////////////////////// +//:: PRC Spellbook NUI Events +//:: prc_nui_sb_event +//::////////////////////////////////////////////// +/* + This is the event script for the PRC Spellbook NUI that handles button presses + and the like +*/ +//::////////////////////////////////////////////// +//:: Created By: Rakiov +//:: Created On: 24.05.2005 +//::////////////////////////////////////////////// + +#include "prc_nui_consts" +#include "prc_nui_sb_inc" +#include "prc_nui_sbd_inc" + +// +// SetWindowGeometry +// Saves the window geometry of the NUI Spellbook to the player so next time it +// renders it remembers where it was +// +// Arguments: +// oPlayer:object player tied to NUI +// nToken:int the NUI Spellbook window +// +void SetWindowGeometry(object oPlayer, int nToken); + +// +// DetermineRangeForSpell +// Takes the string range from the spells.2da of a spell and converts it to +// the appropriate float range for the manual targetting mode +// +// Arguments: +// sRange:string the string range of the spell (P,T,S,M,L) +// +// Returns: +// float The flaot representation of the sRange provided +// +float DetermineRangeForSpell(string sRange); + +// +// DetermineShapeForSpell +// Takes the string shape from the spells.2da of a spell and converts it to +// the int representation of the spell's shape. This is case sensitive and +// has to be in all UpperCase +// +// Arguments: +// shape:string the string shape of the spell (SPHERE,CONE, etc.) +// +// Returns: +// int the int representation of the shape provided +// +int DetermineShapeForSpell(string shape); + +// +// DetermineTargetType +// Takes the string (actually hex) target type from the spells.2da of a spell and convers it to +// the int representation of the spell's target type. How this works is a bit unintuitive but +// it converts the string hex to a int, then subtracts it by the powers of 2. Each power represents +// the target the spell is allowed to be used on as all the ints are bitwise added together +// +// Arguments: +// targetType:string the hex value of the target type as a string. +// +// Returns: +// int the bitwise int representation of the targetType +int DetermineTargetType(string targetType); + +void main() +{ + object oPlayer = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sEvent = NuiGetEventType(); + string sElement = NuiGetEventElement(); + string sWindowId = NuiGetWindowId(oPlayer, nToken); + + // if this was the Spell Description NUI and the OK button was clicked + // then we close the window. + if (sWindowId == NUI_SPELL_DESCRIPTION_WINDOW_ID) + { + if (sElement == NUI_SPELL_DESCRIPTION_OK_BUTTON) + NuiDestroy(oPlayer, nToken); + return; + } + + // if the window is closed, save the geometry + if (sEvent == "close") + { + SetWindowGeometry(oPlayer, nToken); + return; + } + + // Not a mouseup event, nothing to do. + if (sEvent != "mouseup") + { + return; + } + + // Save the geometry first + SetWindowGeometry(oPlayer, nToken); + + int spellId; + int featId; + int realSpellId; + + // Checks to see if the event button has the class button baseId + // Then replaces the baseId with nothing and converts the end of the string to a int + // representing the ClassID gathered. (i.e. "test_123" gets converted to 123) + if (FindSubString(sElement, PRC_SPELLBOOK_NUI_CLASS_BUTTON_BASEID) >= 0) + { + int classId = StringToInt(RegExpReplace(PRC_SPELLBOOK_NUI_CLASS_BUTTON_BASEID, sElement, "")); + SetLocalInt(oPlayer, PRC_SPELLBOOK_SELECTED_CLASSID_VAR, classId); + ExecuteScript("prc_nui_sb_view", oPlayer); + return; + } + + // Checks to see if the event button has the circle button baseId + // Then replaces the baseId with nothing and converts the end of the string to a int + // representing the circle number gathered. (i.e. "test_5" gets converted to 5) + if (FindSubString(sElement, PRC_SPELLBOOK_NUI_CIRCLE_BUTTON_BASEID) >= 0) + { + int circle = StringToInt(RegExpReplace(PRC_SPELLBOOK_NUI_CIRCLE_BUTTON_BASEID, sElement, "")); + SetLocalInt(oPlayer, PRC_SPELLBOOK_SELECTED_CIRCLE_VAR, circle); + ExecuteScript("prc_nui_sb_view", oPlayer); + return; + } + + // Checks to see if the event button has the meta button baseId + // Then replaces the baseId with nothing and converts the end of the string to a int + // representing the SpellID gathered. (i.e. "test_123" gets converted to 123) + if (FindSubString(sElement, PRC_SPELLBOOK_NUI_META_BUTTON_BASEID) >= 0) + { + spellId = StringToInt(RegExpReplace(PRC_SPELLBOOK_NUI_META_BUTTON_BASEID, sElement, "")); + int masterSpellId = StringToInt(Get2DACache("spells", "Master", spellId)); + if (masterSpellId) + { + SetLocalInt(oPlayer, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR, spellId); + featId = StringToInt(Get2DACache("spells", "FeatID", masterSpellId)); + } + else + featId = StringToInt(Get2DACache("spells", "FeatID", spellId)); + } + + // Checks to see if the event button has the class button baseId + // Then replaces the baseId with nothing and converts the end of the string to a int + // representing the SpellbookID gathered. (i.e. "test_123" gets converted to 123) + if (FindSubString(sElement, PRC_SPELLBOOK_NUI_SPELL_BUTTON_BASEID) >= 0) + { + int spellbookId = StringToInt(RegExpReplace(PRC_SPELLBOOK_NUI_SPELL_BUTTON_BASEID, sElement, "")); + int classId = GetLocalInt(oPlayer, PRC_SPELLBOOK_SELECTED_CLASSID_VAR); + + // special case for binders, since they don't have a spell 2da of their own. + if (classId == CLASS_TYPE_BINDER) + { + json binderDict = GetBinderSpellToFeatDictionary(oPlayer); + spellId = spellbookId; + featId = JsonGetInt(JsonObjectGet(binderDict, IntToString(spellId))); + int masterSpellId = StringToInt(Get2DACache("spells", "Master", spellId)); + if (masterSpellId) + { + SetLocalInt(oPlayer, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR, spellId); + featId = StringToInt(Get2DACache("spells", "FeatID", masterSpellId)); + } + else + featId = StringToInt(Get2DACache("spells", "FeatID", spellId)); + + } + else + { + string sFile = GetClassSpellbookFile(classId); + + spellId = StringToInt(Get2DACache(sFile, "SpellID", spellbookId)); + realSpellId = StringToInt(Get2DACache(sFile, "RealSpellID", spellbookId)); + + int masterSpellId = StringToInt(Get2DACache("spells", "Master", spellId)); + // If this spell is part of a radial we need to send the master featID + // to be used along with the radial spellId + if (masterSpellId) + { + SetLocalInt(oPlayer, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR, spellId); + spellId = masterSpellId; + } + + featId = StringToInt(Get2DACache("spells", "FeatID", spellId)); + } + } + + json jPayload = NuiGetEventPayload(); + int nButton = JsonGetInt(JsonObjectGet(jPayload, "mouse_btn")); + + // If right click, open the Spell Description NUI + if (nButton == NUI_PAYLOAD_BUTTON_RIGHT_CLICK) + { + CreateSpellDescriptionNUI(oPlayer, featId, spellId, realSpellId); + return; + } + // If left click, operate normally + if (nButton == NUI_PAYLOAD_BUTTON_LEFT_CLICK) + { + // We use the spell's FeatID to do actions, and we set the OnTarget action + // to PRC_NUI_SPELLBOOK so the handler knows what the action is being done + SetLocalInt(oPlayer, NUI_SPELLBOOK_SELECTED_FEATID_VAR, featId); + + string sRange = GetStringUpperCase(Get2DACache("spells", "Range", spellId)); + // If its a personal spell/feat than use it directly on the player. + if (sRange == "P") + { + SetLocalInt(oPlayer, NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT, 1); + ExecuteScript("prc_nui_sb_trggr", oPlayer); + } + // otherwise enter targetting mode + else + { + SetLocalString(oPlayer, NUI_SPELLBOOK_ON_TARGET_ACTION_VAR, "PRC_NUI_SPELLBOOK"); + + // These gather the targetting information for the TargetingMode functions + float fRange = DetermineRangeForSpell(sRange); + string sShape = GetStringUpperCase(Get2DACache("spells", "TargetShape", spellId)); + int iShape = DetermineShapeForSpell(sShape); + float fSizeX = StringToFloat(Get2DACache("spells", "TargetSizeX", spellId)); + float fSizeY = StringToFloat(Get2DACache("spells", "TargetSizeY", spellId)); + int nFlags = StringToInt(Get2DACache("spells", "TargetFlags", spellId)); + string sTargetType = Get2DACache("spells", "TargetType", spellId); + int iTargetType = DetermineTargetType(sTargetType); + + SetEnterTargetingModeData(oPlayer, iShape, fSizeX, fSizeY, nFlags, fRange); + EnterTargetingMode(oPlayer, iTargetType); + } + } +} + +void SetWindowGeometry(object oPlayer, int nToken) +{ + json dimensions = NuiGetBind(oPlayer, nToken, "geometry"); + SetLocalJson(oPlayer, PRC_SPELLBOOK_NUI_GEOMETRY_VAR, dimensions); +} + +int DetermineShapeForSpell(string shape) +{ + if (shape == "CONE") + { + return SPELL_TARGETING_SHAPE_CONE; + } + if (shape == "SPHERE") + { + return SPELL_TARGETING_SHAPE_SPHERE; + } + if (shape == "RECTANGLE") + { + return SPELL_TARGETING_SHAPE_RECT; + } + if (shape == "HSPHERE") + { + return SPELL_TARGETING_SHAPE_HSPHERE; + } + + return SPELL_TARGETING_SHAPE_NONE; +} + +float DetermineRangeForSpell(string sRange) +{ + //Personal + if (sRange == "P") + { + return StringToFloat(Get2DACache("ranges", "PrimaryRange", 0)); + } + //Touch + if(sRange == "T") + { + return StringToFloat(Get2DACache("ranges", "PrimaryRange", 1)); + } + //Short + if(sRange == "S") + { + return StringToFloat(Get2DACache("ranges", "PrimaryRange", 2)); + } + //Medium + if(sRange == "M") + { + return StringToFloat(Get2DACache("ranges", "PrimaryRange", 3)); + } + //Long + if(sRange == "L") + { + return StringToFloat(Get2DACache("ranges", "PrimaryRange", 4)); + } + + return 0.0; +} + +int DetermineTargetType(string targetType) +{ + int retValue = -1; + int iTargetType = HexToInt(targetType); + + if (iTargetType - 64 >= 0) + { + if (retValue == -1) + { + retValue = OBJECT_TYPE_TRIGGER; + } + else + { + retValue = retValue | OBJECT_TYPE_TRIGGER; + } + iTargetType -= 64; + } + if (iTargetType - 32 >= 0) + { + if (retValue == -1) + { + retValue = OBJECT_TYPE_PLACEABLE; + } + else + { + retValue = retValue | OBJECT_TYPE_PLACEABLE; + } + iTargetType -= 32; + } + if (iTargetType - 16 >= 0) + { + if (retValue == -1) + { + retValue = OBJECT_TYPE_DOOR; + } + else + { + retValue = retValue | OBJECT_TYPE_DOOR; + } + iTargetType -= 16; + } + if (iTargetType - 8 >= 0) + { + if (retValue == -1) + { + retValue = OBJECT_TYPE_ITEM; + } + else + { + retValue = retValue | OBJECT_TYPE_ITEM; + } + iTargetType -= 8; + } + if (iTargetType - 4 >= 0) + { + if (retValue == -1) + { + retValue = OBJECT_TYPE_TILE; + } + else + { + retValue = retValue | OBJECT_TYPE_TILE; + } + + iTargetType -= 4; + } + if (iTargetType - 2 >= 0 || iTargetType - 1 >= 0) + { + if (retValue == -1) + { + retValue = OBJECT_TYPE_CREATURE; + } + else + { + retValue = retValue | OBJECT_TYPE_CREATURE; + } + iTargetType = 0; + } + + return retValue; +} diff --git a/nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss b/nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss new file mode 100644 index 00000000..ef087c3f --- /dev/null +++ b/nwn/nwnprc/trunk/scripts/prc_nui_sb_trggr.nss @@ -0,0 +1,50 @@ +//:://///////////////////////////////////////////// +//:: PRC Spellbook OnTrigger Script +//:: prc_nui_sb_trggr +//::////////////////////////////////////////////// +/* + This is the OnTarget action script used to make spell attacks with the + selected spell from the PRC Spellbook NUI +*/ +//::////////////////////////////////////////////// +//:: Created By: Rakiov +//:: Created On: 24.05.2005 +//::////////////////////////////////////////////// + +#include "prc_nui_consts" +#include "inc_newspellbook" + +void main() +{ + // Get the selected PRC spell we are going to cast + int featId = GetLocalInt(OBJECT_SELF, NUI_SPELLBOOK_SELECTED_FEATID_VAR); + + int isPersonalFeat = GetLocalInt(OBJECT_SELF, NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT); + + // if this is a personal feat then this was called directly since we never entered + // targetting and this should be applied immediatly to the executing player. + if (isPersonalFeat) + { + ActionUseFeat(featId); + // we want to remove this just in case of weird cases. + DeleteLocalInt(OBJECT_SELF, NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT); + } + else + { + // if the spell has a master feat this is it. This will return 0 if not set. + int subSpellID = GetLocalInt(OBJECT_SELF, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR); + + // Get the target and location data we are casting at + object oTarget = GetLocalObject(OBJECT_SELF, "TARGETING_OBJECT"); + location spellLocation = GetLocalLocation(OBJECT_SELF, "TARGETING_POSITION"); + + // if the object is valid and isn't empty then cast spell at target + if (GetIsObjectValid(oTarget) && GetObjectType(oTarget)) + spellLocation = LOCATION_INVALID; + // otherwise if the area is a valid location to cast at, cast at location + else if (GetIsObjectValid(GetAreaFromLocation(spellLocation))) + oTarget = OBJECT_INVALID; + + ActionUseFeat(featId, oTarget, subSpellID, spellLocation); + } +} diff --git a/nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss b/nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss new file mode 100644 index 00000000..a1451ed7 --- /dev/null +++ b/nwn/nwnprc/trunk/scripts/prc_nui_sb_view.nss @@ -0,0 +1,519 @@ +//:://///////////////////////////////////////////// +//:: PRC Spellbook NUI View +//:: prc_nui_sb_view +//::////////////////////////////////////////////// +/* + This is the NUI view for the PRC Spellbook +*/ +//::////////////////////////////////////////////// +//:: Created By: Rakiov +//:: Created On: 24.05.2005 +//::////////////////////////////////////////////// + +#include "nw_inc_nui" +//#include "nw_inc_nui_insp" +#include "prc_nui_sb_inc" +#include "prc_nui_consts" + +// +// CreateSpellBookClassButtons +// Gets the list of classes that have Spells, "Spells" and /Spells/ the player has +// that are allowed to use the NUI Spellbook. +// +// Returns: +// json NuiRow the list of class buttons allowed to use the NUI Spellbook +// +json CreateSpellBookClassButtons(); + +// +// CreateSpellbookSpellButtons +// Creates the NUI buttons for the spells a player knows in the specified class +// and circle provided. +// +// Arguments: +// nClass int the class currently being checked for spells +// circle int the circle level of the spells we want to check for +// +// Returns: +// json:Array the list of NuiRows of spells we have memorized +// +json CreateSpellbookSpellButtons(int nClass, int circle); + +// +// CreateSpellbookSpellButtons +// Creates the buttons for what circles the class is allowed to cast in +// ranging from Cantrips to 9th circle or equivalent for classes that don't have +// a concept of spell circles, like ToB and Psionics +// +// Arguments: +// nClass int the class id this is being constructed for. +// +// Returns: +// json NuiRow the level at which the caster can or does know as buttons +// +json CreateSpellbookCircleButtons(int nClass); + +// +// CreateMetaMagicFeatButtons +// Takes a class and creates the appropriate meta feat buttons it can use or +// possibly use. +// +// Arguments: +// nClass:int the ClassID we are checking +// +// Returns: +// json:Array the list of meta feats the class can use. Can return an +// empty JsonArray if no meta feats are allowed for the class. +// +json CreateMetaMagicFeatButtons(int nClass); + +// +// CreateMetaFeatButtonRow +// a helper function for CreateMetaMagicFeatButtons that takes a list of featIds +// and creates buttons for them. +// +// Arguments: +// featList:json:Array the list of featIDs to render +// +// Returns: +// json:Array the row of buttons rendered for the FeatIDs. +// +json CreateMetaFeatButtonRow(json spellList); + +// +// GetSpellLevelIcon +// Takes the spell circle int and gets the icon appropriate for it (i.e. 0 turns +// into "ir_cantrips" +// +// Arguments: +// spellLevel:int the spell level we want the icon for +// +// Returns: +// string the spell level icon +// +string GetSpellLevelIcon(int spellLevel); + +// +// GetSpellLevelToolTip +// Gets the spell level tool tip text based on the int spell level provided (i.e. +// 0 turns into "Cantrips") +// +// Arguments: +// spellLevel:int the spell level we want the tooltip for +// +// Returns: +// string the spell level toop tip +// +string GetSpellLevelToolTip(int spellLevel); + +// +// GetSpellIcon +// Gets the spell icon based off the spellId by using the FeatID instead +// +// Arguments: +// nClass:int the class Id +// spellId:int the spell Id we want the icon for +// +// Returns: +// json:String the string of the icon we want. +// +json GetSpellIcon(int spellId, int nClass=0); + +void main() +{ + // look for existing window and destroy + int nPreviousToken = NuiFindWindow(OBJECT_SELF, PRC_SPELLBOOK_NUI_WINDOW_ID); + if(nPreviousToken != 0) + { + NuiDestroy(OBJECT_SELF, nPreviousToken); + } + + json jRoot = JsonArray(); + json jRow = CreateSpellBookClassButtons(); + jRoot = JsonArrayInsert(jRoot, jRow); + + int selectedClassId = GetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CLASSID_VAR); + + // GetLocalInt returns 0 if not set, which is Barb class which conveniently doesn't have spells :) + // if there was no selected class then there is nothing to render + if (selectedClassId != CLASS_TYPE_BARBARIAN) + { + // create the metamagic/metapsionic/metamystery/sudden buttons if applicable + // suddens are on their own row so its possible we can have 2 NuiRows in the list + jRow = CreateMetaMagicFeatButtons(selectedClassId); + int i; + for(i = 0; i < JsonGetLength(jRow); i++) + { + jRoot = JsonArrayInsert(jRoot, JsonArrayGet(jRow, i)); + } + + // create the spell/feat circle buttons for the class (most use 0-9, but + // ToB uses something similar that ranges from 1-9 and Invokers essentially + // go 1-4 as examples + jRow = CreateSpellbookCircleButtons(selectedClassId); + jRoot = JsonArrayInsert(jRoot, jRow); + + // Get the currently selected circle's spell buttons + int currentCircle = GetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CIRCLE_VAR); + jRow = CreateSpellbookSpellButtons(selectedClassId, currentCircle); + + // since we limit how many buttons a row can have here we need to add + // multiple NuiRows if they exist + for(i = 0; i < JsonGetLength(jRow); i++) + { + jRoot = JsonArrayInsert(jRoot, JsonArrayGet(jRow, i)); + } + } + + jRoot = NuiCol(jRoot); + + string title = "PRC Spellbook"; + + if (selectedClassId != CLASS_TYPE_BARBARIAN) + title = title + ": " + GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", selectedClassId))); + + // This is the main window with jRoot as the main pane. It includes titles and parameters (more on those later) + json nui = NuiWindow(jRoot, JsonString(title), NuiBind("geometry"), NuiBind("resizable"), NuiBind("collapsed"), NuiBind("closable"), NuiBind("transparent"), NuiBind("border")); + + // finally create it and it'll return us a non-zero token. + int nToken = NuiCreate(OBJECT_SELF, nui, PRC_SPELLBOOK_NUI_WINDOW_ID); + + // get the geometry of the window in case we opened this before and have a + // preference for location + json geometry = GetLocalJson(OBJECT_SELF, PRC_SPELLBOOK_NUI_GEOMETRY_VAR); + + // Default to put this near the middle and let the person adjust its location + if (geometry == JsonNull()) + { + geometry = NuiRect(893.0f,346.0f, 489.0f, 351.0f); + } + + // Set the binds to their default values + NuiSetBind(OBJECT_SELF, nToken, "geometry", geometry); + NuiSetBind(OBJECT_SELF, nToken, "collapsed", JsonBool(FALSE)); + NuiSetBind(OBJECT_SELF, nToken, "resizable", JsonBool(FALSE)); + NuiSetBind(OBJECT_SELF, nToken, "closable", JsonBool(TRUE)); + NuiSetBind(OBJECT_SELF, nToken, "transparent", JsonBool(TRUE)); + NuiSetBind(OBJECT_SELF, nToken, "border", JsonBool(FALSE)); +} + +json CreateSpellBookClassButtons() +{ + json jRow = JsonArray(); + // Get all the Classes that can use the NUI Spellbook + json classList = GetSupportedNUISpellbookClasses(OBJECT_SELF); + + // if we have selected a class already due to re-rendering, we need to disable + // the button for it. + int selectedClassId = GetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CLASSID_VAR); + + int i; + for (i = 0; i < JsonGetLength(classList); i++) + { + int classId = JsonGetInt(JsonArrayGet(classList, i)); + + // if the selected class doen't exist, automatically use the first class allowed + if (selectedClassId == 0) + { + selectedClassId = classId; + SetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CLASSID_VAR, selectedClassId); + } + + // Get the class icon from the classes.2da + json jClassButton = NuiId(NuiButtonImage(JsonString(Get2DACache("classes", "Icon", classId))), PRC_SPELLBOOK_NUI_CLASS_BUTTON_BASEID + IntToString(classId)); + jClassButton = NuiWidth(jClassButton, 32.0f); + jClassButton = NuiHeight(jClassButton, 32.0f); + // Get the class name from the classes.2da and set it to the tooltip + jClassButton = NuiTooltip(jClassButton, JsonString(GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", classId))))); + + jRow = JsonArrayInsert(jRow, jClassButton); + } + + jRow = NuiRow(jRow); + + return jRow; +} + +json CreateSpellbookCircleButtons(int nClass) +{ + json jRow = JsonArray(); + int i; + // Get the current selected circle and the class caster level. + int currentCircle = GetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CIRCLE_VAR); + int casterLevel = GetPrCAdjustedCasterLevel(nClass, OBJECT_SELF); + + // Get what the lowest level of a circle is for the class (some start at 1, + // some start higher, some start at cantrips) + int minSpellLevel = GetMinSpellLevel(nClass); + + if (minSpellLevel >= 0) + { + // get what is the highest circle the class can cast at + int currentMaxSpellLevel = GetCurrentSpellLevel(nClass, casterLevel); + // Get what the max circle the class can reach at is + int totalMaxSpellLevel = GetMaxSpellLevel(nClass); + + // if the current circle is less than the minimum level (possibly due to + // switching classes) then set it to that. + if (currentCircle < minSpellLevel) + { + currentCircle = minSpellLevel; + SetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CIRCLE_VAR, currentCircle); + } + + // conversily if it is higher than the max the class has (possibly due to + // switching classes) then set it to that. + if (currentCircle > currentMaxSpellLevel) + { + currentCircle = currentMaxSpellLevel; + SetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CIRCLE_VAR, currentCircle); + } + + for (i = minSpellLevel; i <= totalMaxSpellLevel; i++) + { + json enabled; + json jButton = NuiId(NuiButtonImage(JsonString(GetSpellLevelIcon(i))), PRC_SPELLBOOK_NUI_CIRCLE_BUTTON_BASEID + IntToString(i)); + jButton = NuiWidth(jButton, 42.0f); + jButton = NuiHeight(jButton, 42.0f); + jButton = NuiTooltip(jButton, JsonString(GetSpellLevelToolTip(i))); + + // if the current circle is selected or if the person can't cast at + // that circle yet then disable the button. + if (currentCircle == i || i > currentMaxSpellLevel) + { + enabled = JsonBool(FALSE); + } + else + { + enabled = JsonBool(TRUE); + } + jButton = NuiEnabled(jButton, enabled); + + jRow = JsonArrayInsert(jRow, jButton); + } + } + + jRow = NuiRow(jRow); + + return jRow; +} + +json CreateSpellbookSpellButtons(int nClass, int circle) +{ + json jRows = JsonArray(); + + // we only want to get spells at the currently selected circle. + int currentCircle = GetLocalInt(OBJECT_SELF, PRC_SPELLBOOK_SELECTED_CIRCLE_VAR); + json spellListAtCircle = GetSpellListForCircle(OBJECT_SELF, nClass, currentCircle); + string sFile = GetClassSpellbookFile(nClass); + + // how many buttons a row can have before we have to make a new row. + int rowLimit = NUI_SPELLBOOK_SPELL_BUTTON_LENGTH; + + json tempRow = JsonArray(); + int i; + for (i = 0; i < JsonGetLength(spellListAtCircle); i++) + { + int spellbookId = JsonGetInt(JsonArrayGet(spellListAtCircle, i)); + int spellId; + // Binders don't have a spellbook, so spellbookId is actually SpellID + if (nClass == CLASS_TYPE_BINDER) + spellId = spellbookId; + else + spellId = StringToInt(Get2DACache(sFile, "SpellID", spellbookId)); + + json jSpellButton = NuiId(NuiButtonImage(GetSpellIcon(spellId, nClass)), PRC_SPELLBOOK_NUI_SPELL_BUTTON_BASEID + IntToString(spellbookId)); + jSpellButton = NuiWidth(jSpellButton, 38.0f); + jSpellButton = NuiHeight(jSpellButton, 38.0f); + + // the RealSpellID has the accurate descriptions for the spells/abilities + int realSpellId = StringToInt(Get2DACache(sFile, "RealSpellID", spellbookId)); + if (!realSpellId) + realSpellId = spellId; + jSpellButton = NuiTooltip(jSpellButton, JsonString(GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", realSpellId))))); + + // if the row limit has been reached, make a new row + tempRow = JsonArrayInsert(tempRow, jSpellButton); + if (JsonGetLength(tempRow) >= rowLimit) + { + tempRow = NuiRow(tempRow); + jRows = JsonArrayInsert(jRows, tempRow); + tempRow = JsonArray(); + } + } + + // if the row was cut short (a remainder) then we finish the row and add it + // to the list + if (JsonGetLength(tempRow) > 0) + { + tempRow = NuiRow(tempRow); + jRows = JsonArrayInsert(jRows, tempRow); + } + + return jRows; +} + + +json CreateMetaMagicFeatButtons(int nClass) +{ + json jRows = JsonArray(); + json currentRow = JsonArray(); + + // if an invoker, add the invoker shapes and essences as its own row of buttons + if (nClass == CLASS_TYPE_WARLOCK + || nClass == CLASS_TYPE_DRAGONFIRE_ADEPT + || nClass == CLASS_TYPE_DRAGON_SHAMAN) + { + currentRow = CreateMetaFeatButtonRow(GetInvokerShapeSpellList(nClass)); + + if (JsonGetLength(currentRow) > 0) + { + currentRow = NuiRow(currentRow); + jRows = JsonArrayInsert(jRows, currentRow); + } + + currentRow = CreateMetaFeatButtonRow(GetInvokerEssenceSpellList(nClass)); + + if (JsonGetLength(currentRow) > 0) + { + currentRow = NuiRow(currentRow); + jRows = JsonArrayInsert(jRows, currentRow); + } + } + + // if a ToB class, add its stances as its own row of buttons + if (nClass == CLASS_TYPE_WARBLADE + || nClass == CLASS_TYPE_CRUSADER + || nClass == CLASS_TYPE_SWORDSAGE) + { + currentRow = CreateMetaFeatButtonRow(GetToBStanceSpellList(nClass)); + + if (JsonGetLength(currentRow) > 0) + { + currentRow = NuiRow(currentRow); + jRows = JsonArrayInsert(jRows, currentRow); + } + } + + currentRow = JsonArray(); + + // check to see if the class can use any particular meta feats + if (CanClassUseMetamagicFeats(nClass)) + currentRow = CreateMetaFeatButtonRow(GetMetaMagicFeatList()); + else if (CanClassUseMetaPsionicFeats(nClass)) + currentRow = CreateMetaFeatButtonRow(GetMetaPsionicFeatList()); + else if (CanClassUseMetaMysteryFeats(nClass)) + currentRow = CreateMetaFeatButtonRow(GetMetaMysteryFeatList()); + + if (JsonGetLength(currentRow) > 0) + { + currentRow = NuiRow(currentRow); + jRows = JsonArrayInsert(jRows, currentRow); + } + + // and check to see if the class can use sudden meta feats + currentRow = JsonArray(); + if (CanClassUseSuddenMetamagicFeats(nClass)) + currentRow = CreateMetaFeatButtonRow(GetSuddenMetaMagicFeatList()); + + if (JsonGetLength(currentRow) > 0) + { + currentRow = NuiRow(currentRow); + jRows = JsonArrayInsert(jRows, currentRow); + } + + return jRows; +} + +json CreateMetaFeatButtonRow(json spellList) +{ + json jRow = JsonArray(); + + int i; + for (i = 0; i < JsonGetLength(spellList); i++) + { + int spellId = JsonGetInt(JsonArrayGet(spellList, i)); + int featId; + int masterSpell = StringToInt(Get2DACache("spells", "Master", spellId)); + if (masterSpell) + featId = StringToInt(Get2DACache("spells", "FeatID", masterSpell)); + else + featId = StringToInt(Get2DACache("spells", "FeatID", spellId)); + + + if (GetHasFeat(featId, OBJECT_SELF, TRUE)) + { + string featName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId))); + + json jMetaButton = NuiId(NuiButtonImage(GetSpellIcon(spellId)), PRC_SPELLBOOK_NUI_META_BUTTON_BASEID + IntToString(spellId)); + jMetaButton = NuiWidth(jMetaButton, 32.0f); + jMetaButton = NuiHeight(jMetaButton, 32.0f); + jMetaButton = NuiTooltip(jMetaButton, JsonString(featName)); + + jRow = JsonArrayInsert(jRow, jMetaButton); + } + } + + return jRow; +} + +json GetSpellIcon(int spellId,int nClass=0) +{ + // Binder's spells don't have the FeatID on the spells.2da, so we have to use + // the mapping we constructed to get it. + if (nClass == CLASS_TYPE_BINDER) + { + json binderDict = GetBinderSpellToFeatDictionary(); + int featId = JsonGetInt(JsonObjectGet(binderDict, IntToString(spellId))); + return JsonString(Get2DACache("feat", "Icon", featId)); + } + + int masterSpellID = StringToInt(Get2DACache("spells", "Master", spellId)); + + // if this is a sub radial spell, then we use spell's icon instead + if (masterSpellID) + return JsonString(Get2DACache("spells", "IconResRef", spellId)); + + // the FeatID holds the accurate spell icon, not the SpellID + int featId = StringToInt(Get2DACache("spells", "FeatID", spellId)); + + return JsonString(Get2DACache("feat", "Icon", featId)); +} + +string GetSpellLevelIcon(int spellLevel) +{ + switch (spellLevel) + { + case 0: return "ir_cantrips"; + case 1: return "ir_level1"; + case 2: return "ir_level2"; + case 3: return "ir_level3"; + case 4: return "ir_level4"; + case 5: return "ir_level5"; + case 6: return "ir_level6"; + case 7: return "ir_level789"; + case 8: return "ir_level789"; + case 9: return "ir_level789"; + } + + return ""; +} + +string GetSpellLevelToolTip(int spellLevel) +{ + switch (spellLevel) + { + case 0: return "Cantrips"; + case 1: return "Level 1"; + case 2: return "Level 2"; + case 3: return "Level 3"; + case 4: return "Level 4"; + case 5: return "Level 5"; + case 6: return "Level 6"; + case 7: return "Level 7"; + case 8: return "Level 8"; + case 9: return "Level 9"; + } + + return ""; +} diff --git a/nwn/nwnprc/trunk/scripts/prc_onplayerchat.nss b/nwn/nwnprc/trunk/scripts/prc_onplayerchat.nss index 9b7680f5..f954b932 100644 --- a/nwn/nwnprc/trunk/scripts/prc_onplayerchat.nss +++ b/nwn/nwnprc/trunk/scripts/prc_onplayerchat.nss @@ -2,6 +2,15 @@ //:: OnPlayerChat eventscript //:: prc_onplayerchat //::////////////////////////////////////////////// +/* + A OnChat script that parses what is said and + uses any commands or NUI associated with + commands. +*/ +//::////////////////////////////////////////////// +//:: Updated By: Rakiov +//:: Created On: 22.05.2005 +//::////////////////////////////////////////////// /* PRC Chat Command Format: @@ -15,6 +24,10 @@ OR: #include "prc_inc_chat_dm" #include "prc_inc_chat_pow" #include "prc_inc_chat_shf" +#include "nw_inc_nui" +#include "prc_string_inc" +#include "prc_nui_sb_inc" +#include "prc_nui_consts" const string CHAT_COMMAND_INDICATOR_1 = "~~"; const string CHAT_COMMAND_INDICATOR_2 = ".."; @@ -87,8 +100,54 @@ void main() ExecuteScript(GetLocalString(oPC, PRC_CHAT_HOOK_SCRIPT), oPC); _clear_chat_vars(oPC); } - - ExecuteScript("hp_pa_chatscript", oPC); + + // get current player message and split it up into a list + string sCommand = GetPCChatMessage(); + json sCommandSplit = StringSplit(sChat); + + if(JsonGetLength(sCommandSplit) > 0) + { + string firstWord = JsonGetString(JsonArrayGet(sCommandSplit, 0)); + + // if first word is /pa we are using the power attack interface + if(firstWord == "/pa") + { + if(JsonGetLength(sCommandSplit) >= 2) + { + //if a parameter is given then run the power attack command directly. + string param1 = JsonGetString(JsonArrayGet(sCommandSplit, 1)); + int paAmount = StringToInt(param1); + SetLocalInt(oPC, "PRC_PowerAttack_Level", paAmount); + ExecuteScript("prc_nui_pa_trggr", oPC); + + // update the NUI so it is in sync + int nToken = NuiFindWindow(oPC, NUI_PRC_POWER_ATTACK_WINDOW); + if (nToken != 0) + { + NuiSetBind(oPC, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(paAmount))); + } + } + else + { + // if no param is given then open the NUI + ExecuteScript("prc_nui_pa_view", oPC); + } + + // clear message from chat + SetPCChatMessage(); + } + // If the first word is /sb then we open the Spellbook NUI + if(firstWord == "/sb") + { + ExecuteScript("prc_nui_sb_view", oPC); + + // clear message from chat + SetPCChatMessage(); + } + } + + + // Execute scripts hooked to this event for the player triggering it ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERCHAT); } \ No newline at end of file diff --git a/nwn/nwnprc/trunk/scripts/prc_onplayernui.nss b/nwn/nwnprc/trunk/scripts/prc_onplayernui.nss new file mode 100644 index 00000000..48a051ee --- /dev/null +++ b/nwn/nwnprc/trunk/scripts/prc_onplayernui.nss @@ -0,0 +1,37 @@ +//:://///////////////////////////////////////////// +//:: NUI Events +//:: prc_onplayernui (hp_nui_events) +//::////////////////////////////////////////////// +/* + This handles any NUI events and sends them to + appropriate NUI Event handler depending on the + window Id +*/ +//::////////////////////////////////////////////// +//:: Created By: Rakiov +//:: Created On: 22.05.2005 +//::////////////////////////////////////////////// + +#include "prc_nui_consts" + +void main() +{ + object oPlayer = NuiGetEventPlayer(); + int nToken = NuiGetEventWindow(); + string sWindowId = NuiGetWindowId(oPlayer, nToken); + + // Open the Power Attack NUI + if(sWindowId == NUI_PRC_POWER_ATTACK_WINDOW) + { + ExecuteScript("prc_nui_pa_event"); + } + + // Open the Spellbook NUI + if(sWindowId == PRC_SPELLBOOK_NUI_WINDOW_ID + || sWindowId == NUI_SPELL_DESCRIPTION_WINDOW_ID) + { + ExecuteScript("prc_nui_sb_event"); + } + + return; +} diff --git a/nwn/nwnprc/trunk/scripts/prc_onplaytarget.nss b/nwn/nwnprc/trunk/scripts/prc_onplaytarget.nss index ecfb8452..f978b727 100644 --- a/nwn/nwnprc/trunk/scripts/prc_onplaytarget.nss +++ b/nwn/nwnprc/trunk/scripts/prc_onplaytarget.nss @@ -1,43 +1,101 @@ -//:: -//:: prc_onplaytarget.nss -//:: -//:: - +//:://///////////////////////////////////////////// +//:: PRC Spellbook OnTrigger Event +//:: prc_onplaytarget +//::////////////////////////////////////////////// +/* + This is the OnTarget event used set up spell + attacks with the selected spell from the PRC + Spellbook NUI +*/ +//::////////////////////////////////////////////// +//:: Updated By: Rakiov +//:: Created On: 24.05.2005 +//::////////////////////////////////////////////// #include "prc_inc_skills" +#include "prc_nui_consts" void DoJump(object oPC, location lTarget, int bDoKnockdown); +// +// DoSpellbookAction +// This is a OnTarget event action handling the use of the NUI Spellbook's spell. +// All this should do is take the manual targeting information and send it to the +// prc_nui_sb_trggr to handle the use of the spell. +// +// Arguments: +// oPC:object the player executing the action +// oTarget:object the object target of the spell +// lTarget:location the location the spell is being cast at. +// +void DoSpellbookAction(object oPC, object oTarget, location lTarget); + +// +// ClearEventVariables +// Clears all the event variables used by the NUI Spellbook that coordinates with +// the OnTarget script to make sure it doesn't leave weird behavior for the next run. +// +// Arguments: +// oPC:object the player we are removing the info from. +// +void ClearEventVariables(object oPC); + void DoJump(object oPC, location lTarget, int bDoKnockdown) { - object oTarget; - - location lSource = GetLocation(oPC); - vector vSource = GetPositionFromLocation(lSource); - float fDistance = GetDistanceBetweenLocations(lTarget, lSource); - - string sMessage = "You cannot jump through a closed door."; - - oTarget = GetFirstObjectInShape(SHAPE_SPELLCYLINDER, fDistance, lTarget, TRUE, OBJECT_TYPE_DOOR, vSource); + object oTarget; - //:: Check if the first object found is a door. - while (oTarget != OBJECT_INVALID) - { - //:: Check if the door is closed. - if (!GetIsOpen(oTarget)) - { - FloatingTextStringOnCreature(sMessage, oPC, FALSE); - DeleteLocalLocation(oPC, "TARGETING_POSITION"); - return; - } + location lSource = GetLocation(oPC); + vector vSource = GetPositionFromLocation(lSource); + float fDistance = GetDistanceBetweenLocations(lTarget, lSource); - //:: Select the next target within the spell shape. - oTarget = GetNextObjectInShape(SHAPE_SPELLCYLINDER, fDistance, lTarget, TRUE, OBJECT_TYPE_DOOR,vSource); - } - - PerformJump(oPC, lTarget, TRUE); - - DeleteLocalLocation(oPC, "TARGETING_POSITION"); - + string sMessage = "You cannot jump through a closed door."; + + oTarget = GetFirstObjectInShape(SHAPE_SPELLCYLINDER, fDistance, lTarget, TRUE, OBJECT_TYPE_DOOR, vSource); + + //:: Check if the first object found is a door. + while (oTarget != OBJECT_INVALID) + { + //:: Check if the door is closed. + if (!GetIsOpen(oTarget)) + { + FloatingTextStringOnCreature(sMessage, oPC, FALSE); + DeleteLocalLocation(oPC, "TARGETING_POSITION"); + return; + } + + //:: Select the next target within the spell shape. + oTarget = GetNextObjectInShape(SHAPE_SPELLCYLINDER, fDistance, lTarget, TRUE, OBJECT_TYPE_DOOR,vSource); + } + + PerformJump(oPC, lTarget, TRUE); + + DeleteLocalLocation(oPC, "TARGETING_POSITION"); + +} + +void DoSpellbookAction(object oPC, object oTarget, location lTarget) +{ + object currentTarget = oTarget; + + if (GetIsObjectValid(currentTarget)) + { + SetLocalObject(oPC, "TARGETING_OBJECT", currentTarget); + } + else + { + SetLocalLocation(oPC, "TARGETING_POSITION", lTarget); + } + + ExecuteScript("prc_nui_sb_trggr", oPC); + ClearEventVariables(oPC); +} + +void ClearEventVariables(object oPC) +{ + DeleteLocalObject(oPC, "TARGETING_OBJECT"); + DeleteLocalLocation(oPC, "TARGETING_POSITION"); + DeleteLocalString(oPC, "ONPLAYERTARGET_ACTION"); + DeleteLocalInt(oPC, NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT); + DeleteLocalInt(oPC, NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR); } void main() @@ -45,57 +103,69 @@ void main() // Get the last player to use targeting mode object oPC = GetLastPlayerToSelectTarget(); - string sAction = GetLocalString(oPC, "ONPLAYERTARGET_ACTION"); + string sAction = GetLocalString(oPC, "ONPLAYERTARGET_ACTION"); // Get the targeting mode data - object oTarget = GetTargetingModeSelectedObject(); - vector vTarget = GetTargetingModeSelectedPosition(); - float fOrientation = GetFacing(oPC); + object oTarget = GetTargetingModeSelectedObject(); + vector vTarget = GetTargetingModeSelectedPosition(); + float fOrientation = GetFacing(oPC); // If the user manually exited targeting mode without selecting a target, return + // we also want to clear any existing targeting information we are sending to the script + // so clear all event variables. if (!GetIsObjectValid(oTarget) && vTarget == Vector()) + { + ClearEventVariables(oPC); return; + } // Save the targeting data to the PC object for later use location lTarget = Location(GetArea(oTarget), vTarget, fOrientation); - + SetLocalObject(oPC, "TARGETING_OBJECT", oTarget); SetLocalLocation(oPC, "TARGETING_POSITION", lTarget); - if (sAction == "PRC_JUMP") - { - AssignCommand(oPC, SetFacingPoint(vTarget)); - DelayCommand(0.0f, DoJump(oPC, lTarget, TRUE)); - } - + if (sAction == "PRC_JUMP") + { + AssignCommand(oPC, SetFacingPoint(vTarget)); + DelayCommand(0.0f, DoJump(oPC, lTarget, TRUE)); + } + + // this is being called by the NUI Spellbook, perform the spell action + if (sAction == "PRC_NUI_SPELLBOOK") + { + DoSpellbookAction(oPC, oTarget, lTarget); + } + } - /* object oTarget; - - location lTarget = GetLocalLocation(oPC, "TARGETING_POSITION"); - location lSource = GetLocation(oPC); - float fDistance = GetDistanceBetweenLocations(lTarget, lSource); - + /* object oTarget; - - string sMessage = "You cannot jump through a closed door."; - - oTarget = GetFirstObjectInShape(SHAPE_SPELLCYLINDER, fDistance, lTarget, TRUE, OBJECT_TYPE_DOOR); + location lTarget = GetLocalLocation(oPC, "TARGETING_POSITION"); + location lSource = GetLocation(oPC); + float fDistance = GetDistanceBetweenLocations(lTarget, lSource); - // Check if the first object found is a door. - while (GetIsObjectValid(oTarget)) - { - // Check if the door is closed. - if (!GetIsOpen(oTarget)) - { - SpeakString(sMessage); - break; - } + + + string sMessage = "You cannot jump through a closed door."; + + oTarget = GetFirstObjectInShape(SHAPE_SPELLCYLINDER, fDistance, lTarget, TRUE, OBJECT_TYPE_DOOR); + + // Check if the first object found is a door. + while (GetIsObjectValid(oTarget)) + { + // Check if the door is closed. + if (!GetIsOpen(oTarget)) + { + SpeakString(sMessage); + break; + } //Select the next target within the spell shape. oTarget = GetNextObjectInShape(SHAPE_SPELLCYLINDER, fDistance, lTarget, TRUE, OBJECT_TYPE_DOOR); - } - //location lTarget = PRCGetSpellTargetLocation(); - + } + //location lTarget = PRCGetSpellTargetLocation(); + //PerformJump(oPC, lLoc, TRUE)); - - DelayCommand(0.0f, DoJump(oPC, lTarget, TRUE)); */ \ No newline at end of file + + DelayCommand(0.0f, DoJump(oPC, lTarget, TRUE)); */ + diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk index 65695d4c..88bdc242 100644 Binary files a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk differ diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml index 7054970d..f6b9ae67 100644 --- a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml +++ b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml @@ -71357,6 +71357,8 @@ When within your own black labyrinth, you are immune to the last two effects (mo Spellcraft doesn't provide a bonus to your save vs. spells in 3e Dungeons & Dragons. This is reflected in the PRC8. Tumble doesn't provide a bonus to your Armor Class in 3e Dungeons & Dragons. This is reflected in the PRC8. Feats for Alternate Magic Systems (Psionics, Incarnum, etc) are all organized under a Masterfeat. Psionic Feats, ToB Feats, etc... + Typing "/sb" in chat will bring up the NUI spellcasting menu. + Typing "/pa" in chat will bring up the NUI Power Attack menu. Favored Mystery - Black Labyrinth Holy Warrior Type of Feat: Reserve diff --git a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk index 65695d4c..88bdc242 100644 Binary files a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk differ diff --git a/nwn/nwnprc/trunk/users/jaysyn/bad_amagsys_gain.nss b/nwn/nwnprc/trunk/users/jaysyn/bad_amagsys_gain.nss deleted file mode 100644 index b4c52877..00000000 --- a/nwn/nwnprc/trunk/users/jaysyn/bad_amagsys_gain.nss +++ /dev/null @@ -1,676 +0,0 @@ -//::////////////////////////////////////////////// -//:: Alternate magic system gain evaluation script -//:: prc_amagsys_gain -//::////////////////////////////////////////////// -/** @file - This file determines if the given character - has gained new spells / powers / utterances / - whathaveyou since the last time it was run. - If so, it starts the relevant selection - conversations. - - Add new classes to their respective magic - user type block, or if such doesn't exist - yet for the system the class belongs to, - make a new block for them at the end of main(). - - - @author Ornedan - @date Created - 2006.12.14 - */ -//::////////////////////////////////////////////// - -//:: Updated for .35 by Jaysyn 2023/03/11 - -//::////////////////////////////////////////////// - -#include "inc_dynconv" -#include "psi_inc_psifunc" -#include "inc_newspellbook" -#include "true_inc_trufunc" -#include "tob_inc_tobfunc" -#include "shd_inc_shdfunc" -#include "inv_inc_invfunc" - -////////////////////////////////////////////////// -/* Function prototypes */ -////////////////////////////////////////////////// - -void CheckSpellbooks(object oPC); -void CheckPsionics(object oPC); -void CheckInvocations(object oPC); -void CheckToB(object oPC); -void CheckShadow(object oPC); -void CheckTruenaming(object oPC); -int CheckMissingPowers(object oPC, int nClass); -int CheckMissingSpells(object oPC, int nClass, int nMinLevel, int nMaxLevel); -int CheckMissingUtterances(object oPC, int nClass, int nLexicon); -int CheckMissingManeuvers(object oPC, int nClass); -int CheckMissingMysteries(object oPC, int nClass); -int CheckMissingInvocations(object oPC, int nClass); -void AMSCompatibilityCheck(object oPC); - -////////////////////////////////////////////////// -/* Function definitions */ -////////////////////////////////////////////////// - -void main() -{ - object oPC = OBJECT_SELF; - - // Sanity checks - Shifted or polymorphed characters may have their hide fucked up, and might be missing access to their hide-feats - // @todo Shifting probably doesn't do this anymore, could be ditchable - Ornedan, 20061214 - if(GetLocalInt(oPC, "nPCShifted")) - return; - effect eTest = GetFirstEffect(oPC); - while(GetIsEffectValid(eTest)) - { - if(GetEffectType(eTest) == EFFECT_TYPE_POLYMORPH) - return; - eTest = GetNextEffect(oPC); - } - - DelayCommand(0.0f, CheckSpellbooks(oPC)); -} - -// Handle new spellbooks -void CheckSpellbooks(object oPC) -{ - if(GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oPC) > 0) - { - CheckMissingSpells(oPC, CLASS_TYPE_SUBLIME_CHORD, 4, 9); - - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BARD, oPC)) - { - CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 3); - } - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_SORCERER)) - { - CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 3); - } - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_WARMAGE, oPC)) - { - CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 3); - } - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_DUSKBLADE, oPC)) - { - CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 3); - } - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BEGUILER, oPC)) - { - CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 3); - } - } - - // Check all classes that might need a spellbook update - if(GetIsRHDSorcerer(oPC)) CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9); - if(GetIsRHDBard(oPC)) CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6); - - if(!GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK)) - CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6); - if(!GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK)) - CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9); - - CheckMissingSpells(oPC, CLASS_TYPE_SUEL_ARCHANAMACH, 1, 5); - CheckMissingSpells(oPC, CLASS_TYPE_FAVOURED_SOUL, 0, 9); - CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 9); - CheckMissingSpells(oPC, CLASS_TYPE_DREAD_NECROMANCER, 1, 9); - CheckMissingSpells(oPC, CLASS_TYPE_HEXBLADE, 1, 4); - CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 5); - CheckMissingSpells(oPC, CLASS_TYPE_JUSTICEWW, 1, 4); - CheckMissingSpells(oPC, CLASS_TYPE_KNIGHT_WEAVE, 1, 6); - CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9); - CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9); - CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3); - CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4); - CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4); - - // Check psionics - DelayCommand(0.0f, CheckPsionics(oPC)); -} - - -/* void CheckSpellbooks(object oPC) -{ - if(GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oPC) > 0) - { - // Manually check Sublime Chord spells (levels 4–9) - CheckMissingSpells(oPC, CLASS_TYPE_SUBLIME_CHORD, 4, 9); - - // Get the character's *base* arcane class (Sublime Chord isn't returned) - int nPrimaryArcane = GetPrimaryArcaneClass(oPC); - - // Carveout: Allow known spells from Bard/Sorc/Warmage etc. up to level 3 - if(nPrimaryArcane == CLASS_TYPE_BARD) - { - CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 3); - } - else if(nPrimaryArcane == CLASS_TYPE_SORCERER) - { - CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 3); - } - else if(nPrimaryArcane == CLASS_TYPE_WARMAGE) - { - CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 3); - } - else if(nPrimaryArcane == CLASS_TYPE_DUSKBLADE) - { - CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 3); - } - else if(nPrimaryArcane == CLASS_TYPE_BEGUILER) - { - CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 3); - } - - // Stop here; Sublime Chord handled separately - return; - } - - if(GetIsRHDSorcerer(oPC) && CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9)) - return; - if(GetIsRHDBard(oPC) && CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6)) - return; - if(!GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK) && CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6)) - return; - if(!GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK) && CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_SUEL_ARCHANAMACH, 1, 5)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_FAVOURED_SOUL, 0, 9)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 9)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_DREAD_NECROMANCER, 1, 9)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_HEXBLADE, 1, 4)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 5)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_JUSTICEWW, 1, 4)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_KNIGHT_WEAVE, 1, 6)) - return; -// if(CheckMissingSpells(oPC, CLASS_TYPE_SUBLIME_CHORD, 4, 9)) -// return; - if(CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4)) - return; - if(CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4)) - return; - - DelayCommand(0.0f, CheckPsionics(oPC)); -} - */ - - -// Handle psionics -void CheckPsionics(object oPC) -{ - if(CheckMissingPowers(oPC, CLASS_TYPE_PSION)) - return; - if(CheckMissingPowers(oPC, CLASS_TYPE_WILDER)) - return; - if(CheckMissingPowers(oPC, CLASS_TYPE_PSYWAR)) - return; - if(CheckMissingPowers(oPC, CLASS_TYPE_PSYCHIC_ROGUE)) - return; - if(CheckMissingPowers(oPC, CLASS_TYPE_FIST_OF_ZUOKEN)) - return; - if(CheckMissingPowers(oPC, CLASS_TYPE_WARMIND)) - return; - //expanded knowledge - if(CheckMissingPowers(oPC, -1)) - return; - //epic expanded knowledge - if(CheckMissingPowers(oPC, -2)) - return; - - DelayCommand(0.0f, CheckInvocations(oPC)); -} - -// Handle Invocations -void CheckInvocations(object oPC) -{ - if(CheckMissingInvocations(oPC, CLASS_TYPE_DRAGONFIRE_ADEPT)) - return; - if(CheckMissingInvocations(oPC, CLASS_TYPE_WARLOCK)) - return; - if(CheckMissingInvocations(oPC, CLASS_TYPE_DRAGON_SHAMAN)) - return; - //extra invocations - if(CheckMissingInvocations(oPC, CLASS_TYPE_INVALID)) - return; - //epic extra invocations - if(CheckMissingInvocations(oPC, -2)) - return; - - DelayCommand(0.0f, CheckToB(oPC)); -} - -// Handle Tome of Battle -void CheckToB(object oPC) -{ - if(CheckMissingManeuvers(oPC, CLASS_TYPE_CRUSADER)) - return; - if(CheckMissingManeuvers(oPC, CLASS_TYPE_SWORDSAGE)) - return; - if(CheckMissingManeuvers(oPC, CLASS_TYPE_WARBLADE)) - return; - - DelayCommand(0.0f, CheckShadow(oPC)); -} - -// Handle Shadowcasting -void CheckShadow(object oPC) -{ - if(CheckMissingMysteries(oPC, CLASS_TYPE_SHADOWCASTER)) - return; - if(CheckMissingMysteries(oPC, CLASS_TYPE_SHADOWSMITH)) - return; - - DelayCommand(0.0f, CheckTruenaming(oPC)); -} - -// Handle Truenaming - Three different Lexicons to check -void CheckTruenaming(object oPC) -{ - if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_EVOLVING_MIND)) - return; - if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_CRAFTED_TOOL)) - return; - if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_PERFECTED_MAP)) - return; - - if(!GetIsDM(oPC)) - DelayCommand(0.0f, AMSCompatibilityCheck(oPC)); -} - -int CheckMissingPowers(object oPC, int nClass) -{ - int nLevel = GetLevelByClass(nClass, oPC); - if(!nLevel && nClass != -1 && nClass != -2) - return FALSE; - else if(nClass == -1 && !GetHasFeat(FEAT_EXPANDED_KNOWLEDGE_1)) - return FALSE; - else if(nClass == -2 && !GetHasFeat(FEAT_EPIC_EXPANDED_KNOWLEDGE_1)) - return FALSE; - - int nCurrentPowers = GetPowerCount(oPC, nClass); - int nMaxPowers = GetMaxPowerCount(oPC, nClass); - - if(nCurrentPowers < nMaxPowers) - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "nClass", nClass); - StartDynamicConversation("psi_powconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - - return TRUE; - } - return FALSE; -} - -int CheckMissingInvocations(object oPC, int nClass) -{ - int nLevel = GetLevelByClass(nClass, oPC); - if(!nLevel && (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT || nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_DRAGON_SHAMAN)) - return FALSE; - else if(nClass == CLASS_TYPE_INVALID && !GetHasFeat(FEAT_EXTRA_INVOCATION_I)) - return FALSE; - else if(nClass == -2 && !GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_I)) - return FALSE; - - int nCurrentInvocations = GetInvocationCount(oPC, nClass); - if(DEBUG) DoDebug("Current Invocations: " + IntToString(nCurrentInvocations)); - int nMaxInvocations = GetMaxInvocationCount(oPC, nClass); - if(DEBUG) DoDebug("Max Invocations: " + IntToString(nMaxInvocations)); - - if(nCurrentInvocations < nMaxInvocations) - { - // Mark the class for which the PC is to gain invocations and start the conversation - SetLocalInt(oPC, "nClass", nClass); - StartDynamicConversation("inv_invokeconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - - return TRUE; - } - return FALSE; -} - -void AddSpellsForLevel(int nClass, int nLevel) -{ - object oPC = OBJECT_SELF; - object oSkin = GetPCSkin(oPC); - //object oToken = GetHideToken(oPC); - string sFile = GetFileForClass(nClass); - string sSpellbook; - int nSpellbookType = GetSpellbookTypeForClass(nClass); - if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS) - sSpellbook = "Spellbook"+IntToString(nClass); - else - sSpellbook = "Spellbook_Known_"+IntToString(nClass)+"_"+IntToString(nLevel); - - // Create spells known persistant array if it is missing - int nSize = persistant_array_get_size(oPC, sSpellbook); - if (nSize < 0) - { - persistant_array_create(oPC, sSpellbook); - nSize = 0; - } - - //check for learnable spells - object oToken_Class = GetObjectByTag("SpellLvl_" + IntToString(nClass) + "_Level_" + IntToString(nLevel)); - int nSpells_Total = persistant_array_get_size(oToken_Class, "Lkup"); - int i; - for(i = 0; i < nSpells_Total; i++) - { - int nSpellbookID = persistant_array_get_int(oToken_Class, "Lkup", i); - if(Get2DAString(sFile, "AL", nSpellbookID) != "1") - { - persistant_array_set_int(oPC, sSpellbook, nSize, nSpellbookID); - nSize++; - if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS) - { - int nIPFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", nSpellbookID)); - int nFeatID = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookID)); - AddSpellUse(oPC, nSpellbookID, nClass, sFile, "NewSpellbookMem_" + IntToString(nClass), nSpellbookType, oSkin, nFeatID, nIPFeatID); - } - } - } -} - -int CheckMissingSpells(object oPC, int nClass, int nMinLevel, int nMaxLevel) -{ - int nLevel; - -//:: Rakshasa cast as sorcerers - if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_OUTSIDER, oPC); - -//:: Aranea cast as sorcerers - else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARANEA) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_SHAPECHANGER, oPC); - -//::Arkamoi cast as sorcerers - else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); - -//::Hobgoblin Warsouls cast as sorcerers - else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); - -//:: Driders cast as sorcerers - else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_DRIDER) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_ABERRATION, oPC); - -//:: Marrutact cast as 6/7 sorcerers - else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); - -//:: Redspawn Arcaniss cast as 3/4 sorcerers - else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); - -//:: Gloura cast as bards - else if(nClass == CLASS_TYPE_BARD && !GetLevelByClass(CLASS_TYPE_BARD, oPC) && GetRacialType(oPC) == RACIAL_TYPE_GLOURA) - nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); - - else - nLevel = nClass == CLASS_TYPE_SUBLIME_CHORD ? GetLevelByClass(nClass, oPC) : GetSpellslotLevel(nClass, oPC); - - if (DEBUG) DoDebug("CheckMissingSpells 1 Class: " + IntToString(nClass)); - if (DEBUG) DoDebug("CheckMissingSpells 1 Level: " + IntToString(nLevel)); - - if(!nLevel) - return FALSE; - - if(nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER) - { - if((GetLevelByClass(nClass, oPC) == nLevel) //no PrC - && !(GetHasFeat(FEAT_DRACONIC_GRACE, oPC) || GetHasFeat(FEAT_DRACONIC_BREATH, oPC))) //no Draconic feats that apply - return FALSE; - } - else if(nClass == CLASS_TYPE_ARCHIVIST) - { - int nLastGainLevel = GetPersistantLocalInt(oPC, "LastSpellGainLevel"); - nLevel = GetLevelByClass(CLASS_TYPE_ARCHIVIST, oPC); - - if(nLastGainLevel < nLevel) - { - if(nLevel == 1) - { - //count the number of available at 1st level spells - int nSpellsAvailable = 3 + GetAbilityModifier(ABILITY_INTELLIGENCE, oPC); - SetLocalInt(oPC, "LrnLvlUp", nSpellsAvailable); - } - else if(nLevel > 1) - //add additional 2 spells form cleric list - SetLocalInt(oPC, "LrnLvlUp", 2); - - SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_ARCHIVIST); - SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel); - StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, TRUE, FALSE, oPC); - - return TRUE; - } - //add cleric spells known for level 0 - else if(persistant_array_get_size(oPC, "Spellbook_Known_"+IntToString(CLASS_TYPE_ARCHIVIST)+"_0") < 5) // TODO: replace with GetSpellKnownCurrentCount - { - ActionDoCommand(AddSpellsForLevel(CLASS_TYPE_ARCHIVIST, 0)); - } - else - return FALSE; - } - - if (DEBUG) DoDebug("CheckMissingSpells 2 Class: " + IntToString(nClass)); - if (DEBUG) DoDebug("CheckMissingSpells 2 Level: " + IntToString(nLevel)); - - int i; - for(i = nMinLevel; i <= nMaxLevel; i++) - { - int nMaxSpells = GetSpellKnownMaxCount(nLevel, i, nClass, oPC); - if(nMaxSpells > 0) - { - int nCurrentSpells = GetSpellKnownCurrentCount(oPC, i, nClass); - int nSpellsAvailable = GetSpellUnknownCurrentCount(oPC, i, nClass); - - if(nCurrentSpells < nMaxSpells && nSpellsAvailable > 0) - { - if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS && bKnowsAllClassSpells(nClass)) - { - ActionDoCommand(AddSpellsForLevel(nClass, i)); - } - else - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "SpellGainClass", nClass); - SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel); - SetLocalInt(oPC, "SpellbookMaxSpelllevel", nMaxLevel); - StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - - return TRUE; - } - } - } - } - //Advanced Learning check - nLevel = GetLevelByClass(nClass, oPC); - int nALSpells = GetPersistantLocalInt(oPC, "AdvancedLearning_"+IntToString(nClass)); - if(nClass == CLASS_TYPE_BEGUILER && nALSpells < (nLevel+1)/4)//one every 4 levels starting at 3. - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_BEGUILER); - SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel); - SetLocalInt(oPC, "AdvancedLearning", 1); - StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - return TRUE; - } - else if(nClass == CLASS_TYPE_DREAD_NECROMANCER && nALSpells < nLevel/4)//one every 4 levels - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_DREAD_NECROMANCER); - SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel); - SetLocalInt(oPC, "AdvancedLearning", 1); - StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - return TRUE; - } - else if(nClass == CLASS_TYPE_WARMAGE) - { - if((nLevel >= 40 && nALSpells < 9) ||// :/ - (nLevel >= 36 && nLevel < 40 && nALSpells < 8) || - (nLevel >= 32 && nLevel < 36 && nALSpells < 7) || - (nLevel >= 28 && nLevel < 32 && nALSpells < 6) || - (nLevel >= 24 && nLevel < 28 && nALSpells < 5) || - (nLevel >= 16 && nLevel < 24 && nALSpells < 4) || - (nLevel >= 11 && nLevel < 16 && nALSpells < 3) || - (nLevel >= 6 && nLevel < 11 && nALSpells < 2) || - (nLevel >= 3 && nLevel < 6 && nALSpells < 1)) - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_WARMAGE); - SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel); - SetLocalInt(oPC, "AdvancedLearning", 1); - StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - return TRUE; - } - } - else if(nClass == CLASS_TYPE_NIGHTSTALKER && nALSpells < (nLevel+1)/6)//one every 6 levels starting at 5th - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_NIGHTSTALKER); - SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel); - SetLocalInt(oPC, "AdvancedLearning", 1); - StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - return TRUE; - } - - return FALSE; -} - -int CheckMissingUtterances(object oPC, int nClass, int nLexicon) -{ - int nLevel = GetLevelByClass(nClass, oPC); - if(!nLevel) - return FALSE; - - int nCurrentUtterances = GetUtteranceCount(oPC, nClass, nLexicon); - int nMaxUtterances = GetMaxUtteranceCount(oPC, nClass, nLexicon); - if(DEBUG) DoDebug("CheckMissingUtterances(" + IntToString(nClass) + ", " + IntToString(nLexicon) + ", " + GetName(oPC) + ") = " + IntToString(nCurrentUtterances) + ", " + IntToString(nMaxUtterances)); - - if(nCurrentUtterances < nMaxUtterances) - { - // Mark the class for which the PC is to gain Utterances and start the conversation - SetLocalInt(oPC, "nClass", nClass); - StartDynamicConversation("true_utterconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - - return TRUE; - } - return FALSE; -} - -int CheckMissingManeuvers(object oPC, int nClass) -{ - int nLevel = GetLevelByClass(nClass, oPC); - if(!nLevel) - return FALSE; - - int nCurrentManeuvers = GetManeuverCount(oPC, nClass, MANEUVER_TYPE_MANEUVER); - int nMaxManeuvers = GetMaxManeuverCount(oPC, nClass, MANEUVER_TYPE_MANEUVER); - int nCurrentStances = GetManeuverCount(oPC, nClass, MANEUVER_TYPE_STANCE); - int nMaxStances = GetMaxManeuverCount(oPC, nClass, MANEUVER_TYPE_STANCE); - - if(nCurrentManeuvers < nMaxManeuvers || nCurrentStances < nMaxStances) - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "nClass", nClass); - StartDynamicConversation("tob_moveconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - - return TRUE; - } - return FALSE; -} - -int CheckMissingMysteries(object oPC, int nClass) -{ - int nLevel = GetLevelByClass(nClass, oPC); - if(!nLevel) - return FALSE; - - int nCurrentMysteries = GetMysteryCount(oPC, nClass); - int nMaxMysteries = GetMaxMysteryCount(oPC, nClass); - - if(nCurrentMysteries < nMaxMysteries) - { - // Mark the class for which the PC is to gain powers and start the conversation - SetLocalInt(oPC, "nClass", nClass); - StartDynamicConversation("shd_mystconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC); - - return TRUE; - } - return FALSE; -} - -//AMS Compatibility functions - xwarren: -void CopyAMSArray(object oPC, object oAMSToken, int nClass, string sArray, int nMin, int nMax, int nLoopSize = 100) -{ - string sFile = GetFileForClass(nClass); - int i = nMin; - while(i < nMin + nLoopSize && i < nMax) - { - int nSpellbookID = persistant_array_get_int(oPC, sArray, i); - int nSpell = StringToInt(Get2DACache(sFile, "RealSpellID", nSpellbookID)); - if(DEBUG) DoDebug("Copying spell "+IntToString(nSpell)); - array_set_int(oAMSToken, sArray, i, nSpell); - i++; - } - if(i < nMax) - DelayCommand(0.0, CopyAMSArray(oPC, oAMSToken, nClass, sArray, i, nMax)); -} - -void DoBuckUpAMS(object oPC, int nClass, string sSpellbook, object oHideToken, object oAMSToken) -{ - if(DEBUG) DoDebug("Creating buck-up copy of "+sSpellbook); - if(array_exists(oAMSToken, sSpellbook)) - array_delete(oAMSToken, sSpellbook); - array_create(oAMSToken, sSpellbook); - int nSize = persistant_array_get_size(oPC, sSpellbook); - DelayCommand(0.0, CopyAMSArray(oPC, oAMSToken, nClass, sSpellbook, 0, nSize)); -} - -void AMSCompatibilityCheck(object oPC) -{ - //Get an extra hide token with amagsys info - object oAMSToken = GetHideToken(oPC, TRUE); - object oHideToken = GetHideToken(oPC); //ebonfowl: no longer used but I'm leaving it to not have to edit other functions - - int i; - for(i = 1; i <= 8; i++) - { - int nClass = GetClassByPosition(i, oPC); - string sSpellbook; - int nSpellbookType = GetSpellbookTypeForClass(nClass); - if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS) - { - sSpellbook = "Spellbook"+IntToString(nClass); - int nSize1 = persistant_array_get_size(oPC, sSpellbook); - int nSize2 = array_get_size(oAMSToken, sSpellbook); - if(nSize1 > nSize2) - DelayCommand(0.1f, DoBuckUpAMS(oPC, nClass, sSpellbook, oHideToken, oAMSToken)); - } - else if(nSpellbookType == SPELLBOOK_TYPE_PREPARED) - { - int j; - for(j = 0; j <= 9; j++) - { - sSpellbook = "Spellbook_Known_"+IntToString(nClass)+"_"+IntToString(j); - int nSize1 = persistant_array_get_size(oPC, sSpellbook); - int nSize2 = array_get_size(oAMSToken, sSpellbook); - if(nSize1 > nSize2) - DelayCommand(0.1f, DoBuckUpAMS(oPC, nClass, sSpellbook, oHideToken, oAMSToken)); - } - } - } -} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/users/jaysyn/bad_inc_castlvl.nss b/nwn/nwnprc/trunk/users/jaysyn/bad_inc_castlvl.nss deleted file mode 100644 index 199929b6..00000000 --- a/nwn/nwnprc/trunk/users/jaysyn/bad_inc_castlvl.nss +++ /dev/null @@ -1,6762 +0,0 @@ - -/** - * @file - * - * This file contains PRCGetCasterLevel() and all its accessory functions. - * Functions that modify caster level go in this include. Keep out irrelevent - * functions. If this ends up like prc_inc_spells, you get slapped. - */ - -//:: Updated for 8 class slots by Jaysyn 2024/02/05 - -////////////////////////////////////////////////// -/* Function prototypes */ -////////////////////////////////////////////////// - -/** - * Returns the caster level when used in spells. You can use PRCGetCasterLevel() - * to determine a caster level from within a true spell script. In spell-like- - * abilities & items, it will only return GetCasterLevel. - * - * @param oCaster The creature casting the spell. - * - * @return The caster level the spell was cast at. - */ -int PRCGetCasterLevel(object oCaster = OBJECT_SELF); - -/** - * A lookup for caster level progression for divine and arcane base classes - * @return an int that can be used in caster level calculations note: these use int division - */ -int GetCasterLevelModifier(int nClass); - -/** - * To override for custom spellcasting classes. Looks for the - * local int "PRC_CASTERCLASS_OVERRIDE" on oCaster. If set, - * this is used as the casting class, else GetLastSpellCastClass() - * is used. - * - * @param oCaster The creature that last cast a spell - * - * @return The class used to cast the spell. - */ -int PRCGetLastSpellCastClass(object oCaster = OBJECT_SELF); - -/** - * Returns if the given class is an arcane class. - * - * Arcane base classes are *hardcoded* into here, so new arcane - * base classes need adding to this function. - * Note: PrCs with their own spellbook eg. assassin count as base casters for this function - * - * @param oCaster The creature to check (outsiders can have sorc caster levels) - * - * @return TRUE if nClass is an arcane spellcasting class, FALSE otherwise - */ -int GetIsArcaneClass(int nClass, object oCaster = OBJECT_SELF); - -/** - * Returns if the given class is an divine class. - * - * Divine base classes are *hardcoded* into here, so new divine - * base classes need adding to this function. - * Note: PrCs with their own spellbook eg. blackguard count as base casters for this function - * - * @param oCaster The creature to check (not currently used) - * - * @return TRUE if nClass is a divine spellcasting class, FALSE otherwise - */ -int GetIsDivineClass(int nClass, object oCaster = OBJECT_SELF); - -// Returns the best "natural" arcane levels of the PC in question. Does not -// consider feats that situationally adjust caster level. -int GetLevelByTypeArcane(object oCaster = OBJECT_SELF); - -// Returns the best "natural" divine levels of the PC in question. Does not -// consider feats that situationally adjust caster level. -int GetLevelByTypeDivine(object oCaster = OBJECT_SELF); - -/** - * Works out the total arcane caster levels from arcane PrCs. - * - * Arcane prestige classes are *hardcoded* into this function, so new arcane caster - * classes need adding to it. Rakshasa RHD count as sorc PrC levels if they also have some levels in sorc - * note: PrCs with their own spellbook eg. assassin are not PrCs for this function - * - * @param oCaster The creature to check - * @param nCastingClass Casting class - * - * @return Number of arcane caster levels contributed by PrCs. - */ -int GetArcanePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID); - -/** - * Works out the total divine caster levels from arcane PrCs. - * - * Divine prestige classes are *hardcoded* into this function, so new divine caster - * classes need adding to it. - * note: PrCs with their own spellbook eg. blackguard are not PrCs for this function - * - * @param oCaster The creature to check - * @param nCastingClass Casting class - - * @return Number of divine caster levels contributed by PrCs. - */ -int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID); - -/** - * Gets the position of the first arcane base class. - * - * @param oCaster The creature to check - * - * @return The position (1-8) of the first arcane *base* class of oCaster - */ -int GetFirstArcaneClassPosition(object oCaster = OBJECT_SELF); - -/** - * Gets the position of the first divine base class. - * - * @param oCaster The creature to check - * - * @return The position (1-8) of the first divine *base* class of oCaster - */ -int GetFirstDivineClassPosition(object oCaster = OBJECT_SELF); - -/** - * Gets the highest or first (by position) *base* arcane class type or, - * if oCaster has no arcane class levels, returns CLASS_TYPE_INVALID. - * - * This will get rakshasa RHD 'class' if oCaster doesn't have sorc levels. - * - * @param oCaster The creature to check - * - * @return CLASS_TYPE_* of first base arcane class or CLASS_TYPE_INVALID - */ -int GetPrimaryArcaneClass(object oCaster = OBJECT_SELF); - -/** - * Gets the highest first (by position) *base* divine class type or, - * if oCaster has no divine class levels, returns CLASS_TYPE_INVALID. - * - * @param oCaster The creature to check - * - * @return CLASS_TYPE_* of first base divine class or CLASS_TYPE_INVALID - */ -int GetPrimaryDivineClass(object oCaster = OBJECT_SELF); - -/** - * Gets the highest *base* arcane or divine class type or, - * if oCaster has no spellcasting class levels, returns CLASS_TYPE_INVALID. - * - * @param oCaster The creature to check - * - * @return CLASS_TYPE_* of first base arcane/divine class or CLASS_TYPE_INVALID - */ -int GetPrimarySpellcastingClass(object oCaster = OBJECT_SELF); - -/** - * Gets the caster level adjustment from the Practiced Spellcaster feats. - * - * @param oCaster The creature to check - * @param iCastingClass The CLASS_TYPE* that the spell was cast by. - * @param iCastingLevels The caster level for the spell calculated so far - * ie. BEFORE Practiced Spellcaster. - */ -int PracticedSpellcasting(object oCaster, int iCastingClass, int iCastingLevels); - -/** - * Returns the spell school of the spell passed to it. - * - * @param iSpellId The spell to get the school of. - * - * @return The SPELL_SCHOOL_* of the spell. - */ -int GetSpellSchool(int iSpellId); - -/** - * Healing spell filter. - * - * Gets if the given spell is a healing spell based on a hardcoded list. New - * healing spells need to be added to this. - * - * @author GaiaWerewolf - * @date 18 July 2005 - * - * @param nSpellId The spell to check - * - * @return TRUE if it is a healing spell, FALSE otherwise. - */ -int GetIsHealingSpell(int nSpellId); - -/** - * Gets the contribution of the archmage's High Arcana Spell Power - * feat to caster level. - * - * @param oCaster The creature to check - * - * @return caster level modifier from archmage Spell Power feats. - */ -int ArchmageSpellPower(object oCaster); - -/** - * Gets the caster level modifier from the Shadow Weave feat. - * - * Schools of Enchantment, Illusion, and Necromancy, and spells with the darkness - * descriptor altered by +1, Evocation or Transmutation (except spells with the - * darkness descriptor) altered by -1. - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * @param nSpellSchool The spell school the cast spell is from - * if none is specified, uses GetSpellSchool() - * - * @return caster level modifier for Shadow Weave feat. - */ -int ShadowWeave(object oCaster, int iSpellID, int nSpellSchool = -1); - -/** - * Gets the caster level modifier from the Divination Power class feature. - * - * Divination spells +1/3 Unseen Seer levels, all others -1/3 Unseer Seer levels - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * @param nSpellSchool The spell school the cast spell is from - * if none is specified, uses GetSpellSchool() - * - * @return caster level modifier for Divination Power feat. - */ -int DivinationPower(object oCaster, int nSpellSchool); - -/** - * Handles feats that modify caster level of spells with the fire - * descriptor. - * - * Currently this is Disciple of Meph's Fire Adept feat and Bloodline of Fire feat. - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * - * @return Caster level modifier for fire related feats. - */ -int FireAdept(object oCaster, int iSpellID); - -/** - * Handles feats that modify caster level of spells with the air - * descriptor. - * - * Currently this is the Air Mephling's Type feat - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * - * @return Caster level modifier for fire related feats. - */ -int AirAdept(object oCaster, int iSpellID); - -/** - * Handles feats that modify caster level of spells with the air - * descriptor. - * - * Currently this is the Air Mephling's Type feat - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * - * @return Caster level modifier for fire related feats. - */ -int WaterAdept(object oCaster, int iSpellID); - -/** - * Handles feats that modify caster level of spells with the earth - * descriptor. - * - * Currently this is Drift Magic feat. - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * - * @return Caster level modifier for earth related feats. - */ -int DriftMagic(object oCaster, int iSpellID); - -/** - * Soulcaster boost to caster level based on invested essentia - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * - * @return Caster level modifier - */ -int Soulcaster(object oCaster, int iSpellID); - -/** - * Gets the caster level modifier from the Storm Magic feat. - * - * Get +1 caster level if raining or snowing in area - * - * @param oCaster The creature to check - * - * @return Caster level modifier for Storm Magic feat. - */ -int StormMagic(object oCaster); - -/** - * Gets the caster level modifier from the Cormanthyran Moon Magic feat. - * - * Get +1 caster level if outdoors, at night, with no rain. - * - * @param oCaster The creature to check - * - * @return Caster level modifier for Cormanthyran Moon Magic feat. - */ -int CormanthyranMoonMagic(object oCaster); - -/** - * Gets the caster level modifier from various domains. - * - * @param oCaster The creature to check - * @param nSpellID The spell ID of the spell - * @param nSpellSchool The spell school the cast spell is from - * if none is specified, uses GetSpellSchool() - * - * @return caster level modifier from domain powers - */ -int DomainPower(object oCaster, int nSpellID, int nSpellSchool = -1); - -/** - * Gets the caster level modifier from the Therapeutic Mantle Meld. - * - * @param oCaster The creature to check - * - * @return caster level modifier - */ -int TherapeuticMantle(object oCaster, int nSpellID); - -/** - * Gets the caster level modifier from the antipaladin's Death Knell SLA. - * - * @param oCaster The creature to check - * - * @return caster level modifier from the Death Knell SLA - */ -int DeathKnell(object oCaster); - -/** - * Gets the caster level modifier from the Draconic Power feat. - * - * Feat gives +1 to caster level. - * - * @param oCaster The creature to check - * - * @return caster level modifier from the Draconic power feat. - */ -int DraconicPower(object oCaster = OBJECT_SELF); - -/** - * Gets the caster level modifier from Song of Arcane Power effect. - * - * @param oCaster The creature to check - * - * @return caster level modifier from the Draconic power feat. - */ -int SongOfArcanePower(object oCaster = OBJECT_SELF); - -/** - * Gets the caster level modifier to necromancy spells for the - * True Necromancer PrC (all spellcasting levels are counted, both - * arcane and divine). - * - * @param oCaster The creature to check - * @param iSpellID The spell ID of the spell - * @param sType "ARCANE" or "DIVINE" spell - * @param nSpellSchool The spell school the cast spell is from - * if none is specified, uses GetSpellSchool() - * - * @return caster level modifier for True Necro - */ -int TrueNecromancy(object oCaster, int iSpellID, string sType, int nSpellSchool = -1); - -// Nentyar Hunter casting boost -int Nentyar(object oCaster, int nCastingClass); - -// +1 on spells that target armor or shields -int ShieldDwarfWarder(object oCaster); - -// +1 while this feat is active -int DarkSpeech(object oCaster); - -// Adds 1/2 level in all other casting classes. -int UrPriestCL(object oCaster, int nCastingClass); - -// Adds Druid levels to Blighter caster level -int BlighterCL(object oCaster, int nCastingClass); - -//ebonfowl: Adds CL boosts from reserve feats -int ReserveFeatCL(object oCaster, int iSpellId); - -////////////////////////////////////////////////// -/* Include section */ -////////////////////////////////////////////////// - -//#include "prc_racial_const" -// Not needed as it has acccess via prc_inc_newip -//#include "prc_inc_nwscript" // gets inc_2da_cache, inc_debug, prc_inc_switch -#include "prc_inc_newip" -//#include "prc_inc_spells" -#include "prc_inc_descrptr" - -////////////////////////////////////////////////// -/* Internal functions */ -////////////////////////////////////////////////// - -// stolen from prcsp_archmaginc.nss, modified to work in FireAdept() function -string _GetChangedElementalType(int nSpellID, object oCaster = OBJECT_SELF) -{ - string spellType = Get2DACache("spells", "ImmunityType", nSpellID);//lookup_spell_type(spell_id); - string sType = GetLocalString(oCaster, "archmage_mastery_elements_name"); - - if (sType == "") sType = spellType; - - return sType; -} - -//ebonfowl: Adding this function to check if a spell belongs to a given domain based on the Reserve Feat 2das -//Only works with Death, Destruction and War domains as only those domain 2das have been created -int GetIsFromDomain (int iSpellId, string sDomain) -{ - string sFile = "prc_desc_" + sDomain; - - int i; - int nListSpellID; - - for (i = 0; i < 15; i++) // Adjust max i to reflect something close to the highest row number in the 2das - { - nListSpellID = StringToInt(Get2DACache(sFile, "SpellID", i)); - if (nListSpellID == iSpellId) return TRUE; - } - return FALSE; -} - -////////////////////////////////////////////////// -/* Function Definitions */ -////////////////////////////////////////////////// - -int GetCasterLevelModifier(int nClass) -{ - switch(nClass) // do not change to return zero as this is used as a divisor - { - // add in new base half-caster classes here - case CLASS_TYPE_HEXBLADE: - case CLASS_TYPE_RANGER: - case CLASS_TYPE_PALADIN: - case CLASS_TYPE_ANTI_PALADIN: - return 2; - } - return 1; // normal progression -} - -int PRCGetCasterLevel(object oCaster = OBJECT_SELF) -{ - int nAdjust = GetLocalInt(oCaster, PRC_CASTERLEVEL_ADJUSTMENT);//this is for builder use - nAdjust += GetLocalInt(oCaster, "TrueCasterLens"); - nAdjust += GetHasSpellEffect(SPELL_VIRTUOSO_MAGICAL_MELODY, oCaster); - - // For when you want to assign the caster level. - int iReturnLevel = GetLocalInt(oCaster, PRC_CASTERLEVEL_OVERRIDE); - if (iReturnLevel) - { - if (DEBUG) DoDebug("PRCGetCasterLevel: found override caster level = "+IntToString(iReturnLevel)+" with adjustment = " + IntToString(nAdjust)+", original level = "+IntToString(GetCasterLevel(oCaster))); - return iReturnLevel+nAdjust; - } - - // if we made it here, iReturnLevel = 0; - - int iCastingClass = PRCGetLastSpellCastClass(oCaster); // might be CLASS_TYPE_INVALID - if(iCastingClass == CLASS_TYPE_SUBLIME_CHORD) - iCastingClass = GetPrimaryArcaneClass(oCaster); - int iSpellId = PRCGetSpellId(oCaster); - object oItem = PRCGetSpellCastItem(oCaster); - - // Item Spells - // this check is unreliable because of Bioware's implementation (GetSpellCastItem returns - // the last object from which a spell was cast, even if we are not casting from an item) - if(GetIsObjectValid(oItem)) - { - int nType = GetBaseItemType(oItem); - if(DEBUG) DoDebug("PRCGetCasterLevel: found valid item = "+GetName(oItem)); - // double check, just to make sure - if(GetItemPossessor(oItem) == oCaster) // likely item casting - { - if(GetPRCSwitch(PRC_STAFF_CASTER_LEVEL) - && ((nType == BASE_ITEM_MAGICSTAFF) || - (nType == BASE_ITEM_CRAFTED_STAFF)) - ) - { - iCastingClass = GetPrimarySpellcastingClass(oCaster); - } - else - { - //code for getting new ip type - itemproperty ipTest = GetFirstItemProperty(oItem); - while(GetIsItemPropertyValid(ipTest)) - { - if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_CAST_SPELL_CASTER_LEVEL) - { - int nSubType = GetItemPropertySubType(ipTest); - nSubType = StringToInt(Get2DACache("iprp_spells", "SpellIndex", nSubType)); - if(nSubType == iSpellId) - { - iReturnLevel = GetItemPropertyCostTableValue(ipTest); - if (DEBUG) DoDebug("PRCGetCasterLevel: caster level from item = "+IntToString(iReturnLevel)); - break; // exit the while loop - } - } - ipTest = GetNextItemProperty(oItem); - } - // if we didn't find a caster level on the item, it must be Bioware item casting - if(!iReturnLevel) - { - iReturnLevel = GetCasterLevel(oCaster); - if (DEBUG) DoDebug("PRCGetCasterLevel: bioware item casting with caster level = "+IntToString(iReturnLevel)); - } - } - - if(nType == BASE_ITEM_MAGICWAND || nType == BASE_ITEM_ENCHANTED_WAND) - { - if (DEBUG) DoDebug("PRCGetCasterLevel - Casting Item is a Wand at level "+IntToString(iReturnLevel)); - if (GetHasFeat(FEAT_RECKLESS_WAND_WIELDER, oCaster) && GetLocalInt(oCaster, "RecklessWand")) // This burns an extra charge to increase caster level by 2 - { - if (DEBUG) DoDebug("PRCGetCasterLevel - Reckless Wand Active"); - if (GetItemCharges(oItem) > 0) // Make sure we have an extra charge to burn - { - iReturnLevel += 2; - if (!GetLocalInt(oCaster, "RecklessWandDelay")) SetItemCharges(oItem, GetItemCharges(oItem)-1); - SetLocalInt(oCaster, "RecklessWandDelay", TRUE); - DelayCommand(0.5, DeleteLocalInt(oCaster, "RecklessWandDelay")); - if (DEBUG) DoDebug("PRCGetCasterLevel - Reckless Wand Triggered at level "+IntToString(iReturnLevel)); - } - } - if (GetHasFeat(FEAT_WAND_MASTERY, oCaster)) - iReturnLevel += 2; - } - } - if (DEBUG) DoDebug("PRCGetCasterLevel: total item casting caster level = "+IntToString(iReturnLevel)); - } - - // get spell school here as many of the following fns use it - int nSpellSchool = GetSpellSchool(iSpellId); - - // no item casting, and arcane caster? - if(!iReturnLevel && GetIsArcaneClass(iCastingClass, oCaster)) - { - iReturnLevel = GetLevelByClass(iCastingClass, oCaster) / GetCasterLevelModifier(iCastingClass); - - // Casting as a sorc but don't have any levels in the class - if(iCastingClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oCaster)) - { - int nRace = GetRacialType(oCaster); - - //if the player has sorcerer levels, then it counts as a prestige class - //otherwise use RHD instead of sorc levels - if(nRace == RACIAL_TYPE_RAKSHASA) - iReturnLevel = GetLevelByClass(CLASS_TYPE_OUTSIDER); - else if(nRace == RACIAL_TYPE_DRIDER) - iReturnLevel = GetLevelByClass(CLASS_TYPE_ABERRATION); - else if(nRace == RACIAL_TYPE_ARKAMOI) - iReturnLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS); - else if(nRace == RACIAL_TYPE_HOBGOBLIN_WARSOUL) - iReturnLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS); - else if(nRace == RACIAL_TYPE_REDSPAWN_ARCANISS) - iReturnLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS)*3/4; - else if(nRace == RACIAL_TYPE_MARRUTACT) - iReturnLevel = (GetLevelByClass(CLASS_TYPE_MONSTROUS)*6/7)-1; - else if(nRace == RACIAL_TYPE_ARANEA) - iReturnLevel = GetLevelByClass(CLASS_TYPE_SHAPECHANGER); - - } - // Casting as a bard but don't have any levels in the class - if(iCastingClass == CLASS_TYPE_BARD && !GetLevelByClass(CLASS_TYPE_BARD, oCaster)) - { - int nRace = GetRacialType(oCaster); - - //if the player has bard levels, then it counts as a prestige class - //otherwise use RHD instead of bard levels - if(nRace == RACIAL_TYPE_GLOURA) - iReturnLevel = GetLevelByClass(CLASS_TYPE_FEY); - } - - //Spell Rage ability - if(GetHasSpellEffect(SPELL_SPELL_RAGE, oCaster) - && (nSpellSchool == SPELL_SCHOOL_ABJURATION - || nSpellSchool == SPELL_SCHOOL_CONJURATION - || nSpellSchool == SPELL_SCHOOL_EVOCATION - || nSpellSchool == SPELL_SCHOOL_NECROMANCY - || nSpellSchool == SPELL_SCHOOL_TRANSMUTATION)) - { - iReturnLevel = GetHitDice(oCaster); - } - - else if(GetPrimaryArcaneClass(oCaster) == iCastingClass) - iReturnLevel += GetArcanePRCLevels(oCaster, iCastingClass); - else if(GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster)) - iReturnLevel += GetArcanePRCLevels(oCaster, iCastingClass); - - iReturnLevel += PracticedSpellcasting(oCaster, iCastingClass, iReturnLevel); - - iReturnLevel += TrueNecromancy(oCaster, iSpellId, "ARCANE", nSpellSchool) - + ShadowWeave(oCaster, iSpellId, nSpellSchool) - + FireAdept(oCaster, iSpellId) - + AirAdept(oCaster, iSpellId) - + WaterAdept(oCaster, iSpellId) - + ArchmageSpellPower(oCaster) - + StormMagic(oCaster) - + CormanthyranMoonMagic(oCaster) - + DomainPower(oCaster, iSpellId, nSpellSchool) - + DivinationPower(oCaster, nSpellSchool) - + DeathKnell(oCaster) - + DraconicPower(oCaster) - + DriftMagic(oCaster, iSpellId) - + Soulcaster(oCaster, iSpellId) - + TherapeuticMantle(oCaster, iSpellId) - + DarkSpeech(oCaster) - + ShieldDwarfWarder(oCaster) - + SongOfArcanePower(oCaster) - + ReserveFeatCL(oCaster, iSpellId); - - if (GetLocalInt(oCaster, "CaptureMagic")) - { - iReturnLevel += GetLocalInt(oCaster, "CaptureMagic"); - DeleteLocalInt(oCaster, "CaptureMagic"); - } - - // Get stance level bonus for Jade Phoenix Mage - if(GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster)) - { - if (_GetChangedElementalType(iSpellId, oCaster) == "Fire" && GetLocalInt(oCaster, "ToB_JPM_FireB")) - iReturnLevel += 3; - iReturnLevel += GetLocalInt(oCaster, "ToB_JPM_MystP"); - } - // Abjurant Champion uses its Base AB as Caster Level if higher - if(GetHasFeat(FEAT_MARTIAL_ARCANIST)) - { - //Get the caster's base AB - int nBaseAB = GetBaseAttackBonus(oCaster); - if(nBaseAB > iReturnLevel) - { - iReturnLevel = nBaseAB; - } - } - if (DEBUG) DoDebug("PRCGetCasterLevel: total arcane caster level = "+IntToString(iReturnLevel)); - } - - // no item casting and divine caster? - else if(!iReturnLevel && GetIsDivineClass(iCastingClass, oCaster)) - { - iReturnLevel = GetLevelByClass(iCastingClass, oCaster) / GetCasterLevelModifier(iCastingClass); - if(GetPrimaryDivineClass(oCaster) == iCastingClass) - iReturnLevel += GetDivinePRCLevels(oCaster, iCastingClass); - - iReturnLevel += PracticedSpellcasting(oCaster, iCastingClass, iReturnLevel); - - iReturnLevel += TrueNecromancy(oCaster, iSpellId, "DIVINE", nSpellSchool) - + ShadowWeave(oCaster, iSpellId, nSpellSchool) - + FireAdept(oCaster, iSpellId) - + StormMagic(oCaster) - + CormanthyranMoonMagic(oCaster) - + Nentyar(oCaster, iCastingClass) - + DomainPower(oCaster, iSpellId, nSpellSchool) - + DriftMagic(oCaster, iSpellId) - + AirAdept(oCaster, iSpellId) - + WaterAdept(oCaster, iSpellId) - + Soulcaster(oCaster, iSpellId) - + ShieldDwarfWarder(oCaster) - + DarkSpeech(oCaster) - + DeathKnell(oCaster) - + UrPriestCL(oCaster, iCastingClass) - + BlighterCL(oCaster, iCastingClass) - + ReserveFeatCL(oCaster, iSpellId); - - if (DEBUG) DoDebug("PRCGetCasterLevel: total divine caster level = "+IntToString(iReturnLevel)); - } - - //at this point it must be a SLA or similar - if(!iReturnLevel) - { - iReturnLevel = GetCasterLevel(oCaster); - if (DEBUG) DoDebug("PRCGetCasterLevel: bioware caster level = "+IntToString(iReturnLevel)); - } - - iReturnLevel -= GetLocalInt(oCaster, "WoLCasterPenalty"); - if (GetLocalInt(oCaster, "EldritchDisrupt")) - iReturnLevel -= 4; - if (GetLocalInt(oCaster, "EldritchVortex")) - iReturnLevel -= 4; - if (DEBUG) DoDebug("PRCGetCasterLevel: caster level pre adjust = "+IntToString(iReturnLevel)); - iReturnLevel += nAdjust; - if (DEBUG) DoDebug("PRCGetCasterLevel: total caster level = "+IntToString(iReturnLevel)); - - return iReturnLevel; -} - -int PRCGetLastSpellCastClass(object oCaster = OBJECT_SELF) -{ - // note that a barbarian has a class type constant of zero. So nClass == 0 could in principle mean - // that a barbarian cast the spell, However, barbarians cannot cast spells, so it doesn't really matter - // beware of Barbarians with UMD, though. Also watch out for spell like abilities - // might have to provide a fix for these (for instance: if(nClass == -1) nClass = 0; - int nClass = GetLocalInt(oCaster, PRC_CASTERCLASS_OVERRIDE); - if(nClass) - { - if(DEBUG) DoDebug("PRCGetLastSpellCastClass: found override caster class = "+IntToString(nClass)+", original class = "+IntToString(GetLastSpellCastClass())); - return nClass; - } - nClass = GetLastSpellCastClass(); - //if casting class is invalid and the spell was not cast form an item it was probably cast from the new spellbook - int NSB_Class = GetLocalInt(oCaster, "NSB_Class"); - if(nClass == CLASS_TYPE_INVALID && GetSpellCastItem() == OBJECT_INVALID && NSB_Class) - nClass = NSB_Class; - - if(DEBUG) DoDebug("PRCGetLastSpellCastClass: returning caster class = "+IntToString(nClass)+" NSB_Class = "+IntToString(NSB_Class)); - return nClass; -} - -int GetIsArcaneClass(int nClass, object oCaster = OBJECT_SELF) -{ - return nClass == CLASS_TYPE_ASSASSIN - || nClass == CLASS_TYPE_BARD - || nClass == CLASS_TYPE_BEGUILER - || nClass == CLASS_TYPE_CELEBRANT_SHARESS - || nClass == CLASS_TYPE_CULTIST_SHATTERED_PEAK - || nClass == CLASS_TYPE_DREAD_NECROMANCER - || nClass == CLASS_TYPE_DUSKBLADE - || nClass == CLASS_TYPE_HARPER - || nClass == CLASS_TYPE_HEXBLADE - || nClass == CLASS_TYPE_KNIGHT_WEAVE - || nClass == CLASS_TYPE_SHADOWLORD - || nClass == CLASS_TYPE_SORCERER - || nClass == CLASS_TYPE_SUBLIME_CHORD - || nClass == CLASS_TYPE_SUEL_ARCHANAMACH - || nClass == CLASS_TYPE_WARMAGE - || nClass == CLASS_TYPE_WIZARD - || (nClass == CLASS_TYPE_SHAPECHANGER - && GetRacialType(oCaster) == RACIAL_TYPE_ARANEA - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_OUTSIDER - && GetRacialType(oCaster) == RACIAL_TYPE_RAKSHASA - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_ABERRATION - && GetRacialType(oCaster) == RACIAL_TYPE_DRIDER - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oCaster) == RACIAL_TYPE_ARKAMOI - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oCaster) == RACIAL_TYPE_HOBGOBLIN_WARSOUL - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oCaster) == RACIAL_TYPE_REDSPAWN_ARCANISS - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_MONSTROUS - && GetRacialType(oCaster) == RACIAL_TYPE_MARRUTACT - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - || (nClass == CLASS_TYPE_FEY - && GetRacialType(oCaster) == RACIAL_TYPE_GLOURA - && !GetLevelByClass(CLASS_TYPE_BARD)); -} - -int GetIsDivineClass(int nClass, object oCaster = OBJECT_SELF) -{ - return nClass == CLASS_TYPE_ARCHIVIST - || nClass == CLASS_TYPE_BLACKGUARD - || nClass == CLASS_TYPE_BLIGHTER - || nClass == CLASS_TYPE_CLERIC - || nClass == CLASS_TYPE_DRUID - || nClass == CLASS_TYPE_FAVOURED_SOUL - || nClass == CLASS_TYPE_HEALER - || nClass == CLASS_TYPE_JUSTICEWW - || nClass == CLASS_TYPE_KNIGHT_CHALICE - || nClass == CLASS_TYPE_KNIGHT_MIDDLECIRCLE - || nClass == CLASS_TYPE_NENTYAR_HUNTER - || nClass == CLASS_TYPE_OCULAR - || nClass == CLASS_TYPE_PALADIN - || nClass == CLASS_TYPE_RANGER - || nClass == CLASS_TYPE_SHAMAN - || nClass == CLASS_TYPE_SLAYER_OF_DOMIEL - || nClass == CLASS_TYPE_SOHEI - || nClass == CLASS_TYPE_SOLDIER_OF_LIGHT - || nClass == CLASS_TYPE_UR_PRIEST - || nClass == CLASS_TYPE_VASSAL; -} - -int GetArcanePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID) -{ - int nArcane; - int nClass; - int nRace = GetRacialType(oCaster); - - if (nCastingClass == CLASS_TYPE_BARD || GetLevelByClass(CLASS_TYPE_BARD, oCaster)) - { - //:: Includes RHD as bard. If they started with bard levels, then it - //:: counts as a prestige class, otherwise RHD is used instead of bard levels. - if(nRace == RACIAL_TYPE_GLOURA) - nArcane += GetLevelByClass(CLASS_TYPE_FEY, oCaster); - - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - // if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_BARD, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - - // if(GetHasFeat(FEAT_FMM_SPELLCASTING_BARD, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - - // if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_BARD, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - - // if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_BARD, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - - // if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_BARD, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - //:: Special handling for Bard / Sublime Chord - if(GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_BARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - // if(GetHasFeat(FEAT_BONDED_SPELLCASTING_BARD, oCaster)) - // nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_BARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_BARD, oCaster)) - { - if (nClass) - { - nArcane += nClass - 3 + d6(); - } - } - } -//:: End Bard Arcane PrC casting calculations - - if(nCastingClass == CLASS_TYPE_BARD && nRace == RACIAL_TYPE_GLOURA && !GetLevelByClass(CLASS_TYPE_BARD, oCaster)) - { - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - // if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_FEY, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - - // if(GetHasFeat(FEAT_FMM_SPELLCASTING_FEY, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - // if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_FEY, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - - // if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_FEY, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - - // if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_FEY, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - - // if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_FEY, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - // if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_FEY, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_FEY, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - // if(GetHasFeat(FEAT_BONDED_SPELLCASTING_FEY, oCaster)) - // nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_FEY, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_FEY, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6(); } - } - } -//:: End Fey Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_ASSASSIN || GetLevelByClass(CLASS_TYPE_ASSASSIN, oCaster)) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_ASSASSIN, oCaster)) //:: Requires Assassin 4 - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - // if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - // if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - // if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster ); - - // if(GetHasFeat(FEAT_FMM_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - // if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - // if(GetHasFeat(FEAT_JPM_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - // if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - // if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_ASSASSIN, oCaster)) - // nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); */ - -/* if(GetHasFeat(FEAT_WWOC_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); */ - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_ASSASSIN, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_ASSASSIN, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) - nArcane += nClass - 3 + d6(); - } - } -//:: End Assassin Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_BEGUILER) - { - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_BEGUILER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_BEGUILER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_BEGUILER, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6(); } - } - } -//:: End Beguiler Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_CELEBRANT_SHARESS) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_BONDED_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - -/* if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); */ - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); */ - -/* if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); */ - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); */ - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BONDED_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - -/* if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_CELEBRANT_SHARESS, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6(); } - } - } -//:: End Celebrant of Sharess Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_CULTIST_SHATTERED_PEAK) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - -/* if(GetHasFeat(FEAT_DHEART_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); */ - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); */ - -/* if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); */ - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_CULTIST_PEAK, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_CULTIST_PEAK, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6();} - } - } -//:: End Cultist of the Shattered Peaks Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_DREAD_NECROMANCER) - { -/* if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION); */ - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - - if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); */ - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_DNECRO, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_DNECRO, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_DNECRO, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6(); } - } - } -//:: End Dread Necromancer Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_DUSKBLADE) - { - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - - if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_DUSKBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_DUSKBLADE, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6();} - } - } -//:: End Duskblade Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_HARPER) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_HARPER, oCaster)) //:: enter after 5th Harper Scout lvl - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - -/* if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); */ - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_HARPER, oCaster)) //:: enter after 5th Harper Scout lvl - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); */ - -/* if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); */ - -/* if(GetHasFeat(FEAT_WWOC_SPELLCASTING_HARPER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); */ - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - -/* if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_HARPER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_HARPER, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6();} - } - } -//:: End Harper Scout Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_HEXBLADE) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); */ - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); */ - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BONDED_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_HEXBLADE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_HEXBLADE, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6(); } - } - } -//:: End Hexblade Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_KNIGHT_WEAVE) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - -/* if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); */ - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - - if(GetHasFeat(FEAT_FMM_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - -/* if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); */ - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); */ - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - -/* if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_KNIGHT_WEAVE, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); } - if (nClass) { nArcane += nClass - 3 + d6(); } - } -//:: End Knight of the Weave Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER)) - { -//:: Includes RHD as sorcerer. If they already have sorcerer levels, then it -//:: counts as a prestige class, otherwise RHD is used instead of sorc levels. - if(nRace == RACIAL_TYPE_ARANEA) - nArcane += GetLevelByClass(CLASS_TYPE_SHAPECHANGER); - if(nRace == RACIAL_TYPE_RAKSHASA) - nArcane += GetLevelByClass(CLASS_TYPE_OUTSIDER); - if(nRace == RACIAL_TYPE_DRIDER) - nArcane += GetLevelByClass(CLASS_TYPE_ABERRATION); - if(nRace == RACIAL_TYPE_ARKAMOI) - nArcane += GetLevelByClass(CLASS_TYPE_MONSTROUS); - if(nRace == RACIAL_TYPE_HOBGOBLIN_WARSOUL) - nArcane += GetLevelByClass(CLASS_TYPE_MONSTROUS); - if(nRace == RACIAL_TYPE_REDSPAWN_ARCANISS) - nArcane += GetLevelByClass(CLASS_TYPE_MONSTROUS)*3/4; - if(nRace == RACIAL_TYPE_MARRUTACT) - nArcane += (GetLevelByClass(CLASS_TYPE_MONSTROUS)*6/7)-1; - - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - - if(GetHasFeat(FEAT_FMM_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - - if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BONDED_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_SORCERER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_SORCERER, oCaster)) - { int nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); } - if (nClass) { nArcane += nClass - 3 + d6(); } - } -//:: End Sorcerer Arcane PrC casting calculations - - - if(nCastingClass == CLASS_TYPE_SORCERER && nRace == RACIAL_TYPE_DRIDER - || nRace == RACIAL_TYPE_ARKAMOI - || nRace == RACIAL_TYPE_MARRUTACT - || nRace == RACIAL_TYPE_REDSPAWN_ARCANISS - || nRace == RACIAL_TYPE_HOBGOBLIN_WARSOUL - || nRace == RACIAL_TYPE_RAKSHASA - || nRace == RACIAL_TYPE_ARANEA - && !GetLevelByClass(CLASS_TYPE_SORCERER)) - { -//:: Adding PrC caster levels to the racial caster level. - - if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); - - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ALIENIST_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ALIENIST_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ALIENIST_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ANIMA_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ANIMA_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ANIMA_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_MHARPER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_MHARPER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_MHARPER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_CMANCER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_CMANCER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_CMANCER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_DHEART_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_DHEART_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_DHEART_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_DSONG_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_DSONG_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_DSONG_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - - if(GetHasFeat(FEAT_FMM_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_FMM_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_FMM_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_FMM_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_HARPERM_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_HARPERM_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_HARPERM_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_JPM_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_JPM_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_JPM_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_MONSTROUS, oCaster) //:: Shouldn't be possible - || GetHasFeat(FEAT_MAESTER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_MAESTER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_MAESTER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ALCHEM_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ALCHEM_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ALCHEM_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - - if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_TNECRO_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_TNECRO_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_TNECRO_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_SORCERER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_UNSEEN_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_UNSEEN_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_UNSEEN_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_WWOC_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_WWOC_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_WWOC_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_AOTS_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_AOTS_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_AOTS_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_MONSTROUS, oCaster) //:: Shouldn't be possible - || GetHasFeat(FEAT_BSINGER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_BSINGER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_BSINGER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_MONSTROUS, oCaster) //:: Shouldn't be possible - || GetHasFeat(FEAT_HATHRAN_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_HATHRAN_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_HATHRAN_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_HAVOC_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_HAVOC_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_HAVOC_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_SSWORD_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_SSWORD_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_SSWORD_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_GRAZZT_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_GRAZZT_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_GRAZZT_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_TIAMAT_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_TIAMAT_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_TIAMAT_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_WAYFARER_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_WAYFARER_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_WAYFARER_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_MONSTROUS, oCaster) //:: Shouldn't be possible - || GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_SHAPECHANGER, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_MONSTROUS, oCaster) - || GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_ABERRATION, oCaster) - || GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_OUTSIDER, oCaster) - || GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_SHAPECHANGER, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); } - if (nClass) { nArcane += nClass - 3 + d6(); } - } -//:: End Aberration / Monstrous / Outsider / Shapechanger Arcane PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_SUBLIME_CHORD) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - - if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_SUBLIME_CHORD, oCaster)) // no cantrips! - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); */ - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_SUBLIME_CHORD, oCaster)) //: No familiar! - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_SUBLIME_CHORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_SUBLIME_CHORD, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); } - if (nClass) { nArcane += nClass - 3 + d6(); } - } -//:: End SUBLIME_CHORD Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_SUEL_ARCHANAMACH) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); */ - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_SUEL_ARCHANAMACH, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); } - if (nClass) { nArcane += nClass - 3 + d6(); } - } -//:: End Suel Archanamach Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_SHADOWLORD) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_SHADOWLORD, oCaster)) //:: Enter after 4th lvl - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); */ - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - -/* if(GetHasFeat(FEAT_FMM_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - -/* if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); */ - -/* if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - -/* if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); */ - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BONDED_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_SHADOWLORD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_SHADOWLORD, oCaster)) - { - nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); - if (nClass) { nArcane += nClass - 3 + d6();} - } - } -//:: End Telflammar Shadowlord Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_WARMAGE) - { -/* if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster); */ - -/* if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); */ - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - - if(GetHasFeat(FEAT_DHEART_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - - if(GetHasFeat(FEAT_FMM_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - -/* if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); */ - -/* if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); */ - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BONDED_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; */ - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_WARMAGE, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_WARMAGE, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster); } - if (nClass) { nArcane += nClass - 3 + d6(); } - } -//:: End Warmage Arcane PrC casting calculations - - if (nCastingClass == CLASS_TYPE_WIZARD) - { - if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION); - - if(GetHasFeat(FEAT_ALIENIST_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ALIENIST, oCaster); - - if(GetHasFeat(FEAT_ANIMA_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oCaster); - - if(GetHasFeat(FEAT_ARCHMAGE_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCHMAGE, oCaster); - - if(GetHasFeat(FEAT_ARCTRICK_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ARCTRICK, oCaster); - - if(GetHasFeat(FEAT_MHARPER_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_HARPER, oCaster); - - if(GetHasFeat(FEAT_BLDMAGUS_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_BLOOD_MAGUS, oCaster); - - if(GetHasFeat(FEAT_CMANCER_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_CEREBREMANCER, oCaster); - - if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster); - -/* if(GetHasFeat(FEAT_DHEART_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster); */ - - if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster); - - if(GetHasFeat(FEAT_ETHEURGE_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_THEURGE, oCaster); - - if(GetHasFeat(FEAT_ELESAVANT_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster); - - if(GetHasFeat(FEAT_ENLIGHTENEDFIST_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCaster); - - if(GetHasFeat(FEAT_FMM_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FMM, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FROSTMAGE_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_FROST_MAGE, oCaster); - - if(GetHasFeat(FEAT_HARPERM_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_HARPERMAGE, oCaster); - - if(GetHasFeat(FEAT_JPM_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_JADE_PHOENIX_MAGE, oCaster); - - if(GetHasFeat(FEAT_MAGEKILLER_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAGEKILLER, oCaster); - - if(GetHasFeat(FEAT_MAESTER_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MAESTER, oCaster); - - if(GetHasFeat(FEAT_ALCHEM_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MASTER_ALCHEMIST, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_NOCTUMANCER_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_NOCTUMANCER, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster); - - if(GetHasFeat(FEAT_SPELLDANCER_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SPELLDANCER, oCaster); - - if(GetHasFeat(FEAT_SOULCASTER_SPELLCASTING_WARMAGE, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SOULCASTER, oCaster); - - if(GetHasFeat(FEAT_TNECRO_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - - if(GetHasFeat(FEAT_REDWIZ_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster); - - if(GetHasFeat(FEAT_SHADOWADEPT_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWLORD_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SHADOWLORD, oCaster); */ - -/* if(GetHasFeat(FEAT_SUBCHORD_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oCaster); */ - - if(GetHasFeat(FEAT_ULTMAGUS_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - - if(GetHasFeat(FEAT_UNSEEN_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - - if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster); - - if(GetHasFeat(FEAT_WWOC_SPELLCASTING_WIZARD, oCaster)) - nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster); - - if(GetHasFeat(FEAT_AOTS_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_ACOLYTE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_ASMODEUS_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BSINGER_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BLADESINGER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BONDED_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_BONDED_SUMMONNER, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_DSONG_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PALEMASTER_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_PALEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HAVOC_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_HAVOC_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SSWORD_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_SPELLSWORD, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_GRAZZT_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_THRALL_OF_GRAZZT_A, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_RAGEMAGE_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_RAGE_MAGE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WAYFARER_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_WAYFARER_GUIDE, oCaster) + 1) /2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_WIZARD, oCaster)) - nArcane += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - if(GetHasFeat(FEAT_WILDMAGE_SPELLCASTING_WIZARD, oCaster)) - { nClass = GetLevelByClass(CLASS_TYPE_WILD_MAGE, oCaster);} - if (nClass) { nArcane += nClass - 3 + d6(); } - } -//:: End Wizard Arcane PrC casting calculations - - return nArcane; -} - -int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID) -{ - int nDivine = 0; - - if (nCastingClass == CLASS_TYPE_ARCHIVIST) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_ARCHIVIST, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_ARCHIVIST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Archivist Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_BLACKGUARD) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_BLACKGUARD, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - -/* if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); */ - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - -/* if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - // if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_BLACKGUARD, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - -/* if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - -/* if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); */ - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); */ - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_BLACKGUARD, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Blackguard Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_BLIGHTER) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_BLIGHTER, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - -/* if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); */ - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - -/* if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); */ - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - -/* if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - -/* if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); */ - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); */ - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_OLLAM, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster + 1) / 2 */ - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_BLIGHTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Blighter Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_CLERIC) - { - - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_CLERIC, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_CLERIC, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_CLERIC, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Cleric Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_DRUID) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_DRUID, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - /* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); */ - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - // if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_DRUID, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - -/* if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - -/* if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); */ - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); */ - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - // if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_DRUID, oCaster)) - // nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_DRUID, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - -/* if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; */ - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_DRUID, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Druid Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_FAVOURED_SOUL) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_FAVOURED_SOUL, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - // if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_FAVOURED_SOUL, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_FAVOURED_SOUL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Favoured Soul Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_HEALER) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_HEALER, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); */ - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - // if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_HEALER, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); */ - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - // if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_HEALER, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_HEALER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); */ - -/* if(GetHasFeat(FEAT_BFZ_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_HEALER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Healer Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_JUSTICEWW) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_JUSTICEWW, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - // if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_JUSTICEWW, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - - // if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_JUSTICEWW, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - // if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_JUSTICEWW, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_JUSTICEWW, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Justice of Weald & Woe Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_KNIGHT_CHALICE) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); */ - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - // if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - -/* if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; */ - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; ; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_KNIGHT_CHALICE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Knight of the Chalice Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_KNIGHT_MIDDLECIRCLE) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); */ - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - // if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Knight of the Middle Circle Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_NENTYAR_HUNTER) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); */ - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); */ - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - // if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - // if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); */ - -/* if(GetHasFeat(FEAT_BFZ_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_NENTYAR_HUNTER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Nentyar Hunter Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_OCULAR) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_OCULAR, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - // if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_OCULAR, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - -/* if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); */ - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - -/* if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - -/* if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_OCULAR, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - // if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_OCULAR, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - -/* if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); */ - - // if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_OCULAR, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); */ - - // if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_OCULAR, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - // if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_OCULAR, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - // if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_OCULAR, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_OCULAR, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster + 1) / 2 */ - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - -/* if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_OLLAM, oCaster + 1) / 2 */ - -/* if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_OCULAR, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_OCULAR, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - } -//:: End Ocular Adept Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_PALADIN) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_PALADIN, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - // if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_PALADIN, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - // if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_PALADIN, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - -/* if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); */ - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_PALADIN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_PALADIN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_PALADIN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_PALADIN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_PALADIN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_PALADIN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_PALADIN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_PALADIN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Paladin Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_RANGER) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_RANGER, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); */ - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_RANGER, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_RANGER, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Ranger Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_SHAMAN) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_OASHAMAN, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); */ - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - - if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_OASHAMAN, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Shaman Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_SLAYER_OF_DOMIEL) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_DOMIEL, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); */ - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - // if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_DOMIEL, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_DOMIEL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_DOMIEL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_DOMIEL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_DOMIEL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_DOMIEL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_DOMIEL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_DOMIEL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_DOMIEL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Slayer of Domiel Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_SOHEI) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_SOHEI, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - - if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - -/* if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); */ - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - // if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_SOHEI, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - - // if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_SOHEI, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); - - if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - - // if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_SOHEI, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - -/* if(GetHasFeat(FEAT_RUBY_VINDICATOR_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUBY_VINDICATOR, oCaster); */ - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); */ - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_ORCUS, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_SOHEI, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_SOHEI, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Sohei Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_SOLDIER_OF_LIGHT) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_SOL, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); */ - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - // if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_SOL, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); */ - - if(GetHasFeat(FEAT_FOCHLUCAN_LYRIST_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FOCHLUCAN_LYRIST, oCaster); - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - -/* if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_SOL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - -/* if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); */ - -/* if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster);*/ - - /*if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_SOL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_SOL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_OLLAM, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_SOL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_SOL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_SOL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Soldier of Light Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_UR_PRIEST) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_UR_PRIEST, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); */ - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - - if(GetHasFeat(FEAT_ELDISCIPLE_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ELDRITCH_DISCIPLE, oCaster); - -/* if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); */ - -/* if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - - if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); */ - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); - - if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - -/* if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); */ - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - -/* if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); */ - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - - if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_KORD_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_OLLAM, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster + 1) / 2 - - if(GetHasFeat(FEAT_TIAMAT_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_TALON_OF_TIAMAT, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_UR_PRIEST, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; - - } -//:: End Ur-Priest Divine PrC casting calculations - - - if (nCastingClass == CLASS_TYPE_VASSAL) - { - if (!GetHasFeat(FEAT_SF_CODE, oCaster) && GetHasFeat(FEAT_SACREDFIST_SPELLCASTING_VASSAL, oCaster)) - { - nDivine += GetLevelByClass(CLASS_TYPE_SACREDFIST, oCaster); - } - -/* if(GetHasFeat(FEAT_BLIGHTLORD_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BLIGHTLORD, oCaster); - - if(GetHasFeat(FEAT_COMBAT_MEDIC_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_COMBAT_MEDIC, oCaster); */ - - if(GetHasFeat(FEAT_CONTEMPLATIVE_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oCaster); - -/* if(GetHasFeat(FEAT_FORESTMASTER_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_FORESTMASTER, oCaster); */ - - // if(GetHasFeat(FEAT_FISTRAZIEL_SPELLCASTING_VASSAL, oCaster)) - // nDivine += GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oCaster); - -/* if(GetHasFeat(FEAT_HEARTWARDER_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HEARTWARDER, oCaster); - - if(GetHasFeat(FEAT_HIEROPHANT_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */ - - if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster); - -/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */ - -/* if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster); */ - - if(GetHasFeat(FEAT_MYSTIC_THEURGE_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MYSTIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_OOZEMASTER_SPELLCASTING_VASSAL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OOZEMASTER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_PSYCHIC_THEURGE_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_PSYCHIC_THEURGE, oCaster); - - if(GetHasFeat(FEAT_RUNECASTER_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster); - - if(GetHasFeat(FEAT_SACREDPURIFIER_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SACREDPURIFIER, oCaster); - - if(GetHasFeat(FEAT_SAPPHIRE_HIERARCH_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oCaster); - - if(GetHasFeat(FEAT_SHADOWBANE_STALKER_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER,oCaster); - -/* if(GetHasFeat(FEAT_STORMLORD_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_STORMLORD, oCaster); */ - - if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster); - -/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); - - if(GetHasFeat(FEAT_BFZ_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_VASSAL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2; - - if(GetHasFeat(FEAT_HATHRAN_SPELLCASTING_VASSAL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_HATHRAN, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_KORD_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_MIGHTY_CONTENDER_KORD, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_OLLAM_SPELLCASTING_VASSAL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_OLLAM, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_ORCUS_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_ORCUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_SHINING_BLADE_SPELLCASTING_VASSAL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_SHINING_BLADE, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_TEMPUS_SPELLCASTING_VASSAL, oCaster)) - nDivine += GetLevelByClass(CLASS_TYPE_TEMPUS, oCaster + 1) / 2 */ - - if(GetHasFeat(FEAT_WARPRIEST_SPELLCASTING_VASSAL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_WARPRIEST, oCaster) + 1) / 2; - -/* if(GetHasFeat(FEAT_JUDICATOR_SPELLCASTING_VASSAL, oCaster)) - nDivine += (GetLevelByClass(CLASS_TYPE_JUDICATOR, oCaster) + 1) / 3; */ - - } -//:: End Vassal of Bahamut Divine PrC casting calculations - - return nDivine; -} - -int GetFirstArcaneClassPosition(object oCaster = OBJECT_SELF) -{ - int i; - for(i = 1; i <= 8; i++) - { - if(GetIsArcaneClass(GetClassByPosition(i, oCaster), oCaster)) - return i; - } - - return 0; -} - -int GetFirstDivineClassPosition(object oCaster = OBJECT_SELF) -{ - int i; - for(i = 1; i <= 8; i++) - { - if(GetIsDivineClass(GetClassByPosition(i, oCaster), oCaster)) - return i; - } - - return 0; -} - -int GetPrimaryArcaneClass(object oCaster = OBJECT_SELF) -{ - int nClass; - - if(GetPRCSwitch(PRC_CASTERLEVEL_FIRST_CLASS_RULE)) - { - int iArcanePos = GetFirstArcaneClassPosition(oCaster); - if (!iArcanePos) return CLASS_TYPE_INVALID; // no arcane casting class - - nClass = GetClassByPosition(iArcanePos, oCaster); - } - else - { - int i, nClassTmp, nClassLvl; - for(i = 1; i <= 8; i++) - { - nClassTmp = GetClassByPosition(i, oCaster); - if(GetIsArcaneClass(nClassTmp, oCaster) && nClassTmp != CLASS_TYPE_SUBLIME_CHORD) - { - if(GetLevelByClass(nClassTmp, oCaster) > nClassLvl) - { - nClass = nClassTmp; - nClassLvl = GetLevelByClass(nClass, oCaster); - } - } - } - if(!nClassLvl) - return CLASS_TYPE_INVALID; - } - - //raks, Arkamoi, driders and dragons cast as sorcs - if(nClass == CLASS_TYPE_OUTSIDER - || nClass == CLASS_TYPE_SHAPECHANGER - || nClass == CLASS_TYPE_ABERRATION - || nClass == CLASS_TYPE_DRAGON - || nClass == CLASS_TYPE_MONSTROUS) - nClass = CLASS_TYPE_SORCERER; - - if(nClass == CLASS_TYPE_FEY) - nClass = CLASS_TYPE_BARD; - - return nClass; -} - -int GetPrimaryDivineClass(object oCaster = OBJECT_SELF) -{ - int nClass; - - if(GetPRCSwitch(PRC_CASTERLEVEL_FIRST_CLASS_RULE)) - { - int iDivinePos = GetFirstDivineClassPosition(oCaster); - if (!iDivinePos) return CLASS_TYPE_INVALID; // no Divine casting class - - nClass = GetClassByPosition(iDivinePos, oCaster); - } - else - { - int i, nClassTmp, nClassLvl; - for(i = 1; i <= 8; i++) - { - nClassTmp = GetClassByPosition(i, oCaster); - if(GetIsDivineClass(nClassTmp, oCaster)) - { - if(GetLevelByClass(nClassTmp, oCaster) > nClassLvl) - { - nClass = nClassTmp; - nClassLvl = GetLevelByClass(nClass, oCaster); - } - } - } - if(!nClassLvl) - return CLASS_TYPE_INVALID; - } - - return nClass; -} - -int GetPrimarySpellcastingClass(object oCaster = OBJECT_SELF) -{ - int bFirst = GetPRCSwitch(PRC_CASTERLEVEL_FIRST_CLASS_RULE); - int nClass; - - int i, nClassTmp, nClassLvl; - for(i = 1; i <= 8; i++) - { - nClassTmp = GetClassByPosition(i, oCaster); - if(GetIsArcaneClass(nClassTmp, oCaster) - || GetIsDivineClass(nClassTmp, oCaster) - && nClassTmp != CLASS_TYPE_SUBLIME_CHORD) - { - if(bFirst) - { - return nClass; - } - else if(GetLevelByClass(nClassTmp, oCaster) > nClassLvl) - { - nClass = nClassTmp; - nClassLvl = GetLevelByClass(nClass, oCaster); - } - } - } - if(!nClassLvl) - return CLASS_TYPE_INVALID; - - return nClass; -} - -int PracticedSpellcasting(object oCaster, int iCastingClass, int iCastingLevels) -{ - int nFeat; - int iAdjustment = GetHitDice(oCaster) - iCastingLevels; - if (iAdjustment > 4) iAdjustment = 4; - if (iAdjustment < 0) iAdjustment = 0; - - switch(iCastingClass) - { - case CLASS_TYPE_BARD: nFeat = FEAT_PRACTICED_SPELLCASTER_BARD; break; - case CLASS_TYPE_SORCERER: nFeat = FEAT_PRACTICED_SPELLCASTER_SORCERER; break; - case CLASS_TYPE_WIZARD: nFeat = FEAT_PRACTICED_SPELLCASTER_WIZARD; break; - case CLASS_TYPE_CLERIC: nFeat = FEAT_PRACTICED_SPELLCASTER_CLERIC; break; - case CLASS_TYPE_DRUID: nFeat = FEAT_PRACTICED_SPELLCASTER_DRUID; break; - case CLASS_TYPE_PALADIN: nFeat = FEAT_PRACTICED_SPELLCASTER_PALADIN; break; - case CLASS_TYPE_RANGER: nFeat = FEAT_PRACTICED_SPELLCASTER_RANGER; break; - case CLASS_TYPE_ASSASSIN: nFeat = FEAT_PRACTICED_SPELLCASTER_ASSASSIN; break; - case CLASS_TYPE_BLACKGUARD: nFeat = FEAT_PRACTICED_SPELLCASTER_BLACKGUARD; break; - case CLASS_TYPE_KNIGHT_WEAVE: nFeat = FEAT_PRACTICED_SPELLCASTER_KOTW; break; - case CLASS_TYPE_OCULAR: nFeat = FEAT_PRACTICED_SPELLCASTER_OCULAR; break; - case CLASS_TYPE_HEXBLADE: nFeat = FEAT_PRACTICED_SPELLCASTER_HEXBLADE; break; - case CLASS_TYPE_DUSKBLADE: nFeat = FEAT_PRACTICED_SPELLCASTER_DUSKBLADE; break; - case CLASS_TYPE_HEALER: nFeat = FEAT_PRACTICED_SPELLCASTER_HEALER; break; - case CLASS_TYPE_KNIGHT_CHALICE: nFeat = FEAT_PRACTICED_SPELLCASTER_KNIGHT_CHALICE; break; - case CLASS_TYPE_NENTYAR_HUNTER: nFeat = FEAT_PRACTICED_SPELLCASTER_NENTYAR; break; - case CLASS_TYPE_VASSAL: nFeat = FEAT_PRACTICED_SPELLCASTER_VASSAL; break; - case CLASS_TYPE_UR_PRIEST: nFeat = FEAT_PRACTICED_SPELLCASTER_UR_PRIEST; break; - case CLASS_TYPE_SOLDIER_OF_LIGHT: nFeat = FEAT_PRACTICED_SPELLCASTER_SOLDIER_OF_LIGHT; break; - case CLASS_TYPE_SHADOWLORD: nFeat = FEAT_PRACTICED_SPELLCASTER_SHADOWLORD; break; - case CLASS_TYPE_JUSTICEWW: nFeat = FEAT_PRACTICED_SPELLCASTER_JUSTICEWW; break; - case CLASS_TYPE_KNIGHT_MIDDLECIRCLE: nFeat = FEAT_PRACTICED_SPELLCASTER_KNIGHT_MIDDLECIRCLE; break; - case CLASS_TYPE_SHAMAN: nFeat = FEAT_PRACTICED_SPELLCASTER_SHAMAN; break; - case CLASS_TYPE_SLAYER_OF_DOMIEL: nFeat = FEAT_PRACTICED_SPELLCASTER_SLAYER_OF_DOMIEL; break; - case CLASS_TYPE_SUEL_ARCHANAMACH: nFeat = FEAT_PRACTICED_SPELLCASTER_SUEL_ARCHANAMACH; break; - case CLASS_TYPE_FAVOURED_SOUL: nFeat = FEAT_PRACTICED_SPELLCASTER_FAVOURED_SOUL; break; - case CLASS_TYPE_SOHEI: nFeat = FEAT_PRACTICED_SPELLCASTER_SOHEI; break; - case CLASS_TYPE_CELEBRANT_SHARESS: nFeat = FEAT_PRACTICED_SPELLCASTER_CELEBRANT_SHARESS; break; - case CLASS_TYPE_WARMAGE: nFeat = FEAT_PRACTICED_SPELLCASTER_WARMAGE; break; - case CLASS_TYPE_DREAD_NECROMANCER: nFeat = FEAT_PRACTICED_SPELLCASTER_DREAD_NECROMANCER; break; - case CLASS_TYPE_CULTIST_SHATTERED_PEAK: nFeat = FEAT_PRACTICED_SPELLCASTER_CULTIST; break; - case CLASS_TYPE_ARCHIVIST: nFeat = FEAT_PRACTICED_SPELLCASTER_ARCHIVIST; break; - case CLASS_TYPE_BEGUILER: nFeat = FEAT_PRACTICED_SPELLCASTER_BEGUILER; break; - case CLASS_TYPE_BLIGHTER: nFeat = FEAT_PRACTICED_SPELLCASTER_BLIGHTER; break; - case CLASS_TYPE_HARPER: nFeat = FEAT_PRACTICED_SPELLCASTER_HARPER; break; - default: return 0; - } - - if(GetHasFeat(nFeat, oCaster)) - return iAdjustment; - - return 0; -} - -int GetSpellSchool(int iSpellId) -{ - string sSpellSchool = Get2DACache("spells", "School", iSpellId);//lookup_spell_school(iSpellId); - - if (sSpellSchool == "A") return SPELL_SCHOOL_ABJURATION; - else if (sSpellSchool == "C") return SPELL_SCHOOL_CONJURATION; - else if (sSpellSchool == "D") return SPELL_SCHOOL_DIVINATION; - else if (sSpellSchool == "E") return SPELL_SCHOOL_ENCHANTMENT; - else if (sSpellSchool == "V") return SPELL_SCHOOL_EVOCATION; - else if (sSpellSchool == "I") return SPELL_SCHOOL_ILLUSION; - else if (sSpellSchool == "N") return SPELL_SCHOOL_NECROMANCY; - else if (sSpellSchool == "T") return SPELL_SCHOOL_TRANSMUTATION; - else return SPELL_SCHOOL_GENERAL; - - return -1; -} - -/*int GetIsHealingSpell(int nSpellId) -{ - if ( nSpellId == SPELL_CURE_CRITICAL_WOUNDS - || nSpellId == SPELL_CURE_LIGHT_WOUNDS - || nSpellId == SPELL_CURE_MINOR_WOUNDS - || nSpellId == SPELL_CURE_MODERATE_WOUNDS - || nSpellId == SPELL_CURE_SERIOUS_WOUNDS - || nSpellId == SPELL_GREATER_RESTORATION - || nSpellId == SPELL_HEAL - || nSpellId == SPELL_HEALING_CIRCLE - || nSpellId == SPELL_MASS_HEAL - || nSpellId == SPELL_MONSTROUS_REGENERATION - || nSpellId == SPELL_REGENERATE - //End of stock NWN spells - || nSpellId == SPELL_MASS_CURE_LIGHT - || nSpellId == SPELL_MASS_CURE_MODERATE - || nSpellId == SPELL_MASS_CURE_SERIOUS - || nSpellId == SPELL_MASS_CURE_CRITICAL - || nSpellId == SPELL_PANACEA - ) - return TRUE; - - return FALSE; -}*/ - -int ArchmageSpellPower(object oCaster) -{ - if(GetHasFeat(FEAT_SPELL_POWER_V, oCaster)) - return 5; - if(GetHasFeat(FEAT_SPELL_POWER_IV, oCaster)) - return 4; - if(GetHasFeat(FEAT_SPELL_POWER_III, oCaster)) - return 3; - if(GetHasFeat(FEAT_SPELL_POWER_II, oCaster)) - return 2; - if(GetHasFeat(FEAT_SPELL_POWER_I, oCaster)) - return 1; - - return 0; -} - -int ShadowWeave(object oCaster, int iSpellID, int nSpellSchool = -1) -{ - if(!GetHasFeat(FEAT_SHADOWWEAVE,oCaster)) - return 0; - - if (nSpellSchool == -1) - nSpellSchool = GetSpellSchool(iSpellID); - - // Bonus for spells of Enhancement, Necromancy and Illusion schools and spells with Darkness descriptor - if(nSpellSchool == SPELL_SCHOOL_ENCHANTMENT - || nSpellSchool == SPELL_SCHOOL_NECROMANCY - || nSpellSchool == SPELL_SCHOOL_ILLUSION - || GetHasDescriptor(iSpellID, DESCRIPTOR_DARKNESS)) - { - return 1; - } - // Penalty to spells of Evocation and Transmutation schools, except for those with Darkness descriptor - else if(nSpellSchool == SPELL_SCHOOL_EVOCATION - || nSpellSchool == SPELL_SCHOOL_TRANSMUTATION) - { - return -1; - } - - return 0; -} - -int AirAdept(object oCaster, int iSpellID) -{ - if(!GetHasDescriptor(iSpellID, DESCRIPTOR_AIR)) - return 0; - - int nBoost = 0; - - if(GetHasFeat(FEAT_AIR_MEPHLING, oCaster)) - nBoost += 1; - - return nBoost; -} - -int WaterAdept(object oCaster, int iSpellID) -{ - if(!GetHasDescriptor(iSpellID, DESCRIPTOR_WATER)) - return 0; - - int nBoost = 0; - - if(GetHasFeat(FEAT_WATER_MEPHLING, oCaster)) - nBoost += 1; - - return nBoost; -} - -int FireAdept(object oCaster, int iSpellID) -{ - if(!GetHasDescriptor(iSpellID, DESCRIPTOR_FIRE)) - return 0; - - int nBoost = 0; - - if(GetHasFeat(FEAT_FIRE_ADEPT, oCaster)) - nBoost += 1; - - if(GetHasFeat(FEAT_FIRE_MEPHLING, oCaster)) - nBoost += 1; - - if(GetHasFeat(FEAT_BLOODLINE_OF_FIRE, oCaster)) - nBoost += 2; - - if(GetRacialType(oCaster) == RACIAL_TYPE_REDSPAWN_ARCANISS) - nBoost += 2; - - return nBoost; -} - -int DriftMagic(object oCaster, int iSpellID) -{ - if(!GetHasDescriptor(iSpellID, DESCRIPTOR_EARTH)) - return 0; - - int nBoost = 0; - - if(GetHasFeat(FEAT_DRIFT_MAGIC, oCaster)) - nBoost += 1; - - if(GetHasFeat(FEAT_EARTH_MEPHLING, oCaster)) - nBoost += 1; - - return nBoost; -} -/*int DriftMagic(object oCaster, int iSpellID) -{ - if(GetHasDescriptor(iSpellID, DESCRIPTOR_EARTH) && GetHasFeat(FEAT_DRIFT_MAGIC, oCaster)) - return 1; - - else if(GetHasDescriptor(iSpellID, DESCRIPTOR_EARTH) && GetHasFeat(FEAT_EARTH_MEPHLING, oCaster)) - return 1; - - return 0; -}*/ - -int Soulcaster(object oCaster, int iSpellID) -{ - if(GetLocalInt(oCaster, "SpellEssentia"+IntToString(iSpellID))) - { - int nReturn = GetLocalInt(oCaster, "SpellEssentia"+IntToString(iSpellID)); - DelayCommand(1.0, DeleteLocalInt(oCaster, "SpellEssentia"+IntToString(iSpellID))); - return nReturn; - } - - return 0; -} - -int StormMagic(object oCaster) -{ - if(!GetHasFeat(FEAT_STORMMAGIC, oCaster) && !GetHasFeat(FEAT_FROZEN_MAGIC, oCaster)) return 0; - - int nBoost = 0; - - int nWeather = GetWeather(GetArea(oCaster)); - if(nWeather == WEATHER_RAIN && GetHasFeat(FEAT_STORMMAGIC, oCaster)) - nBoost += 1; - if(nWeather == WEATHER_SNOW && GetHasFeat(FEAT_STORMMAGIC, oCaster)) - nBoost += 1; - if(nWeather == WEATHER_SNOW && GetHasFeat(FEAT_FROZEN_MAGIC, oCaster)) - nBoost += 2; - if (GetLocalInt(GetArea(oCaster),"FrozenMagic") && GetHasFeat(FEAT_FROZEN_MAGIC, oCaster) && nWeather != WEATHER_SNOW) - nBoost += 2; - - return nBoost; -} - -int DivinationPower(object oCaster, int nSpellSchool) -{ - int nClass = GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster); - if(!nClass) return 0; - - int nBoost = (nClass + 2) / 3; - - if (nSpellSchool != SPELL_SCHOOL_DIVINATION) - nBoost *= -1; // Negative if it's not a divination spell - - return nBoost; -} - -int CormanthyranMoonMagic(object oCaster) -{ - if (!GetHasFeat(FEAT_CORMANTHYRAN_MOON_MAGIC, oCaster)) return 0; - - object oArea = GetArea(oCaster); - - // The moon must be visible. Thus, outdoors, at night, with no rain. - if (GetWeather(oArea) != WEATHER_RAIN && GetWeather(oArea) != WEATHER_SNOW && - GetIsNight() && !GetIsAreaInterior(oArea)) - { - return 2; - } - return 0; -} - -int Nentyar(object oCaster, int nCastingClass) -{ - if (nCastingClass == CLASS_TYPE_NENTYAR_HUNTER) - { - int nBonus = GetLevelByClass(CLASS_TYPE_DRUID, oCaster) + GetLevelByClass(CLASS_TYPE_CLERIC, oCaster) + GetLevelByClass(CLASS_TYPE_RANGER, oCaster)/2; - return nBonus; - } - return 0; -} - -int ShieldDwarfWarder(object oCaster) -{ - if (!GetHasFeat(FEAT_SHIELD_DWARF_WARDER, oCaster)) return 0; - - object oTarget = PRCGetSpellTargetObject(); - // If it's an item that grants an AC bonus - int nBase = GetBaseItemType(oTarget); - if (nBase == BASE_ITEM_SMALLSHIELD || nBase == BASE_ITEM_LARGESHIELD || nBase == BASE_ITEM_TOWERSHIELD || nBase == BASE_ITEM_ARMOR) - return 1; - - return 0; -} - -int DarkSpeech(object oCaster) -{ - if (GetHasSpellEffect(SPELL_DARK_SPEECH_POWER, oCaster)) - { - ExecuteScript("prc_dark_power", oCaster); - return 1; - } - return 0; -} - -int DomainPower(object oCaster, int nSpellID, int nSpellSchool = -1) -{ - int nBonus = 0; - if (nSpellSchool == -1) - nSpellSchool = GetSpellSchool(nSpellID); - - // Boosts Caster level with the Illusion school by 1 - if (nSpellSchool == SPELL_SCHOOL_ILLUSION && GetHasFeat(FEAT_DOMAIN_POWER_GNOME, oCaster)) - nBonus += 1; - - // Boosts Caster level with the Illusion school by 1 - if (nSpellSchool == SPELL_SCHOOL_ILLUSION && GetHasFeat(FEAT_DOMAIN_POWER_ILLUSION, oCaster)) - nBonus += 1; - - // Boosts Caster level with healing spells - if (GetIsOfSubschool(nSpellID, SUBSCHOOL_HEALING) && GetHasFeat(FEAT_HEALING_DOMAIN_POWER, oCaster)) - nBonus += 1; - - // Boosts Caster level with the Divination school by 1 - if (nSpellSchool == SPELL_SCHOOL_DIVINATION && GetHasFeat(FEAT_KNOWLEDGE_DOMAIN_POWER, oCaster)) - nBonus += 1; - - // Boosts Caster level with evil spells by 1 - if (GetHasDescriptor(nSpellID, DESCRIPTOR_EVIL) && GetHasFeat(FEAT_EVIL_DOMAIN_POWER, oCaster)) - nBonus += 1; - - // Boosts Caster level with good spells by 1 - if (GetHasDescriptor(nSpellID, DESCRIPTOR_GOOD) && GetHasFeat(FEAT_GOOD_DOMAIN_POWER, oCaster)) - nBonus += 1; - - return nBonus; -} - -int TherapeuticMantle(object oCaster, int nSpellID) -{ - int nReturn; - // Boosts Caster level with healing spells - if (GetIsMeldBound(oCaster, MELD_THERAPEUTIC_MANTLE) == CHAKRA_SHOULDERS && GetIsOfSubschool(nSpellID, SUBSCHOOL_HEALING)) - nReturn = GetEssentiaInvested(oCaster, MELD_THERAPEUTIC_MANTLE); - - return nReturn; -} - -int DeathKnell(object oCaster) -{ - // If you do have the spell effect, return a +1 bonus to caster level - return GetHasSpellEffect(SPELL_DEATH_KNELL, oCaster); -} - -int DraconicPower(object oCaster = OBJECT_SELF) -{ - return GetHasFeat(FEAT_DRACONIC_POWER, oCaster); -} - -int SongOfArcanePower(object oCaster = OBJECT_SELF) -{ - int nBonus = GetLocalInt(oCaster, "SongOfArcanePower"); - DeleteLocalInt(oCaster, "SongOfArcanePower"); - - int nLevel = GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCaster); - nBonus += (nLevel + 2)/3; - - if(nBonus) - return nBonus; - - return 0; -} - -int TrueNecromancy(object oCaster, int iSpellID, string sType, int nSpellSchool = -1) -{ - int iTNLevel = GetLevelByClass(CLASS_TYPE_TRUENECRO, oCaster); - if (!iTNLevel) - return 0; - if (nSpellSchool == -1) - nSpellSchool = GetSpellSchool(iSpellID); - if (nSpellSchool != SPELL_SCHOOL_NECROMANCY) - return 0; - - if (sType == "ARCANE") - return GetLevelByTypeDivine(oCaster); // TN and arcane levels already added. - - if (sType == "DIVINE") - return GetLevelByTypeArcane(oCaster); - - return 0; -} - -int UrPriestCL(object oCaster, int nCastingClass) -{ - // Add 1/2 levels in all other casting classes except cleric - if (nCastingClass == CLASS_TYPE_UR_PRIEST) - { - int nTotal = 0; - int iFirstDivine = GetPrimaryDivineClass(oCaster); - int iBest = 0; - int iClass1 = GetClassByPosition(1, oCaster); - int iClass2 = GetClassByPosition(2, oCaster); - int iClass3 = GetClassByPosition(3, oCaster); - int iClass4 = GetClassByPosition(4, oCaster); - int iClass5 = GetClassByPosition(5, oCaster); - int iClass6 = GetClassByPosition(6, oCaster); - int iClass7 = GetClassByPosition(7, oCaster); - int iClass8 = GetClassByPosition(8, oCaster); - - int iClass1Lev = GetLevelByPosition(1, oCaster); - int iClass2Lev = GetLevelByPosition(2, oCaster); - int iClass3Lev = GetLevelByPosition(3, oCaster); - int iClass4Lev = GetLevelByPosition(4, oCaster); - int iClass5Lev = GetLevelByPosition(5, oCaster); - int iClass6Lev = GetLevelByPosition(6, oCaster); - int iClass7Lev = GetLevelByPosition(7, oCaster); - int iClass8Lev = GetLevelByPosition(8, oCaster); - - /*if (iClass1 == CLASS_TYPE_PALADIN || iClass1 == CLASS_TYPE_RANGER) iClass1Lev = (iClass1Lev >= 4) ? (iClass1Lev / 2) : 0; - if (iClass2 == CLASS_TYPE_PALADIN || iClass2 == CLASS_TYPE_RANGER) iClass2Lev = (iClass2Lev >= 4) ? (iClass2Lev / 2) : 0; - if (iClass3 == CLASS_TYPE_PALADIN || iClass3 == CLASS_TYPE_RANGER) iClass3Lev = (iClass3Lev >= 4) ? (iClass3Lev / 2) : 0; - - if (iClass1 == iFirstDivine) iClass1Lev += GetDivinePRCLevels(oCaster); - if (iClass2 == iFirstDivine) iClass2Lev += GetDivinePRCLevels(oCaster); - if (iClass3 == iFirstDivine) iClass3Lev += GetDivinePRCLevels(oCaster); - - iClass1Lev += PracticedSpellcasting(oCaster, iClass1, iClass1Lev); - iClass2Lev += PracticedSpellcasting(oCaster, iClass2, iClass2Lev); - iClass3Lev += PracticedSpellcasting(oCaster, iClass3, iClass3Lev); - - if (!GetIsDivineClass(iClass1, oCaster) || iClass1 == CLASS_TYPE_UR_PRIEST) iClass1Lev = 0; - if (!GetIsDivineClass(iClass2, oCaster) || iClass2 == CLASS_TYPE_UR_PRIEST) iClass2Lev = 0; - if (!GetIsDivineClass(iClass3, oCaster) || iClass3 == CLASS_TYPE_UR_PRIEST) iClass3Lev = 0; - - nTotal += iClass1Lev + iClass2Lev + iClass3Lev; - if (DEBUG) DoDebug("UrPriestCL Divine - iClass1Lev "+IntToString(iClass1Lev)+" iClass2Lev "+IntToString(iClass2Lev)+" iClass3Lev "+IntToString(iClass3Lev));*/ - - int iFirstArcane = GetPrimaryArcaneClass(oCaster); - iClass1 = GetClassByPosition(1, oCaster); - iClass2 = GetClassByPosition(2, oCaster); - iClass3 = GetClassByPosition(3, oCaster); - iClass4 = GetClassByPosition(4, oCaster); - iClass5 = GetClassByPosition(5, oCaster); - iClass6 = GetClassByPosition(6, oCaster); - iClass7 = GetClassByPosition(7, oCaster); - iClass8 = GetClassByPosition(8, oCaster); - - iClass1Lev = GetLevelByPosition(1, oCaster); - iClass2Lev = GetLevelByPosition(2, oCaster); - iClass3Lev = GetLevelByPosition(3, oCaster); - iClass4Lev = GetLevelByPosition(4, oCaster); - iClass5Lev = GetLevelByPosition(5, oCaster); - iClass6Lev = GetLevelByPosition(6, oCaster); - iClass7Lev = GetLevelByPosition(7, oCaster); - iClass8Lev = GetLevelByPosition(8, oCaster); - - if (iClass1 == CLASS_TYPE_HEXBLADE) iClass1Lev = (iClass1Lev >= 4) ? (iClass1Lev / 2) : 0; - if (iClass2 == CLASS_TYPE_HEXBLADE) iClass2Lev = (iClass2Lev >= 4) ? (iClass2Lev / 2) : 0; - if (iClass3 == CLASS_TYPE_HEXBLADE) iClass3Lev = (iClass3Lev >= 4) ? (iClass3Lev / 2) : 0; - if (iClass4 == CLASS_TYPE_HEXBLADE) iClass4Lev = (iClass4Lev >= 4) ? (iClass4Lev / 2) : 0; - if (iClass5 == CLASS_TYPE_HEXBLADE) iClass5Lev = (iClass5Lev >= 4) ? (iClass5Lev / 2) : 0; - if (iClass6 == CLASS_TYPE_HEXBLADE) iClass6Lev = (iClass6Lev >= 4) ? (iClass6Lev / 2) : 0; - if (iClass7 == CLASS_TYPE_HEXBLADE) iClass7Lev = (iClass7Lev >= 4) ? (iClass7Lev / 2) : 0; - if (iClass8 == CLASS_TYPE_HEXBLADE) iClass8Lev = (iClass8Lev >= 4) ? (iClass8Lev / 2) : 0; - - if (iClass1 == iFirstArcane) iClass1Lev += GetArcanePRCLevels(oCaster, iClass1); - if (iClass2 == iFirstArcane) iClass2Lev += GetArcanePRCLevels(oCaster, iClass2); - if (iClass3 == iFirstArcane) iClass3Lev += GetArcanePRCLevels(oCaster, iClass3); - if (iClass4 == iFirstArcane) iClass4Lev += GetArcanePRCLevels(oCaster, iClass4); - if (iClass5 == iFirstArcane) iClass5Lev += GetArcanePRCLevels(oCaster, iClass5); - if (iClass6 == iFirstArcane) iClass6Lev += GetArcanePRCLevels(oCaster, iClass6); - if (iClass7 == iFirstArcane) iClass7Lev += GetArcanePRCLevels(oCaster, iClass7); - if (iClass8 == iFirstArcane) iClass8Lev += GetArcanePRCLevels(oCaster, iClass8); - - iClass1Lev += PracticedSpellcasting(oCaster, iClass1, iClass1Lev); - iClass2Lev += PracticedSpellcasting(oCaster, iClass2, iClass2Lev); - iClass3Lev += PracticedSpellcasting(oCaster, iClass3, iClass3Lev); - iClass4Lev += PracticedSpellcasting(oCaster, iClass4, iClass4Lev); - iClass5Lev += PracticedSpellcasting(oCaster, iClass5, iClass5Lev); - iClass6Lev += PracticedSpellcasting(oCaster, iClass6, iClass5Lev); - iClass7Lev += PracticedSpellcasting(oCaster, iClass7, iClass6Lev); - iClass8Lev += PracticedSpellcasting(oCaster, iClass8, iClass7Lev); - - if (!GetIsArcaneClass(iClass1, oCaster)) iClass1Lev = 0; - if (!GetIsArcaneClass(iClass2, oCaster)) iClass2Lev = 0; - if (!GetIsArcaneClass(iClass3, oCaster)) iClass3Lev = 0; - if (!GetIsArcaneClass(iClass4, oCaster)) iClass4Lev = 0; - if (!GetIsArcaneClass(iClass5, oCaster)) iClass5Lev = 0; - if (!GetIsArcaneClass(iClass6, oCaster)) iClass6Lev = 0; - if (!GetIsArcaneClass(iClass7, oCaster)) iClass7Lev = 0; - if (!GetIsArcaneClass(iClass8, oCaster)) iClass8Lev = 0; - - - nTotal += iClass1Lev + iClass2Lev + iClass3Lev + iClass4Lev + iClass5Lev + iClass6Lev + iClass7Lev + iClass8Lev; - - if (DEBUG) DoDebug("UrPriestCL Arcane - iClass1Lev "+IntToString(iClass1Lev)+" iClass2Lev " - +IntToString(iClass2Lev)+" iClass3Lev " - +IntToString(iClass3Lev)+" iClass4Lev " - +IntToString(iClass4Lev)+" iClass5Lev " - +IntToString(iClass5Lev)+" iClass6Lev " - +IntToString(iClass6Lev)+" iClass7Lev " - +IntToString(iClass7Lev)+" iClass8Lev " - +IntToString(iClass8Lev)); - - if (DEBUG) DoDebug("UrPriestCL Total - nTotal "+IntToString(nTotal)); - return nTotal/2; - } - return 0; -} - -int BlighterCL(object oCaster, int nCastingClass) -{ - if (nCastingClass == CLASS_TYPE_BLIGHTER) - { - int nBonus = GetLevelByClass(CLASS_TYPE_DRUID, oCaster); - return nBonus; - } - return 0; -} - -int ReserveFeatCL(object oCaster, int iSpellId) -{ - int nSpellSchool = GetSpellSchool(iSpellId); - int nCLBonus = 0; - - if (GetLocalInt(oCaster, "ReserveFeatsRunning") == TRUE) - { - if (GetHasDescriptor(iSpellId, DESCRIPTOR_ACID) && GetHasFeat(FEAT_ACIDIC_SPLATTER, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_FIRE) && GetHasFeat(FEAT_FIERY_BURST, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_COLD) && GetHasFeat(FEAT_WINTERS_BLAST, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_ELECTRICITY) && GetHasFeat(FEAT_STORM_BOLT, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_SONIC) && GetHasFeat(FEAT_CLAP_OF_THUNDER, oCaster)) nCLBonus += 1; - if (GetIsOfSubschool(iSpellId, SUBSCHOOL_HEALING) && GetHasFeat(FEAT_TOUCH_OF_HEALING, oCaster)) nCLBonus += 1; - if (GetIsOfSubschool(iSpellId, SUBSCHOOL_TELEPORTATION) && GetHasFeat(FEAT_DIMENSIONAL_JAUNT, oCaster)) nCLBonus += 1; - if (nSpellSchool == SPELL_SCHOOL_ABJURATION && GetHasFeat(FEAT_MYSTIC_BACKLASH, oCaster)) nCLBonus += 1; - if (nSpellSchool == SPELL_SCHOOL_NECROMANCY && GetHasFeat(FEAT_SICKENING_GRASP, oCaster)) nCLBonus += 1; - if (GetIsFromDomain(iSpellId, "wardom") && GetHasFeat(FEAT_HOLY_WARRIOR, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_EARTH) && GetHasFeat(FEAT_CLUTCH_OF_EARTH, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_AIR) && GetHasFeat(FEAT_BORNE_ALOFT, oCaster)) nCLBonus += 1; - if ((nSpellSchool == SPELL_SCHOOL_ABJURATION) && GetHasFeat(FEAT_PROTECTIVE_WARD, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_DARKNESS) && GetHasFeat(FEAT_SHADOW_VEIL, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_LIGHT) && GetHasFeat(FEAT_SUNLIGHT_EYES, oCaster)) nCLBonus += 1; - if ((nSpellSchool == SPELL_SCHOOL_ENCHANTMENT) && GetHasFeat(FEAT_TOUCH_OF_DISTRACTION, oCaster)) nCLBonus += 1; - if (GetIsFromDomain(iSpellId, "dethdom") && GetHasFeat(FEAT_CHARNEL_MIASMA, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_WATER) && GetHasFeat(FEAT_DROWNING_GLANCE, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_FORCE) && GetHasFeat(FEAT_INVISIBLE_NEEDLE, oCaster)) nCLBonus += 1; - if (GetIsOfSubschool(iSpellId, SUBSCHOOL_SUMMONING) && GetHasFeat(FEAT_SUMMON_ELEMENTAL, oCaster)) nCLBonus += 1; - if (GetIsOfSubschool(iSpellId, SUBSCHOOL_SUMMONING) && GetHasFeat(FEAT_DIMENSIONAL_REACH, oCaster)) nCLBonus += 1; - if (GetHasDescriptor(iSpellId, DESCRIPTOR_AIR) && GetHasFeat(FEAT_HURRICANE_BREATH, oCaster)) nCLBonus += 1; - if (GetIsOfSubschool(iSpellId, SUBSCHOOL_POLYMORPH) && GetHasFeat(FEAT_MINOR_SHAPESHIFT, oCaster)) nCLBonus += 1; - if (GetIsOfSubschool(iSpellId, SUBSCHOOL_GLAMER) && GetHasFeat(FEAT_FACECHANGER, oCaster)) nCLBonus += 1; - return nCLBonus; - } - else return 0; -} - -int GetLevelByTypeArcane(object oCaster = OBJECT_SELF) -{ - int iFirstArcane = GetPrimaryArcaneClass(oCaster); - int iBest = 0; - int iClass1 = GetClassByPosition(1, oCaster); - int iClass2 = GetClassByPosition(2, oCaster); - int iClass3 = GetClassByPosition(3, oCaster); - int iClass4 = GetClassByPosition(4, oCaster); - int iClass5 = GetClassByPosition(5, oCaster); - int iClass6 = GetClassByPosition(6, oCaster); - int iClass7 = GetClassByPosition(7, oCaster); - int iClass8 = GetClassByPosition(8, oCaster); - - int iClass1Lev = GetLevelByPosition(1, oCaster); - int iClass2Lev = GetLevelByPosition(2, oCaster); - int iClass3Lev = GetLevelByPosition(3, oCaster); - int iClass4Lev = GetLevelByPosition(4, oCaster); - int iClass5Lev = GetLevelByPosition(5, oCaster); - int iClass6Lev = GetLevelByPosition(6, oCaster); - int iClass7Lev = GetLevelByPosition(7, oCaster); - int iClass8Lev = GetLevelByPosition(8, oCaster); - - if (iClass1 == CLASS_TYPE_HEXBLADE) iClass1Lev = (iClass1Lev >= 4) ? (iClass1Lev / 2) : 0; - if (iClass2 == CLASS_TYPE_HEXBLADE) iClass2Lev = (iClass2Lev >= 4) ? (iClass2Lev / 2) : 0; - if (iClass3 == CLASS_TYPE_HEXBLADE) iClass3Lev = (iClass3Lev >= 4) ? (iClass3Lev / 2) : 0; - if (iClass4 == CLASS_TYPE_HEXBLADE) iClass4Lev = (iClass4Lev >= 4) ? (iClass4Lev / 2) : 0; - if (iClass5 == CLASS_TYPE_HEXBLADE) iClass5Lev = (iClass5Lev >= 4) ? (iClass5Lev / 2) : 0; - if (iClass6 == CLASS_TYPE_HEXBLADE) iClass6Lev = (iClass6Lev >= 4) ? (iClass6Lev / 2) : 0; - if (iClass7 == CLASS_TYPE_HEXBLADE) iClass7Lev = (iClass7Lev >= 4) ? (iClass7Lev / 2) : 0; - if (iClass8 == CLASS_TYPE_HEXBLADE) iClass8Lev = (iClass8Lev >= 4) ? (iClass8Lev / 2) : 0; - - if (iClass1 == iFirstArcane) iClass1Lev += GetArcanePRCLevels(oCaster, iClass1); - if (iClass2 == iFirstArcane) iClass2Lev += GetArcanePRCLevels(oCaster, iClass2); - if (iClass3 == iFirstArcane) iClass3Lev += GetArcanePRCLevels(oCaster, iClass3); - if (iClass4 == iFirstArcane) iClass4Lev += GetArcanePRCLevels(oCaster, iClass4); - if (iClass5 == iFirstArcane) iClass5Lev += GetArcanePRCLevels(oCaster, iClass5); - if (iClass6 == iFirstArcane) iClass6Lev += GetArcanePRCLevels(oCaster, iClass6); - if (iClass7 == iFirstArcane) iClass7Lev += GetArcanePRCLevels(oCaster, iClass7); - if (iClass8 == iFirstArcane) iClass8Lev += GetArcanePRCLevels(oCaster, iClass8); - - iClass1Lev += PracticedSpellcasting(oCaster, iClass1, iClass1Lev); - iClass2Lev += PracticedSpellcasting(oCaster, iClass2, iClass2Lev); - iClass3Lev += PracticedSpellcasting(oCaster, iClass3, iClass3Lev); - iClass4Lev += PracticedSpellcasting(oCaster, iClass4, iClass4Lev); - iClass5Lev += PracticedSpellcasting(oCaster, iClass5, iClass5Lev); - iClass6Lev += PracticedSpellcasting(oCaster, iClass6, iClass6Lev); - iClass7Lev += PracticedSpellcasting(oCaster, iClass7, iClass7Lev); - iClass8Lev += PracticedSpellcasting(oCaster, iClass8, iClass8Lev); - - if (!GetIsArcaneClass(iClass1, oCaster)) iClass1Lev = 0; - if (!GetIsArcaneClass(iClass2, oCaster)) iClass2Lev = 0; - if (!GetIsArcaneClass(iClass3, oCaster)) iClass3Lev = 0; - if (!GetIsArcaneClass(iClass4, oCaster)) iClass4Lev = 0; - if (!GetIsArcaneClass(iClass5, oCaster)) iClass5Lev = 0; - if (!GetIsArcaneClass(iClass6, oCaster)) iClass6Lev = 0; - if (!GetIsArcaneClass(iClass7, oCaster)) iClass7Lev = 0; - if (!GetIsArcaneClass(iClass8, oCaster)) iClass8Lev = 0; - - if (iClass1Lev > iBest) iBest = iClass1Lev; - if (iClass2Lev > iBest) iBest = iClass2Lev; - if (iClass3Lev > iBest) iBest = iClass3Lev; - if (iClass4Lev > iBest) iBest = iClass4Lev; - if (iClass5Lev > iBest) iBest = iClass5Lev; - if (iClass6Lev > iBest) iBest = iClass6Lev; - if (iClass7Lev > iBest) iBest = iClass7Lev; - if (iClass8Lev > iBest) iBest = iClass8Lev; - - return iBest; -} - -int GetLevelByTypeDivine(object oCaster = OBJECT_SELF) -{ - int iFirstDivine = GetPrimaryDivineClass(oCaster); - int iBest = 0; - int iClass1 = GetClassByPosition(1, oCaster); - int iClass2 = GetClassByPosition(2, oCaster); - int iClass3 = GetClassByPosition(3, oCaster); - int iClass4 = GetClassByPosition(4, oCaster); - int iClass5 = GetClassByPosition(5, oCaster); - int iClass6 = GetClassByPosition(6, oCaster); - int iClass7 = GetClassByPosition(7, oCaster); - int iClass8 = GetClassByPosition(8, oCaster); - - int iClass1Lev = GetLevelByPosition(1, oCaster); - int iClass2Lev = GetLevelByPosition(2, oCaster); - int iClass3Lev = GetLevelByPosition(3, oCaster); - int iClass4Lev = GetLevelByPosition(4, oCaster); - int iClass5Lev = GetLevelByPosition(5, oCaster); - int iClass6Lev = GetLevelByPosition(6, oCaster); - int iClass7Lev = GetLevelByPosition(7, oCaster); - int iClass8Lev = GetLevelByPosition(8, oCaster); - - if (iClass1 == CLASS_TYPE_PALADIN || iClass1 == CLASS_TYPE_RANGER) iClass1Lev = (iClass1Lev >= 4) ? (iClass1Lev / 2) : 0; - if (iClass2 == CLASS_TYPE_PALADIN || iClass2 == CLASS_TYPE_RANGER) iClass2Lev = (iClass2Lev >= 4) ? (iClass2Lev / 2) : 0; - if (iClass3 == CLASS_TYPE_PALADIN || iClass3 == CLASS_TYPE_RANGER) iClass3Lev = (iClass3Lev >= 4) ? (iClass3Lev / 2) : 0; - if (iClass4 == CLASS_TYPE_PALADIN || iClass4 == CLASS_TYPE_RANGER) iClass4Lev = (iClass4Lev >= 4) ? (iClass4Lev / 2) : 0; - if (iClass5 == CLASS_TYPE_PALADIN || iClass5 == CLASS_TYPE_RANGER) iClass5Lev = (iClass5Lev >= 4) ? (iClass5Lev / 2) : 0; - if (iClass6 == CLASS_TYPE_PALADIN || iClass6 == CLASS_TYPE_RANGER) iClass6Lev = (iClass6Lev >= 4) ? (iClass6Lev / 2) : 0; - if (iClass7 == CLASS_TYPE_PALADIN || iClass7 == CLASS_TYPE_RANGER) iClass7Lev = (iClass7Lev >= 4) ? (iClass7Lev / 2) : 0; - if (iClass8 == CLASS_TYPE_PALADIN || iClass8 == CLASS_TYPE_RANGER) iClass8Lev = (iClass8Lev >= 4) ? (iClass8Lev / 2) : 0; - - if (iClass1 == iFirstDivine) iClass1Lev += GetDivinePRCLevels(oCaster, iClass1); - if (iClass2 == iFirstDivine) iClass2Lev += GetDivinePRCLevels(oCaster, iClass2); - if (iClass3 == iFirstDivine) iClass3Lev += GetDivinePRCLevels(oCaster, iClass3); - if (iClass4 == iFirstDivine) iClass4Lev += GetDivinePRCLevels(oCaster, iClass4); - if (iClass5 == iFirstDivine) iClass5Lev += GetDivinePRCLevels(oCaster, iClass5); - if (iClass6 == iFirstDivine) iClass6Lev += GetDivinePRCLevels(oCaster, iClass6); - if (iClass7 == iFirstDivine) iClass7Lev += GetDivinePRCLevels(oCaster, iClass7); - if (iClass8 == iFirstDivine) iClass8Lev += GetDivinePRCLevels(oCaster, iClass8); - - iClass1Lev += PracticedSpellcasting(oCaster, iClass1, iClass1Lev); - iClass2Lev += PracticedSpellcasting(oCaster, iClass2, iClass2Lev); - iClass3Lev += PracticedSpellcasting(oCaster, iClass3, iClass3Lev); - iClass4Lev += PracticedSpellcasting(oCaster, iClass4, iClass4Lev); - iClass5Lev += PracticedSpellcasting(oCaster, iClass5, iClass5Lev); - iClass6Lev += PracticedSpellcasting(oCaster, iClass6, iClass6Lev); - iClass7Lev += PracticedSpellcasting(oCaster, iClass7, iClass7Lev); - iClass8Lev += PracticedSpellcasting(oCaster, iClass8, iClass8Lev); - - if (!GetIsDivineClass(iClass1, oCaster)) iClass1Lev = 0; - if (!GetIsDivineClass(iClass2, oCaster)) iClass2Lev = 0; - if (!GetIsDivineClass(iClass3, oCaster)) iClass3Lev = 0; - if (!GetIsDivineClass(iClass4, oCaster)) iClass4Lev = 0; - if (!GetIsDivineClass(iClass5, oCaster)) iClass5Lev = 0; - if (!GetIsDivineClass(iClass6, oCaster)) iClass6Lev = 0; - if (!GetIsDivineClass(iClass7, oCaster)) iClass7Lev = 0; - if (!GetIsDivineClass(iClass8, oCaster)) iClass8Lev = 0; - - if (iClass1Lev > iBest) iBest = iClass1Lev; - if (iClass2Lev > iBest) iBest = iClass2Lev; - if (iClass3Lev > iBest) iBest = iClass3Lev; - if (iClass4Lev > iBest) iBest = iClass4Lev; - if (iClass5Lev > iBest) iBest = iClass5Lev; - if (iClass6Lev > iBest) iBest = iClass6Lev; - if (iClass7Lev > iBest) iBest = iClass7Lev; - if (iClass8Lev > iBest) iBest = iClass8Lev; - - return iBest; -} - -//:: Test Void -//:: void main (){} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_chatscript.nss b/nwn/nwnprc/trunk/users/jaysyn/hp_pa_chatscript.nss deleted file mode 100644 index ed4b1751..00000000 --- a/nwn/nwnprc/trunk/users/jaysyn/hp_pa_chatscript.nss +++ /dev/null @@ -1,63 +0,0 @@ -//:://///////////////////////////////////////////// -//:: Power Attack NUI -//:: hp_pa_chatscript -//::////////////////////////////////////////////// -/* - A OnChat script that parses what is said and opens the power attack NUI - if provided /pa. Otherwise if /pa x is provided run the command directly -*/ -//::////////////////////////////////////////////// -//:: Created By: Rakiov -//:: Created On: 22.05.2005 -//::////////////////////////////////////////////// - -#include "nw_inc_nui" -#include "hp_pa_view" -#include "hp_string_util" - -void main() -{ - // Get current player - object oPlayer = GetPCChatSpeaker(); - if (!GetIsPC(oPlayer)) - { - return; - } - - // get current player message and split it up into a list - string sCommand = GetPCChatMessage(); - json sCommandSplit = StringSplit(sCommand); - - if(JsonGetLength(sCommandSplit) > 0) - { - string firstWord = JsonGetString(JsonArrayGet(sCommandSplit, 0)); - - // if first word is /pa we are using the power attack interface - if(firstWord == "/pa") - { - if(JsonGetLength(sCommandSplit) >= 2) - { - //if a parameter is given then run the power attack command directly. - string param1 = JsonGetString(JsonArrayGet(sCommandSplit, 1)); - int paAmount = StringToInt(param1); - SetLocalInt(oPlayer, "PRC_PowerAttack_Level", paAmount); - ExecuteScript("hp_pa_script", oPlayer); - - // update the NUI so it is in sync - int nToken = NuiFindWindow(oPlayer, NUI_PRC_POWER_ATTACK_WINDOW); - if (nToken != 0) - { - NuiSetBind(oPlayer, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(paAmount))); - } - } - else - { - // if no param is given then open the NUI - NuiPRCPowerAttackView(oPlayer); - } - - // clear message from chat - SetPCChatMessage(); - } - } -} \ No newline at end of file