share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/enemy.lua
changeset 7460 d32d573aeb64
child 7512 cc3f036121fe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/enemy.lua	Sat Aug 18 11:34:49 2012 +0300
@@ -0,0 +1,669 @@
+loadfile(GetDataPath() .. "Scripts/Locale.lua")()
+loadfile(GetDataPath() .. "Scripts/Animate.lua")()
+
+
+--------------------------------------------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
+ramonNum = 8
+spikyNum = 9
+
+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")
+              }
+
+nativeHats = {"Rambo", "RobinHood", "pirate_jack", "zoo_Bunny", "IndianChief",
+              "tiara", "AkuAku", "rasta", "hair_yellow"}
+
+nativePos = {{1259, 120}, {2378, 796}, {424, 1299}, {3322, 260}, {1022, 1550}}
+nativeDir = {"Right", "Left", "Right", "Left", "Right"}
+
+cannibalNames = {loc("Honest Lee"), loc("Vegan Jack"), loc("Sirius Lee"),
+                 loc("Brutal Lily")}
+cannibalPos = {{162, 266}, {2159, 1517}, {3311, 1621}, {1180, 1560}}
+cannibalDir = {"Right", "Left", "Left", "Right"}
+cannibalsNum = 4
+
+playersDir = {"Right", "Left", "Right", "Left", "Right", "Right", "Left", "Left", "Right"}
+playersAntiDir = {"Left", "Right", "Left", "Right", "Left", "Left", "Right", "Right", "Left"}
+
+cyborgNames = {loc("Smith 0.97"), loc("Smith 0.98"), loc("Smith 0.99a"),
+               loc("Smith 0.99b"), loc("Smith 0.99f"), loc("Smith 1.0")}
+cyborgPos = {{2162, 20}, {2458, 564}, {542, 1133}, {3334, 1427}}
+cyborgDir = "Right"
+cyborgsNum = 6
+cyborgsPos = {{1490, 330}, {1737, 1005}, {2972, 922}, {1341, 1571},
+              {751, 543}, {3889, 907}}
+cyborgsDir = {"Right", "Right", "Left", "Right", "Right", "Left"}
+
+leaderPos = {3474, 151}
+leaderDir = "Left"
+
+-----------------------------Variables---------------------------------
+natives = {}
+origNatives = {}
+
+cyborgs = {}
+cyborg = nil
+
+cannibals = {}
+players = {}
+leader = nil
+
+gearDead = {}
+hedgeHidden = {}
+
+startAnim = {}
+finalAnim = {}
+-----------------------------Animations--------------------------------
+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
+
+function CondNeedToTurn2(hog1, hog2)
+  xl, xd = GetX(hog1), GetX(hog2)
+  if xl > xd then
+    AnimTurn(hog1, "Left")
+    AnimTurn(hog2, "Right")
+  elseif xl < xd then
+    AnimTurn(hog2, "Left")
+    AnimTurn(hog1, "Right")
+  end
+end
+
+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 RestoreNatives(cgi)
+  for i = 1, playersNum do
+    RestoreHedge(players[i])
+    AnimOutOfNowhere(players[i], GetGearPosition(players[i]))
+  end
+end
+
+function AnimationSetup()
+  SetupCyborgStartAnim()
+  SetupPeopleStartAnim()
+  SetupEnemyStartAnim()
+  AddSkipFunction(startAnim, SkipStartAnim, {})
+end
+
+function SetupCyborgStartAnim()
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 3000}})
+  table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 800}})
+  table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Right"}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 800}})
+  table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 800}})
+  table.insert(startAnim, {func = AnimTeleportGear, args = {cyborg, unpack(cyborgPos[2])}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 800}})
+  table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Right"}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 800}})
+  table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 800}})
+  table.insert(startAnim, {func = AnimTeleportGear, args = {cyborg, unpack(cyborgPos[3])}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 1800}})
+  table.insert(startAnim, {func = AnimTeleportGear, args = {cyborg, unpack(cyborgPos[4])}})
+  table.insert(startAnim, {func = AnimWait, args = {cyborg, 800}})
+  table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Everything looks OK..."), SAY_THINK, 2500}})
+  table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("This will be fun!"), SAY_THINK, 2500}})
+  table.insert(startAnim, {func = AnimJump, args = {cyborg, "high"}})
+  table.insert(startAnim, {func = AnimCustomFunction, args = {cyborg, RestoreNatives, {true}}})
+  table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("HAHA!"), SAY_SHOUT, 2000}})
+  table.insert(startAnim, {func = AnimSwitchHog, args = {players[1]}})
+  table.insert(startAnim, {func = AnimDisappear, swh = false, args = {cyborg, unpack(cyborgPos[4])}})
+  table.insert(startAnim, {func = HideHedge, swh = false, args = {cyborg}})
+end
+
+function SetupPeopleStartAnim()
+  for i = 1, playersNum do
+    table.insert(startAnim, {func = AnimTurn, swh = false, args = {players[i], playersAntiDir[i]}})
+  end
+  table.insert(startAnim, {func = AnimWait, args = {players[1], 800}})
+  for i = 1, playersNum do
+    table.insert(startAnim, {func = AnimTurn, swh = false, args = {players[i], playersDir[i]}})
+  end
+  table.insert(startAnim, {func = AnimWait, args = {players[1], 800}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("What is this place?"), SAY_SHOUT, 2500}})
+  if m5LeaksDead == 1 then
+    table.insert(startAnim, {func = AnimSay, args = {players[1], loc("And how am I alive?!"), SAY_SAY, 3000}})
+  end
+  table.insert(startAnim, {func = AnimCustomFunction, args = {players[1], CondNeedToTurn, {players[1], players[2]}}})
+  table.insert(startAnim, {func = AnimSay, args = {players[2], loc("It must be the cyborgs again!"), SAY_SAY, 4000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[3], loc("Looks like the whole world is falling apart!"), SAY_SAY, 6000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("Look out! We're surrounded by cannibals!"), SAY_SHOUT, 6000}})
+  table.insert(startAnim, {func = AnimCustomFunction, args = {players[4], CondNeedToTurn, {players[4], cannibals[1]}}})
+  table.insert(startAnim, {func = AnimCustomFunction, args = {players[4], CondNeedToTurn, {players[1], cannibals[1]}}})
+  table.insert(startAnim, {func = AnimSay, args = {players[4], loc("Cannibals?! You're the cannibals!"), SAY_SHOUT, 4000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("WHAT?! You're the ones attacking us!"), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[4], loc("You have kidnapped our whole tribe!"), SAY_SHOUT, 4000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("You've been assaulting us, we have been just defending ourselves!"), SAY_SHOUT, 8000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("I can't believe this!"), SAY_SHOUT, 3000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("Have we ever attacked you first?"), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[4], loc("Yes!"), SAY_SHOUT, 2000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("When?"), SAY_SHOUT, 2000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[4], loc("Uhmm...ok no."), SAY_SHOUT, 2000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("But you're cannibals. It's what you do."), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("Again with the 'cannibals' thing!"), SAY_SHOUT, 4000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("Where do you get that?!"), SAY_SHOUT, 3000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[4], loc("Everyone knows this."), SAY_SHOUT, 2500}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("I didn't until about a month ago."), SAY_SHOUT, 4000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[4], loc("Hmmm...actually...I didn't either."), SAY_SHOUT, 4000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("About a month ago, a cyborg came and told us that you're the cannibals!"), SAY_SHOUT, 8000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("A cy-what?"), SAY_SHOUT, 2000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("Cyborg. It's what the aliens call themselves."), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("They told us to wear these clothes. They said that this is the newest trend."), SAY_SHOUT, 8000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("They've been manipulating us all this time!"), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("They must be trying to weaken us!"), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("We have to unite and defeat those cylergs!"), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSay, args = {cannibals[1], loc("We can't let them take over our little island!"), SAY_SHOUT, 5000}})
+end
+
+function RestoreCyborgs(cgi)
+  if cyborgsRestored == true then
+    return
+  end
+  for i = 1, cyborgsNum do
+    RestoreHedge(cyborgs[i])
+    if cgi == true then
+      AnimOutOfNowhere(cyborgs[i], unpack(cyborgsPos[i]))
+    end
+  end
+  RestoreHedge(leader)
+  AnimOutOfNowhere(leader, unpack(leaderPos))
+  cyborgsRestored = true
+end
+
+function SetupEnemyStartAnim()
+  local gear
+  table.insert(startAnim, {func = AnimCustomFunction, args = {cannibals[1], RestoreCyborgs, {true}}})
+  if m8EnemyFled == 1 then
+    gear = leader
+  else
+    gear = cyborgs[2]
+  end
+  table.insert(startAnim, {func = AnimCustomFunction, args = {players[1], CondNeedToTurn, {players[4], gear}}})
+  table.insert(startAnim, {func = AnimCustomFunction, args = {players[1], CondNeedToTurn, {players[1], gear}}})
+  table.insert(startAnim, {func = AnimSay, args = {gear, loc("You have finally figured it out!"), SAY_SHOUT, 4500}})
+  table.insert(startAnim, {func = AnimSay, args = {gear, loc("You blood needers are pretty slow, you know!"), SAY_SHOUT, 5500}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("Why do you want to take over our island?"), SAY_SHOUT, 5500}})
+  table.insert(startAnim, {func = AnimSay, args = {gear, loc("Do you have any idea how valuable grass is?"), SAY_SHOUT, 5500}})
+  table.insert(startAnim, {func = AnimSay, args = {gear, loc("This island is the only place left on Earth with grass on it!"), SAY_SHOUT, 7000}})
+  table.insert(startAnim, {func = AnimSay, args = {gear, loc("It's worth more than wood!"), SAY_SHOUT, 4000}})
+  table.insert(startAnim, {func = AnimSay, args = {gear, loc("That makes it almost invaluable!"), SAY_SHOUT, 4500}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("We have nowhere else to live!"), SAY_SHOUT, 4500}})
+  table.insert(startAnim, {func = AnimSay, args = {gear, loc("That's not our problem!"), SAY_SHOUT, 4500}})
+  table.insert(startAnim, {func = AnimSay, args = {players[1], loc("We'll give you a problem then!"), SAY_SHOUT, 5000}})
+  table.insert(startAnim, {func = AnimSwitchHog, args = {gear}})
+end
+
+function SetupFinalAnim()
+  finalAnim = {
+    {func = AnimGearWait, args = {cyborg, 1000}},
+    {func = AnimSay, args = {cyborg, loc("Nicely done, blood needer!"), SAY_SAY, 3000}},
+    {func = AnimSay, args = {cyborg, loc("You have won the game by proving true cooperative skills!"), SAY_SAY, 7000}},
+    {func = AnimSay, args = {cyborg, loc("You have proven yourselves worthy!"), SAY_SAY, 4000}},
+    {func = AnimSay, args = {players[1], loc("Game? Was this a game to you?!"), SAY_SAY, 4000}},
+    {func = AnimSay, args = {cyborg, loc("Well, yes. This was a cyborg television show."), SAY_SAY, 5500}},
+    {func = AnimSay, args = {cyborg, loc("It is called 'Hogs of Steel'."), SAY_SAY, 4000}},
+    {func = AnimSay, args = {players[1], loc("Are you saying that many of us have died for your entertainment?"), SAY_SAY, 8000}},
+    {func = AnimSay, args = {players[1], loc("Our tribe, our beautiful island!"), SAY_SAY, 4000}},
+    {func = AnimSay, args = {players[1], loc("All gone...everything!"), SAY_SAY, 3000}},
+    {func = AnimSay, args = {cyborg, loc("But the ones alive are stronger in their heart!"), SAY_SAY, 6000}},
+    {func = AnimSay, args = {cyborg, loc("Just kidding, none of you have died!"), SAY_SAY, 5000}},
+    {func = AnimSay, args = {cyborg, loc("I mean, none of you ceased to live."), SAY_SAY, 5000}},
+    {func = AnimSay, args = {cyborg, loc("You'll see what I mean!"), SAY_SAY, 4000}},
+    {func = AnimSay, args = {cyborg, loc("They are all waiting back in the village, haha."), SAY_SAY, 7000}},
+    {func = AnimSay, args = {players[1], loc("You are playing with our lives here!"), SAY_SAY, 6000}},
+    {func = AnimSay, args = {players[1], loc("Do you think you're some kind of god?"), SAY_SAY, 6000}},
+    {func = AnimSay, args = {cyborg, loc("Interesting idea, haha!"), SAY_SAY, 2000}},
+    {func = AnimSwitchHog, args = {players[1]}},
+    {func = AnimWait, args = {players[1], 1}},
+    {func = AnimDisappear, swh = false, args = {cyborg, unpack(cyborgPos[4])}},
+    {func = HideHedge, swh = false, args = {cyborg}},
+    {func = AnimSay, args = {players[1], loc("What a douche!"), SAY_SAY, 2000}},
+  }
+end
+--------------------------Anim skip functions--------------------------
+function SkipStartAnim()
+  RestoreNatives()
+  RestoreCyborgs()
+  SetGearMessage(CurrentHedgehog, 0)
+  AnimSwitchHog(cyborgs[1])
+  AnimWait(cyborg, 1)
+  AddFunction({func = HideHedge, args = {cyborg}})
+end
+
+function AfterStartAnim()
+  ShowMission(loc("The Enemy Of My Enemy"), loc("The Union"), loc("Defeat the cyborgs!"), 1, 0)
+  PutWeaponCrates()
+  PutHealthCrates()
+  TurnTimeLeft = 0
+end
+
+function PutHealthCrates()
+  for i = 1, 10 do
+    SpawnHealthCrate(0, 0)
+  end
+end
+
+function PutWeaponCrates()
+  SpawnAmmoCrate(2399, 622, amNapalm, 2)
+  SpawnAmmoCrate(2199, -18, amBee, 2)
+  SpawnAmmoCrate(2088, 430, amBee, 2)
+  SpawnAmmoCrate(237, 20, amMortar, 4)
+  SpawnAmmoCrate(312, 1107, amMolotov, 3)
+  SpawnAmmoCrate(531, 1123, amWatermelon, 2)
+  SpawnAmmoCrate(1253, 1444, amFlamethrower, 5)
+  SpawnAmmoCrate(994, 1364, amBaseballBat, 3)
+  SpawnAmmoCrate(1104, 1553, amMine, 6)
+  SpawnAmmoCrate(2277, 803, amDynamite, 2)
+  SpawnAmmoCrate(1106, 184, amRCPlane, 3)
+  SpawnAmmoCrate(1333, 28, amSMine, 4)
+  SpawnAmmoCrate(90, 279, amAirAttack, 2)
+  SpawnAmmoCrate(288, 269, amBee, 2)
+  SpawnAmmoCrate(818, 1633, amBaseballBat, 2)
+end
+-----------------------------Events------------------------------------
+function CheckNativesDead()
+  return nativesLeft == 0
+end
+
+function CheckCannibalsDead()
+  return cannibalsLeft == 0
+end
+
+function CheckPlayersDead()
+  return playersLeft == 0
+end
+
+function CheckCyborgsDead()
+  return (cyborgsLeft == 0 and (leader == nil or gearDead[leader] == true))
+end
+
+function DoNativesDead()
+  nativesDeadFresh = true
+  TurnTimeLeft = 0
+end
+
+function DoCannibalsDead()
+  cannibalsDeadFresh = true
+  TurnTimeLeft = 0
+end
+
+function DoPlayersDead()
+  RemoveEventFunc(CheckNativesDead)
+  RemoveEventFunc(CheckCannibalsDead)
+  RemoveEventFunc(CheckCyborgsDead)
+  playersDeadFresh = true
+  TurnTimeLeft = 0
+end
+
+function DoCyborgsDead()
+--  RemoveEventFunc(CheckNativesDead)
+--  RemoveEventFunc(CheckCannibalsDead)
+  cyborgsDeadFresh= true
+  TurnTimeLeft = 0
+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
+
+function FailedMission()
+  RestoreHedge(cyborg)
+  AnimOutOfNowhere(cyborg, unpack(cyborgPos[1]))
+  if CheckCyborgsDead() then
+    AnimSay(cyborg, loc("Hmmm...it's a draw. How unfortunate!"), SAY_THINK, 6000)
+  elseif leader ~= nil then
+    CondNeedToTurn2(cyborg, leader)
+    AddAnim({{func = AnimSay, args = {leader, loc("Yay, we won!"), SAY_SAY, 2000}},
+             {func = AnimSay, args = {cyborg, loc("Nice work!"), SAY_SAY, 2000}}})
+  else
+    CondNeedToTurn2(cyborg, cyborgs[1])
+    AddAnim({{func = AnimSay, args = {cyborgs[1], loc("Yay, we won!"), SAY_SAY, 2000}},
+             {func = AnimSay, args = {cyborg, loc("Nice work!"), SAY_SAY, 2000}}})
+  end
+  AddFunction({func = LoseMission, args = {}})
+end
+
+function LoseMission()
+  ParseCommand("teamgone " .. loc("Natives"))
+  ParseCommand("teamgone " .. loc("Cannibals"))
+  ParseCommand("teamgone " .. loc("011101001"))
+  TurnTimeLeft = 0
+end
+
+function WonMission()
+  RestoreHedge(cyborg)
+  CondNeedToTurn2(cyborg, players[1])
+  SetupFinalAnim()
+  AddAnim(finalAnim)
+  AddFunction({func = WinMission, args = {}})
+end
+
+function WinMission()
+  SaveCampaignVar("Progress", "9")
+  ParseCommand("teamgone " .. loc("011101001"))
+  TurnTimeLeft = 0
+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()
+  m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum"))
+  m2Choice = tonumber(GetCampaignVar("M2Choice"))
+  m5Choice = tonumber(GetCampaignVar("M5Choice"))
+  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
+  m4DenseDead = tonumber(GetCampaignVar("M4DenseDead"))
+  m5DenseDead = tonumber(GetCampaignVar("M5DenseDead"))
+  m4LeaksDead = tonumber(GetCampaignVar("M4LeaksDead"))
+  m5LeaksDead = tonumber(GetCampaignVar("M5LeaksDead"))
+  m4ChiefDead = tonumber(GetCampaignVar("M4ChiefDead"))
+  m5ChiefDead = tonumber(GetCampaignVar("M5ChiefDead"))
+  m4WaterDead = tonumber(GetCampaignVar("M4WaterDead"))
+  m5WaterDead = tonumber(GetCampaignVar("M5WaterDead"))
+  m4BuffaloDead = tonumber(GetCampaignVar("M4BuffaloDead"))
+  m5BuffaloDead = tonumber(GetCampaignVar("M5BuffaloDead"))
+  m5WiseDead = tonumber(GetCampaignVar("M5WiseDead"))
+  m5GirlDead = tonumber(GetCampaignVar("M5GirlDead"))
+  m8DeployedDead = tonumber(GetCampaignVar("M8DeployedDead"))
+  m8PrincessDead = tonumber(GetCampaignVar("M8PrincessDead"))
+  m8RamonDead = tonumber(GetCampaignVar("M8RamonDead"))
+  m8SpikyDead = tonumber(GetCampaignVar("M8SpikyDead"))
+  m8DeployedLeader = tonumber(GetCampaignVar("M8DeployedLeader"))
+  m8PrincessLeader = tonumber(GetCampaignVar("M8PrincessLeader"))
+  m8EnemyFled = tonumber(GetCampaignVar("M8EnemyFled"))
+  m8Scene = tonumber(GetCampaignVar("M8Scene"))
+end
+
+function SetupPlace()
+  for i = 1, playersNum do
+    HideHedge(players[i])
+  end
+  for i = 1, cyborgsNum do
+    HideHedge(cyborgs[i])
+  end
+  if leader ~= nil then
+    HideHedge(leader)
+  end
+end
+
+function SetupEvents()
+  AddNewEvent(CheckPlayersDead, {}, DoPlayersDead, {}, 0)
+  AddNewEvent(CheckNativesDead, {}, DoNativesDead, {}, 0)
+  AddNewEvent(CheckCannibalsDead, {}, DoCannibalsDead, {}, 0)
+  AddNewEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0)
+end
+
+function SetupAmmo()
+  AddAmmo(cyborgs[1], amClusterBomb, 100)
+  AddAmmo(cyborgs[1], amMortar, 100)
+  AddAmmo(cyborgs[1], amDynamite, 2)
+  AddAmmo(cyborgs[1], amAirAttack, 2)
+  AddAmmo(cyborgs[1], amTeleport, 100)
+
+  if leader ~= nil then
+    AddAmmo(leader, amClusterBomb, 100)
+    AddAmmo(leader, amMortar, 100)
+    AddAmmo(leader, amDynamite, 100)
+    AddAmmo(leader, amAirAttack, 3)
+    AddAmmo(leader, amTeleport, 100)
+  end
+end
+
+function AddHogs()
+  AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star")
+  cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
+
+	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
+  natives[1] = AddHog(nativeNames[leaksNum], 0, 100, nativeHats[leaksNum])
+  if m5DeployedNum ~= leaksNum and m8DeployedLeader == 0 then
+    natives[2] = AddHog(nativeNames[m5DeployedNum], 0, 100, nativeHats[m5DeployedNum])
+  end
+  table.insert(natives, AddHog(nativeNames[ramonNum], 0, 100, nativeHats[ramonNum]))
+  table.insert(natives, AddHog(nativeNames[spikyNum], 0, 100, nativeHats[spikyNum]))
+  if m8PrincessLeader == 0 then
+    table.insert(natives, AddHog(loc("Fell From Heaven"), 0, 100, "tiara"))
+  end
+  nativesNum = #natives
+  nativesLeft = nativesNum
+  cannibalsLeft = cannibalsNum
+  for i = 1, nativesNum do
+    table.insert(players, natives[i])
+  end
+
+	AddTeam(loc("Cannibals"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
+  for i = 1, cannibalsNum do
+    cannibals[i] = AddHog(cannibalNames[i], 0, 100, "Zombi")
+    table.insert(players, cannibals[i])
+  end
+  playersNum = #players
+  playersLeft = playersNum
+
+  AddTeam(loc("Hedge-cogs"), 14483455, "ring", "UFO", "Robot", "cm_star")
+  for i = 1, cyborgsNum do
+    cyborgs[i] = AddHog(cyborgNames[i], 2, 80, "cyborg2")
+  end
+
+  if m8EnemyFled == 1 then
+    AddTeam(loc("Leader"), 14483455, "ring", "UFO", "Robot", "cm_star")
+    if m8Scene == denseScene then
+      leader = AddHog(loc("Dense Cloud"), 2, 200, nativeHats[denseNum])
+    elseif m8Scene == waterScene then
+      leader = AddHog(loc("Fiery Water"), 2, 200, nativeHats[waterNum])
+    elseif m8Scene == princessScene then
+      leader = AddHog(loc("Fell From Heaven"), 2, 200, "tiara")
+    else
+      leader = AddHog(loc("Nancy Screw"), 2, 200, "cyborg2")
+    end
+  end
+
+  cyborgsLeft = cyborgsNum
+
+  for i = 1, nativesNum do
+    AnimSetGearPosition(natives[i], unpack(nativePos[i]))
+    AnimTurn(natives[i], nativeDir[i])
+  end
+  for i = 1, cannibalsNum do
+    AnimSetGearPosition(cannibals[i], unpack(cannibalPos[i]))
+    AnimTurn(cannibals[i], cannibalDir[i])
+  end
+  for i = 1, cyborgsNum do
+    AnimSetGearPosition(cyborgs[i], unpack(cyborgsPos[i]))
+    AnimTurn(cyborgs[i], cyborgsDir[i])
+  end
+  AnimSetGearPosition(cyborg, unpack(cyborgPos[1]))
+  AnimTurn(cyborg, cyborgDir)
+  if leader ~= nil then
+    AnimSetGearPosition(leader, unpack(leaderPos))
+    AnimTurn(leader, leaderDir[i])
+  end
+end
+
+-----------------------------Main Functions----------------------------
+
+function onGameInit()
+	Seed = 0
+	GameFlags = gfSolidLand
+	TurnTime = 60000 
+	CaseFreq = 0
+	MinesNum = 0
+	MinesTime = 3000
+	Explosives = 0
+	Delay = 10 
+  Map = "Islands"
+	Theme = "EarthRise"
+  SuddenDeathTurns = 20
+
+  GetVariables()
+  AnimInit()
+  AddHogs()
+end
+
+function onGameStart()
+  SetupAmmo()
+  SetupPlace()
+  AnimationSetup()
+  SetupEvents()
+  AddAnim(startAnim)
+  AddFunction({func = AfterStartAnim, args = {}})
+end
+
+function onGameTick()
+  AnimUnWait()
+  if ShowAnimation() == false then
+    return
+  end
+  ExecuteAfterAnimations()
+  CheckEvents()
+end
+
+function onGearDelete(gear)
+  gearDead[gear] = true
+  if GetGearType(gear) == gtHedgehog then
+    if GetHogTeamName(gear) == loc("Natives") then
+      for i = 1, nativesLeft do
+        if natives[i] == gear then
+          table.remove(natives, i)
+          table.remove(players, i)
+          nativesLeft = nativesLeft - 1
+          playersLeft = playersLeft - 1
+        end
+      end
+    elseif GetHogTeamName(gear) == loc("Cannibals") then
+      for i = 1, cannibalsLeft do
+        if cannibals[i] == gear then
+          table.remove(cannibals, i)
+          table.remove(players, nativesLeft + i)
+          cannibalsLeft = cannibalsLeft - 1
+          playersLeft = playersLeft - 1
+        end
+      end
+    elseif GetHogTeamName(gear) == loc("Hedge-cogs") then
+      for i = 1, cyborgsLeft do
+        if cyborgs[i] == gear then
+          table.remove(cyborgs, i)
+        end
+      end
+      cyborgsLeft = cyborgsLeft - 1
+    end
+  end
+end
+
+function onGearAdd(gear)
+end
+
+function onAmmoStoreInit()
+  SetAmmo(amSkip, 9, 0, 0, 0)
+  SetAmmo(amSwitch, 9, 0, 0, 0)
+  SetAmmo(amDEagle, 9, 0, 0, 0)
+  SetAmmo(amSniperRifle, 9, 0, 0, 0)
+  SetAmmo(amBazooka, 8, 0, 0, 0)
+  SetAmmo(amGrenade, 7, 0, 0, 0)
+  SetAmmo(amFirePunch, 9, 0, 0, 0)
+  SetAmmo(amShotgun, 9, 0, 0, 0)
+
+  SetAmmo(amParachute, 9, 0, 0, 0)
+  SetAmmo(amRope, 9, 0, 0, 0)
+  SetAmmo(amPickHammer, 9, 0, 0, 0)
+  SetAmmo(amBlowTorch, 9, 0, 0, 0)
+end
+
+function onNewTurn()
+  if AnimInProgress() then
+    TurnTimeLeft = -1
+    return
+  end
+  if playersDeadFresh then
+    playersDeadFresh = false
+    FailedMission()
+  elseif cyborgsDeadFresh then
+    cyborgsDeadFresh = false
+    WonMission()
+  elseif nativesDeadFresh and GetHogTeamName(CurrentHedgehog) == loc("Cannibals") then
+    AnimSay(CurrentHedgehog, loc("Your deaths will be avenged, cannibals!"), SAY_SHOUT, 0)
+    nativesDeadFresh = false
+  elseif cannibalsDeadFresh and GetHogTeamName(CurrentHedgehog) == loc("Natives") then
+    AnimSay(CurrentHedgehog, loc("Your deaths will be avenged, cannibals!"), SAY_SHOUT, 0)
+    cannibalsDeadFresh = false
+  end
+end
+
+function onGearDamage(gear, damage)
+end
+
+function onPrecise()
+  if GameTime > 3000 and AnimInProgress() then
+    SetAnimSkip(true)
+  end
+end