--	Stratagus Map - Single player campaign

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

Briefing(
  title,
  objectives,
  "../campaigns/orc/interface/introscreen5.png",
  "campaigns/orc/level14o.txt",
  {"campaigns/orc/level14o-intro1.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")
DefineAllowHumanAlways()
DefineAllowOrcAlways()
DefineAllowTable(allowedHumanUnits, "AAAAAAAAAAAAAAAA")
DefineAllowTable(allowedOrcUnits, "AAAAAAAAAAAAAAAA")

local orc_14_blue_loop_funcs = {
	function() DebugMessage("AI looping"); return false end,
	function() return AiSleep(10000) end,
	
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false; end,
}

local orc_14_green_loop_funcs = {
	function() DebugMessage("AI looping"); return false end,
	function() return AiSleep(5000) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 3}) 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_14_white_loop_funcs = {
	function() DebugMessage("AI looping"); return false end,
	function() return AiSleep(4000) end,
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 4,  AiCatapult(), 2}) end,
	function() return AiForce(3, {AiTransporter(), 1,  AiMage(), 3, AiShooter(), 3}) 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() return AiForce(4, {AiFlyer(), 7}) end,
	function() return AiWaitForce(4) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(4) end,
	function() return AiSleep(6000) end,
	function() return AiForce(1, {AiSubmarine(), 4}) 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_14_blue_funcs = {
	function() return AiLoop(orc_14_blue_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

local orc_14_green_funcs = {
	function() return AiSet(AiWorker(), 5) end,
    function() return AiSet(AiTanker(), 3) end,
	function() return AiNeed(AiPlatform()) end,
	
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 1}) end,
	function() return AiSleep(3000) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(7000) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 1}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiSleep(4000) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 1}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() return AiResearch(AiUpgradeShipArmor1()) end,
	function() return AiResearch(AiUpgradeShipCannon1()) end,
	function() return AiResearch(AiUpgradeShipArmor2()) end,
	function() return AiResearch(AiUpgradeShipCannon2()) end,
	function() return AiForce(1, {AiDestroyer(), 3, AiBattleship(), 3}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,

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

local orc_14_white_funcs = {
	function() return AiSet(AiWorker(), 6) end,
    function() return AiSet(AiTanker(), 2) end,
	function() return AiWait(AiWorker()) end,
	
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 2}) end,
	function() return AiSleep(3000) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 4}) end,
	function() return AiSleep(3000) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 4}) end,
	function() return AiSleep(3000) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiResearch(AiMageSpell1()) end,
	function() return AiResearch(AiUpgradeCavalryMage()) end,
	function() return AiResearch(AiCavalryMageSpell1()) end,
	
	function() return AiSleep(4000) end,
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 4}) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiResearch(AiMageSpell2()) end,
	function() return AiResearch(AiMageSpell3()) end,
	
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 4,  AiCatapult(), 2}) end,
	function() return AiForce(4, {AiFlyer(), 7}) end,
	function() return AiSleep(3000) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	
	function() return AiResearch(AiMageSpell4()) end,
	function() return AiResearch(AiCavalryMageSpell2()) end,
	function() return AiResearch(AiMageSpell5()) end,
	function() return AiSleep(4000) end,
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 4,  AiCatapult(), 2}) end,
	function() return AiForce(3, {AiTransporter(), 1,  AiMage(), 3}) 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, {AiSubmarine(), 4}) end,
	function() return AiResearch(AiUpgradeCatapult1()) end,
	function() return AiResearch(AiUpgradeCatapult2()) end,
	function() return AiResearch(AiUpgradeMissile1()) end,
	function() return AiResearch(AiUpgradeWeapon1()) end,
	function() return AiResearch(AiUpgradeArmor1()) end,
	function() return AiSleep(5000) end,
	function() return AiForce(2, {AiTransporter(), 1,  AiCavalry(), 4,  AiCatapult(), 2}) end,
	function() return AiForce(3, {AiTransporter(), 1,  AiMage(), 3, AiShooter(), 3}) 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(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 AiLoop(orc_14_white_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

function AiOrc14Blue() return AiLoop(orc_14_blue_funcs, stratagus.gameData.AIState.index) end
function AiOrc14Green() return AiLoop(orc_14_green_funcs, stratagus.gameData.AIState.index) end
function AiOrc14White() return AiLoop(orc_14_white_funcs, stratagus.gameData.AIState.index) end
DefineAi("orc-14-blue", "*", "orc-14-blue", AiOrc14Blue)
DefineAi("orc-14-green", "*", "orc-14-green", AiOrc14Green)
DefineAi("orc-14-white", "*", "orc-14-white", AiOrc14White)
-- Map

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