Added fifth mission and fixed minor control bug with mission 4
authorbelphegorr <szabibibi@gmail.com>
Mon, 16 Jul 2012 20:38:31 +0300
changeset 7253 86814ed9feab
parent 7251 cba4960b426f
child 7255 93cf6b3b89be
Added fifth mission and fixed minor control bug with mission 4
share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/backstab.lua
share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/campaign.ini
share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/united.lua
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/backstab.lua	Mon Jul 16 20:38:31 2012 +0300
@@ -0,0 +1,1051 @@
+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
+princessNum = 6
+wiseNum = 7
+
+spyKillStage = 1
+platformStage = 2
+wave3Stage = 3
+
+tmpVar = 0
+
+nativeNames = {loc("Leaks A Lot"), loc("Dense Cloud"), loc("Fiery Water"), 
+               loc("Raging Buffalo"), loc("Righteous Beard"), loc("Fell From Heaven"),
+               loc("Wise Oak"), loc("Eagle Eye"), loc("Flaming Worm")}
+
+nativeHats = {"Rambo", "RobinHood", "pirate_jack", "zoo_Bunny", "IndianChief",
+              "tiara", "AkuAku", "None", "None"}
+
+nativePos = {{887, 329}, {1050, 288}, {1731, 707},
+             {830, 342}, {1001, 290}, {773, 340},
+             {953, 305}, {347, 648}, {314, 647}}
+
+nativeDir = {"Right", "Left", "Left", 
+             "Right", "Left", "Right", 
+             "Left", "Right", "Right"}
+
+cannibalNames = {loc("Brain Teaser"), loc("Bone Jackson"), loc("Gimme Bones"), 
+                 loc("Hedgibal Letter"), loc("Bloodpie"), loc("Scalp Muncher"),
+                 loc("Back Breaker"), loc("Dahmer"), loc("Meiwes"),
+                 loc("Ear Sniffer"), loc("Regurgitator"), loc("Muriel")}
+
+cannibalPos = {{3607, 1472}, {3612, 1487}, {3646, 1502}, 
+               {3694, 1509}, {3746, 1525}, {3704, 1513},
+               {3607, 1472}, {3612, 1487}, {3646, 1502}, 
+               {3694, 1509}, {3746, 1525}, {3704, 1513}}
+
+cannibalDir = {"Left", "Left", "Left",
+               "Left", "Left", "Left",
+               "Left", "Left", "Left",
+               "Left", "Left", "Left"}
+
+cyborgPos = {1369, 574}
+cyborgPos2 = {1308, 148}
+
+deployedPos = {2522, 1365}
+-----------------------------Variables---------------------------------
+natives = {}
+nativeDead = {}
+nativeHidden = {}
+nativeRevived = {}
+nativesNum = 0
+
+cannibals = {}
+cannibalDead = {}
+cannibalHidden = {}
+
+speakerHog = nil
+spyHog = nil
+deployedHog = nil
+
+cyborgHidden = false
+
+m2Choice = 0
+m2DenseDead = 0
+m4DenseDead = 0
+m4BuffaloDead = 0
+m4WaterDead = 0
+m4ChiefDead = 0
+m4LeaksDead = 0
+
+needRevival = false
+gearr = nil
+startElimination = 0
+stage = 0
+choice = 0
+highJumped = false
+TurnsLeft = 0
+startNativesNum = 0
+
+startAnim = {}
+afterChoiceAnim = {}
+wave2Anim = {}
+wave2DeadAnim = {}
+wave3DeadAnim = {}
+
+-----------------------------Animations--------------------------------
+function Wave2Reaction()
+  local i = 1
+  local gearr = nil
+  while nativeDead[i] == true do
+    i = i + 1
+  end
+  gearr = natives[i]
+  if nativeDead[denseNum] ~= true and band(GetState(natives[denseNum]), gstDrowning) == 0 then
+    AnimInsertStepNext({func = AnimCustomFunction, args = {dense, EmitDenseClouds, {"Left"}}})
+    AnimInsertStepNext({func = AnimTurn, args = {dense, "Left"}})
+  end
+  if nativeDead[buffaloNum] ~= true and band(GetState(natives[buffaloNum]), gstDrowning) == 0 then
+    AnimInsertStepNext({func = AnimSay, args = {natives[buffaloNum], loc("Let them have a taste of my fury!"), SAY_SHOUT, 6000}}) 
+  end
+  AnimInsertStepNext({func = AnimSay, args = {gearr, loc("There's more of them? When did they become so hungry?"), SAY_SHOUT, 8000}}) 
+end
+
+function EmitDenseClouds(dir)
+  local dif
+  if dir == "Left" then
+    dif = 10
+  else
+    dif = -10
+  end
+  AnimInsertStepNext({func = AnimVisualGear, args = {natives[denseNum], GetX(natives[denseNum]) + dif, GetY(natives[denseNum]) + dif, vgtSteam, 0, true}, swh = false})
+  AnimInsertStepNext({func = AnimVisualGear, args = {natives[denseNum], GetX(natives[denseNum]) + dif, GetY(natives[denseNum]) + dif, vgtSteam, 0, true}, swh = false})
+  AnimInsertStepNext({func = AnimVisualGear, args = {natives[denseNum], GetX(natives[denseNum]) + dif, GetY(natives[denseNum]) + dif, vgtSteam, 0, true}, swh = false})
+  AnimInsertStepNext({func = AnimWait, args = {natives[denseNum], 800}})
+  AnimInsertStepNext({func = AnimVisualGear, args = {natives[denseNum], GetX(natives[denseNum]) + dif, GetY(natives[denseNum]) + dif, vgtSteam, 0, true}, swh = false})
+  AnimInsertStepNext({func = AnimVisualGear, args = {natives[denseNum], GetX(natives[denseNum]) + dif, GetY(natives[denseNum]) + dif, vgtSteam, 0, true}, swh = false})
+  AnimInsertStepNext({func = AnimWait, args = {natives[denseNum], 800}})
+  AnimInsertStepNext({func = AnimVisualGear, args = {natives[denseNum], GetX(natives[denseNum]) + dif, GetY(natives[denseNum]) + dif, vgtSteam, 0, true}, swh = false})
+end
+
+function SaySafe()
+  local i = 1
+  while gearr == nil do
+    if nativeDead[i] ~= true and nativeHidden[i] ~= true then
+      gearr = natives[i]
+    end
+    i = i + 1
+  end
+  AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "We are indeed.", SAY_SAY, 2500}})
+  AnimInsertStepNext({func = AnimSay, args = {gearr, "I think we are safe here.", SAY_SAY, 4000}})
+end
+
+function ReviveNatives()
+  for i = 1, 7 do
+    if nativeHidden[i] == true and nativeDead[i] ~= true then
+      RestoreHog(natives[i])
+      nativeHidden[i] = false
+      nativeRevived[i] = true
+      AnimInsertStepNext({func = AnimOutOfNowhere, args = {natives[i], unpack(nativePos[i])}})
+    end
+  end
+end
+
+function WonderAlive()
+  if nativeRevived[waterNum] == true then
+    AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], "I'm...alive? How? Why?", SAY_THINK, 3500}})
+    AnimInsertStepNext({func = AnimWait, args = {natives[waterNum], 800}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[waterNum], "Left"}})
+    AnimInsertStepNext({func = AnimWait, args = {natives[waterNum], 800}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[waterNum], "Right"}})
+  end
+  if nativeRevived[leaksNum] == true and nativeRevived[denseNum] == true then
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "But why would they help us?", SAY_SAY, 4000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "It must be the aliens!", SAY_SAY, 3500}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[princessNum], "You just appeared out of thin air!", SAY_SAY, 5000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "But...we died!", SAY_SAY, 2500}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "This must be the caves!", SAY_SAY, 3500}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], "Dude, where are we?", SAY_SAY, 3000}})
+    AnimInsertStepNext({func = AnimWait, args = {natives[leaksNum], 800}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[leaksNum], "Right"}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[denseNum], "Left"}})
+    AnimInsertStepNext({func = AnimWait, args = {natives[leaksNum], 800}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[leaksNum], "Left"}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[denseNum], "Right"}})
+    AnimInsertStepNext({func = AnimWait, args = {natives[leaksNum], 800}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[leaksNum], "Right"}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[denseNum], "Left"}})
+    AnimInsertStepNext({func = AnimWait, args = {natives[leaksNum], 800}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[leaksNum], "Left"}})
+    AnimInsertStepNext({func = AnimTurn, args = {natives[denseNum], "Right"}})
+    AnimInsertStepNext({func = AnimCustomFunction, swh = false, args = {natives[leaksNum], CondNeedToTurn, {natives[leaksNum], natives[princessNum]}}})
+    if nativeDead[chiefNum] ~= true then
+      AnimInsertStepNext({func = AnimTurn, args = {natives[chiefNum], "Right"}})
+    end
+  elseif nativeRevived[leaksNum] == true then
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Why would they do this?", SAY_SAY, 6000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "It must be the aliens' deed.", SAY_SAY, 5000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "Do not laugh, inexperienced one, for he speaks the truth!", SAY_SAY, 10000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Yeah, sure! I died. Hillarious!", SAY_SAY, 6000}})
+    AnimInsertStepNext({func = AnimSay, args = {gearr, "You're...alive!? But we saw you die!", SAY_SAY, 6000}})
+    AnimInsertStepNext({func = AnimSay, args = {gearr, "???", SAY_SAY, 2000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Wow, what a dream!", SAY_SAY, 3000}})
+    if nativeDead[chiefNum] ~= true then
+      AnimInsertStepNext({func = AnimTurn, args = {natives[chiefNum], "Right"}})
+    end
+    AnimInsertStepNext({func = AnimCustomFunction, swh = false, args = {natives[leaksNum], CondNeedToTurn, {natives[leaksNum], natives[wiseNum]}}})
+    AnimInsertStepNext({func = AnimCustomFunction, swh = false, args = {natives[leaksNum], CondNeedToTurn, {natives[leaksNum], gearr}}})
+  elseif nativeRevived[denseNum] == true then
+    AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], "Dude, that's so cool!", SAY_SAY, 3000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "It must be the aliens' deed.", SAY_SAY, 5000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], "But that's impossible!", SAY_SAY, 3000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "It was not a dream, unwise one!", SAY_SAY, 5000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], "Exactly, man! That was my dream.", SAY_SAY, 5000}})
+    AnimInsertStepNext({func = AnimSay, args = {gearr, "You're...alive!? But we saw you die!", SAY_SAY,  6000}})
+    AnimInsertStepNext({func = AnimSay, args = {gearr, "???", SAY_SAY, 2000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], "Dude, wow! I just had the weirdest high!", SAY_SAY, 6000}})
+    if nativeDead[chiefNum] ~= true then
+      AnimInsertStepNext({func = AnimTurn, args = {natives[chiefNum], "Right"}})
+    end
+    AnimInsertStepNext({func = AnimCustomFunction, swh = false, args = {natives[denseNum], CondNeedToTurn, {natives[denseNum], natives[wiseNum]}}})
+    AnimInsertStepNext({func = AnimCustomFunction, swh = false, args = {natives[denseNum], CondNeedToTurn, {natives[denseNum], gearr}}})
+  end
+end
+
+function ExplainAlive()
+  if needRevival == true and m4WaterDead == 1 then
+    RestoreCyborg()
+    SetGearPosition(cyborg, unpack(cyborgPos))
+    AnimInsertStepNext({func = AnimCustomFunction, args = {water, HideCyborg, {}}})
+    AnimInsertStepNext({func = AnimSwitchHog, args = {water}})
+    AnimInsertStepNext({func = AnimSay, args = {cyborg, "The answer is...entertaintment. You'll see what I mean.", SAY_SAY, 8000}})
+    AnimInsertStepNext({func = AnimSay, args = {cyborg, "You're probably wondering why I bought you back...", SAY_SAY, 8000}})
+  end
+end
+
+function SpyDebate()
+  if m2Choice == choiceAccepted then
+    spyHog = natives[denseNum]
+    AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "What shall we do with the traitor?", SAY_SAY, 6000}})
+    AnimInsertStepNext({func = SetHealth, swh = false, args = {natives[denseNum], 26}})
+    AnimInsertStepNext({func = AnimVisualGear, args = {GetGearPosition(natives[denseNum]), vgtExplosion, 0, true}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "Here, let me help you!", SAY_SAY, 3000}})
+    if nativeDead[chiefNum] == true then
+      AnimInsertStepNext({func = AnimSay, args = {natives[princessNum], "You killed my father, you monster!", SAY_SAY, 5000}})
+    end
+    AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], "Look, I had no choice!", SAY_SAY, 3000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "You have been giving us out to the enemy, haven't you!", SAY_SAY, 7000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "You're a pathetic liar!", SAY_SAY, 3000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Interesting! Last time you said you killed a cannibal!", SAY_SAY, 7000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], "I told you, I just found them.", SAY_SAY, 4500}})
+    AnimInsertStepNext({func = AnimCustomFunction, args = {natives[denseNum], EmitDenseClouds, {"Left"}}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Where did you get the weapons in the forest, Dense Cloud?", SAY_SAY, 8000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Not now, Fiery Water!", SAY_SAY, 3000}})
+  else
+    spyHog = natives[waterNum]
+    AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "What shall we do with the traitor?", SAY_SAY, 5000}})
+    AnimInsertStepNext({func = SetHealth, swh = false, args = {natives[waterNum], 26}})
+    AnimInsertStepNext({func = AnimVisualGear, args = {nativePos[denseNum][1] + 50, nativePos[denseNum][2], vgtExplosion, 0, true}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[princessNum], "I can't believe what I'm hearing!", SAY_SAY, 5500}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], "You know what? I don't even regret anything!", SAY_SAY, 7000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[princessNum], "In fact, you are the only one that's been acting strangely.", SAY_SAY, 8000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], "Are you accusing me of something?", SAY_SAY, 3500}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Seems like every time you take a \"walk\", the enemy find us!", SAY_SAY, 8000}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], "You know...taking a stroll.", SAY_SAY, 3500}})
+    AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "Where have you been?!", SAY_SAY, 3000}})
+  end
+  if nativeRevived[waterNum] == true then
+    AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], "You won't believe what happened to me!", SAY_SAY, 5500}})
+  end
+  AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], "Hey, guys!", SAY_SAY, 2000}})
+  AnimInsertStepNext({func = AnimMove, args = {natives[waterNum], "Left", nativePos[denseNum][1] + 50, nativePos[denseNum][2]}})
+  AnimInsertStepNext({func = AnimJump, args = {natives[waterNum], "back"}})
+  AnimInsertStepNext({func = AnimTurn, args = {natives[waterNum], "Right"}})
+  AnimInsertStepNext({func = AnimMove, args = {natives[waterNum], "Left", 1228, 412}})
+  AnimInsertStepNext({func = AnimJump, args = {natives[waterNum], "long"}})
+  AnimInsertStepNext({func = AnimJump, args = {natives[waterNum], "long"}})
+  AnimInsertStepNext({func = AnimJump, args = {natives[waterNum], "long"}})
+  AnimInsertStepNext({func = AnimTurn, args = {natives[waterNum], "Left"}})
+  AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], "There must be a spy among us!", SAY_SAY, 4000}})
+  AnimInsertStepNext({func = AnimSay, args = {natives[princessNum], "We made sure noone followed us!", SAY_SAY, 4000}})
+  AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], "What? Here? How did they find us?!", SAY_SAY, 5000}})
+end
+
+function AnimationSetup()
+  table.insert(startAnim, {func = AnimWait, args = {natives[leaksNum], 3000}})
+  table.insert(startAnim, {func = AnimCustomFunction, swh = false, args = {natives[leaksNum], SaySafe, {}}})
+  if needRevival == true then
+    table.insert(startAnim, {func = AnimCustomFunction, swh = false, args = {cyborg, ReviveNatives, {}}})
+    table.insert(startAnim, {func = AnimCustomFunction, swh = false, args = {natives[leaksNum], WonderAlive, {}}})
+    table.insert(startAnim, {func = AnimCustomFunction, swh = false, args = {cyborg, ExplainAlive, {}}})
+  end
+  table.insert(startAnim, {func = AnimCustomFunction, swh = false, args = {natives[leaksNum], RestoreWave, {1}}})
+  table.insert(startAnim, {func = AnimOutOfNowhere, args = {cannibals[1], unpack(cannibalPos[1])}})
+  table.insert(startAnim, {func = AnimOutOfNowhere, args = {cannibals[2], unpack(cannibalPos[2])}})
+  table.insert(startAnim, {func = AnimOutOfNowhere, args = {cannibals[3], unpack(cannibalPos[3])}})
+  table.insert(startAnim, {func = AnimWait, args = {natives[leaksNum], 1000}})
+  table.insert(startAnim, {func = AnimCustomFunction, swh = false, args = {natives[leaksNum], SpyDebate, {}}})
+  AddSkipFunction(startAnim, SkipStartAnim, {})
+end
+
+function SetupWave2Anim()
+  for i = 7, 1, -1 do
+    if nativeDead[i] ~= true then
+      speakerHog = natives[i]
+    end
+  end
+  table.insert(wave2Anim, {func = AnimOutOfNowhere, args = {cannibals[4], unpack(cannibalPos[4])}})
+  table.insert(wave2Anim, {func = AnimOutOfNowhere, args = {cannibals[5], unpack(cannibalPos[5])}})
+  table.insert(wave2Anim, {func = AnimOutOfNowhere, args = {cannibals[6], unpack(cannibalPos[6])}})
+  table.insert(wave2Anim, {func = AnimSay, args = {speakerHog, "Look out! There's more of them!", SAY_SHOUT, 5000}})
+  AddSkipFunction(wave2Anim, SkipWave2Anim, {})
+end
+
+function SetupWave2DeadAnim()
+  for i = 7, 1, -1 do
+    if nativeDead[i] ~= true then
+      deployedHog = natives[i]
+    end
+  end
+  if nativeDead[wiseNum] ~= true and band(GetState(natives[wiseNum]), gstDrowning) == 0 then
+    if nativesNum > 1 then
+      table.insert(wave2DeadAnim, {func = AnimWait, args = {natives[wiseNum], 1500}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "What a strange feeling!", SAY_THINK, 3000}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "I need to warn the others.", SAY_THINK, 3000}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "If only I had a way...", SAY_THINK, 3000}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "Oh, silly me! I forgot that I'm the shaman.", SAY_THINK, 6000}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {natives[wiseNum], TeleportNatives, {}}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {natives[wiseNum], TurnNatives, {natives[wiseNum]}}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {natives[wiseNum], CondNeedToTurn, {natives[wiseNum], deployedHog}}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "I sense another wave of cannibals heading our way!", SAY_SAY, 6500}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "We need to prevent their arrival!", SAY_SAY, 4500}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "Go, quick!", SAY_SAY, 2500}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {natives[wiseNum], DeployHog, {}}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {natives[wiseNum], RestoreCyborg, {}}})
+      table.insert(wave2DeadAnim, {func = AnimOutOfNowhere, swh = false, args = {cyborg, cyborgPos2[1], cyborgPos2[2]}})
+      table.insert(wave2DeadAnim, {func = AnimTurn, args = {cyborg, "Left"}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, IsolateNatives, {}}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, PutCGI, {}}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {cyborg, "I want to see how it handles this!", SAY_SAY, 6000}})
+      table.insert(wave2DeadAnim, {func = AnimSwitchHog, args = {deployedHog}})
+      table.insert(wave2DeadAnim, {func = AnimDisappear, args = {cyborg, 0, 0}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, DeployHog, {}}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborg, {}}})
+    else
+      table.insert(wave2DeadAnim, {func = AnimWait, args = {natives[wiseNum], 1500}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "What a strange feeling!", SAY_THINK, 3000}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "I sense another wave of cannibals heading my way!", SAY_THINK, 6500}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "I need to prevent their arrival!", SAY_THINK, 4500}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "If only I had a way...", SAY_THINK, 3000}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {natives[wiseNum], "Oh, silly me! I forgot that I'm the shaman.", SAY_THINK, 6000}})
+    end
+  else
+    table.insert(wave2DeadAnim, {func = AnimWait, args = {cyborg, 1500}})
+    table.insert(wave2DeadAnim, {func = AnimCustomFunction, swh = false, args = {cyborg, RestoreCyborg, {}}})
+    table.insert(wave2DeadAnim, {func = AnimOutOfNowhere, args = {cyborg, cyborgPos2[1], cyborgPos2[2]}})
+    table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, TeleportNatives, {}}})
+    table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, TurnNatives, {cyborg}}})
+    table.insert(wave2DeadAnim, {func = AnimSay, args = {cyborg, "Oh, my! This is even more entertaining than I've expected!", SAY_SAY, 7500}})
+    table.insert(wave2DeadAnim, {func = AnimSay, args = {cyborg, "You might want to find a way to instantly kill arriving cannibals!", SAY_SAY, 8000}})
+    table.insert(wave2DeadAnim, {func = AnimSay, args = {cyborg, "I believe there's more of them.", SAY_SAY, 4000}})
+    if nativesNum > 1 then
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {natives[wiseNum], RestoreCyborg, {}}})
+      table.insert(wave2DeadAnim, {func = AnimOutOfNowhere, swh = false, args = {cyborg, cyborgPos2[1], cyborgPos2[2]}})
+      table.insert(wave2DeadAnim, {func = AnimTurn, args = {cyborg, "Left"}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, IsolateNatives, {}}})
+      table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {cyborg, PutCGI, {}}})
+      table.insert(wave2DeadAnim, {func = AnimSay, args = {cyborg, "I want to see how it handles this!", SAY_SAY, 6000}})
+    end
+    table.insert(wave2DeadAnim, {func = AnimSwitchHog, args = {deployedHog}})
+    table.insert(wave2DeadAnim, {func = AnimDisappear, swh = false, args = {cyborg, 0, 0}})
+    table.insert(wave2DeadAnim, {func = AnimCustomFunction, args = {deployedHog, DeployHog, {}}})
+    table.insert(wave2DeadAnim, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborg, {}}})
+  end
+  AddSkipFunction(wave2DeadAnim, SkipWave2DeadAnim, {})
+end
+
+function IsolateNatives()
+  PlaceGirder(710, 299, 6)
+  PlaceGirder(690, 299, 6)
+  PlaceGirder(761, 209, 4)
+  PlaceGirder(921, 209, 4)
+  PlaceGirder(1081, 209, 4)
+  PlaceGirder(761, 189, 4)
+  PlaceGirder(921, 189, 4)
+  PlaceGirder(1081, 189, 4)
+  PlaceGirder(761, 169, 4)
+  PlaceGirder(921, 169, 4)
+  PlaceGirder(1081, 169, 4)
+  PlaceGirder(761, 149, 4)
+  PlaceGirder(921, 149, 4)
+  PlaceGirder(1081, 149, 4)
+  PlaceGirder(761, 129, 4)
+  PlaceGirder(921, 129, 4)
+  PlaceGirder(1081, 129, 4)
+  PlaceGirder(1120, 261, 2)
+  PlaceGirder(1140, 261, 2)
+  PlaceGirder(1160, 261, 2)
+  AddAmmo(deployedHog, amDEagle, 0)
+  AddAmmo(deployedHog, amFirePunch, 0)
+end
+
+function PutCGI()
+  AddVisualGear(710, 299, vgtExplosion, 0, true)
+  AddVisualGear(690, 299, vgtExplosion, 0, true)
+  AddVisualGear(761, 209, vgtExplosion, 0, true)
+  AddVisualGear(921, 209, vgtExplosion, 0, true)
+  AddVisualGear(1081, 209, vgtExplosion, 0, true)
+  AddVisualGear(761, 189, vgtExplosion, 0, true)
+  AddVisualGear(921, 189, vgtExplosion, 0, true)
+  AddVisualGear(1081, 189, vgtExplosion, 0, true)
+  AddVisualGear(761, 169, vgtExplosion, 0, true)
+  AddVisualGear(921, 169, vgtExplosion, 0, true)
+  AddVisualGear(1081, 169, vgtExplosion, 0, true)
+  AddVisualGear(761, 149, vgtExplosion, 0, true)
+  AddVisualGear(921, 149, vgtExplosion, 0, true)
+  AddVisualGear(1081, 149, vgtExplosion, 0, true)
+  AddVisualGear(761, 129, vgtExplosion, 0, true)
+  AddVisualGear(921, 129, vgtExplosion, 0, true)
+  AddVisualGear(1081, 129, vgtExplosion, 0, true)
+  AddVisualGear(1120, 261, vgtExplosion, 0, true)
+  AddVisualGear(1140, 261, vgtExplosion, 0, true)
+  AddVisualGear(1160, 261, vgtExplosion, 0, true)
+end
+
+function TeleportNatives()
+  nativePos[waterNum] = {1100, 288}
+  for i = 1, 7 do
+    if nativeDead[i] ~= true then 
+      AnimTeleportGear(natives[i], unpack(nativePos[i]))
+    end
+  end
+end
+
+function TurnNatives(hog)
+  for i = 1, 7 do
+    if nativeDead[i] == false then
+      if GetX(natives[i]) < GetX(hog) then
+        AnimTurn(natives[i], "Right")
+      else
+        AnimTurn(natives[i], "Left")
+      end
+    end
+  end
+end
+
+function DeployHog()
+  AnimSwitchHog(deployedHog)
+  AnimTeleportGear(deployedHog, unpack(deployedPos))
+  if deployedHog ~= natives[wiseNum] then
+    AnimSay(deployedHog, "Why me?!", SAY_THINK, 2000)
+  end
+end
+
+function SetupAfterChoiceAnim()
+  for i = 7, 1, -1 do
+    if nativeDead[i] ~= true then
+      if natives[i] ~= spyHog then
+        speakerHog = natives[i]
+      end
+    end
+  end
+  if choice == choiceEliminate then
+    table.insert(afterChoiceAnim, {func = AnimWait, args = {speakerHog, 1500}})
+    table.insert(afterChoiceAnim, {func = AnimSay, args = {speakerHog, "He won't be selling us out anymore!", SAY_SAY, 6000}})
+    if nativeDead[princessNum] ~= true and m4ChiefDead == 1 then
+      table.insert(afterChoiceAnim, {func = AnimSay, args = {natives[princessNum], "That's for my father!", SAY_SAY, 3500}})
+    end
+    table.insert(afterChoiceAnim, {func = AnimSay, args = {speakerHog, "Let's show those cannibals what we're made of!", SAY_SAY, 7000}})
+  else
+    table.insert(afterChoiceAnim, {func = AnimCustomFunction, swh = false, args = {natives[leaksNum], CondNeedToTurn, {speakerHog, spyHog}}})
+    table.insert(afterChoiceAnim, {func = AnimSay, args = {speakerHog, "We'll spare your life for now!", SAY_SAY, 4500}})
+    table.insert(afterChoiceAnim, {func = AnimSay, args = {spyHog, "May the spirits aid you in all your quests!", SAY_SAY, 7000}})
+    table.insert(afterChoiceAnim, {func = AnimSay, args = {speakerHog, "I just don't want to sink to your level.", SAY_SAY, 6000}})
+    table.insert(afterChoiceAnim, {func = AnimSay, args = {speakerHog, "Let's show those cannibals what we're made of!", SAY_SAY, 7000}})
+  end
+  table.insert(afterChoiceAnim, {func = AnimSay, args = {natives[8], "Let us help, too!", SAY_SAY, 3000}})
+  table.insert(afterChoiceAnim, {func = AnimTurn, args = {speakerHog, "Left", SAY_SAY, 7000}})
+  table.insert(afterChoiceAnim, {func = AnimSay, args = {speakerHog, "No. You and the rest of the tribe are safer there!", SAY_SAY, 7000}})
+  AddSkipFunction(afterChoiceAnim, SkipAfterChoiceAnim, {})
+end
+
+function SetupHogDeadAnim(gear)
+  hogDeadAnim = {}
+  if nativesNum == 0 then
+    return
+  end
+  local hogDeadStrings = {loc("They killed " .. gear .."! You bastards!"), 
+                          loc(gear .. "! Why?!"), 
+                          loc("That was just mean!"), 
+                          loc("Oh no, not " .. gear .. "!"),
+                          loc("Why " .. gear .. "? Why?"),
+                          loc("What has " .. gear .. " ever done to you?!")}
+  table.insert(hogDeadAnim, {func = AnimSay, args = {CurrentHedgehog, hogDeadStrings[7 - nativesNum], SAY_SHOUT, 4000}})
+end
+
+function AfterHogDeadAnim()
+  freshDead = nil
+  TurnTimeLeft = TurnTime
+end
+
+--------------------------Anim skip functions--------------------------
+
+function AfterAfterChoiceAnim()
+  stage = 0
+  AddEvent(CheckWaveDead, {1}, DoWaveDead, {1}, 0)
+  AddAmmo(speakerHog, amSwitch, 100)
+  SetGearMessage(speakerHog, 0)
+  SetState(speakerHog, 0)
+  TurnTimeLeft = -1
+  ShowMission("Backstab", "The food bites back", "Defeat the cannibals", 1, 4000)
+  SpawnCrates()
+end
+
+function SkipAfterChoiceAnim()
+  SetGearMessage(CurrentHedgehog, 0)
+  AnimSwitchHog(speakerHog)
+end
+
+function AfterWave2Anim()
+  AddEvent(CheckWaveDead, {2}, DoWaveDead, {2}, 0)
+  SetGearMessage(CurrentHedgehog, 0)
+  SetState(CurrentHedgehog, 0)
+  SpawnCrates()
+  TurnTimeLeft = TurnTime
+end
+
+function SkipWave2DeadAnim()
+  TeleportNatives()
+  DeployHog()
+  HideCyborg()
+end
+
+function SpawnPlatformCrates()
+  SpawnAmmoCrate(2494, 1262, amMine)
+  SpawnAmmoCrate(2574, 1279, amSMine)
+  SpawnAmmoCrate(2575, 1267, amMine)
+  SpawnAmmoCrate(2617, 1259, amSMine)
+  SpawnUtilityCrate(2579, 1254, amMine)
+  SpawnUtilityCrate(2478, 1243, amMine)
+end
+
+function AfterWave2DeadAnim()
+  TurnsLeft = 13
+  stage = platformStage
+  SpawnPlatformCrates()
+  AddEvent(CheckTurnsOver, {}, DoTurnsOver, {3}, 0)
+  AddEvent(CheckWaveDead, {3}, DoWaveDead, {3}, 0)
+  AddEvent(CheckDeployedDead, {}, DoDeployedDead, {}, 0)
+  TurnTimeLeft = 0
+  ShowMission("Backstab", "Drills", "You have 12 turns until the next wave arrives.|Make sure the arriving cannibals are greeted appropriately!|If the hog dies, the cause is lost.|Hint: you might want to use some mines...", 1, 12000)
+end
+
+function DoTurnsOver()
+  stage = wave3Stage
+  RestoreWave(3)
+end
+
+function SkipWave2Anim()
+  AnimSwitchHog(speakerHog)
+end
+
+function SkipStartAnim()
+  SetGearPosition(natives[waterNum], nativePos[denseNum][1] + 50, nativePos[denseNum][2])
+  RestoreWave(1)
+  ReviveNatives()
+  SetGearMessage(CurrentHedgehog, 0)
+  SetState(CurrentHedgehog, 0)
+  if m2Choice == choiceAccepted then
+    spyHog = natives[denseNum]
+  else
+    spyHog = natives[waterNum]
+  end
+  SetHealth(spyHog, 26)
+end
+
+function AfterStartAnim()
+  AnimSwitchHog(natives[leaksNum])
+  TurnTimeLeft = -1
+  stage = spyKillStage
+  AddEvent(CheckChoice, {}, DoChoice, {}, 0)
+  AddEvent(CheckKilledOther, {}, DoKilledOther, {}, 0)
+  AddEvent(CheckChoiceRefuse, {}, DoChoiceRefuse, {}, 0)
+  ShowMission("Backstab", "Judas", "Kill the traitor...or spare his life!|Kill him or press [Precise]!", 1, 8000)
+  ----------------------
+  SetHealth(natives[leaksNum], 1)
+end
+
+-----------------------------Events------------------------------------
+function CheckTurnsOver()
+  return TurnsLeft == 0
+end
+
+function CheckDeployedDead()
+  return deployedDead
+end
+
+function DoDeployedDead()
+  ShowMission("Backstab", "Brutus", "You have failed to save the tribe!", 0, 6000)
+  ParseCommand("teamgone " .. loc("Natives"))
+  ParseCommand("teamgone " .. loc("Tribe"))
+  TurnTimeLeft = 0
+end
+
+function CheckChoice()
+  return choice ~= 0 and tmpVar == 0
+end
+
+function CheckDeaths()
+  for i = 1, 7 do
+    if natives[i] ~= spyHog and band(GetState(natives[i]), gstAttacked) ~= 0 then
+      return true
+    end
+  end
+  return false
+end
+
+function DoChoice()
+  RemoveEventFunc(CheckChoiceRefuse)
+  SetupAfterChoiceAnim()
+  AddAnim(afterChoiceAnim)
+  AddFunction({func = AfterAfterChoiceAnim, args = {}})
+end
+
+function CheckChoiceRefuse()
+  return highJumped == true and StoppedGear(CurrentHedgehog)
+end
+
+function DoChoiceRefuse()
+  choice = choiceSpare
+end
+
+function CheckKilledOther()
+  if stage ~= spyKillStage then
+    return false
+  end
+  return (nativesNum < startNativesNum and choice ~= choiceEliminate) or
+          (nativesNum < startNativesNum - 1 and choice == choiceEliminate)
+end
+
+function DoKilledOther()
+  ShowMission("Backstab", "Brutus", "You have killed an innocent hedgehog!", 0, 6000)
+  ParseCommand("teamgone " .. loc("Natives"))
+  ParseCommand("teamgone " .. loc("Tribe"))
+  TurnTimeLeft = 0
+end
+
+function CheckWaveDead(index)
+  for i = (index - 1) * 3 + 1, index * 3 do
+    if cannibalDead[i] ~= true or CurrentHedgehog == cannibals[i] then
+      return false
+    end
+  end
+  return true
+end
+
+function DoWaveDead(index)
+  TurnTimeLeft = 0
+  if index == 1 then
+    RestoreWave(2)
+    SetupWave2Anim()
+    AddAnim(wave2Anim)
+    AddFunction({func = AfterWave2Anim, args = {}})
+  elseif index == 2 then
+    SetupWave2DeadAnim()
+    AddAnim(wave2DeadAnim)
+    AddFunction({func = AfterWave2DeadAnim, args = {}})
+  elseif index == 3 then
+    HideNatives()
+    SetupWave3DeadAnim()
+    AddAnim(wave3DeadAnim)
+    AddFunction({func = AfterWave3DeadAnim, args = {}})
+  end
+end
+
+function HideNatives()
+  for i = 1, 9 do
+    if nativeDead[i] ~= true and natives[i] ~= deployedHog then
+      if nativeHidden[i] ~= true then
+        HideHog(natives[i])
+        nativeHidden[i] = true
+      end
+    end
+  end
+end
+
+function SetupWave3DeadAnim()
+  table.insert(wave3DeadAnim, {func = AnimTurn, args = {deployedHog, "Left"}})
+  table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, "That ought to show them!", SAY_SAY, 4000}})
+  table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, "Guys, do you think there's more of them?", SAY_SHOUT, 7000}})
+  table.insert(wave3DeadAnim, {func = AnimVisualGear, args = {deployedHog, unpack(nativePos[wiseNum]), vgtEvilTrace, 0, true}})
+  table.insert(wave3DeadAnim, {func = AnimWait, args = {deployedHog, 1000}})
+  table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, "Where are they?!", SAY_THINK, 3000}})
+  table.insert(wave3DeadAnim, {func = AnimCustomFunction, args = {deployedHog, RestoreCyborg, {}}})
+  table.insert(wave3DeadAnim, {func = AnimOutOfNowhere, args = {cyborg, 4040, 782}})
+  table.insert(wave3DeadAnim, {func = AnimSay, args = {cyborg, "These primitive people are so funny!", SAY_THINK, 6500}})
+  table.insert(wave3DeadAnim, {func = AnimMove, args = {cyborg, "Right", 4060, 0}})
+  table.insert(wave3DeadAnim, {func = AnimCustomFunction, args = {deployedHog, HideCyborg, {}}})
+  table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, "I need to find the others!", SAY_THINK, 4500}})
+  table.insert(wave3DeadAnim, {func = AnimSay, args = {deployedHog, "I have to follow that alien.", SAY_THINK, 4500}})
+end
+
+function SkipWave3DeadAnim()
+  AnimSwitchHog(deployedHog)
+end
+
+function AfterWave3DeadAnim()
+  if nativeDead[leaksNum] == true then
+    SaveCampaignVar("M5LeaksDead", "1")
+  else
+    SaveCampaignVar("M5LeaksDead", "0")
+  end
+  if nativeDead[denseNum] == true then
+    SaveCampaignVar("M5DenseDead", "1")
+  else
+    SaveCampaignVar("M5DenseDead", "0")
+  end
+  if nativeDead[waterNum] == true then
+    SaveCampaignVar("M5WaterDead", "1")
+  else
+    SaveCampaignVar("M5WaterDead", "0")
+  end
+  if nativeDead[buffaloNum] == true then
+    SaveCampaignVar("M5BuffaloDead", "1")
+  else
+    SaveCampaignVar("M5BuffaloDead", "0")
+  end
+  if nativeDead[princessNum] == true then
+    SaveCampaignVar("M5PrincessDead", "1")
+  else
+    SaveCampaignVar("M5PrincessDead", "0")
+  end
+  if nativeDead[wiseNum] == true then
+    SaveCampaignVar("M5WiseDead", "1")
+  else
+    SaveCampaignVar("M5WiseDead", "0")
+  end
+  if nativeDead[chiefNum] == true then
+    SaveCampaignVar("M5ChiefDead", "1")
+  else
+    SaveCampaignVar("M5ChiefDead", "0")
+  end
+  SaveCampaignVar("M5Choice", "" .. choice)
+  SaveCampaignVar("Progress", "5")
+
+  for i = 1, 7 do 
+    if natives[i] == deployedHog then
+      SaveCampaignVar("M5DeployedNum", "" .. i)
+    end
+  end
+
+  ParseCommand("teamgone " .. loc("Tribe"))
+  ParseCommand("teamgone " .. loc("Assault Team"))
+  ParseCommand("teamgone " .. loc("Reinforcements"))
+  ParseCommand("teamgone " .. loc("011101001"))
+  TurnTimeLeft = 0
+end
+
+-----------------------------Misc--------------------------------------
+
+function SpawnCrates()
+  SpawnAmmoCrate(0, 0, amDrill)
+  SpawnAmmoCrate(0, 0, amGrenade)
+  SpawnAmmoCrate(0, 0, amBazooka)
+  SpawnAmmoCrate(0, 0, amDynamite)
+  SpawnAmmoCrate(0, 0, amGrenade)
+  SpawnAmmoCrate(0, 0, amMine)
+  SpawnAmmoCrate(0, 0, amShotgun)
+  SpawnAmmoCrate(0, 0, amFlamethrower)
+  SpawnAmmoCrate(0, 0, amMolotov)
+  SpawnAmmoCrate(0, 0, amSMine)
+  SpawnAmmoCrate(0, 0, amMortar)
+  SpawnUtilityCrate(0, 0, amRope)
+  SpawnUtilityCrate(0, 0, amRope)
+  SpawnUtilityCrate(0, 0, amParachute)
+  SpawnUtilityCrate(0, 0, amParachute)
+  SetHealth(SpawnHealthCrate(0, 0), 25)
+  SetHealth(SpawnHealthCrate(0, 0), 25)
+  SetHealth(SpawnHealthCrate(0, 0), 25)
+  SetHealth(SpawnHealthCrate(0, 0), 25)
+  SetHealth(SpawnHealthCrate(0, 0), 25)
+  SetHealth(SpawnHealthCrate(0, 0), 25)
+end
+
+
+function RestoreWave(index)
+  for i = (index - 1) * 3 + 1, index * 3 do
+    if cannibalHidden[i] == true then
+      RestoreHog(cannibals[i])
+      FollowGear(cannibals[i])
+      cannibalHidden[i] = false
+    end
+  end
+end
+
+function GetVariables()
+  m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
+  m2Choice = tonumber(GetCampaignVar("M2Choice"))
+  m4DenseDead = tonumber(GetCampaignVar("M4DenseDead"))
+  m4LeaksDead = tonumber(GetCampaignVar("M4LeaksDead"))
+  m4ChiefDead = tonumber(GetCampaignVar("M4ChiefDead"))
+  m4WaterDead = tonumber(GetCampaignVar("M4WaterDead"))
+  m4BuffaloDead = tonumber(GetCampaignVar("M4BuffaloDead"))
+end
+
+function HideCyborg()
+  if cyborgHidden == false then
+    HideHog(cyborg)
+    cyborgHidden = true
+  end
+end
+
+function RestoreCyborg()
+  if cyborgHidden == true then
+    RestoreHog(cyborg)
+    cyborgHidden = false
+  end
+end
+
+function SetupPlace()
+  startElimination = 1
+  HideHog(cyborg)
+  cyborgHidden = true
+  for i = 1, 9 do
+    HideHog(cannibals[i])
+    cannibalHidden[i] = true
+  end
+  if m4LeaksDead == 1 then
+    HideHog(natives[leaksNum])
+    nativeHidden[leaksNum] = true
+    needRevival = true
+  end
+  if m4DenseDead == 1 then
+    if m2Choice ~= choiceAccepted then
+      DeleteGear(natives[denseNum])
+    else
+      HideHog(natives[denseNum])
+      nativeHidden[denseNum] = true
+      needRevival = true
+    end
+  end
+  if m4WaterDead == 1 then
+    HideHog(natives[waterNum])
+    nativeHidden[waterNum] = true
+    needRevival = true
+  end
+  if m4ChiefDead == 1 then
+    DeleteGear(natives[chiefNum])
+    SetGearPosition(natives[princessNum], unpack(nativePos[buffaloNum]))
+    nativePos[princessNum] = nativePos[buffaloNum]
+  end
+  if m4BuffaloDead == 1 then
+    DeleteGear(natives[buffaloNum])
+  end
+  startElimination = 0
+  PlaceGirder(3568, 1461, 1)
+  PlaceGirder(440, 523, 5)
+  PlaceGirder(350, 441, 1)
+  PlaceGirder(405, 553, 5)
+  PlaceGirder(316, 468, 1)
+  PlaceGirder(1319, 168, 0)
+  startNativesNum = nativesNum
+end
+
+function SetupEvents()
+end
+
+function SetupAmmo()
+  AddAmmo(natives[princessNum], amSwitch, 0)
+end
+
+function AddHogs()
+	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
+  for i = 1, 7 do
+    natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
+  end
+  nativesNum = 7
+
+  AddTeam(loc("Tribe"), 29438, "Bone", "Island", "HillBilly", "cm_birdy")
+  for i = 8, 9 do
+    natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
+  end
+
+
+  AddTeam(loc("Assault Team"), 14483456, "Skull", "Island", "Pirate", "cm_vampire")
+  for i = 1, 6 do
+    cannibals[i] = AddHog(cannibalNames[i], 1, 50, "vampirichog")
+  end
+
+  AddTeam(loc("Reinforcements"), 14483456, "Skull", "Island", "Pirate", "cm_vampire")
+  for i = 7, 9 do
+    cannibals[i] = AddHog(cannibalNames[i], 1, 50, "vampirichog")
+  end
+
+  AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star")
+  cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
+
+  for i = 1, 9 do
+    SetGearPosition(natives[i], unpack(nativePos[i]))
+    AnimTurn(natives[i], nativeDir[i])
+  end
+
+  SetGearPosition(cyborg, 0, 0)
+
+  for i = 1, 9 do
+    SetGearPosition(cannibals[i], unpack(cannibalPos[i]))
+    AnimTurn(cannibals[i], cannibalDir[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 = 2
+	GameFlags = gfSolidLand
+	TurnTime = 60000 
+	CaseFreq = 0
+	MinesNum = 6
+	MinesTime = 3000
+	Explosives = 6
+	Delay = 10 
+  Map = "Cave"
+	Theme = "Nature"
+  SuddenDeathTurns = 3000
+
+  AddHogs()
+  AnimInit()
+end
+
+function onGameStart()
+  GetVariables()
+  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)
+  for i = 1, 7 do
+    if gear == natives[i] then
+      nativeDead[i] = true
+      nativesNum = nativesNum - 1
+      if startElimination == 0 then
+        freshDead = nativeNames[i]
+      end
+    end
+  end
+
+  for i = 1, 9 do
+    if gear == cannibals[i] then
+      cannibalDead[i] = true
+    end
+  end
+
+  if gear == spyHog and stage == spyKillStage then
+    freshDead = nil
+    choice = choiceEliminate
+    tmpVar = 1
+  end
+end
+
+function onGearAdd(gear)
+end
+
+function onAmmoStoreInit()
+  SetAmmo(amDEagle, 9, 0, 0, 0)
+  SetAmmo(amSniperRifle, 4, 0, 0, 0)
+  SetAmmo(amFirePunch, 9, 0, 0, 0)
+  SetAmmo(amWhip, 9, 0, 0, 0)
+  SetAmmo(amBaseballBat, 9, 0, 0, 0)
+  SetAmmo(amHammer, 9, 0, 0, 0)
+  SetAmmo(amLandGun, 9, 0, 0, 0)
+  SetAmmo(amSnowball, 8, 0, 0, 0)
+  SetAmmo(amGirder, 4, 0, 0, 2)
+  SetAmmo(amParachute, 4, 0, 0, 2)
+  SetAmmo(amSwitch, 8, 0, 0, 2)
+  SetAmmo(amSkip, 8, 0, 0, 0)
+  SetAmmo(amRope, 5, 0, 0, 3)
+  SetAmmo(amBlowTorch, 3, 0, 0, 3)
+  SetAmmo(amPickHammer, 0, 0, 0, 3)
+  SetAmmo(amLowGravity, 0, 0, 0, 2)
+  SetAmmo(amDynamite, 0, 0, 0, 3)
+  SetAmmo(amBazooka, 4, 0, 0, 4)
+  SetAmmo(amGrenade, 4, 0, 0, 4)
+  SetAmmo(amMine, 2, 0, 0, 2)
+  SetAmmo(amSMine, 2, 0, 0, 2)
+  SetAmmo(amMolotov, 2, 0, 0, 3)
+  SetAmmo(amFlamethrower, 2, 0, 0, 3)
+  SetAmmo(amShotgun, 4, 0, 0, 4)
+  SetAmmo(amTeleport, 0, 0, 0, 2)
+  SetAmmo(amDrill, 0, 0, 0, 4)
+  SetAmmo(amMortar, 0, 0, 0, 4)
+end
+
+j = 0
+
+function onNewTurn()
+  tmpVar = 0
+  if AnimInProgress() then
+    TurnTimeLeft = -1
+    return
+  end
+
+  if GetHogTeamName(CurrentHedgehog) == loc("Tribe") then
+    TurnTimeLeft = 0
+    return
+  end
+  TurnsLeft = TurnsLeft - 1
+
+  if stage == spyKillStage then
+    if CurrentHedgehog == spyHog or GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then
+      TurnTimeLeft = 0
+    else
+      SetGearMessage(CurrentHedgehog, 0)
+      TurnTimeLeft = -1
+    end
+  else
+    if freshDead ~= nil and GetHogTeamName(CurrentHedgehog) == loc("Natives") then
+      SetupHogDeadAnim(freshDead)
+      AddAnim(hogDeadAnim)
+      AddFunction({func = AfterHogDeadAnim, args = {}})
+    end
+  end
+end
+
+function onGearDamage(gear, damage)
+end
+
+function onPrecise()
+  if GameTime > 2500 then
+    SetAnimSkip(true)
+  end
+  if stage == spyKillStage then
+    highJumped = true
+  end
+end
--- a/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/campaign.ini	Tue Jul 10 23:06:56 2012 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/campaign.ini	Mon Jul 16 20:38:31 2012 +0300
@@ -1,4 +1,4 @@
-MissionNum=4
+MissionNum=5
 ResetRetry=1
 
 [Mission 1]
@@ -16,3 +16,7 @@
 [Mission 4]
 Name=United We Stand
 Script=united.lua
+
+[Mission 5]
+Name=Backstab
+Script=backstab.lua
--- a/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/united.lua	Tue Jul 10 23:06:56 2012 +0300
+++ b/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/united.lua	Mon Jul 16 20:38:31 2012 +0300
@@ -383,6 +383,8 @@
 end
 
 function DoWaveDead(index)
+  SetGearMessage(CurrentHedgehog, 0)
+  SetState(CurrentHedgehog, 0)
   if index == 1 then
     AddAnim(wave2Anim)
     AddFunction({func = AfterWave2Anim, args = {}})