///////////////////////////////////////////////////////////////////////////////// // ai_advanced - This is a more advanced AI routine for Computer Controlled Teams // By Deva Bryson Winblood. 04/13/2004 //////////////////////////////////////////////////////////////////////////////// #include "ai_header" #include "lib_hos1_aisupp" //////////////////////// // 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 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)nCost) { nBase=nL; nEnd=1; nCost=GetLocalInt(oMod,"nMerLC"+IntToString(nL)+"_1"+sTeamID);} } // 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=CreateObject(OBJECT_TYPE_CREATURE,sTeamID+"0",GetLocation(oOb)); ChangeFaction(oMerc,oOb); DestroyObject(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; object oController=GetLocalObject(oLeader,"oController"); 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 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=""; 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,oController,1,CREATURE_TYPE_IS_ALIVE,TRUE); 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 */ 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."); if (sTeamID=="SPID") { // spiders nAIMode=2; nMVD=1; nTRD=2; nLD1=2; nLD2=2; nCPC=4; nHU=1; nIC=1; nRA=12; nRM=1; nRG=2; sPID="UND"; } // spiders else if (sTeamID=="UNC") { // unclean nAIMode=2; nMVD=1; nTRD=2; nLD1=2; nLD2=2; nCPC=6; nHU=1; nIC=1; nRA=10; nRM=1; nRG=2; sPID="DWF"; } // unclean else if (sTeamID=="UND") { // undead nAIMode=1; nMVD=2; nTRD=2; nLD1=5; nLD2=1; nCPC=4; nHU=1; nIC=1; nRA=11; nRM=2; nRG=1; sPID="SPID"; } // undead else if (sTeamID=="DWF") { // dwarf nAIMode=1; nMVD=4; nTRD=4; nLD1=3; nLD2=3; nCPC=4; nHU=1; nIC=1; nRA=8; nRM=1; nRG=1; sPID="UNC"; } // dwarf 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); 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(nL3) { // TRD nBase=nMVD+1; nEnd=nBase+nTRD; nCN=0; nUN=0; nL=nBase; while(nL3) { // LD1 nBase=nMVD+nTRD+1; nEnd=nBase+nLD1; nCN=0; nUN=0; nL=nBase; while(nL3) { // LD2 nBase=nMVD+nTRD+nLD1+1; nEnd=nBase+nLD2; nCN=0; nUN=0; nL=nBase; while(nL3&&GetLocalInt(oMod,"bAIOFF5")!=TRUE) { // CPC nBase=nMVD+nTRD+nLD1+nLD2+1; nEnd=nBase+nCPC; nCN=0; nUN=0; nL=nBase; while(nL3&&GetLocalInt(oMod,"bAIOFF1")!=TRUE) { // HU nBase=nMVD+nTRD+nLD1+nLD2+nCPC+1; nEnd=nBase+nHU; nCN=0; nUN=0; nL=nBase; while(nL3&&GetLocalInt(oMod,"nAIOFF2")!=TRUE) { // IC nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+1; nEnd=nBase+nIC; nCN=0; nUN=0; nL=nBase; while(nL3) { // RA nBase=nMVD+nTRD+nLD1+nLD2+nCPC+nHU+nIC+1; nEnd=nBase+nRA; nCN=0; nUN=0; nL=nBase; while(nL3&&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(nL3&&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=(nRA/2)) { // a raid needs to be initiated //SendMessageToPC(GetFirstPC(),"There are enough units for team "+sTeamID+" to raid."); 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(nL0) { // 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=="CPC") { // control point capture if (sID=="UNC") sRes="UNC1"; else if (sID=="UND") sRes="UND1"; } // control point capture 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=="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") { // raid attack if (sID=="UND") sRes="UND1"; } // raid attack else if (sPos=="RM") { // raid mana } // raid mana else if (sPos=="RG") { // raid gold } // raid gold } // 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") { // control point capture 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") { // raid attack if (sID=="UNC") sRes="UNC1"; else if (sID=="UND") sRes="UND2"; } // raid attack else if (sPos=="RM") { // raid mana if (sID=="UND") sRes="UND26"; } // raid mana else if (sPos=="RG") { // raid gold } // raid gold } // 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") { // control point capture if (sID=="SPID") sRes="SPID6"; else if (sID=="UNC") sRes="UNC4"; else if (sID=="UND") sRes="UND5"; } // 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") { // 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") { // raid mana } // raid mana else if (sPos=="RG") { // raid gold if (sID=="UND") sRes="UND26"; } // raid gold } // 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") { // control point capture 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") { // 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") { // raid mana if (sID=="SPID") sRes="SPID24"; } // raid mana else if (sPos=="RG") { // raid gold if (sID=="SPID") sRes="SPID29"; else if (sID=="DWF") sRes="DWF23"; } // raid gold } // 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 } // 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 } // 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 } // 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 } // 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 } // 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 } // 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 } // 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 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 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 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 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()