EN4_PRC8/_module/nss/rd_spawnzones.nss
Jaysyn904 b464d8da05 Initial Commit
Initial Commit [v1.32PRC8]
2025-04-03 13:38:45 -04:00

1338 lines
29 KiB
Plaintext

#include "rd_spawn"
#include "rd_spawnspecial"
#include "prc_class_const"
#include "utl_i_sqluuid"
//:: void main (){}
void RespawnMobs();
void RespawnCamps();
void RespawnCampsAE(object oPC,int iDiff=0, int iSetLevel = 0, int iSpecialSpawn = 0);
void RespawnMobsAE(object oPC,int iDiff=0, int iSetLevel = 0);
int GetHighestPC(object oTargetPC);
void ZoneRandom();
void RandomEvent(object oPC, string sZone);
void GetPatrol(int iLevel,string sTag);
void GetWanderingRace(int iLevel,string sTag, string sRace, int iMaxLevel=40);
void GetParty(int iLevel, string sTag, int iGood=1);
void LevelPartyMember(object oCreature, int iLevel);
void GetGypsies(string sZone);
void GetBandit(location lLoc,string sTag,int iLevel);
void GetBandits(string sZone,int iLevel);
string GetGoodFighter();
string GetGoodCleric();
string GetGoodRogue();
string GetGoodWizard();
string GetEvilFighter();
string GetEvilCleric();
string GetEvilRogue();
string GetEvilWizard();
void GetHero(string sZone,int iLevel);
void WanderingDragon(string sZone,object oPC);
void GetRandomMobsSpecial(string sZone,object oPC);
string GetRaceByLevel(int iLevel);
void SummonAnything(object oPC,location lLoc,int iLevel);
void GetRandomCampCreatures(object oPC, string sTag);
int GetAdjustedLevel(object oPC, int iDiff=0);
void SetTrapsAndDoors(object oPC);
void CheckZone(object oPC);
int GetMaxCampSpots(string sZone);
void RespawnMobs()
{
string sZone;
object oPC;
object oLastPC;
int iCount;
int iFlag;
int iLevel;
int iPCCount;
int iAdjustedLevel;
int iRnd;
int iIndex;
int iRnd2;
int iDeathAllowed;
int iDeathAdjust;
//Try to Randomize
iRnd=GetTimeSecond();
iIndex=1;
while (iIndex<=iRnd)
{
iIndex++;
iRnd2=Random(100);
}
oPC=GetFirstPC();
iCount = 0;
iFlag = 0;
while (iFlag == 0)
{
iCount++;
oLastPC = oPC;
iLevel = GetHighestPC(oPC);
iPCCount= GetPCCount(oPC);
iDeathAllowed = PCDeathsLeft(oPC);
iDeathAdjust = (iDeathAllowed-2)/2;
iAdjustedLevel = iLevel - 3 + iPCCount;
iAdjustedLevel = iAdjustedLevel + iDeathAdjust;
if (GetLocalInt(oPC,"Unlucky")==1)
iAdjustedLevel++;
if (GetLocalInt(GetModule(),"Easy") == 1)
iAdjustedLevel = iAdjustedLevel - 2;
if (iAdjustedLevel > (iLevel + 3))
iAdjustedLevel = iLevel +3;
if (iAdjustedLevel < 1)
iAdjustedLevel =1;
if (iAdjustedLevel > 40)
iAdjustedLevel =40;
sZone=GetZone(oPC);
if (!(sZone == "END"))
SpawnMobs(sZone,iAdjustedLevel);
oPC = GetNextPC();
// if (GetName(oLastPC) == GetName(oPC))
if (!GetIsObjectValid(oPC))
{
iFlag = 1;
}
}
}
void RespawnCamps()
{
object oPC;
object oLastPC;
int iCount;
int iFlag;
oPC=GetFirstPC();
iCount = 0;
iFlag = 0;
while (iFlag == 0)
{
iCount++;
oLastPC = oPC;
SetLocalInt(GetArea(oPC),"Spawned",0);
oPC = GetNextPC();
// if (GetName(oLastPC) == GetName(oPC))
if (!GetIsObjectValid(oPC))
{
iFlag = 1;
}
}
}
void RespawnMobsAE(object oPC,int iDiff=0, int iSetLevel = 0)
{
string sZone;
int iLevel;
int iAdjustedLevel;
int iRnd;
int iIndex;
int iRnd2;
//Try to Randomize
iRnd=GetTimeSecond();
iIndex=1;
while (iIndex<=iRnd)
{
iIndex++;
iRnd2=Random(100);
}
iAdjustedLevel = GetAdjustedLevel(oPC,iDiff);
if (iSetLevel > 0)
iAdjustedLevel = iSetLevel;
sZone=GetZone(oPC);
if (sZone != "")
DelayCommand(0.5f,SpawnMobs(sZone,iAdjustedLevel));
}
void RespawnCampsAE(object oPC,int iDiff=0, int iSetLevel = 0, int iSpecialSpawn = 0)
{
string sZone;
int iLevel;
int iPCCount;
int iAdjustedLevel;
int iRnd;
int iIndex;
int iRnd2;
int iDeathAllowed;
int iDeathAjust;
//avoid respawning full camps upon a load game
if (GetLocalInt(GetModule(),"ClientEnter") == 1)
return;
//Try to Randomize
iRnd=GetTimeSecond();
iIndex=1;
while (iIndex<=iRnd)
{
iIndex++;
iRnd2=Random(100);
}
iAdjustedLevel = GetAdjustedLevel(oPC,iDiff);
if (iSetLevel > 0)
iAdjustedLevel = iSetLevel;
sZone=GetZone(oPC);
WriteTimestampedLogEntry("Respawn camps in " + sZone + " for level " + IntToString(iAdjustedLevel));
if (sZone != "")
SpawnCamps(sZone,iAdjustedLevel, iSpecialSpawn);
}
int GetHighestPC(object oTargetPC)
{
string sZone;
string sTargetZone;
object oPC;
object oLastPC;
int iCount;
int iFlag;
int iLevel;
int iHighLevel;
oPC=GetFirstPC();
iCount = 0;
iFlag = 0;
sTargetZone = GetZone(oTargetPC);
iHighLevel = GetLevelByPosition(1,oTargetPC) +
GetLevelByPosition(2,oTargetPC) +
GetLevelByPosition(3,oTargetPC);
iHighLevel = iHighLevel + GetLocalInt(oTargetPC,"Adjust");
while (iFlag == 0)
{
iCount++;
oLastPC = oPC;
sZone=GetZone(oPC);
if (sZone == sTargetZone)
{
iLevel = GetLevelByPosition(1,oPC) +
GetLevelByPosition(2,oPC) +
GetLevelByPosition(3,oPC);
iLevel = iLevel + GetLocalInt(oPC,"Adjust");
if (iLevel>iHighLevel)
iHighLevel=iLevel;
}
oPC = GetNextPC();
if (GetName(oLastPC) == GetName(oPC))
{
iFlag = 1;
}
}
return iHighLevel;
}
void ZoneRandom()
{
object oPC;
string sZone;
oPC = GetRandomPC();
sZone = GetLocalString(GetArea(oPC),"Prefix");
if (Random(8)==0)
{
if (sZone != "")
RandomEvent(oPC,sZone);
}
}
void RandomEvent(object oPC, string sZone)
{
int iLevel;
int iRandom;
int iRandom2;
string sTag;
string sCreature;
iLevel = GetHitDice(oPC);
iLevel = ZoneLevel(GetArea(oPC),iLevel);
iRandom = Random(20)+1;
WriteTimestampedLogEntry("Random Zone Event For " + sZone + " (" + IntToString(iRandom) + ")");
switch (iRandom)
{
case 1: case 18: //Wandering Good Party
sTag = sZone + "_W";
GetParty(iLevel,sTag,1);
break;
case 2: case 19: //Wandering Evil Party
sTag = sZone + "_W";
GetParty(iLevel,sTag,0);
break;
case 3: //Patrolling Party
sTag = sZone + "_P";
GetParty(iLevel,sTag,Random(2));
break;
case 4: //Patrol
sTag = sZone + "_P";
GetPatrol(iLevel,sTag);
break;
case 5: //Patrol
sTag = sZone + "_P";
GetPatrol(iLevel,sTag);
break;
case 6: //Patrolling Bandits
sTag = sZone + "_P";
GetWanderingRace(iLevel,sTag,"bandit",12);
break;
case 7: //Wandering Bandits
sTag = sZone + "_W";
GetWanderingRace(iLevel,sTag,"bandit",12);
break;
case 8: case 17://Wandering Race
sTag = sZone + "_W";
sCreature = GetRaceByLevel(iLevel);
GetWanderingRace(iLevel,sTag,sCreature,12);
break;
case 9: //Party in Town
GetParty(iLevel,sZone + "_Town",1);
break;
case 10: case 16: //Gypsies
GetGypsies(sZone);
break;
case 11: case 20: //Gypsies
GetBandits(sZone,iLevel);
break;
case 12: //Evil Hero
GetHero(sZone,iLevel);
break;
case 13: WanderingDragon(sZone,oPC);
break;
case 14: case 15: GetRandomMobsSpecial(sZone,oPC);
break;
}
}
void GetBandits(string sZone,int iLevel)
{
string sTag;
object oCreature;
location lLoc;
sTag = sZone + "_G1";
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
GetBandit(lLoc,sTag,iLevel);
}
sTag = sZone + "_G2";
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
GetBandit(lLoc,sTag,iLevel);
}
sTag = sZone + "_G3";
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
GetBandit(lLoc,sTag,iLevel);
}
}
void GetBandit(location lLoc,string sTag,int iLevel)
{
int iRandom;
int iNewLevel;
int iLevels;
string sType;
string sCreature;
object oCreature;
iRandom = Random(10) + 1;
switch (iRandom)
{
case 1: case 2: case 3: sType = "f"; break; //fighter
case 4: case 5: sType = "r"; break; //rogue
case 6: sType = "m"; break; //mage
case 7: case 8: sType = "c"; break; //cleric
case 9: sType = "s"; break; //special class
case 10: sType = "x"; break; //special creature
}
sCreature = "en3_bandit_" + sType + "_1";
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
if (iLevel < 5)
iLevels = Random(5);
else
iLevels = Random(5) + (iLevel - 3);
if (iLevels >0)
iNewLevel = LevelMob(oCreature,iLevels);
AssignCommand(oCreature,ActionRest());
if (iNewLevel > 0)
EquipMob(oCreature);
}
void GetGypsies(string sZone)
{
string sTag;
string sGypsy;
object oCreature;
location lLoc;
sTag = sZone + "_G1";
sGypsy = "en3_gypsy1";
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
CreateObject(OBJECT_TYPE_CREATURE,sGypsy,lLoc,FALSE,sTag + "_S");
}
sTag = sZone + "_G2";
sGypsy = "en3_gypsy2";
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
CreateObject(OBJECT_TYPE_CREATURE,sGypsy,lLoc,FALSE,sTag + "_S");
}
sTag = sZone + "_G3";
sGypsy = "en3_gypsy3";
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
CreateObject(OBJECT_TYPE_CREATURE,sGypsy,lLoc,FALSE,sTag + "_S");
}
}
void GetPatrol(int iLevel,string sTag)
{
object oCreature;
location lLoc;
int iRandom;
int iIndex;
int iLevels;
int iNewLevel;
string sCreature;
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
sCreature = "en3_patrol";
lLoc = GetLocation(GetObjectByTag(sTag));
iRandom = Random(3)+2;
iIndex=0;
while (iIndex < iRandom)
{
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
iLevels = iLevel - (Random(2)+2) - 1;
if (iLevels>9)
iLevels = 9;
iNewLevel = 0;
if (iLevels >0)
iNewLevel = LevelMob(oCreature,iLevels);
AssignCommand(oCreature,ActionRest());
if (iNewLevel > 0)
EquipMob(oCreature);
iIndex++;
}
}
}
void GetWanderingRace(int iLevel,string sTag,string sRace, int iMaxLevel=40)
{
object oCreature;
location lLoc;
int iRandom;
int iRandom2;
int iIndex;
int iLevels;
int iNewLevel;
string sCreature;
string sType;
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
iRandom = Random(3)+2;
iIndex=0;
while (iIndex < iRandom)
{
iRandom2 = Random(10) + 1;
switch (iRandom2)
{
case 1: case 2: case 3: sType = "f"; break; //fighter
case 4: case 5: sType = "r"; break; //rogue
case 6: sType = "m"; break; //mage
case 7: case 8: sType = "c"; break; //cleric
case 9: sType = "s"; break; //special class
case 10: sType = "x"; break; //special creature
}
sCreature = "en3_" + sRace + "_" + sType + "_1";
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
iLevels = iLevel - (Random(2)+2) - 1;
if (Random(5)==0 && iLevel > 2)
iLevels = iLevels + Random(5)+1;
if (iLevels>(iMaxLevel-1))
iLevels = iMaxLevel-1;
iNewLevel = 0;
if (iLevels >0)
iNewLevel = LevelMob(oCreature,iLevels);
AssignCommand(oCreature,ActionRest());
if (iNewLevel > 0)
EquipMob(oCreature);
iIndex++;
}
}
}
void GetParty(int iLevel, string sTag, int iGood=1)
{
object oCreature;
location lLoc;
int iRandom;
int iIndex;
int iLevels;
int iNewLevel;
int iFighters;
int iClerics;
int iRogues;
int iWizards;
string sCreature;
oCreature = GetObjectByTag(sTag + "_S");
if (!(GetIsObjectValid(oCreature)))
{
lLoc = GetLocation(GetObjectByTag(sTag));
iFighters = Random(3)+1;
iWizards = Random(2);
iClerics = Random(2);
iRogues = Random(2);
if (Random(2) == 0)
iClerics++;
if (Random(4) == 0)
iRogues++;
if (Random(6) == 0)
iWizards++;
iIndex=0;
while (iIndex < iFighters)
{
if (iGood == 1)
sCreature = GetGoodFighter();
else
sCreature = GetEvilFighter();
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
LevelPartyMember(oCreature,iLevel);
iIndex++;
}
iIndex=0;
while (iIndex < iClerics)
{
if (iGood == 1)
sCreature = GetGoodCleric();
else
sCreature = GetEvilCleric();
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
LevelPartyMember(oCreature,iLevel);
iIndex++;
}
iIndex=0;
while (iIndex < iWizards)
{
if (iGood == 1)
sCreature = GetGoodWizard();
else
sCreature = GetEvilWizard();
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
LevelPartyMember(oCreature,iLevel);
iIndex++;
}
iIndex=0;
while (iIndex < iRogues)
{
if (iGood == 1)
sCreature = GetGoodRogue();
else
sCreature = GetEvilRogue();
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
LevelPartyMember(oCreature,iLevel);
iIndex++;
}
}
}
void GetHero(string sZone,int iLevel)
{
string sTag;
string sCreature;
location lLoc;
object oCreature;
int iRandom;
int iIndex;
if (Random(2)==0)
sTag = sZone + "_P";
else
sTag = sZone + "_W";
lLoc = GetLocation(GetObjectByTag(sTag));
iRandom = Random(11)+1;
sCreature = "en3_class" + IntToString(iRandom);
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
//if (!(GetIsObjectValid(oCreature)))
// SendMessageToPC(GetFirstPC(),sCreature + " did not spawn as a hero.");
iLevel = iLevel + Random(4) + 1;
if (iLevel > 40)
iLevel = 40;
LevelPartyMember(oCreature,iLevel);
if (iLevel < 6)
iRandom = Random(2);
else if (iLevel < 10)
iRandom = Random(2)+1;
else
iRandom = Random(3)+1;
iIndex = 0;
if (Random(3)==0)
{
GetArtifact(oCreature);
} else {
while (iIndex < iRandom)
{
GetMagicItem(oCreature);
iIndex++;
}
}
}
void LevelPartyMember(object oCreature, int iLevel)
{
int iLevels;
int iNewLevel;
iLevels = iLevel - (Random(2)+2) - 1;
if (Random(5)==0)
iLevels = iLevels + Random(5) + 1;
if (iLevels>40)
iLevels = 9;
iNewLevel = 0;
if (iLevels >0)
iNewLevel = LevelMob(oCreature,iLevels);
AssignCommand(oCreature,ActionRest());
if (iNewLevel > 0)
EquipMob(oCreature);
if (Random(100)<((iNewLevel+1)/2))
GetMagicItem(oCreature);
}
string GetGoodFighter()
{
int iRandom;
string sTag;
iRandom = Random(9)+1;
switch (iRandom)
{
case 1: sTag = "en3_fightergood"; break;
case 2: sTag = "en3_paladingood"; break;
case 3: sTag = "en3_rangergood"; break;
case 4: sTag = "en3_hlffightergood"; break;
case 5: sTag = "en3_dwarf_x_1"; break;
case 6: sTag = "en3_dwarf_s_1"; break;
case 7: sTag = "en3_dwarf_f_1"; break;
case 8: sTag = "en3_elf_f_1"; break;
case 9: sTag = "en3_elf_r_1"; break;
}
return sTag;
}
string GetGoodCleric()
{
int iRandom;
string sTag;
iRandom = Random(4)+1;
switch (iRandom)
{
case 1: sTag = "en3_clericgood"; break;
case 2: sTag = "en3_dwarf_c_1"; break;
case 3: sTag = "en3_elf_x_1"; break;
case 4: sTag = "en3_elf_c_1"; break;
}
return sTag;
}
string GetGoodRogue()
{
int iRandom;
string sTag;
iRandom = Random(4)+1;
switch (iRandom)
{
case 1: sTag = "en3_roguegood"; break;
case 2: sTag = "en3_monkgood"; break;
case 3: sTag = "en3_hflroguegood"; break;
case 4: sTag = "en3_hflroguegood"; break;
}
return sTag;
}
string GetGoodWizard()
{
int iRandom;
string sTag;
iRandom = Random(5)+1;
switch (iRandom)
{
case 1: sTag = "en3_bardgood"; break;
case 2: sTag = "en3_wizardgood"; break;
case 3: sTag = "en3_dwarf_m_1"; break;
case 4: sTag = "en3_elf_m_1"; break;
case 5: sTag = "en3_elf_s_1"; break;
}
return sTag;
}
string GetEvilCleric()
{
int iRandom;
string sTag;
iRandom = Random(6)+1;
switch (iRandom)
{
case 1: sTag = "en3_clericevil"; break;
case 2: sTag = "en3_duergar_c_1"; break;
case 3: sTag = "en3_drow_c_1"; break;
case 4: sTag = "en3_dpevil"; break;
case 5: sTag = "en3_clericevil"; break;
case 6: sTag = "en3_clericevil"; break;
}
return sTag;
}
string GetEvilFighter()
{
int iRandom;
string sTag;
iRandom = Random(7)+1;
switch (iRandom)
{
case 1: sTag = "en3_fighterevil"; break;
case 2: sTag = "en3_hobarbarian"; break;
case 3: sTag = "en3_duergar_f_1"; break;
case 4: sTag = "en3_dfevil"; break;
case 5: sTag = "en3_drow_f_1"; break;
case 6: sTag = "en3_fighterevil"; break;
case 7: sTag = "en3_hobarbarian"; break;
}
return sTag;
}
string GetEvilRogue()
{
int iRandom;
string sTag;
iRandom = Random(4)+1;
switch (iRandom)
{
case 1: sTag = "en3_monkevil"; break;
case 2: sTag = "en3_rogueevil"; break;
case 3: sTag = "en3_hflrogueevil"; break;
case 4: sTag = "en3_drow_r_1"; break;
}
return sTag;
}
string GetEvilWizard()
{
int iRandom;
string sTag;
iRandom = Random(6)+1;
switch (iRandom)
{
case 1: sTag = "en3_wizardevil"; break;
case 2: sTag = "en3_wizardevil"; break;
case 3: sTag = "en3_wizardevil"; break;
case 4: sTag = "en3_gsevil"; break;
case 5: sTag = "en3_drow_m_1"; break;
case 6: sTag = "en3_drow_s_1"; break;
}
return sTag;
}
void WanderingDragon(string sZone,object oPC)
{
int iRandom;
int iAdjust;
int iLevelTest;
int iLevel;
int iDeathAllowed;
int iDeathAdjust;
string sColor;
string sTag;
string sCreature;
string sType;
object oCreature;
location lLoc;
sTag = sZone + "_W";
iLevel = GetHitDice(oPC);
iDeathAllowed = PCDeathsLeft(oPC);
iDeathAdjust = (iDeathAllowed-2)/2;
iLevel = iLevel + iDeathAdjust;
iLevel = ZoneLevel(GetArea(oPC),iLevel);
iAdjust = Random(10)+1;
if (iAdjust < 2)
iLevelTest=iLevel-2;
else if (iAdjust < 4)
iLevelTest=iLevel-1;
else if (iAdjust < 8)
iLevelTest=iLevel;
else if (iAdjust < 10)
iLevelTest=iLevel+1;
else
iLevelTest=iLevel+2;
if (iLevelTest<15)
sType = "001";
else if (iLevelTest < 19)
sType = "002";
else
sType = "003";
iRandom = 1;
if (sType=="001")
{
if (iLevel <11)
iRandom = 1;
if (iLevel <13)
iRandom = Random(3)+1;
else
iRandom=Random(4)+2;
}
else if (sType=="002")
{
if (iLevel <15)
iRandom = 1;
else
iRandom=Random(5)+1;
}
else
iRandom=Random(6)+1;
switch (iRandom)
{
case 1: sColor = "WHITE"; break;
case 2: sColor = "BLACK"; break;
case 3: sColor = "BLUE"; break;
case 4: sColor = "GREEN"; break;
case 5: sColor = "RED"; break;
case 6: sColor = "SHADOW"; break;
}
sCreature = "NW_DRG" + sColor + sType;
if (sColor == "SHADOW")
sCreature = "X2_DRAGONSHAD001";
if (iLevel < 4)
sCreature = "en3_dragon0_1_1";
else if (iLevel < 9)
{
iRandom = Random(6)+1;
switch (iRandom)
{
case 1: sCreature = "x0_wyrmling_blk"; break;
case 2: sCreature = "x0_wyrmling_wht"; break;
case 3: sCreature = "x0_wyrmling_grn"; break;
case 4: sCreature = "x0_wyrmling_blu"; break;
case 5: sCreature = "x0_wyrmling_red"; break;
case 6: sCreature = "en3_dragon2_1_1"; break;
}
}
if (iLevel>30)
if (Random(2)==0)
sCreature = "X2_DRACOLICH001";
else
sCreature = "en3_dragon4_boss";
lLoc = GetLocation(GetObjectByTag(sTag));
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sCreature,lLoc,FALSE,sTag + "_S");
}
string GetRaceByLevel(int iLevel)
{
int iRandom2;
string sCreature;
sCreature="orc";
if (iLevel<11)
{
iRandom2 = Random(4) +1;
switch (iRandom2)
{
case 1: sCreature = "orc"; break;
case 2: sCreature = "goblin"; break;
case 3: sCreature = "lizardman"; break;
case 4: sCreature = "elf"; break;
}
}
else if (iLevel<21)
{
iRandom2 = Random(4) +1;
switch (iRandom2)
{
case 1: sCreature = "ogre"; break;
case 2: sCreature = "minotaur"; break;
case 3: sCreature = "merc"; break;
case 4: sCreature = "elf"; break;
}
}
else if (iLevel<31)
{
iRandom2 = Random(5) +1;
switch (iRandom2)
{
case 1: sCreature = "giant"; break;
case 2: sCreature = "minotaur"; break;
case 3: sCreature = "drow"; break;
case 4: sCreature = "duergar"; break;
case 5: sCreature = "vampire"; break;
}
}
else
{
iRandom2 = Random(5) +1;
switch (iRandom2)
{
case 1: sCreature = "vampire"; break;
case 2: sCreature = "fiend"; break;
case 3: sCreature = "drow"; break;
case 4: sCreature = "duergar"; break;
case 5: sCreature = "angelic"; break;
}
}
return sCreature;
}
void GetRandomMobsSpecial(string sZone,object oPC)
{
string sTag;
string sCreature;
int iX;
int iFlag;
int iSpot;
int iRandom;
int iLevel;
int iDeathAllowed;
int iDeathAdjust;
object oSpawn;
location lLoc;
iLevel = GetHitDice(oPC);
iDeathAllowed = PCDeathsLeft(oPC);
iDeathAdjust = (iDeathAllowed-2)/2;
iLevel = iLevel + iDeathAdjust;
iLevel = ZoneLevel(GetArea(oPC),iLevel);
iX = GetXSpot(sZone);
iSpot = Random(iX)+1;
sTag = sZone + "_X_" + IntToString(iSpot);
lLoc = GetLocation(GetObjectByTag(sTag));
iRandom = Random(4)+1;
switch (iRandom)
{
case 1: sCreature = GetRaceByLevel(iLevel);
GetRaceCreatures(sCreature,lLoc,iLevel);
break;
case 2: SummonAnything(oPC,lLoc,iLevel);
break;
case 3: GetRandomCampCreatures(oPC,sTag);
break;
case 4: GetParty(iLevel,sTag,Random(1));
break;
}
}
void SummonAnything(object oPC,location lLoc,int iLevel)
{
object oArea;
int iArea;
string sCreature;
oArea=GetArea(oPC);
iArea=GetIsAreaInterior(oArea);
if (iArea == FALSE)
SetCreatureTags(iLevel,0);
else
SetCreatureTags(iLevel,1);
sCreature=GetCreatureTag();
CreateObject(OBJECT_TYPE_CREATURE, sCreature,lLoc,FALSE);
}
void GetRandomCampCreatures(object oPC, string sTag)
{
object oCreature;
object oMod;
string sCampType;
int iDifficulty;
int iBase;
int iBaseStart;
int iBaseMax;
int iCampType;
int iLevel;
int iDeathAllowed;
int iDeathAjust;
int iAdjustedLevel;
int iPCCount;
int iCreatureLevel;
iLevel = GetHitDice(oPC);
iAdjustedLevel = iAdjustedLevel + GetLocalInt(oPC,"Adjust");
iAdjustedLevel = ZoneLevel(GetArea(oPC),iLevel);
//Setup for races and allow indoors only to be spookiness
SetupCampTypes(iAdjustedLevel, 1, 1, 0, 0);
sCampType = GetCampType();
oMod = GetModule();
iBase = GetLocalInt(oMod,"iBase");
iBaseStart = GetLocalInt(oMod,"iBaseStart");
iBaseMax = GetLocalInt(oMod,"iBaseMax");
iCampType = GetLocalInt(oMod,"iCampType");
SetLocalInt(oMod,"iBase",0);
SetLocalInt(oMod,"iBaseStart",0);
SetLocalInt(oMod,"iBaseMax",0);
SetLocalInt(oMod,"iCampType",0);
iCreatureLevel = Random(5) - 2 + iAdjustedLevel;
if (iCreatureLevel < 1)
iCreatureLevel = 1;
if (iCreatureLevel >40)
iCreatureLevel = 40;
//SendMessageToPC(oPC,"Tag = " + sTag + " CampType = " + sCampType);
oCreature = GetCampMob(iCreatureLevel,sTag,sCampType,iAdjustedLevel,iBaseStart,iBase,iBaseMax,iCampType, 0);
//SendMessageToPC(oPC,"Creature = " + GetTag(oCreature));
}
int GetAdjustedLevel(object oPC, int iDiff=0)
{
int iPCCount;
int iAdjustedLevel;
int iDeathAllowed;
int iDeathAjust;
int iLevel;
iLevel = GetHighestPC(oPC);
iPCCount= GetPCCount(oPC);
iDeathAllowed = PCDeathsLeft(oPC);
iDeathAjust = (iDeathAllowed-2)/2;
iAdjustedLevel = iLevel - 3 + iPCCount;
if (iAdjustedLevel > (iLevel + 3) && iLevel < 13)
iAdjustedLevel = iLevel +3;
if (iAdjustedLevel > (iLevel + 5) && iLevel > 12)
iAdjustedLevel = iLevel +5;
if (GetLocalInt(oPC,"PCHardcore") == 0 && GetLocalInt(oPC,"PCHardCorePNP") == 0 && GetLocalInt(oPC,"PCHardCoreSpecial") == 0)
iAdjustedLevel = iAdjustedLevel + iDeathAjust;
else
iAdjustedLevel = iLevel;
if (GetLocalInt(oPC,"Unlucky")==1)
iAdjustedLevel++;
if (GetLocalInt(GetModule(),"Easy") == 1)
iAdjustedLevel = iAdjustedLevel - 2;
iAdjustedLevel=iAdjustedLevel+iDiff;
if (iAdjustedLevel < 1)
iAdjustedLevel =1;
if (iAdjustedLevel > 40)
iAdjustedLevel =40;
return iAdjustedLevel;
}
void SetTrapsAndDoors(object oPC)
{
string sPrefix;
string sTag;
int iIndex;
int iFlag;
int iRandom;
int iChance;
int iChanceMod;
object oTrap;
object oDoor;
object oChest;
sPrefix = GetZone(oPC);
iChanceMod = 0;
if (GetLevelByClass(CLASS_TYPE_ROGUE,oPC)
+GetLevelByClass(CLASS_TYPE_NINJA, oPC)
+GetLevelByClass(CLASS_TYPE_SCOUT, oPC)
+GetLevelByClass(CLASS_TYPE_FACTOTUM, oPC)
+GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oPC) > 0)
iChanceMod = 5;
iFlag = 0;
iIndex = 0;
while (iFlag == 0)
{
iIndex++;
sTag = sPrefix + "_Trap" + IntToString(iIndex);
oTrap = GetObjectByTag(sTag);
if (GetIsObjectValid(oTrap))
{
iRandom = Random(100);
iChance = GetLocalInt(oTrap,"Chance");
if (iChance == 0)
iChance = 10;
iChance = iChance + iChanceMod;
if (iRandom >= iChance && GetLocalInt(oTrap,"TrapCheck") == 0)
{
SetTrapDisabled(oTrap);
SetLocalInt(oTrap,"TrapCheck",1);
}
} else {
iFlag = 1;
}
}
iFlag = 0;
iIndex = 0;
while (iFlag == 0)
{
iIndex++;
sTag = sPrefix + "_Door" + IntToString(iIndex);
oDoor = GetObjectByTag(sTag);
if (GetIsObjectValid(oDoor))
{
iRandom = Random(100);
iChance = GetLocalInt(oDoor,"TrapChance");
if (iChance == 0)
iChance = 5;
iChance = iChance + iChanceMod;
if (iRandom >= iChance && GetLocalInt(oDoor,"TrapCheck") == 0)
{
SetTrapDisabled(oDoor);
SetLocalInt(oDoor,"TrapCheck",1);
}
iRandom = Random(100);
iChance = GetLocalInt(oTrap,"LockedChance");
iChance = iChance + iChanceMod;
if (iChance == 0)
iChance = 10;
if (iRandom >= iChance && GetLocalInt(oDoor,"LockedCheck") == 0)
{
SetTrapDisabled(oDoor);
SetLocalInt(oDoor,"LockedCheck",1);
}
} else {
iFlag = 1;
}
}
iFlag = 0;
iIndex = 0;
while (iFlag == 0)
{
iIndex++;
sTag = sPrefix + "_C" + IntToString(iIndex) + "_Boss";
if (GetIsObjectValid(GetObjectByTag(sTag)))
{
oChest = GetObjectByTag(sPrefix + "_C" + IntToString(iIndex) + "_Treasure");
if (GetIsObjectValid(oChest))
{
iRandom = Random(100);
iChance = GetLocalInt(oChest,"TrapChance");
if (iChance == 0)
iChance = 5;
iChance = iChance + iChanceMod;
if (iRandom >= iChance && GetLocalInt(oChest,"TrapCheck") == 0)
{
SetTrapDisabled(oChest);
SetLocalInt(oChest,"TrapCheck",1);
}
iRandom = Random(100);
iChance = GetLocalInt(oChest,"LockedChance");
if (iChance == 0)
iChance = 2;
iChance = iChance + iChanceMod;
if (iRandom >= iChance && GetLocalInt(oChest,"LockedCheck") == 0)
{
SetTrapDisabled(oChest);
SetLocalInt(oChest,"LockedCheck",1);
}
}
} else {
iFlag = 1;
}
}
}
void CheckZone(object oPC)
{
object oSpawn;
string sTag;
string sZone;
int iLevel;
int iMaxLevel;
int iIndex;
int iFlag;
int iCamps;
iLevel = GetHitDice(oPC);
iMaxLevel=GetLocalInt(GetArea(oPC),"MaximumLevel");
sZone = GetZone(oPC);
if (iLevel < iMaxLevel)
{
iCamps = GetMaxCampSpots(sZone);
iIndex = 0;
iFlag = 0;
while (iIndex < iCamps)
{
iIndex++;
sTag = sZone + "_C" + IntToString(iIndex) + "_Boss_S";
oSpawn = GetObjectByTag(sTag);
if (GetIsObjectValid(oSpawn))
iFlag = 1;
}
if (iFlag == 1)
SetLocalInt(GetArea(oPC),"Spawned",0);
}
//Check for special powers for PrC
if (SQLocalsUUID_GetInt(oPC,"SpecialPowers") > 0)
CreateSpecialPowers(oPC);
}
int GetMaxCampSpots(string sZone)
{
string sTag;
int iIndex;
int iFlag;
object oSpawn;
iIndex = 0;
iFlag = 0;
while (iFlag==0)
{
iIndex++;
sTag = sZone + "_C" + IntToString(iIndex) + "_Boss";
oSpawn=GetObjectByTag(sTag);
if (!(GetIsObjectValid(oSpawn)))
iFlag = 1;
}
iIndex--;
return iIndex;
}