• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[AI] Make a Campaign AI attack all enemy players.

Status
Not open for further replies.
Level 14
Joined
Nov 13, 2017
Messages
733
I have a set of teams/forces:
TEAM 1:
  • Red (Human Player)
  • Blue (AI)
TEAM 2:
  • Green (AI)
  • Teal (AI)
TEAM 3:
  • Purple (AI)
I'd like to make the Team 3 to attack any of the players within Team 1 and Team 2?


Here is the Campaign AI script and doesn't work.
JASS:
//========================================================================
//II. HUMANS GLOBAL SCRIPTS
//This shows all the units and buildings of the human faction.
//========================================================================
globals
        player USER[1] = Player(1)
    player USER[2] = Player(12)
   
    integer H1_TOWNS_KEEP           = 'z370'
    integer PEASANTROYAL            = 'z429'         //worker
    integer PEASANTROYAL_ECON       = 'z442'        //worker2
    integer H2_MOAT                 = 'z380'
    integer H3_ROYAL_CASTLE         = 'z389'
    integer ELITE_GUARD             = 'z432'
    integer FORCE_GUARD             = 'z428'
    integer IRON_GUARD              = 'z431'
    integer THRONE_GUARD            = 'z434'
    integer FARMHOUSE               = 'z019'
     
    integer ALTAR_OF_HEROES         = 'z021'
    integer HUMAN_ROYALAMBASSADOR   = 'Z448'
    integer HUMAN_ROYALARCHMAGE     = 'Z447'
    integer HUMAN_ROYALEMPEROR      = 'Z460'
    integer HUMAN_ROYALGENERAL      = 'Z450'
    integer HUMAN_ROYALGRAND_MARSHL = 'Z451'
    integer HUMAN_ROYALHIGH_CMNDR   = 'Z455'
    integer HUMAN_ROYAL_INQUISITOR  = 'Z452'
    integer HUMAN_ROYAL_IRONEN4CER  = 'Z453'
    integer HUMAN_ROYALJAILOR       = 'Z446'
    integer HUMAN_ROYAKING1_Andu    = 'Z456'
    integer HUMAN_ROYAKING2         = 'Z459'
    integer HUMAN_ROYAKING3         = 'Z461'
    integer HUMAN_ROYALMARKSMAN     = 'Z371'
    integer HUMAN_ROYALMARKSMAN2     = 'Z465'
    integer HUMAN_ROYALVINDICATOR   = 'Z462'
     
    integer TOWER_ROYAL_OUTPOST     = 'z372'
    integer TOWER_ROYAL_OUTPOSTFORT = 'z381'
    integer HUMAN_GUARD             = 'z433'
    integer TOWER_ROYAL_WALL        = 'z382'
    integer TOWER_ROYAL_BALLISTA    = 'z384'
    integer TOWER_ROYAL_CANNON      = 'z385'
    integer TOWER_ROYAL_CATAPULT    = 'z383'
     
    integer ROYAL_OUTPOSTBARRACKS   = 'z377'
    integer ROYAL_CONSCRIPT         = 'z398'
    integer ROYAL_AXEMAN            = 'z399'
    integer ROYAL_ARCHER            = 'z402'
     
    integer ROYAL_KINGDOMBARRACKS   = 'z376'
    integer ROYAL_FOOTSOLDIER       = 'z401'
    integer ROYAL_SPEARMAN          = 'z400'
    integer ROYAL_CROSSBOWMAN       = 'z403'
    integer ROYAL_MARKSMAN          = 'z404'
     
    integer ROYAL_SANCTUM           = 'z397'
    integer ROYAL_SEER              = 'z435'
    integer ROYAL_BATTLEMAGE        = 'z424'
    integer ROYAL_VISIO             = 'z426'
    integer ROYAL_REGENSOLDIER      = 'z419'
    integer ROYAL_SAGE              = 'z430'
    integer ROYAL_CLAIRVOYANT       = 'z423'
    integer ROYAL_REGENSOLDIERELITE = 'z422'

    integer ROYAL_STABLES           = 'z386'
    integer ROYAL_LIGHTCAVALRY      = 'z410'
    integer ROYAL_GALLANT           = 'z406'
    integer ROYAL_POWERKNIGHT       = 'z405'

    integer ROYAL_SIEGEWORKSHOP1    = 'z387'
    integer HUMAN_BALLISTA          = 'z082'
    integer HUMAN_CATAPULT_SLING    = 'z083'
    integer HUMAN_MANTLET           = 'z056'
    integer HUMAN_BALLISTASIEGE     = 'z109'

    integer ROYAL_SIEGEWORKSHOP2    = 'z388'
    integer HUMAN_BATTERING_RAM     = 'z104'
    integer HUMAN_CANNON            = 'z074'
    integer HUMAN_SIEGE_TOWER       = 'z090'
    integer HUMAN_TREBUCHETPACKED   = 'z095'
    integer HUMAN_TREBUCHETUNPACKED = 'z096'
    integer HUMAN_BOX_CATAPULT      = 'z407'
    integer HUMAN_FIELD_CANNON      = 'z408'
    integer HUMAN_WAR_ZEPPELIN      = 'z409'

    integer ROYAL_SHRINE            = 'z373'
    integer ROYAL_CLERIC            = 'z414'
    integer ROYAL_EXORCIST          = 'z418'
    integer ROYAL_ROYAL_ACOLYTE     = 'z415'
    integer ROYAL_PALADIN           = 'z417'
    integer ROYAL_TEMPLAR           = 'z420'
    integer ROYAL_FAITHSMAN         = 'z425'

    integer ROYAL_TOWNCOURTHOUSE    = 'z443'
    integer ROYAL_ADVISOR           = 'z427'
    integer ROYAL_DUTCH             = 'z438'
    integer ROYAL_COUNCILOR         = 'z437'

    integer HUMAN_STASH             = 'z393'
    integer HUMAN_STORAGE           = 'z394'
    integer HUMAN_STOREHOUSE        = 'z395'
    integer HUMAN_TREASURY          = 'z396'

    integer HUMANWELL1              = 'z392'
    integer HUMANWELL2              = 'z463'
    integer HUMANWELL3              = 'z464'

    integer HUMANVENDORSQUARE       = 'z372'
    integer HUMANMARKET             = 'z390'
    integer HUMANCAPITALMARKET      = 'z391'

    //GLOBAL SHIPYARD
    integer HUMANSHIPYARD1          = 'z081'
    integer HUMANFISHING_SHIP       = 'z129'
    integer HUMANEMBARKMENT         = 'z126'
    integer HUMANWAR_GALLEY         = 'z128'
    integer HUMANMONITOR_SHIP       = 'z127'

    integer HUMAN_SHIPYARD2         = 'z107'
    integer HUMAN_CARAVEL           = 'z122'
    integer HUMAN_CARRACK           = 'z130'
    integer HUMAN_FAST_FIRESHIP     = 'z123'
    integer HUMAN_FISCHER           = 'z125'
    integer HUMAN_FRIGATE           = 'z119'
    integer HUMAN_RAFT              = 'z118'

    integer HUMAN_SHIPYARD3         = 'z092'
    integer HUMAN_FROUGHTTIER       = 'z060'
    integer HUMAN_IMPERATURE        = 'z061'
    integer HUMAN_ROYAL_PRUTINE     = 'z055'
    integer HUMAN_STEAM_PODGE       = 'z111'
    integer HUMAN_CHIVALROUS        = 'z124'
    integer HUMAN_BATTLESHIP        = 'z121'
   
    integer ROYAL_HUMANCOMMANDER    = 'z421'
    integer ROYAL_HUMANCOMMANDER2   = 'z416'
    integer ROYAL_HUMANLIEUTENANT   = 'z412'
    integer ROYAL_HUMANCAPTAIN      = 'z413'     
endglobals

//========================================================================
// This is the training and creation behavior of the player AI.
//======================================================================== 
function main takes nothing returns nothing
    call CampaignAI(FARMHOUSE,null)
    call SetReplacements(5,5,5)
    call SetSlowChopping(true)
    call SetPeonsRepair(true)
    set campaign_gold_peons = 5
    set campaign_wood_peons = 5
   
    call SetBuildUnitEx(20,20,20,FARMHOUSE)
   
    call SetBuildUnitEx(6,6,6,ROYAL_CONSCRIPT)
    call SetBuildUnitEx(2,2,2,IRON_GUARD)
   
    call SetBuildUnitEx(5,5,5,ROYAL_AXEMAN)
    call SetBuildUnitEx(4,4,4,ROYAL_ARCHER)
    call SetBuildUnitEx(16,16,16,ROYAL_FOOTSOLDIER)
    call SetBuildUnitEx(5,5,5,ROYAL_SPEARMAN)
    call SetBuildUnitEx(8,8,8,ROYAL_CROSSBOWMAN)
   
    call SetBuildUnitEx(3,3,3,ROYAL_BATTLEMAGE)
    call SetBuildUnitEx(5,5,5,ROYAL_SAGE)
    call SetBuildUnitEx(3,3,3,ROYAL_CLAIRVOYANT)
   
    call SetBuildUnitEx(7,7,7,ROYAL_LIGHTCAVALRY)
    call SetBuildUnitEx(4,4,4,ROYAL_GALLANT)
    call SetBuildUnitEx(2,2,2,ROYAL_POWERKNIGHT)
   
    //Siege Units
    call SetBuildUnitEx(2,2,2,HUMAN_BALLISTA)
    call SetBuildUnitEx(4,4,4,HUMAN_MANTLET)
    call SetBuildUnitEx(2,2,2,HUMAN_BALLISTASIEGE)
    call SetBuildUnitEx(2,2,2,HUMAN_BATTERING_RAM)
    call SetBuildUnitEx(2,2,2,HUMAN_CANNON)
    call SetBuildUnitEx(3,3,3,HUMAN_BOX_CATAPULT)
    call SetBuildUnitEx(2,2,2,HUMAN_FIELD_CANNON)
    call SetBuildUnitEx(4,4,4,HUMAN_WAR_ZEPPELIN)
   
    call SetBuildUnitEx(4,4,4,ROYAL_CLERIC)
    call SetBuildUnitEx(1,1,1,ROYAL_EXORCIST)
   
   
    call SetBuildUnitEx(2,2,2,ROYAL_PALADIN)
    call SetBuildUnitEx(2,2,2,ROYAL_FAITHSMAN)
    call SetBuildUnitEx(2,2,2,ROYAL_DUTCH)
    call SetBuildUnitEx(2,2,2,ROYAL_COUNCILOR)
    call SetBuildUnitEx(2,2,2,HUMANWAR_GALLEY)     
    call SetBuildUnitEx(1,1,1,HUMANMONITOR_SHIP)
    call SetBuildUnitEx(1,1,1,HUMAN_FISCHER)
    call SetBuildUnitEx(1,1,1,HUMAN_FRIGATE)
    call SetBuildUnitEx(2,2,2,HUMAN_STEAM_PODGE)
           
    call CampaignDefenderEx(3,3,3,ROYAL_SPEARMAN)
    call CampaignDefenderEx(1,1,1,HUMAN_ROYAL_INQUISITOR)   
    call CampaignDefenderEx(1,1,1,HUMAN_ROYALARCHMAGE)   
    call CampaignDefenderEx(1,1,1,HUMAN_ROYALAMBASSADOR)
    call CampaignDefenderEx(1,1,1,HUMAN_ROYAKING1_Andu)   
    call CampaignDefenderEx(2,2,2,HUMAN_BALLISTA)   
    call CampaignDefenderEx(2,2,2,ROYAL_CROSSBOWMAN)   
    call CampaignDefenderEx(1,1,1,HUMAN_BOX_CATAPULT)

//========================================================================
//Attack Waves
//======================================================================== 
   
    call WaitForSignal()

    //=========== WAVE 1-1 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER)

        //=========== WAVE 1-2 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER)
   
        //=========== WAVE 1-3 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
   
        //=========== WAVE 1-4 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M9,M9,M9,USER[GetRandomInt(1, 2)])

        //=========== WAVE 1-5 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M15,M15,M15,USER[GetRandomInt(1, 2)])
   
        //=========== WAVE 1-6 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
   
        //=========== WAVE 1-7 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M9,M9,M9,USER[GetRandomInt(1, 2)])

//======================================================================== 
//======================================================================== 
//Looping Waves with more Difficulty//   
loop     
    //=========== WAVE 2 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M5,M5,M5,USER[GetRandomInt(1, 2)])
   
    //=========== WAVE 3 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(1,1,1,ROYAL_SAGE)
    call CampaignAttackerEx(3,3,3,ROYAL_CLAIRVOYANT)
    call CampaignAttackerEx(2,2,2,ROYAL_CLERIC)   
    call CampaignAttackerEx(1,1,1,ROYAL_EXORCIST)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(7,7,7,ROYAL_FOOTSOLDIER) 
    call CampaignAttackerEx(3,3,3,ROYAL_CROSSBOWMAN) 
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(4,4,4,ROYAL_LIGHTCAVALRY) 
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYALARCHMAGE)                                     
    call SuicideOnPlayerEx(M5,M5,M5,USER[GetRandomInt(1, 2)])

    //=========== WAVE 4 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(2,2,2,ROYAL_CLERIC)
    call CampaignAttackerEx(9,9,9,ROYAL_FOOTSOLDIER)
    call CampaignAttackerEx(5,5,5,ROYAL_CROSSBOWMAN)   
    call CampaignAttackerEx(3,3,3,ROYAL_POWERKNIGHT)
    call CampaignAttackerEx(4,4,4,ROYAL_GALLANT)
    call CampaignAttackerEx(3,3,3,ROYAL_CLAIRVOYANT)
    call CampaignAttackerEx(2,2,2,HUMAN_BALLISTA)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAKING1_Andu)   
    call CampaignAttackerEx(1,1,1,HUMAN_ROYALARCHMAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)   
    call CampaignAttackerEx(2,2,2,HUMAN_BATTERING_RAM)
    call CampaignAttackerEx(2,2,2,HUMAN_CANNON)               
    call SuicideOnPlayerEx(M6,M6,M6,USER[GetRandomInt(1, 2)])
endloop               
endfunction
 
Level 12
Joined
Jun 15, 2016
Messages
472
In your first wave, you set the target to USER (call SuicideOnPlayerEx(M8,M8,M8,USER)), This probably makes the AI stop working.
Also, a thing about player numbers in JASS: they start from 0, so red player is actually Player(0), blue player is Player(1), etc. You can either decrease all player numbers in your script by one, or change from Player(n) function to PlayerEx(n).
 
Level 14
Joined
Nov 13, 2017
Messages
733
In your first wave, you set the target to USER (call SuicideOnPlayerEx(M8,M8,M8,USER)), This probably makes the AI stop working.
Also, a thing about player numbers in JASS: they start from 0, so red player is actually Player(0), blue player is Player(1), etc. You can either decrease all player numbers in your script by one, or change from Player(n) function to PlayerEx(n).
You mean like this?

JASS:
//========================================================================
//II. HUMANS GLOBAL SCRIPTS
//This shows all the units and buildings of the human faction.
//========================================================================
globals
player USER[0] = PlayerEx(1)
player USER[1] = PlayerEx(2)

And for attacks.
JASS:
call SuicideOnPlayerEx(M9,M9,M9,USER[GetRandomInt(0, 1)])

I'm kinda don't know if I'm doing it right.
 
Level 14
Joined
Nov 13, 2017
Messages
733
Yes, exactly.
Going to check this one out right after I remake my map, it's very compromised. I made a 480x480 map and the AI itself didn't function and crashes the game for some reasons of it not finding the enemy player, maybe that huge map-type has very serious glitches in terms of pathability. I wonder if 256x256 will make the AI attack an enemy very well.
 
Level 12
Joined
Jun 15, 2016
Messages
472
@Nowow
I recently hacked myself through in-game campaign maps from Blizzard mpq's and found out they are using
JASS:
 switch targets
kind of tags instead of arrays.

This is also possible. But actually I realized what's the problem with this script: you need to create the array of players before you fill it. Doing something like this:

JASS:
//========================================================================
//II. HUMANS GLOBAL SCRIPTS
//This shows all the units and buildings of the human faction.
//========================================================================
globals
    player array USER
   
    integer H1_TOWNS_KEEP           = 'z370'
    integer PEASANTROYAL            = 'z429'         //worker
    integer PEASANTROYAL_ECON       = 'z442'        //worker2
    integer H2_MOAT                 = 'z380'
    integer H3_ROYAL_CASTLE         = 'z389'
    integer ELITE_GUARD             = 'z432'
    integer FORCE_GUARD             = 'z428'
    integer IRON_GUARD              = 'z431'
    integer THRONE_GUARD            = 'z434'
    integer FARMHOUSE               = 'z019'
     
    integer ALTAR_OF_HEROES         = 'z021'
    integer HUMAN_ROYALAMBASSADOR   = 'Z448'
    integer HUMAN_ROYALARCHMAGE     = 'Z447'
    integer HUMAN_ROYALEMPEROR      = 'Z460'
    integer HUMAN_ROYALGENERAL      = 'Z450'
    integer HUMAN_ROYALGRAND_MARSHL = 'Z451'
    integer HUMAN_ROYALHIGH_CMNDR   = 'Z455'
    integer HUMAN_ROYAL_INQUISITOR  = 'Z452'
    integer HUMAN_ROYAL_IRONEN4CER  = 'Z453'
    integer HUMAN_ROYALJAILOR       = 'Z446'
    integer HUMAN_ROYAKING1_Andu    = 'Z456'
    integer HUMAN_ROYAKING2         = 'Z459'
    integer HUMAN_ROYAKING3         = 'Z461'
    integer HUMAN_ROYALMARKSMAN     = 'Z371'
    integer HUMAN_ROYALMARKSMAN2     = 'Z465'
    integer HUMAN_ROYALVINDICATOR   = 'Z462'
     
    integer TOWER_ROYAL_OUTPOST     = 'z372'
    integer TOWER_ROYAL_OUTPOSTFORT = 'z381'
    integer HUMAN_GUARD             = 'z433'
    integer TOWER_ROYAL_WALL        = 'z382'
    integer TOWER_ROYAL_BALLISTA    = 'z384'
    integer TOWER_ROYAL_CANNON      = 'z385'
    integer TOWER_ROYAL_CATAPULT    = 'z383'
     
    integer ROYAL_OUTPOSTBARRACKS   = 'z377'
    integer ROYAL_CONSCRIPT         = 'z398'
    integer ROYAL_AXEMAN            = 'z399'
    integer ROYAL_ARCHER            = 'z402'
     
    integer ROYAL_KINGDOMBARRACKS   = 'z376'
    integer ROYAL_FOOTSOLDIER       = 'z401'
    integer ROYAL_SPEARMAN          = 'z400'
    integer ROYAL_CROSSBOWMAN       = 'z403'
    integer ROYAL_MARKSMAN          = 'z404'
     
    integer ROYAL_SANCTUM           = 'z397'
    integer ROYAL_SEER              = 'z435'
    integer ROYAL_BATTLEMAGE        = 'z424'
    integer ROYAL_VISIO             = 'z426'
    integer ROYAL_REGENSOLDIER      = 'z419'
    integer ROYAL_SAGE              = 'z430'
    integer ROYAL_CLAIRVOYANT       = 'z423'
    integer ROYAL_REGENSOLDIERELITE = 'z422'

    integer ROYAL_STABLES           = 'z386'
    integer ROYAL_LIGHTCAVALRY      = 'z410'
    integer ROYAL_GALLANT           = 'z406'
    integer ROYAL_POWERKNIGHT       = 'z405'

    integer ROYAL_SIEGEWORKSHOP1    = 'z387'
    integer HUMAN_BALLISTA          = 'z082'
    integer HUMAN_CATAPULT_SLING    = 'z083'
    integer HUMAN_MANTLET           = 'z056'
    integer HUMAN_BALLISTASIEGE     = 'z109'

    integer ROYAL_SIEGEWORKSHOP2    = 'z388'
    integer HUMAN_BATTERING_RAM     = 'z104'
    integer HUMAN_CANNON            = 'z074'
    integer HUMAN_SIEGE_TOWER       = 'z090'
    integer HUMAN_TREBUCHETPACKED   = 'z095'
    integer HUMAN_TREBUCHETUNPACKED = 'z096'
    integer HUMAN_BOX_CATAPULT      = 'z407'
    integer HUMAN_FIELD_CANNON      = 'z408'
    integer HUMAN_WAR_ZEPPELIN      = 'z409'

    integer ROYAL_SHRINE            = 'z373'
    integer ROYAL_CLERIC            = 'z414'
    integer ROYAL_EXORCIST          = 'z418'
    integer ROYAL_ROYAL_ACOLYTE     = 'z415'
    integer ROYAL_PALADIN           = 'z417'
    integer ROYAL_TEMPLAR           = 'z420'
    integer ROYAL_FAITHSMAN         = 'z425'

    integer ROYAL_TOWNCOURTHOUSE    = 'z443'
    integer ROYAL_ADVISOR           = 'z427'
    integer ROYAL_DUTCH             = 'z438'
    integer ROYAL_COUNCILOR         = 'z437'

    integer HUMAN_STASH             = 'z393'
    integer HUMAN_STORAGE           = 'z394'
    integer HUMAN_STOREHOUSE        = 'z395'
    integer HUMAN_TREASURY          = 'z396'

    integer HUMANWELL1              = 'z392'
    integer HUMANWELL2              = 'z463'
    integer HUMANWELL3              = 'z464'

    integer HUMANVENDORSQUARE       = 'z372'
    integer HUMANMARKET             = 'z390'
    integer HUMANCAPITALMARKET      = 'z391'

    //GLOBAL SHIPYARD
    integer HUMANSHIPYARD1          = 'z081'
    integer HUMANFISHING_SHIP       = 'z129'
    integer HUMANEMBARKMENT         = 'z126'
    integer HUMANWAR_GALLEY         = 'z128'
    integer HUMANMONITOR_SHIP       = 'z127'

    integer HUMAN_SHIPYARD2         = 'z107'
    integer HUMAN_CARAVEL           = 'z122'
    integer HUMAN_CARRACK           = 'z130'
    integer HUMAN_FAST_FIRESHIP     = 'z123'
    integer HUMAN_FISCHER           = 'z125'
    integer HUMAN_FRIGATE           = 'z119'
    integer HUMAN_RAFT              = 'z118'

    integer HUMAN_SHIPYARD3         = 'z092'
    integer HUMAN_FROUGHTTIER       = 'z060'
    integer HUMAN_IMPERATURE        = 'z061'
    integer HUMAN_ROYAL_PRUTINE     = 'z055'
    integer HUMAN_STEAM_PODGE       = 'z111'
    integer HUMAN_CHIVALROUS        = 'z124'
    integer HUMAN_BATTLESHIP        = 'z121'
   
    integer ROYAL_HUMANCOMMANDER    = 'z421'
    integer ROYAL_HUMANCOMMANDER2   = 'z416'
    integer ROYAL_HUMANLIEUTENANT   = 'z412'
    integer ROYAL_HUMANCAPTAIN      = 'z413'     
endglobals

function SetEnemyPlayers takes nothing returns nothing
    set USER[1] = PlayerEx(1)
    set USER[2] = PlayerEx(12)
endfunction

//========================================================================
// This is the training and creation behavior of the player AI.
//======================================================================== 
function main takes nothing returns nothing
    call CampaignAI(FARMHOUSE,null)
    call SetReplacements(5,5,5)
    call SetSlowChopping(true)
    call SetPeonsRepair(true)
    set campaign_gold_peons = 5
    set campaign_wood_peons = 5
   
    call SetBuildUnitEx(20,20,20,FARMHOUSE)
   
    call SetBuildUnitEx(6,6,6,ROYAL_CONSCRIPT)
    call SetBuildUnitEx(2,2,2,IRON_GUARD)
   
    call SetBuildUnitEx(5,5,5,ROYAL_AXEMAN)
    call SetBuildUnitEx(4,4,4,ROYAL_ARCHER)
    call SetBuildUnitEx(16,16,16,ROYAL_FOOTSOLDIER)
    call SetBuildUnitEx(5,5,5,ROYAL_SPEARMAN)
    call SetBuildUnitEx(8,8,8,ROYAL_CROSSBOWMAN)
   
    call SetBuildUnitEx(3,3,3,ROYAL_BATTLEMAGE)
    call SetBuildUnitEx(5,5,5,ROYAL_SAGE)
    call SetBuildUnitEx(3,3,3,ROYAL_CLAIRVOYANT)
   
    call SetBuildUnitEx(7,7,7,ROYAL_LIGHTCAVALRY)
    call SetBuildUnitEx(4,4,4,ROYAL_GALLANT)
    call SetBuildUnitEx(2,2,2,ROYAL_POWERKNIGHT)
   
    //Siege Units
    call SetBuildUnitEx(2,2,2,HUMAN_BALLISTA)
    call SetBuildUnitEx(4,4,4,HUMAN_MANTLET)
    call SetBuildUnitEx(2,2,2,HUMAN_BALLISTASIEGE)
    call SetBuildUnitEx(2,2,2,HUMAN_BATTERING_RAM)
    call SetBuildUnitEx(2,2,2,HUMAN_CANNON)
    call SetBuildUnitEx(3,3,3,HUMAN_BOX_CATAPULT)
    call SetBuildUnitEx(2,2,2,HUMAN_FIELD_CANNON)
    call SetBuildUnitEx(4,4,4,HUMAN_WAR_ZEPPELIN)
   
    call SetBuildUnitEx(4,4,4,ROYAL_CLERIC)
    call SetBuildUnitEx(1,1,1,ROYAL_EXORCIST)
   
   
    call SetBuildUnitEx(2,2,2,ROYAL_PALADIN)
    call SetBuildUnitEx(2,2,2,ROYAL_FAITHSMAN)
    call SetBuildUnitEx(2,2,2,ROYAL_DUTCH)
    call SetBuildUnitEx(2,2,2,ROYAL_COUNCILOR)
    call SetBuildUnitEx(2,2,2,HUMANWAR_GALLEY)     
    call SetBuildUnitEx(1,1,1,HUMANMONITOR_SHIP)
    call SetBuildUnitEx(1,1,1,HUMAN_FISCHER)
    call SetBuildUnitEx(1,1,1,HUMAN_FRIGATE)
    call SetBuildUnitEx(2,2,2,HUMAN_STEAM_PODGE)
           
    call CampaignDefenderEx(3,3,3,ROYAL_SPEARMAN)
    call CampaignDefenderEx(1,1,1,HUMAN_ROYAL_INQUISITOR)   
    call CampaignDefenderEx(1,1,1,HUMAN_ROYALARCHMAGE)   
    call CampaignDefenderEx(1,1,1,HUMAN_ROYALAMBASSADOR)
    call CampaignDefenderEx(1,1,1,HUMAN_ROYAKING1_Andu)   
    call CampaignDefenderEx(2,2,2,HUMAN_BALLISTA)   
    call CampaignDefenderEx(2,2,2,ROYAL_CROSSBOWMAN)   
    call CampaignDefenderEx(1,1,1,HUMAN_BOX_CATAPULT)

//========================================================================
//Attack Waves
//======================================================================== 
   
    call WaitForSignal()

    //=========== WAVE 1-1 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER)

        //=========== WAVE 1-2 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
   
        //=========== WAVE 1-3 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
   
        //=========== WAVE 1-4 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M9,M9,M9,USER[GetRandomInt(1, 2)])

        //=========== WAVE 1-5 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M15,M15,M15,USER[GetRandomInt(1, 2)])
   
        //=========== WAVE 1-6 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)   
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)               
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
   
        //=========== WAVE 1-7 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M9,M9,M9,USER[GetRandomInt(1, 2)])

//======================================================================== 
//======================================================================== 
//Looping Waves with more Difficulty//   
loop     
    //=========== WAVE 2 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)   
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                         
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN) 
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH) 
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)             
    call SuicideOnPlayerEx(M5,M5,M5,USER[GetRandomInt(1, 2)])
   
    //=========== WAVE 3 =================//
    call InitAssaultGroup() 
    call CampaignAttackerEx(1,1,1,ROYAL_SAGE)
    call CampaignAttackerEx(3,3,3,ROYAL_CLAIRVOYANT)
    call CampaignAttackerEx(2,2,2,ROYAL_CLERIC)   
    call CampaignAttackerEx(1,1,1,ROYAL_EXORCIST)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(7,7,7,ROYAL_FOOTSOLDIER) 
    call CampaignAttackerEx(3,3,3,ROYAL_CROSSBOWMAN) 
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN) 
    call CampaignAttackerEx(4,4,4,ROYAL_LIGHTCAVALRY) 
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYALARCHMAGE)                                     
    call SuicideOnPlayerEx(M5,M5,M5,USER[GetRandomInt(1, 2)])

    //=========== WAVE 4 =================//
    call InitAssaultGroup() 
    call SetEnemyPlayers()
    call CampaignAttackerEx(2,2,2,ROYAL_CLERIC)
    call CampaignAttackerEx(9,9,9,ROYAL_FOOTSOLDIER)
    call CampaignAttackerEx(5,5,5,ROYAL_CROSSBOWMAN)   
    call CampaignAttackerEx(3,3,3,ROYAL_POWERKNIGHT)
    call CampaignAttackerEx(4,4,4,ROYAL_GALLANT)
    call CampaignAttackerEx(3,3,3,ROYAL_CLAIRVOYANT)
    call CampaignAttackerEx(2,2,2,HUMAN_BALLISTA)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAKING1_Andu)   
    call CampaignAttackerEx(1,1,1,HUMAN_ROYALARCHMAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)   
    call CampaignAttackerEx(2,2,2,HUMAN_BATTERING_RAM)
    call CampaignAttackerEx(2,2,2,HUMAN_CANNON)               
    call SuicideOnPlayerEx(M6,M6,M6,USER[GetRandomInt(1, 2)])
endloop               
endfunction

would probably work. So you need to create a player array, create a function that fills it with the players you want, and then call it from your main function.
 
Level 6
Joined
Dec 11, 2014
Messages
93
This is also possible. But actually I realized what's the problem with this script: you need to create the array of players before you fill it. Doing something like this:

JASS:
//========================================================================
//II. HUMANS GLOBAL SCRIPTS
//This shows all the units and buildings of the human faction.
//========================================================================
globals
    player array USER
  
    integer H1_TOWNS_KEEP           = 'z370'
    integer PEASANTROYAL            = 'z429'         //worker
    integer PEASANTROYAL_ECON       = 'z442'        //worker2
    integer H2_MOAT                 = 'z380'
    integer H3_ROYAL_CASTLE         = 'z389'
    integer ELITE_GUARD             = 'z432'
    integer FORCE_GUARD             = 'z428'
    integer IRON_GUARD              = 'z431'
    integer THRONE_GUARD            = 'z434'
    integer FARMHOUSE               = 'z019'
    
    integer ALTAR_OF_HEROES         = 'z021'
    integer HUMAN_ROYALAMBASSADOR   = 'Z448'
    integer HUMAN_ROYALARCHMAGE     = 'Z447'
    integer HUMAN_ROYALEMPEROR      = 'Z460'
    integer HUMAN_ROYALGENERAL      = 'Z450'
    integer HUMAN_ROYALGRAND_MARSHL = 'Z451'
    integer HUMAN_ROYALHIGH_CMNDR   = 'Z455'
    integer HUMAN_ROYAL_INQUISITOR  = 'Z452'
    integer HUMAN_ROYAL_IRONEN4CER  = 'Z453'
    integer HUMAN_ROYALJAILOR       = 'Z446'
    integer HUMAN_ROYAKING1_Andu    = 'Z456'
    integer HUMAN_ROYAKING2         = 'Z459'
    integer HUMAN_ROYAKING3         = 'Z461'
    integer HUMAN_ROYALMARKSMAN     = 'Z371'
    integer HUMAN_ROYALMARKSMAN2     = 'Z465'
    integer HUMAN_ROYALVINDICATOR   = 'Z462'
    
    integer TOWER_ROYAL_OUTPOST     = 'z372'
    integer TOWER_ROYAL_OUTPOSTFORT = 'z381'
    integer HUMAN_GUARD             = 'z433'
    integer TOWER_ROYAL_WALL        = 'z382'
    integer TOWER_ROYAL_BALLISTA    = 'z384'
    integer TOWER_ROYAL_CANNON      = 'z385'
    integer TOWER_ROYAL_CATAPULT    = 'z383'
    
    integer ROYAL_OUTPOSTBARRACKS   = 'z377'
    integer ROYAL_CONSCRIPT         = 'z398'
    integer ROYAL_AXEMAN            = 'z399'
    integer ROYAL_ARCHER            = 'z402'
    
    integer ROYAL_KINGDOMBARRACKS   = 'z376'
    integer ROYAL_FOOTSOLDIER       = 'z401'
    integer ROYAL_SPEARMAN          = 'z400'
    integer ROYAL_CROSSBOWMAN       = 'z403'
    integer ROYAL_MARKSMAN          = 'z404'
    
    integer ROYAL_SANCTUM           = 'z397'
    integer ROYAL_SEER              = 'z435'
    integer ROYAL_BATTLEMAGE        = 'z424'
    integer ROYAL_VISIO             = 'z426'
    integer ROYAL_REGENSOLDIER      = 'z419'
    integer ROYAL_SAGE              = 'z430'
    integer ROYAL_CLAIRVOYANT       = 'z423'
    integer ROYAL_REGENSOLDIERELITE = 'z422'

    integer ROYAL_STABLES           = 'z386'
    integer ROYAL_LIGHTCAVALRY      = 'z410'
    integer ROYAL_GALLANT           = 'z406'
    integer ROYAL_POWERKNIGHT       = 'z405'

    integer ROYAL_SIEGEWORKSHOP1    = 'z387'
    integer HUMAN_BALLISTA          = 'z082'
    integer HUMAN_CATAPULT_SLING    = 'z083'
    integer HUMAN_MANTLET           = 'z056'
    integer HUMAN_BALLISTASIEGE     = 'z109'

    integer ROYAL_SIEGEWORKSHOP2    = 'z388'
    integer HUMAN_BATTERING_RAM     = 'z104'
    integer HUMAN_CANNON            = 'z074'
    integer HUMAN_SIEGE_TOWER       = 'z090'
    integer HUMAN_TREBUCHETPACKED   = 'z095'
    integer HUMAN_TREBUCHETUNPACKED = 'z096'
    integer HUMAN_BOX_CATAPULT      = 'z407'
    integer HUMAN_FIELD_CANNON      = 'z408'
    integer HUMAN_WAR_ZEPPELIN      = 'z409'

    integer ROYAL_SHRINE            = 'z373'
    integer ROYAL_CLERIC            = 'z414'
    integer ROYAL_EXORCIST          = 'z418'
    integer ROYAL_ROYAL_ACOLYTE     = 'z415'
    integer ROYAL_PALADIN           = 'z417'
    integer ROYAL_TEMPLAR           = 'z420'
    integer ROYAL_FAITHSMAN         = 'z425'

    integer ROYAL_TOWNCOURTHOUSE    = 'z443'
    integer ROYAL_ADVISOR           = 'z427'
    integer ROYAL_DUTCH             = 'z438'
    integer ROYAL_COUNCILOR         = 'z437'

    integer HUMAN_STASH             = 'z393'
    integer HUMAN_STORAGE           = 'z394'
    integer HUMAN_STOREHOUSE        = 'z395'
    integer HUMAN_TREASURY          = 'z396'

    integer HUMANWELL1              = 'z392'
    integer HUMANWELL2              = 'z463'
    integer HUMANWELL3              = 'z464'

    integer HUMANVENDORSQUARE       = 'z372'
    integer HUMANMARKET             = 'z390'
    integer HUMANCAPITALMARKET      = 'z391'

    //GLOBAL SHIPYARD
    integer HUMANSHIPYARD1          = 'z081'
    integer HUMANFISHING_SHIP       = 'z129'
    integer HUMANEMBARKMENT         = 'z126'
    integer HUMANWAR_GALLEY         = 'z128'
    integer HUMANMONITOR_SHIP       = 'z127'

    integer HUMAN_SHIPYARD2         = 'z107'
    integer HUMAN_CARAVEL           = 'z122'
    integer HUMAN_CARRACK           = 'z130'
    integer HUMAN_FAST_FIRESHIP     = 'z123'
    integer HUMAN_FISCHER           = 'z125'
    integer HUMAN_FRIGATE           = 'z119'
    integer HUMAN_RAFT              = 'z118'

    integer HUMAN_SHIPYARD3         = 'z092'
    integer HUMAN_FROUGHTTIER       = 'z060'
    integer HUMAN_IMPERATURE        = 'z061'
    integer HUMAN_ROYAL_PRUTINE     = 'z055'
    integer HUMAN_STEAM_PODGE       = 'z111'
    integer HUMAN_CHIVALROUS        = 'z124'
    integer HUMAN_BATTLESHIP        = 'z121'
  
    integer ROYAL_HUMANCOMMANDER    = 'z421'
    integer ROYAL_HUMANCOMMANDER2   = 'z416'
    integer ROYAL_HUMANLIEUTENANT   = 'z412'
    integer ROYAL_HUMANCAPTAIN      = 'z413'    
endglobals

function SetEnemyPlayers takes nothing returns nothing
    set USER[1] = PlayerEx(1)
    set USER[2] = PlayerEx(12)
endfunction

//========================================================================
// This is the training and creation behavior of the player AI.
//========================================================================
function main takes nothing returns nothing
    call CampaignAI(FARMHOUSE,null)
    call SetReplacements(5,5,5)
    call SetSlowChopping(true)
    call SetPeonsRepair(true)
    set campaign_gold_peons = 5
    set campaign_wood_peons = 5
  
    call SetBuildUnitEx(20,20,20,FARMHOUSE)
  
    call SetBuildUnitEx(6,6,6,ROYAL_CONSCRIPT)
    call SetBuildUnitEx(2,2,2,IRON_GUARD)
  
    call SetBuildUnitEx(5,5,5,ROYAL_AXEMAN)
    call SetBuildUnitEx(4,4,4,ROYAL_ARCHER)
    call SetBuildUnitEx(16,16,16,ROYAL_FOOTSOLDIER)
    call SetBuildUnitEx(5,5,5,ROYAL_SPEARMAN)
    call SetBuildUnitEx(8,8,8,ROYAL_CROSSBOWMAN)
  
    call SetBuildUnitEx(3,3,3,ROYAL_BATTLEMAGE)
    call SetBuildUnitEx(5,5,5,ROYAL_SAGE)
    call SetBuildUnitEx(3,3,3,ROYAL_CLAIRVOYANT)
  
    call SetBuildUnitEx(7,7,7,ROYAL_LIGHTCAVALRY)
    call SetBuildUnitEx(4,4,4,ROYAL_GALLANT)
    call SetBuildUnitEx(2,2,2,ROYAL_POWERKNIGHT)
  
    //Siege Units
    call SetBuildUnitEx(2,2,2,HUMAN_BALLISTA)
    call SetBuildUnitEx(4,4,4,HUMAN_MANTLET)
    call SetBuildUnitEx(2,2,2,HUMAN_BALLISTASIEGE)
    call SetBuildUnitEx(2,2,2,HUMAN_BATTERING_RAM)
    call SetBuildUnitEx(2,2,2,HUMAN_CANNON)
    call SetBuildUnitEx(3,3,3,HUMAN_BOX_CATAPULT)
    call SetBuildUnitEx(2,2,2,HUMAN_FIELD_CANNON)
    call SetBuildUnitEx(4,4,4,HUMAN_WAR_ZEPPELIN)
  
    call SetBuildUnitEx(4,4,4,ROYAL_CLERIC)
    call SetBuildUnitEx(1,1,1,ROYAL_EXORCIST)
  
  
    call SetBuildUnitEx(2,2,2,ROYAL_PALADIN)
    call SetBuildUnitEx(2,2,2,ROYAL_FAITHSMAN)
    call SetBuildUnitEx(2,2,2,ROYAL_DUTCH)
    call SetBuildUnitEx(2,2,2,ROYAL_COUNCILOR)
    call SetBuildUnitEx(2,2,2,HUMANWAR_GALLEY)    
    call SetBuildUnitEx(1,1,1,HUMANMONITOR_SHIP)
    call SetBuildUnitEx(1,1,1,HUMAN_FISCHER)
    call SetBuildUnitEx(1,1,1,HUMAN_FRIGATE)
    call SetBuildUnitEx(2,2,2,HUMAN_STEAM_PODGE)
          
    call CampaignDefenderEx(3,3,3,ROYAL_SPEARMAN)
    call CampaignDefenderEx(1,1,1,HUMAN_ROYAL_INQUISITOR)  
    call CampaignDefenderEx(1,1,1,HUMAN_ROYALARCHMAGE)  
    call CampaignDefenderEx(1,1,1,HUMAN_ROYALAMBASSADOR)
    call CampaignDefenderEx(1,1,1,HUMAN_ROYAKING1_Andu)  
    call CampaignDefenderEx(2,2,2,HUMAN_BALLISTA)  
    call CampaignDefenderEx(2,2,2,ROYAL_CROSSBOWMAN)  
    call CampaignDefenderEx(1,1,1,HUMAN_BOX_CATAPULT)

//========================================================================
//Attack Waves
//========================================================================
  
    call WaitForSignal()

    //=========== WAVE 1-1 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)  
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)              
    call SuicideOnPlayerEx(M8,M8,M8,USER)

        //=========== WAVE 1-2 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)  
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)              
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
  
        //=========== WAVE 1-3 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)  
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)              
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
  
        //=========== WAVE 1-4 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)  
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                        
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN)
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH)
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)            
    call SuicideOnPlayerEx(M9,M9,M9,USER[GetRandomInt(1, 2)])

        //=========== WAVE 1-5 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)  
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                        
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN)
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH)
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)            
    call SuicideOnPlayerEx(M15,M15,M15,USER[GetRandomInt(1, 2)])
  
        //=========== WAVE 1-6 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(6,6,6,ROYAL_CONSCRIPT)
    call CampaignAttackerEx(2,2,2,IRON_GUARD)
    call CampaignAttackerEx(4,4,4,ROYAL_ARCHER)  
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)              
    call SuicideOnPlayerEx(M8,M8,M8,USER[GetRandomInt(1, 2)])
  
        //=========== WAVE 1-7 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)  
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                        
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN)
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH)
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)            
    call SuicideOnPlayerEx(M9,M9,M9,USER[GetRandomInt(1, 2)])

//========================================================================
//========================================================================
//Looping Waves with more Difficulty//  
loop    
    //=========== WAVE 2 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(5,5,5,ROYAL_AXEMAN)
    call CampaignAttackerEx(2,2,2,ROYAL_BATTLEMAGE)
    call CampaignAttackerEx(2,2,2,ROYAL_SAGE)  
    call CampaignAttackerEx(1,1,1,HUMAN_BALLISTASIEGE)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)
    call CampaignAttackerEx(3,3,3,ROYAL_LIGHTCAVALRY)                        
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN)
    call CampaignAttackerEx(2,2,2,ROYAL_DUTCH)
    call CampaignAttackerEx(2,2,2,ROYAL_COUNCILOR)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAL_INQUISITOR)            
    call SuicideOnPlayerEx(M5,M5,M5,USER[GetRandomInt(1, 2)])
  
    //=========== WAVE 3 =================//
    call InitAssaultGroup()
    call CampaignAttackerEx(1,1,1,ROYAL_SAGE)
    call CampaignAttackerEx(3,3,3,ROYAL_CLAIRVOYANT)
    call CampaignAttackerEx(2,2,2,ROYAL_CLERIC)  
    call CampaignAttackerEx(1,1,1,ROYAL_EXORCIST)
    call CampaignAttackerEx(1,1,1,HUMAN_BOX_CATAPULT)
    call CampaignAttackerEx(1,1,1,HUMAN_FIELD_CANNON)
    call CampaignAttackerEx(2,2,2,HUMAN_MANTLET)
    call CampaignAttackerEx(7,7,7,ROYAL_FOOTSOLDIER)
    call CampaignAttackerEx(3,3,3,ROYAL_CROSSBOWMAN)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)
    call CampaignAttackerEx(4,4,4,ROYAL_LIGHTCAVALRY)
    call CampaignAttackerEx(2,2,2,ROYAL_PALADIN)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYALARCHMAGE)                                    
    call SuicideOnPlayerEx(M5,M5,M5,USER[GetRandomInt(1, 2)])

    //=========== WAVE 4 =================//
    call InitAssaultGroup()
    call SetEnemyPlayers()
    call CampaignAttackerEx(2,2,2,ROYAL_CLERIC)
    call CampaignAttackerEx(9,9,9,ROYAL_FOOTSOLDIER)
    call CampaignAttackerEx(5,5,5,ROYAL_CROSSBOWMAN)  
    call CampaignAttackerEx(3,3,3,ROYAL_POWERKNIGHT)
    call CampaignAttackerEx(4,4,4,ROYAL_GALLANT)
    call CampaignAttackerEx(3,3,3,ROYAL_CLAIRVOYANT)
    call CampaignAttackerEx(2,2,2,HUMAN_BALLISTA)
    call CampaignAttackerEx(1,1,1,HUMAN_ROYAKING1_Andu)  
    call CampaignAttackerEx(1,1,1,HUMAN_ROYALARCHMAGE)
    call CampaignAttackerEx(1,1,1,HUMAN_WAR_ZEPPELIN)  
    call CampaignAttackerEx(2,2,2,HUMAN_BATTERING_RAM)
    call CampaignAttackerEx(2,2,2,HUMAN_CANNON)              
    call SuicideOnPlayerEx(M6,M6,M6,USER[GetRandomInt(1, 2)])
endloop              
endfunction

would probably work. So you need to create a player array, create a function that fills it with the players you want, and then call it from your main function.
Doing the random int method, would you need to remove any players no longer in the game or would the function automatically do that?

(Like for example if you set the array to have 3 players; red, blue, and teal - and blue ended up dying, would you need to do anything to avoid the integer picking blue and getting stuck in a loop, or skipping an attack wave? Or would it just automatically pick a new integer if it can't find any blue units?)
 
Level 12
Joined
Jun 15, 2016
Messages
472
Doing the random int method, would you need to remove any players no longer in the game or would the function automatically do that?
I'd assume yes, internally the function SuicideOnPlayerEx has this loop

Code:
        if standard then
            if bldgs then
                exitwhen SuicidePlayer(p,sleep_seconds >= -60)
            else
                exitwhen SuicidePlayerUnits(p,sleep_seconds >= -60)
            endif
        else
            call AttackMoveXYA(x,y)
        endif

All the (native) functions inside might just keep returning false when set to a dead player, and you might get stuck in an infinite loop ("might" because I didn't test it).
Instead of removing dead players, I'd wrap choosing a player in a function checking that the player is alive first, maybe something like this:

Code:
function GetRandomLivingPlayer takes player array all_players, integer total_players returns player
    player array living_players
    integer total_living = 0

    integer player_index = 0
    loop
        exitwhen player_index >= total_players

        if GetPlayerUnitCount(all_players[player_index], false) > 0 then
            return all_players[player_index]
        endif
       
        player_index = player_index + 1
    endloop
  
    return null  // (not sure if ok to return null)
endfunction
 
Level 6
Joined
Dec 11, 2014
Messages
93
I'd assume yes, internally the function SuicideOnPlayerEx has this loop

Code:
        if standard then
            if bldgs then
                exitwhen SuicidePlayer(p,sleep_seconds >= -60)
            else
                exitwhen SuicidePlayerUnits(p,sleep_seconds >= -60)
            endif
        else
            call AttackMoveXYA(x,y)
        endif

All the (native) functions inside might just keep returning false when set to a dead player, and you might get stuck in an infinite loop ("might" because I didn't test it).
Instead of removing dead players, I'd wrap choosing a player in a function checking that the player is alive first, maybe something like this:

Code:
function GetRandomLivingPlayer takes player array all_players, integer total_players returns player
    player array living_players
    integer total_living = 0

    integer player_index = 0
    loop
        exitwhen player_index >= total_players

        if GetPlayerUnitCount(all_players[player_index], false) > 0 then
            return all_players[player_index]
        endif
      
        player_index = player_index + 1
    endloop
 
    return null  // (not sure if ok to return null)
endfunction
Wouldn't you want to return the player_index or some other value in there to determine your target as opposed to null?

Also I'm not entirely sure what I have to create variables for outside of this section of code. Do I need to create a global variable for living_players and total_players?

Sorry kinda new at this stuff and just started tackling this part now because it feels the most complicated. Hehe...
 
Status
Not open for further replies.
Top