--	Stratagus Map - Single player campaign

Load("campaigns/orc/level13o_c2.sms")

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

-- FIXME: Check if units are destroyed.

AddTrigger(
  function() return 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-submarine",
	"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",
	"upgrade-invisibility", "upgrade-polymorph", "upgrade-blizzard",
	"unit-gryphon-aviary", "unit-gryphon-rider"
}
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-submarine",
	"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",
	"upgrade-whirlwind", "upgrade-unholy-armor", "upgrade-death-and-decay",
	"unit-dragon-roost", "unit-dragon"
}
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")

-- Default Spells Researched
DefineAllowHumanAlways()
DefineAllowOrcAlways()

-- AI

local orc_13_loop_funcs = {
	function() DebugMessage("AI looping"); return false end,
	function() return AiSleep(10000) end,
	function() return AiForce(4, {AiFlyer(), 4}) end,
	function() return AiWaitForce(4) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(4) end,
	function() return AiSleep(6000) end,
	function() return AiForce(2, {AiShooter(), 2, AiMage(), 4}, true) end,
	function() return AiForce(3, {AiCavalry(), 5, AiMage(), 1}, true) 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(6000) end,
	
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false; end,
}

local orc_13_funcs = {
	function() return AiSet(AiWorker(), 7) end,
    function() return AiSet(AiTanker(), 4) end,
	function() return AiWait(AiWorker()) end,
	
	function() return AiForce(2, {AiSoldier(), 4, AiShooter(), 2}) end,
	function() return AiSleep(8000) end,
	function() return AiResearch(AiMageSpell1()) end,
	function() return AiResearch(AiUpgradeCavalryMage()) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	function() return AiResearch(AiMageSpell2()) end,
	function() return AiResearch(AiMageSpell3()) end,
	function() return AiResearch(AiMageSpell4()) end,
	function() return AiResearch(AiCavalryMageSpell2()) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiSleep(11000) end,
	function() return AiForce(2, {AiSoldier(), 4, AiShooter(), 2}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiResearch(AiMageSpell5()) end,
	function() return AiForce(2, {AiSoldier(), 4, AiShooter(), 2}) end,
	function() return AiForce(3, {AiCavalry(), 4, AiMage(), 1}) end,
	function() return AiSleep(7000) 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(2, {AiSoldier(), 2, AiShooter(), 2, AiMage(), 1}, true) end,
	function() return AiForce(3, {AiCavalry(), 5, AiMage(), 1}, true) end,
	function() return AiForce(4, {AiFlyer(), 1}) end,
	function() return AiSleep(17000) end,
	function() return AiWaitForce(4) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(4) 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 AiResearch(AiUpgradeCatapult1()) end,
	function() return AiResearch(AiUpgradeCatapult2()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiSleep(15000) end,
	
	function() return AiForce(4, {AiFlyer(), 2}) end,
	function() return AiWaitForce(4) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(4) end,
	
	function() return AiForce(4, {AiFlyer(), 4}) end,
	function() return AiForce(2, {AiShooter(), 2, AiMage(), 4}, true) end,
	function() return AiForce(3, {AiCavalry(), 5, AiMage(), 1}, true) 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(8000) end,
	function() return AiForce(2, {AiShooter(), 2, AiMage(), 4}, true) end,
	function() return AiForce(3, {AiCavalry(), 5, AiMage(), 1}, true) 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 AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiResearch(AiUpgradeMissile2()) end,
	function() return AiResearch(AiUpgradeEliteShooter()) end,
	function() return AiResearch(AiUpgradeEliteShooter1()) end,
	function() return AiResearch(AiUpgradeEliteShooter2()) end,
	function() return AiResearch(AiUpgradeEliteShooter3()) end,
	function() return AiResearch(AiUpgradeWeapon2()) end,
	function() return AiResearch(AiUpgradeArmor2()) end,
	function() return AiSleep(14000) end,
	function() return AiWaitForce(4) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(4) end,
	
	function() return AiForce(2, {AiShooter(), 2, AiMage(), 4}, true) end,
	function() return AiForce(3, {AiCavalry(), 5, AiMage(), 1}, true) 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(orc_13_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

function AiOrc13() return AiLoop(orc_13_funcs, stratagus.gameData.AIState.index) end
DefineAi("orc-13", "*", "orc-13", AiOrc13)

-- Map


Load("campaigns/orc/level13o.sms")
