2025/08/05 Update
Added Regenerate Ring spell. Added Regenerate Circle spell. Added Leonal's Roar spell. Added Summon Nature's Ally I-IX spells. Added Lion of Talisid PrC. Added Favored of the Companions Feat. Corrected Regenerate Serious Wounds level. Corrected Regenerate Critical Wounds level. Removed Baelnorn class and added Baelnorn template.
This commit is contained in:
114
nwn/nwnprc/trunk/scripts/fot_lions_swift.nss
Normal file
114
nwn/nwnprc/trunk/scripts/fot_lions_swift.nss
Normal file
@@ -0,0 +1,114 @@
|
||||
//::////////////////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
Lion<6F>s Swiftness (Ex)
|
||||
When he reaches 7th level, a lion of Talisid can act as if
|
||||
under the effects of a haste spell for a total of 1
|
||||
round per class level per day. These rounds need not be
|
||||
consecutive
|
||||
*/
|
||||
//::
|
||||
//::////////////////////////////////////////////////////////
|
||||
#include "prc_alterations"
|
||||
|
||||
const string VAR_LS_REMAINING = "LION_SWIFTNESS_ROUNDS_REMAINING";
|
||||
const string VAR_LS_ACTIVE = "LION_SWIFTNESS_ACTIVE";
|
||||
const float ROUND_LENGTH = 6.0;
|
||||
|
||||
void RemoveLionSwiftness(object oPC)
|
||||
{
|
||||
// Remove haste effect tag if present (custom tag for safety)
|
||||
effect eEffect = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(eEffect))
|
||||
{
|
||||
if (GetEffectTag(eEffect) == "LIONS_SWIFTNESS")
|
||||
{
|
||||
RemoveEffect(oPC, eEffect);
|
||||
}
|
||||
eEffect = GetNextEffect(oPC);
|
||||
}
|
||||
|
||||
DeleteLocalInt(oPC, VAR_LS_ACTIVE);
|
||||
SendMessageToPC(oPC, "Lion's Swiftness ends.");
|
||||
int nRemaining = GetLocalInt(oPC, VAR_LS_REMAINING);
|
||||
//SendMessageToPC(oPC, "You have "+IntToString(nRemaining)+" round(s) remaining of Lion<6F>s Swiftness for today.");
|
||||
FloatingTextStringOnCreature("You have "+IntToString(nRemaining)+" round(s) of Lion<6F>s Swiftness remaining for today.", oPC, FALSE);
|
||||
|
||||
}
|
||||
|
||||
void TickLionSwiftness(object oPC)
|
||||
{
|
||||
if (!GetLocalInt(oPC, VAR_LS_ACTIVE)) return;
|
||||
|
||||
int nRemaining = GetLocalInt(oPC, VAR_LS_REMAINING);
|
||||
if (nRemaining <= 1)
|
||||
{
|
||||
DeleteLocalInt(oPC, VAR_LS_REMAINING);
|
||||
RemoveLionSwiftness(oPC);
|
||||
return;
|
||||
}
|
||||
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_HASTE);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
|
||||
SetLocalInt(oPC, VAR_LS_REMAINING, nRemaining - 1);
|
||||
DelayCommand(ROUND_LENGTH, TickLionSwiftness(oPC));
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
object oPC = OBJECT_SELF;
|
||||
int nLevel = GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC);
|
||||
if (nLevel <= 0) return;
|
||||
|
||||
int bActive = GetLocalInt(oPC, VAR_LS_ACTIVE);
|
||||
|
||||
if (bActive)
|
||||
{
|
||||
RemoveLionSwiftness(oPC);
|
||||
return;
|
||||
}
|
||||
|
||||
int nRemaining = GetLocalInt(oPC, VAR_LS_REMAINING);
|
||||
if (nRemaining <= 0)
|
||||
{
|
||||
SendMessageToPC(oPC, "You have no remaining rounds of Lion<6F>s Swiftness today.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Apply Haste-like effect manually
|
||||
effect eHaste = EffectHaste();
|
||||
eHaste = EffectLinkEffects(eHaste, ExtraordinaryEffect(eHaste));
|
||||
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_HASTE);
|
||||
|
||||
eHaste = TagEffect(eHaste, "LIONS_SWIFTNESS");
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHaste, oPC, 9999.0);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
|
||||
SetLocalInt(oPC, VAR_LS_ACTIVE, TRUE);
|
||||
SendMessageToPC(oPC, "Lion's Swiftness activated.");
|
||||
|
||||
// Decrement round count and continue ticking
|
||||
TickLionSwiftness(oPC);
|
||||
}
|
||||
|
||||
|
||||
/* void main()
|
||||
{
|
||||
object oPC = OBJECT_SELF;
|
||||
|
||||
if (GetHasSpellEffect(PRCGetSpellId(), oPC))
|
||||
PRCRemoveSpellEffects(PRCGetSpellId(), oPC, oPC);
|
||||
else
|
||||
{
|
||||
int nDuel = GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC);
|
||||
int nAC = 2;
|
||||
if (GetSkillRank(SKILL_TUMBLE, oPC, TRUE) >= 5) nAC++;
|
||||
if (nDuel >= 7) nAC += nDuel;
|
||||
effect eLink = EffectLinkEffects(EffectACIncrease(nAC, AC_DODGE_BONUS), EffectAttackDecrease(4));
|
||||
eLink = ExtraordinaryEffect(eLink);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
}
|
||||
} */
|
49
nwn/nwnprc/trunk/scripts/ft_favcompanions.nss
Normal file
49
nwn/nwnprc/trunk/scripts/ft_favcompanions.nss
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Favored of the Companions.
|
||||
|
||||
[EXALTED]
|
||||
You swear allegiance to Talisid or one of the Five Companions,
|
||||
the paragons of the guardinals, and in exchange gain power to
|
||||
act on their behalf.
|
||||
Benefit: Once per day, while performing an act of good, you
|
||||
may call upon your guardinal patron to gain a +1 luck bonus on
|
||||
any one roll or check.
|
||||
Special: Once you take this feat, you may not take it again,
|
||||
nor can you take either the Servant of the Heavens feat or the
|
||||
Knight of Stars feat. Your allegiance is only yours to give once.
|
||||
|
||||
*/
|
||||
|
||||
#include "prc_inc_skin"
|
||||
#include "prc_feat_const"
|
||||
|
||||
void main(){
|
||||
|
||||
//Declare major variables
|
||||
object oTarget;
|
||||
object oSkin = GetPCSkin(OBJECT_SELF);
|
||||
effect ePosVis = EffectVisualEffect(VFX_IMP_HOLY_AID);
|
||||
|
||||
int nBonus = 1;
|
||||
effect eBonAttack = EffectAttackIncrease(nBonus);
|
||||
effect eBonSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, nBonus);
|
||||
effect eBonDam = EffectDamageIncrease(nBonus, DAMAGE_TYPE_SLASHING);
|
||||
effect eBonSkill = EffectSkillIncrease(SKILL_ALL_SKILLS, nBonus);
|
||||
effect ePosDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
||||
|
||||
effect ePosLink = EffectLinkEffects(eBonAttack, eBonSave);
|
||||
ePosLink = EffectLinkEffects(ePosLink, eBonDam);
|
||||
ePosLink = EffectLinkEffects(ePosLink, eBonSkill);
|
||||
ePosLink = EffectLinkEffects(ePosLink, ePosDur);
|
||||
|
||||
|
||||
if (GetAlignmentGoodEvil(OBJECT_SELF) == ALIGNMENT_GOOD){
|
||||
|
||||
//Fire spell cast at event for target
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_PRAYER, FALSE));
|
||||
//Apply VFX impact and bonus effects
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, ePosVis, OBJECT_SELF);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePosLink, OBJECT_SELF, 9.0);
|
||||
}
|
||||
|
||||
}
|
14
nwn/nwnprc/trunk/scripts/ft_spontregen.nss
Normal file
14
nwn/nwnprc/trunk/scripts/ft_spontregen.nss
Normal file
@@ -0,0 +1,14 @@
|
||||
void main()
|
||||
{
|
||||
string sSwitch = "PRC_SpontRegen";
|
||||
if(!GetLocalInt(OBJECT_SELF, sSwitch))
|
||||
{
|
||||
SetLocalInt(OBJECT_SELF, "PRC_SpontRegen", TRUE);
|
||||
FloatingTextStringOnCreature("Spontaneous regeneration spells activated", OBJECT_SELF, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "PRC_SpontRegen");
|
||||
FloatingTextStringOnCreature("Spontaneous regeneration spells de-activated", OBJECT_SELF, FALSE);
|
||||
}
|
||||
}
|
@@ -1,5 +1,29 @@
|
||||
void DestroyAllInventory(object oCreature)
|
||||
{
|
||||
object oItem = GetFirstItemInInventory(oCreature);
|
||||
while (GetIsObjectValid(oItem))
|
||||
{
|
||||
DestroyObject(oItem);
|
||||
oItem = GetNextItemInInventory(oCreature);
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
ExecuteScript("prc_npc_death", OBJECT_SELF);
|
||||
object oDead = OBJECT_SELF;
|
||||
object oMaster = GetMaster(oDead);
|
||||
|
||||
// Only destroy inventory if this creature is summoned
|
||||
if (GetIsObjectValid(oMaster))
|
||||
{
|
||||
int nType = GetAssociateType(oDead);
|
||||
|
||||
if (nType == ASSOCIATE_TYPE_SUMMONED)
|
||||
{
|
||||
DestroyAllInventory(oDead);
|
||||
}
|
||||
}
|
||||
|
||||
ExecuteScript("prc_npc_death", OBJECT_SELF);
|
||||
ExecuteScript("nw_ch_ac7", OBJECT_SELF);
|
||||
}
|
@@ -139,6 +139,9 @@ int JPMMarkerFeats();
|
||||
//:; Enforces Drow Judicator marker feats
|
||||
int JudicatorMarkerFeats();
|
||||
|
||||
//:; Enforces Lion of Talisid marker feats
|
||||
int LionofTalisidMarkerFeats();
|
||||
|
||||
//:; Enforces Mighty Contender of Kord marker feats
|
||||
int MCoKMarkerFeats();
|
||||
|
||||
@@ -2073,6 +2076,46 @@ int JudicatorMarkerFeats()
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//:; Lion of Talisid marker feats
|
||||
int LionofTalisidMarkerFeats()
|
||||
{
|
||||
if(GetLevelByClass(CLASS_TYPE_LION_OF_TALISID))
|
||||
{
|
||||
int nLion = GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_ARCHIVIST)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_CLERIC)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_DRUID)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_FAVOURED_SOUL)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_HEALER)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_JOWAW)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_KOTMC)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_NENTYAR_HUNTER)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_RANGER)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_SOHEI)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_SOL)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_OASHAMAN)
|
||||
+ GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_SPSHAMAN);
|
||||
|
||||
|
||||
|
||||
if(nLion > 1)
|
||||
{
|
||||
FloatingTextStringOnCreature("A Lion of Talisid may only advance a single divine class.", OBJECT_SELF, FALSE);
|
||||
FloatingTextStringOnCreature("Please reselect your feats.", OBJECT_SELF, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if(nLion < 1)
|
||||
{
|
||||
FloatingTextStringOnCreature("A Lion of Talisid must pick one divine class to advance at first level.", OBJECT_SELF, FALSE);
|
||||
FloatingTextStringOnCreature("Please reselect your feats.", OBJECT_SELF, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
//:; Enforces Mighty Contender of Kord marker feats
|
||||
int MCoKMarkerFeats()
|
||||
{
|
||||
@@ -4059,6 +4102,7 @@ void main()
|
||||
|| IronMindMarkerFeats()
|
||||
|| JPMMarkerFeats()
|
||||
|| JudicatorMarkerFeats()
|
||||
|| LionofTalisidMarkerFeats()
|
||||
|| MCoKMarkerFeats()
|
||||
|| MaesterMarkerFeats()
|
||||
|| MagekillerMarkerFeats()
|
||||
|
37
nwn/nwnprc/trunk/scripts/prc_imp_grab.nss
Normal file
37
nwn/nwnprc/trunk/scripts/prc_imp_grab.nss
Normal file
@@ -0,0 +1,37 @@
|
||||
// PnP Improved Grab Attack - Item Unique OnHit Script
|
||||
//
|
||||
|
||||
#include "prc_inc_combmove"
|
||||
#include "prc_misc_const"
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
object oPC = OBJECT_SELF;
|
||||
object oItem = PRCGetSpellCastItem();
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
|
||||
string sGrapplerName = GetName(oPC);
|
||||
|
||||
int GrappleBonus = GetLocalInt(oPC, "GRAPPLE_BONUS");
|
||||
int PCSize = PRCGetSizeModifier(oPC);
|
||||
int TargetSize = PRCGetSizeModifier(oTarget);
|
||||
int GrappleChance = d100();
|
||||
|
||||
|
||||
// You automatically lose an attempt to hold if the target is two or more size categories larger than you are.
|
||||
if (TargetSize - 2 >= PCSize)
|
||||
{
|
||||
FloatingTextStringOnCreature("This creature is too large to grapple.", oPC);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't try to grapple on every attack.
|
||||
if (GrappleChance >= 66)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FloatingTextStringOnCreature("The "+sGrapplerName+" is trying to grab you!", oTarget);
|
||||
DoGrapple(oPC, oTarget, GrappleBonus, FALSE, TRUE);
|
||||
}
|
30
nwn/nwnprc/trunk/scripts/prc_lot.nss
Normal file
30
nwn/nwnprc/trunk/scripts/prc_lot.nss
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
/*
|
||||
Lion<6F>s Courage (Ex): A lion of Talisid is immune to fear
|
||||
(magical or otherwise) and gains a +4 sacred bonus on Will saves
|
||||
against other mind-affecting spells and effects.
|
||||
*/
|
||||
|
||||
#include "prc_alterations"
|
||||
#include "prc_feat_const"
|
||||
#include "prc_class_const"
|
||||
|
||||
void main()
|
||||
{
|
||||
//Declare main variables.
|
||||
object oPC = OBJECT_SELF;
|
||||
object oSkin = GetPCSkin(oPC);
|
||||
|
||||
if(GetHasFeat(FEAT_LOT_LIONS_COURAGE, oPC) )
|
||||
{
|
||||
effect eFearless = EffectImmunity(IMMUNITY_TYPE_FEAR);
|
||||
effect eLink;
|
||||
|
||||
eLink = EffectLinkEffects(eFearless, eLink);
|
||||
eLink = ExtraordinaryEffect(eLink);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
SetCompositeBonus(oSkin, "LionsCourageWillBonus", 4, ITEM_PROPERTY_SAVING_THROW_BONUS, IP_CONST_SAVEVS_MINDAFFECTING);
|
||||
}
|
||||
|
||||
}
|
@@ -253,6 +253,11 @@ void Shifter(object oPC, int iArcSpell, int iDivSpell)
|
||||
//Wild Shape qualifies
|
||||
SetLocalInt(oPC, "PRC_PrereqShift", 0);
|
||||
}
|
||||
if (GetLevelByClass(CLASS_TYPE_LION_OF_TALISID) >= 3)
|
||||
{
|
||||
//Wild Shape qualifies
|
||||
SetLocalInt(oPC, "PRC_PrereqShift", 0);
|
||||
}
|
||||
//These classes have appropriate alternate forms
|
||||
if (GetLevelByClass(CLASS_TYPE_SHAMAN) >= 7)
|
||||
{
|
||||
@@ -279,12 +284,6 @@ void Shifter(object oPC, int iArcSpell, int iDivSpell)
|
||||
//Elemental Form qualifies
|
||||
SetLocalInt(oPC, "PRC_PrereqShift", 0);
|
||||
}
|
||||
//This is not strictly necessary because Witch gains Polymorph Self
|
||||
//at an earlier level, but add it here anyway for completeness:
|
||||
if (GetLevelByClass(CLASS_TYPE_WITCH) >= 13)
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_PrereqShift", 0);
|
||||
}
|
||||
|
||||
int nRace = GetRacialType(oPC);
|
||||
//These races have appropriate alternate forms
|
||||
@@ -679,6 +678,45 @@ void reqCombatMedic(object oPC)
|
||||
}
|
||||
}
|
||||
|
||||
void reqLionOfTalisid(object oPC)
|
||||
{
|
||||
//:: Get casting ability scores
|
||||
int iWis = GetAbilityScore(oPC, ABILITY_WISDOM, TRUE);
|
||||
int iInt = GetAbilityScore(oPC, ABILITY_INTELLIGENCE, TRUE);
|
||||
|
||||
//:: Check if the character knows Summon Nature's Ally II
|
||||
int bKnowsSNA2 = PRCGetIsRealSpellKnown(SPELL_SUMMON_NATURES_ALLY_2, oPC);
|
||||
|
||||
//:: Archivist (INT-based)
|
||||
if(iInt >= 12 && GetLevelByClass(CLASS_TYPE_ARCHIVIST) >= 3 && bKnowsSNA2)
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_PrereqLoT", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Druid (WIS-based)
|
||||
if(iWis >= 12 && GetLevelByClass(CLASS_TYPE_DRUID) >= 3 && bKnowsSNA2)
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_PrereqLoT", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Ranger (WIS-based) <20> Rangers get 2nd-level spells at level 6
|
||||
if(iWis >= 12 && GetLevelByClass(CLASS_TYPE_RANGER) >= 6 && bKnowsSNA2)
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_PrereqLoT", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Shaman (WIS-based)
|
||||
if(iWis >= 12 && GetLevelByClass(CLASS_TYPE_SHAMAN) >= 3 && bKnowsSNA2)
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_PrereqLoT", 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RedWizard(object oPC)
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_PrereqRedWiz", 1);
|
||||
@@ -1314,6 +1352,8 @@ void AlienistPreReqs(object oPC)
|
||||
|
||||
void AOTSPreReqs(object oPC)
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_prereq >> AOTSPreReqs: Entering function.");
|
||||
|
||||
int iArcane = 0;
|
||||
int iShadow = 0;
|
||||
|
||||
@@ -1334,6 +1374,7 @@ void AOTSPreReqs(object oPC)
|
||||
if (PRCGetCasterLevel(oPC) > 4 || GetInvokerLevel(oPC) > 4 || GetShadowcasterLevel(oPC) > 4)
|
||||
{
|
||||
SetLocalInt(oPC, "PRC_PrereqAOTS", 0);
|
||||
if(DEBUG) DoDebug("prc_prereq >> AOTSPreReqs: Unsetting varible to allow class.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1884,6 +1925,7 @@ void main()
|
||||
WildMageReq(oPC);
|
||||
Witchborn(oPC);
|
||||
reqCombatMedic(oPC);
|
||||
reqLionOfTalisid(oPC);
|
||||
// Truly massive debug message flood if activated.
|
||||
|
||||
/* if (DEBUG)
|
||||
|
@@ -21,6 +21,16 @@
|
||||
#include "shd_inc_myst"
|
||||
#include "prc_inc_template"
|
||||
|
||||
void ResetLionSwiftness(object oPC)
|
||||
{
|
||||
int nLevel = GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC);
|
||||
if (nLevel > 6)
|
||||
{
|
||||
if(DEBUG) DoDebug("You have "+IntToString(nLevel)+ " rounds of Lion's Swiftness.");
|
||||
SetLocalInt(oPC, "LION_SWIFTNESS_ROUNDS_REMAINING", nLevel);
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveExtraImages(object oPC)
|
||||
{
|
||||
string sImage1 = "PC_IMAGE"+ObjectToString(oPC)+"mirror";
|
||||
@@ -312,6 +322,8 @@ void RestFinished(object oPC)
|
||||
{
|
||||
DelayCommand(1.0, ExecuteScript("prc_reservefeat", oPC));
|
||||
}
|
||||
|
||||
ResetLionSwiftness(oPC);
|
||||
|
||||
// Execute scripts hooked to this event for the player triggering it
|
||||
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERREST_FINISHED);
|
||||
|
Reference in New Issue
Block a user