191 lines
7.2 KiB
Plaintext
191 lines
7.2 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: commoner_main.nss
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Main script for the commoner spawner. Enter
|
|
the different parameters in the "Options"
|
|
block below. See readme.txt for additional
|
|
help.
|
|
Use the "Custom" block to add script lines
|
|
if you need to run some script in the area
|
|
heartbeat yourself.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: EntropyDecay
|
|
//:: Created On: May 2003
|
|
//:://////////////////////////////////////////////
|
|
|
|
void main()
|
|
{
|
|
object oArea = GetArea(OBJECT_SELF);
|
|
if (GetLocalInt(oArea, "initialized")==0)
|
|
{
|
|
SetLocalInt(oArea, "initialized", 1);
|
|
|
|
//Options:
|
|
//Required parameters
|
|
int nWalkWayPoints = 10; //Number of waypoints in area
|
|
string sCommonerName = "Baleas Commoner"; //Name of commoners (used to select which
|
|
//spawned creatures can be randomized)
|
|
string sResRefBody = "npc_baleas"; //ResRef-beginning of commoners in area
|
|
int nTypesOfCommoner = 11; //Number of different commoners
|
|
string sResRefClothing = "baleas_cloth"; //ResRef-beginning of clothing
|
|
int nTypesOfClothing = 10; //Number of different clothings
|
|
int nDialogLines = 10; //Number of different one liner dialogs
|
|
|
|
//Commoner options
|
|
int nCommonerMax = 16; //Maximum number of commoners spawned
|
|
//(clear weather & day!)
|
|
int nCommonerRain = 50; //Percentage when it's raining
|
|
int nCommonerSnow = 20; //Percentage when it's snowing
|
|
int nCommonerNight = 100; //Percentage by night
|
|
int nCommonerTorchOnlyByNight = TRUE; //When to spawn with torch:
|
|
//TRUE: only by night, FALSE: all day
|
|
int nCommonerTorch = 50; //Percentage carrying a torch
|
|
int nClothingRandom = 100; //Percentage with random selected clothing
|
|
int nCommonerCarry = 50; //Percentage carrying something in hands
|
|
//(this does not modify the torch chance!)
|
|
|
|
//Weather and movement options
|
|
int nCommonerDayRun = FALSE; //Movement mode by day
|
|
int nCommonerNightRun = FALSE; //Movement mode by night
|
|
int nCommonerRainRun = TRUE; //Movement mode if weather = rain
|
|
int nCommonerSnowRun = FALSE; //Movement mode if weather = snow
|
|
|
|
|
|
//Initialization
|
|
//Don't change anything in this block or the script package
|
|
//won't function properly!
|
|
SetLocalInt(oArea, "nWalkWayPoints", nWalkWayPoints);
|
|
SetLocalString(oArea, "sCommonerName", sCommonerName);
|
|
SetLocalString(oArea, "sResRefBody", sResRefBody);
|
|
SetLocalInt(oArea, "nTypesOfCommoner", nTypesOfCommoner);
|
|
SetLocalString(oArea, "sResRefClothing", sResRefClothing);
|
|
SetLocalInt(oArea, "nTypesOfClothing", nTypesOfClothing);
|
|
SetLocalInt(oArea, "nDialogLines", nDialogLines);
|
|
|
|
SetLocalInt(oArea, "nCommonerMax", nCommonerMax);
|
|
SetLocalInt(oArea, "nCommonerRain", nCommonerRain);
|
|
SetLocalInt(oArea, "nCommonerSnow", nCommonerSnow);
|
|
SetLocalInt(oArea, "nCommonerNight", nCommonerNight);
|
|
SetLocalInt(oArea, "nCommonerTorchOnlyByNight", nCommonerTorchOnlyByNight);
|
|
SetLocalInt(oArea, "nCommonerTorch", nCommonerTorch);
|
|
SetLocalInt(oArea, "nClothingRandom", nClothingRandom);
|
|
SetLocalInt(oArea, "nCommonerCarry", nCommonerCarry);
|
|
|
|
SetLocalInt(oArea, "nCommonerDayRun", nCommonerDayRun);
|
|
SetLocalInt(oArea, "nCommonerNightRun", nCommonerNightRun);
|
|
SetLocalInt(oArea, "nCommonerRainRun", nCommonerRainRun);
|
|
SetLocalInt(oArea, "nCommonerSnowRun", nCommonerSnowRun);
|
|
|
|
int nWeatherType = GetWeather(oArea);
|
|
int nNewMovement;
|
|
if (GetIsNight()) {nNewMovement = GetLocalInt(oArea, "nCommonerNightRun");}
|
|
else {nNewMovement = GetLocalInt(oArea, "nCommonerDayRun");}
|
|
|
|
if ((nWeatherType == WEATHER_RAIN) && (GetLocalInt(oArea, "nCommonerRainRun") == TRUE))
|
|
{nNewMovement = TRUE;}
|
|
else if ((nWeatherType == WEATHER_SNOW) && (GetLocalInt(oArea, "nCommonerSnowRun") == TRUE))
|
|
{nNewMovement = TRUE;}
|
|
|
|
SetLocalInt(oArea, "nWalkType", nNewMovement);
|
|
}
|
|
|
|
|
|
//Custom (insert own code here)
|
|
|
|
//Custom end
|
|
|
|
|
|
//Check if any player is in area
|
|
int i;
|
|
object oPlayerInArea = OBJECT_INVALID;
|
|
object oPC = GetFirstPC();
|
|
while (GetIsObjectValid(oPC))
|
|
{
|
|
if (GetArea(OBJECT_SELF)==GetArea(oPC))
|
|
{
|
|
oPlayerInArea = oPC;
|
|
SetLocalObject(oArea, "oFirstPlayerInArea", oPC);
|
|
break;
|
|
}
|
|
else oPC = GetNextPC();
|
|
}
|
|
|
|
//If any player is in area then execute the following script lines
|
|
if (GetIsObjectValid(oPlayerInArea))
|
|
{
|
|
//Weatherblock
|
|
int nWeatherType = GetWeather(oArea);
|
|
|
|
if (nWeatherType != GetLocalInt(oArea, "nWeather"))
|
|
{
|
|
int nNewMovement;
|
|
if (GetIsNight()) {nNewMovement = GetLocalInt(oArea, "nCommonerNightRun");}
|
|
else {nNewMovement = GetLocalInt(oArea, "nCommonerDayRun");}
|
|
|
|
if ((nWeatherType == WEATHER_RAIN) && (GetLocalInt(oArea, "nCommonerRainRun") == TRUE))
|
|
{nNewMovement = TRUE;}
|
|
else if ((nWeatherType == WEATHER_SNOW) && (GetLocalInt(oArea, "nCommonerSnowRun") == TRUE))
|
|
{nNewMovement = TRUE;}
|
|
|
|
SetLocalInt(oArea, "nWeather", nWeatherType);
|
|
SetLocalInt(oArea, "nWalkType", nNewMovement);
|
|
|
|
i=1;
|
|
object oCommoner = GetNearestObjectByTag("NW_COMMONER", oPC,i);
|
|
while (GetIsObjectValid(oCommoner))
|
|
{
|
|
AssignCommand(oCommoner, ExecuteScript("commoner_resume", oCommoner));
|
|
i++;
|
|
oCommoner = GetNearestObjectByTag("NW_COMMONER", oPC,i);
|
|
}
|
|
}
|
|
|
|
//Commonerblock
|
|
int nCommonersToSpawn;
|
|
int nMaximumToSpawn = GetLocalInt(oArea, "nCommonerMax");
|
|
int nRainMultiplier = GetLocalInt(oArea, "nCommonerRain");
|
|
int nSnowMultiplier = GetLocalInt(oArea, "nCommonerSnow");
|
|
int nNightMultiplier = GetLocalInt(oArea, "nCommonerNight");
|
|
|
|
if (!GetIsNight()) nNightMultiplier = 100;
|
|
|
|
if (GetWeather(oArea)==WEATHER_RAIN)
|
|
{
|
|
nMaximumToSpawn = (nMaximumToSpawn * nRainMultiplier * nNightMultiplier + 5000)/10000;
|
|
}
|
|
else if (GetWeather(oArea)==WEATHER_SNOW)
|
|
{
|
|
nMaximumToSpawn = (nMaximumToSpawn * nSnowMultiplier * nNightMultiplier + 5000)/10000;
|
|
}
|
|
else
|
|
{
|
|
nMaximumToSpawn = (nMaximumToSpawn * nNightMultiplier + 50)/100;
|
|
}
|
|
|
|
int nCommonersSpawned=0;
|
|
object oCount = GetNearestObjectByTag("NW_COMMONER", oPlayerInArea);
|
|
while (GetIsObjectValid(oCount))
|
|
{
|
|
nCommonersSpawned++;
|
|
oCount = GetNearestObjectByTag("NW_COMMONER", oPlayerInArea, nCommonersSpawned+1);
|
|
}
|
|
|
|
nCommonersToSpawn = nMaximumToSpawn - nCommonersSpawned;
|
|
if (nCommonersToSpawn > 0)
|
|
{
|
|
int nSpawn = Random(nCommonersToSpawn+1);
|
|
|
|
int nSpawnInterval;
|
|
if (nSpawn!=0) nSpawnInterval = 60 / nSpawn;
|
|
|
|
for (i=1; i <= nSpawn; i++)
|
|
{
|
|
float fSpawnDelay = IntToFloat(Random(nSpawnInterval))/10 + ((IntToFloat(nSpawnInterval)/10) * (i-1));
|
|
DelayCommand(fSpawnDelay, ExecuteScript("commoner_creator", OBJECT_SELF));
|
|
}
|
|
}
|
|
}
|
|
}
|