Merged redundant hak files. Moved hak scripts into module. Updated gitignore. Full Compile. Added release folder & archive.
252 lines
8.0 KiB
Plaintext
252 lines
8.0 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////////
|
|
// REAL TIME STRATEGY ADVENTURE - Kit
|
|
// FILE: rtsa_headers
|
|
// NAME: STACK FUNCTIONS AND DATA TYPES
|
|
// SCRIPTED BY: Deva Bryson Winblood
|
|
// DATE: 4/16/2003
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
#include "rtsa_headere" // error and debug
|
|
//////////////////////////////////////////
|
|
// STACK FUNCTIONS - These stack functions support multiple data types
|
|
//////////////////////////////////////////
|
|
// fnInitializeStack(),fnPush(),fnPop<dt>(),fnSizeS(),fnFlushS(),fnReverseS()
|
|
|
|
void fnInitializeStack(string sPrefix,int nType=0)
|
|
{ // Setup stack variable on Controller
|
|
fnDebug("fnInitializeStack("+sPrefix+","+IntToString(nType)+")");
|
|
SetLocalInt(OBJECT_SELF,sPrefix+"TOP",0);
|
|
SetLocalInt(OBJECT_SELF,sPrefix+"TYPE",nType);
|
|
// Types supported 0 = multi-data 1=string 2=int 3=object 4=float
|
|
} // fnInitializeStack()
|
|
|
|
int fnPush(string sPrefix, string sSt="",int nInt=0,object oOb=OBJECT_INVALID, float fFl=0.0,int nIncrement=TRUE)
|
|
{ // Push item onto stack return -1 if invalid data type
|
|
object oMe=OBJECT_SELF;
|
|
int nTop=GetLocalInt(oMe,sPrefix+"TOP");
|
|
int nType=GetLocalInt(oMe,sPrefix+"TYPE");
|
|
int nNewTop=nTop;
|
|
int nRet=1;
|
|
fnDebug("fnPush("+sPrefix+",'"+sSt+"',"+IntToString(nInt)+","+GetTag(oOb)+","+FloatToString(fFl)+",INCREMENT:"+IntToString(nIncrement)+")");
|
|
//SendMessageToPC(GetFirstPC(),"Type of stack:"+IntToString(nType));
|
|
if (sSt!=""&&(nType!=0&&nType!=1)){
|
|
fnDebug("Strings not allowed on stack");
|
|
return -1;
|
|
}
|
|
if (nInt!=0&&(nType!=0&&nType!=2)) {
|
|
fnDebug("Integer not allowed on stack");
|
|
return -1;
|
|
}
|
|
if (oOb!=OBJECT_INVALID&&(nType!=0&&nType!=3)){
|
|
fnDebug("Objects not allowed on stack");
|
|
return -1;
|
|
}
|
|
if (fFl!=0.0&&(nType!=0&&nType!=4)){
|
|
fnDebug("Floating Point not allowed on stack");
|
|
return -1;
|
|
}
|
|
//SendMessageToPC(GetFirstPC(),"Stack types not invalid");
|
|
if (sSt!=""||nType==1)
|
|
{
|
|
fnDebug(" STRING TYPE");
|
|
if (nIncrement==TRUE) nNewTop=nTop+1;
|
|
SetLocalString(oMe,sPrefix+"STR"+IntToString(nNewTop),sSt);
|
|
}
|
|
if (nInt!=0||nType==2)
|
|
{
|
|
fnDebug(" INTEGER TYPE");
|
|
if (nIncrement==TRUE) nNewTop=nTop+1;
|
|
SetLocalInt(oMe,sPrefix+"INT"+IntToString(nNewTop),nInt);
|
|
}
|
|
if (oOb!=OBJECT_INVALID||nType==3)
|
|
{
|
|
fnDebug(" OBJECT TYPE:"+GetName(oOb)+"/"+GetTag(oOb)+"/"+GetResRef(oOb));
|
|
if (nIncrement==TRUE) nNewTop=nTop+1;
|
|
SetLocalObject(oMe,sPrefix+"OB"+IntToString(nNewTop),oOb);
|
|
}
|
|
if (fFl!=0.0||nType==4)
|
|
{
|
|
fnDebug(" FLOAT TYPE");
|
|
if (nIncrement==TRUE) nNewTop=nTop+1;
|
|
SetLocalFloat(oMe,sPrefix+"FL"+IntToString(nNewTop),fFl);
|
|
}
|
|
SetLocalInt(oMe,sPrefix+"TOP",nNewTop);
|
|
//SendMessageToPC(GetFirstPC(),"fnPush() Top="+IntToString(nNewTop));
|
|
fnDebug(" EXIT PUSH");
|
|
return nRet;
|
|
} // fnPush()
|
|
|
|
string fnPopString(string sPrefix,int nDecrement=TRUE)
|
|
{ // pop a string off the stack
|
|
string sRet="";
|
|
object oMe=OBJECT_SELF;
|
|
int nTop=GetLocalInt(oMe,sPrefix+"TOP");
|
|
fnDebug(" POP STRING");
|
|
sRet=GetLocalString(oMe,sPrefix+"STR"+IntToString(nTop));
|
|
if (nDecrement==TRUE)
|
|
{ // decrement stack
|
|
DeleteLocalString(oMe,sPrefix+"STR"+IntToString(nTop));
|
|
DeleteLocalInt(oMe,sPrefix+"INT"+IntToString(nTop));
|
|
DeleteLocalObject(oMe,sPrefix+"OB"+IntToString(nTop));
|
|
DeleteLocalFloat(oMe,sPrefix+"FL"+IntToString(nTop));
|
|
SetLocalInt(oMe,sPrefix+"TOP",nTop-1);
|
|
} // decrement stack
|
|
return sRet;
|
|
} // fnPopString()
|
|
|
|
int fnPopInt(string sPrefix,int nDecrement=TRUE)
|
|
{ // pop an integer off the stack
|
|
int nRet=0;
|
|
object oMe=OBJECT_SELF;
|
|
int nTop=GetLocalInt(oMe,sPrefix+"TOP");
|
|
fnDebug(" POP INT");
|
|
nRet=GetLocalInt(oMe,sPrefix+"INT"+IntToString(nTop));
|
|
if (nDecrement==TRUE)
|
|
{ // decrement stack
|
|
DeleteLocalString(oMe,sPrefix+"STR"+IntToString(nTop));
|
|
DeleteLocalInt(oMe,sPrefix+"INT"+IntToString(nTop));
|
|
DeleteLocalObject(oMe,sPrefix+"OB"+IntToString(nTop));
|
|
DeleteLocalFloat(oMe,sPrefix+"FL"+IntToString(nTop));
|
|
SetLocalInt(oMe,sPrefix+"TOP",nTop-1);
|
|
} // decrement stack
|
|
return nRet;
|
|
} // fnPopInt()
|
|
|
|
object fnPopObject(string sPrefix,int nDecrement=TRUE)
|
|
{ // pop an object off the stack
|
|
object oRet=OBJECT_INVALID;
|
|
object oMe=OBJECT_SELF;
|
|
int nTop=GetLocalInt(oMe,sPrefix+"TOP");
|
|
fnDebug(" POP OBJECT");
|
|
oRet=GetLocalObject(oMe,sPrefix+"OB"+IntToString(nTop));
|
|
if (nDecrement==TRUE)
|
|
{ // decrement stack
|
|
DeleteLocalString(oMe,sPrefix+"STR"+IntToString(nTop));
|
|
DeleteLocalInt(oMe,sPrefix+"INT"+IntToString(nTop));
|
|
DeleteLocalObject(oMe,sPrefix+"OB"+IntToString(nTop));
|
|
DeleteLocalFloat(oMe,sPrefix+"FL"+IntToString(nTop));
|
|
SetLocalInt(oMe,sPrefix+"TOP",nTop-1);
|
|
} // decrement stack
|
|
return oRet;
|
|
} // fnPopObject()
|
|
|
|
float fnPopFloat(string sPrefix,int nDecrement=TRUE)
|
|
{ // pop a float off the stack
|
|
float fRet=0.0;
|
|
object oMe=OBJECT_SELF;
|
|
int nTop=GetLocalInt(oMe,sPrefix+"TOP");
|
|
fnDebug(" POP FLOAT");
|
|
fRet=GetLocalFloat(oMe,sPrefix+"FL"+IntToString(nTop));
|
|
if (nDecrement==TRUE)
|
|
{ // decrement stack
|
|
DeleteLocalString(oMe,sPrefix+"STR"+IntToString(nTop));
|
|
DeleteLocalInt(oMe,sPrefix+"INT"+IntToString(nTop));
|
|
DeleteLocalObject(oMe,sPrefix+"OB"+IntToString(nTop));
|
|
DeleteLocalFloat(oMe,sPrefix+"FL"+IntToString(nTop));
|
|
SetLocalInt(oMe,sPrefix+"TOP",nTop-1);
|
|
} // decrement stack
|
|
return fRet;
|
|
} // fnPopFloat()
|
|
|
|
int fnSizeS(string sPrefix)
|
|
{ // returns TOP of stack #
|
|
return GetLocalInt(OBJECT_SELF,sPrefix+"TOP");
|
|
} // fnSizeS()
|
|
|
|
void fnFlushS(string sPrefix)
|
|
{ // Flush the stack
|
|
string sVal;
|
|
int nTop=fnSizeS(sPrefix);
|
|
fnDebug(" fnFlushS("+sPrefix+")");
|
|
while(nTop!=0)
|
|
{ // flush stack
|
|
sVal=fnPopString(sPrefix);
|
|
nTop=fnSizeS(sPrefix);
|
|
} // flush stack
|
|
} // fnFlushS()
|
|
|
|
void fnReverseS(string sPrefix)
|
|
{ // Reverse stack order
|
|
string sReverse=sPrefix+"R";
|
|
object oMe=OBJECT_SELF;
|
|
int nTop=fnSizeS(sPrefix);
|
|
int nType=GetLocalInt(oMe,sPrefix+"TYPE");
|
|
string sStr;
|
|
int nInt;
|
|
object oOb;
|
|
float fFl;
|
|
int nRP;
|
|
fnInitializeStack(sReverse,0);
|
|
SetLocalInt(oMe,sReverse+"TOP",nTop);
|
|
while(nTop>0)
|
|
{ // reverse stack
|
|
if (nType==0)
|
|
{ // multi-type
|
|
sStr=fnPopString(sPrefix,FALSE);
|
|
nInt=fnPopInt(sPrefix,FALSE);
|
|
oOb=fnPopObject(sPrefix,FALSE);
|
|
fFl=fnPopFloat(sPrefix);
|
|
fnPush(sReverse,sStr,nInt,oOb,fFl);
|
|
} // multi-type
|
|
else if (nType==1)
|
|
{ // string
|
|
sStr=fnPopString(sPrefix);
|
|
fnPush(sReverse,sStr);
|
|
} // string
|
|
else if (nType==2)
|
|
{ // int
|
|
nInt=fnPopInt(sPrefix);
|
|
fnPush(sReverse,"",nInt);
|
|
} // int
|
|
else if (nType==3)
|
|
{ // object
|
|
oOb=fnPopObject(sPrefix);
|
|
fnPush(sReverse,"",0,oOb);
|
|
} // object
|
|
else if (nType==4)
|
|
{ // float
|
|
fFl=fnPopFloat(sPrefix);
|
|
fnPush(sReverse,"",0,OBJECT_INVALID,fFl);
|
|
} // float
|
|
nTop=fnSizeS(sPrefix);
|
|
} // reverse stack
|
|
nTop=fnSizeS(sReverse);
|
|
nRP=nTop;
|
|
while(nTop>0)
|
|
{ // copy stack
|
|
if (nType==0)
|
|
{ // multi-type
|
|
sStr=fnPopString(sPrefix,FALSE);
|
|
SetLocalString(oMe,sReverse+"STR"+IntToString(nTop),sStr);
|
|
nInt=fnPopInt(sPrefix,FALSE);
|
|
SetLocalInt(oMe,sReverse+"INT"+IntToString(nTop),nInt);
|
|
oOb=fnPopObject(sPrefix,FALSE);
|
|
SetLocalObject(oMe,sReverse+"OB"+IntToString(nTop),oOb);
|
|
fFl=fnPopFloat(sPrefix);
|
|
SetLocalFloat(oMe,sReverse+"FL"+IntToString(nTop),fFl);
|
|
} // multi-type
|
|
else if (nType==1)
|
|
{ // string
|
|
sStr=fnPopString(sPrefix);
|
|
SetLocalString(oMe,sReverse+"STR"+IntToString(nTop),sStr);
|
|
} // string
|
|
else if (nType==2)
|
|
{ // int
|
|
nInt=fnPopInt(sPrefix);
|
|
SetLocalInt(oMe,sReverse+"INT"+IntToString(nTop),nInt);
|
|
} // int
|
|
else if (nType==3)
|
|
{ // object
|
|
oOb=fnPopObject(sPrefix);
|
|
SetLocalObject(oMe,sReverse+"OB"+IntToString(nTop),oOb);
|
|
} // object
|
|
else if (nType==4)
|
|
{ // float
|
|
fFl=fnPopFloat(sPrefix);
|
|
SetLocalFloat(oMe,sReverse+"FL"+IntToString(nTop),fFl);
|
|
} // float
|
|
nTop=fnSizeS(sReverse);
|
|
} // copy stack
|
|
SetLocalInt(oMe,sPrefix+"TOP",nRP);
|
|
} // fnReverseS()
|
|
|