Exalted update
Updated Vow of Poverty. Added Sanctify Ki Strike, Holy Strike, Fist of Heavens, Vow of Abstinence, Vow of Chastity & Gift of Faith. (@fenac). Turned off the Taunt & Parry skills. Re-disabled AC & save bonuses from Tumble & Spellcraft. Updated min() & max() to PRCmin() & PRCmax() to not conflict with similarly named NUI adjacent functions. Set Point Blank Shot to 30' per PnP. Added icon for Chosen of Evil. Started work on Hidden Talent. Created Psionics function cheatsheet. Updated release archive.
This commit is contained in:
@@ -20,15 +20,15 @@ int nTest;
|
||||
|
||||
switch(nSpell)
|
||||
{
|
||||
case SPELL_LESSER_DISPEL : nTest = d20(1) + min(5, nSCLevel); break;
|
||||
case SPELL_DISPEL_MAGIC : nTest = d20(1) + min(10, nSCLevel); break;
|
||||
case SPELL_DISPELLING_TOUCH : nTest = d20(1) + min(10, nSCLevel); break;
|
||||
case SPELL_SLASHING_DISPEL : nTest = d20(1) + min(10, nSCLevel); break;
|
||||
case POWER_DISPELPSIONICS : nTest = d20(1) + min(15, GetManifesterLevel(oSCaster)); break;
|
||||
case SPELL_GREATER_DISPELLING : nTest = d20(1) + min(20, nSCLevel); break;
|
||||
case SPELL_GREAT_WALL_OF_DISPEL : nTest = d20(1) + min(20, nSCLevel); break;
|
||||
case SPELL_MORDENKAINENS_DISJUNCTION: nTest = d20(1) + min(40, nSCLevel); break;
|
||||
case 4061 : nTest = d20(1) + min(40, nSCLevel); break;//Superb Dispelling
|
||||
case SPELL_LESSER_DISPEL : nTest = d20(1) + PRCMin(5, nSCLevel); break;
|
||||
case SPELL_DISPEL_MAGIC : nTest = d20(1) + PRCMin(10, nSCLevel); break;
|
||||
case SPELL_DISPELLING_TOUCH : nTest = d20(1) + PRCMin(10, nSCLevel); break;
|
||||
case SPELL_SLASHING_DISPEL : nTest = d20(1) + PRCMin(10, nSCLevel); break;
|
||||
case POWER_DISPELPSIONICS : nTest = d20(1) + PRCMin(15, GetManifesterLevel(oSCaster)); break;
|
||||
case SPELL_GREATER_DISPELLING : nTest = d20(1) + PRCMin(20, nSCLevel); break;
|
||||
case SPELL_GREAT_WALL_OF_DISPEL : nTest = d20(1) + PRCMin(20, nSCLevel); break;
|
||||
case SPELL_MORDENKAINENS_DISJUNCTION: nTest = d20(1) + PRCMin(40, nSCLevel); break;
|
||||
case 4061 : nTest = d20(1) + PRCMin(40, nSCLevel); break;//Superb Dispelling
|
||||
default : nTest = 0; break;
|
||||
}
|
||||
if (nTest >= 11 + nMasterCLevel)
|
||||
|
@@ -1,5 +1,6 @@
|
||||
#include "prc_inc_clsfunc"
|
||||
#include "psi_inc_soulkn"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
|
||||
// Sanctify_Feat(iType);
|
||||
@@ -467,7 +468,6 @@ void main()
|
||||
//Vile();
|
||||
UnholyStrike();
|
||||
}
|
||||
|
||||
}
|
||||
else if (GetAlignmentGoodEvil(oPC)!= ALIGNMENT_EVIL)
|
||||
{
|
||||
@@ -532,7 +532,63 @@ void main()
|
||||
Sanctify();
|
||||
MartialStrike();
|
||||
}
|
||||
|
||||
|
||||
if(GetIsUnarmed(oPC))
|
||||
{
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
if(GetEffectTag(eCheckEffect) == "VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE)) SetLocalInt(oPC,"VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE),1);
|
||||
if(GetEffectTag(eCheckEffect) == "VoPFeat"+IntToString(FEAT_HOLYKISTRIKE)) SetLocalInt(oPC,"VoPFeat"+IntToString(FEAT_HOLYKISTRIKE),1);
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
// Sanctify Strike
|
||||
if (GetHasFeat(FEAT_SANCTIFYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE)))
|
||||
{
|
||||
effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1,DAMAGE_TYPE_POSITIVE),ALIGNMENT_ALL,ALIGNMENT_EVIL);
|
||||
effect eEffect2 = VersusRacialTypeEffect(EffectDamageIncrease(DAMAGE_BONUS_1d4,DAMAGE_TYPE_POSITIVE),RACIAL_TYPE_OUTSIDER);
|
||||
effect eLink = EffectLinkEffects(eEffect1,eEffect2);
|
||||
eLink = TagEffect(eLink,"SanctifyKiStrike");
|
||||
|
||||
//Remove any prior bonus to avoid duplication
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
if(GetEffectTag(eCheckEffect) == "SanctifyKiStrike") RemoveEffect(oPC, eCheckEffect);
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
|
||||
//Give player the bonus
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
}
|
||||
|
||||
// Holy Ki Strike
|
||||
if (GetHasFeat(FEAT_HOLYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_HOLYKISTRIKE)))
|
||||
{
|
||||
effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2d6,DAMAGE_TYPE_POSITIVE),ALIGNMENT_ALL,ALIGNMENT_EVIL);
|
||||
eEffect1 = TagEffect(eEffect1,"HolyKiStrike");
|
||||
|
||||
//Remove any prior bonus to avoid duplication and remove Sanctify Ki Strike
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
if(GetEffectTag(eCheckEffect) == "SanctifyKiStrike" || GetEffectTag(eCheckEffect) == "HolyKiStrike") RemoveEffect(oPC, eCheckEffect);
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
|
||||
//Give player the bonus
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect1, oPC);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
if(GetEffectTag(eCheckEffect) == "SanctifyKiStrike" || GetEffectTag(eCheckEffect) == "HolyKiStrike") RemoveEffect(oPC, eCheckEffect);
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vile();
|
||||
|
@@ -145,23 +145,6 @@ void main()
|
||||
//Give player the bonus, regardless of the weapon
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
|
||||
//Apply Golden Ice effect if unarmed and has feat
|
||||
if(GetIsUnarmed(oPC) && (GetHasFeat(FEAT_RAVAGEGOLDENICE, oPC) || GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(FEAT_RAVAGEGOLDENICE))))
|
||||
{
|
||||
itemproperty ip1 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE,2);
|
||||
ip1 = TagItemProperty(ip1,"GoldenIce");
|
||||
IPSafeAddItemProperty(oPC,ip1,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
itemproperty eCheckIPL = GetFirstItemProperty(oPC);
|
||||
while (GetIsItemPropertyValid(eCheckIPL))
|
||||
{
|
||||
if(GetItemPropertyTag(eCheckIPL) == "GoldenIce") RemoveItemProperty(oPC,ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE,2));
|
||||
eCheckIPL = GetNextItemProperty(oPC);
|
||||
}
|
||||
}
|
||||
|
||||
// For some reason, EVENT_ONPLAYEREQUIPITEM just works with weapons, so it is better to check all other items for magic elsewhere
|
||||
for (nSlot=0; nSlot < 13; nSlot++) //All but creatures slots
|
||||
{
|
||||
|
145
nwn/nwnprc/trunk/scripts/ft_vowpoverty_ft.nss
Normal file
145
nwn/nwnprc/trunk/scripts/ft_vowpoverty_ft.nss
Normal file
@@ -0,0 +1,145 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Vow of Poverty Extra Feat
|
||||
//:: ft_vowpoverty_ft
|
||||
//:://////////////////////////////////////////////
|
||||
/** @file
|
||||
This allows you to choose the extra feat each even level.
|
||||
|
||||
@original author Fencas
|
||||
@date Created - 2025-01-12
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "inc_dynconv"
|
||||
#include "prc_inc_function"
|
||||
#include "NW_I0_GENERIC"
|
||||
#include "inc_persist_loca"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Constant defintions */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
const int STAGE_SELECT_ABIL = 0;
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function defintions */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
void main()
|
||||
{
|
||||
object oPC = GetPCSpeaker();
|
||||
object oSkin = GetPCSkin(oPC);
|
||||
int i, j, nTest, nRow;
|
||||
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
|
||||
int nStage = GetStage(oPC);
|
||||
int nLevel = GetPersistantLocalInt(oPC, "VoPFeatCheck");
|
||||
|
||||
// Check which of the conversation scripts called the scripts
|
||||
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
|
||||
{
|
||||
if(DEBUG) DoDebug("ft_vowpoverty_ft: Aborting due to error.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(nValue == DYNCONV_SETUP_STAGE)
|
||||
{
|
||||
// Check if this stage is marked as already set up
|
||||
// This stops list duplication when scrolling
|
||||
if(!GetIsStageSetUp(nStage, oPC))
|
||||
{
|
||||
// Maneuver selection stage
|
||||
if(nStage == STAGE_SELECT_ABIL)
|
||||
{
|
||||
//Check which Feats have been added by this ability
|
||||
int nTotalRows = Get2DARowCount("prc_vop_feats");
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
for(nRow=0; nRow <= nTotalRows; nRow++)
|
||||
{
|
||||
string nFeat = Get2DAString("prc_vop_feats","FeatIndex",nRow);
|
||||
if(GetEffectTag(eCheckEffect) == "VoPFeat"+nFeat) SetLocalInt(oPC,"VoPFeat"+nFeat,1);
|
||||
}
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
|
||||
SetHeader("Choose an Exalted Feat for this new level under a Vow of Poverty:");
|
||||
//Add new option depending if it was not selected and char has all prereqs
|
||||
for(nRow=0; nRow <= nTotalRows; nRow++)
|
||||
{
|
||||
//Get prereqs from 2DA
|
||||
string sName = Get2DAString("prc_vop_feats","Name",nRow);
|
||||
int nFeat = StringToInt(Get2DAString("prc_vop_feats","FeatIndex",nRow));
|
||||
int nPreReq1 = StringToInt(Get2DAString("prc_vop_feats","PreReq1",nRow));
|
||||
int nPreReq2 = StringToInt(Get2DAString("prc_vop_feats","PreReq2",nRow));
|
||||
int nCon = StringToInt(Get2DAString("prc_vop_feats","Con",nRow));
|
||||
int nWis = StringToInt(Get2DAString("prc_vop_feats","Wis",nRow));
|
||||
int nCha = StringToInt(Get2DAString("prc_vop_feats","Cha",nRow));
|
||||
int nBAB = StringToInt(Get2DAString("prc_vop_feats","BAB",nRow));
|
||||
int nLaw = StringToInt(Get2DAString("prc_vop_feats","Law",nRow));
|
||||
|
||||
int nAllPreReq = 1;
|
||||
|
||||
//Check if prereqs exist and, if so, if they are met - if not, set bol to 0
|
||||
if(nPreReq1>0 && !GetHasFeat(nPreReq1, oPC)) nAllPreReq = 0;
|
||||
if(nPreReq1==213 && GetLevelByClass(CLASS_TYPE_MONK, oPC) >= 1) nAllPreReq = 1; //for Ki Strike and monks
|
||||
if(nPreReq2>0 && !GetHasFeat(nPreReq2, oPC)) nAllPreReq = 0;
|
||||
if(nCon>0 && !GetAbilityScore(oPC,ABILITY_CONSTITUTION) >= nCon) nAllPreReq = 0;
|
||||
if(nWis>0 && !GetAbilityScore(oPC,ABILITY_CONSTITUTION) >= nWis) nAllPreReq = 0;
|
||||
if(nCha>0 && !GetAbilityScore(oPC,ABILITY_CONSTITUTION) >= nCha) nAllPreReq = 0;
|
||||
if(nBAB>0 && !GetBaseAttackBonus(oPC) >= nBAB) nAllPreReq = 0;
|
||||
if(nLaw>0 && !GetAlignmentLawChaos(oPC) == ALIGNMENT_LAWFUL) nAllPreReq = 0;
|
||||
|
||||
if (!GetHasFeat(nFeat, oPC) && !GetLocalInt(oPC, "VoPFeat"+IntToString(nFeat)) && nAllPreReq == 1) AddChoice(sName, nFeat, oPC);
|
||||
}
|
||||
|
||||
AddChoice("Cancel (you will get no Exalted Feats this level)", 0, oPC);
|
||||
SetDefaultTokens(); //If there are more than 10 options, add Next
|
||||
MarkStageSetUp(STAGE_SELECT_ABIL, oPC);
|
||||
}
|
||||
}
|
||||
|
||||
// Do token setup
|
||||
SetupTokens();
|
||||
}
|
||||
else if(nValue == DYNCONV_EXITED)
|
||||
{
|
||||
if(DEBUG) DoDebug("ft_vowpoverty_ft: Running exit handler");
|
||||
}
|
||||
else if(nValue == DYNCONV_ABORTED)
|
||||
{
|
||||
// This section should never be run, since aborting this conversation should
|
||||
// always be forbidden and as such, any attempts to abort the conversation
|
||||
// should be handled transparently by the system
|
||||
if(DEBUG) DoDebug("ft_vowpoverty_ft: ERROR: Conversation abort section run");
|
||||
}
|
||||
// Handle PC response
|
||||
else
|
||||
{
|
||||
int nChoice = GetChoice(oPC);
|
||||
if(nStage == STAGE_SELECT_ABIL)
|
||||
{
|
||||
SetPersistantLocalInt(oPC, "VoPFeat"+IntToString(nLevel),1); //Register the choice was made
|
||||
|
||||
//If it was not cancelled, give chosen feat to PC (as EffectBonusFeat)
|
||||
if(nChoice > 0)
|
||||
{
|
||||
effect eBonusFeat = EffectBonusFeat(nChoice);
|
||||
eBonusFeat = UnyieldingEffect(eBonusFeat);
|
||||
eBonusFeat = TagEffect(eBonusFeat, "VoPFeat"+IntToString(nChoice));
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusFeat, oPC);
|
||||
}
|
||||
|
||||
// And we're all done
|
||||
DeletePersistantLocalInt(oPC,"VoPFeatCheck");
|
||||
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("ft_vowpoverty_ft: New stage: " + IntToString(nStage));
|
||||
|
||||
// Store the stage value. If it has been changed, this clears out the choices
|
||||
SetStage(nStage, oPC);
|
||||
}
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ void main()
|
||||
}
|
||||
else if(GetLocalInt(oPC, "HadrimoiPerfectSymmetry"))
|
||||
{
|
||||
nAttackCount = max(nBAB, 3);
|
||||
nAttackCount = PRCMax(nBAB, 3);
|
||||
if (DEBUG) DoDebug("prc_bab_caller: Using hadrimoi perfect symmetry, # attacks = " + IntToString(nAttackCount));
|
||||
}
|
||||
else
|
||||
@@ -77,7 +77,7 @@ void main()
|
||||
if (DEBUG) DoDebug("prc_bab_caller: detected Spell Tensers Transformation, # attacks = " + IntToString(nTTAttackCount));
|
||||
}
|
||||
|
||||
int nMax = max(nDPAttackCount, nTTAttackCount);
|
||||
int nMax = PRCMax(nDPAttackCount, nTTAttackCount);
|
||||
|
||||
// we only consider any changes in # attacks, if Tenser's or DP *increases* our "normal" attack count!
|
||||
// this makes sure, that we won't call SetBaseAttackBonus needlessly
|
||||
@@ -142,7 +142,7 @@ void main()
|
||||
// the aurora engine can also handle up to two offhand attacks
|
||||
|
||||
//calculate the number of main hand attacks the aurora engine can at most handle, including the up to 2 offhand attacks
|
||||
int nCap = 12 - min(nOffhand,2);
|
||||
int nCap = 12 - PRCMin(nOffhand,2);
|
||||
// apply the cap and calculate the number of overflow (main hand) attacks, that aurora engine can't handle (usually this will never happen)
|
||||
if(nAttackCount > nCap)
|
||||
{
|
||||
|
@@ -48,7 +48,7 @@ void OnEquip(object oPC,object oSkin)
|
||||
|
||||
|
||||
// Bonus Lvl BladeSinger Max Bonus Int
|
||||
int BladeLv = min(GetLevelByClass(CLASS_TYPE_BLADESINGER, oPC), GetAbilityModifier(ABILITY_INTELLIGENCE,oPC));
|
||||
int BladeLv = PRCMin(GetLevelByClass(CLASS_TYPE_BLADESINGER, oPC), GetAbilityModifier(ABILITY_INTELLIGENCE,oPC));
|
||||
|
||||
SetCompositeBonus(oSkin, "BladesAC", BladeLv, ITEM_PROPERTY_AC_BONUS);
|
||||
|
||||
|
@@ -799,7 +799,7 @@ void CraftingHB(object oPC, object oItem, itemproperty ip, int nCost, int nXP, s
|
||||
FloatingTextStringOnCreature("Crafting Failed!", oPC);
|
||||
DeleteLocalInt(oPC, PRC_CRAFT_HB);
|
||||
TakeGoldFromCreature(nCost, oPC, TRUE);
|
||||
SetXP(oPC, max(GetXP(oPC) - nXP, GetHitDice(oPC) * (GetHitDice(oPC) - 1) * 500)); //can't delevel
|
||||
SetXP(oPC, PRCMax(GetXP(oPC) - nXP, GetHitDice(oPC) * (GetHitDice(oPC) - 1) * 500)); //can't delevel
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@ void main()
|
||||
// Determine DC for this target
|
||||
nDC = d20() // Die roll
|
||||
+ GetHitDice(oTarget) // Hit dice
|
||||
+ max(0, GetAbilityModifier(ABILITY_WISDOM, oTarget)) // Wisdom bonus, no wisdom penalty
|
||||
+ PRCMax(0, GetAbilityModifier(ABILITY_WISDOM, oTarget)) // Wisdom bonus, no wisdom penalty
|
||||
+ (4 * (PRCGetCreatureSize(oTarget) - nPCSize)) // Adjust by 4 in favor of the bigger creature for each size category it is bigger than the smaller one
|
||||
;
|
||||
|
||||
|
@@ -42,7 +42,7 @@ void main()
|
||||
// Intimidate DC calculation
|
||||
int nDC = d20() // Die roll
|
||||
+ GetHitDice(oTarget) // Hit dice
|
||||
+ max(0, GetAbilityModifier(ABILITY_WISDOM, oTarget)) // Wisdom bonus, no wisdom penalty
|
||||
+ PRCMax(0, GetAbilityModifier(ABILITY_WISDOM, oTarget)) // Wisdom bonus, no wisdom penalty
|
||||
+ (4 * (PRCGetCreatureSize(oTarget) - PRCGetCreatureSize(oPC))) // Adjust by 4 in favor of the bigger creature for each size category it is bigger than the smaller one
|
||||
;
|
||||
// Construct Intimidate effect
|
||||
|
@@ -20,6 +20,6 @@ void main()
|
||||
int nStk = GetLevelByClass(CLASS_TYPE_SHADOWBANE_STALKER);
|
||||
int nPal = GetLevelByClass(CLASS_TYPE_PALADIN);
|
||||
|
||||
int nLevel = max(nPal, max(nStk, nSlayer));
|
||||
int nLevel = PRCMax(nPal, PRCMax(nStk, nSlayer));
|
||||
DoRacialSLA(SPELL_DETECT_EVIL, nLevel);
|
||||
}
|
@@ -212,7 +212,7 @@ void handleCraftProperties2da(string s2da, int row = 0)
|
||||
void handleCraftItems2da(int row = 0)
|
||||
{
|
||||
int max;
|
||||
for(max = min(row + 25, PRCGetFileEnd("prc_craft_gen_it")); row < max; row++)
|
||||
for(max = PRCMin(row + 25, PRCGetFileEnd("prc_craft_gen_it")); row < max; row++)
|
||||
{
|
||||
DoDebug("Handling prc_craft_gen_it row " + IntToString(row));
|
||||
|
||||
|
@@ -329,7 +329,7 @@ int FavouredSoul()
|
||||
+ GetHasFeat(FEAT_FAVOURED_SOUL_FIRE)
|
||||
+ GetHasFeat(FEAT_FAVOURED_SOUL_SONIC);
|
||||
|
||||
if(nEnergy != min(3, nFS / 5))
|
||||
if(nEnergy != PRCMin(3, nFS / 5))
|
||||
{
|
||||
FloatingTextStringOnCreature("You must select an Energy Resistance Feat. Please reselect your feats.", OBJECT_SELF, FALSE);
|
||||
return TRUE;
|
||||
@@ -769,11 +769,11 @@ int SkillRequirements()
|
||||
|
||||
int CraftingFeats()
|
||||
{
|
||||
int nCasterLvl = max(GetCasterLvl(TYPE_ARCANE), GetCasterLvl(TYPE_DIVINE)),
|
||||
int nCasterLvl = PRCMax(GetCasterLvl(TYPE_ARCANE), GetCasterLvl(TYPE_DIVINE)),
|
||||
nManifesterLvl = GetManifesterLevel(OBJECT_SELF, GetPrimaryPsionicClass()),
|
||||
nInvokerLvl = GetInvokerLevel(OBJECT_SELF, GetPrimaryInvocationClass()),
|
||||
nCasterMax = max(nCasterLvl, nInvokerLvl),
|
||||
nMax = max(nCasterMax, nManifesterLvl),
|
||||
nCasterMax = PRCMax(nCasterLvl, nInvokerLvl),
|
||||
nMax = PRCMax(nCasterMax, nManifesterLvl),
|
||||
nArti = GetLevelByClass(CLASS_TYPE_ARTIFICER),
|
||||
nBattle = GetLevelByClass(CLASS_TYPE_BATTLESMITH),
|
||||
nIron = GetLevelByClass(CLASS_TYPE_IRONSOUL_FORGEMASTER);
|
||||
@@ -1546,7 +1546,7 @@ int Shaman()
|
||||
+ GetHasFeat(FEAT_BLIND_FIGHT)
|
||||
+ GetHasFeat(FEAT_DEFLECT_ARROWS);
|
||||
|
||||
if(nIS < min(5, (nClass/4)))
|
||||
if(nIS < PRCMin(5, (nClass/4)))
|
||||
{
|
||||
FloatingTextStringOnCreature("You do not have the correct amount of bonus feats. Please reselect your feats.", OBJECT_SELF, FALSE);
|
||||
return TRUE;
|
||||
|
@@ -58,7 +58,7 @@ void main()
|
||||
//Save
|
||||
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nSaveDC, SAVING_THROW_TYPE_DEATH))
|
||||
{
|
||||
int nDam = d6(3) + min(20, nCasterLvl);
|
||||
int nDam = d6(3) + PRCMin(20, nCasterLvl);
|
||||
}
|
||||
|
||||
else
|
||||
|
@@ -223,7 +223,7 @@ void main()
|
||||
if(DEBUG) DoDebug("prc_evnt_spirwep: SR check already performed for this target. Skipping SR check.");
|
||||
}
|
||||
|
||||
int nDamBonus = min(5, nCasterLevel / 3);
|
||||
int nDamBonus = PRCMin(5, nCasterLevel / 3);
|
||||
effect eDamage = EffectDamage(nDamBonus, DAMAGE_TYPE_DIVINE);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
|
||||
if(DEBUG) DoDebug("prc_evnt_spirwep: "+IntToString(nDamBonus)+" magical damage applied to the target.");
|
||||
|
@@ -13,6 +13,7 @@
|
||||
|
||||
#include "moi_inc_moifunc"
|
||||
#include "prc_inc_clsfunc"
|
||||
#include "psi_inc_core"
|
||||
|
||||
void DisablePowerAttack(object oPC);
|
||||
void PRCFeat_AddMagicalBonuses(object oPC, object oSkin);
|
||||
@@ -253,7 +254,22 @@ void main()
|
||||
if(iEquip)
|
||||
PRCFeat_Equip(oPC, oSkin, iEquip);
|
||||
|
||||
//Checking VoP feats
|
||||
int nTotalRows = Get2DARowCount("prc_vop_feats");
|
||||
int nRow;
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
for(nRow=0; nRow <= nTotalRows; nRow++)
|
||||
{
|
||||
string nFeat = Get2DAString("prc_vop_feats","FeatIndex",nRow);
|
||||
if(GetEffectTag(eCheckEffect) == "VoPFeat"+nFeat) SetLocalInt(oPC,"VoPFeat"+nFeat,1);
|
||||
}
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
|
||||
// Feats are checked here
|
||||
|
||||
//if(GetHasFeat(FEAT_SAC_VOW, oPC)) ExecuteScript("prc_vows", oPC);
|
||||
//if(GetHasFeat(FEAT_LICHLOVED, oPC)) ExecuteScript("prc_lichloved", oPC);
|
||||
if(GetHasFeat(FEAT_EB_HAND, oPC) ||
|
||||
@@ -296,10 +312,8 @@ void main()
|
||||
//if(GetHasFeat(FEAT_LINGERING_DAMAGE, oPC)) ExecuteScript("ft_lingdmg", oPC);
|
||||
//if(GetHasFeat(FEAT_MAGICAL_APTITUDE, oPC)) ExecuteScript("prc_magaptitude", oPC);
|
||||
if(GetHasFeat(FEAT_ETERNAL_FREEDOM, oPC)) ExecuteScript("etern_free", oPC);
|
||||
if(GetHasFeat(FEAT_INTUITIVE_ATTACK, oPC) || GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK)))
|
||||
{
|
||||
ExecuteScript("prc_intuiatk", oPC);
|
||||
}
|
||||
|
||||
if(GetHasFeat(FEAT_INTUITIVE_ATTACK, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK))) ExecuteScript("prc_intuiatk", oPC);
|
||||
//if(GetPersistantLocalInt(oPC, "EpicSpell_TransVital")) ExecuteScript("trans_vital", oPC);
|
||||
//if(GetHasFeat(FEAT_COMBAT_MANIFESTATION, oPC)) ExecuteScript("psi_combat_manif", oPC);
|
||||
//if(GetHasFeat(FEAT_WILD_TALENT, oPC)) ExecuteScript("psi_wild_talent", oPC);
|
||||
@@ -599,6 +613,16 @@ void PRCFeat_AddBonusFeats(object oPC, object oSkin)
|
||||
|
||||
if(GetHasFeat(FEAT_WILD_TALENT, oPC))
|
||||
AddSkinFeat(FEAT_PSIONIC_FOCUS, IP_CONST_FEAT_PSIONIC_FOCUS, oSkin, oPC);
|
||||
|
||||
if(IsHiddenTalent())
|
||||
{
|
||||
AddSkinFeat(FEAT_PSIONIC_FOCUS, IP_CONST_FEAT_PSIONIC_FOCUS, oSkin, oPC);
|
||||
AddSkinFeat(FEAT_AUGMENT_PSIONICS_QUICKSELECTS, IP_CONST_FEAT_AUGMENT_PSIONICS_QUICKSELECTS, oSkin, oPC);
|
||||
AddSkinFeat(FEAT_AUGMENT_PSIONICS_DIGITS_0_4, IP_CONST_FEAT_AUGMENT_PSIONICS_DIGITS_0_4, oSkin, oPC);
|
||||
AddSkinFeat(FEAT_AUGMENT_PSIONICS_DIGITS_5_9, IP_CONST_FEAT_AUGMENT_PSIONICS_DIGITS_5_9, oSkin, oPC);
|
||||
AddSkinFeat(FEAT_AUGMENT_PSIONICS_TENS, IP_CONST_FEAT_AUGMENT_PSIONICS_TENS, oSkin, oPC);
|
||||
AddSkinFeat(FEAT_AUGMENT_QUICKSELECTS_2, IP_CONST_FEAT_AUGMENT_QUICKSELECTS_2, oSkin, oPC);
|
||||
}
|
||||
|
||||
if (GetTotalEssentia(oPC))
|
||||
AddSkinFeat(FEAT_INVEST_ESSENTIA_CONV, IP_CONST_FEAT_INVEST_ESSENTIA_CONV, oSkin, oPC);
|
||||
@@ -727,7 +751,12 @@ void PRCFeat_AddCompositeBonuses(object oPC, object oSkin)
|
||||
|
||||
if(GetSkillRank(SKILL_JUMP, oPC) > 4)
|
||||
SetCompositeBonus(oSkin, "SkillJTum", 2, ITEM_PROPERTY_SKILL_BONUS, SKILL_TUMBLE);
|
||||
|
||||
|
||||
if(GetHasFeat(FEAT_GIFTOFFAITH, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_GIFTOFFAITH)))
|
||||
{
|
||||
SetCompositeBonus(oSkin, "GiftOfFaith", 2, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_FEAR);
|
||||
}
|
||||
|
||||
if(nAlignmentGoodEvil == ALIGNMENT_GOOD)
|
||||
{
|
||||
if(GetHasFeat(FEAT_SAC_VOW, oPC))
|
||||
@@ -741,14 +770,22 @@ void PRCFeat_AddCompositeBonuses(object oPC, object oSkin)
|
||||
|
||||
if(nAlignmentLawChaos == ALIGNMENT_LAWFUL)
|
||||
{
|
||||
if(GetHasFeat(FEAT_VOW_OBED, oPC))
|
||||
if(GetHasFeat(FEAT_VOW_OBED, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_VOW_OBED)))
|
||||
SetCompositeBonus(oSkin, "VowObed", 4, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEBASETYPE_WILL);
|
||||
}
|
||||
if(GetHasFeat(FEAT_VOW_PURITY, oPC))
|
||||
if(GetHasFeat(FEAT_VOW_PURITY, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_VOW_PURITY)))
|
||||
{
|
||||
SetCompositeBonus(oSkin, "VowPurity_De", 1, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_DEATH);
|
||||
SetCompositeBonus(oSkin, "VowPurity_Di", 1, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_DISEASE);
|
||||
}
|
||||
}
|
||||
if(GetHasFeat(FEAT_VOWABSTINENCE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_VOWABSTINENCE)))
|
||||
{
|
||||
SetCompositeBonus(oSkin, "VowAbstinence", 4, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_POISON);
|
||||
}
|
||||
if(GetHasFeat(FEAT_VOWCHASTITY, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_VOWCHASTITY)))
|
||||
{
|
||||
SetCompositeBonus(oSkin, "VowChastity", 4, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_MINDAFFECTING);
|
||||
}
|
||||
}
|
||||
else if(nAlignmentGoodEvil == ALIGNMENT_EVIL)
|
||||
{
|
||||
|
@@ -1,4 +1,5 @@
|
||||
#include "prc_alterations"
|
||||
#include "prc_inc_unarmed"
|
||||
|
||||
int isSimple(object oItem)
|
||||
{
|
||||
@@ -54,55 +55,39 @@ int isLight(object oItem)
|
||||
|
||||
void main()
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_intuiatk: Running main()");
|
||||
//object oPC = PRCGetSpellTargetObject();
|
||||
object oPC = OBJECT_SELF; // This should only be called via ExecuteScript on the target, so...
|
||||
object oSkin = GetPCSkin(oPC);
|
||||
if(DEBUG) DoDebug("prc_intuiatk: Running main()");
|
||||
//object oPC = PRCGetSpellTargetObject();
|
||||
object oPC = OBJECT_SELF; // This should only be called via ExecuteScript on the target, so...
|
||||
object oSkin = GetPCSkin(oPC);
|
||||
|
||||
//Check VoP feats
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
if(GetEffectTag(eCheckEffect) == "VoPFeat"+IntToString(FEAT_RAVAGEGOLDENICE)) SetLocalInt(oPC,"VoPFeat"+IntToString(FEAT_RAVAGEGOLDENICE),1);
|
||||
if(GetEffectTag(eCheckEffect) == "VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK)) SetLocalInt(oPC,"VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK),1);
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
|
||||
// Check for Golden Ice
|
||||
if (GetHasFeat(FEAT_RAVAGEGOLDENICE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_RAVAGEGOLDENICE)))
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_intuiatk: PC has Ravage: Golden Ice");
|
||||
|
||||
if (GetLocalInt(oSkin,"IniGoldenIce")) return;
|
||||
object oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||
|
||||
if (GetHasFeat(FEAT_RAVAGEGOLDENICE, oPC) || GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(FEAT_RAVAGEGOLDENICE)))
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_intuiatk: PC has Ravage: Golden Ice");
|
||||
int iEquip = GetLocalInt(oPC,"ONEQUIP") ;
|
||||
object oItem;
|
||||
// fixed to work with new unarmed inc
|
||||
if(GetIsPRCCreatureWeapon(oItem) && GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
|
||||
{
|
||||
RemoveSpecificProperty(oItem,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE,2),oItem);
|
||||
SetLocalInt(oSkin,"IniGoldenIce",1);
|
||||
}
|
||||
else RemoveSpecificProperty(oItem,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE);
|
||||
}
|
||||
|
||||
if (iEquip == 1)
|
||||
oItem = GetItemLastUnequipped();
|
||||
else
|
||||
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
|
||||
|
||||
|
||||
if (iEquip == 1||GetAlignmentGoodEvil(oPC)!= ALIGNMENT_GOOD)
|
||||
{
|
||||
if (GetBaseItemType(oItem)==BASE_ITEM_GLOVES)
|
||||
RemoveSpecificProperty(oItem,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE);
|
||||
}
|
||||
else
|
||||
{
|
||||
oItem = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||
RemoveSpecificProperty(oItem,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE,2),oItem);
|
||||
}
|
||||
|
||||
object oCweapB = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||
object oCweapL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||
object oCweapR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||
RemoveSpecificProperty(oCweapB,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE);
|
||||
RemoveSpecificProperty(oCweapL,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE);
|
||||
RemoveSpecificProperty(oCweapR,ITEM_PROPERTY_ONHITCASTSPELL,IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE);
|
||||
|
||||
if (GetAlignmentGoodEvil(oPC)== ALIGNMENT_GOOD)
|
||||
{
|
||||
itemproperty ip1 = ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_RAVAGEGOLDENICE,2);
|
||||
ip1 = TagItemProperty(ip1,"GoldenIce");
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip1,oCweapB);
|
||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oCweapL);
|
||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oCweapR);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if(GetHasFeat(FEAT_INTUITIVE_ATTACK, oPC) || GetHasFeat(FEAT_WEAPON_FINESSE, oPC) || GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK)))
|
||||
if(GetHasFeat(FEAT_INTUITIVE_ATTACK, oPC) || GetHasFeat(FEAT_WEAPON_FINESSE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK)))
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_intuiatk: PC has Intuitive Attack or WepFinesse");
|
||||
|
||||
@@ -114,7 +99,7 @@ void main()
|
||||
int iWis = GetAbilityModifier(ABILITY_WISDOM,oPC);
|
||||
int iIABonus = 0;
|
||||
int iWFBonus = 0;
|
||||
int bHasIA = GetHasFeat(FEAT_INTUITIVE_ATTACK, oPC) || GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK));
|
||||
int bHasIA = GetHasFeat(FEAT_INTUITIVE_ATTACK, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_INTUITIVE_ATTACK));
|
||||
int bHasWF = GetHasFeat(FEAT_WEAPON_FINESSE, oPC);
|
||||
int bUseIA = FALSE;
|
||||
int bUseWF = FALSE;
|
||||
|
@@ -22,7 +22,7 @@ void main()
|
||||
object oAmmo;
|
||||
int nClass = GetLevelByClass(CLASS_TYPE_KNIGHT, oPC);
|
||||
int nCha = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
||||
int nBonus = max(1, (nClass/2) + nCha);
|
||||
int nBonus = PRCMax(1, (nClass/2) + nCha);
|
||||
|
||||
|
||||
// We aren't being called from any event, instead from EvalPRCFeats
|
||||
|
@@ -83,7 +83,7 @@ void main()
|
||||
|
||||
if(nDexBonus > nMaxDexBonus)
|
||||
{
|
||||
nBonus = min(nDexBonus - nMaxDexBonus, nCapIncrease);
|
||||
nBonus = PRCMin(nDexBonus - nMaxDexBonus, nCapIncrease);
|
||||
}
|
||||
|
||||
//SendMessageToPC(GetFirstPC(), "DEBUG: prc_mithral -> nBonus is "+ IntToString(nBonus)+".");
|
||||
|
@@ -80,7 +80,7 @@ void main()
|
||||
if(DEBUG) DoDebug("Destruction Retribution firing. Dead creature = " + DebugObject2Str(oDead));
|
||||
|
||||
int nDamage;
|
||||
int nDice = max(1, GetHitDice(oDead) / 2); // (hd / 2)d6, min 1d6
|
||||
int nDice = PRCMax(1, GetHitDice(oDead) / 2); // (hd / 2)d6, min 1d6
|
||||
float fDelay;
|
||||
effect eExplode = EffectVisualEffect(VFX_FNF_LOS_EVIL_10); //Replace with Negative Pulse
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
|
||||
|
@@ -234,7 +234,7 @@ void main()
|
||||
if(!GetIdentified(oItem))
|
||||
{
|
||||
// No negative numbers, please
|
||||
int nLore = max(0, GetSkillRank(SKILL_LORE, oCreature));
|
||||
int nLore = PRCMax(0, GetSkillRank(SKILL_LORE, oCreature));
|
||||
int nMax = StringToInt(Get2DACache("SkillVsItemCost", "DeviceCostMax", nLore));
|
||||
if(nMax == 0)
|
||||
nMax = 120000000;
|
||||
|
@@ -299,7 +299,7 @@ void main()
|
||||
nDice = 2;
|
||||
nDam = (iElement == DAMAGE_TYPE_SONIC) ? d4(nDice) : d6(nDice); //reduced damage dice
|
||||
if((iElement == DAMAGE_TYPE_COLD) || (iElement == DAMAGE_TYPE_ELECTRICAL) || (iElement == DAMAGE_TYPE_ACID))
|
||||
nDam = max(nDice, nDam - nDice); //minimum of 1 per die
|
||||
nDam = PRCMax(nDice, nDam - nDice); //minimum of 1 per die
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -309,13 +309,13 @@ void main()
|
||||
nDice = (GetLevelByClass(CLASS_TYPE_PYROKINETICIST, oSpellOrigin) >= 8) ? 4 : 2;
|
||||
nDam1 = (iElement == DAMAGE_TYPE_SONIC) ? d4(nDice) : d6(nDice); //reduced damage dice
|
||||
if((iElement == DAMAGE_TYPE_COLD) || (iElement == DAMAGE_TYPE_ELECTRICAL) || (iElement == DAMAGE_TYPE_ACID))
|
||||
nDam1 = max(nDice, nDam1 - nDice); //minimum of 1 per die
|
||||
nDam1 = PRCMax(nDice, nDam1 - nDice); //minimum of 1 per die
|
||||
}
|
||||
if(GetTag(oItem) == "PRC_PYRO_LASH_WHIP")
|
||||
{ //Extra damage from whip
|
||||
nDam2 += (iElement == DAMAGE_TYPE_SONIC) ? d6(1) : d8(1); //reduced damage dice
|
||||
if((iElement == DAMAGE_TYPE_COLD) || (iElement == DAMAGE_TYPE_ELECTRICAL) || (iElement == DAMAGE_TYPE_ACID))
|
||||
nDam2 = max(1, nDam2 - 1); //minimum of 1
|
||||
nDam2 = PRCMax(1, nDam2 - 1); //minimum of 1
|
||||
}
|
||||
nDam = nDam1 + nDam2;
|
||||
}
|
||||
|
@@ -1680,7 +1680,7 @@ void main()
|
||||
string sPsiFile = GetAMSKnownFileName(nClass);
|
||||
int nMaxLevel = StringToInt(Get2DACache(sPsiFile, "MaxPowerLevel", nLevel));
|
||||
|
||||
int nPsiHighest = min(nMaxLevel, nAbility - 10);
|
||||
int nPsiHighest = PRCMin(nMaxLevel, nAbility - 10);
|
||||
|
||||
for(nSpellLevel = 1; nSpellLevel <= nPsiHighest; nSpellLevel++)
|
||||
{
|
||||
@@ -1700,8 +1700,8 @@ void main()
|
||||
int nAbility = GetAbilityScoreForClass(nClass, oPC);
|
||||
string sShdFile = GetAMSKnownFileName(nClass);
|
||||
|
||||
int nShdHighest = max(GetMaxMysteryLevelLearnable(oPC, nClass, 1), GetMaxMysteryLevelLearnable(oPC, nClass, 2));
|
||||
nShdHighest = max(nShdHighest, GetMaxMysteryLevelLearnable(oPC, nClass, 3));
|
||||
int nShdHighest = PRCMax(GetMaxMysteryLevelLearnable(oPC, nClass, 1), GetMaxMysteryLevelLearnable(oPC, nClass, 2));
|
||||
nShdHighest = PRCMax(nShdHighest, GetMaxMysteryLevelLearnable(oPC, nClass, 3));
|
||||
|
||||
for(nSpellLevel = 1; nSpellLevel <= nShdHighest; nSpellLevel++)
|
||||
{
|
||||
|
@@ -24,9 +24,15 @@ void main()
|
||||
SetNaturalWeaponDamage(oComp);
|
||||
|
||||
object oCompSkin = GetPCSkin(oComp);
|
||||
|
||||
|
||||
effect eCheckEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eCheckEffect))
|
||||
{
|
||||
if(GetEffectTag(eCheckEffect) == "VoPFeat"+IntToString(FEAT_EXALTED_COMPANION)) SetLocalInt(oPC,"VoPFeat"+IntToString(FEAT_EXALTED_COMPANION),1);
|
||||
eCheckEffect = GetNextEffect(oPC);
|
||||
}
|
||||
//Exalted Companion
|
||||
if((GetHasFeat(FEAT_EXALTED_COMPANION, oPC) || GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(FEAT_EXALTED_COMPANION)))
|
||||
if((GetHasFeat(FEAT_EXALTED_COMPANION, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_EXALTED_COMPANION)))
|
||||
&& GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
|
||||
ApplyExaltedCompanion(oComp, oCompSkin);
|
||||
|
||||
|
@@ -229,7 +229,7 @@ void DoDeathDependent(object oEater, object oTarget, string sResRef, string sNam
|
||||
object oSlave = CreateObject(OBJECT_TYPE_CREATURE, "soul_wight_test", lSpawn);
|
||||
if(GetIsObjectValid(oSlave))
|
||||
{
|
||||
SetMaxHenchmen(max(nMaxHenchmen, i)); // Temporarily set the number of max henchmen high enough that we can add another
|
||||
SetMaxHenchmen(PRCMax(nMaxHenchmen, i)); // Temporarily set the number of max henchmen high enough that we can add another
|
||||
AddHenchman(oEater, oSlave);
|
||||
SetMaxHenchmen(nMaxHenchmen);
|
||||
|
||||
|
@@ -148,14 +148,14 @@ void main()
|
||||
// Speed increase
|
||||
if(fSpeedChange > 0.0)
|
||||
{
|
||||
int nChange = min(99, max(0, FloatToInt(fSpeedChange * 100.0)));
|
||||
int nChange = PRCMin(99, PRCMax(0, FloatToInt(fSpeedChange * 100.0)));
|
||||
if(DEBUG) DoDebug("prc_speed: Applying an increase in speed: " + IntToString(nChange));
|
||||
AssignCommand(oWP, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectMovementSpeedIncrease(nChange)), oPC)));
|
||||
}
|
||||
// Speed decrease
|
||||
else if(fSpeedChange < 0.0)
|
||||
{
|
||||
int nChange = min(99, max(0, FloatToInt(-fSpeedChange * 100.0)));
|
||||
int nChange = PRCMin(99, PRCMax(0, FloatToInt(-fSpeedChange * 100.0)));
|
||||
if(DEBUG) DoDebug("prc_speed: Applying an decrease in speed: " + IntToString(nChange));
|
||||
AssignCommand(oWP, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectMovementSpeedDecrease(nChange)), oPC)));
|
||||
//ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectMovementSpeedDecrease(nChange)), oPC)
|
||||
|
@@ -103,7 +103,7 @@ void main()
|
||||
{
|
||||
// Get the highest enhancement bonus property on the item
|
||||
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_ENHANCEMENT_BONUS)
|
||||
nBonus = max(nBonus, GetItemPropertyCostTableValue(ipTest));
|
||||
nBonus = PRCMax(nBonus, GetItemPropertyCostTableValue(ipTest));
|
||||
|
||||
ipTest = GetNextItemProperty(oSmaller);
|
||||
}
|
||||
|
@@ -28,7 +28,7 @@ void main()
|
||||
int nDamageType = GetLocalInt(oDragon, "BarrierDamageType");
|
||||
int nDiceType = GetLocalInt(oDragon, "BarrierDiceType");
|
||||
int nDiceNumber = GetLocalInt(oDragon, "BarrierDiceNumber");
|
||||
int nSaveDC = 10 + GetHitDice(oDragon) / 2 + max(GetAbilityModifier(ABILITY_CONSTITUTION, oDragon), 0);
|
||||
int nSaveDC = 10 + GetHitDice(oDragon) / 2 + PRCMax(GetAbilityModifier(ABILITY_CONSTITUTION, oDragon), 0);
|
||||
//Declare and assign personal impact visual effect.
|
||||
switch(nDamageType)
|
||||
{
|
||||
|
@@ -38,7 +38,7 @@ void main()
|
||||
int nDamageType = GetLocalInt(oDragon, "BarrierDamageType");
|
||||
int nDiceType = GetLocalInt(oDragon, "BarrierDiceType");
|
||||
int nDiceNumber = GetLocalInt(oDragon, "BarrierDiceNumber");
|
||||
int nSaveDC = 10 + GetHitDice(oDragon) / 2 + max(GetAbilityModifier(ABILITY_CONSTITUTION, oDragon), 0);
|
||||
int nSaveDC = 10 + GetHitDice(oDragon) / 2 + PRCMax(GetAbilityModifier(ABILITY_CONSTITUTION, oDragon), 0);
|
||||
//Declare and assign personal impact visual effect.
|
||||
switch (nDamageType)
|
||||
{
|
||||
|
@@ -54,7 +54,7 @@ void ControlledRegeneration(object oTarget, int nRegenRate)
|
||||
|
||||
if (nCurrentHP < nInitialHP)
|
||||
{
|
||||
int nHealAmount = min(nRegenRate, nInitialHP - nCurrentHP); // Ensure not to heal beyond the initial hit points
|
||||
int nHealAmount = PRCMin(nRegenRate, nInitialHP - nCurrentHP); // Ensure not to heal beyond the initial hit points
|
||||
if(DEBUG) DoDebug( "rs_regen_wounds > ControlledRegeneration: Healing " + IntToString(nHealAmount) + " HP.");
|
||||
effect eFakeRegen = EffectHeal(nHealAmount);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eFakeRegen, oTarget);
|
||||
|
@@ -84,7 +84,7 @@ void main()
|
||||
if (GetLocalInt(oTarget, "PRCCombat_StruckByAttack"))
|
||||
{
|
||||
//ActionCastSpell(SPELL_TOUCH_OF_IDIOCY, 5, 0, 0, METAMAGIC_NONE, CLASS_TYPE_INVALID, FALSE, TRUE, oTarget);
|
||||
DoRacialSLA(SPELL_CHAIN_LIGHTNING, 15, max(19, 16 + GetAbilityModifier(ABILITY_CHARISMA, oPC)), TRUE);
|
||||
DoRacialSLA(SPELL_CHAIN_LIGHTNING, 15, PRCMax(19, 16 + GetAbilityModifier(ABILITY_CHARISMA, oPC)), TRUE);
|
||||
SetLegacyUses(oPC, nSLA);
|
||||
}
|
||||
}
|
||||
|
@@ -40,7 +40,7 @@ void main()
|
||||
nCasterLevel = 10;
|
||||
nSpell = SPELL_LIGHTNING_BOLT;
|
||||
nUses = 3;
|
||||
nDC = max(14, 13 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
nDC = PRCMax(14, 13 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
break;
|
||||
}
|
||||
case WOL_KAMATE_CHAIN:
|
||||
@@ -48,7 +48,7 @@ void main()
|
||||
nCasterLevel = 15;
|
||||
nSpell = SPELL_CHAIN_LIGHTNING;
|
||||
nUses = 1;
|
||||
nDC = max(16, 14 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
nDC = PRCMax(16, 14 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
break;
|
||||
}
|
||||
case WOL_KAMATE_TRUE_STRIKE:
|
||||
|
@@ -40,7 +40,7 @@ void main()
|
||||
nCasterLevel = 5;
|
||||
nSpell = SPELL_FLARE;
|
||||
nUses = 999;
|
||||
nDC = max(10, 10 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
nDC = PRCMax(10, 10 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
break;
|
||||
}
|
||||
case WOL_RAVENKIND_DETECT_UNDEAD:
|
||||
@@ -55,7 +55,7 @@ void main()
|
||||
nCasterLevel = 10;
|
||||
nSpell = SPELL_HALT_UNDEAD;
|
||||
nUses = 2;
|
||||
nDC = max(14, 13 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
nDC = PRCMax(14, 13 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
break;
|
||||
}
|
||||
case WOL_RAVENKIND_CURE:
|
||||
@@ -63,7 +63,7 @@ void main()
|
||||
nCasterLevel = 5;
|
||||
nSpell = SPELL_CURE_LIGHT_WOUNDS;
|
||||
nUses = 3;
|
||||
nDC = max(11, 11 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
nDC = PRCMax(11, 11 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
break;
|
||||
}
|
||||
case WOL_RAVENKIND_DAYLIGHT:
|
||||
@@ -92,7 +92,7 @@ void main()
|
||||
nCasterLevel = 20;
|
||||
nSpell = SPELL_MASS_HEAL;
|
||||
nUses = 3;
|
||||
nDC = max(23, 19 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
nDC = PRCMax(23, 19 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -64,7 +64,7 @@ void main()
|
||||
nCasterLevel = 15;
|
||||
nSpell = SPELL_BANISHMENT;
|
||||
nUses = 1;
|
||||
nDC = max(20, 17 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
nDC = PRCMax(20, 17 + GetAbilityModifier(ABILITY_CHARISMA, oPC));
|
||||
break;
|
||||
}
|
||||
case WOL_THAAS_TELEPORT:
|
||||
|
Reference in New Issue
Block a user