--[[
A Classic Fairytale: Long live the Queen

= SUMMARY =
Deathmatch against a leader of a pack of cyborgs with 4 different storylines (but mostly identical gameplay).

= GOALS =
Defeat Biomechanic Team.

= FLOW CHART =
- Show one of 4 possible storylines which affect the choice of the enemy leader (only minor effect on gameplay):
    | 1) If offer accepted in ACF2 and traitor not executed in ACF5: Dense Cloud
    | 2) Otherwise: If offer accepted in ACF2: Nancy Screw (cyborg)
    | 3) Otherwise: If traitor was executed in ACF5: Fell from Heaven
    | 4) Otherwise: Fiery Water
- Cut scene: startAnim
- TBS
- Biomechanic Team defeated.
- Cut scene: finalAnim
> Victory

== Non-linear events ==
| Leader dead
    - Cut scene: leaderDeadAnim
| Played more than 6 rounds and leader is still in game
    - Cut scene: fleeAnim
    - Leader flees
    - Instructions: Kill remaining enemies

]]

HedgewarsScriptLoad("/Scripts/Locale.lua")
HedgewarsScriptLoad("/Scripts/Animate.lua")


-----------------------------Map--------------------------------------
local map =
{
	"\16\7\0\225\132\15\200\1\40\0\15\200\1\40\132\15\105\8\81\0\16\14\1\64\143\15\200\7\249\0\13\50\7\252\132\12\243\7\172\0",
	"\12\236\7\168\132\12\127\6\192\0\12\127\6\192\132\11\52\6\223\0\11\52\6\223\132\10\62\8\35\0\8\201\8\4\132\8\63\7\126\0",
	"\8\63\7\126\132\8\4\6\58\0\8\0\6\65\132\7\147\6\241\0\7\133\6\195\132\7\20\4\151\0\7\143\6\195\132\7\140\6\234\0",
	"\7\17\4\151\132\5\191\4\222\0\5\191\4\222\132\3\136\3\252\0\3\136\3\252\132\2\12\4\151\0\2\12\4\151\132\1\138\5\15\0",
	"\1\138\5\15\132\1\54\5\156\0\1\54\5\156\132\0\130\5\64\0\0\130\5\64\132\255\214\5\135\0\8\141\1\85\179\8\141\1\85\0",
	"\10\30\2\220\139\10\30\2\220\0\11\77\1\142\131\11\77\1\142\0\10\188\0\113\129\10\188\0\113\0\255\235\0\162\132\0\130\0\225\0",
	"\0\130\0\229\0\0\127\0\236\132\255\231\0\250\0\0\28\0\215\136\0\4\0\211\0\0\95\5\212\154\0\95\7\238\0\0\246\6\2\154",
	"\1\71\8\0\0\1\205\5\145\154\2\132\4\239\0\3\98\4\141\154\1\135\5\216\0\3\179\4\151\154\6\213\5\247\0\6\223\5\124\151",
	"\6\185\5\22\0\6\181\5\29\151\6\37\5\64\0\0\179\5\198\148\0\179\5\198\0\6\216\4\253\148\6\216\4\253\0\1\230\7\147\153",
	"\8\32\8\18\0\1\187\6\174\153\7\179\7\108\0\2\199\5\177\179\6\128\6\167\0\7\231\7\10\143\7\231\6\202\0\12\148\8\4\156",
	"\10\241\8\11\0\11\112\7\101\156\12\56\7\91\0\1\89\5\223\199\4\11\5\208\0\4\67\5\212\200\4\172\6\58\0\4\172\6\58\200",
	"\5\36\5\212\0\5\40\5\194\200\4\169\5\57\0\4\169\5\57\200\4\42\5\205\0\4\130\5\142\200\4\218\5\205\0\4\137\5\194\200",
	"\4\179\5\251\0\255\245\1\198\133\0\77\1\198\0\0\77\1\198\133\0\102\1\226\0\0\102\1\230\133\255\221\1\244\0\255\245\0\148\195",
	"\255\231\1\11\0\0\32\0\162\195\255\231\0\169\0\0\60\0\158\195\0\32\0\172\0\0\21\0\176\195\255\242\0\222\0\255\245\0\215\195",
	"\0\7\0\246\0\255\245\0\243\195\0\11\1\33\0\0\4\1\4\195\0\56\1\36\0\255\245\1\173\195\0\35\1\110\0\255\242\1\180\195",
	"\255\224\2\9\0\255\238\1\240\195\0\28\2\30\0\0\21\2\19\195\0\102\2\23\0\16\18\1\1\195\16\35\0\222\0\16\14\1\11\195",
	"\16\7\2\9\0\16\0\2\16\195\16\35\3\34\0\16\11\2\252\195\16\11\4\208\0\16\11\4\208\195\16\0\6\55\0\16\0\6\55\195",
	"\16\14\8\25\0",
}

--------------------------------------------Constants------------------------------------
choiceAccepted = 1
choiceRefused = 2
choiceAttacked = 3

choiceEliminate = 1
choiceSpare = 2

leaksNum = 1
denseNum = 2
waterNum = 3
buffaloNum = 4
chiefNum = 5
girlNum = 6
wiseNum = 7

denseScene = 1
princessScene = 2
waterScene = 3
cyborgScene = 4

nativeNames = {loc("Leaks A Lot"), loc("Dense Cloud"), loc("Fiery Water"), 
               loc("Raging Buffalo"), loc("Righteous Beard"), loc("Fell From Grace"),
               loc("Wise Oak"), loc("Ramon"), loc("Spiky Cheese")
              }
nativeSaveNames = {"M8DeployedDead", "M8RamonDead", "M8SpikyDead", "M8PrincessDead"}

nativeUnNames = {loc("Zork"), loc("Steve"), loc("Jack"),
                 loc("Lee"), loc("Elmo"), loc("Rachel"),
                 loc("Muriel")}

nativeHats = {"Rambo", "RobinHood", "pirate_jack", "zoo_Bunny", "IndianChief",
              "tiara", "AkuAku", "rasta", "hair_yellow"}

nativePos = {{1474, 1209}, {923, 990}, {564, 1120}, {128, 1315}}
nativesNum = 4
nativesLeft = 4

cyborgNames = {loc("Artur Detour"), loc("Led Heart"), loc("Orlando Boom!"), loc("Nilarian"), 
               loc("Steel Eye"), loc("Rusty Joe"), loc("Hatless Jerry"), loc("Gas Gargler")}

cyborgsDif = {2, 2, 2, 2, 2, 2, 2, 2}
cyborgsHealth = {100, 100, 100, 100, 100, 100, 100, 100}
cyborgHidePos = {1665, 1800}
cyborgsTeamNum = {4, 3}
cyborgsNum = 7
cyborgsPos = {{2893, 1723}, {2958, 1717}, {3027, 1710}, {3096, 1704},
              {2584, 665},  {2047, 1562}, {115, 179}, {2162, 1916}}
cyborgsDir = {"Left", "Left", "Left", "Left", "Left", "Left", "Right", "Left"}

crateConsts = {}
reactions = {}

enemyPos = {4078, 195}

-----------------------------Variables---------------------------------
natives = {}
origNatives = {}

cyborgs = {}
cyborg = nil

gearDead = {}
hedgeHidden = {}

scene = 0
enemyFled = "0"

deployedLeader = "0"
princessLeader = "0"

startAnim = {}
fleeAnim = {}
finalAnim = {}
leaderDeadAnim = {}

nativeAwaitingDeletion = nil
-----------------------------Animations--------------------------------
function EmitDenseClouds(dir)
  local dif
  if dir == "Left" then
    dif = 10
  else
    dif = -10
  end
  if dir == nil then
    dx, dy = GetGearVelocity(dense)
    if dx < 0 then 
      dif = 10
    else 
      dif = -10
    end
  end
  AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
  AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
  AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
  AnimInsertStepNext({func = AnimWait, args = {dense, 800}})
  AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
  AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
  AnimInsertStepNext({func = AnimWait, args = {dense, 800}})
  AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
end

function AnimationSetup()
  table.insert(startAnim, {func = AnimWait, args = {enemy, 3000}})
  table.insert(startAnim, {func = AnimCaption, swh = false, args = {natives[1], loc("The team continued their quest of finding the rest of the tribe."), 4000}})
  table.insert(startAnim, {func = AnimCaption, swh = false, args = {natives[1], loc("They stumbled upon a pile of weapons, they seemed to be getting closer."), 4500}})
  if scene == denseScene then
    if m5DeployedNum == denseNum then
      deployedLeader = "1"
      SetupDenseAnimDeployed()
    else
      SetupDenseAnim()
    end
  elseif scene == waterScene then
    if m5DeployedNum == waterNum then
      deployedLeader = "1"
      SetupWaterAnimDeployed()
    else
      SetupWaterAnim()
    end
  elseif scene == princessScene then
    princessLeader = "1"
    SetupPrincessAnim()
  else
    SetupCyborgAnim()
  end

  AddSkipFunction(startAnim, SkipAnim, {startAnim})
  AddSkipFunction(fleeAnim, SkipAnim, {fleeAnim})
  AddSkipFunction(leaderDeadAnim, SkipAnim, {leaderDeadAnim})
end

function SetupLeaderDeadAnim()
  local gear = nil
  if CheckCyborgsDead() then
    return
  end
  for i = nativesLeft, 1, -1 do
    if band(GetState(natives[i]), gstDrowning) == 0 then
      gear = natives[i]
    end
  end
  if gear == nil then
    return
  end
  table.insert(leaderDeadAnim, {func = AnimFollowGear, args = {gear}})
  table.insert(leaderDeadAnim, {func = AnimSay, args = {gear, loc("That traitor won't be killing us anymore!"), SAY_THINK, 6000}})
end

function SetupDenseAnim()
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yo, dude! Get away from our weapons!"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Dense Cloud?! What are you doing?!"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("What does it look like?"), SAY_SHOUT, 3500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Are you helping the aliens?"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Haha, I love the look on your face!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Did you really think that I've changed?"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("But why did you betray us?!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yo, the aliens gave me plants. Medicinal plants. Lots of it."), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You never give me plants!"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Besides, why would I choose certain death?"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Do you have any idea how bad an exploding arrow hurts?"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Dude, it's unbearable!"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're a coward!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You endangered your whole tribe, you bastard!"), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yeah, well, for some dude to be happy, some other dude has to suffer."), SAY_SHOUT, 11000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("That's just the way it works, you know."), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're some piece of hypocrite junkie!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why do you always have to call me names?"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, EmitDenseClouds, {}}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Make fun of me when I fart …"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("IT'S A SERIOUS MEDICAL CONDITION!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You don't deserve my sacrifice!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I won't let you kill the tribe!"), SAY_SHOUT, 5000}})

  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Dude, this is boring!"), SAY_SAY, 3000}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I ain't gonna sit around no more!"), SAY_SAY, 5000}})

  table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Yo, escort my buttocks!"), SAY_SHOUT, 3500}})
  table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}})
  table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}})
  table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}})
end

function SetupDenseAnimDeployed()
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, EmitDenseClouds, {}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm afraid I can't let you proceed!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Huh?"), SAY_THINK, 0}})
  table.insert(startAnim, {func = AnimSay, args = {natives[2], loc("What the?"), SAY_THINK, 0}})
  table.insert(startAnim, {func = AnimSay, args = {natives[3], loc("Why?"), SAY_SAY, 1000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Dude, wow, you're so cute!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Did you really think I've changed?"), SAY_SHOUT, 4500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm still with the aliens."), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimTeleportGear, args = {enemy, unpack(enemyPos)}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What?!"), SAY_THINK, 1000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[3], loc("But you saved me!"), SAY_SAY, 2500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Haha, that was just a coincidence!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I was heading home, you see!"), SAY_SHOUT, 3500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We were your home! Your family!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("How could you betray us?"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yo, the aliens gave me plants. Medicinal plants. Lots of it."), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You never give me plants!"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Besides, why would I choose certain death?"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Do you have any idea how bad an exploding arrow hurts?"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Dude, it's unbearable!"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're a coward!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You endangered your whole tribe, you bastard!"), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yeah, well, for some dude to be happy, some other dude has to suffer."), SAY_SHOUT, 11000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("That's just the way it works, you know."), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're some piece of hypocrite junkie!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why do you always have to call me names?"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, EmitDenseClouds, {}}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Make fun of me when I fart …"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("IT'S A SERIOUS MEDICAL CONDITION!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You don't deserve my sacrifice!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I won't let you kill the tribe!"), SAY_SHOUT, 5000}})

  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Dude, this is boring!"), SAY_SAY, 3000}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I ain't gonna sit around no more!"), SAY_SAY, 5000}})
  table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Yo, escort my buttocks!"), SAY_SHOUT, 3500}})
  table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}})
  table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}})
  table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}})
end

function SetupWaterAnim()
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stay there, comrades!"), SAY_SHOUT, 2500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Come closer and die! … burp …"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Fiery Water?! Are you drunk again?"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Drunk with power, perhaps!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The power of love! No, wait, the power of the aliens!"), SAY_SHOUT, 7500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We trusted you, you fool!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why do you keep betraying us?"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why, why, why, why!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I grew sick of the oppression! I broke free!"), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What oppression? You were the most unoppressed member of the tribe!"), SAY_SHOUT, 10000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The oppression of the elders, of course!"), SAY_SHOUT, 6500}})
  if m5DeployedNum == leaksNum then
    table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You should know this more than anyone, Leaks!"), SAY_SHOUT, 7000}})
  elseif m5LeaksDead == 1 then
    table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Just look at Leaks, may he rest in peace!"), SAY_SHOUT, 6500}})
  end
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We, the youth, have to constantly prove our value."), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We work and work until we sweat blood."), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We risk our lives going through challenges."), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All this to please our beloved “elders” … hick …"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("And what do they do in the meantime? Nothing!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All they do is sit around and judge us!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You have never worked a bit in your life!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("All you do is take long walks when everyone else works."), SAY_SHOUT, 9000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Anyway, the aliens accept me for who I am."), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We won't accept you destroying our village!"), SAY_SHOUT, 7000}})

  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Argh, the boredom!"), SAY_SAY, 3000}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I have more important things to do!"), SAY_SAY, 5000}})
  table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Comrades! Sail me away!"), SAY_SHOUT, 3500}})
  table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}})
  table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}})
  table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}})
end

function SetupWaterAnimDeployed()
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stop, comrades!"), SAY_SHOUT, 2500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I cannot let you go any further! … burp …"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Fiery Water?! Are you drunk again?"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Drunk with power, perhaps!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The power of love! No, wait, the power of the aliens!"), SAY_SHOUT, 7500}})
  table.insert(startAnim, {func = AnimTeleportGear, args = {enemy, unpack(enemyPos)}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We trusted you, you fool!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why do you keep betraying us?"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why, why, why, why!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I grew sick of the oppression! I broke free!"), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What oppression? You were the most unoppressed member of the tribe!"), SAY_SHOUT, 10000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The oppression of the elders, of course!"), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Just look at Leaks, may he rest in peace!"), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We, the youth, have to constantly prove our value."), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We work and work until we sweat blood."), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We risk our lives going through challenges."), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All this to please our beloved “elders” … hick …"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("And what do they do in the meantime? Nothing!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All they do is sit around and judge us!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You have never worked a bit in your life!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("All you do is take long walks when everyone else works."), SAY_SHOUT, 9000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Anyway, the aliens accept me for who I am."), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We won't accept you destroying our village!"), SAY_SHOUT, 7000}})

  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Argh, the boredom!"), SAY_SAY, 3000}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I have more important things to do!"), SAY_SAY, 5000}})
  table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Comrades! Sail me away!"), SAY_SHOUT, 3500}})
  table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}})
  table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}})
  table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}})
end

function SetupPrincessAnim()
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Oh, my! I forgot something!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We need to go back!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What could you possibly forget in that cage?"), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I don't like your tone! You're hurting me!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I'm terribly sorry!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What is it that you forgot?"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Uhmm, it's … uhm … my ring!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It's precious to me!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We don't have time for that now!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We have to find our folk!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("But I want my sandals!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Sandals?! I thought you left your ring!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All right, you got me!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Got you? You're acting weird."), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You just can't let it go, can you!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All right, I'll admit it!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Admit what?"), SAY_SHOUT, 2000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You give me no choice!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I can't let you go further because …"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm the spy! I've been giving you out!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimTeleportGear, args = {enemy, unpack(enemyPos)}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}})
  table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("But … they kidnapped you!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Oh, that. We were just having fun!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It's an ancient ritual of theirs."), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why did you do this?"), SAY_SHOUT, 4000}})
  if m5ChiefDead == 1 then
    table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why did you kill your father?"), SAY_SHOUT, 5000}})
  end
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Do you have any idea what it's like in the village for a woman?"), SAY_SHOUT, 10000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("How would you like being discriminated against?"), SAY_SHOUT, 7000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Not being able to fight or hunt."), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Gathering fruits all day long."), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Doing stuff a monkey could do."), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Always being considered weak and fragile."), SAY_SHOUT, 6000}})
  if m5DeployedNum == girlNum then
    table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("In case you haven't noticed, I'm a woman, too!"), SAY_SHOUT, 8000}})
    table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yes, but you're … different!"), SAY_SHOUT, 6000}})
    table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Of course I am!"), SAY_SHOUT, 3000}})
  end
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The aliens respect me, even worship me!"), SAY_SHOUT, 6000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm living a dream!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Well, you're about to wake up!"), SAY_SHOUT, 5000}})

  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Hmm … it's going slower than expected."), SAY_SAY, 5000}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I am going to leave the kids play by themselves."), SAY_SAY, 6000}})
  table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Alien! I wish to be moved!"), SAY_SHOUT, 4000}})
  table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}})
  table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}})
  table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}})
end

function SetupCyborgAnim()
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stop right there, puny worms!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stay away from our weapons!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We come in peace! Just let our friends go!"), SAY_SHOUT, 5500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm afraid we cannot afford that."), SAY_SHOUT, 4500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You see, hedgehog spikes are very, very valuable."), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Very valuable, haha!"), SAY_SHOUT, 3500}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Don't you dare harming our tribe!"), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It's a shame, really!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I regret to end your little odyssey."), SAY_SHOUT, 5000}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It was fun to watch."), SAY_SHOUT, 3500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The way you handled your little internal conflicts …"), SAY_SHOUT, 6500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Did you really think that we needed the help of one of you?"), SAY_SHOUT, 7500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You should have known that we don't rely on meatbags!"), SAY_SHOUT, 7500}})
  table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It was fun to watch, though."), SAY_SHOUT, 3500}})
  if m5Choice == choiceEliminate then
    table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Heck, you even executed one of your own!"), SAY_SHOUT, 6000}})
  end
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("It was all a trick?!"), SAY_SHOUT, 3000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Some sick game of yours?!"), SAY_SHOUT, 4000}})
  table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We won't let you hurt any more of us!"), SAY_SHOUT, 6000}})

  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Entered boredom phase! Discrepancies detected …"), SAY_SAY, 5000}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Initiate escape wish!"), SAY_SAY, 6000}})
  table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}})
  table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Running displacement algorithm …"), SAY_SHOUT, 4000}})
  table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}})
  table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}})
  table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}})
end

function SetupFinalAnim()
  local found = 0
  local gears = {}
  for i = nativesLeft, 1, -1 do
    if band(GetState(natives[i]), gstDrowning) == 0 then
      found = found + 1
      gears[found] = natives[i]
    end
  end
  if found == 0 then
    return
  else
    for i = 1, found do
      table.insert(finalAnim, {func = AnimCustomFunction, args = {gears[1], CondNeedToTurn, {cyborg, gears[i]}}})
    end
    table.insert(finalAnim, {func = AnimSay, args = {cyborg, loc("Nice work, meatbags!"), SAY_SAY, 3000}})
    table.insert(finalAnim, {func = AnimSay, args = {cyborg, loc("You're on your way to freeing your tribe!"), SAY_SAY, 5500}})
    table.insert(finalAnim, {func = AnimSay, args = {gears[1], loc("Do you know where they are?"), SAY_SAY, 4000}})
    table.insert(finalAnim, {func = AnimSay, args = {gears[found], loc("We need to hurry!"), SAY_SAY, 3000}})
    table.insert(finalAnim, {func = AnimSay, args = {cyborg, loc("Haha! Come!"), SAY_SAY, 2000}})
    table.insert(finalAnim, {func = AnimJump, args = {cyborg, "high"}})
    table.insert(finalAnim, {func = AnimDisappear, args = {cyborg, GetGearPosition(cyborg)}})
    for i = 1, found do
      table.insert(finalAnim, {func = HideHedge, swh = false, args = {gears[i]}})
    end
    table.insert(finalAnim, {func = SetState, swh = false, args = {cyborg, gstInvisible}})
  end
end


--------------------------Anim skip functions--------------------------
function AfterStartAnim()
  SetGearMessage(natives[1], 0)
  ShowMission(loc("Long Live The Queen"), loc("Closing in"), loc("Defeat the enemy!").."|"..loc("The leader seems scared, he will probably flee."), 1, 0)
  SetHealth(SpawnHealthCrate(2207, 44), 25)
  SetHealth(SpawnHealthCrate(519, 1519), 25)
  SetHealth(SpawnHealthCrate(826, 895), 25)
  SpawnSupplyCrate(701, 1046, amGirder, 3)
  SetTurnTimeLeft(TurnTime)
end

function SkipAnim(anim)
  if anim == startAnim then
    SetGearPosition(enemy, unpack(enemyPos))
    HogTurnLeft(enemy, true)
  end
  if GetHogTeamName(CurrentHedgehog) ~= nativesTeamName then
    EndTurn(true)
  end
  AnimWait(enemy, 1)
end

function AfterFleeAnim()
  SetHealth(SpawnHealthCrate(130, 455), 25)
  SetHealth(SpawnHealthCrate(2087, 50), 25)
  SetHealth(SpawnHealthCrate(2143, 54), 25)
  SetHealth(SpawnHealthCrate(70, 1308), 25)
  SetGearMessage(CurrentHedgehog, 0)
  HideHedge(enemy)
  ShowMission(loc("Long Live The Queen"), loc("Coward"), loc("The leader escaped. Defeat the rest of the aliens!"), 1, 0)
  SetTurnTimeLeft(TurnTime)
end

function AfterLeaderDeadAnim()
  SetHealth(SpawnHealthCrate(130, 455), 25)
  SetHealth(SpawnHealthCrate(2087, 50), 25)
  SetHealth(SpawnHealthCrate(2143, 54), 25)
  SetHealth(SpawnHealthCrate(70, 1308), 25)
  ShowMission(loc("Long Live The Queen"), loc("Bullseye"), loc("Good job! Defeat the rest of the aliens!"), 1, 0)
  EndTurn(true)
end
-----------------------------Events------------------------------------
function CheckTurnsOver()
  return TotalRounds > 6
end

function DoTurnsOver()
  SetGearMessage(CurrentHedgehog, 0)
  enemyFled = "1"
  AddAnim(fleeAnim)
  AddFunction({func = AfterFleeAnim, args = {}})
  RemoveEventFunc(CheckGearDead, {enemy})
end

function CheckNativesDead()
  return nativesLeft == 0
end

function DoNativesDead()
  RemoveEventFunc(CheckTurnsOver)
  RemoveEventFunc(CheckGearDead)
  RemoveEventFunc(CheckCyborgsDead)
  AddCaption(loc("And so the cyborgs took over the island."))
  EndTurn(true)
end

function CheckCyborgsDead()
  return (cyborgsLeft == 0 and (gearDead[enemy] == true or enemyFled == "1"))
end

function KillEnemy()
  if enemyFled == "1" then
    DismissTeam(leaderbotTeamName)
  end
  DismissTeam(cyborgTeamName)
  EndTurn(true)
end

function DoCyborgsDead()
  SaveCampaignVariables()
  RestoreHedge(cyborg)
  PlaceGirder(3292, 922, 4)
  SetGearPosition(cyborg, 3290, 902)
  SetupFinalAnim()
  AddAnim(finalAnim)
  AddFunction({func = KillEnemy, args = {}})
end

function DoLeaderDead()
  if enemyFled ~= "1" then
    leaderDead = true
    SetGearMessage(CurrentHedgehog, 0)
    SetupLeaderDeadAnim()
    AddAnim(leaderDeadAnim)
    AddFunction({func = AfterLeaderDeadAnim, args = {}})
    RemoveEventFunc(CheckTurnsOver)
  end
end

function CheckGearsDead(gearList)
  for i = 1, # gearList do
    if gearDead[gearList[i]] ~= true then
      return false
    end
  end
  return true
end

function CheckGearDead(gear)
  return gearDead[gear]
end

-----------------------------Misc--------------------------------------
function HideHedge(hedge)
  if hedgeHidden[hedge] ~= true then
    HideHog(hedge)
    hedgeHidden[hedge] = true
  end
end

function RestoreHedge(hedge)
  if hedgeHidden[hedge] == true then
    RestoreHog(hedge)
    hedgeHidden[hedge] = false
  end
end

function GetVariables()
  progress = tonumber(GetCampaignVar("Progress"))
  m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum")) or leaksNum
  m2Choice = tonumber(GetCampaignVar("M2Choice")) or choiceRefused
  m5Choice = tonumber(GetCampaignVar("M5Choice")) or choiceEliminate
  m5LeaksDead = tonumber(GetCampaignVar("M5LeaksDead")) or 0
  m5ChiefDead = tonumber(GetCampaignVar("M5ChiefDead")) or 0
end

function SaveCampaignVariables()
  SaveCampaignVar("M8DeployedLeader", deployedLeader)
  SaveCampaignVar("M8PrincessLeader", princessLeader)
  SaveCampaignVar("M8EnemyFled", enemyFled)
  SaveCampaignVar("M8Scene", "" .. scene)
  if progress and progress<8 then
    SaveCampaignVar("Progress", "8")
  end
end

function SetupPlace()
  HideHedge(cyborg)
  SetHogHat(natives[1], nativeHats[m5DeployedNum])
  SetHogName(natives[1], nativeNames[m5DeployedNum])

  if m5DeployedNum == denseNum then
    dense = natives[1]
  else
    dense = enemy
  end

  if m2Choice == choiceAccepted and m5Choice ~= choiceEliminate then
    scene = denseScene
    SetHogHat(enemy, nativeHats[denseNum])
    SetHogName(enemy, nativeNames[denseNum])
    dense = enemy
  elseif m2Choice == choiceAccepted then
    scene = cyborgScene
    SetHogHat(enemy, "cyborg2")
    SetHogName(enemy, loc("Nancy Screw"))
  elseif m5Choice == choiceEliminate then
    scene = princessScene
    SetHogHat(enemy, "tiara")
    SetHogName(enemy, loc("Fell From Heaven"))
  else
    scene = waterScene
    SetHogHat(enemy, nativeHats[waterNum])
    SetHogName(enemy, nativeNames[waterNum])
  end
  for i = 1, 4 do 
    if GetHogName(natives[i]) == GetHogName(enemy) then
      AnimSetGearPosition(enemy, GetGearPosition(natives[i]))
      DeleteGear(natives[i])
      -- triggers AfterSetupPlace when the gear is *actually* deleted
      nativeAwaitingDeletion = natives[i]
      DeleteGear(cyborgs[cyborgsLeft])
      break
    end
  end

  SpawnSupplyCrate(34, 410, amBee, 2)
  SpawnSupplyCrate(33, 374, amRCPlane, 1)
  SpawnSupplyCrate(74, 410, amAirAttack, 3)
  SpawnSupplyCrate(1313, 1481, amBazooka, 8)
  SpawnSupplyCrate(80, 360, amSniperRifle, 4)
  SpawnSupplyCrate(1037, 1508, amShotgun, 7)
  SpawnSupplyCrate(1037, 1472, amMolotov, 3)
  SpawnSupplyCrate(1146, 1576, amMortar, 8)

  SpawnSupplyCrate(1147, 1431, amPortalGun, 2)
  SpawnSupplyCrate(1219, 1542, amRope, 5)
  SpawnSupplyCrate(1259, 1501, amJetpack, 2)

  if not nativeAwaitingDeletion then
    AfterSetupPlace()
  end
end

function SetupEvents()
  AddNewEvent(CheckNativesDead, {}, DoNativesDead, {}, 0)
  AddNewEvent(CheckGearDead, {enemy}, DoLeaderDead, {}, 0)
  AddNewEvent(CheckTurnsOver, {}, DoTurnsOver, {}, 0)
  AddNewEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0)
end

function SetupAmmo()
  AddAmmo(natives[1], amPickHammer, 2)
  AddAmmo(natives[1], amBazooka, 0)
  AddAmmo(natives[1], amGrenade, 0)
  AddAmmo(natives[1], amShotgun, 0)
  AddAmmo(natives[1], amAirAttack, 0)
  AddAmmo(natives[1], amMolotov, 0)
end

nativesTeamName = nil
beepTeamName = nil
corpTeamName = nil
leaderbotTeamName = nil
cyborgTeamName = nil

function AddHogs()
  nativesTeamName = AddMissionTeam(-2)
  for i = 7, 9 do
    natives[i-6] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
    origNatives[i-6] = natives[i-6]
  end
  natives[4] = AddHog(loc("Fell From Heaven"), 0, 133, "tiara")
  origNatives[4] = natives[4]
  nativesLeft = nativesNum

  beepTeamName = AddTeam(loc("Beep Loopers"), -1, "ring", "UFO", "Robot_qau", "cm_cyborg")
  for i = 1, cyborgsTeamNum[1] do
    cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2")
  end

  corpTeamName = AddTeam(loc("Corporationals"), -1, "ring", "UFO", "Robot_qau", "cm_cyborg")
  for i = cyborgsTeamNum[1] + 1, cyborgsNum do
    cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2")
  end
  cyborgsLeft = cyborgsTeamNum[1] + cyborgsTeamNum[2]

  leaderbotTeamName = AddTeam(loc("Leaderbot"), -1, "ring", "UFO", "Robot_qau", "cm_cyborg")
  enemy = AddHog(loc("Name"), 2, 200, "cyborg1")

  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
  cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
  SetGearPosition(cyborg, unpack(cyborgHidePos))

  for i = 1, nativesNum do
    AnimSetGearPosition(natives[i], unpack(nativePos[i]))
  end

  AnimSetGearPosition(enemy, unpack(enemyPos))
  AnimTurn(enemy, "Left")

  for i = 1, cyborgsNum do
    AnimSetGearPosition(cyborgs[i], unpack(cyborgsPos[i]))
    AnimTurn(cyborgs[i], cyborgsDir[i])
  end
end

function CondNeedToTurn(hog1, hog2)
  xl, xd = GetX(hog1), GetX(hog2)
  if xl > xd then
    AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
    AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
  elseif xl < xd then
    AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}})
    AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}})
  end
end

-----------------------------Main Functions----------------------------

function onGameInit()
	Seed = 0
	GameFlags = gfDisableGirders + gfDisableLandObjects
	TurnTime = 60000 
	CaseFreq = 0
	MinesNum = 0
	MinesTime = 3000
	Explosives = 0
  MapGen = mgDrawn
	Theme = "Hell"
  HealthDecrease = 0
  WaterRise = 0

	for i = 1, #map do
		ParseCommand('draw ' .. map[i])
	end

  GetVariables()
  AnimInit()
  AddHogs()
end

function onGameStart()
  SetupAmmo()
  SetupPlace()
  -- Animation is setup in AfterSetupPlace
end

function AfterSetupPlace()
  AnimationSetup()
  SetupEvents()
  AddAnim(startAnim)
  AddFunction({func = AfterStartAnim, args = {}})
end

function onGameTick()
  AnimUnWait()
  if ShowAnimation() == false then
    return
  end
  ExecuteAfterAnimations()
  CheckEvents()
end

function onGearDelete(gear)
  local toRemove = nil
  gearDead[gear] = true
  if GetGearType(gear) == gtHedgehog then
    if GetHogTeamName(gear) == beepTeamName or GetHogTeamName(gear) == corpTeamName then
      cyborgsLeft = cyborgsLeft - 1
    elseif GetHogTeamName(gear) == nativesTeamName then
      for i = 1, nativesLeft do
        if natives[i] == gear then
          toRemove = i
        end
      end
      table.remove(natives, toRemove)
      nativesLeft = nativesLeft - 1
      if nativeAwaitingDeletion and gear == nativeAwaitingDeletion then
        AfterSetupPlace()
        nativeAwaitingDeletion = nil
      end
    end
  end
end

function onAmmoStoreInit()
  SetAmmo(amBaseballBat, 9, 0, 0, 0)
  SetAmmo(amFirePunch, 9, 0, 0, 0)
  SetAmmo(amDEagle, 9, 0, 0, 0)
  SetAmmo(amSkip, 9, 0, 0, 0)
  SetAmmo(amSwitch, 9, 0, 0, 0)
  SetAmmo(amBazooka, 9, 0, 0, 0)
  SetAmmo(amGrenade, 9, 0, 0, 0)
  SetAmmo(amAirAttack, 1, 0, 0, 0)
  SetAmmo(amMolotov, 5, 0, 0, 0)
  SetAmmo(amShotgun, 9, 0, 0, 0)
end

function onNewTurn()
  if AnimInProgress() then
    SetTurnTimeLeft(MAX_TURN_TIME)
    return
  end
  if GetHogTeamName(CurrentHedgehog) == cyborgTeamName then
    EndTurn(true)
  end
end

function onPrecise()
  if GameTime > 2500 and AnimInProgress() then
    SetAnimSkip(true)
  end
end

function onGameResult(winner)
  if winner == GetTeamClan(nativesTeamName) then
    SendStat(siGameResult, loc("Mission succeeded!"))
  else
    SendStat(siGameResult, loc("Mission failed!"))
  end
end
