///////////////////////////////////////////////////////////////////////////////// // 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()