350 lines
10 KiB
Plaintext
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 ]///////////////
|