82 lines
2.3 KiB
Plaintext
82 lines
2.3 KiB
Plaintext
// ai_header2
|
|
#include "rts_pathing"
|
|
#include "rts_header"
|
|
///////////////////
|
|
// PROTOTYPE
|
|
///////////////////
|
|
object fnTransitionOutside(int nObjectType);
|
|
object fnFindSafeTransition();
|
|
|
|
//////////////////
|
|
// FUNCTION
|
|
//////////////////
|
|
object fnTransitionOutside(int nObjectType)
|
|
{ // get transition target
|
|
object oRet=OBJECT_INVALID;
|
|
int nC=1;
|
|
object oTO;
|
|
object oTarget;
|
|
object oMe=OBJECT_SELF;
|
|
oTO=GetNearestObject(nObjectType,oMe,nC);
|
|
while(oTO!=OBJECT_INVALID&&oRet==OBJECT_INVALID)
|
|
{ // check transition object
|
|
oTarget=GetTransitionTarget(oTO);
|
|
if (oTarget!=OBJECT_INVALID) oRet=oTarget;
|
|
nC++;
|
|
oTO=GetNearestObject(nObjectType,oMe,nC);
|
|
} // check transition object
|
|
return oRet;
|
|
} // fnTransitionOutside()
|
|
|
|
int fnNotGoodArea(object oTT)
|
|
{ // transition
|
|
string sTag=GetTag(GetArea(oTT));
|
|
if (sTag=="AGC") return FALSE;
|
|
else if (sTag=="AGE") return FALSE;
|
|
else if (sTag=="AGN") return FALSE;
|
|
else if (sTag=="AGNE") return FALSE;
|
|
else if (sTag=="AGNW") return FALSE;
|
|
else if (sTag=="AGS") return FALSE;
|
|
else if (sTag=="AGSE") return FALSE;
|
|
else if (sTag=="AGSW") return FALSE;
|
|
else if (sTag=="AGW") return FALSE;
|
|
else if (sTag=="BGC") return FALSE;
|
|
else if (sTag=="BGE") return FALSE;
|
|
else if (sTag=="BGN") return FALSE;
|
|
else if (sTag=="BGNE") return FALSE;
|
|
else if (sTag=="BGNW") return FALSE;
|
|
else if (sTag=="BGS") return FALSE;
|
|
else if (sTag=="BGSE") return FALSE;
|
|
else if (sTag=="BGSW") return FALSE;
|
|
else if (sTag=="BGW") return FALSE;
|
|
return TRUE;
|
|
} // fnNotGoodArea()
|
|
|
|
object fnFindSafeTransition()
|
|
{ // find safe transition
|
|
object oOb;
|
|
object oTT;
|
|
int nR=d4();
|
|
int nL=0;
|
|
object oMe=OBJECT_SELF;
|
|
if (nR<3) oOb=GetNearestObject(OBJECT_TYPE_TRIGGER,oMe,d6());
|
|
else { oOb=GetNearestObject(OBJECT_TYPE_DOOR,oMe,d6()); }
|
|
oTT=GetTransitionTarget(oOb);
|
|
while((oTT==OBJECT_INVALID||fnNotGoodArea(oTT)==TRUE)&&nL<5)
|
|
{ // look for transition
|
|
nR=d4();
|
|
if (nR<3) oOb=GetNearestObject(OBJECT_TYPE_TRIGGER,oMe,d6());
|
|
else { oOb=GetNearestObject(OBJECT_TYPE_DOOR,oMe,d6()); }
|
|
oTT=GetTransitionTarget(oOb);
|
|
nL++;
|
|
} // look for transition
|
|
if (oTT!=OBJECT_INVALID&&fnNotGoodArea(oTT)==FALSE)
|
|
{ // good area
|
|
oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oTT,1);
|
|
return oOb;
|
|
} // good area
|
|
return OBJECT_INVALID;
|
|
} // fnFindSafeTransition()
|
|
|
|
//void main(){}
|