PoA_PRC8/_module/nss/labyrinth_hb.nss

104 lines
3.3 KiB
Plaintext
Raw Normal View History

//::////////////////////////////////////////////////////////////////////////////
/*//
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);
}
}