Files
PRC8/nwn/nwnprc/trunk/include/inc_npc.nss
Jaysyn904 80070703b4 2025/11/20 Update
Updated epic swashbucker tlk.
Added notes on Martial Study.
Updated Shadow Servant to scale with Shadow Master level, per PnP.
Made Disciple of Baalzebul's CHA boost intrinsic.
Swarm of Arrows is an Eldritch Knight epic bonus feat.
Epic eldritch theurge is 11th level, not 21st level.
Updated Shadowdancer weapon proficiencies.
WP: Scythe was a usable feat for Warblade.
Gaseous Form added to iprp_spells.
Set Favoured Soul's Regen X Wounds spells to the correct spell level.
Updated Twinfiend to not suck.
Tweaked GetMaxPossibleHP for Undead & Constructs.
Updated PRCIsFlying() for newer CEP2 wings.
More fixes and updated for NUI levelup menu. (@Rakiov)
Added support for de-leveling AMS classes (@Rakiov)
Zakya Rakshasa have a claw & bite attack.
Added check to end grapples after target death.
Removed debug message in GetHighestSpellAvailableByDescriptor()
Monsters won't summon uncontrolled undead.
Added Signal Event to Luminous Armor.
Corrected Signal Event on Shield of Faith.
2025-11-20 21:36:52 -05:00

224 lines
6.7 KiB
Plaintext

//::///////////////////////////////////////////////
//:: NPC associate include
//:: inc_npc
//:://////////////////////////////////////////////
/*
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
// Get the master of oAssociate.
object GetMasterNPC(object oAssociate=OBJECT_SELF);
// Returns the associate type of the specified creature.
// - Returns ASSOCIATE_TYPE_NONE if the creature is not the associate of anyone.
int GetAssociateTypeNPC( object oAssociate );
// Get the henchman belonging to oMaster.
// * Return OBJECT_INVALID if oMaster does not have a henchman.
// -nNth: Which henchman to return.
object GetHenchmanNPC(object oMaster=OBJECT_SELF,int nNth=1);
// Get the associate of type nAssociateType belonging to oMaster.
// - nAssociateType: ASSOCIATE_TYPE_*
// - nMaster
// - nTh: Which associate of the specified type to return
// * Returns OBJECT_INVALID if no such associate exists.
object GetAssociateNPC(int nAssociateType, object oMaster=OBJECT_SELF, int nTh=1);
// Returns TRUE if the specified condition flag is set on
// the associate.
int GetAssociateStateNPC(int nCondition, object oAssoc=OBJECT_SELF);
// Determine if this henchman is currently dying
int GetIsHenchmanDyingNPC(object oHench=OBJECT_SELF);
// Determine if Should I Heal My Master
int GetAssociateHealMasterNPC();
// Create the next AssociateType creature
object CreateLocalNextNPC(object oMaster,int nAssociateType,string sTemplate,location loc,string sTag="");
// Create a AssociateType creature
object CreateLocalNPC(object oMaster,int nAssociateType,string sTemplate,location loc,int Nth=1,string sTag="");
#include "prc_inc_function"
#include "x0_i0_assoc"
void SetLocalNPC(object oMaster,object oAssociate,int nAssociateType ,int nNth=1)
{
SetLocalObject(oAssociate, "oMaster", oMaster);
SetLocalInt(oAssociate, "iAssocType", nAssociateType);
SetLocalObject(oMaster, IntToString(nAssociateType)+"oHench"+IntToString(nNth), oAssociate);
SetLocalInt(oAssociate, "iAssocNth", nNth);
}
void DeleteLocalNPC(object oAssociate=OBJECT_SELF)
{
int nType = GetLocalInt(oAssociate, "iAssocType");
object oMaster = GetMasterNPC(oAssociate);
int Nth = GetLocalInt(oAssociate, "iAssocNth");
DeleteLocalInt(oMaster, IntToString(nType)+"oHench"+IntToString(Nth));
DeleteLocalInt(oAssociate, "iAssocNth");
DeleteLocalObject(oAssociate, "oMaster");
DeleteLocalInt(oAssociate, "iAssocType");
}
void DestroySummon(object oSummon)
{
effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eVis, GetLocation(oSummon));
DeleteLocalNPC(oSummon);
DestroyObject(oSummon);
}
object CreateLocalNPC(object oMaster,int nAssociateType,string sTemplate,location loc,int Nth=1,string sTag="")
{
object oSummon=CreateObject(OBJECT_TYPE_CREATURE,sTemplate,loc,FALSE,sTag);
SetLocalNPC(oMaster,oSummon,nAssociateType ,Nth);
SetAssociateState(NW_ASC_HAVE_MASTER,TRUE,oSummon);
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
if (nAssociateType == ASSOCIATE_TYPE_FAMILIAR) SetLocalInt(oMaster, "FamiliarToTheDeath", 100);
if (nAssociateType == ASSOCIATE_TYPE_ANIMALCOMPANION) SetLocalInt(oMaster, "AniCompToTheDeath", 100);
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oSummon));
return oSummon;
}
object CreateLocalNextNPC(object oMaster,int nAssociateType,string sTemplate,location loc,string sTag="")
{
object oSummon=CreateObject(OBJECT_TYPE_CREATURE,sTemplate,loc,FALSE,sTag);
int nCount=1;
while (GetIsObjectValid(GetAssociateNPC(ASSOCIATE_TYPE_SUMMONED,OBJECT_SELF,nCount)))
{
nCount++;
SendMessageToPC(OBJECT_SELF," nCount:"+IntToString(nCount));
}
SetLocalObject(oSummon, "oMaster", oMaster);
SetLocalInt(oSummon, "iAssocType", nAssociateType);
SetLocalObject(oMaster, IntToString(nAssociateType)+"oHench"+IntToString(nCount), oSummon);
SetLocalInt(oSummon, "iAssocNth", nCount);
SetAssociateState(NW_ASC_HAVE_MASTER, TRUE, oSummon);
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
if (nAssociateType ==ASSOCIATE_TYPE_FAMILIAR) SetLocalInt(oMaster, "FamiliarToTheDeath", 100);
if (nAssociateType ==ASSOCIATE_TYPE_ANIMALCOMPANION) SetLocalInt(oMaster, "AniCompToTheDeath", 100);
return oSummon;
}
object GetMasterNPC(object oAssociate=OBJECT_SELF)
{
object oMaster = GetLocalObject(oAssociate, "oMaster");
if (GetIsObjectValid(oMaster))
return oMaster;
else
return GetMaster(oAssociate);
}
int GetAssociateTypeNPC( object oAssociate )
{
int iType = GetLocalInt(oAssociate, "iAssocType");
if (iType)
return iType;
else
return GetAssociateType(oAssociate);
}
object GetHenchmanNPC(object oMaster=OBJECT_SELF,int nNth=1)
{
object oAssociate = GetLocalObject(oMaster,IntToString(ASSOCIATE_TYPE_HENCHMAN)+"oHench"+IntToString(nNth));
if (GetIsObjectValid(oAssociate))
return oAssociate;
else
return GetHenchman(oMaster,nNth);
}
object GetAssociateNPC(int nAssociateType, object oMaster=OBJECT_SELF, int nTh=1)
{
object oAssociate = GetLocalObject(oMaster,IntToString(nAssociateType)+"oHench"+IntToString(nTh));
if (GetIsObjectValid(oAssociate))
return oAssociate;
else
return GetAssociate(nAssociateType,oMaster,nTh);
}
int GetAssociateStateNPC(int nCondition, object oAssoc=OBJECT_SELF)
{
//SpawnScriptDebugger();
if(nCondition == NW_ASC_HAVE_MASTER)
{
if(GetIsObjectValid(GetMasterNPC(oAssoc)))
return TRUE;
}
else
{
int nPlot = GetLocalInt(oAssoc, sAssociateMasterConditionVarname);
if(nPlot & nCondition)
return TRUE;
}
return FALSE;
}
int GetIsHenchmanDyingNPC(object oHench=OBJECT_SELF)
{
int bHenchmanDying = GetAssociateStateNPC(NW_ASC_MODE_DYING, oHench);
if (bHenchmanDying == TRUE)
{
return TRUE;
}
else
{
return FALSE;
}
}
int GetAssociateHealMasterNPC()
{
if(GetAssociateStateNPC(NW_ASC_HAVE_MASTER))
{
object oMaster = GetMasterNPC();
int nLoss = GetPercentageHPLoss(oMaster);
if(!GetIsDead(oMaster))
{
if(GetAssociateStateNPC(NW_ASC_HEAL_AT_75) && nLoss <= 75)
{
return TRUE;
}
else if(GetAssociateStateNPC(NW_ASC_HEAL_AT_50) && nLoss <= 50)
{
return TRUE;
}
else if(GetAssociateStateNPC(NW_ASC_HEAL_AT_25) && nLoss <= 25)
{
return TRUE;
}
}
}
return FALSE;
}