From 04e5393f7cf13da573067a89929dd38d7c9857f6 Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Tue, 20 May 2025 22:30:58 -0400 Subject: [PATCH] 2025/05/20 Update Fixed Samurai CW's TWF blocker, again. Dragon Mantle should have regen. Got Gloura working with Bard at 1st lvl. Got the other RHD casters working with Sorcerer at 1st lvl. Sublime Chord advances bard (or other classes) *caster level* not spell slots. --- nwn/nwnprc/trunk/include/inc_newspellbook.nss | 111 ++++++++++++++++-- nwn/nwnprc/trunk/include/prc_inc_castlvl.nss | 16 ++- .../trunk/newspellbook/moi_mld_drgnmntl.nss | 79 +++++++++---- .../trunk/newspellbook/prc_amagsys_gain.nss | 59 ++++++++++ nwn/nwnprc/trunk/scripts/prc_enforce_feat.nss | 29 ++++- 5 files changed, 255 insertions(+), 39 deletions(-) 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)) {