share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua
branchspacecampaign
changeset 9308 4bddcc1a1450
parent 9263 5069877daa09
parent 9306 c9978ada9a3d
child 12263 2c8e7e73ef58
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua	Mon Jul 01 23:23:22 2013 +0300
@@ -0,0 +1,750 @@
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Animate.lua")
+
+-----------------------------Variables---------------------------------
+startDialogue = {}
+damageAnim = {}
+onShroomAnim = {}
+onFlowerAnim = {}
+tookParaAnim = {}
+tookPunchAnim = {}
+onMoleHeadAnim = {}
+tookRope2Anim = {}
+challengeAnim = {}
+challengeFailedAnim = {}
+challengeCompletedAnim = {}
+beforeKillAnim = {}
+closeCannim = {}
+cannKilledAnim = {}
+cannKilledEarlyAnim = {}
+princessDamagedAnim = {}
+elderDamagedAnim = {}
+pastMoleHeadAnim = {}
+
+
+targets = {}
+crates = {}
+targXdif2 = {2755, 2638, 2921, 2973, 3162, 3067, 3062, 1300}
+targYdif2 = {1197, 1537, 1646, 1857, 1804, 1173, 1167, 1183}
+targXdif1 = {2749, 2909, 2770, 2836, 1558, 1305}
+targYdif1 = {1179, 1313, 1734, 1441, 1152, 1259}
+targetPosX = {{821, 866, 789}, {614, 656, 638}, {1238, 1237, 1200}}
+targetPosY = {{1342, 1347, 1326}, {1112, 1121, 1061}, {1152, 1111, 1111}}
+crateNum = {6, 8}
+
+
+stage = 1
+cratesCollected = 0
+chalTries = 0
+targetsDestroyed = 0
+targsWave = 1
+tTime = -1
+difficulty = 0
+
+cannibalVisible = false
+cannibalKilles = false
+youngdamaged = false
+youngKilled = false
+elderDamaged = false
+princessDamaged = false
+elderKilled = false
+princessKilled = false
+rope1Taken = false
+paraTaken = false
+rope2Taken = false
+punchTaken = false
+canKilled = false
+desertTaken = false
+challengeFailed = false
+deleteCrate = false
+difficultyChoice = false
+princessFace = "Left"
+elderFace = "Left"
+
+goals = {
+  [startDialogue] = {loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000},
+  [onShroomAnim] = {loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower"), 1, 4000},
+  [onFlowerAnim] = {loc("First Blood"), loc("Hightime"), loc("Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"), 1, 7000},
+  [tookParaAnim] = {loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000},
+  [onMoleHeadAnim] = {loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute ([Space] while in air) to get the next crate"), 1, 4000},
+  [tookRope2Anim] = {loc("First Blood"), loc("The Rising"), loc("Do the deed"), 1, 4000},
+  [tookPunchAnim] = {loc("First Blood"), loc("The Slaughter"), loc("Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."), 1, 5000},
+  [challengeAnim] = {loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000},
+  [challengeFailedAnim] = {loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000},
+  [challengeCompletedAnim] = {loc("First Blood"), loc("The Ultimate Weapon"), loc("Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"), 1, 5000},
+  [beforeKillAnim] = {loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000},
+  [closeCannim] = {loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000}
+}
+-----------------------------Animations--------------------------------
+function Skipanim(anim)
+  AnimSwitchHog(youngh)
+  if goals[anim] ~= nil then
+    ShowMission(unpack(goals[anim]))
+  end
+  if anim == startDialogue then
+    HogTurnLeft(princess, false)
+  end
+end
+
+function SkipDamageAnim(anim)
+  SwitchHog(youngh)
+  SetInputMask(0xFFFFFFFF)
+end
+
+function SkipOnShroom()
+  Skipanim(onShroomAnim)
+  AnimSetGearPosition(elderh, 2700, 1278)
+end
+
+function AnimationSetup()
+  AddSkipFunction(damageAnim, SkipDamageAnim, {damageAnim})
+  table.insert(damageAnim, {func = AnimWait, args = {youngh, 500}, skipFunc = Skipanim, skipArgs = damageAnim})
+  table.insert(damageAnim, {func = AnimSay, args = {elderh, loc("Watch your steps, young one!"), SAY_SAY, 2000}})
+  table.insert(damageAnim, {func = AnimGearWait, args = {youngh, 500}})
+
+  AddSkipFunction(princessDamagedAnim, SkipDamageAnim, {princessDamagedAnim})
+  table.insert(princessDamagedAnim, {func = AnimWait, args = {princess, 500}, skipFunc = Skipanim, skipArgs = princessDamagedAnim})
+  table.insert(princessDamagedAnim, {func = AnimSay, args = {princess, loc("Why do men keep hurting me?"), SAY_THINK, 3000}})
+  table.insert(princessDamagedAnim, {func = AnimGearWait, args = {youngh, 500}})
+
+  AddSkipFunction(elderDamagedAnim, SkipDamageAnim, {elderDamagedAnim})
+  table.insert(elderDamagedAnim, {func = AnimWait, args = {elderh, 500}, skipFunc = Skipanim, skipArgs = elderDamagedAnim})
+  table.insert(elderDamagedAnim, {func = AnimSay, args = {elderh, loc("Violence is not the answer to your problems!"), SAY_SAY, 3000}})
+  table.insert(elderDamagedAnim, {func = AnimGearWait, args = {youngh, 500}})
+  
+  AddSkipFunction(startDialogue, Skipanim, {startDialogue})
+  table.insert(startDialogue, {func = AnimWait, args = {youngh, 3500}, skipFunc = Skipanim, skipArgs = startDialogue})
+  table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."),  5000}})
+  table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."), 5000}})
+  table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."), 5000}})
+  table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("And so it began..."), 1000}})
+  table.insert(startDialogue, {func = AnimSay, args = {elderh, loc("What are you doing at a distance so great, young one?"), SAY_SHOUT, 4000}})
+  table.insert(startDialogue, {func = AnimSay, args = {elderh, loc("Come closer, so that your training may continue!"), SAY_SHOUT, 6000}})
+  table.insert(startDialogue, {func = AnimSay, args = {youngh, loc("This is it! It's time to make Fell From Heaven fall for me..."), SAY_THINK, 6000}})
+  table.insert(startDialogue, {func = AnimJump, args = {youngh, "long"}})
+  table.insert(startDialogue, {func = AnimTurn, args = {princess, "Right"}})
+  table.insert(startDialogue, {func = AnimSwitchHog, args = {youngh}})
+  table.insert(startDialogue, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000}}) 
+
+  AddSkipFunction(onShroomAnim, SkipOnShroom, {onShroomAnim})
+  table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("I can see you have been training diligently."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = onShroomAnim})
+  table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("The wind whispers that you are ready to become familiar with tools, now..."), SAY_SAY, 4000}})
+  table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("Open that crate and we will continue!"), SAY_SAY, 5000}})
+  table.insert(onShroomAnim, {func = AnimMove, args = {elderh, "Right", 2700, 0}})
+  table.insert(onShroomAnim, {func = AnimTurn, args = {elderh, "Left"}})
+  table.insert(onShroomAnim, {func = AnimSay, args = {princess, loc("He moves like an eagle in the sky."), SAY_THINK, 4000}})
+  table.insert(onShroomAnim, {func = AnimSwitchHog, args = {youngh}})
+  table.insert(onShroomAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower"), 1, 4000}}) 
+
+  AddSkipFunction(onFlowerAnim, Skipanim, {onFlowerAnim})
+  table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("See that crate farther on the right?"), SAY_SAY, 4000}})
+  table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("Swing, Leaks A Lot, on the wings of the wind!"), SAY_SAY, 6000}})
+  table.insert(onFlowerAnim, {func = AnimSay, args = {princess, loc("His arms are so strong!"), SAY_THINK, 4000}})
+  table.insert(onFlowerAnim, {func = AnimSwitchHog, args = {youngh}})
+  table.insert(onFlowerAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("Hightime"), loc("Collect the crate on the right.|Hint: Select the rope, [Up] or [Down] to aim, [Space] to fire, directional keys to move.|Ropes can be fired again in the air!"), 1, 7000}}) 
+  
+  AddSkipFunction(tookParaAnim, Skipanim, {tookParaAnim})
+  table.insert(tookParaAnim, {func = AnimGearWait, args = {youngh, 1000}, skipFunc = Skipanim, skipArgs = tookParaAnim})
+  table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("Use the rope to get on the head of the mole, young one!"), SAY_SHOUT, 4000}})
+  table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("Worry not, for it is a peaceful animal! There is no reason to be afraid..."), SAY_SHOUT, 5000}})
+  table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("We all know what happens when you get frightened..."), SAY_SAY, 4000}})
+  table.insert(tookParaAnim, {func = AnimSay, args = {youngh, loc("So humiliating..."), SAY_SAY, 4000}})
+  table.insert(tookParaAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000}}) 
+  table.insert(tookParaAnim, {func = AnimSwitchHog, args = {youngh}})
+
+  AddSkipFunction(onMoleHeadAnim, Skipanim, {onMoleHeadAnim})
+  table.insert(onMoleHeadAnim, {func = AnimSay, args = {elderh, loc("Perfect! Now try to get the next crate without hurting yourself!"), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = onMoleHeadAnim})
+  table.insert(onMoleHeadAnim, {func = AnimSay, args = {elderh, loc("The giant umbrella from the last crate should help break the fall."), SAY_SAY, 4000}})
+  table.insert(onMoleHeadAnim, {func = AnimSay, args = {princess, loc("He's so brave..."), SAY_THINK, 4000}})
+  table.insert(onMoleHeadAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute ([Space] while in air) to get the next crate"), 1, 4000}}) 
+  table.insert(onMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
+
+  AddSkipFunction(pastMoleHeadAnim, Skipanim, {pastMoleHeadAnim})
+  table.insert(pastMoleHeadAnim, {func = AnimSay, args = {elderh, loc("I see you have already taken the leap of faith."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = pastMoleHeadAnim})
+  table.insert(pastMoleHeadAnim, {func = AnimSay, args = {elderh, loc("Get that crate!"), SAY_SAY, 4000}})
+  table.insert(pastMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
+
+  AddSkipFunction(tookRope2Anim, Skipanim, {tookRope2Anim})
+  table.insert(tookRope2Anim, {func = AnimSay, args = {elderh, loc("Impressive...you are still dry as the corpse of a hawk after a week in the desert..."), SAY_SAY, 5000}, skipFunc = Skipanim, skipArgs = tookRope2Anim})
+  table.insert(tookRope2Anim, {func = AnimSay, args = {elderh, loc("You probably know what to do next..."), SAY_SAY, 4000}})
+  table.insert(tookRope2Anim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Rising"), loc("Do the deed"), 1, 4000}}) 
+  table.insert(tookRope2Anim, {func = AnimSwitchHog, args = {youngh}})
+
+  AddSkipFunction(tookPunchAnim, Skipanim, {tookPunchAnim})
+  table.insert(tookPunchAnim, {func = AnimSay, args = {elderh, loc("It is time to practice your fighting skills."), SAY_SAY, 4000}})
+  table.insert(tookPunchAnim, {func = AnimSay, args = {elderh, loc("Imagine those targets are the wolves that killed your parents! Take your anger out on them!"), SAY_SAY, 5000}})
+  table.insert(tookPunchAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Slaughter"), loc("Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."), 1, 5000}}) 
+  table.insert(tookPunchAnim, {func = AnimSwitchHog, args = {youngh}})
+
+  AddSkipFunction(challengeAnim, Skipanim, {challengeAnim})
+  table.insert(challengeAnim, {func = AnimSay, args = {elderh, loc("I hope you are prepared for a small challenge, young one."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeAnim})
+  table.insert(challengeAnim, {func = AnimSay, args = {elderh, loc("Your movement skills will be evaluated now."), SAY_SAY, 4000}})
+  table.insert(challengeAnim, {func = AnimSay, args = {elderh, loc("Collect all the crates, but remember, our time in this life is limited!"), SAY_SAY, 4000}})
+  table.insert(challengeAnim, {func = AnimSay, args = {elderh, loc("How difficult would you like it to be?")}})
+  table.insert(challengeAnim, {func = AnimSwitchHog, args = {youngh}})
+  table.insert(challengeAnim, {func = AnimWait, args = {youngh, 500}})
+
+  AddSkipFunction(challengeFailedAnim, Skipanim, {challengeFailedAnim})
+  table.insert(challengeFailedAnim, {func = AnimSay, args = {elderh, loc("Hmmm...perhaps a little more time will help."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeFailedAnim})
+  table.insert(challengeFailedAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000}}) 
+  table.insert(challengeFailedAnim, {func = AnimSwitchHog, args = {youngh}})
+
+  AddSkipFunction(challengeCompletedAnim, Skipanim, {challengeCompletedAnim})
+  table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("The spirits of the ancerstors are surely pleased, Leaks A Lot."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeCompletedAnim})
+  table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("You have proven yourself worthy to see our most ancient secret!"), SAY_SAY, 4000}})
+  table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("The weapon in that last crate was bestowed upon us by the ancients!"), SAY_SAY, 4000}})
+  table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("Use it with precaution!"), SAY_SAY, 4000}})
+  table.insert(challengeCompletedAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Ultimate Weapon"), loc("Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"), 1, 5000}}) 
+  table.insert(challengeCompletedAnim, {func = AnimSwitchHog, args = {youngh}})
+
+  AddSkipFunction(beforeKillAnim, Skipanim, {beforeKillAnim})
+  table.insert(beforeKillAnim, {func = AnimSay, args = {elderh, loc("What do my faulty eyes observe? A spy!"), SAY_SHOUT, 4000}, skipFunc = Skipanim, skipArgs = beforeKillAnim})
+  table.insert(beforeKillAnim, {func = AnimFollowGear, args = {cannibal}})
+  table.insert(beforeKillAnim, {func = AnimWait, args = {cannibal, 1000}})
+  table.insert(beforeKillAnim, {func = AnimSay, args = {elderh, loc("Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"), SAY_SHOUT, 4000}})
+  table.insert(beforeKillAnim, {func = AnimSay, args = {cannibal, loc("Oh, my!"), SAY_THINK, 4000}})
+  table.insert(beforeKillAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000}}) 
+  table.insert(beforeKillAnim, {func = AnimSwitchHog, args = {youngh}})
+  
+  AddSkipFunction(closeCannim, Skipanim, {closeCannim})
+  table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("I see you would like his punishment to be more...personal..."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = closeCannim})
+  table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("I'm certain that this is a misunderstanding, fellow hedgehogs!"), SAY_SAY, 4000}})
+  table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("If only I were given a chance to explain my being here..."), SAY_SAY, 4000}})
+  table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"), SAY_SAY, 6000}})
+  table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("Here...pick your weapon!"), SAY_SAY, 5000}})
+  table.insert(closeCannim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000}}) 
+  table.insert(closeCannim, {func = AnimSwitchHog, args = {youngh}})
+
+  table.insert(cannKilledAnim, {func = AnimSay, args = {elderh, loc("Yes, yeees! You are now ready to enter the real world!"), SAY_SHOUT, 6000}})
+
+  table.insert(cannKilledEarlyAnim, {func = AnimSay, args = {elderh, loc("What?! A cannibal? Here? There is no time to waste! Come, you are prepared."), SAY_SHOUT, 4000}})
+end
+-----------------------------Events------------------------------------
+function CheckNeedToTurn(gear)
+  if youngKilled then
+    return false
+  end
+  if gear == princess then
+    if princessKilled ~= true then
+      if (GetX(princess) > GetX(youngh) and princessFace == "Right")
+        or (GetX(princess) < GetX(youngh) and princessFace == "Left") then
+      --if (GetX(princess) > GetX(youngh))
+       -- or (GetX(princess) < GetX(youngh)) then
+        return true
+      end
+    end
+  else
+    if elderKilled ~= true then
+      if (GetX(elderh) > GetX(youngh) and elderFace == "Right")
+        or (GetX(elderh) < GetX(youngh) and elderFace == "Left") then
+        return true
+      end
+    end
+  end
+  return false
+end
+
+function DoNeedToTurn(gear)
+  if gear == princess then
+    if GetX(princess) > GetX(youngh) then
+      HogTurnLeft(princess, true)
+      princessFace = "Left"
+    elseif GetX(princess) < GetX(youngh) then
+      HogTurnLeft(princess, false)
+      princessFace = "Right"
+    end
+  else
+    if GetX(elderh) > GetX(youngh) then
+      HogTurnLeft(elderh, true)
+      elderFace = "Left"
+    elseif GetX(elderh) < GetX(youngh) then
+      HogTurnLeft(elderh, false)
+      elderFace = "Right"
+    end
+  end
+end
+
+function CheckDamage()
+  return youngdamaged and StoppedGear(youngh) 
+end
+
+function DoOnDamage()
+  AddAnim(damageAnim)
+  youngdamaged = false
+  AddFunction({func = ResetTurnTime, args = {}})
+end
+
+function CheckDeath()
+  return youngKilled
+end
+
+function DoDeath()
+  RemoveEventFunc(CheckKilledOthers)
+  RemoveEventFunc(CheckDamage)
+  RemoveEventFunc(CheckDamagedOthers)
+  FinishThem()
+  ShowMission(loc("First Blood"), loc("The wasted youth"), loc("Leaks A Lot gave his life for his tribe! He should have survived!"), 2, 4000)
+end
+
+function CheckDamagedOthers()
+  return (princessDamaged and StoppedGear(princess)) or (elderDamaged and StoppedGear(elderh))
+end
+
+function CheckKilledOthers()
+  return princessKilled or elderKilled
+end
+
+function DoOnDamagedOthers()
+  if princessDamaged then
+    AddAnim(princessDamagedAnim)
+  end
+  if elderDamaged then
+    AddAnim(elderDamagedAnim)
+  end
+  elderDamaged = false
+  princessDamaged = false
+  AddFunction({func = ResetTurnTime, args = {}})
+end
+
+function DoKilledOthers()
+  AddCaption(loc("After Leaks A Lot betrayed his tribe, he joined the cannibals..."))
+  FinishThem()
+end
+
+function CheckMovedUntilJump()
+   return GetX(youngh) >= 2343
+end
+
+function DoMovedUntilJump()
+  ShowMission(loc("First Blood"), loc("Step By Step"), loc("Hint: Double Jump - Press [Backspace] twice"), -amSkip, 0)
+  AddEvent(CheckOnShroom, {}, DoOnShroom, {}, 0)
+end
+
+function CheckOnShroom()
+  return GetX(youngh) >= 2461 and StoppedGear(youngh)
+end
+
+function DoOnShroom()
+  ropeCrate1 = SpawnUtilityCrate(2751, 1194, amRope)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(onShroomAnim)
+  AddEvent(CheckOnFlower, {}, DoOnFlower, {}, 0)
+end
+
+function CheckOnFlower()
+  return rope1Taken and StoppedGear(youngh)
+end
+
+function DoOnFlower()
+  AddAmmo(youngh, amRope, 100)
+  paraCrate = SpawnUtilityCrate(3245, 1758, amParachute)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(onFlowerAnim)
+  AddEvent(CheckTookParaCrate, {}, DoTookParaCrate, {}, 0)
+end
+
+function CheckTookParaCrate()
+  return paraTaken and StoppedGear(youngh)
+end
+
+function DoTookParaCrate()
+  AddAmmo(youngh, amParachute, 100)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(tookParaAnim)
+  AddEvent(CheckOnMoleHead, {}, DoOnMoleHead, {}, 0)
+  AddEvent(CheckPastMoleHead, {}, DoPastMoleHead, {}, 0)
+end
+
+function CheckOnMoleHead()
+  x = GetX(youngh)
+  return x >= 3005 and x <= 3126 and StoppedGear(youngh)
+end
+
+function CheckPastMoleHead()
+  x = GetX(youngh)
+  y = GetY(youngh)
+  return x < 3005 and y > 1500 and StoppedGear(youngh) 
+end
+
+function DoPastMoleHead()
+  RemoveEventFunc(CheckOnMoleHead)
+  ropeCrate2 = SpawnUtilityCrate(2782, 1720, amRope)
+  AddAmmo(youngh, amRope, 0)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(pastMoleHeadAnim)
+  AddEvent(CheckTookRope2, {}, DoTookRope2, {}, 0)
+end
+
+function DoOnMoleHead()
+  RemoveEventFunc(CheckPastMoleHead)
+  ropeCrate2 = SpawnUtilityCrate(2782, 1720, amRope)
+  AddAmmo(youngh, amRope, 0)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(onMoleHeadAnim)
+  AddEvent(CheckTookRope2, {}, DoTookRope2, {}, 0)
+end
+
+function CheckTookRope2()
+  return rope2Taken and StoppedGear(youngh)
+end
+
+function DoTookRope2()
+  AddAmmo(youngh, amRope, 100)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(tookRope2Anim)
+  punchCrate = SpawnAmmoCrate(2460, 1321, amFirePunch)
+  AddEvent(CheckTookPunch, {}, DoTookPunch, {})
+end
+
+function CheckTookPunch()
+  return punchTaken and StoppedGear(youngh)
+end
+
+function DoTookPunch()
+  AddAmmo(youngh, amFirePunch, 100)
+  AddAmmo(youngh, amRope, 0)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(tookPunchAnim)
+  targets[1] = AddGear(1594, 1185, gtTarget, 0, 0, 0, 0)
+  targets[2] = AddGear(2188, 1314, gtTarget, 0, 0, 0, 0)
+  targets[3] = AddGear(1961, 1318, gtTarget, 0, 0, 0, 0)
+  targets[4] = AddGear(1961, 1200, gtTarget, 0, 0, 0, 0)
+  targets[5] = AddGear(1800, 900, gtTarget, 0, 0, 0, 0)
+  AddEvent(CheckTargDestroyed, {}, DoTargDestroyed, {}, 0)
+end
+
+function CheckTargDestroyed()
+  return targetsDestroyed == 5 and StoppedGear(youngh)
+end
+
+function DoTargDestroyed()
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(challengeAnim)
+  targetsDestroyed = 0
+  AddFunction({func = SetChoice, args = {}})
+  ropeCrate3 = SpawnAmmoCrate(2000, 1200, amRope)
+  AddEvent(CheckTookRope3, {}, AddAmmo, {youngh, amRope, 100}, 0)
+  AddEvent(CheckCratesColled, {}, DoCratesColled, {}, 0)
+  AddEvent(CheckChallengeWon, {}, DoChallengeWon, {}, 0)
+  AddEvent(CheckTimesUp, {}, DoTimesUp, {}, 1)
+end
+
+function CheckChoice()
+  return difficulty ~= 0
+end
+
+function DoChoice()
+  difficultyChoice = false
+  SetInputMask(0xFFFFFFFF)
+  StartChallenge(120000 + chalTries * 20000)
+end
+
+function CheckCratesColled()
+  return cratesCollected == crateNum[difficulty]
+end
+
+function DoCratesColled()
+  RemoveEventFunc(CheckTimesUp)
+  TurnTimeLeft = -1
+  AddCaption(loc("As the challenge was completed, Leaks A Lot set foot on the ground..."))
+end
+
+function CheckChallengeWon()
+  return cratesCollected == crateNum[difficulty] and StoppedGear(youngh)
+end
+
+function DoChallengeWon()
+  desertCrate = SpawnAmmoCrate(1240, 1212, amDEagle)
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(challengeCompletedAnim)
+  AddEvent(CheckDesertColled, {}, DoDesertColled, {}, 0)
+end
+
+function CheckTookRope3()
+  return rope3Taken
+end
+
+function CheckTimesUp()
+  return TurnTimeLeft == 100
+end
+
+function DoTimesUp()
+  challengeFailed = true
+  deleteCrate = true
+  DeleteGear(crates[1])
+  TurnTimeLeft = -1
+  AddCaption(loc("And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."))
+  AddEvent(CheckChallengeFailed, {}, DoChallengeFailed, {}, 0)
+end
+
+function CheckChallengeFailed()
+  return challengeFailed and StoppedGear(youngh)
+end
+
+function DoChallengeFailed()
+  challengeFailed = false
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(challengeFailedAnim)
+  chalTries = chalTries + 1
+  difficulty = 0
+  AddFunction({func = SetChoice, args = {}})
+end
+
+function CheckDesertColled()
+  return desertTaken and StoppedGear(youngh)
+end
+
+function DoDesertColled()
+  AddAmmo(youngh, amDEagle, 100)
+  PutTargets(1)
+  AddEvent(CheckTargetsKilled, {}, DoTargetsKilled, {}, 1)
+  AddEvent(CheckCannibalKilled, {}, DoCannibalKilledEarly, {}, 0)
+  ShowMission(loc("First Blood"), loc("The Bull's Eye"), loc("[Up], [Down] to aim, [Space] to shoot!"), 1, 5000)
+end
+
+function CheckTargetsKilled()
+  return targetsDestroyed == 3 and StoppedGear(youngh)
+end
+
+function DoTargetsKilled()
+  targetsDestroyed = 0
+  targsWave = targsWave + 1
+  if targsWave > 3 then
+    RemoveEventFunc(CheckTargetsKilled)
+    SetState(cannibal, gstVisible)
+    cannibalVisible = true
+    SetGearMessage(CurrentHedgehog, 0)
+    AddAnim(beforeKillAnim)
+    AddEvent(CheckCloseToCannibal, {}, DoCloseToCannibal, {}, 0)
+    AddEvent(CheckCannibalKilled, {}, DoCannibalKilled, {}, 0)
+  else
+    PutTargets(targsWave)
+  end
+end
+
+function CheckCloseToCannibal()
+  if CheckCannibalKilled() then
+    return false
+  end
+  return math.abs(GetX(cannibal) - GetX(youngh)) <= 400 and StoppedGear(youngh)
+end
+
+function DoCloseToCannibal()
+  SetGearMessage(CurrentHedgehog, 0)
+  AddAnim(closeCannim)
+  AddFunction({func = SpawnAmmoCrate, args = {targetPosX[1][1], targetPosY[1][1], amWhip}})
+  AddFunction({func = SpawnAmmoCrate, args = {targetPosX[1][2], targetPosY[1][2], amBaseballBat}})
+  AddFunction({func = SpawnAmmoCrate, args = {targetPosX[1][3], targetPosY[1][3], amHammer}})
+end
+
+function CheckCannibalKilled()
+  return cannibalKilled and StoppedGear(youngh)
+end
+
+function DoCannibalKilled()
+  AddAnim(cannKilledAnim)
+  if not progress then
+    SaveCampaignVar("Progress", "1")
+  end
+end
+
+function DoCannibalKilledEarly()
+  AddAnim(cannKilledEarlyAnim)
+  DoCannibalKilled()
+end
+
+-----------------------------Misc--------------------------------------
+function StartChallenge(time)
+  cratesCollected = 0
+  PutCrate(1)
+  TurnTimeLeft = time
+  ShowMission(loc("First Blood"), loc("The Crate Frenzy"), loc("Collect the crates within the time limit!|If you fail, you'll have to try again."), 1, 5000) 
+end
+
+function SetChoice()
+  SetInputMask(band(0xFFFFFFFF, bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLJump+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon)))
+  difficultyChoice = true
+  ShowMission(loc("First Blood"), loc("The Torment"), loc("Select difficulty: [Left] - easier or [Right] - harder"), 0, 4000)
+  AddEvent(CheckChoice, {}, DoChoice, {}, 0) 
+end
+
+function SetTime(time)
+  TurnTimeLeft = time
+end
+
+function ResetTurnTime()
+  TurnTimeLeft = tTime
+  tTime = -1
+end
+
+function PutCrate(i)
+  if i > crateNum[difficulty] then
+    return
+  end
+  if difficulty == 1 then
+    crates[1] = SpawnAmmoCrate(targXdif1[i], targYdif1[i], amRope)
+  else
+    crates[1] = SpawnAmmoCrate(targXdif2[i], targYdif2[i], amRope)
+  end
+end
+
+function PutTargets(i)
+  targets[1] = AddGear(targetPosX[i][1], targetPosY[i][1], gtTarget, 0, 0, 0, 0)
+  targets[2] = AddGear(targetPosX[i][2], targetPosY[i][2], gtTarget, 0, 0, 0, 0)
+  targets[3] = AddGear(targetPosX[i][3], targetPosY[i][3], gtTarget, 0, 0, 0, 0)
+end
+
+function FinishThem()
+  SetHealth(elderh, 0)
+  SetHealth(youngh, 0)
+  SetHealth(princess, 0)
+end
+-----------------------------Main Functions----------------------------
+
+function onGameInit()
+	Seed = 69 
+	GameFlags = gfInfAttack + gfSolidLand + gfDisableWind 
+	TurnTime = 100000 
+	CaseFreq = 0
+	MinesNum = 0
+	MinesTime = 3000
+	Explosives = 0
+	Delay = 10 
+	Map = "A_Classic_Fairytale_first_blood"
+	Theme = "Nature"
+
+
+	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
+	youngh = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo")
+  elderh = AddHog(loc("Righteous Beard"), 0, 99, "IndianChief")
+  princess = AddHog(loc("Fell From Heaven"), 0, 300, "tiara")
+  AnimSetGearPosition(princess, 1911, 1361)
+  HogTurnLeft(princess, true)
+  AnimSetGearPosition(elderh, 2667, 1208)
+  HogTurnLeft(elderh, true)
+  AnimSetGearPosition(youngh, 1862, 1362)
+  HogTurnLeft(youngh, false)
+
+  AddTeam(loc("Cannibals"), 14483456, "Skull", "Island", "Pirate","cm_vampire")
+  cannibal = AddHog(loc("Brainiac"), 0, 5, "Zombi")
+  AnimSetGearPosition(cannibal, 525, 1256)
+  HogTurnLeft(cannibal, false)
+  
+  AnimInit()
+  AnimationSetup()
+end
+
+function onGameStart()
+  progress = tonumber(GetCampaignVar("Progress"))
+  TurnTimeLeft = -1
+  FollowGear(youngh)
+	ShowMission(loc("A Classic Fairytale"), loc("First Blood"), loc("Finish your training|Hint: Animations can be skipped with the [Precise] key."), -amSkip, 0)
+  SetState(cannibal, gstInvisible)
+
+  AddAnim(startDialogue)
+  princessFace = "Right"
+  AddEvent(CheckNeedToTurn, {princess}, DoNeedToTurn, {princess}, 1)
+  AddEvent(CheckNeedToTurn, {elderh}, DoNeedToTurn, {elderh}, 1)
+  AddEvent(CheckDamage, {}, DoOnDamage, {}, 1)
+  AddEvent(CheckDeath, {}, DoDeath, {}, 0)
+  AddEvent(CheckDamagedOthers, {}, DoOnDamagedOthers, {}, 1)
+  AddEvent(CheckKilledOthers, {}, DoKilledOthers, {}, 0)
+  AddEvent(CheckMovedUntilJump, {}, DoMovedUntilJump, {}, 0)
+end
+
+function onGameTick()
+  AnimUnWait()
+  if ShowAnimation() == false then
+    return
+  end
+  ExecuteAfterAnimations()
+  CheckEvents()
+end
+
+function onGearDelete(gear)
+  if gear == ropeCrate1 then
+    rope1Taken = true
+  elseif gear == paraCrate then
+    paraTaken = true
+  elseif gear == ropeCrate2 then
+    rope2Taken = true
+  elseif gear == ropeCrate3 then
+    rope3Taken = true
+  elseif gear == crates[1] and deleteCrate == true then
+    deleteCrate = false
+  elseif gear == crates[1] and challengeFailed == false then
+    crates[1] = nil
+    cratesCollected = cratesCollected + 1
+    PutCrate(cratesCollected + 1)
+  elseif gear == punchCrate then
+    punchTaken = true
+  elseif gear == desertCrate then
+    desertTaken = true
+  elseif GetGearType(gear) == gtTarget then
+    i = 1
+    while targets[i] ~= gear do
+      i = i + 1
+    end
+    targets[i] = nil
+    targetsDestroyed = targetsDestroyed + 1 
+  elseif gear == cannibal then
+    cannibalKilled = true
+  elseif gear == princess then
+    princessKilled = true
+  elseif gear == elderh then
+    elderKilled = true
+  elseif gear == youngh then
+    youngKilled = true
+  end
+end
+
+function onAmmoStoreInit()
+  SetAmmo(amWhip, 0, 0, 0, 8)
+  SetAmmo(amBaseballBat, 0, 0, 0, 8)
+  SetAmmo(amHammer, 0, 0, 0, 8)
+end
+
+function onNewTurn()
+  if CurrentHedgehog == cannibal and cannibalVisible == false then
+    SetState(cannibal, gstInvisible)
+  end
+  SwitchHog(youngh)
+  FollowGear(youngh)
+  TurnTimeLeft = -1
+end
+
+function onGearDamage(gear, damage)
+  if gear == youngh then
+    youngdamaged = true
+    tTime = TurnTimeLeft
+  elseif gear == princess then
+    princessDamaged = true
+    tTime = TurnTimeLeft
+  elseif gear == elderh then
+    elderDamaged = true
+    tTime = TurnTimeLeft
+  elseif gear == cannibal then
+    cannibalVisible = true
+    cannibalDamaged = true
+    SetState(cannibal, 0)
+  end
+end
+
+function onPrecise()
+  if GameTime > 2000 then
+    SetAnimSkip(true)
+  end
+end
+
+function onLeft()
+  if difficultyChoice == true then
+    difficulty = 1
+  end
+end
+
+function onRight()
+  if difficultyChoice == true then
+    difficulty = 2
+  end
+end
+