--	Stratagus Map - Single player campaign

Load("campaigns/human/level11h_c2.sms")

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

-- FIXME: Check if units are freed.

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

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

--Units
local allowedHumanUnits = {"unit-farm",
	"unit-town-hall", "unit-keep", "unit-castle", "unit-peasant",
	"unit-human-barracks", "unit-footman", "unit-archer", "unit-ranger", "unit-ballista",
	"unit-elven-lumber-mill", "upgrade-arrow1", "upgrade-arrow2",
	"upgrade-ranger", "upgrade-longbow", "upgrade-ranger-scouting", "upgrade-ranger-marksmanship",
	"unit-human-blacksmith", "upgrade-sword1", "upgrade-human-shield1", "upgrade-ballista1",
	"upgrade-sword2", "upgrade-human-shield2", "upgrade-ballista2",
	"unit-human-watch-tower", "unit-human-guard-tower", "unit-human-cannon-tower",
	"unit-human-shipyard", "unit-human-oil-tanker", "unit-human-destroyer", "unit-human-transport",
	"unit-battleship",
	"unit-human-oil-platform", "unit-human-refinery",
	"unit-human-foundry", "upgrade-human-ship-cannon1", "upgrade-human-ship-armor1",
	"upgrade-human-ship-cannon2", "upgrade-human-ship-armor2",
	"unit-inventor", "unit-balloon", "unit-dwarves",
	"unit-stables", "unit-knight", "unit-paladin",
	"unit-church", "upgrade-paladin", "upgrade-holy-vision", "upgrade-healing", "upgrade-exorcism",
	"unit-mage-tower", "unit-mage",
	"upgrade-flame-shield", "upgrade-fireball", "upgrade-slow"
}
local allowedOrcUnits = {"unit-pig-farm",
	"unit-great-hall", "unit-stronghold", "unit-fortress", "unit-peon",
	"unit-orc-barracks", "unit-grunt", "unit-axethrower", "unit-berserker", "unit-catapult",
	"unit-troll-lumber-mill", "upgrade-throwing-axe1", "upgrade-throwing-axe2",
	"upgrade-berserker", "upgrade-light-axes", "upgrade-berserker-scouting", "upgrade-berserker-regeneration",
	"unit-orc-blacksmith", "upgrade-battle-axe1", "upgrade-orc-shield1", "upgrade-catapult1",
	"upgrade-battle-axe2", "upgrade-orc-shield2", "upgrade-catapult2",
	"unit-orc-watch-tower", "unit-orc-guard-tower", "unit-orc-cannon-tower",
	"unit-orc-shipyard", "unit-orc-oil-tanker", "unit-orc-destroyer", "unit-orc-transport",
	"unit-ogre-juggernaught",
	"unit-orc-oil-platform", "unit-orc-refinery",
	"unit-orc-foundry", "upgrade-orc-ship-cannon1", "upgrade-orc-ship-armor1",
	"upgrade-orc-ship-cannon2", "upgrade-orc-ship-armor2",
	"unit-alchemist", "unit-zeppelin", "unit-goblin-sappers",
	"unit-ogre-mound", "unit-ogre", "unit-ogre-mage",
	"unit-altar-of-storms", "upgrade-ogre-mage", "upgrade-eye-of-kilrogg", "upgrade-bloodlust", "upgrade-runes",
	"unit-temple-of-the-damned", "unit-death-knight",
	"upgrade-death-coil", "upgrade-haste", "upgrade-raise-dead"
}
local function DefineAllowTable(table, flags)
	for i, unitName in ipairs(table) do
		DefineAllow(unitName, flags)
	end
end

DefineAllowNormalHumanUnits("FFFFFFFFFFFFFFFF")
DefineAllowExtraHumanUnits("FFFFFFFFFFFFFFFF")
DefineAllowNormalOrcUnits("FFFFFFFFFFFFFFFF")
DefineAllowExtraOrcUnits("FFFFFFFFFFFFFFFF")
DefineAllowSpecialUnits("FFFFFFFFFFFFFFFF")
DefineAllowTable(allowedHumanUnits, "AAAAAAAAAAAAAAAA")
DefineAllowTable(allowedOrcUnits, "AAAAAAAAAAAAAAAA")
DefineAllowHumanAlways()
DefineAllowOrcAlways()

-- AI

--=============================================================================
--	This AI script builds only workers.
--		Upgrades very much.
--		Attacks with land units.

local hum_11_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiForce(1, {AiSoldier(), 3, AiEliteShooter(), 3,
		AiCavalryMage(), 3, AiCatapult(), 1, AiMage(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); AiAttackWithForce(1); return false; end,
	function() return AiSleep(12000) end,
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false end,
}

local hum_11_funcs = {
	function() AiForceRole(0, "defend"); AiForceRole(1, "attack"); return false; end,
	function() return AiSet(AiWorker(), 16) end,
	--function() return AiWait(AiWorker()) end,
	function() return AiSleep(6000) end,
	function() return AiForce(1, {AiSoldier(), 2, AiShooter(), 2, AiCavalry(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(6000) end,
	function() return AiForce(1, {AiSoldier(), 2, AiShooter(), 2, AiCavalry(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(7000) end,
	function() return AiForce(0, {AiSoldier(), 3, AiShooter(), 3, AiCavalry(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(5000) end,
	function() return AiForce(1, {AiSoldier(), 1, AiShooter(), 1, AiCavalry(), 2, AiCatapult(), 1, AiMage(), 3}) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,	
	function() return AiSleep(6000) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(9000) end,
	function() return AiForce(1, {AiSoldier(), 1, AiShooter(), 1, AiCavalry(), 2, AiCatapult(), 1, AiMage(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(7000) end,
	function() return AiResearch(AiUpgradeEliteShooter()) end,
	function() return AiResearch(AiUpgradeEliteShooter1()) end,
	function() return AiForce(1, {AiSoldier(), 1, AiEliteShooter(), 1, AiCavalry(), 2, AiCatapult(), 1, AiMage(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiResearch(AiUpgradeEliteShooter2()) end,
	function() return AiResearch(AiMageSpell1()) end,
	function() return AiResearch(AiUpgradeCavalryMage()) end,
	function() return AiSleep(13000) end,
	function() return AiForce(1, {AiSoldier(), 3, AiEliteShooter(), 3, AiCavalryMage(), 3, AiCatapult(), 1, AiMage(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	function() return AiResearch(AiMageSpell2()) end,
	function() return AiResearch(AiUpgradeWeapon2()) end,
	function() return AiSleep(7000) end,
	function() return AiForce(1, {AiSoldier(), 3, AiEliteShooter(), 2, AiCavalryMage(), 2, AiCatapult(), 1, AiMage(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiResearch(AiUpgradeArmor2()) end,
	function() return AiResearch(AiMageSpell3()) end,
	function() return AiResearch(AiMageSpell4()) end,
	function() return AiResearch(AiUpgradeCatapult1()) end,
	function() return AiSleep(12000) end,
	function() return AiForce(1, {AiSoldier(), 3, AiEliteShooter(), 2, AiCavalryMage(), 2, AiCatapult(), 1, AiMage(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	function() return AiResearch(AiMageSpell5()) end,
	function() return AiSleep(8000) end,
	function() return AiLoop(hum_11_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

function AiHumam11() return AiLoop(hum_11_funcs, stratagus.gameData.AIState.index) end
DefineAi("hum-11", "*", "hum-11", AiHumam11)

-- Map

Load("campaigns/human/level11h.sms")
