155 lines
4.4 KiB
Plaintext
155 lines
4.4 KiB
Plaintext
//////////////////////////////////////////////////
|
|
// rts_pathing
|
|
//================================================
|
|
// By Deva Bryson Winblood
|
|
// 12/08/2003
|
|
//////////////////////////////////////////////////
|
|
#include "rts_wp_header"
|
|
///////////////////////
|
|
// PROTOTYPES
|
|
///////////////////////
|
|
|
|
// FILE: rts_pathing
|
|
// oCurrent = Current Area
|
|
// oDest = Object trying to reach
|
|
// sDestID = UNC, UND, DWF, SPID
|
|
// nOpt = 0 = Path choosing preferably the same area type as current
|
|
// 1 = Path choosing preferably underground ways
|
|
// 2 = Path choosing preferably aboveground ways
|
|
// 3 = Path choosing below ground during day, above ground at night
|
|
// 4 = Below ground a MUST! Also seek below ground shelter
|
|
object fnReversePath(object oCurrent,object oDest,string sDestID,int nOpt=0);
|
|
|
|
/////////////////////////////////////////////////////////
|
|
// SUPPORT FUNCTIONS
|
|
/////////////////////////////////////////////////////////
|
|
void fnPathingError(string sMsg)
|
|
{ // PATHING ERROR
|
|
object oPC=GetFirstPC();
|
|
while(oPC!=OBJECT_INVALID)
|
|
{ // pathing error
|
|
SendMessageToPC(oPC,"ERROR-ERROR-:"+sMsg);
|
|
oPC=GetNextPC();
|
|
} // pathing error
|
|
PrintString("ERROR-ERROR-:"+sMsg);
|
|
} // fnPathingError()
|
|
|
|
object fnRandomTrans(object oArea)
|
|
{ // return a random transition door or trigger
|
|
object oRet=OBJECT_INVALID;
|
|
int nC=GetLocalInt(oArea,"nPathingTC");
|
|
if (nC<1)
|
|
{
|
|
fnBuildTransRand(oArea);
|
|
return OBJECT_INVALID;
|
|
}
|
|
else
|
|
{
|
|
nC=Random(nC)+1;
|
|
oRet=GetLocalObject(oArea,"oPathingTrans"+IntToString(nC));
|
|
}
|
|
return oRet;
|
|
} // fnRandomTrans()
|
|
|
|
object fnRandomObjects(object oArea)
|
|
{ // return an object in this area
|
|
object oRet=OBJECT_INVALID;
|
|
int nC=GetLocalInt(oArea,"nPathingOC");
|
|
if (nC<1)
|
|
{
|
|
fnBuildObjectRand(oArea);
|
|
return OBJECT_INVALID;
|
|
}
|
|
else
|
|
{
|
|
nC=Random(nC)+1;
|
|
oRet=GetLocalObject(oArea,"oPathingObs"+IntToString(nC));
|
|
}
|
|
return oRet;
|
|
} // fnRandomObjects()
|
|
|
|
string fnParse(string sSource,string sDelim=".")
|
|
{ // parse
|
|
string sRet="";
|
|
string sMaster=sSource;
|
|
while(GetStringLeft(sMaster,1)!=sDelim&&GetStringLength(sMaster)>0)
|
|
{ // parse
|
|
sRet=sRet+GetStringLeft(sMaster,1);
|
|
sMaster=GetStringRight(sMaster,GetStringLength(sMaster)-1);
|
|
} // parse
|
|
return sRet;
|
|
} // fnParse()
|
|
|
|
string fnRemoveParsed(string sSource,string sParsed,string sDelim=".")
|
|
{ // remove the portion parsed from the original string
|
|
string sRet="";
|
|
if (GetStringLength(sSource)<GetStringLength(sParsed)) return sRet;
|
|
sRet=GetStringRight(sSource,GetStringLength(sSource)-GetStringLength(sParsed));
|
|
if (GetStringLeft(sRet,1)==sDelim) sRet=GetStringRight(sRet,GetStringLength(sRet)-1);
|
|
return sRet;
|
|
} // fnRemoveParsed()
|
|
|
|
//////////////////////////////////////
|
|
// PAthing
|
|
//////////////////////////////////////
|
|
object fnGetTransitionToArea(object oCurrentArea,object oTransitionTo)
|
|
{ // will return a transition if one exists
|
|
object oRet=OBJECT_INVALID;
|
|
int nTC=GetLocalInt(oCurrentArea,"nPathinTC");
|
|
object oT;
|
|
object oTarg;
|
|
int nC=1;
|
|
while(nC<=nTC)
|
|
{ // test
|
|
oT=GetLocalObject(oCurrentArea,"oPathingTrans"+IntToString(nC));
|
|
oTarg=GetTransitionTarget(oT);
|
|
if (GetArea(oTarg)==oTransitionTo) return oT;
|
|
nC++;
|
|
} // test
|
|
return oRet;
|
|
} // fnGetTransitionToArea()
|
|
|
|
object fnReversePath(object oCurrent,object oDest,string sDestID,int nOpt=0)
|
|
{ // build a path in reverse
|
|
object oRet=OBJECT_INVALID;
|
|
object oPath;
|
|
object oConnection;
|
|
object oLeadsTo;
|
|
int nStop=FALSE;
|
|
/// Try a strait run
|
|
oPath=fnPathNextDestination(GetArea(oDest),sDestID,nOpt);
|
|
if (oPath!=OBJECT_INVALID)
|
|
{ // path
|
|
oLeadsTo=GetTransitionTarget(oPath);
|
|
if (GetArea(oLeadsTo)==oCurrent)
|
|
{ // link
|
|
oConnection=fnGetTransitionToArea(oCurrent,GetArea(oPath));
|
|
return oConnection;
|
|
} // link
|
|
else
|
|
{ // while
|
|
while(oPath!=OBJECT_INVALID&&nStop!=TRUE)
|
|
{ // build path
|
|
if (GetArea(oLeadsTo)==oCurrent)
|
|
{ // direct link
|
|
oConnection=fnGetTransitionToArea(oCurrent,GetArea(oPath));
|
|
return oConnection;
|
|
} // direct link
|
|
else
|
|
{ // adjoining link?
|
|
oConnection=fnGetTransitionToArea(oCurrent,GetArea(oPath));
|
|
if (oConnection!=OBJECT_INVALID) return oConnection;
|
|
} // adjoining link?
|
|
oPath=fnPathNextDestination(GetArea(oLeadsTo),sDestID,nOpt);
|
|
oLeadsTo=GetTransitionTarget(oPath);
|
|
} // build path
|
|
} // while
|
|
} // path
|
|
return oRet;
|
|
} // fnReversePath()
|
|
|
|
//void main() {}
|
|
|
|
|
|
|