--	Stratagus Map - Single player campaign

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

Briefing(
  title,
  objectives,
  "../campaigns/human/interface/introscreen5.png",
  "campaigns/human/level13h.txt",
  {"campaigns/human/level13h-intro1.wav",
   "campaigns/human/level13h-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

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

local hum_13_loop_funcs = {
	function() DebugPrint("Looping !\n") return false end,
	function() return AiForce(1, {AiTransporter(), 1, AiCavalryMage(), 4, AiMage(), 2}) end,
	function() return AiForce(2, {AiTransporter(), 1, AiShooter(), 3, AiCavalryMage(), 1, AiCatapult(), 2}) end,
	function() return AiWaitForce(1) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() return AiSleep(14000) end,
	function() return AiForce(1, {AiFlyer(), 4}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1)  end,
	function() return AiSleep(14000) end,
	function() stratagus.gameData.AIState.loop_index[1 + AiPlayer()] = 0; return false end,
}

local hum_13_funcs = {
	function() return AiSet(AiTanker(), 2) end,
	function() return AiSet(AiWorker(), 5) end,
	function() return AiSetCollect({0, 50, 50, 100, 0, 0, 0}) end,
	function() return AiWait(AiWorker()) end,
	function() return AiNeed(AiPlatform()) end,
	--function() return AiSet(AiTransporter(), 2) end,
	function() return AiForce(1, {AiTransporter(), 1, AiCavalry(), 3, AiMage(), 2}) 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 AiSleep(4000) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,

	--function() return AiSleep(12000) end,
	function() return AiForce(1, {AiTransporter(), 1, AiCavalryMage(), 4, AiMage(), 2}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	--function() return AiSleep(15000) end,
	function() return AiForce(1, {AiTransporter(), 1, AiCavalryMage(), 4, AiMage(), 2}) end,
	function() return AiForce(2, {AiTransporter(), 1, AiShooter(), 3, AiCavalryMage(), 1, AiMage(), 2}) end,
	function() return AiWaitForce(1) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() return AiResearch(AiMageSpell5()) end,
	function() return AiResearch(AiUpgradeShipCannon1()) end,
	function() return AiResearch(AiUpgradeShipArmor1()) end,
	function() return AiResearch(AiUpgradeShipCannon2()) end,
	function() return AiResearch(AiUpgradeShipArmor2()) end,
	--function() return AiSleep(15000) end,
	function() return AiForce(1, {AiTransporter(), 1, AiCavalryMage(), 4, AiMage(), 2}) end,
	function() return AiForce(2, {AiTransporter(), 1, AiShooter(), 3, AiCavalryMage(), 1, AiCatapult(), 2}) end,
	function() return AiWaitForce(1) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) end,
	function() return AiUpgradeTo(AiBetterCityCenter()) end,
	function() return AiUpgradeTo(AiBestCityCenter()) end,
	function() return AiSet(AiAirport(), 1) end,
	--function() return AiSleep(20000) end,
	
	function() return AiForce(1, {AiFlyer(), 4}) end,
	function() return AiWaitForce(1) end,
	function() DebugMessage("Attacking..."); AiAttackWithForce(1); return false; end,
	--function() return AiSleep(14000) end,
	function() return AiForce(1, {AiTransporter(), 1, AiCavalryMage(), 4, AiMage(), 2}) end,
	function() return AiForce(2, {AiTransporter(), 1, AiShooter(), 3, AiCavalryMage(), 1, AiCatapult(), 2}) end,
	function() return AiWaitForce(1) end,
	function() return AiWaitForce(2) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(1) end,
	function() DebugMessage("Attacking..."); return AiAttackWithForce(2) 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 AiResearch(AiUpgradeMissile2()) end,
	function() return AiResearch(AiUpgradeEliteShooter()) end,
	--function() return AiSleep(18000) end,
	function() return AiLoop(hum_13_loop_funcs, stratagus.gameData.AIState.loop_index) end,
}

function AiHuman13() return AiLoop(hum_13_funcs, stratagus.gameData.AIState.index) end
DefineAi("hum-13", "*", "hum-13", AiHuman13)

-- Map

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

-- Make sure Lothar dies by reducing his hitpoints
for i,unit in ipairs(GetUnits(3)) do
   if GetUnitVariable(unit, "Ident") == "unit-wise-man" then
       SetUnitVariable(unit, "HitPoints", 25)
   else
       SetUnitVariable(unit, "HitPoints", 60)
   end
end
