RATDOG/_module/nss/spawn_chk_custom.nss
Jaysyn904 2e30722043 Level One rework
Revamped Level One: North & Level One: Central to be as close to PnP as possible.  Added Level One: Latrene 3 area.  Added efreeti appearance from CEP3.  Revamped efreeti bottle to be like PnP (no wishes, yet)
2023-09-23 22:02:32 -04:00

291 lines
7.6 KiB
Plaintext

//
// Spawn Check - Custom
//
#include "pqj_inc"
//void main (){}
int ParseFlagValue(string sName, string sFlag, int nDigits, int nDefault);
int ParseSubFlagValue(string sName, string sFlag, int nDigits, string sSubFlag, int nSubDigits, int nDefault);
object GetChildByTag(object oSpawn, string sChildTag);
object GetChildByNumber(object oSpawn, int nChildNum);
object GetSpawnByID(int nSpawnID);
void DeactivateSpawn(object oSpawn);
void DeactivateSpawnsByTag(string sSpawnTag);
void DeactivateAllSpawns();
void DespawnChildren(object oSpawn);
void DespawnChildrenByTag(object oSpawn, string sSpawnTag);
//
//
int SpawnCheckCustom(object oSpawn)
{
// Initialize Values
int nSpawnCheckCustom = GetLocalInt(oSpawn, "f_SpawnCheckCustom");
// Block Spawn by Default
int nProcessSpawn = FALSE;
//
// Only Make Modifications Between These Lines
// -------------------------------------------
// Check 00
if (nSpawnCheckCustom == 0)
{
// Example, Allow Spawn
nProcessSpawn = TRUE;
}
//
//
if (nSpawnCheckCustom == 1)
{
if (GetIsDawn() == TRUE || GetIsDay() == TRUE)
{
nProcessSpawn = TRUE;
SetLocalInt(oSpawn, "SpawnProcessed", FALSE);
}
else
{
int nSpawnProcessed = GetLocalInt(oSpawn, "SpawnProcessed");
if (nSpawnProcessed == FALSE)
{
nProcessSpawn = TRUE;
SetLocalInt(oSpawn, "SpawnProcessed", TRUE);
}
}
}
//
// Reproducing Predators
if (nSpawnCheckCustom == 10)
{
int nChildren = GetLocalInt(oSpawn, "ChildrenSpawned");
if (nChildren >= 10)
{
int nHappy = 0;
int nPredators;
int nNth = 1;
object oPredator = GetNearestObject(OBJECT_TYPE_CREATURE, oSpawn, nNth);
while (oPredator != OBJECT_INVALID)
{
if (GetLocalInt(oPredator, "Predator") == TRUE)
{
nPredators++;
if (GetLocalInt(oPredator, "CurrentHungerState") > 0)
{
nHappy++;
}
}
nNth++;
oPredator = GetNearestObject(OBJECT_TYPE_CREATURE, oSpawn, nNth);
}
SendMessageToAllDMs("There are " + IntToString(nPredators) + " Predators Alive.");
if (nHappy >= 2)
{
nProcessSpawn = TRUE;
}
}
else
{
nProcessSpawn = TRUE;
}
if (nProcessSpawn == TRUE)
{
SendMessageToAllDMs("A Predator is Born!");
}
}
//
//:: Spawns The Dishonest Patrol if the party's average level is over 10,
//:: they have been inside the dungeon & Sheriff Ostland is still alive.
if (nSpawnCheckCustom == 11)
{
// Initialize Variables
int nTotalPCs;
int nTotalPCLevel;
int nAveragePCLevel;
int bDungeon;
int bOstlandDead;
object oArea = GetArea(OBJECT_SELF);
// Cycle through PCs in Area
object oPC = GetFirstObjectInArea(oArea);
while (oPC != OBJECT_INVALID)
{
if (GetIsPC(oPC) == TRUE || GetIsPC(GetMaster(oPC)) == TRUE) //:: Summons & henchmen should count towards this.
{
//:: Check if the PC has entered the Dungeon yet
bDungeon++;
bDungeon = GetLocalInt(oPC, "bEnteredDungeon");
//:: Check to see if Ostland has been killed.
bOstlandDead++;
bOstlandDead = RetrieveQuestState("DishonestPatrol", oPC);
nTotalPCs++;
nTotalPCLevel = nTotalPCLevel + GetHitDice(oPC);
}
oPC = GetNextObjectInArea(oArea);
}
if (nTotalPCs > 0)
{
nAveragePCLevel = nTotalPCLevel / nTotalPCs;
}
else
{
nAveragePCLevel = 3;
}
if ((nAveragePCLevel > 10) && (bOstlandDead < 1) && (bDungeon > 0))
{
nProcessSpawn = TRUE;
}
}
//:: Spawns The Dishonest Patrol if the party's average level is over 10,
//:: they have been inside the dungeon & Sheriff Ostland is still alive.
//:: Process spawn if Dung Monster *is not* roaming & *not* "dead" (Commode)
if (nSpawnCheckCustom == 11)
{
int iDungMonActive = GetLocalInt(GetModule(), "DungMonsterActive");
int iDungMonDead = GetLocalInt(GetModule(), "DungMonsterDead");
if (iDungMonActive && iDungMonDead)
{
nProcessSpawn = FALSE;
}
}
//:: Process spawn if Dung Monster *is not* roaming & *not* "dead" (Commode)
//:: Process spawn if Dung Monster *is* roaming or is "dead" (Hole)
if (nSpawnCheckCustom == 12)
{
int iDungMonActive = GetLocalInt(GetModule(), "DungMonsterActive");
int iDungMonDead = GetLocalInt(GetModule(), "DungMonsterDead");
if (iDungMonActive || iDungMonDead)
{
nProcessSpawn = TRUE;
}
}
//:: Process spawn if Dung Monster *is* roaming or is "dead" (Hole)
//:: Checks for stage 1 or lower for the "Spider's Captive quest"
if (nSpawnCheckCustom == 50)
{
//:: Initialize major variables
object oArea = GetArea(OBJECT_SELF);
object oPC = GetFirstObjectInArea(oArea);
//:: Cycle through PCs in Area
while (oPC != OBJECT_INVALID)
{
//:: Check quest stage
if ( RetrieveQuestState("spiders", oPC) <= 1 )
{
nProcessSpawn = TRUE;
//SendMessageToPC(oPC, "Spawn Processed");
SetLocalInt(oSpawn, "SpawnProcessed", TRUE);
}
oPC = GetNextObjectInArea(oArea);
}
}
//:: Checks for stage 1 or lower for the "Spider's Captive quest"
//:: Checks for stage 2 or lower for the "Spider's Captive quest"
if (nSpawnCheckCustom == 51)
{
//:: Initialize major variables
object oArea = GetArea(OBJECT_SELF);
object oPC = GetFirstObjectInArea(oArea);
//:: Cycle through PCs in Area
while (oPC != OBJECT_INVALID)
{
//:: Check quest stage
if ( RetrieveQuestState("spiders", oPC) <= 2 )
{
nProcessSpawn = TRUE;
//SendMessageToPC(oPC, "Spawn Processed");
SetLocalInt(oSpawn, "SpawnProcessed", TRUE);
}
oPC = GetNextObjectInArea(oArea);
}
}
//:: Checks for stage 2 or lower for the "Spider's Captive quest"
/* //:: Checks for stage 98 or lower (Drusilla's not dead) for the "Vengeful Druid quest" //:: I wish past me left a note
if (nSpawnCheckCustom == 52) //:: for future me on why this was disabled
{
//:: Initialize major variables
object oArea = GetArea(OBJECT_SELF);
object oPC = GetFirstObjectInArea(oArea);
//:: Cycle through PCs in Area
while (oPC != OBJECT_INVALID)
{
//:: Check quest stage
if ( RetrieveQuestState("VengefulDruid", oPC) <= 98 )
{
nProcessSpawn = TRUE;
//SendMessageToPC(oPC, "Spawn Processed");
SetLocalInt(oSpawn, "SpawnProcessed", TRUE);
}
oPC = GetNextObjectInArea(oArea);
}
}
//:: Checks for stage 98 or lower (Drusilla's not dead) for the "Vengeful Druid quest" */
//:: Checks for non-completion of "The Outcasts" quest
if (nSpawnCheckCustom == 53)
{
//:: Initialize major variables
object oArea = GetArea(OBJECT_SELF);
object oPC = GetFirstObjectInArea(oArea);
//:: Cycle through PCs in Area
while (oPC != OBJECT_INVALID)
{
//:: Check quest stage
if ( RetrieveQuestState("outcasts", oPC) <= 3 )
{
nProcessSpawn = TRUE;
//SendMessageToPC(oPC, "Spawn Processed");
SetLocalInt(oSpawn, "SpawnProcessed", TRUE);
}
oPC = GetNextObjectInArea(oArea);
}
}
//:: Checks for non-completion of "The Outcasts" quest
// -------------------------------------------
// Only Make Modifications Between These Lines
//
// Return whether Spawn can Proceed
return nProcessSpawn;
}