321 lines
9.6 KiB
Plaintext
321 lines
9.6 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: x1_playerrest
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
This script controls what should happen when
|
|
the player rests.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
#include "x0_i0_henchman"
|
|
#include "ff_include"
|
|
// * these constants copied from q3_inc_plot
|
|
// values for Q3_GNOLL_STATUS:
|
|
int GNOLL_STATUS_INIT = 0; // initial status
|
|
int GNOLL_STATUS_LEFT = 1; // all gnoll left the area
|
|
int GNOLL_STATUS_DEAD = 2; // chief is dead
|
|
int GNOLL_STATUS_SAFE_PASSAGE = 3; // gnollsgave safe passge
|
|
int GNOLL_STATUS_CONTROL_TRIBE= 4; // player has full control over the tribe
|
|
|
|
// values for Q3_GNOLL_HELP
|
|
int GNOLL_NOHELP = 0;
|
|
int GNOLL_HELP = 1;
|
|
|
|
// * Am I NOT on a safe rest trigger?
|
|
int NotOnSafeRest(object oPC);
|
|
// * Am I in a place where it is not safe to rest?
|
|
int NotSafeToRest(object oPC);
|
|
|
|
void main()
|
|
{ // SpawnScriptDebugger();
|
|
int nRest = GetLastRestEventType();
|
|
object oPC = GetLastPCRested();
|
|
if (nRest == REST_EVENTTYPE_REST_STARTED)
|
|
{
|
|
object oHench = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
|
|
|
|
|
|
// * rest started, if I have a henchman
|
|
// * who is dying, abort the rest
|
|
if (GetIsObjectValid(oHench) && GetIsHenchmanDying(oHench))
|
|
{
|
|
AssignCommand(oPC, ClearAllActions());
|
|
AssignCommand(oHench, ClearAllActions());
|
|
SetCommandable(TRUE, oHench);
|
|
// * clear previous animatioms...
|
|
AssignCommand(oHench,
|
|
PlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK,
|
|
1.0, 1.0));
|
|
AssignCommand(oHench, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0, HENCHMEN_DIE_ANIM_DURATION));
|
|
SetCommandable(TRUE, oHench);
|
|
FloatingTextStrRefOnCreature(40051, oPC);
|
|
}
|
|
else
|
|
if (NotSafeToRest(oPC) == TRUE)
|
|
{
|
|
if (NotOnSafeRest(oPC) == TRUE)
|
|
{
|
|
AssignCommand(oPC, ClearAllActions());
|
|
AssignCommand(oHench, ClearAllActions());
|
|
FloatingTextStrRefOnCreature(40156, oPC);
|
|
// AssignCommand(oPC, SpeakString("blah"));
|
|
}
|
|
}
|
|
}
|
|
ff_FlushData(oPC);
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: NotSafeToRest
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Returns TRUE if this is an area that the
|
|
player is not allowed to rest in and the condition
|
|
is not achieved.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
int NotSafeToRest(object oPC)
|
|
{
|
|
|
|
// * The resting system only works on Hardcore
|
|
// * or above.
|
|
if (GetGameDifficulty() < GAME_DIFFICULTY_CORE_RULES)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
string sTag = GetTag(GetArea(oPC));
|
|
int nNotSafe = FALSE;
|
|
if (sTag == "Q3_HighForestGnollCaves")
|
|
{
|
|
|
|
nNotSafe = TRUE;
|
|
|
|
int nStatus = GetLocalInt(GetModule(), "Q3_GNOLL_STATUS");
|
|
if(nStatus == GNOLL_STATUS_SAFE_PASSAGE ||
|
|
nStatus == GNOLL_STATUS_CONTROL_TRIBE ||
|
|
nStatus == GNOLL_STATUS_LEFT ||
|
|
nStatus == GNOLL_STATUS_DEAD)
|
|
{
|
|
nNotSafe = FALSE;
|
|
}
|
|
|
|
int nHelp = GetLocalInt(GetModule(), "Q3_GNOLL_HELP");
|
|
if (nHelp == GNOLL_HELP)
|
|
{
|
|
nNotSafe = FALSE;
|
|
}
|
|
|
|
} // GNOLL CAVES
|
|
else
|
|
if (sTag == "Q3C_AncientTemple")
|
|
{
|
|
nNotSafe = TRUE;
|
|
if (GetLocalInt(GetModule(), "X1_JNAHPLOT") == 10 || GetLocalInt(GetModule(), "X1_JNAH_STATUS") == 3)
|
|
{
|
|
nNotSafe = FALSE;
|
|
}
|
|
} // Ancient Temple
|
|
else
|
|
if (sTag == "q5_KoboldCaves")
|
|
{
|
|
nNotSafe = TRUE;
|
|
if (GetLocalInt(GetModule(), "X1_TYMOFARRAR_STATUS") == 2 ||
|
|
GetLocalInt(GetModule(), "X1_Q5CHAMPION" ) > 10 ||
|
|
GetLocalInt(GetModule(), "X1_CHIEFARZIGDEAD" ) ==1)
|
|
{
|
|
nNotSafe = FALSE;
|
|
}
|
|
} // Kobold Caves
|
|
else
|
|
if (sTag == "Q5_DragonCaves")
|
|
{
|
|
nNotSafe = TRUE;
|
|
if (GetLocalInt(GetModule(), "X1_TYMOFARRAR_STATUS") > 1)
|
|
{
|
|
nNotSafe = FALSE;
|
|
}
|
|
|
|
} // dragon caves
|
|
else if(sTag == "q1_StingerCaves")
|
|
{
|
|
nNotSafe = TRUE;
|
|
}
|
|
else if(sTag == "q1_StingerCavesTemple")
|
|
{
|
|
nNotSafe = TRUE;
|
|
}
|
|
else if(sTag == "q2d_TombofKelGaras")
|
|
{
|
|
nNotSafe = TRUE;
|
|
}
|
|
else if(sTag == "q2e_TombofKelGarasInnerCatacombs")
|
|
{
|
|
nNotSafe = TRUE;
|
|
}
|
|
else if(sTag == "q3b_AnaurochExcavatedRuins")
|
|
{
|
|
nNotSafe = TRUE;
|
|
}
|
|
else if(sTag == "q3c_FormiansHive")
|
|
{
|
|
nNotSafe = TRUE;
|
|
if(GetLocalInt(GetModule(), "Q3C_HIVE_NOT_HOSTILE") == 1)
|
|
{
|
|
nNotSafe = FALSE;
|
|
}
|
|
}
|
|
else if(sTag == "q4_AbovetheCityofUdrentide")
|
|
{
|
|
nNotSafe = TRUE;
|
|
}
|
|
/* Chapter 2 Resting Specifics
|
|
Allow Resting When "bAllowRest" (saved on the area) = TRUE:
|
|
1) Area Tag: "Undrentide_01" (When Ashtara's Quest is Complete)
|
|
2) Area Tag: "Undrentide_02" (When Ashtara's Quest is Complete)
|
|
3) Area Tag: "Undrentide_03" (When Ashtara's Quest is Complete)
|
|
4) Area Tag: "Undrentide_04" (When Ashtara's Quest is Complete)
|
|
5) Area Tag: "Crypt_01" (When all sarcophagi are destroyed)
|
|
6) Area Tag: "Crypt_03" (When all undead in the area are destroyed)
|
|
7) Area Tag: "Crypt_04" (When the Dead Wind is obtained)
|
|
8) Area Tag: "Wizard_04" (When the Portable Door is obtained)
|
|
9) Area Tag: "Wizard_05" (When the Dark Wind is obtained)
|
|
10) Area Tag: "Library_03a" (When Quill Pen is obtained)
|
|
11) Area Tag: "Library_04a" (When Inkwell is obtained)
|
|
12) Area Tag: "Library_05" (When the Wise Wind is obtained)
|
|
13) Area Tag: "Winds_02" (When all golems have been destroyed)
|
|
*/
|
|
else if(sTag == "Undrentide_01")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Undrentide_02")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Undrentide_03")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Undrentide_04")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Crypt_01")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Crypt_03")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Crypt_04")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Wizard_04")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Wizard_05")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Library_03a")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Library_04a")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Library_05")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
else if(sTag == "Winds_02")
|
|
{
|
|
nNotSafe = !GetLocalInt(GetArea(oPC), "bAllowRest");
|
|
}
|
|
return nNotSafe;
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: NotOnSafeRest
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
returns TRUE if the player is not in a safe
|
|
zone within an area.
|
|
|
|
RULE: There must be at least one door
|
|
All doors must be closed
|
|
|
|
- takes player object
|
|
- finds nearest safe zone
|
|
- is player in safe zone?
|
|
- find all doors in safe zone
|
|
- are all doors closed?
|
|
- if YES to all the above
|
|
is safe to rest,
|
|
RETURN FALSE
|
|
- otherwise give appropriate feedback and return TRUE
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
int NotOnSafeRest(object oPC)
|
|
{ // SpawnScriptDebugger();
|
|
object oSafeTrigger = GetNearestObjectByTag("X0_SAFEREST", oPC);
|
|
int bAtLeastOneDoor = FALSE;
|
|
int bAllDoorsClosed = TRUE;
|
|
int bPCInTrigger = FALSE;
|
|
|
|
if (GetIsObjectValid(oSafeTrigger))
|
|
{
|
|
if (GetObjectType(oSafeTrigger) == OBJECT_TYPE_TRIGGER)
|
|
{
|
|
|
|
// * cycle through trigger looking for oPC
|
|
// * and looking for closed doors
|
|
object oInTrig = GetFirstInPersistentObject(oSafeTrigger, OBJECT_TYPE_ALL);
|
|
while (GetIsObjectValid(oInTrig) == TRUE)
|
|
{
|
|
// * rester is in trigger!
|
|
if (oPC == oInTrig)
|
|
{
|
|
bPCInTrigger = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// * one door found
|
|
if (GetObjectType(oInTrig) == OBJECT_TYPE_DOOR)
|
|
{
|
|
bAtLeastOneDoor = TRUE;
|
|
// * the door was open, exit
|
|
if (GetIsOpen(oInTrig) == TRUE)
|
|
{
|
|
return TRUE; //* I am no in a safe rest place because a door is open
|
|
}
|
|
}
|
|
}
|
|
oInTrig = GetNextInPersistentObject(oSafeTrigger, OBJECT_TYPE_ALL);
|
|
}
|
|
}
|
|
}
|
|
if (bPCInTrigger == FALSE || bAtLeastOneDoor == FALSE)
|
|
{
|
|
return TRUE;
|
|
}
|
|
// * You are in a safe trigger, if in a trigger, and all doors closed on that trigger.
|
|
return FALSE;
|
|
}
|