share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua
changeset 14383 cea19d3342c8
parent 14364 02841325495e
child 14388 cf49fac6e88a
equal deleted inserted replaced
14382:f9d4b8222903 14383:cea19d3342c8
   148 deleteCrate = false
   148 deleteCrate = false
   149 difficultyChoice = false
   149 difficultyChoice = false
   150 princessFace = "Left"
   150 princessFace = "Left"
   151 elderFace = "Left"
   151 elderFace = "Left"
   152 
   152 
       
   153 local ctrlJump, ctrlMissionPanel, ctrlAttack
       
   154 if INTERFACE == "touch" then
       
   155     ctrlJump = loc("Long Jump: Tap the [Curvy Arrow] button for long")
       
   156     ctrlMissionPanel = loc("Hint: Pause the game to review the mission texts.")
       
   157     ctrlAttack = loc("Attack: Tap the [Bomb]")
       
   158 else
       
   159     ctrlJump = loc("Long Jump: Enter")
       
   160     ctrlMissionPanel = loc("Hint: Hold down [M] to review the mission texts.")
       
   161     ctrlAttack = loc("Attack: Space")
       
   162 end
       
   163 
   153 goals = {
   164 goals = {
   154   [startDialogue] = {loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000},
   165   [startDialogue] = {loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Long Jump] to jump forwards.") .. "| |" .. ctrlJump, 1, 4000},
   155   [onShroomAnim] = {loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower") .. "|" .. loc("Hint: Hold down [M] to review the mission texts."), 1, 7000},
   166   [onShroomAnim] = {loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower.") .. "|" .. ctrlMissionPanel, 1, 7000},
   156   [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},
   167   [onFlowerAnim] = {loc("First Blood"), loc("Hightime"), loc("Collect the crate on the right.") .. "|" .. loc("Hint: Select the rope, [Up] or [Down] to aim, [Attack] to fire, directional keys to move.") .. "|" .. loc("Ropes can be fired again in the air!") .. "| |" .. ctrlAttack, 1, 7000},
   157   [tookParaAnim] = {loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000},
   168   [tookParaAnim] = {loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole."), 1, 4000},
   158   [onMoleHeadAnim] = {loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute ([Space] while in air) to get the next crate"), 1, 4000},
   169   [onMoleHeadAnim] = {loc("First Blood"), loc("The Leap of Faith"), loc("Use the parachute to get the next crate.") .. "|" .. loc("Hint: Just select the parachute, it opens automatically when you fall."), 1, 4000},
   159   [tookRope2Anim] = {loc("First Blood"), loc("The Rising"), loc("Get that crate!"), 1, 4000},
   170   [tookRope2Anim] = {loc("First Blood"), loc("The Rising"), loc("Get that crate!"), 1, 4000},
   160   [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},
   171   [tookPunchAnim] = {loc("First Blood"), loc("The Slaughter"), loc("Destroy the targets!") .. "|" .. loc("Hint: Select the Shoryuken and hit [Attack].|P.S.: You can use it mid-air.") .. "| |" .. ctrlAttack, 1, 5000},
   161   [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},
   172   [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},
   162   [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},
   173   [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},
   163   [challengeCompletedAnim] = {loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 1, 5000},
   174   [challengeCompletedAnim] = {loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 1, 5000},
   164   [beforeKillAnim] = {loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000},
   175   [beforeKillAnim] = {loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000},
   165   [closeCannim] = {loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000}
   176   [closeCannim] = {loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000},
   166 }
   177 }
       
   178 
   167 -----------------------------Animations--------------------------------
   179 -----------------------------Animations--------------------------------
   168 function Skipanim(anim)
   180 function Skipanim(anim)
   169   AnimSwitchHog(youngh)
   181   AnimSwitchHog(youngh)
   170   if goals[anim] ~= nil then
   182   if goals[anim] ~= nil then
   171     ShowMission(unpack(goals[anim]))
   183     ShowMission(unpack(goals[anim]))
   212   table.insert(startDialogue, {func = AnimSay, args = {elderh, loc("Come closer, so that your training may continue!"), SAY_SHOUT, 6000}})
   224   table.insert(startDialogue, {func = AnimSay, args = {elderh, loc("Come closer, so that your training may continue!"), SAY_SHOUT, 6000}})
   213   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}})
   225   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}})
   214   table.insert(startDialogue, {func = AnimJump, args = {youngh, "long"}})
   226   table.insert(startDialogue, {func = AnimJump, args = {youngh, "long"}})
   215   table.insert(startDialogue, {func = AnimTurn, args = {princess, "Right"}})
   227   table.insert(startDialogue, {func = AnimTurn, args = {princess, "Right"}})
   216   table.insert(startDialogue, {func = AnimSwitchHog, args = {youngh}})
   228   table.insert(startDialogue, {func = AnimSwitchHog, args = {youngh}})
   217   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}})
   229   table.insert(startDialogue, {func = AnimShowMission, args = {youngh, unpack(goals[startDialogue])}})
   218 
   230 
   219   AddSkipFunction(onShroomAnim, SkipOnShroom, {onShroomAnim})
   231   AddSkipFunction(onShroomAnim, SkipOnShroom, {onShroomAnim})
   220   table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("I can see you have been training diligently."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = onShroomAnim})
   232   table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("I can see you have been training diligently."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = onShroomAnim})
   221   table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("The wind whispers that you are ready to become familiar with tools, now..."), SAY_SAY, 4000}})
   233   table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("The wind whispers that you are ready to become familiar with tools, now..."), SAY_SAY, 4000}})
   222   table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("Open that crate and we will continue!"), SAY_SAY, 5000}})
   234   table.insert(onShroomAnim, {func = AnimSay, args = {elderh, loc("Open that crate and we will continue!"), SAY_SAY, 5000}})
   223   table.insert(onShroomAnim, {func = AnimMove, args = {elderh, "Right", 2700, 0}})
   235   table.insert(onShroomAnim, {func = AnimMove, args = {elderh, "Right", 2700, 0}})
   224   table.insert(onShroomAnim, {func = AnimTurn, args = {elderh, "Left"}})
   236   table.insert(onShroomAnim, {func = AnimTurn, args = {elderh, "Left"}})
   225   table.insert(onShroomAnim, {func = AnimSay, args = {princess, loc("He moves like an eagle in the sky."), SAY_THINK, 4000}})
   237   table.insert(onShroomAnim, {func = AnimSay, args = {princess, loc("He moves like an eagle in the sky."), SAY_THINK, 4000}})
   226   table.insert(onShroomAnim, {func = AnimSwitchHog, args = {youngh}})
   238   table.insert(onShroomAnim, {func = AnimSwitchHog, args = {youngh}})
   227   table.insert(onShroomAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("A leap in a leap"), loc("Go on top of the flower") .. "|" .. loc("Hint: Press [Esc] to review the mission texts."), 1, 7000}})
   239   table.insert(onShroomAnim, {func = AnimShowMission, args = {youngh, unpack(goals[onShroomAnim])}})
   228 
   240 
   229   AddSkipFunction(onFlowerAnim, Skipanim, {onFlowerAnim})
   241   AddSkipFunction(onFlowerAnim, Skipanim, {onFlowerAnim})
   230   table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("See that crate farther on the right?"), SAY_SAY, 4000}})
   242   table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("See that crate farther on the right?"), SAY_SAY, 4000}})
   231   table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("Swing, Leaks A Lot, on the wings of the wind!"), SAY_SAY, 6000}})
   243   table.insert(onFlowerAnim, {func = AnimSay, args = {elderh, loc("Swing, Leaks A Lot, on the wings of the wind!"), SAY_SAY, 6000}})
   232   table.insert(onFlowerAnim, {func = AnimSay, args = {princess, loc("His arms are so strong!"), SAY_THINK, 4000}})
   244   table.insert(onFlowerAnim, {func = AnimSay, args = {princess, loc("His arms are so strong!"), SAY_THINK, 4000}})
   233   table.insert(onFlowerAnim, {func = AnimSwitchHog, args = {youngh}})
   245   table.insert(onFlowerAnim, {func = AnimSwitchHog, args = {youngh}})
   234   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}})
   246   table.insert(onFlowerAnim, {func = AnimShowMission, args = {youngh, unpack(goals[onFlowerAnim])}})
   235 
   247 
   236   AddSkipFunction(tookParaAnim, Skipanim, {tookParaAnim})
   248   AddSkipFunction(tookParaAnim, Skipanim, {tookParaAnim})
   237   table.insert(tookParaAnim, {func = AnimGearWait, args = {youngh, 1000}, skipFunc = Skipanim, skipArgs = tookParaAnim})
   249   table.insert(tookParaAnim, {func = AnimGearWait, args = {youngh, 1000}, skipFunc = Skipanim, skipArgs = tookParaAnim})
   238   table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("Use the rope to get on the head of the mole, young one!"), SAY_SHOUT, 4000}})
   250   table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("Use the rope to get on the head of the mole, young one!"), SAY_SHOUT, 4000}})
   239   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}})
   251   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}})
   240   table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("We all know what happens when you get frightened..."), SAY_SAY, 4000}})
   252   table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("We all know what happens when you get frightened..."), SAY_SAY, 4000}})
   241   table.insert(tookParaAnim, {func = AnimSay, args = {youngh, loc("So humiliating..."), SAY_SAY, 4000}})
   253   table.insert(tookParaAnim, {func = AnimSay, args = {youngh, loc("So humiliating..."), SAY_SAY, 4000}})
   242   table.insert(tookParaAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000}})
   254   table.insert(tookParaAnim, {func = AnimShowMission, args = {youngh, unpack(goals[tookParaAnim])}})
   243   table.insert(tookParaAnim, {func = AnimSwitchHog, args = {youngh}})
   255   table.insert(tookParaAnim, {func = AnimSwitchHog, args = {youngh}})
   244 
   256 
   245   AddSkipFunction(onMoleHeadAnim, Skipanim, {onMoleHeadAnim})
   257   AddSkipFunction(onMoleHeadAnim, Skipanim, {onMoleHeadAnim})
   246   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})
   258   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})
   247   table.insert(onMoleHeadAnim, {func = AnimSay, args = {elderh, loc("The giant umbrella from the last crate should help break the fall."), SAY_SAY, 4000}})
   259   table.insert(onMoleHeadAnim, {func = AnimSay, args = {elderh, loc("The giant umbrella from the last crate should help break the fall."), SAY_SAY, 4000}})
   248   table.insert(onMoleHeadAnim, {func = AnimSay, args = {princess, loc("He's so brave..."), SAY_THINK, 4000}})
   260   table.insert(onMoleHeadAnim, {func = AnimSay, args = {princess, loc("He's so brave..."), SAY_THINK, 4000}})
   249   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}})
   261   table.insert(onMoleHeadAnim, {func = AnimShowMission, args = {youngh, unpack(goals[onMoleHeadAnim])}})
   250   table.insert(onMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
   262   table.insert(onMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
   251 
   263 
   252   AddSkipFunction(pastMoleHeadAnim, Skipanim, {pastMoleHeadAnim})
   264   AddSkipFunction(pastMoleHeadAnim, Skipanim, {pastMoleHeadAnim})
   253   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})
   265   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})
   254   table.insert(pastMoleHeadAnim, {func = AnimSay, args = {elderh, loc("Get that crate!"), SAY_SAY, 4000}})
   266   table.insert(pastMoleHeadAnim, {func = AnimSay, args = {elderh, loc("Get that crate!"), SAY_SAY, 4000}})
   255   table.insert(pastMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
   267   table.insert(pastMoleHeadAnim, {func = AnimSwitchHog, args = {youngh}})
   256 
   268 
   257   AddSkipFunction(tookRope2Anim, Skipanim, {tookRope2Anim})
   269   AddSkipFunction(tookRope2Anim, Skipanim, {tookRope2Anim})
   258   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})
   270   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})
   259   table.insert(tookRope2Anim, {func = AnimSay, args = {elderh, loc("You probably know what to do next..."), SAY_SAY, 4000}})
   271   table.insert(tookRope2Anim, {func = AnimSay, args = {elderh, loc("You probably know what to do next..."), SAY_SAY, 4000}})
   260   table.insert(tookRope2Anim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Rising"), loc("Get that crate!"), 1, 4000}})
   272   table.insert(tookRope2Anim, {func = AnimShowMission, args = {youngh, unpack(goals[tookRope2Anim])}})
   261   table.insert(tookRope2Anim, {func = AnimSwitchHog, args = {youngh}})
   273   table.insert(tookRope2Anim, {func = AnimSwitchHog, args = {youngh}})
   262 
   274 
   263   AddSkipFunction(tookPunchAnim, Skipanim, {tookPunchAnim})
   275   AddSkipFunction(tookPunchAnim, Skipanim, {tookPunchAnim})
   264   table.insert(tookPunchAnim, {func = AnimSay, args = {elderh, loc("It is time to practice your fighting skills."), SAY_SAY, 4000}})
   276   table.insert(tookPunchAnim, {func = AnimSay, args = {elderh, loc("It is time to practice your fighting skills."), SAY_SAY, 4000}})
   265   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}})
   277   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}})
   266   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}})
   278   table.insert(tookPunchAnim, {func = AnimShowMission, args = {youngh, unpack(goals[tookPunchAnim])}})
   267   table.insert(tookPunchAnim, {func = AnimSwitchHog, args = {youngh}})
   279   table.insert(tookPunchAnim, {func = AnimSwitchHog, args = {youngh}})
   268 
   280 
   269   AddSkipFunction(challengeAnim, Skipanim, {challengeAnim})
   281   AddSkipFunction(challengeAnim, Skipanim, {challengeAnim})
   270   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})
   282   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})
   271   table.insert(challengeAnim, {func = AnimSay, args = {elderh, loc("Your movement skills will be evaluated now."), SAY_SAY, 4000}})
   283   table.insert(challengeAnim, {func = AnimSay, args = {elderh, loc("Your movement skills will be evaluated now."), SAY_SAY, 4000}})
   274   table.insert(challengeAnim, {func = AnimSwitchHog, args = {youngh}})
   286   table.insert(challengeAnim, {func = AnimSwitchHog, args = {youngh}})
   275   table.insert(challengeAnim, {func = AnimWait, args = {youngh, 500}})
   287   table.insert(challengeAnim, {func = AnimWait, args = {youngh, 500}})
   276 
   288 
   277   AddSkipFunction(challengeFailedAnim, Skipanim, {challengeFailedAnim})
   289   AddSkipFunction(challengeFailedAnim, Skipanim, {challengeFailedAnim})
   278   table.insert(challengeFailedAnim, {func = AnimSay, args = {elderh, loc("Hmmm...perhaps a little more time will help."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeFailedAnim})
   290   table.insert(challengeFailedAnim, {func = AnimSay, args = {elderh, loc("Hmmm...perhaps a little more time will help."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeFailedAnim})
   279   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}})
   291   table.insert(challengeFailedAnim, {func = AnimShowMission, args = {youngh, unpack(goals[challengeFailedAnim])}})
   280   table.insert(challengeFailedAnim, {func = AnimSwitchHog, args = {youngh}})
   292   table.insert(challengeFailedAnim, {func = AnimSwitchHog, args = {youngh}})
   281 
   293 
   282   AddSkipFunction(challengeCompletedAnim, Skipanim, {challengeCompletedAnim})
   294   AddSkipFunction(challengeCompletedAnim, Skipanim, {challengeCompletedAnim})
   283   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("The spirits of the ancestors are surely pleased, Leaks A Lot."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeCompletedAnim})
   295   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("The spirits of the ancestors are surely pleased, Leaks A Lot."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = challengeCompletedAnim})
   284   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("You have proven yourself worthy to see our most ancient secret!"), SAY_SAY, 4000}})
   296   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("You have proven yourself worthy to see our most ancient secret!"), SAY_SAY, 4000}})
   285   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("The weapon in that last crate was bestowed upon us by the ancients!"), SAY_SAY, 4000}})
   297   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("The weapon in that last crate was bestowed upon us by the ancients!"), SAY_SAY, 4000}})
   286   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("Use it with precaution!"), SAY_SAY, 4000}})
   298   table.insert(challengeCompletedAnim, {func = AnimSay, args = {elderh, loc("Use it with precaution!"), SAY_SAY, 4000}})
   287   table.insert(challengeCompletedAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 1, 5000}})
   299   table.insert(challengeCompletedAnim, {func = AnimShowMission, args = {youngh, unpack(goals[challengeCompletedAnim])}})
   288   table.insert(challengeCompletedAnim, {func = AnimSwitchHog, args = {youngh}})
   300   table.insert(challengeCompletedAnim, {func = AnimSwitchHog, args = {youngh}})
   289 
   301 
   290   AddSkipFunction(beforeKillAnim, Skipanim, {beforeKillAnim})
   302   AddSkipFunction(beforeKillAnim, Skipanim, {beforeKillAnim})
   291   table.insert(beforeKillAnim, {func = AnimWait, args = {elderh, 100}})
   303   table.insert(beforeKillAnim, {func = AnimWait, args = {elderh, 100}})
   292   table.insert(beforeKillAnim, {func = AnimSay, args = {elderh, loc("What do my faulty eyes observe? A spy!"), SAY_SHOUT, 4000}, skipFunc = Skipanim, skipArgs = beforeKillAnim})
   304   table.insert(beforeKillAnim, {func = AnimSay, args = {elderh, loc("What do my faulty eyes observe? A spy!"), SAY_SHOUT, 4000}, skipFunc = Skipanim, skipArgs = beforeKillAnim})
   293   table.insert(beforeKillAnim, {func = AnimFollowGear, args = {cannibal}})
   305   table.insert(beforeKillAnim, {func = AnimFollowGear, args = {cannibal}})
   294   table.insert(beforeKillAnim, {func = AnimWait, args = {cannibal, 1000}})
   306   table.insert(beforeKillAnim, {func = AnimWait, args = {cannibal, 1000}})
   295   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}})
   307   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}})
   296   table.insert(beforeKillAnim, {func = AnimSay, args = {cannibal, loc("Oh, my!"), SAY_THINK, 4000}})
   308   table.insert(beforeKillAnim, {func = AnimSay, args = {cannibal, loc("Oh, my!"), SAY_THINK, 4000}})
   297   table.insert(beforeKillAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000}})
   309   table.insert(beforeKillAnim, {func = AnimShowMission, args = {youngh, unpack(goals[beforeKillAnim])}})
   298   table.insert(beforeKillAnim, {func = AnimSwitchHog, args = {youngh}})
   310   table.insert(beforeKillAnim, {func = AnimSwitchHog, args = {youngh}})
   299 
   311 
   300   AddSkipFunction(closeCannim, Skipanim, {closeCannim})
   312   AddSkipFunction(closeCannim, Skipanim, {closeCannim})
   301   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})
   313   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})
   302   table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("I'm certain that this is a misunderstanding, fellow hedgehogs!"), SAY_SAY, 4000}})
   314   table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("I'm certain that this is a misunderstanding, fellow hedgehogs!"), SAY_SAY, 4000}})
   303   table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("If only I were given a chance to explain my being here..."), SAY_SAY, 4000}})
   315   table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("If only I were given a chance to explain my being here..."), SAY_SAY, 4000}})
   304   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}})
   316   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}})
   305   table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("Here...pick your weapon!"), SAY_SAY, 5000}})
   317   table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("Here...pick your weapon!"), SAY_SAY, 5000}})
   306   table.insert(closeCannim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000}})
   318   table.insert(closeCannim, {func = AnimShowMission, args = {youngh, unpack(goals[closeCannim])}})
   307   table.insert(closeCannim, {func = AnimSwitchHog, args = {youngh}})
   319   table.insert(closeCannim, {func = AnimSwitchHog, args = {youngh}})
   308 
   320 
   309   table.insert(cannKilledAnim, {func = AnimSay, args = {elderh, loc("Yes, yeees! You are now ready to enter the real world!"), SAY_SHOUT, 6000}})
   321   table.insert(cannKilledAnim, {func = AnimSay, args = {elderh, loc("Yes, yeees! You are now ready to enter the real world!"), SAY_SHOUT, 6000}})
   310 
   322 
   311   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}})
   323   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}})
   408 function CheckMovedUntilJump()
   420 function CheckMovedUntilJump()
   409    return GetX(youngh) >= 2343
   421    return GetX(youngh) >= 2343
   410 end
   422 end
   411 
   423 
   412 function DoMovedUntilJump()
   424 function DoMovedUntilJump()
   413   ShowMission(loc("First Blood"), loc("Step By Step"), loc("Hint: Double Jump - Press [Backspace] twice"), -amSkip, 0)
   425   local msg
       
   426   if INTERFACE == "touch" then
       
   427      msg = loc("Hint: Double Jump - Tap the [Curvy Arrow] twice")
       
   428   else
       
   429      msg = loc("Hint: Double Jump - Press [Backspace] twice")
       
   430   end
       
   431   ShowMission(loc("First Blood"), loc("Step By Step"), msg, -amSkip, 0)
   414   AddEvent(CheckOnShroom, {}, DoOnShroom, {}, 0)
   432   AddEvent(CheckOnShroom, {}, DoOnShroom, {}, 0)
   415 end
   433 end
   416 
   434 
   417 function CheckOnShroom()
   435 function CheckOnShroom()
   418   return GetX(youngh) >= 2461 and StoppedGear(youngh)
   436   return GetX(youngh) >= 2461 and StoppedGear(youngh)
   599 function DoDesertColled()
   617 function DoDesertColled()
   600   AddAmmo(youngh, amDEagle, 100)
   618   AddAmmo(youngh, amDEagle, 100)
   601   PutTargets(1)
   619   PutTargets(1)
   602   AddEvent(CheckTargetsKilled, {}, DoTargetsKilled, {}, 1)
   620   AddEvent(CheckTargetsKilled, {}, DoTargetsKilled, {}, 1)
   603   AddEvent(CheckCannibalKilled, {}, DoCannibalKilledEarly, {}, 0)
   621   AddEvent(CheckCannibalKilled, {}, DoCannibalKilledEarly, {}, 0)
   604   ShowMission(loc("First Blood"), loc("The Bull's Eye"), loc("Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"), 1, 5000)
   622   ShowMission(loc("First Blood"), loc("The Bull's Eye"), loc("Destroy the targets!") .. "| |" .. ctrlAttack, 1, 5000)
   605 end
   623 end
   606 
   624 
   607 function CheckTargetsKilled()
   625 function CheckTargetsKilled()
   608   return targetsDestroyed == 3 and StoppedGear(youngh)
   626   return targetsDestroyed == 3 and StoppedGear(youngh)
   609 end
   627 end
   752 
   770 
   753 function onGameStart()
   771 function onGameStart()
   754   progress = tonumber(GetCampaignVar("Progress"))
   772   progress = tonumber(GetCampaignVar("Progress"))
   755   SetTurnTimeLeft(MAX_TURN_TIME)
   773   SetTurnTimeLeft(MAX_TURN_TIME)
   756   FollowGear(youngh)
   774   FollowGear(youngh)
   757 	ShowMission(loc("A Classic Fairytale"), loc("First Blood"), loc("Finish your training|Hint: Animations can be skipped with the [Precise] key."), -amSkip, 0)
   775   local msgSkip
       
   776   if INTERFACE == "touch" then
       
   777     -- FIXME: Precise key is not available in Touch
       
   778     msgSkip = ""
       
   779   else
       
   780     msgSkip = "|" .. loc("Hint: Animations can be skipped with the [Precise] key.")
       
   781   end
       
   782   ShowMission(loc("A Classic Fairytale"), loc("First Blood"), loc("Finish your training.") .. msgSkip, -amSkip, 0)
   758   HideHog(cannibal)
   783   HideHog(cannibal)
   759 
   784 
   760   AddAnim(startDialogue)
   785   AddAnim(startDialogue)
   761   princessFace = "Right"
   786   princessFace = "Right"
   762   AddEvent(CheckNeedToTurn, {princess}, DoNeedToTurn, {princess}, 1)
   787   AddEvent(CheckNeedToTurn, {princess}, DoNeedToTurn, {princess}, 1)