--	Stratagus Map - Single player campaign

Load("campaigns/human-exp/levelx09h_c2.sms")

Briefing(
  title,
  objectives,
  "../campaigns/human/interface/introscreen1.png",
  "campaigns/human-exp/levelx09h.txt",
  {"campaigns/human-exp/levelx09h-intro1.wav",
   "campaigns/human-exp/levelx09h-intro2.wav"}
)

AddTrigger(
  function() return GetPlayerData(4, "UnitTypesCount", "unit-runestone") == 0 and
    GetPlayerData(5, "UnitTypesCount", "unit-fortress") == 0 end,
  function() return ActionVictory() end)
AddTrigger(
  function() return GetPlayerData(GetThisPlayer(), "TotalNumUnits") == 0 end,
  function() return ActionDefeat() end)

local hum_exp_09a_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(60000) end,
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false end,
}

local hum_exp_09b_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(3000) end,
	function() return AiForce(1, {AiFlyer(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiForce(2, {AiSoldier(), 5, AiShooter(), 3, AiCavalry(), 3, AiCatapult(), 1}) 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 hum_exp_09c_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(1000) end,
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 5, AiCatapult(), 1}) 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 hum_exp_09d_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(65000) end,
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false end,
}

local hum_exp_09a_funcs = {
	function() return AiSet(AiWorker(), 1) end,
	function() return AiNeed(AiCityCenter()) end,
	function() return AiNeed(AiLumberMill()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiUpgradeTo(AiBetterCityCenter()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiNeed(AiStables()) end,
	function() return AiNeed(AiTemple()) end,
	function() return AiResearch(AiUpgradeEliteShooter()) end,
	function() return AiResearch(AiUpgradeEliteShooter1()) end,
	function() return AiResearch(AiUpgradeEliteShooter2()) end,

	function() return AiNeed(AiMageTower()) end,
	function() return AiResearch(AiMageSpell5()) end,
	function() return AiResearch(AiMageSpell1()) end,
	function() return AiResearch(AiMageSpell3()) end,
	function() return AiResearch(AiMageSpell4()) end,
	function() return AiResearch(AiMageSpell2()) end,
	function() return AiResearch(AiUpgradeCavalryMage()) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeWeapon2()) end,
	function() return AiResearch(AiUpgradeArmor2()) end,
	
	function() return AiNeed(AiTower()) end,
	function() return AiNeed(AiTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiSet(AiWorker(), 10) end,
	function() return AiWait(AiWorker()) end,
	
	function() return AiForce(0, {AiSoldier(), 2, AiShooter(), 3, AiCavalry(), 3, AiCatapult(), 1, AiMage(), 2}) end,

	function() return AiLoop(hum_exp_09a_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

local hum_exp_09b_funcs = {
	function() return AiSet(AiWorker(), 1) end,
	function() return AiNeed(AiCityCenter()) end,
	function() return AiNeed(AiLumberMill()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiSet(AiWorker(), 9) end,
	function() return AiWait(AiWorker()) end,
	function() return AiForce(0, {AiSoldier(), 3, AiShooter(), 2}) end,
	function() return AiUpgradeTo(AiBetterCityCenter()) end,
	function() return AiWait(AiBetterCityCenter()) end,
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiNeed(AiStables()) end,
	function() return AiNeed(AiScientific()) end,
	
	function() return AiNeed(AiTower()) end,
	function() return AiNeed(AiTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiNeed(AiTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,	
	function() return AiUpgradeTo(AiBestCityCenter()) end,
	function() return AiWait(AiBestCityCenter()) end,
	function() return AiNeed(AiAirport()) end,
	
	function() return AiForce(1, {AiFlyer(), 1}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeArmor2()) end,
	function() return AiResearch(AiUpgradeMissile2()) end,
	
	function() return AiForce(1, {AiFlyer(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiLoop(hum_exp_09b_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

local hum_exp_09c_funcs = {
	function() return AiSet(AiWorker(), 1) end,
	function() return AiNeed(AiCityCenter()) end,
	function() return AiNeed(AiLumberMill()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiNeed(AiTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	
	function() return AiSet(AiWorker(), 6) end,
	function() return AiWait(AiWorker()) end,
	
	function() return AiSet(AiWorker(), 8) end,
	function() return AiForce(1, {AiSoldier(), 6, AiShooter(), 5, AiCatapult(), 1}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiLoop(hum_exp_09c_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

local hum_exp_09d_funcs = {
	function() return AiSet(AiWorker(), 1) end,
	function() return AiNeed(AiCityCenter()) end,
	function() return AiNeed(AiLumberMill()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiNeed(AiTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	
	function() return AiSet(AiWorker(), 3) end,
	function() return AiWait(AiWorker()) end,
	
	function() return AiForce(0, {AiSoldier(), 4, AiShooter(), 3, AiCavalry(), 1, AiCatapult(), 1}) end,
	
	function() return AiLoop(hum_exp_09d_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

function AiHumanExp09a() return AiLoop(hum_exp_09a_funcs, stratagus.gameData.AIState.index) end
function AiHumanExp09b() return AiLoop(hum_exp_09b_funcs, stratagus.gameData.AIState.index) end
function AiHumanExp09c() return AiLoop(hum_exp_09c_funcs, stratagus.gameData.AIState.index) end
function AiHumanExp09d() return AiLoop(hum_exp_09d_funcs, stratagus.gameData.AIState.index) end
DefineAi("hum-exp-9a", "*", "hum-exp-9a", AiHumanExp09a)
DefineAi("hum-exp-9b", "*", "hum-exp-9b", AiHumanExp09b)
DefineAi("hum-exp-9c", "*", "hum-exp-9c", AiHumanExp09c)
DefineAi("hum-exp-9d", "*", "hum-exp-9d", AiHumanExp09d)

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

Load("campaigns/human-exp/levelx09h.sms")
