1 Commits
v4.79 ... main

Author SHA1 Message Date
Jaysyn904
a192bca40e 2026/01/11 Update
Updated PRC8 version.
Added EffectIcon for EFFECT_ICON_FATIGUE to PRCEffectFatigue.
Fixed Midnight Augmentation to display all known powers as well as display radial powers.
Draconic Senses now grants all of the abilities that it should. (Lowlight Vision, Darkvision, Ultravision).
2026-01-11 20:41:16 -05:00
5 changed files with 105 additions and 46 deletions

View File

@@ -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;
}

View File

@@ -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!!! */

View File

@@ -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)

View File

@@ -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)

View File

@@ -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);