diff --git a/nwn/nwnprc/trunk/include/inc_newspellbook.nss b/nwn/nwnprc/trunk/include/inc_newspellbook.nss index db5568eb..93ff3f19 100644 --- a/nwn/nwnprc/trunk/include/inc_newspellbook.nss +++ b/nwn/nwnprc/trunk/include/inc_newspellbook.nss @@ -329,40 +329,132 @@ string GetFileForClass(int nClass) } int GetSpellslotLevel(int nClass, object oPC) +{ + int nBaseLevel = GetLevelByClass(nClass, oPC); + + // Custom racial casting + int nRacialLevel = 0; + int nRace = GetRacialType(oPC); + + if (nClass == CLASS_TYPE_SORCERER) + { + if(nRace == RACIAL_TYPE_RAKSHASA) + nRacialLevel = GetLevelByClass(CLASS_TYPE_OUTSIDER, oPC); + else if(nRace == RACIAL_TYPE_ARKAMOI) + nRacialLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); + else if(nRace == RACIAL_TYPE_DRIDER) + nRacialLevel = GetLevelByClass(CLASS_TYPE_ABERRATION, oPC); + else if(nRace == RACIAL_TYPE_REDSPAWN_ARCANISS) + nRacialLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC) * 3 / 4; + else if(nRace == RACIAL_TYPE_MARRUTACT) + nRacialLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC) * 6 / 7; + else if(nRace == RACIAL_TYPE_HOBGOBLIN_WARSOUL) + nRacialLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); + else if(nRace == RACIAL_TYPE_ARANEA) + nRacialLevel = GetLevelByClass(CLASS_TYPE_SHAPECHANGER, oPC); + } + else if (nClass == CLASS_TYPE_BARD && nRace == RACIAL_TYPE_GLOURA) + { + nRacialLevel = GetLevelByClass(CLASS_TYPE_FEY, oPC); + } + + // Add base and racial class levels + int nLevel = nBaseLevel + nRacialLevel; + + // Spellcasting PRC progression + int nArcSpellslotLevel = 0; + int nDivSpellslotLevel = 0; + int i; + for(i = 1; i <= 8; i++) + { + int nTempClass = GetClassByPosition(i, oPC); + int nArcSpellMod = StringToInt(Get2DACache("classes", "ArcSpellLvlMod", nTempClass)); + int nDivSpellMod = StringToInt(Get2DACache("classes", "DivSpellLvlMod", nTempClass)); + + if(nArcSpellMod > 0) + nArcSpellslotLevel += (GetLevelByClass(nTempClass, oPC) + (nArcSpellMod - 1)) / nArcSpellMod; + + if(nDivSpellMod > 0) + nDivSpellslotLevel += (GetLevelByClass(nTempClass, oPC) + (nDivSpellMod - 1)) / nDivSpellMod; + } + + // Add PRC spellcasting progression + if(GetPrimaryArcaneClass(oPC) == nClass) + nLevel += nArcSpellslotLevel; + if(GetPrimaryDivineClass(oPC) == nClass) + nLevel += nDivSpellslotLevel; + + // Ultimate Magus override (only include Sorcerer + UM) + if (nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oPC)) + { + nLevel = GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oPC) + GetLevelByClass(CLASS_TYPE_SORCERER, oPC); + } + + if(DEBUG) DoDebug("GetSpellslotLevel(" + IntToString(nClass) + ", " + GetName(oPC) + ") = " + IntToString(nLevel)); + return nLevel; +} + +/* int GetSpellslotLevel(int nClass, object oPC) { int nLevel = GetLevelByClass(nClass, oPC); //:: Rakshasa cast as sorcerers if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA) nLevel = GetLevelByClass(CLASS_TYPE_OUTSIDER, oPC); + + if(nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA) + nLevel = GetLevelByClass(CLASS_TYPE_OUTSIDER, oPC) + GetLevelByClass(CLASS_TYPE_SORCERER, oPC); //:: Arkamoi cast as sorcerers else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI) nLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); + + if(nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI) + nLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC) + GetLevelByClass(CLASS_TYPE_SORCERER, oPC); //:: Driders cast as sorcerers else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_DRIDER) nLevel = GetLevelByClass(CLASS_TYPE_ABERRATION, oPC); + if(nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_DRIDER) + nLevel = GetLevelByClass(CLASS_TYPE_ABERRATION, oPC) + GetLevelByClass(CLASS_TYPE_SORCERER, 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 = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC)*3/4; - + + else if(nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS) + nLevel = GetLevelByClass(CLASS_TYPE_SORCERER, oPC) + (GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC)*3/4); + //:: Marrutact cast as 6/7 sorcerers else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT) nLevel = GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC)*6/7; + else if(nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT) + nLevel = GetLevelByClass(CLASS_TYPE_SORCERER, oPC) + (GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC)*6/7); + //:: Hobgoblin Warsouls cast as sorcerers else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL) nLevel = 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 = GetLevelByClass(CLASS_TYPE_FEY, oPC); - + else if(nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL) + nLevel = GetLevelByClass(CLASS_TYPE_SORCERER, oPC) + GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC); + //:: Aranea cast as sorcerers else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARANEA) - nLevel = GetLevelByClass(CLASS_TYPE_SHAPECHANGER, oPC); + nLevel = GetLevelByClass(CLASS_TYPE_SHAPECHANGER, oPC); + + else if(nClass == CLASS_TYPE_SORCERER && GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARANEA) + nLevel = GetLevelByClass(CLASS_TYPE_SHAPECHANGER, oPC) + GetLevelByClass(CLASS_TYPE_SORCERER, oPC); + +//:: Gloura cast as bards + else if(nClass == CLASS_TYPE_BARD && !GetLevelByClass(CLASS_TYPE_BARD, oPC) && GetRacialType(oPC) == RACIAL_TYPE_GLOURA) + nLevel = GetLevelByClass(CLASS_TYPE_FEY, oPC); + + else if(nClass == CLASS_TYPE_BARD && GetLevelByClass(CLASS_TYPE_BARD, oPC) && GetRacialType(oPC) == RACIAL_TYPE_GLOURA) + { + nLevel = GetLevelByClass(CLASS_TYPE_FEY, oPC) + GetLevelByClass(CLASS_TYPE_BARD, oPC); + } int nArcSpellslotLevel; int nDivSpellslotLevel; @@ -373,9 +465,9 @@ int GetSpellslotLevel(int nClass, object oPC) //spellcasting prc int nArcSpellMod = StringToInt(Get2DACache("classes", "ArcSpellLvlMod", nTempClass)); int nDivSpellMod = StringToInt(Get2DACache("classes", "DivSpellLvlMod", nTempClass)); - /*//special case for combat medic class - if(nTempClass == CLASS_TYPE_COMBAT_MEDIC && (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_WITCH)) - nArcSpellMod = 1;*/ + //special case for combat medic class + //if(nTempClass == CLASS_TYPE_COMBAT_MEDIC && (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_WITCH)) + // nArcSpellMod = 1; if(nArcSpellMod == 1) nArcSpellslotLevel += GetLevelByClass(nTempClass, oPC); @@ -399,6 +491,7 @@ int GetSpellslotLevel(int nClass, object oPC) if(DEBUG) DoDebug("GetSpellslotLevel(" + IntToString(nClass) + ", " + GetName(oPC) + ") = " + IntToString(nLevel)); return nLevel; } + */ int GetItemBonusSlotCount(object oPC, int nClass, int nSpellLevel) { diff --git a/nwn/nwnprc/trunk/include/prc_inc_castlvl.nss b/nwn/nwnprc/trunk/include/prc_inc_castlvl.nss index 95a7c5aa..2828cd4d 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_castlvl.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_castlvl.nss @@ -5936,7 +5936,7 @@ int GetFirstDivineClassPosition(object oCaster = OBJECT_SELF) int GetPrimaryArcaneClass(object oCaster = OBJECT_SELF) { - int nClass; + int nClass = CLASS_TYPE_INVALID; if(GetPRCSwitch(PRC_CASTERLEVEL_FIRST_CLASS_RULE)) { @@ -5947,7 +5947,9 @@ int GetPrimaryArcaneClass(object oCaster = OBJECT_SELF) } else { - int i, nClassTmp, nClassLvl; + int nClassLvl = 0; + + int i, nClassTmp; for(i = 1; i <= 8; i++) { nClassTmp = GetClassByPosition(i, oCaster); @@ -5972,15 +5974,17 @@ int GetPrimaryArcaneClass(object oCaster = OBJECT_SELF) || nClass == CLASS_TYPE_MONSTROUS) nClass = CLASS_TYPE_SORCERER; - if(nClass == CLASS_TYPE_FEY) - nClass = CLASS_TYPE_BARD; - + if(nClass == CLASS_TYPE_FEY && GetRacialType(oCaster) == RACIAL_TYPE_GLOURA) + { + nClass = CLASS_TYPE_BARD; + } + return nClass; } int GetPrimaryDivineClass(object oCaster = OBJECT_SELF) { - int nClass; + int nClass = CLASS_TYPE_INVALID; if(GetPRCSwitch(PRC_CASTERLEVEL_FIRST_CLASS_RULE)) { diff --git a/nwn/nwnprc/trunk/newspellbook/moi_mld_drgnmntl.nss b/nwn/nwnprc/trunk/newspellbook/moi_mld_drgnmntl.nss index afce32c3..3b19b67c 100644 --- a/nwn/nwnprc/trunk/newspellbook/moi_mld_drgnmntl.nss +++ b/nwn/nwnprc/trunk/newspellbook/moi_mld_drgnmntl.nss @@ -31,6 +31,9 @@ Chakra Bind (Totem) Long, draconic wings sprout from the shoulders of your blue dragonhide plate armor. You gain +4 on Jump checks for every point of essentia invested in your dragon mantle. + + Fixed by: Jaysyn + Fixed on: 2025-05-20 15:27:50 */ #include "moi_inc_moifunc" @@ -39,37 +42,73 @@ void DragonMantleHeal(object oMeldshaper); void DragonMantleHeal(object oMeldshaper) { - if (GetHasSpellEffect(MELD_DRAGON_MANTLE, oMeldshaper) && GetIsMeldBound(oMeldshaper, MELD_DRAGON_MANTLE) == CHAKRA_HEART) - { int nCurHP = GetCurrentHitPoints(oMeldshaper); int nMaxHP = GetMaxHitPoints(oMeldshaper); // Is the HP total lower than half? if ((nMaxHP/2) > nCurHP) { - if (!GetIsResting(oMeldshaper)) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetEssentiaInvested(oMeldshaper, MELD_DRAGON_MANTLE)), oMeldshaper); + if (!GetIsResting(oMeldshaper)) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetEssentiaInvested(oMeldshaper, MELD_DRAGON_MANTLE)), oMeldshaper); + } + else + { + RemoveEventScript(oMeldshaper, EVENT_ONHEARTBEAT, "moi_mld_drgnmntl", TRUE, FALSE); + } } - DelayCommand(6.0, DragonMantleHeal(oMeldshaper)); - } + //DelayCommand(6.0, DragonMantleHeal(oMeldshaper)); } void main() { - object oMeldshaper = PRCGetSpellTargetObject(); - int nEssentia = GetEssentiaInvested(oMeldshaper); - int nBonus = 3 * nEssentia; - - effect eLink = EffectSavingThrowIncrease(SAVING_THROW_FORT, 2); - if (nEssentia) + //Declare main variables. + int nEvent = GetRunningEvent(); + object oMeldshaper; + switch(nEvent) { - eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_ACID, nBonus)); - eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_COLD, nBonus)); - eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nBonus)); - eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_FIRE, nBonus)); - } - if (GetIsMeldBound(oMeldshaper) == CHAKRA_SHOULDERS && nEssentia) eLink = EffectLinkEffects(eLink, EffectDamageReduction(nEssentia, DAMAGE_POWER_PLUS_ONE)); - if (GetIsMeldBound(oMeldshaper) == CHAKRA_TOTEM && nEssentia) eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_JUMP, nEssentia * 4)); + case EVENT_ONHEARTBEAT: oMeldshaper = OBJECT_SELF; break; - ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oMeldshaper, 9999.0); - IPSafeAddItemProperty(GetPCSkin(oMeldshaper), ItemPropertyBonusFeat(IP_CONST_MELD_DRAGON_MANTLE), 9999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING); + default: + object oMeldshaper = PRCGetSpellTargetObject(); + } + + int nEssentia = GetEssentiaInvested(oMeldshaper, MELD_DRAGON_MANTLE); + int nBonus = 3 * nEssentia; + + if(nEvent == FALSE) + { + effect eLink = EffectSavingThrowIncrease(SAVING_THROW_FORT, 2); + if (nEssentia) + { + eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_ACID, nBonus)); + eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_COLD, nBonus)); + eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nBonus)); + eLink = EffectLinkEffects(eLink, EffectDamageResistance(DAMAGE_TYPE_FIRE, nBonus)); + } + + if (GetIsMeldBound(oMeldshaper, MELD_DRAGON_MANTLE) == CHAKRA_SHOULDERS && nEssentia) + { + eLink = EffectLinkEffects(eLink, EffectDamageReduction(nEssentia, DAMAGE_POWER_PLUS_ONE)); + } + if (GetIsMeldBound(oMeldshaper, MELD_DRAGON_MANTLE) == CHAKRA_TOTEM && nEssentia) + { + eLink = EffectLinkEffects(eLink, EffectSkillIncrease(SKILL_JUMP, nEssentia * 4)); + } + + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oMeldshaper, 9999.0); + IPSafeAddItemProperty(GetPCSkin(oMeldshaper), ItemPropertyBonusFeat(IP_CONST_MELD_DRAGON_MANTLE), 9999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING); + + DragonMantleHeal(oMeldshaper); + + AddEventScript(oMeldshaper, EVENT_ONHEARTBEAT, "moi_mld_drgnmntl", TRUE, FALSE); + } + + else if(nEvent == EVENT_ONHEARTBEAT) + { + if (GetHasSpellEffect(MELD_DRAGON_MANTLE, oMeldshaper) && GetIsMeldBound(oMeldshaper, MELD_DRAGON_MANTLE) == CHAKRA_HEART) + { + DragonMantleHeal(oMeldshaper); + } + } } \ No newline at end of file diff --git a/nwn/nwnprc/trunk/newspellbook/prc_amagsys_gain.nss b/nwn/nwnprc/trunk/newspellbook/prc_amagsys_gain.nss index 5c4e5f2f..fc5a438e 100644 --- a/nwn/nwnprc/trunk/newspellbook/prc_amagsys_gain.nss +++ b/nwn/nwnprc/trunk/newspellbook/prc_amagsys_gain.nss @@ -74,7 +74,65 @@ void main() } // 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(GetIsRHDSorcerer(oPC) && CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9)) return; @@ -121,6 +179,7 @@ void CheckSpellbooks(object oPC) DelayCommand(0.0f, CheckPsionics(oPC)); } + */ // Handle psionics void CheckPsionics(object oPC) diff --git a/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss b/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss index 5727ad40..92a90ee5 100644 --- a/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss +++ b/nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss @@ -2579,12 +2579,23 @@ int ToB() return TRUE; } */ - if (GetHasFeat(FEAT_IMPROVED_TWO_WEAPON_FIGHTING) && GetPRCSwitch(PRC_35_TWO_WEAPON_FIGHTING) && 17 > GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY, TRUE) && !GetLevelByClass(CLASS_TYPE_TEMPEST) && + if (GetHasFeat(FEAT_IMPROVED_TWO_WEAPON_FIGHTING) + && GetPRCSwitch(PRC_35_TWO_WEAPON_FIGHTING) + && GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY, TRUE) < 17 + && !nTempestLevel + && nRangerLevel < 9 + && nSamuraiLevel < 11) + { + FloatingTextStringOnCreature("You must have 17 Dexterity to take Improved Two Weapon Fighting under 3.5 rules", OBJECT_SELF, FALSE); + return TRUE; + } + +/* if (GetHasFeat(FEAT_IMPROVED_TWO_WEAPON_FIGHTING) && GetPRCSwitch(PRC_35_TWO_WEAPON_FIGHTING) && 17 > GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY, TRUE) && !GetLevelByClass(CLASS_TYPE_TEMPEST) && GetLevelByClass(CLASS_TYPE_RANGER) < 9 && GetLevelByClass(CLASS_TYPE_CW_SAMURAI) < 11) { FloatingTextStringOnCreature("You must have 17 Dexterity to take Improved Two Weapon Fighting under 3.5 rules", OBJECT_SELF, FALSE); return TRUE; - } + } */ /* if (GetHasFeat(FEAT_IMPROVED_TWO_WEAPON_FIGHTING) && GetPRCSwitch(PRC_35_TWO_WEAPON_FIGHTING) && 17 > GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY, TRUE) && !GetLevelByClass(CLASS_TYPE_TEMPEST) && 9 > !GetLevelByClass(CLASS_TYPE_RANGER)) { @@ -2592,11 +2603,21 @@ int ToB() return TRUE; } */ - if (GetHasFeat(FEAT_TWO_WEAPON_FIGHTING) && GetPRCSwitch(PRC_35_TWO_WEAPON_FIGHTING) && 15 > GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY, TRUE) && !GetLevelByClass(CLASS_TYPE_RANGER) && 2 > !GetLevelByClass(CLASS_TYPE_CW_SAMURAI)) + if (GetHasFeat(FEAT_TWO_WEAPON_FIGHTING) + && GetPRCSwitch(PRC_35_TWO_WEAPON_FIGHTING) + && GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY, TRUE) < 15 + && nRangerLevel == 0 + && nSamuraiLevel < 2) + { + FloatingTextStringOnCreature("You must have 15 Dexterity to take Two Weapon Fighting under 3.5 rules", OBJECT_SELF, FALSE); + return TRUE; + } + +/* if (GetHasFeat(FEAT_TWO_WEAPON_FIGHTING) && GetPRCSwitch(PRC_35_TWO_WEAPON_FIGHTING) && 15 > GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY, TRUE) && !GetLevelByClass(CLASS_TYPE_RANGER) && 2 > !GetLevelByClass(CLASS_TYPE_CW_SAMURAI)) { FloatingTextStringOnCreature("You must have 15 Dexterity to take Two Weapon Fighting under 3.5 rules", OBJECT_SELF, FALSE); return TRUE; - } + } */ if (GetHasFeat(FEAT_AWESOME_BLOW) && _GetSizeForPrereq(OBJECT_SELF) < CREATURE_SIZE_LARGE && !GetHasSpellEffect(MELD_WORMTAIL_BELT, OBJECT_SELF)) {