HoS_PRC8/_mod/_module/nss/rd_oe_area.nss
Jaysyn904 04165202c0 Initial upload
Initial upload
2024-11-25 19:36:07 -05:00

350 lines
10 KiB
Plaintext

////////////////////////////////////////////////////////////////////////////////
// rd_oe_area - Random Dungeon Area Enter
// By Deva B. Winblood. November 16th, 2008.
////////////////////////////////////////////////////////////////////////////////
#include "x3_inc_string"
object fnSpawn(object oWP,string sRes)
{ // PURPOSE: Spawn if need be
object oOb;
oOb=GetLocalObject(oWP,"oCreature");
if (!GetIsObjectValid(oOb))
{ // spawn
oOb=CreateObject(OBJECT_TYPE_CREATURE,sRes,GetLocation(oWP));
SetLocalObject(oWP,"oCreature",oOb);
AssignCommand(oOb,ActionRandomWalk());
} // spawn
return oOb;
} // fnSpawn()
string fnGetRes(object oWP,string sResRef)
{ // PURPOSE: Return ResRef or use default
string sRes;
sRes=GetLocalString(oWP,"sRes");
if (GetStringLength(sRes)<1)
{ // set
sRes=sResRef;
SetLocalString(oWP,"sRes",sRes);
} // set
return sRes;
} // fnGetRes()
string fnGetALeader()
{ // PURPOSE: Return a random leader type
object oMod=GetModule();
string sRet="";
int nR=d100();
while(GetStringLength(sRet)<1)
{ // find
if (nR<41)
{ // hobgoblin
sRet="rdhobchamp";
} // hobgoblin
else if (nR<61)
{ // intellect devourer
sRet="devour001";
} // intellect devourer
else if (nR<71)
{ // elder stone giant
sRet="rdgstone2";
} // elder stone giant
else if (nR<76)
{ // ancient shadow dragon - unique
if (!GetLocalInt(oMod,"bRDShadDrag"))
{ // okay to create
SetLocalInt(oMod,"bRDShadDrag",TRUE);
sRet="dragonshadow";
} // okay to create
} // ancient shadow dragon - unique
else if (nR<81)
{ // harys - unique
if (!GetLocalInt(oMod,"bRDHarys"))
{ // okay to create
SetLocalInt(oMod,"bRDHarys",TRUE);
sRet="rdlharys";
} // okay to create
} // harys - unique
else if (nR<86)
{ // fell - unique
if (!GetLocalInt(oMod,"bRDFell"))
{ // okay to create
SetLocalInt(oMod,"bRDFell",TRUE);
sRet="rdlfell";
} // okay to create
} // fell - unique
else if (nR<91)
{ // sormen - unique
if (!GetLocalInt(oMod,"bRDSormen"))
{ // okay to create
SetLocalInt(oMod,"bRDSormen",TRUE);
sRet="rdlsormen";
} // okay to create
} // sormen - unique
else if (nR<96)
{ // hiril - unique
if (!GetLocalInt(oMod,"bRDHiril"))
{ // okay to create
SetLocalInt(oMod,"bRDHiril",TRUE);
sRet="rdlhiril";
} // okay to create
} // hiril - unique
nR=d100();
} // find
return sRet;
} // fnGetALeader()
string fnGetCommon()
{ // PURPOSE: Return Common
int nR=d100();
string sRes="";
if(nR<6) sRes="rdcommon1";
else if (nR<11) sRes="rdcommon2";
else if (nR<14) sRes="rdcommon3";
else if (nR<17) sRes="rdcommon4";
else if (nR<21) sRes="rdcommon5";
else if (nR<24) sRes="btlfire002";
else if (nR<31) sRes="btlfire004";
else if (nR<41) sRes="hosstirge";
else if (nR<43) sRes="cockatrice001";
else if (nR<46) sRes="basilisk001";
else if (nR<51) sRes="deeprothe002";
else if (nR<61) sRes="gargoyle001";
else if (nR<76) { sRes="horror001"; }
return sRes;
} // fnGetCommon()
string fnGetSecond(string sMain)
{ // PURPOSE: Return the second type of creature
string sRes="";
if (sMain=="rdhobchamp") return "hobgoblin002";
else if (sMain=="devour001") return "hobgoblin003";
else if (sMain=="rdgstone2") return "rdgstone1";
else if (sMain=="dragonshadow") return "rdcommon2";
return sRes;
} // fnGetSecond()
void fnAreaRD2()
{ // PURPOSE: Handle area Beholder Caves Area
object oCenter=GetWaypointByTag("AREA_RD2");
object oWP=GetNearestObjectByTag("RD_SPAWNL_A",oCenter);
object oOb;
int nN;
int nR;
string sRes;
if (GetIsObjectValid(oWP))
{ // spawn leader found - Group A
sRes=fnGetRes(oWP,"rdbeholder3"); // G'Zorb
oOb=fnSpawn(oWP,sRes);
nN=1;
oWP=GetNearestObjectByTag("RD_SPAWN_A",oCenter,nN);
while(GetIsObjectValid(oWP))
{ // spawn rest of group
nR=d100();
if (nR<66) sRes=fnGetRes(oWP,"rdbeholder1"); // Eyeball
else { sRes=fnGetRes(oWP,"rdbeholder2"); } // Beholder
oOb=fnSpawn(oWP,sRes);
nN++;
oWP=GetNearestObjectByTag("RD_SPAWN_A",oCenter,nN);
} // spawn rest of group
} // spawn leader found - Group A
oWP=GetNearestObjectByTag("RD_SPAWNL_B",oCenter);
sRes=fnGetRes(oWP,"");
if (GetStringLength(sRes)<1)
{ // get
sRes=fnGetALeader();
sRes=fnGetRes(oWP,sRes);
} // get
if (GetStringLength(sRes)>0)
{ // leader found
oOb=fnSpawn(oWP,sRes);
sRes=fnGetSecond(sRes);
if (GetStringLength(sRes)>0)
{ // spawn
nN=1;
oWP=GetNearestObjectByTag("RD_SPAWN_B",oCenter,nN);
while(GetIsObjectValid(oWP))
{ // spawn
oOb=fnSpawn(oWP,sRes);
nN++;
oWP=GetNearestObjectByTag("RD_SPAWN_B",oCenter,nN);
} // spawn
} // spawn
} // leader found
else
{ // common
sRes=fnGetCommon();
sRes=fnGetRes(oWP,sRes);
if (GetStringLength(sRes)>0)
{ // spawn
oOb=fnSpawn(oWP,sRes);
} // spawn
} // common
oWP=GetNearestObjectByTag("RD_SPAWNL_C",oCenter);
sRes=fnGetRes(oWP,"");
if (GetStringLength(sRes)<1)
{ // get
sRes=fnGetALeader();
sRes=fnGetRes(oWP,sRes);
} // get
if (GetStringLength(sRes)>0)
{ // leader found
oOb=fnSpawn(oWP,sRes);
sRes=fnGetSecond(sRes);
if (GetStringLength(sRes)>0)
{ // spawn
nN=1;
oWP=GetNearestObjectByTag("RD_SPAWN_C",oCenter,nN);
while(GetIsObjectValid(oWP))
{ // spawn
oOb=fnSpawn(oWP,sRes);
nN++;
oWP=GetNearestObjectByTag("RD_SPAWN_C",oCenter,nN);
} // spawn
} // spawn
} // leader found
else
{ // common
sRes=fnGetCommon();
sRes=fnGetRes(oWP,sRes);
if (GetStringLength(sRes)>0)
{ // spawn
oOb=fnSpawn(oWP,sRes);
} // spawn
} // common
oWP=GetNearestObjectByTag("RD_SPAWNL_D",oCenter);
sRes=fnGetRes(oWP,"");
if (GetStringLength(sRes)<1)
{ // get
sRes=fnGetALeader();
sRes=fnGetRes(oWP,sRes);
} // get
if (GetStringLength(sRes)>0)
{ // leader found
oOb=fnSpawn(oWP,sRes);
sRes=fnGetSecond(sRes);
if (GetStringLength(sRes)>0)
{ // spawn
nN=1;
oWP=GetNearestObjectByTag("RD_SPAWN_D",oCenter,nN);
while(GetIsObjectValid(oWP))
{ // spawn
oOb=fnSpawn(oWP,sRes);
nN++;
oWP=GetNearestObjectByTag("RD_SPAWN_D",oCenter,nN);
} // spawn
} // spawn
} // leader found
else
{ // common
sRes=fnGetCommon();
sRes=fnGetRes(oWP,sRes);
if (GetStringLength(sRes)>0)
{ // spawn
oOb=fnSpawn(oWP,sRes);
} // spawn
} // common
} // fnAreaRD2()
void fnAreaRDGeneral(string sTag)
{ // PURPOSE: Setup area
object oCenter=GetWaypointByTag("AREA_"+sTag);
object oWP;
int nN;
int nR;
object oOb;
string sRes;
string sL;
int nC=1;
while(nC<5)
{ // spawn at each leader location
if (nC==1) sL="A";
else if (nC==2) sL="B";
else if (nC==3) sL="C";
else if (nC==4) sL="D";
oWP=GetNearestObjectByTag("RD_SPAWNL_"+sL,oCenter);
if (GetIsObjectValid(oWP))
{ // leader waypoint found
sRes=fnGetRes(oWP,"");
if (GetStringLength(sRes)<1)
{ // get
sRes=fnGetALeader();
sRes=fnGetRes(oWP,sRes);
} // get
if (GetStringLength(sRes)>0)
{ // leader to spawn
oOb=fnSpawn(oWP,sRes);
sRes=fnGetSecond(sRes);
if (GetStringLength(sRes)>0)
{ // spawn
nN=1;
oWP=GetNearestObjectByTag("RD_SPAWN_"+sL,oCenter,nN);
while(GetIsObjectValid(oWP))
{ // spawn
oOb=fnSpawn(oWP,sRes);
nN++;
oWP=GetNearestObjectByTag("RD_SPAWN_"+sL,oCenter,nN);
} // spawn
} // spawn
} // leader to spawn
else
{ // common
sRes=fnGetCommon();
sRes=fnGetRes(oWP,sRes);
if (GetStringLength(sRes)>0)
{ // spawn
oOb=fnSpawn(oWP,sRes);
} // spawn
} // common
} // leader waypoint found
nC++;
} // spawn at each leader location
nN=1;
oOb=GetNearestObjectByTag("RD_SPAWN",oCenter,nN);
while(GetIsObjectValid(oOb))
{ // PURPOSE: place normal spawn
sRes=fnGetRes(oWP,"");
if (GetStringLength(sRes)<1)
{ // find resref
sRes=fnGetCommon();
sRes=fnGetRes(oWP,sRes);
} // find resref
if (GetStringLength(sRes)>1)
{ // Spawn
oOb=fnSpawn(oWP,sRes);
} // spawn
nN++;
oOb=GetNearestObjectByTag("RD_SPAWN",oCenter,nN);
} // PURPOSE: place normal spawn
} // fnAreaRDGeneral()
/////////////////////////////////////////////////////////[ MAIN ]///////////////
void main()
{
object oArea=OBJECT_SELF;
object oPC=GetEnteringObject();
if (GetIsPC(oPC))
{ // PC
int nABSDay=GetCalendarDay()+(GetCalendarMonth()*30)+(GetCalendarYear()*12*30);
int nLast=GetLocalInt(oArea,"nLastSpawnDay");
if (nLast!=nABSDay)
{ // spawn okay
SetLocalInt(oArea,"nLastSpawnDay",nABSDay);
string sTag=GetTag(oArea);
if (sTag=="RD2") fnAreaRD2();
else { fnAreaRDGeneral(sTag); }
} // spawn okay
ExecuteScript("area_visit",OBJECT_SELF);
} // PC
}
/////////////////////////////////////////////////////////[ MAIN ]///////////////