--	Stratagus Map - Single player campaign

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

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

AddTrigger(
  function() return GetPlayerData(3, "TotalNumUnits") == 0 and
    GetPlayerData(6, "TotalNumUnits") == 0 and
    GetPlayerData(7, "TotalNumUnits") == 0 end,
  function() return ActionVictory() end)
AddTrigger(
  function() return GetPlayerData(GetThisPlayer(), "TotalNumUnits") == 0 end,
  function() return ActionDefeat() end)

local hum_exp_08a_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(1000) end,
	function() return AiForce(1, {AiSoldier(), 3, AiShooter(), 3, AiCavalry(), 2, 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_08b_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(3000) end,
	function() return AiForce(2, {AiSoldier(), 3, AiShooter(), 3, AiTransporter(), 1}) end,
	function() return AiForce(3, {AiShooter(), 1, AiCavalry(), 3, AiCatapult(), 2, AiTransporter(), 1}) end,
	function() return AiWaitForce(2) end,
	function() return AiWaitForce(3) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(3) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 3, AiSubmarine(), 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_08c_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiSleep(4000) end,
	function() return AiForce(2, {AiFlyer(), 3}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 2, AiSubmarine(), 2}) 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_08a_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(AiTower()) end,
	function() return AiNeed(AiTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiNeed(AiStables()) end,
	
	function() return AiSet(AiWorker(), 4) end,
	function() return AiWait(AiWorker()) end,
	function() return AiForce(1, {AiSoldier(), 3, AiShooter(), 3, AiCavalry(), 2, AiCatapult(), 1}) end,
	function() return AiSleep(1000) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiSleep(3000) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiResearch(AiUpgradeWeapon2()) end,
	function() return AiSet(AiWorker(), 8) end,
	function() return AiWait(AiWorker()) end,
	function() return AiResearch(AiUpgradeArmor2()) end,

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

local hum_exp_08b_funcs = {
	function() return AiSet(AiWorker(), 1) end,
	function() return AiSet(AiTanker(), 1) end,
	function() return AiNeed(AiCityCenter()) end,
	function() return AiNeed(AiLumberMill()) end,
	function() return AiNeed(AiBarracks()) end,
	function() return AiNeed(AiHarbor()) end,
	function() return AiNeed(AiTower()) end,
	function() return AiUpgradeTo(AiGuardTower()) end,
	function() return AiUpgradeTo(AiBetterCityCenter()) end,
	
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiNeed(AiStables()) end,
	function() return AiNeed(AiHarbor()) end,
	function() return AiNeed(AiFoundry()) end,
	function() return AiNeed(AiRefinery()) end,
	function() return AiNeed(AiScientific()) end,
	function() return AiNeed(AiBarracks()) end,
	
	function() return AiResearch(AiUpgradeShipArmor1()) end,
	function() return AiResearch(AiUpgradeShipCannon1()) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeCatapult1()) end,
	function() return AiResearch(AiUpgradeShipArmor2()) end,
	function() return AiResearch(AiUpgradeCavalryMage()) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	function() return AiResearch(AiUpgradeShipCannon2()) end,
	function() return AiResearch(AiUpgradeMissile2()) end,
	function() return AiResearch(AiUpgradeEliteShooter()) end,
	function() return AiResearch(AiUpgradeEliteShooter1()) end,

	function() return AiSet(AiWorker(), 9) end,
	function() return AiWait(AiWorker()) end,
	function() return AiSet(AiTanker(), 3) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 3, AiSubmarine(), 1}) end,
	function() return AiForce(2, {AiSoldier(), 3, AiShooter(), 3, AiTransporter(), 1}) end,
	function() return AiForce(3, {AiShooter(), 1, AiCavalry(), 3, AiCatapult(), 2, AiTransporter(), 1}) end,
	function() return AiForce(4, {AiScout(), 1}) end,
	
	function() return AiResearch(AiUpgradeEliteShooter2()) end,
	function() return AiResearch(AiUpgradeEliteShooter3()) end,
	function() return AiSleep(20000) end,
	function() return AiWaitForce(2) end,
	function() return AiWaitForce(3) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(3) end,
	
	function() return AiSleep(2000) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiForce(2, {AiSoldier(), 3, AiShooter(), 3, AiTransporter(), 1}) end,
	function() return AiForce(3, {AiShooter(), 1, AiCavalry(), 3, AiCatapult(), 2, AiTransporter(), 1}) end,
	function() return AiWaitForce(2) end,
	function() return AiWaitForce(3) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(3) end,

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

local hum_exp_08c_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(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(AiBetterCityCenter()) end,
	
	function() return AiNeed(AiBlacksmith()) end,
	function() return AiNeed(AiStables()) end,
	function() return AiUpgradeTo(AiBestCityCenter()) end,
	function() return AiNeed(AiMageTower()) end,
	function() return AiNeed(AiAirport()) end,
	function() return AiNeed(AiTemple()) end,

	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeCatapult1()) end,
	function() return AiResearch(AiUpgradeCavalryMage()) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	function() return AiResearch(AiMageSpell1()) end,
	function() return AiResearch(AiMageSpell3()) end,
	function() return AiSet(AiWorker(), 10) end,
	function() return AiWait(AiWorker()) end,
	
	function() return AiForce(1, {AiDestroyer(), 2, AiBattleship(), 1}) end,
	function() return AiWaitForce(1) end,
	function() return AiSleep(2000) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiSet(AiWorker(), 12) end,
	function() return AiForce(0, {AiSoldier(), 3, AiShooter(), 4, AiCavalry(), 3, AiMage(), 2, AiCatapult(), 2}) end,
	function() return AiWaitForce(0) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 2, AiSubmarine(), 2}) end,
	function() return AiSleep(2000) end,
	
	function() return AiForce(2, {AiFlyer(), 3}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	
	function() return AiLoop(hum_exp_08c_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

function AiHumanExp08a() return AiLoop(hum_exp_08a_funcs, stratagus.gameData.AIState.index) end
function AiHumanExp08b() return AiLoop(hum_exp_08b_funcs, stratagus.gameData.AIState.index) end
function AiHumanExp08c() return AiLoop(hum_exp_08c_funcs, stratagus.gameData.AIState.index) end
DefineAi("hum-exp-8a", "*", "hum-exp-8a", AiHumanExp08a)
DefineAi("hum-exp-8b", "*", "hum-exp-8b", AiHumanExp08b)
DefineAi("hum-exp-8c", "*", "hum-exp-8c", AiHumanExp08c)

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

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