diff --git a/nwn/nwnprc/trunk/include/prc_effect_inc.nss b/nwn/nwnprc/trunk/include/prc_effect_inc.nss index a41f7d9c..15ccc425 100644 --- a/nwn/nwnprc/trunk/include/prc_effect_inc.nss +++ b/nwn/nwnprc/trunk/include/prc_effect_inc.nss @@ -498,6 +498,7 @@ effect EffectFatigue(){ effect eReturn = EffectAbilityDecrease(ABILITY_STRENGTH, 2); eReturn = EffectLinkEffects(eReturn, EffectAbilityDecrease(ABILITY_DEXTERITY, 2)); eReturn = EffectLinkEffects(eReturn, EffectMovementSpeedDecrease(25)); + eReturn = EffectLinkEffects(eReturn, EffectIcon(EFFECT_ICON_FATIGUE)); eReturn = TagEffect(eReturn, "PRCFatigue"); return eReturn; } diff --git a/nwn/nwnprc/trunk/include/prc_inc_switch.nss b/nwn/nwnprc/trunk/include/prc_inc_switch.nss index 9fb62344..e19fe93b 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_switch.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_switch.nss @@ -76,7 +76,7 @@ /* This variable MUST be updated with every new version of the PRC!!! */ - const string PRC_VERSION = "PRC8 4.79"; + const string PRC_VERSION = "PRC8 4.80"; /* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */ diff --git a/nwn/nwnprc/trunk/include/psi_inc_powknown.nss b/nwn/nwnprc/trunk/include/psi_inc_powknown.nss index 20c19514..25486c36 100644 --- a/nwn/nwnprc/trunk/include/psi_inc_powknown.nss +++ b/nwn/nwnprc/trunk/include/psi_inc_powknown.nss @@ -29,7 +29,7 @@ */ //::////////////////////////////////////////////// //::////////////////////////////////////////////// - +#include "prc_inc_spells" ////////////////////////////////////////////////// /* Constants */ ////////////////////////////////////////////////// @@ -572,32 +572,49 @@ int GetMaxPowerCount(object oCreature, int nList) int GetHasPower(int nPower, object oCreature = OBJECT_SELF) { - // Check MISC list first (for Hidden Talent and similar feats) - if(GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_INVALID), oCreature)) - return TRUE; + // Debug output + if (DEBUG) DoDebug("GetHasPower: Checking power " + IntToString(nPower)); + + // Check if it's a subradial spell first + if (GetIsSubradialSpell(nPower)) + { + if(DEBUG) DoDebug("GetHasPower: " + IntToString(nPower) + " is a subradial"); + int nMasterSpell = GetMasterSpellFromSubradial(nPower); + if (nMasterSpell != -1) + { + if(DEBUG) DoDebug("GetHasPower: Master spell is " + IntToString(nMasterSpell)); + nPower = nMasterSpell; + } + } + + + // Check MISC list first (for Hidden Talent and similar feats) + if(GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_INVALID), oCreature)) + return TRUE; - if((GetLevelByClass(CLASS_TYPE_PSION, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSION), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_PSYWAR, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYWAR), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYCHIC_ROGUE), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_WILDER, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WILDER), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_FIST_OF_ZUOKEN), oCreature) - ) || - (GetLevelByClass(CLASS_TYPE_WARMIND, oCreature) - && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WARMIND), oCreature) - ) - // add new psionic classes here - ) - return TRUE; - return FALSE; + if((GetLevelByClass(CLASS_TYPE_PSION, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSION), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_PSYWAR, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYWAR), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSYCHIC_ROGUE), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_WILDER, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WILDER), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_FIST_OF_ZUOKEN), oCreature) + ) || + (GetLevelByClass(CLASS_TYPE_WARMIND, oCreature) + && GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_WARMIND), oCreature) + ) + // add new psionic classes here + ) + return TRUE; + + return FALSE; } string DebugListKnownPowers(object oCreature) diff --git a/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss b/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss index 9f779775..9516b0f5 100644 --- a/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss +++ b/nwn/nwnprc/trunk/newspellbook/moi_midnightcnv.nss @@ -166,23 +166,36 @@ void main() string sFeatID; int added = 0; - for(i = 14001; i < 14260 ; i++) + for(i = 14001; i < 14351 ; i++) { + // Skip blank IDs between 14266 and 14329 + if(i >= 14266 && i < 14330) + continue; + nPowerLevel = StringToInt(Get2DACache("spells", "Innate", i)); if(nPowerLevel > nMaxLevel) - break; + continue; string sName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i))); - - if(sName != "") - { - if (GetHasPower(i, oMeldshaper)) - { - if(SORT) AddToTempList(oMeldshaper, sName, i); - else AddChoice(sName, i, oMeldshaper); - added++; - } - } + + // Check if it's a regular power or a subradial + int bHasPower = GetHasPower(i, oMeldshaper); + if (!bHasPower && GetIsSubradialSpell(i)) + { + // For subradials, check if they know the master spell + int nMasterSpell = GetMasterSpellFromSubradial(i); + if (nMasterSpell != -1) + { + bHasPower = GetHasPower(nMasterSpell, oMeldshaper); + } + } + + if (bHasPower) + { + if(SORT) AddToTempList(oMeldshaper, sName, i); + else AddChoice(sName, i, oMeldshaper); + added++; + } } if(SORT) diff --git a/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss b/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss index 1cf1b040..3365d509 100644 --- a/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss +++ b/nwn/nwnprc/trunk/scripts/prc_dracfeat.nss @@ -287,16 +287,44 @@ void main() } ///////////////////////////Draconic Senses////////////////////////// if(GetHasFeat(FEAT_DRACONIC_SENSES, oPC)) - { + { + effect eLow = EffectBonusFeat(FEAT_DARKVISION); + effect eDark = EffectBonusFeat(FEAT_LOWLIGHTVISION); + //effect eUltra = EffectUltravision(); + effect eUltra = EffectBonusFeat(FEAT_ULTRAVISION); + effect eLink; + + if(DEBUG) DoDebug("Entering Draconic Senses Branch. nPower is: "+IntToString(nPower)+"."); switch(nPower) { - case 1: IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; - case 2: IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; - case 3: IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; - //Using Ultravision as the ability is Blindsense, not Blindsight - default: IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); - ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectUltravision()), oPC); break; + case 1: + case 2: + { + if(DEBUG) DoDebug("Draconic Senses Branch Case 1 & 2: Lowlight vision"); + //IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_LOWLIGHT_VISION), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, UnyieldingEffect(eLow), oPC); + break; + } + case 3: + { + if(DEBUG) DoDebug("Draconic Senses Branch Case 3: Lowlight vision + Darkvision"); + //IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); break; + eLink = EffectLinkEffects(eLow, eDark); + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, UnyieldingEffect(eLink), oPC); + break; + } + //;: Using Ultravision as the ability is Blindsense, not Blindsight + default: + { + if(DEBUG) DoDebug("Draconic Senses Branch Default: Lowlight vision + Darkvision + Ultravsion"); + //IPSafeAddItemProperty(oSkin, ItemPropertyDarkvision(), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE); + eLink = EffectLinkEffects(eLow, eDark); + eLink = EffectLinkEffects(eUltra, eLink); + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, UnyieldingEffect(eLink), oPC); + break; + } } + if(DEBUG) DoDebug("Draconic Senses: Adding skill bonuses."); SetCompositeBonus(oSkin, "DS_Spot", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_SPOT); SetCompositeBonus(oSkin, "DS_Search", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_SEARCH); SetCompositeBonus(oSkin, "DS_Listen", nPower, ITEM_PROPERTY_SKILL_BONUS, SKILL_LISTEN);