--	Stratagus Map - Single player campaign

Load("campaigns/orc-exp/levelx11o_c2.sms")

Briefing(
  title,
  objectives,
  "../campaigns/orc/interface/introscreen5.png",
  "campaigns/orc-exp/levelx11o.txt",
  {"campaigns/orc-exp/levelx11o-intro1.wav",
   "campaigns/orc-exp/levelx11o-intro2.wav"}
)

-- FIXME: Check if units are destroyed.
AddTrigger(
  function() return GetPlayerData(3, "TotalNumUnits") == 0 and
    GetPlayerData(6, "UnitTypesCount", "unit-mage-tower") == 0 end,
  function() return ActionVictory() end)

AddTrigger(
  function() return GetPlayerData(GetThisPlayer(), "TotalNumUnits") == 0 end,
  function() return ActionDefeat() end)

--Units
DefineAllowNormalHumanUnits("AAAAAAAAAAAAAAAA")
DefineAllowExtraHumanUnits("FFFFFFFFFFFFFFFF")
DefineAllowNormalOrcUnits("AAAAAAAAAAAAAAAA")
DefineAllowExtraOrcUnits("FFFFFFFFFFFFFFFF")
DefineAllowSpecialUnits("FFFFFFFFFFFFFFFF")
DefineAllowHumanAlways()
DefineAllowOrcAlways()

local orc_exp_11a_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(8000) end,
	function() return AiForce(2, {AiSoldier(), 6, AiShooter(), 4, AiCavalry(), 4}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false end,
}

local orc_exp_11b_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(1500) end,
	function() return AiForce(2, {AiFlyer(), 3}, true) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() return AiSleep(1000) end,
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 6, AiCavalry(), 6, AiCatapult(), 2, AiMage(), 6}, true) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false end,
}

local orc_exp_11a_funcs = {
	function() return AiForce(1, {AiFlyer(), 1}) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(4000) end,
	
	function() return AiForce(1, {AiFlyer(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiSleep(8000) end,
	function() return AiForce(2, {AiSoldier(), 6, AiShooter(), 4, AiCavalry(), 4}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiSleep(8000) end,
	function() return AiForce(1, {AiFlyer(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiSleep(8000) end,
	function() return AiForce(2, {AiSoldier(), 6, AiShooter(), 4, AiCavalry(), 4}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiSleep(8000) end,
	function() return AiForce(1, {AiFlyer(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiSleep(8000) end,
	function() return AiForce(2, {AiSoldier(), 6, AiShooter(), 4, AiCavalry(), 4}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiSleep(8000) end,
	function() return AiForce(1, {AiFlyer(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiLoop(orc_exp_11a_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

local orc_exp_11b_funcs = {
	function() return AiNeed(AiCityCenter()) end,
	function() return AiSet(AiWorker(), 6) end,
	function() return AiWait(AiWorker()) end,
	function() return AiNeed(AiLumberMill()) end,
	function() return AiNeed(AiBarracks()) end,

	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 3}) end,
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiSleep(2000) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiSleep(10000) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiUpgradeTo(AiBetterCityCenter()) end,
	function() return AiWait(AiBetterCityCenter()) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiNeed(AiStables()) end,
	function() return AiSet(AiWorker(), 8) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeWeapon2()) end,
	function() return AiResearch(AiUpgradeArmor2()) end,
	function() return AiResearch(AiUpgradeMissile2()) end,
	function() return AiUpgradeTo(AiBestCityCenter()) end,
	function() return AiWait(AiBestCityCenter()) end,	
	
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 6, AiCavalry(), 5, AiCatapult(), 2 }, true) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiNeed(AiTemple()) end,
	function() return AiSet(AiWorker(), 15) end,
	function() return AiWait(AiWorker()) end,
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 6, AiCavalry(), 5, AiCatapult(), 2 }, true) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiNeed(AiBarracks()) end,
	function() return AiSleep(5000) end,
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 6, AiCavalry(), 5, AiCatapult(), 2 }, true) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiResearch(AiUpgradeCavalryMage()) end,
	function() return AiSleep(5000) end,
	function() return AiNeed(AiMageTower()) end,
	function() return AiNeed(AiMageTower()) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	function() return AiResearch(AiUpgradeEliteShooter()) end,
	function() return AiResearch(AiMageSpell4()) end,
	function() return AiResearch(AiUpgradeEliteShooter2()) end,
	
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 6, AiCavalry(), 5, AiCatapult(), 2, AiMage(), 6}, true) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,

	function() return AiSleep(3000) end,
	function() return AiResearch(AiMageSpell5()) end,
	function() return AiNeed(AiAirport()) end,
	function() return AiResearch(AiMageSpell1()) end,
	function() return AiResearch(AiMageSpell3()) end,
	
	function() return AiForce(2, {AiFlyer(), 3}, true) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 6, AiCavalry(), 6, AiCatapult(), 2, AiMage(), 6}, true) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiResearch(AiUpgradeEliteShooter1()) end,
	function() return AiResearch(AiMageSpell2()) end,
	function() return AiSleep(4000) end,
	function() return AiForce(2, {AiFlyer(), 3}, true) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiSet(AiWorker(), 20) end,
	function() return AiResearch(AiCavalryMageSpell2()) end,
	function() return AiResearch(AiUpgradeEliteShooter3()) end,
	function() return AiResearch(AiUpgradeCatapult1()) end,
	function() return AiForce(2, {AiFlyer(), 3}, true) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiResearch(AiUpgradeCatapult2()) end,
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 6, AiCavalry(), 6, AiCatapult(), 2, AiMage(), 6}, true) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiLoop(orc_exp_11b_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

function AiOrcExp11a() return AiLoop(orc_exp_11a_funcs, stratagus.gameData.AIState.index) end
function AiOrcExp11b() return AiLoop(orc_exp_11b_funcs, stratagus.gameData.AIState.index) end
DefineAi("orc-exp-11a", "*", "orc-exp-11a", AiOrcExp11a)
DefineAi("orc-exp-11b", "*", "orc-exp-11b", AiOrcExp11b)

Load("campaigns/orc-exp/levelx11o.sms")
