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

1484 lines
47 KiB
Plaintext

/////////////////////////////////////////////////////////////////////////////////
// mai_challenge - This is a more advanced AI routine for Computer Controlled Teams
// By Deva Bryson Winblood. 04/13/2004
// This is a modified version supporting custom settings by the game settings console
// Modifications created: 02/04/2005 By Deva Bryson Winblood.
////////////////////////////////////////////////////////////////////////////////
#include "ai_header"
////////////////////////
// PROTOTYPES
////////////////////////
int fnLevel(object oOb);
string fnReturnUnitRes(string sID,string sPos,int nLLevel);
int fnGetGold(string sID);
void fnSetGold(string sID,int nGold);
void fnSpendGold(string sID,string sPID);
void fnMAIReport(string sMsg)
{ // PURPOSE: Log the message to the file
PrintString("(mai_challenge) report: "+sMsg);
} // fnMAIReport()
void fnBird(object oBird,string sTeamID,object oLeader)
{
object oMod=GetModule();
//SendMessageToPC(GetFirstPC(),"fnBird("+GetName(oBird)+","+sTeamID+","+GetName(oLeader)+")");
SetLocalString(oBird,"sTeamID",sTeamID);
SetLocalInt(oBird,"nMState",22);
SetLocalInt(oBird,"nSState",0);
ChangeFaction(oBird,oLeader);
SetLocalObject(oMod,"oAISBird"+sTeamID,oBird);
SetAILevel(oBird,AI_LEVEL_NORMAL);
}
void fnRaid(object oOb,string sRaid,int nParm)
{
DeleteLocalInt(oOb,"nSState");
SetLocalString(oOb,"sTeamToRaid",sRaid);
SetLocalInt(oOb,"nParm",nParm); // attack
SetLocalInt(oOb,"nMState",17);
SetLocalInt(oOb,"nRun",TRUE);
//AssignCommand(oOb,SpeakString("*raid "+sRaid+"*"));
}
void fnHireMerc(string sTeamID,string sPID)
{
object oMod=GetModule();
int nGold=fnGetGold(sTeamID);
int nBase=0;
int nEnd=0;
int nCost=0;
int nL=1;
string sRaid="NA";
object oOb;
object oMerc;
object oTMerc1=GetLocalObject(oMod,"oTMerc1"+sTeamID); // Team mercenary 1
object oTMerc2=GetLocalObject(oMod,"oTMerc2"+sTeamID); // Team mercenary 2
while(nL<4)
{ // check mercenary prices
oOb=GetLocalObject(oMod,"oMerL"+IntToString(nL)+sTeamID);
if (oOb!=OBJECT_INVALID)
{ // know this merchant
if (GetLocalInt(oMod,"nMerLC"+IntToString(nL)+"_1"+sTeamID)<nGold)
{ // have enough gold
if (GetLocalInt(oMod,"nMerLC"+IntToString(nL)+"_1"+sTeamID)>nCost)
{ nBase=nL; nEnd=1; nCost=GetLocalInt(oMod,"nMerLC"+IntToString(nL)+"_1"+sTeamID);}
} // have enough gold
if (GetLocalInt(oMod,"nMerLC"+IntToString(nL)+"_2"+sTeamID)<nGold)
{ // have enough gold
if (GetLocalInt(oMod,"nMerLC"+IntToString(nL)+"_2"+sTeamID)>nCost)
{ nBase=nL; nEnd=2; nCost=GetLocalInt(oMod,"nMerLC"+IntToString(nL)+"_2"+sTeamID); }
} // have enough gold
} // know this merchant
nL++;
} // check mercenary prices
if (nCost>0)
{ // can hire a merc
sRaid=GetLocalString(oMod,"sMerL"+IntToString(nBase)+"_"+IntToString(nEnd)+sTeamID);
oOb=GetLocalObject(oMod,"oMerL"+IntToString(nBase));
if (oOb!=OBJECT_INVALID)
{ // create mercenary
nGold=nGold-nCost;
fnSetGold(sTeamID,nGold);
oMerc=CreateObject(OBJECT_TYPE_CREATURE,sRaid,GetLocation(oOb));
SetLocalString(oMerc,"sTeamID",sTeamID);
SetLocalString(oMerc,"sTeamToRaid",sPID);
oOb=GetWaypointByTag(sTeamID+"_RESOURCES");
oOb=GetObjectByTag(sTeamID+"_PROXY");
ChangeFaction(oMerc,oOb);
SetLocalInt(oMerc,"nMState",17);
SetLocalInt(oMerc,"nParm",1);
if (oTMerc1==OBJECT_INVALID) SetLocalObject(oMod,"oTMerc1"+sTeamID,oMerc);
else {SetLocalObject(oMod,"oTMerc2"+sTeamID,oMerc); }
} // create mercenary
} // can hire a merc
}
//int fnSpawnDelay(int nLevel);
///////////////////////////////////////////////////////////////////////// MAIN
void main()
{
object oLeader=OBJECT_SELF;
string sTeamID=GetLocalString(oLeader,"sTeamID");
//SendMessageToPC(GetFirstPC(),"sTeamID="+sTeamID);
object oMod=GetModule();
int nPauseBetweenCreate=1;
int nMVD=0; // mana vault guard
int nTRD=0; // throne room guard
int nLD1=0; // Lair Defense 1 Guard
int nLD2=0; // Lair Defense 2 Guard
int nHU=0; // Harvest unit
int nIC=0; // Item Capture Unit
int nRA=0; // Raid Attack Unit
int nRM=0; // Raid Mana Unit
int nRG=0; // Raid Gold Unit
int nPR=0; // Power Reservoir capture unit
int nRL=0; // Level which raids are okay
int nPRL=0; // Level at which power reservoir units are okay
int nCPL=0; // Level at which control point capture is okay
int nCPC=0; // Control point capture
int nUCS=3; // Unit create speed - bigger = faster
object oTMerc1=GetLocalObject(oMod,"oTMerc1"+sTeamID); // Team mercenary 1
object oTMerc2=GetLocalObject(oMod,"oTMerc2"+sTeamID); // Team mercenary 2
string sPID=""; // Primary enemy ID
string sMVD="";
string sTRD="";
string sLD1="";
string sLD2="";
string sCPC="";
string sHU="";
string sIC="";
string sRA="";
string sRM="";
string sRG="";
string sPR="";
int nAIMode=0;
object oCP;
object oLD1=GetWaypointByTag(sTeamID+"_LD1");
object oLD2=GetWaypointByTag(sTeamID+"_LD2");
object oMVD=GetWaypointByTag(sTeamID+"_VAULT");
object oTRD=GetWaypointByTag(sTeamID+"_START");
string sPre="oAdvAIUnit"+sTeamID;
int nReturnState=13; // return mana or item state
int nCN=0; // create number
int nUN=0; // upgrade number
int nUC=0; // units created (only 4 per tic)
int nRC=0; // count of raid units waiting to go on raid
int nUAL=0; // Units allowed
int nL;
int nBase;
int nEnd;
int nCost;
int nGold;
object oMerc;
object oOb;
string sRaid;
int nLeaderLevel=fnLevel(oLeader);
int nAIC=GetLocalInt(oMod,"nAIC"+sTeamID);
object oEnemy=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oLeader,1,CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);
int nSpawnRes=GetLocalInt(oMod,"nAISpawnRes"+sTeamID); // spawn resource amount
/*object oBird=GetLocalObject(oMod,"oAISBird"+sTeamID);
if (oBird==OBJECT_INVALID||GetIsDead(oBird)==TRUE)
{ // scavenger bird
oBird=CreateObject(OBJECT_TYPE_CREATURE,"scavbird",GetLocation(oLD1));
DelayCommand(1.0,fnBird(oBird,sTeamID,oLeader));
} // scavenger bird */
fnMAIReport(GetName(oLeader)+" Level:"+IntToString(nLeaderLevel));
fnMAIReport(" nAIC:"+IntToString(nAIC)+" nSpawnRes:"+IntToString(nSpawnRes));
nGold=fnGetGold(sTeamID);
if (nGold>(nLeaderLevel*1000)) fnSetGold(sTeamID,nLeaderLevel*1000);
if (oEnemy==OBJECT_INVALID)
{ // no enemies nearby
if (GetLocalInt(oMod,"nAIPauseSetting")>0) nPauseBetweenCreate=GetLocalInt(oMod,"nAIPauseSetting");
if (GetLocalInt(oMod,"nAIUnitCreateSpeed")>0) nUCS=GetLocalInt(oMod,"nAIUnitCreateSpeed");
nAIC++;
if (nAIC>=nPauseBetweenCreate)
{ // AI ok
nSpawnRes=nSpawnRes+nUCS;
nUAL=nSpawnRes/nLeaderLevel;
if (nUAL>nUCS) nUAL=nUCS;
if (nUAL>=1)
{ // enough resources to spawn
DeleteLocalInt(oMod,"nAIC"+sTeamID);
if (oLD1==OBJECT_INVALID) SendMessageToPC(GetFirstPC(),sTeamID+"_LD1 waypoint not found.");
if (oLD2==OBJECT_INVALID) SendMessageToPC(GetFirstPC(),sTeamID+"_LD2 waypoint not found.");
if (oMVD==OBJECT_INVALID) SendMessageToPC(GetFirstPC(),sTeamID+"_VAULT waypoint not found.");
if (oTRD==OBJECT_INVALID) SendMessageToPC(GetFirstPC(),sTeamID+"_START waypoint not found.");
nMVD=GetLocalInt(oMod,"n"+sTeamID+"_nCAIMVD");
nTRD=GetLocalInt(oMod,"n"+sTeamID+"_nCAITRD");
nLD1=GetLocalInt(oMod,"n"+sTeamID+"_nCAILD1");
nLD2=GetLocalInt(oMod,"n"+sTeamID+"_nCAILD2");
nCPC=GetLocalInt(oMod,"n"+sTeamID+"_nCAICPC");
nHU=GetLocalInt(oMod,"n"+sTeamID+"_nCAIHU");
nIC=GetLocalInt(oMod,"n"+sTeamID+"_nCAIIC");
nRA=GetLocalInt(oMod,"n"+sTeamID+"_nCAIRA");
nRM=GetLocalInt(oMod,"n"+sTeamID+"_nCAIRM");
nRG=GetLocalInt(oMod,"n"+sTeamID+"_nCAIRG");
nPR=GetLocalInt(oMod,"n"+sTeamID+"_nCAIPR");
nAIMode=GetLocalInt(oMod,"n"+sTeamID+"_CAI_Setting");
sPID=GetLocalString(oMod,"s"+sTeamID+"_CAI_PE");
sMVD=fnReturnUnitRes(sTeamID,"MVD",nLeaderLevel);
sTRD=fnReturnUnitRes(sTeamID,"TRD",nLeaderLevel);
sLD1=fnReturnUnitRes(sTeamID,"LD1",nLeaderLevel);
sLD2=fnReturnUnitRes(sTeamID,"LD2",nLeaderLevel);
sCPC=fnReturnUnitRes(sTeamID,"CPC",nLeaderLevel);
sHU=fnReturnUnitRes(sTeamID,"HU",nLeaderLevel);
sIC=fnReturnUnitRes(sTeamID,"IC",nLeaderLevel);
sRA=fnReturnUnitRes(sTeamID,"RA",nLeaderLevel);
sRM=fnReturnUnitRes(sTeamID,"RM",nLeaderLevel);
sRG=fnReturnUnitRes(sTeamID,"RG",nLeaderLevel);
sPR=fnReturnUnitRes(sTeamID,"PR",nLeaderLevel);
if (GetLocalInt(oMod,"bAIOFF8")!=TRUE&&GetLocalInt(oMod,"nMaxUnits")>40)
{ // scale the units
nCost=GetLocalInt(oMod,"nMaxUnits");
nL=1;
if (nCost==80) nL=2;
else if (nCost==100) nL=3;
else if (nCost==120) nL=4;
if (nL>1)
{ // scale the units
nMVD=nMVD*nL;
nTRD=nTRD*nL;
nLD1=nLD1*nL;
nLD2=nLD2*nL;
nCPC=nCPC*nL;
nRA=nRA*nL;
nRM=nRM*nL;
nRG=nRG*nL;
} // scale the units
} // scale the units
if (GetLocalInt(oMod,"bAIOFF6")!=TRUE&&(oTMerc1==OBJECT_INVALID||oTMerc2==OBJECT_INVALID))
{ // hire mercenary if can - mercenaries ALWAYS attack raid primary target
DelayCommand(2.0,fnHireMerc(sTeamID,sPID));
} // hire mercenary if can - mercenaries ALWAYS attack raid primary target
if (GetLocalInt(oMod,"bAIOFF7")!=TRUE)
{
DelayCommand(4.0,fnSpendGold(sTeamID,sPID));
}
if (GetStringLength(sMVD)>3)
{ // MVD
nBase=1;
nEnd=nBase+nMVD;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else
{ // see if upgrade
if(GetTag(oOb)!=sMVD&&GetArea(oOb)==GetArea(oTRD)) nUN=nL;
//AssignCommand(oOb,SpeakString("*MVD*"));
if (GetLocalInt(oOb,"nMState")!=21) { SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oMVD); }
} // see if upgrade
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sMVD,GetLocation(oMVD),nCN);
fnMAIReport(" create MVD:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oMVD);}
} // create unit
if (nUN!=0)
{ // upgrade unit
oOb=GetLocalObject(oMod,sPre+IntToString(nUN));
if (oOb!=OBJECT_INVALID) fnAIUpgradeUnit(oOb,sMVD);
nUN=0;
} // upgrade unit
} // MVD
if (GetStringLength(sTRD)>3)
{ // TRD
nBase=nMVD+1;
nEnd=nBase+nTRD;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else
{ // see if upgrade
if(GetTag(oOb)!=sTRD&&GetArea(oOb)==GetArea(oTRD)) nUN=nL;
//AssignCommand(oOb,SpeakString("*TRD*"));
if (GetLocalInt(oOb,"nMState")!=21) { SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oTRD); }
} // see if upgrade
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sTRD,GetLocation(oTRD),nCN);
fnMAIReport(" create TRD:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oTRD);}
} // create unit
if (nUN!=0)
{ // upgrade unit
oOb=GetLocalObject(oMod,sPre+IntToString(nUN));
if (oOb!=OBJECT_INVALID) fnAIUpgradeUnit(oOb,sTRD);
nUN=0;
} // upgrade unit
} // TRD
if (GetStringLength(sLD1)>3)
{ // LD1
nBase=nMVD+nTRD+1;
nEnd=nBase+nLD1;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else
{ // see if upgrade
if(GetTag(oOb)!=sLD1&&GetArea(oOb)==GetArea(oTRD)) nUN=nL;
//AssignCommand(oOb,SpeakString("*LD1*"));
if (GetLocalInt(oOb,"nMState")!=21) { SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oLD1); }
} // see if upgrade
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sLD1,GetLocation(oLD1),nCN);
fnMAIReport(" create LD1:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oLD1);}
} // create unit
if (nUN!=0)
{ // upgrade unit
oOb=GetLocalObject(oMod,sPre+IntToString(nUN));
if (oOb!=OBJECT_INVALID) fnAIUpgradeUnit(oOb,sLD1);
nUN=0;
} // upgrade unit
} // LD1
if (GetStringLength(sLD2)>3)
{ // LD2
nBase=nMVD+nTRD+nLD1+1;
nEnd=nBase+nLD2;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else
{ // see if upgrade
if(GetTag(oOb)!=sLD2&&GetArea(oOb)==GetArea(oTRD)) nUN=nL;
//AssignCommand(oOb,SpeakString("*LD2*"));
if (GetLocalInt(oOb,"nMState")!=21) { SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oLD2); }
} // see if upgrade
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sLD2,GetLocation(oLD2),nCN);
fnMAIReport(" create LD2:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetLocalInt(oOb,"nMState",21); SetLocalObject(oOb,"oDestWP",oLD2);}
} // create unit
if (nUN!=0)
{ // upgrade unit
oOb=GetLocalObject(oMod,sPre+IntToString(nUN));
if (oOb!=OBJECT_INVALID) fnAIUpgradeUnit(oOb,sLD2);
nUN=0;
} // upgrade unit
} // LD2
if (GetStringLength(sCPC)>3&&GetLocalInt(oMod,"bAIOFF5")!=TRUE)
{ // CPC
nBase=nMVD+nTRD+nLD1+nLD2+1;
nEnd=nBase+nCPC;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else
{ // see if upgrade
if(GetTag(oOb)!=sCPC&&GetArea(oOb)==GetArea(oTRD)) nUN=nL;
//AssignCommand(oOb,SpeakString("*CPC*"));
if (GetLocalInt(oOb,"nMState")!=18) { SetLocalInt(oOb,"nMState",18); DeleteLocalInt(oOb,"nSState"); }
} // see if upgrade
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sCPC,GetLocation(oLD1),nCN);
fnMAIReport(" create CPC:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetAILevel(oOb,AI_LEVEL_NORMAL); if (GetLocalInt(oOb,"nMState")!=18) { SetLocalInt(oOb,"nMState",18); DeleteLocalInt(oOb,"nSState"); }}
} // create unit
if (nUN!=0)
{ // upgrade unit
oOb=GetLocalObject(oMod,sPre+IntToString(nUN));
if (oOb!=OBJECT_INVALID) fnAIUpgradeUnit(oOb,sCPC);
nUN=0;
} // upgrade unit
} // CPC
if (GetStringLength(sHU)>3&&GetLocalInt(oMod,"bAIOFF1")!=TRUE)
{ // HU
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+1;
nEnd=nBase+nHU;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else
{ // see if upgrade
if(GetTag(oOb)!=sHU&&GetArea(oOb)==GetArea(oTRD)&&GetLocalInt(oOb,"nSState")!=nReturnState) nUN=nL;
//AssignCommand(oOb,SpeakString("*HU*"));
if (GetLocalInt(oOb,"nMState")!=19) { SetLocalInt(oOb,"nMState",19); DeleteLocalInt(oOb,"nSState"); }
} // see if upgrade
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sHU,GetLocation(oTRD),nCN);
fnMAIReport(" create HU:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++;SetAILevel(oOb,AI_LEVEL_NORMAL); if (GetLocalInt(oOb,"nMState")!=19) { SetLocalInt(oOb,"nMState",19); DeleteLocalInt(oOb,"nSState"); }}
} // create unit
if (nUN!=0)
{ // upgrade unit
oOb=GetLocalObject(oMod,sPre+IntToString(nUN));
if (oOb!=OBJECT_INVALID) fnAIUpgradeUnit(oOb,sHU);
nUN=0;
} // upgrade unit
} // HU
if (GetStringLength(sIC)>3&&GetLocalInt(oMod,"nAIOFF2")!=TRUE)
{ // IC
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+1;
nEnd=nBase+nIC;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else
{ // see if upgrade
if(GetTag(oOb)!=sIC&&GetArea(oOb)==GetArea(oTRD)&&GetLocalInt(oOb,"nSState")!=nReturnState) nUN=nL;
//AssignCommand(oOb,SpeakString("*IC*"));
if (GetLocalInt(oOb,"nMState")!=20) { SetLocalInt(oOb,"nMState",20); DeleteLocalInt(oOb,"nSState"); }
} // see if upgrade
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sIC,GetLocation(oTRD),nCN);
fnMAIReport(" create IC:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++;SetAILevel(oOb,AI_LEVEL_NORMAL); if (GetLocalInt(oOb,"nMState")!=20) { SetLocalInt(oOb,"nMState",20); DeleteLocalInt(oOb,"nSState"); }}
} // create unit
if (nUN!=0)
{ // upgrade unit
oOb=GetLocalObject(oMod,sPre+IntToString(nUN));
if (oOb!=OBJECT_INVALID) fnAIUpgradeUnit(oOb,sIC);
nUN=0;
} // upgrade unit
} // IC
if (GetStringLength(sRA)>3)
{ // RA
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+1;
nEnd=nBase+nRA;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
else {
if (GetArea(oOb)==GetArea(oLD1)&&GetLocalInt(oOb,"nMState")!=17) nRC++;
// AssignCommand(oOb,SpeakString("*RA="+IntToString(nRC)+"*")); }
//else { AssignCommand(oOb,SpeakString("*on raid*")); }
}
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sRA,GetLocation(oLD1),nCN);
fnMAIReport(" create RA:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetAILevel(oOb,AI_LEVEL_NORMAL);}
} // create unit
} // RA
if (GetStringLength(sRM)>3&&GetLocalInt(oMod,"bAIOFF3")!=TRUE)
{ // RM
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+nRA+1;
nEnd=nBase+nRM;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
//else { AssignCommand(oOb,SpeakString("*RM*")); }
nL++;
} // check units
if (nCN!=0&&nUC<4)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sRM,GetLocation(oLD1),nCN);
fnMAIReport(" create RM:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetAILevel(oOb,AI_LEVEL_NORMAL);}
} // create unit
} // RM
if (GetStringLength(sRG)>3&&GetLocalInt(oMod,"bAIOFF4")!=TRUE)
{ // RG
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+nRA+nRM+1;
nEnd=nBase+nRG;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
//else { AssignCommand(oOb,SpeakString("*RG*")); }
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sRG,GetLocation(oLD1),nCN);
fnMAIReport(" create RG:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{ nCN=0; nUC++; SetAILevel(oOb,AI_LEVEL_NORMAL);}
} // create unit
} // RG
if (GetStringLength(sPR)>3&&nPR>0)
{ // PR
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+nRA+nRM+nRG+1;
nEnd=nBase+nPR;
nCN=0;
nUN=0;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID||GetIsDead(oOb)==TRUE) nCN=nL;
nL++;
} // check units
if (nCN!=0&&nUC<nUAL)
{ // create unit
nSpawnRes=nSpawnRes-nLeaderLevel;
oOb=fnAICreateUnit(sTeamID,sPR,GetLocation(oTRD),nCN);
fnMAIReport(" create PR:"+GetName(oOb));
if (oOb!=OBJECT_INVALID)
{
nCN=0; nUC++;SetAILevel(oOb,AI_LEVEL_NORMAL);
if (GetLocalInt(oOb,"nMState")!=23)
{
SetLocalInt(oOb,"nMState",23);
DeleteLocalInt(oOb,"nSState");
SetLocalString(oOb,"sTeamID",sTeamID);
ChangeFaction(oOb,oLeader);
}
}
} // create unit
} // PR
if (nRC>=(nRA/2))
{ // a raid needs to be initiated
//SendMessageToPC(GetFirstPC(),"There are enough units for team "+sTeamID+" to raid.");
fnMAIReport(" raid initiated!");
sRaid=fnAIGetLargestTrespasser(sTeamID);
//SendMessageToPC(GetFirstPC(),"Largest Trespasser "+sRaid);
if (sRaid!="NA")
{ // Someone has trespassed
sRaid=fnAIGetRandomTrespasser(sTeamID);
} // Someone has trespassed
else if (nAIMode!=0)
{ // no trespassers and I like to raid
if (nAIMode==1) sRaid=sPID;
else
{ // random raid target with emphasis on primary
nL=d6();
if (nL<3) sRaid=sPID;
else if (nL==3) sRaid=="UNC";
else if (nL==4) sRaid=="SPID";
else if (nL==5) sRaid=="DWF";
else if (nL==6) sRaid=="UND";
while(sRaid==sTeamID)
{ // pick a different one
nL=d6();
if (nL<3) sRaid=sPID;
else if (nL==3) sRaid=="UNC";
else if (nL==4) sRaid=="SPID";
else if (nL==5) sRaid=="DWF";
else if (nL==6) sRaid=="UND";
} // pick a different one
} // random raid target with emphasis on primary
} // no trespassers and I like to raid
if (sRaid!="NA")
{ // initiate the raid
//SendMessageToPC(GetFirstPC(),sTeamID+" initiates raid against "+sRaid+".");
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+1;
nEnd=nBase+nRA;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID) nCN=nL;
else { // else
if (GetArea(oOb)==GetArea(oLD1)&&GetLocalInt(oOb,"nMState")!=17)
{ // raid command
DelayCommand(1.0,fnRaid(oOb,sRaid,1));
} // raid command
} // else
nL++;
} // check units
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+nRA+1;
nEnd=nBase+nRM;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID) nCN=nL;
else {
if (GetArea(oOb)==GetArea(oLD1)&&GetLocalInt(oOb,"nMState")!=17)
{ // raid command
DelayCommand(1.5,fnRaid(oOb,sRaid,2));
} // raid command
}
nL++;
} // check units
nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+nRA+nRM+1;
nEnd=nBase+nRG;
nL=nBase;
while(nL<nEnd)
{ // check units
oOb=GetLocalObject(oMod,sPre+IntToString(nL));
if (oOb==OBJECT_INVALID) nCN=nL;
else {
if (GetArea(oOb)==GetArea(oLD1)&&GetLocalInt(oOb,"nMState")!=17)
{ // raid command
DelayCommand(1.7,fnRaid(oOb,sRaid,3));
} // raid command
}
nL++;
} // check units
} // initiate the raid
//else if (nAIMode!=0) { SendMessageToPC(GetFirstPC(),"Raid target was bad for "+sTeamID+"."); }
} // a raid needs to be initiated
} // enough resources to spawn
nAIC=0;
SetLocalInt(oMod,"nAISpawnRes"+sTeamID,nSpawnRes);
} // ai ok
SetLocalInt(oMod,"nAIC"+sTeamID,nAIC);
} // no enemies nearby
}
///////////////////////////////////////////////////////////////////////// MAIN
////////////////////////
// FUNCTIONS
////////////////////////
int fnLevel(object oOb)
{ // return level
return GetLevelByPosition(1,oOb)+GetLevelByPosition(2,oOb)+GetLevelByPosition(3,oOb);
} // fnLevel()
string fnReturnUnitRes(string sID,string sPos,int nLevel)
{ // return resref of unit
string sRes="";
object oMod=GetModule();
int nRL=GetLocalInt(oMod,"n"+sID+"_nCAIRL");
int nCPL=GetLocalInt(oMod,"n"+sID+"_nCAICPL");
int nPRL=GetLocalInt(oMod,"n"+sID+"_nCAIPRL");
if (nLevel>0)
{ // level 1
if (sPos=="MVD")
{ // mana guard
if (sID=="SPID") sRes="SPID0";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND1";
else if (sID=="DWF") sRes="DWF22";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="SPID") sRes="SPID0";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND1";
else if (sID=="DWF") sRes="DWF12";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND1";
else if (sID=="DWF") sRes="DWF1";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND1";
else if (sID=="DWF") sRes="DWF1";
} // Lair defense 2
else if (sPos=="HU")
{ // harvest unit
if (sID=="SPID") sRes="SPID0";
else if (sID=="UNC") sRes="UNC0";
else if (sID=="UND") sRes="UND0";
else if (sID=="DWF") sRes="DWF0";
} // harvest unit
else if (sPos=="CPC"&&nCPL==1)
{ // control point capture
if (sID=="SPID") sRes="spid3ai";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND1";
else if (sID=="DWF") sRes="DWF22";
} // control point capture
else if (sPos=="IC")
{ // item capture
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND0";
else if (sID=="DWF") sRes="DWF1";
} // item capture
else if (sPos=="RA"&&nRL==1)
{ // raid attack
if (sID=="SPID") sRes="spid3ai";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND1";
else if (sID=="DWF") sRes="DWF22";
} // raid attack
else if (sPos=="RM"&&nRL==1)
{ // raid mana
} // raid mana
else if (sPos=="RG"&&nRL==1)
{ // raid gold
} // raid gold
else if (sPos=="PR"&&nPRL==1)
{ // power res
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND1";
else if (sID=="DWF") sRes="DWF22";
} // power res
} // level 1
if (nLevel>2)
{ // level 3
if (sPos=="MVD")
{ // mana guard
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC2";
else if (sID=="UND") sRes="UND2";
else if (sID=="DWF") sRes="DWF3";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC2";
else if (sID=="UND") sRes="UND3";
else if (sID=="DWF") sRes="DWF13";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="UNC") sRes="UNC2";
else if (sID=="UND") sRes="UND2";
else if (sID=="DWF") sRes="DWF17";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="UNC") sRes="UNC2";
else if (sID=="UND") sRes="UND2";
else if (sID=="DWF") sRes="DWF17";
} // Lair defense 2
else if (sPos=="CPC"&&nCPL<4)
{ // control point capture
if (sID=="SPID") sRes="spid16ai";
else if (sID=="UNC") sRes="unc25";
else if (sID=="UND") sRes="UND3";
else if (sID=="DWF") sRes="DWF12";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
if (sID=="UND") sRes="UND26";
} // item capture
else if (sPos=="RA"&&nRL<4)
{ // raid attack
if (sID=="SPID") sRes="spid16ai";
else if (sID=="UNC") sRes="UNC1";
else if (sID=="UND") sRes="UND2";
else if (sID=="DWF") sRes="DWF1";
} // raid attack
else if (sPos=="RM"&&nRL<4)
{ // raid mana
if (sID=="UND") sRes="UND26";
} // raid mana
else if (sPos=="RG"&&nRL<4)
{ // raid gold
} // raid gold
else if (sPos=="PR"&&nPRL<4)
{ // power res
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC2";
else if (sID=="UND") sRes="UND3";
else if (sID=="DWF") sRes="DWF1";
} // power res
} // level 3
if (nLevel>4)
{ // level 5
if (sPos=="MVD")
{ // mana guard
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC4";
else if (sID=="UND") sRes="UND12";
else if (sID=="DWF") sRes="DWF5";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC4";
else if (sID=="UND") sRes="UND10";
else if (sID=="DWF") sRes="DWF14";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC4";
else if (sID=="UND") sRes="UND4";
else if (sID=="DWF") sRes="DWF28";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC4";
else if (sID=="UND") sRes="UND10";
else if (sID=="DWF") sRes="DWF28";
} // Lair defense 2
else if (sPos=="CPC"&&nCPL<6)
{ // control point capture
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC4";
else if (sID=="UND") sRes="UND5";
else if (sID=="DWF") sRes="DWF4";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
if (sID=="UNC") sRes="UNC4";
else if (sID=="DWF") sRes="DWF3";
} // item capture
else if (sPos=="RA"&&nRL<6)
{ // raid attack
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC25";
else if (sID=="UND") sRes="UND5";
else if (sID=="DWF") sRes="DWF2";
} // raid attack
else if (sPos=="RM"&&nRL<6)
{ // raid mana
} // raid mana
else if (sPos=="RG"&&nRL<6)
{ // raid gold
if (sID=="UND") sRes="UND26";
} // raid gold
else if (sPos=="PR"&&nPRL<6)
{ // power res
if (sID=="SPID") sRes="SPID29";
else if (sID=="UNC") sRes="UNC4";
else if (sID=="UND") sRes="UND5";
else if (sID=="DWF") sRes="DWF2";
} // power res
} // level 5
if (nLevel>6)
{ // level 7
if (sPos=="MVD")
{ // mana guard
if (sID=="UNC") sRes="UNC6";
else if (sID=="DWF") sRes="DWF7";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="UNC") sRes="UNC6";
else if (sID=="UND") sRes="UND8";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="DWF") sRes="DWF18";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="DWF") sRes="DWF18";
} // Lair defense 2
else if (sPos=="CPC"&&nCPL<8)
{ // control point capture
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC24";
else if (sID=="UND") sRes="UND5";
else if (sID=="DWF") sRes="DWF13";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
if (sID=="SPID") sRes="SPID24";
else if (sID=="UND") sRes="UND11";
} // harvest unit
else if (sPos=="IC")
{ // item capture
} // item capture
else if (sPos=="RA"&&nRL<8)
{ // raid attack
if (sID=="SPID") sRes="SPID6";
else if (sID=="UNC") sRes="UNC26";
else if (sID=="UND") sRes="UND4";
else if (sID=="DWF") sRes="DWF4";
} // raid attack
else if (sPos=="RM"&&nRL<8)
{ // raid mana
if (sID=="SPID") sRes="SPID24";
} // raid mana
else if (sPos=="RG"&&nRL<8)
{ // raid gold
if (sID=="SPID") sRes="SPID29";
else if (sID=="DWF") sRes="DWF23";
} // raid gold
else if (sPos=="PR"&&nPRL<8)
{ // power res
if (sID=="SPID") sRes="SPID24";
else if (sID=="UNC") sRes="UNC24";
else if (sID=="UND") sRes="UND10";
else if (sID=="DWF") sRes="DWF5";
} // power res
} // level 7
if (nLevel>8)
{ // level 9
if (sPos=="MVD")
{ // mana guard
if (sID=="DWF") sRes="DWF9";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="UNC") sRes="UNC10";
else if (sID=="UND") sRes="UND14";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="UNC") sRes="UNC12";
else if (sID=="UND") sRes="UND18";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="UNC") sRes="UNC12";
else if (sID=="UND") sRes="UND12";
} // Lair defense 2
else if (sPos=="CPC")
{ // control point capture
if (sID=="UNC") sRes="UNC24";
else if (sID=="UND") sRes="UND17";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
if (sID=="UNC") sRes="UNC24";
else if (sID=="DWF") sRes="DWF6";
} // item capture
else if (sPos=="RA")
{ // raid attack
if (sID=="UNC") sRes="UNC4";
else if (sID=="UND") sRes="UND17";
else if (sID=="DWF") sRes="DWF6";
} // raid attack
else if (sPos=="RM")
{ // raid mana
if (sID=="DWF") sRes="DWF23";
} // raid mana
else if (sPos=="RG")
{ // raid gold
if (sID=="UNC") sRes="UNC27";
} // raid gold
else if (sPos=="PR")
{ // power res
if (sID=="SPID") sRes="SPID24";
else if (sID=="UNC") sRes="UNC7";
else if (sID=="UND") sRes="UND12";
else if (sID=="DWF") sRes="DWF9";
} // power res
} // level 9
if (nLevel>10)
{ // level 11
if (sPos=="MVD")
{ // mana guard
if (sID=="SPID") sRes="SPID26";
else if (sID=="UNC") sRes="UNC13";
else if (sID=="UND") sRes="UND13";
else if (sID=="DWF") sRes="DWF10";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="SPID") sRes="SPID19";
else if (sID=="UNC") sRes="UNC11";
else if (sID=="UND") sRes="UND19";
else if (sID=="DWF") sRes="DWF15";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="SPID") sRes="SPID19";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="SPID") sRes="SPID19";
} // Lair defense 2
else if (sPos=="CPC")
{ // control point capture
if (sID=="DWF") sRes="DWF14";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
if (sID=="DWF") sRes="DWF8";
} // item capture
else if (sPos=="RA")
{ // raid attack
if (sID=="UNC") sRes="UNC24";
else if (sID=="UND") sRes="UND18";
else if (sID=="DWF") sRes="DWF18";
} // raid attack
else if (sPos=="RM")
{ // raid mana
if (sID=="UNC") sRes="UNC6";
} // raid mana
else if (sPos=="RG")
{ // raid gold
} // raid gold
else if (sPos=="PR")
{ // power res
if (sID=="SPID") sRes="SPID24";
else if (sID=="UNC") sRes="UNC10";
else if (sID=="UND") sRes="UND12";
else if (sID=="DWF") sRes="DWF10";
} // power res
} // level 11
if (nLevel>12)
{ // level 13
if (sPos=="MVD")
{ // mana guard
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="UND") sRes="UND20";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="SPID") sRes="SPID26";
else if (sID=="UNC") sRes="UNC14";
else if (sID=="DWF") sRes="DWF24";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="SPID") sRes="SPID26";
else if (sID=="UNC") sRes="UNC14";
else if (sID=="DWF") sRes="DWF24";
} // Lair defense 2
else if (sPos=="CPC")
{ // control point capture
if (sID=="UND") sRes="UND14";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
if (sID=="SPID") sRes="SPID26";
else if (sID=="UND") sRes="UND25";
else if (sID=="DWF") sRes="DWF10";
} // item capture
else if (sPos=="RA")
{ // raid attack
if (sID=="UND") sRes="UND14";
else if (sID=="DWF") sRes="DWF8";
} // raid attack
else if (sPos=="RM")
{ // raid mana
if (sID=="UND") sRes="UND25";
} // raid mana
else if (sPos=="RG")
{ // raid gold
if (sID=="UNC") sRes="UNC13";
} // raid gold
else if (sPos=="PR")
{ // power res
if (sID=="SPID") sRes="SPID23";
else if (sID=="UNC") sRes="UNC11";
else if (sID=="UND") sRes="UND12";
else if (sID=="DWF") sRes="DWF15";
} // power res
} // level 13
if (nLevel>14)
{ // level 15
if (sPos=="MVD")
{ // mana guard
if (sID=="DWF") sRes="DWF11";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="SPID") sRes="SPID26";
else if (sID=="UNC") sRes="UNC14";
else if (sID=="DWF") sRes="DWF16";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="UND") sRes="UND13";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="UND") sRes="UND20";
} // Lair defense 2
else if (sPos=="CPC")
{ // control point capture
if (sID=="UNC") sRes="UNC7";
else if (sID=="DWF") sRes="DWF21";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
} // item capture
else if (sPos=="RA")
{ // raid attack
if (sID=="UNC") sRes="UNC10";
else if (sID=="UND") sRes="UND28";
else if (sID=="DWF") sRes="DWF10";
} // raid attack
else if (sPos=="RM")
{ // raid mana
} // raid mana
else if (sPos=="RG")
{ // raid gold
} // raid gold
else if (sPos=="PR")
{ // power res
if (sID=="SPID") sRes="SPID23";
else if (sID=="UNC") sRes="UNC11";
else if (sID=="UND") sRes="UND14";
else if (sID=="DWF") sRes="DWF21";
} // power res
} // level 15
if (nLevel>16)
{ // level 17
if (sPos=="MVD")
{ // mana guard
if (sID=="SPID") sRes="SPID25";
else if (sID=="UNC") sRes="UNC15";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="SPID") sRes="SPID25";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
} // Lair defense 2
else if (sPos=="CPC")
{ // control point capture
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
if (sID=="UNC") sRes="UNC7";
else if (sID=="DWF") sRes="DWF19";
} // item capture
else if (sPos=="RA")
{ // raid attack
if (sID=="UNC") sRes="UNC11";
else if (sID=="UND") sRes="UND15";
else if (sID=="DWF") sRes="DWF24";
} // raid attack
else if (sPos=="RM")
{ // raid mana
} // raid mana
else if (sPos=="RG")
{ // raid gold
if (sID=="UND") sRes="UND25";
} // raid gold
else if (sPos=="PR")
{ // power res
if (sID=="SPID") sRes="SPIDPR4";
else if (sID=="UNC") sRes="UNC11";
else if (sID=="UND") sRes="UND25";
else if (sID=="DWF") sRes="DWF19";
} // power res
} // level 17
if (nLevel>18)
{ // level 19
if (sPos=="MVD")
{ // mana guard
if (sID=="UND") sRes="UND23";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="SPID") sRes="SPID27";
else if (sID=="UND") sRes="UND23";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
if (sID=="SPID") sRes="SPID27";
else if (sID=="DWF") sRes="DWF25";
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
if (sID=="SPID") sRes="SPID27";
else if (sID=="DWF") sRes="DWF25";
} // Lair defense 2
else if (sPos=="CPC")
{ // control point capture
if (sID=="SPID") sRes="SPID27";
else if (sID=="UNC") sRes="UNC11";
else if (sID=="UND") sRes="UND15";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
} // item capture
else if (sPos=="RA")
{ // raid attack
if (sID=="UNC") sRes="UNC14";
else if (sID=="DWF") sRes="DWF25";
} // raid attack
else if (sPos=="RM")
{ // raid mana
if (sID=="SPID") sRes="SPID27";
} // raid mana
else if (sPos=="RG")
{ // raid gold
if (sID=="SPID") sRes="SPID27";
else if (sID=="UNC") sRes="UNC11";
} // raid gold
else if (sPos=="PR")
{ // power res
if (sID=="SPID") sRes="SPID27";
else if (sID=="UNC") sRes="UNCPR6";
else if (sID=="UND") sRes="UND19";
else if (sID=="DWF") sRes="DWF11";
} // power res
} // level 19
if (nLevel>19)
{ // level 20
if (sPos=="MVD")
{ // mana guard
if (sID=="SPID") sRes="SPID28";
else if (sID=="UNC") sRes="UNC16";
} // mana guard
else if (sPos=="TRD")
{ // Throne room guard
if (sID=="UNC") sRes="UNC9";
} // Throne room guard
else if (sPos=="LD1")
{ // Lair defense 1
} // Lair defense 1
else if (sPos=="LD2")
{ // Lair defense 2
} // Lair defense 2
else if (sPos=="CPC")
{ // control point capture
if (sID=="DWF") sRes="DWF16";
} // control point capture
else if (sPos=="HU")
{ // harvest unit
} // harvest unit
else if (sPos=="IC")
{ // item capture
if (sID=="DWF") sRes="DWF20";
} // item capture
else if (sPos=="RA")
{ // raid attack
if (sID=="SPID") sRes="SPID19";
else if (sID=="UNC") sRes="UNC13";
else if (sID=="UND") sRes="UND22";
else if (sID=="DWF") sRes="DWF11";
} // raid attack
else if (sPos=="RM")
{ // raid mana
if (sID=="UNC") sRes="UNC9";
} // raid mana
else if (sPos=="RG")
{ // raid gold
if (sID=="DWF") sRes="DWF20";
} // raid gold
else if (sPos=="PR")
{ // power res
if (sID=="SPID") sRes="SPID28";
else if (sID=="UNC") sRes="UNC9";
else if (sID=="UND") sRes="UND13";
else if (sID=="DWF") sRes="DWF20";
} // power res
} // level 20
return sRes;
} // fnReturnUnitRes()
/*int fnSpawnDelay(int nLevel)
{
int nRet=0;
if (nLevel>4) nRet=1;
else if (nLevel>6) nRet=2;
else if (nLevel>8) nRet=3;
else if (nLevel>10) nRet=4;
else if (nLevel>12) nRet=5;
else if (nLevel>14) nRet=6;
else if (nLevel>16) nRet=7;
else if (nLevel>18) nRet=8;
else if (nLevel>19) nRet=7;
return nRet;
} // fnSpawnDelay() */
int fnGetGold(string sID)
{
object oChest=GetObjectByTag(sID+"_CHEST");
int nG=0;
object oItem=GetFirstItemInInventory(oChest);
while(nG==0&&oItem!=OBJECT_INVALID)
{ // check chest inventory
if (GetTag(oItem)=="NW_IT_GOLD001") nG=GetItemStackSize(oItem);
oItem=GetNextItemInInventory(oChest);
} // check chest inventory
return nG;
} // fnGetGold()
void fnSetGold(string sID,int nGold)
{
object oChest=GetObjectByTag(sID+"_CHEST");
int nG=0;
object oItem=GetFirstItemInInventory(oChest);
while(oItem!=OBJECT_INVALID)
{ // count gold
if (GetResRef(oItem)=="nw_it_gold001")
{ // gold
DelayCommand(0.3,DestroyObject(oItem));
} // gold
oItem=GetNextItemInInventory(oChest);
} // count gold
CreateItemOnObject("nw_it_gold001",oChest,nGold);
} // set gold amount
void fnSpendGold(string sID,string sPID)
{ // spend the gold of the team on assassins, lair cleaners, invisible mercs,etc.
object oMod=GetModule();
int nGold=fnGetGold(sID);
object oStart=GetWaypointByTag(sID+"_START");
object oLC=GetLocalObject(oMod,"oAILairClean"+sID); // lair cleaner exists?
object oAS=GetLocalObject(oMod,"oAIAssassin"+sID); // hired assassin
object oMA=GetLocalObject(oMod,"oAIMageAssassin"+sID); // hired mage assassin
object oLDM1=GetLocalObject(oMod,"oAILDM1"+sID); // lair defense see invis merc 1
object oLDM2=GetLocalObject(oMod,"oAILDM2"+sID); // lair defense see invis merc 2
object oLPID=GetLocalObject(oMod,"oTeamLead"+sPID);
int nELVL=fnLevel(oLPID);
int nMercCost=1000;
int nMGCost;
int nAGCost;
string sMGRes;
string sAGRes;
object oWP;
int nN;
if ((oLC==OBJECT_INVALID||GetIsDead(oLC)==TRUE)&&nGold>99)
{ // create a lair cleaner
fnMAIReport(" create lair cleaner (spend gold)");
oLC=CreateObject(OBJECT_TYPE_CREATURE,"clean_"+sID,GetLocation(oStart));
SetAILevel(oLC,AI_LEVEL_NORMAL);
SetLocalObject(oMod,"oAILairClean"+sID,oLC);
nGold=nGold-100;
fnSetGold(sID,nGold);
} // create a lair cleaner
else if (GetIsPC(oLPID)==TRUE&&nGold>300)
{ // hire assassins
fnMAIReport(" hire assassins (spend gold)");
if (nELVL<5)
{ // apprentice
nMGCost=300;
sMGRes="mageass1";
nAGCost=500;
sAGRes="assassin1";
} // apprentice
else if (nELVL<8)
{ // journeyman
nMGCost=500;
sMGRes="mageass2";
nAGCost=2000;
sAGRes="assassin2";
} // journeyman
else if (nELVL<12)
{ // master
nMGCost=1000;
sMGRes="mageass3";
nAGCost=4000;
sAGRes="assassin3";
} // master
else
{ // the best
nMGCost=5000;
sMGRes="mageass4";
nAGCost=4000;
sAGRes="assassin3";
} // the best
// set target
if (sPID=="UNC") nN=1;
else if (sPID=="SPID") nN=2;
else if (sPID=="UND") nN=3;
else { nN=4; }
if((oAS==OBJECT_INVALID||GetIsDead(oAS)==TRUE)&&nGold>=nAGCost)
{ // hire assassin
nGold=nGold-nAGCost;
fnSetGold(sID,nGold);
oWP=GetWaypointByTag("ASS_SPAWN");
oAS=CreateObject(OBJECT_TYPE_CREATURE,sAGRes,GetLocation(oWP));
SetLocalInt(oAS,"nSpeed",8);
SetAILevel(oAS,AI_LEVEL_NORMAL);
SetLocalObject(oMod,"oAIAssassin"+sID,oAS);
SetLocalInt(oAS,"nTarget",nN);
ExecuteScript("cg_assassin",oAS);
} // hire assassin
if ((oMA==OBJECT_INVALID||GetIsDead(oMA)==TRUE)&&nGold>=nMGCost)
{ // hire mage assassin
nGold=nGold-nMGCost;
fnSetGold(sID,nGold);
oWP=GetWaypointByTag("MAGEASS_SPAWN");
oMA=CreateObject(OBJECT_TYPE_CREATURE,sMGRes,GetLocation(oWP));
SetLocalInt(oMA,"nSpeed",8);
SetAILevel(oMA,AI_LEVEL_NORMAL);
SetLocalObject(oMod,"oAIMageAssassin"+sID,oMA);
SetLocalInt(oMA,"nTarget",nN);
ExecuteScript("mage_assassin",oMA);
} // hire mage assassin
} // hire assassins
if (oLDM1==OBJECT_INVALID&&nGold>=nMercCost)
{ // hire lair defense merc 1
fnMAIReport(" hire LD1 merc (spend gold)");
nGold=nGold-nMercCost;
fnSetGold(sID,nGold);
oLDM1=CreateObject(OBJECT_TYPE_CREATURE,"watchermercenary",GetLocation(oStart));
SetLocalString(oLDM1,"sTeamID",sID);
ChangeFaction(oLDM1,OBJECT_SELF);
SetLocalInt(oLDM1,"nMState",11); // guard lair
SetLocalInt(oLDM1,"nSState",0);
SetLocalObject(oMod,"oAILDM1"+sID,oLDM1);
} // hire lair defense merc 1
else if (oLDM2==OBJECT_INVALID&&nGold>=nMercCost)
{ // hire lair defense merc 2
fnMAIReport(" hire LD2 merc (spend gold)");
nGold=nGold-nMercCost;
fnSetGold(sID,nGold);
oLDM2=CreateObject(OBJECT_TYPE_CREATURE,"watchermercenary",GetLocation(oStart));
SetLocalString(oLDM2,"sTeamID",sID);
ChangeFaction(oLDM2,OBJECT_SELF);
SetLocalInt(oLDM2,"nMState",11); // guard lair
SetLocalInt(oLDM2,"nSState",0);
SetLocalObject(oMod,"oAILDM2"+sID,oLDM2);
} // hire lair defense merc 2
} // fnSpendGold()