forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
230 lines
7.3 KiB
Plaintext
230 lines
7.3 KiB
Plaintext
//:://////////////////////////////////////////////////
|
|
//:: X0_CH_HEN_SPAWN
|
|
//:: Copyright (c) 2002 Floodgate Entertainment
|
|
//:://////////////////////////////////////////////////
|
|
/*
|
|
Henchman-specific OnSpawn handler for XP1. Based on NW_CH_AC9 by Bioware.
|
|
*/
|
|
//:://////////////////////////////////////////////////
|
|
//:: Created By: Naomi Novik
|
|
//:: Created On: 10/09/2002
|
|
//:://////////////////////////////////////////////////
|
|
#include "prc_alterations"
|
|
#include "x0_inc_henai"
|
|
//#include "x2_inc_banter"
|
|
//#include "x2_inc_globals"
|
|
|
|
// * there are only a couple potential interjections henchmen can say in c3
|
|
void StrikeOutStrings(object oNathyrra)
|
|
{
|
|
SetLocalString(oNathyrra, "X2_L_RANDOMONELINERS", "26|27|28|29|30|");
|
|
SetLocalString(oNathyrra, "X2_L_RANDOM_INTERJECTIONS", "6|7|");
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// NW_CH_ACANI9
|
|
//Sets up the special henchmen listening patterns
|
|
SetAssociateListenPatterns();
|
|
|
|
// Set additional henchman listening patterns
|
|
bkSetListeningPatterns();
|
|
|
|
// Default behavior for henchmen at start
|
|
SetAssociateState(NW_ASC_POWER_CASTING);
|
|
SetAssociateState(NW_ASC_HEAL_AT_50);
|
|
SetAssociateState(NW_ASC_RETRY_OPEN_LOCKS);
|
|
SetAssociateState(NW_ASC_DISARM_TRAPS);
|
|
SetAssociateState(NW_ASC_MODE_DEFEND_MASTER, FALSE);
|
|
|
|
//Use melee weapons by default
|
|
SetAssociateState(NW_ASC_USE_RANGED_WEAPON, FALSE);
|
|
|
|
// Distance: make henchmen stick closer
|
|
SetAssociateState(NW_ASC_DISTANCE_4_METERS);
|
|
if (GetAssociateType(OBJECT_SELF) == ASSOCIATE_TYPE_HENCHMAN)
|
|
{
|
|
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
|
}
|
|
|
|
// Set starting location
|
|
SetAssociateStartLocation();
|
|
|
|
return ;
|
|
|
|
|
|
string sAreaTag = GetTag(GetArea(OBJECT_SELF));
|
|
string sModuleTag = GetTag(GetModule());
|
|
string sMyTag = GetTag(OBJECT_SELF);
|
|
|
|
|
|
// * Setup how many random interjectiosn and popups they have
|
|
if (sMyTag == "x2_hen_deekin")
|
|
{
|
|
SetNumberOfRandom("X2_L_RANDOMONELINERS", OBJECT_SELF, 50);
|
|
SetNumberOfRandom("X2_L_RANDOM_INTERJECTIONS", OBJECT_SELF, 10);
|
|
}
|
|
else
|
|
if (sMyTag == "x2_hen_daelan")
|
|
{
|
|
SetNumberOfRandom("X2_L_RANDOMONELINERS", OBJECT_SELF, 20);
|
|
SetNumberOfRandom("X2_L_RANDOM_INTERJECTIONS", OBJECT_SELF, 2);
|
|
}
|
|
else
|
|
if (sMyTag == "x2_hen_linu")
|
|
{
|
|
SetNumberOfRandom("X2_L_RANDOMONELINERS", OBJECT_SELF, 20);
|
|
SetNumberOfRandom("X2_L_RANDOM_INTERJECTIONS", OBJECT_SELF, 2);
|
|
}
|
|
else
|
|
if (sMyTag == "x2_hen_sharwyn")
|
|
{
|
|
SetNumberOfRandom("X2_L_RANDOMONELINERS", OBJECT_SELF, 20);
|
|
SetNumberOfRandom("X2_L_RANDOM_INTERJECTIONS", OBJECT_SELF, 4);
|
|
}
|
|
else
|
|
if (sMyTag == "x2_hen_tomi")
|
|
{
|
|
SetNumberOfRandom("X2_L_RANDOMONELINERS", OBJECT_SELF, 20);
|
|
SetNumberOfRandom("X2_L_RANDOM_INTERJECTIONS", OBJECT_SELF, 4);
|
|
}
|
|
else
|
|
if (sMyTag == "H2_Aribeth")
|
|
{
|
|
SetNumberOfRandom("X2_L_RANDOMONELINERS", OBJECT_SELF, 20);
|
|
SetNumberOfRandom("X2_L_RANDOM_INTERJECTIONS", OBJECT_SELF, 2);
|
|
}
|
|
else
|
|
// * valen and Nathyrra have certain random lines that only show up in
|
|
// * in Chapter 2 (Chapter 3 they'll get this variable set on them
|
|
// * as well, with different numbers)
|
|
// * Basically #1-5 are Chapter 2 only, 26-30 are Chapter 3 only. The rest can show up anywhere
|
|
if (sMyTag == "x2_hen_nathyra" || sMyTag == "x2_hen_valen")
|
|
{
|
|
// * only fire this in Chapter 2. THey setup differently in the transition from C2 to C3
|
|
if (GetTag(GetModule()) == "x0_module2")
|
|
{
|
|
SetNumberOfRandom("X2_L_RANDOMONELINERS", OBJECT_SELF, 25);
|
|
SetNumberOfRandom("X2_L_RANDOM_INTERJECTIONS", OBJECT_SELF, 3);
|
|
}
|
|
else
|
|
{
|
|
StrikeOutStrings(OBJECT_SELF);
|
|
}
|
|
|
|
}
|
|
|
|
//Sets up the special henchmen listening patterns
|
|
SetAssociateListenPatterns();
|
|
|
|
// Set additional henchman listening patterns
|
|
bkSetListeningPatterns();
|
|
|
|
// Default behavior for henchmen at start
|
|
SetAssociateState(NW_ASC_POWER_CASTING);
|
|
SetAssociateState(NW_ASC_HEAL_AT_50);
|
|
SetAssociateState(NW_ASC_RETRY_OPEN_LOCKS);
|
|
SetAssociateState(NW_ASC_DISARM_TRAPS);
|
|
|
|
// * July 2003. Set this to true so henchmen
|
|
// * will hopefully run off a little less often
|
|
// * by default
|
|
// * September 2003. Bad decision. Reverted back
|
|
// * to original. This mode too often looks like a bug
|
|
// * because they hang back and don't help each other out.
|
|
//SetAssociateState(NW_ASC_MODE_DEFEND_MASTER, TRUE);
|
|
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
|
|
|
// * Companions, come in, by default with Attack Nearest Enemy && Follow Master modes
|
|
SetLocalInt(OBJECT_SELF,"NW_COM_MODE_COMBAT",ASSOCIATE_COMMAND_ATTACKNEAREST);
|
|
SetLocalInt(OBJECT_SELF,"NW_COM_MODE_MOVEMENT",ASSOCIATE_COMMAND_FOLLOWMASTER);
|
|
|
|
|
|
//Use melee weapons by default
|
|
SetAssociateState(NW_ASC_USE_RANGED_WEAPON, FALSE);
|
|
|
|
// Set starting location
|
|
SetAssociateStartLocation();
|
|
|
|
// Set respawn location
|
|
SetRespawnLocation();
|
|
|
|
// For some general behavior while we don't have a master,
|
|
// let's do some immobile animations
|
|
SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
|
|
|
|
// **************************************
|
|
// * CHAPTER 1
|
|
// * Kill henchmen who spawn in
|
|
// * to any area for the first time
|
|
// * in Undermountain.
|
|
// **************************************
|
|
|
|
// SetIsDestroyable(FALSE, TRUE, TRUE);
|
|
|
|
// * September 2003
|
|
// * Scan through all equipped items and make
|
|
// * sure they are identified
|
|
int i = 0;
|
|
object oItem;
|
|
for (i = INVENTORY_SLOT_HEAD; i<=INVENTORY_SLOT_CARMOUR; i++)
|
|
{
|
|
oItem = GetItemInSlot(i, OBJECT_SELF);
|
|
if (GetIsObjectValid(oItem) == TRUE)
|
|
SetIdentified( oItem, TRUE);
|
|
}
|
|
|
|
// *
|
|
// * Special CHAPTER 1 - XP2
|
|
// * Levelup code
|
|
// *
|
|
if (sModuleTag == "x0_module1" && GetLocalInt(GetModule(), "X2_L_XP2") == TRUE)
|
|
{
|
|
if (GetLocalInt(OBJECT_SELF, "X2_KilledInUndermountain") == 1)
|
|
return;
|
|
SetLocalInt(OBJECT_SELF, "X2_KilledInUndermountain", 1);
|
|
|
|
//Level up henchman to level 13 if in Starting Room
|
|
//Join script will level them up correctly once hired
|
|
if (sAreaTag == "q2a_yawningportal" )
|
|
{
|
|
int nLevel = 1;
|
|
for (nLevel = 1; nLevel < 14; nLevel++)
|
|
{
|
|
LevelUpHenchman(OBJECT_SELF);
|
|
}
|
|
}
|
|
//'kill the henchman'
|
|
|
|
// * do not kill if spawning in main room
|
|
string szAreaTag = GetTag(GetArea(OBJECT_SELF));
|
|
if (szAreaTag != "q2a_yawningportal" && szAreaTag != "q2c_um2east")
|
|
{
|
|
// effect eDamage = EffectDamage(500);
|
|
// DelayCommand(10.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, OBJECT_SELF));
|
|
|
|
}
|
|
}
|
|
|
|
// * Nathyrra in Chapter 1 is not allowed to have her inventory fiddled with
|
|
if (sMyTag == "x2_hen_nathyrra" && sModuleTag == "x0_module1")
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "X2_JUST_A_DISABLEEQUIP", 1);
|
|
}
|
|
|
|
|
|
// *
|
|
// * if I am Aribeth then do my special level-up
|
|
// *
|
|
if (sMyTag == "H2_Aribeth")
|
|
{
|
|
LevelUpAribeth(OBJECT_SELF);
|
|
}
|
|
|
|
SetLocalInt(OBJECT_SELF,"NW_COM_MODE_COMBAT",ASSOCIATE_COMMAND_ATTACKNEAREST);
|
|
SetLocalInt(OBJECT_SELF,"NW_COM_MODE_MOVEMENT",ASSOCIATE_COMMAND_FOLLOWMASTER);
|
|
|
|
|
|
}
|
|
|