diff -r 5cc010e79431 -r 4bddcc1a1450 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua --- /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 +