Added more creature model overrides. Added another "boss" creature to the Labyrinth. Tweaked several other creatures. Full compile. Updated release archive.
104 lines
3.3 KiB
Plaintext
104 lines
3.3 KiB
Plaintext
//::////////////////////////////////////////////////////////////////////////////
|
|
/*//
|
|
|
|
Labyrinth of Undeath
|
|
onHeartbeat script
|
|
labyrinth_hb.nss
|
|
|
|
Wandering Monsters: Check once per 30 minutes on 1d20.
|
|
|
|
Detections: Strong evil from the whole place.
|
|
|
|
Continuous Effects: The evil energy of the labyrinth makes all PC's
|
|
require a Will save or be cursed. This check occurs every half
|
|
hour and the curse vanishes if the PC leaves the area.
|
|
|
|
*///
|
|
//::////////////////////////////////////////////////////////////////////////////
|
|
#include "inc_debug"
|
|
#include "spawn_main"
|
|
|
|
//:: Function to process the curse
|
|
void ApplyCurse(object oPC)
|
|
{
|
|
//:: Check for exising variable on player
|
|
int oldTime = GetLocalInt(oPC, "CurseWillSaveTime");
|
|
|
|
//:: Get the current system time in seconds
|
|
int newTime = (GetTimeHour()*60*60)+(GetTimeMinute()*60)+GetTimeSecond();
|
|
|
|
//:: Calculate the time difference in seconds
|
|
int timeDifference = newTime - oldTime;
|
|
|
|
if (DEBUG)
|
|
{
|
|
SendMessageToPC(oPC, "oldTime = " + IntToString(oldTime));
|
|
SendMessageToPC(oPC, "newTime = " + IntToString(newTime));
|
|
SendMessageToPC(oPC, "timeDifference = " + IntToString(timeDifference));
|
|
}
|
|
|
|
//:: Check if the character hasn't made a Will save in the last 3 minutes
|
|
if (oldTime == 0 || timeDifference >= 180) // 180 seconds = 3 real-time minutes
|
|
{
|
|
//:: Check if the character failed the save
|
|
if (!WillSave(oPC, 20))
|
|
{
|
|
//:: Apply a curse
|
|
effect eCurse = EffectCurse(1, 1, 1, 1, 1, 1);
|
|
effect eVFX = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE);
|
|
effect eLink = EffectLinkEffects(eCurse, eVFX);
|
|
|
|
eLink = EffectLinkEffects(eCurse, eVis);
|
|
eLink = SupernaturalEffect(eLink);
|
|
eLink = TagEffect(eLink, "LabyrinthCurse");
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, 180.0f); // 180 seconds = 3 real-time minutes & .5 hours in-game.
|
|
|
|
//:: Store the current time on player
|
|
SetLocalInt(oPC, "CurseWillSaveTime", newTime);
|
|
|
|
if (DEBUG)
|
|
{
|
|
SendMessageToPC(oPC, "Failed CurseWillSave");
|
|
SendMessageToPC(oPC, "Setting CurseWillSaveTime as " + IntToString(newTime));
|
|
}
|
|
|
|
//:: Send a message to the player
|
|
SendMessageToPC(oPC, "The very air you breathe in this labyrinth is cursed.");
|
|
}
|
|
|
|
//:: Store the current time on player
|
|
SetLocalInt(oPC, "CurseWillSaveTime", newTime);
|
|
|
|
if (DEBUG)
|
|
{
|
|
SendMessageToPC(oPC, "Passed CurseWillSave");
|
|
SendMessageToPC(oPC, "Setting CurseWillSaveTime as " + IntToString(newTime));
|
|
}
|
|
}
|
|
}
|
|
|
|
void main()
|
|
{
|
|
//:: Declare major variables
|
|
object oArea = OBJECT_SELF;
|
|
object oPC = GetFirstObjectInArea(oArea, OBJECT_TYPE_CREATURE);
|
|
|
|
while (GetIsObjectValid(oPC))
|
|
{
|
|
if (GetIsPC(oPC) || (GetMaster(oPC) != OBJECT_INVALID && GetIsPC(GetMaster(oPC))))
|
|
{
|
|
if (DEBUG)
|
|
{
|
|
SendMessageToPC(oPC, "Running Labyrinth of Undeath Area HB");
|
|
}
|
|
|
|
//:: Apply the curse
|
|
ApplyCurse(oPC);
|
|
}
|
|
|
|
//:: Get the next object in the area
|
|
oPC = GetNextObjectInArea(oArea);
|
|
}
|
|
} |