--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/journey.lua Sun Jul 01 17:11:59 2012 +0300
@@ -0,0 +1,1062 @@
+loadfile(GetDataPath() .. "Scripts/Animate.lua")()
+
+--///////////////////////////////CONSTANTS///////////////////////////
+
+choiceAccepted = 0
+choiceRefused = 1
+choiceAttacked = 2
+
+endStage = 1
+
+cannibalNum = 8
+cannibalNames = {"John", "Flesh for Brainz", "Eye Chewer", "Torn Muscle",
+ "Nom-Nom", "Vedgies", "Brain Blower", "Gorkij"}
+cannibalPos = {{2471, 1174}, {939, 1019}, {1953, 902}, {3055, 1041},
+ {1121, 729}, {1150, 718}, {1149, 680}, {1161, 773}}
+
+startLeaksPosDuo = {3572, 1426}
+startEventXDuo = 3300
+startDensePosDuo = {3454, 1471}
+startCyborgPosDuo = {3202, 1307}
+midDensePosDuo = {1464, 1408}
+midCyborgPosDuo = {1264, 1390}
+
+--///////////////////////////////VARIABLES///////////////////////////
+
+m2Choice = 0
+m2DenseDead = 0
+m2RamonDead = 0
+m2SpikyDead = 0
+
+TurnsLeft = 0
+stage = 0
+
+cyborgHidden = false
+princessHidden = false
+blowTaken = false
+fireTaken = false
+gravityTaken = false
+sniperTaken = false
+girderTaken = false
+girder1Taken = false
+girder2Taken = false
+leaksDead = false
+denseDead = false
+princessDead = false
+cyborgDead = false
+cannibalDead = {}
+
+startAnim = {}
+startAnimAD = {}
+startAnimAL = {}
+startAnimRL = {}
+
+pastFlowerAnimAL = {}
+pastFlowerAnimRL = {}
+pastFlowerAnim = {}
+
+outPitAnimAL = {}
+outPitAnimRL = {}
+outPitAnim = {}
+
+midAnim = {}
+midAnimAD = {}
+
+failAnim = {}
+failAnimAD = {}
+
+endAnim = {}
+endAnimAD = {}
+endAnimAL = {}
+endAnimRL = {}
+
+endFailAnim = {}
+endFailAnimAD = {}
+
+winAnim = {}
+winAnimAD = {}
+
+--/////////////////////////Animation Functions///////////////////////
+function AfterMidFailAnim()
+ ParseCommand("teamgone Natives")
+ TurnTimeLeft = 0
+end
+
+function AfterMidAnimAlone()
+ SetupCourse()
+ for i = 5, 8 do
+ RestoreHog(cannibals[i])
+ SetGearPosition(cannibals[i], unpack(cannibalPos[i]))
+ end
+
+ AddAmmo(cannibals[5], amDEagle, 0)
+
+ AddEvent(CheckGirderTaken, {}, DoGirderTaken, {}, 0)
+ AddEvent(CheckOnFirstGirder, {}, DoOnFirstGirder, {}, 0)
+ AddEvent(CheckTookSniper, {}, DoTookSniper, {}, 0)
+ AddEvent(CheckFailedCourse, {}, DoFailedCourse, {}, 0)
+ SetGearMessage(leaks, 0)
+ TurnsLeft = 12
+ TurnTimeLeft = TurnTime
+ ShowMission("The Journey Back", "Collateral Damage", "Save the princess by collecting the crate in under 12 turns!", 0, 6000)
+ -----------------------///////////////------------
+ --SetGearPosition(leaks, 417, 1800)
+end
+
+function SkipEndAnimAlone()
+ if cyborgHidden then
+ RestoreHog(cyborg)
+ cyborgHidden = false
+ end
+ if princessHidden then
+ RestoreHog(princess)
+ princessHidden = false
+ end
+ SetGearPosition(cyborg, 437, 1700)
+ SetGearPosition(princess, 519, 1722)
+end
+
+function SkipEndAnimDuo()
+ if cyborgHidden then
+ RestoreHog(cyborg)
+ cyborgHidden = false
+ end
+ if princessHidden then
+ RestoreHog(princess)
+ princessHidden = false
+ end
+ SetGearPosition(cyborg, 437, 1700)
+ SetGearPosition(princess, 519, 1722)
+ SetGearPosition(leaks, 763, 1760)
+ SetGearPosition(dense, 835, 1519)
+ HogTurnLeft(leaks, true)
+ HogTurnLeft(dense, true)
+end
+
+function AfterEndAnimAlone()
+ stage = endStage
+ SwitchHog(leaks)
+ SetGearMessage(leaks, 0)
+ TurnTimeLeft = -1
+ ShowMission("The Journey Back", "Collateral Damage II", "Save Fell From Heaven!", 1, 4000)
+ AddEvent(CheckLost, {}, DoLost, {}, 0)
+ AddEvent(CheckWon, {}, DoWon, 0)
+ RemoveEventFunc(CheckFailedCourse)
+end
+
+function AfterEndAnimDuo()
+ stage = endStage
+ SwitchHog(leaks)
+ SetGearMessage(leaks, 0)
+ TurnTimeLeft = -1
+ ShowMission("The Journey Back", "Collateral Damage II", "Save Fell From Heaven!", 1, 4000)
+ AddEvent(CheckLost, {}, DoLost, {}, 0)
+ AddEvent(CheckWon, {}, DoWon, {}, 0)
+end
+
+function SkipMidAnimAlone()
+ SetGearPosition(leaks, 2656, 1842)
+ AnimSwitchHog(leaks)
+ SetInputMask(0xFFFFFFFF)
+ if princessHidden == false then
+ HideHog(princess)
+ princessHidden = true
+ end
+ if cyborgHidden == false then
+ HideHog(cyborg)
+ cyborgHidden = true
+ end
+end
+
+function AfterStartAnim()
+ SetGearMessage(leaks, 0)
+ TurnTimeLeft = TurnTime
+ local goal = "Get the crate on the other side of the island!|"
+ local hint = "Hint: you might want to stay out of sight and take all the crates...|"
+ local stuck = "If you get stuck, use your Desert Eagle or restart the mission!|"
+ local conds = "Leaks A Lot must survive!"
+ if m2DenseDead == 0 then
+ conds = "Your hogs must survive!"
+ end
+ ShowMission("The Journey Back", "Adventurous", goal .. hint .. stuck .. conds, 0, 7000)
+end
+
+function SkipStartAnim()
+ AnimSwitchHog(leaks)
+end
+
+function PlaceCratesDuo()
+ SpawnAmmoCrate(3104, 827, amBaseballBat)
+ girderCrate1 = SpawnUtilityCrate(2466, 1814, amGirder)
+ girderCrate2 = SpawnUtilityCrate(2630, 1278, amGirder)
+ SpawnUtilityCrate(2422, 1810, amParachute)
+ SpawnUtilityCrate(3107, 1009, amLowGravity)
+ sniperCrate = SpawnAmmoCrate(784, 1715, amSniperRifle)
+end
+
+function PlaceMinesDuo()
+ SetTimer(AddGear(2920, 1448, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2985, 1338, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(3005, 1302, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(3030, 1270, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(3046, 1257, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2954, 1400, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2967, 1385, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2849, 1449, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2811, 1436, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2773, 1411, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2732, 1390, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2700, 1362, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2642, 1321, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2172, 1417, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2190, 1363, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2219, 1332, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1201, 1207, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1247, 1205, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1295, 1212, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1356, 1209, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1416, 1201, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1466, 1201, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1678, 1198, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1738, 1198, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1796, 1198, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1637, 1217, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1519, 1213, gtMine, 0, 0, 0, 0), 5000)
+end
+
+function AfterPastFlowerAnim()
+ PlaceMinesDuo()
+ AddEvent(CheckDensePit, {}, DoDensePit, {}, 0)
+ AddEvent(CheckTookGirder1, {}, DoTookGirder1, {}, 0)
+ AddEvent(CheckTookGirder2, {}, DoTookGirder2, {}, 0)
+ SetGearMessage(leaks, 0)
+ SetGearMessage(dense, 0)
+ TurnTimeLeft = 0
+ ShowMission("The Journey Back", "The Savior", "Get Dense Cloud out of the pit!", 1, 5000)
+end
+
+function SkipPastFlowerAnim()
+ SetGearPosition(dense, 2656, 1842)
+ AnimSwitchHog(dense)
+ if cyborgHidden == false then
+ HideHog(cyborg)
+ cyborgHidden = true
+ end
+end
+
+function AfterOutPitAnim()
+ SetupCourseDuo()
+ RestoreHog(cannibals[5])
+ AddAmmo(cannibals[5], amDEagle, 0)
+ HideHog(cannibals[5])
+ AddEvent(CheckTookFire, {}, DoTookFire, {}, 0)
+ SetGearMessage(leaks, 0)
+ SetGearMessage(dense, 0)
+ TurnTimeLeft = 0
+ ShowMission("The Journey Back", "They never learn", "Free Dense Cloud and continue the mission!", 1, 5000)
+end
+
+function SkipOutPitAnim()
+ SetGearPosition(dense, unpack(midDensePosDuo))
+ AnimSwitchHog(dense)
+ if cyborgHidden == false then
+ HideHog(cyborg)
+ cyborgHidden = true
+ end
+end
+
+function RestoreCyborg(x, y, xx, yy)
+ RestoreHog(cyborg)
+ RestoreHog(princess)
+ cyborgHidden = false
+ princessHidden = false
+ AnimOutOfNowhere(cyborg, x, y)
+ AnimOutOfNowhere(princess, xx, yy)
+ HogTurnLeft(princess, false)
+ return true
+end
+
+function RestoreCyborgOnly(x, y)
+ RestoreHog(cyborg)
+ cyborgHidden = false
+ AnimOutOfNowhere(cyborg, x, y)
+ return true
+end
+
+function TargetPrincess()
+ ParseCommand("setweap " .. string.char(amDEagle))
+ SetGearMessage(cyborg, gmUp)
+ return true
+end
+
+function HideCyborg()
+ if cyborgHidden == false then
+ HideHog(cyborg)
+ cyborgHidden = true
+ end
+ if princessHidden == false then
+ HideHog(princess)
+ princessHidden = true
+ end
+end
+
+function HideCyborgOnly()
+ if cyborgHidden == false then
+ HideHog(cyborg)
+ cyborgHidden = true
+ end
+end
+
+function SetupKillRoom()
+ PlaceGirder(2342, 1814, 2)
+ PlaceGirder(2294, 1783, 0)
+ PlaceGirder(2245, 1814, 2)
+end
+
+function SetupCourseDuo()
+ PlaceGirder(1083, 1152, 6)
+ PlaceGirder(1087, 1150, 6)
+ PlaceGirder(1133, 1155, 0)
+ PlaceGirder(1135, 1152, 0)
+ PlaceGirder(1135, 1078, 0)
+ PlaceGirder(1087, 1016, 2)
+ PlaceGirder(1018, 921, 5)
+ PlaceGirder(1016, 921, 5)
+ PlaceGirder(962, 782, 6)
+ PlaceGirder(962, 662, 2)
+ PlaceGirder(962, 661, 2)
+ PlaceGirder(962, 650, 2)
+ PlaceGirder(962, 630, 2)
+ PlaceGirder(1033, 649, 0)
+ PlaceGirder(952, 650, 0)
+
+ fireCrate = SpawnAmmoCrate(1846, 1100, amFirePunch)
+ SpawnUtilityCrate(1849, 1149, amPickHammer)
+ SpawnAmmoCrate(960, 674, amDynamite)
+ SpawnUtilityCrate(994, 825, amRope)
+ SpawnUtilityCrate(570, 1357, amLowGravity)
+end
+
+function DumpMines()
+ SetTimer(AddGear(2261, 1835, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2280, 1831, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2272, 1809, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2290, 1815, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2278, 1815, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2307, 1811, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2286, 1820, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2309, 1813, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2303, 1822, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2317, 1827, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2312, 1816, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2316, 1812, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2307, 1802, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2276, 1818, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2284, 1816, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2292, 1811, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2295, 1814, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2306, 1811, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2292, 1815, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2314, 1815, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2286, 1813, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2275, 1813, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2269, 1814, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2273, 1812, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2300, 1808, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2322, 1812, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2323, 1813, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2311, 1811, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2303, 1809, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2287, 1808, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2282, 1808, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2277, 1809, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2296, 1809, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(2314, 1818, gtMine, 0, 0, 0, 0), 5000)
+end
+
+function SetupAnimRefusedDied()
+ SetupAnimAcceptedDied()
+ table.insert(startAnim, {func = AnimSay, args = {leaks, "I just wonder where Ramon and Spiky disappeared...", SAY_THINK, 6000}})
+end
+
+function SetupAnimAttacked()
+ SetupAnimAcceptedDied()
+ startAnim = {}
+ table.insert(startAnim, {func = AnimWait, args = {leaks, 3000}})
+ table.insert(startAnim, {func = AnimTurn, args = {leaks, "Left"}})
+ table.insert(startAnim, {func = AnimSay, args = {leaks, "I wonder where Dense Cloud is...", SAY_THINK, 4000}})
+ table.insert(startAnim, {func = AnimSay, args = {leaks, "He must be in the village already.", SAY_THINK, 4000}})
+ table.insert(startAnim, {func = AnimSay, args = {leaks, "I'd better get going myself.", SAY_THINK, 4000}})
+
+ midAnim = {}
+ table.insert(midAnim, {func = AnimWait, args = {leaks, 500}})
+ table.insert(midAnim, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {1300, 1200, 1390, 1200}}})
+ table.insert(midAnim, {func = AnimSwitchHog, args = {cyborg}})
+ table.insert(midAnim, {func = AnimCustomFunction, args = {cyborg, TargetPrincess, {}}})
+ table.insert(midAnim, {func = AnimSay, args = {cyborg, "Welcome, Leaks A Lot!", SAY_SAY, 3000}})
+ table.insert(midAnim, {func = AnimSay, args = {cyborg, "I want to play a game...", SAY_SAY, 3000}})
+ table.insert(midAnim, {func = AnimSay, args = {princess, "Help me, please!!!", SAY_SHOUT, 3000}})
+ table.insert(midAnim, {func = AnimSay, args = {cyborg, "If you can get that crate fast enough, your beloved \"princess\" may go free.", SAY_SAY, 7000}})
+ table.insert(midAnim, {func = AnimSay, args = {cyborg, "However, if you fail to do so, she dies a most violent death! Muahahaha!", SAY_SAY, 8000}})
+ table.insert(midAnim, {func = AnimSay, args = {cyborg, "Good luck...or else!", SAY_SAY, 4000}})
+ table.insert(midAnim, {func = AnimTeleportGear, args = {leaks, 2656, 1842}})
+ table.insert(midAnim, {func = AnimCustomFunction, args = {cyborg, HideCyborg, {}}, swh = false})
+ table.insert(midAnim, {func = AnimSay, args = {leaks, "Hey! This is cheating!", SAY_SHOUT, 4000}})
+ AddSkipFunction(midAnim, SkipMidAnimAlone, {})
+end
+
+function SetupAnimAcceptedDied()
+ table.insert(startAnimAD, {func = AnimWait, args = {leaks, 3000}})
+ table.insert(startAnimAD, {func = AnimTurn, args = {leaks, "left"}})
+ table.insert(startAnimAD, {func = AnimSay, args = {leaks, "I need to get to the other side of this island, fast!", SAY_THINK, 5000}})
+ table.insert(startAnimAD, {func = AnimSay, args = {leaks, "With Dense Cloud on the land of shadows, I'm the village's only hope...", SAY_THINK, 7000}})
+
+ table.insert(midAnimAD, {func = AnimWait, args = {leaks, 500}})
+ table.insert(midAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {1300, 1200, 1390, 1200}}})
+ table.insert(midAnimAD, {func = AnimSwitchHog, args = {cyborg}})
+ table.insert(midAnimAD, {func = AnimCustomFunction, args = {cyborg, TargetPrincess, {}}})
+ table.insert(midAnimAD, {func = AnimSay, args = {cyborg, "Welcome, Leaks A Lot!", SAY_SAY, 3000}})
+ table.insert(midAnimAD, {func = AnimSay, args = {cyborg, "I want to play a game...", SAY_SAY, 3000}})
+ table.insert(midAnimAD, {func = AnimSay, args = {princess, "Help me, please!!!", SAY_SHOUT, 3000}})
+ table.insert(midAnimAD, {func = AnimSay, args = {cyborg, "If you can get that crate fast enough, your beloved \"princess\" may go free.", SAY_SAY, 7000}})
+ table.insert(midAnimAD, {func = AnimSay, args = {cyborg, "However, if you fail to do so, she dies a most violent death, just like your friend! Muahahaha!", SAY_SAY, 8000}})
+ table.insert(midAnimAD, {func = AnimSay, args = {cyborg, "Good luck...or else!", SAY_SAY, 4000}})
+ table.insert(midAnimAD, {func = AnimTeleportGear, args = {leaks, 2656, 1842}})
+ table.insert(midAnimAD, {func = AnimCustomFunction, args = {cyborg, HideCyborg, {}}, swh = false})
+ table.insert(midAnimAD, {func = AnimSay, args = {leaks, "Hey! This is cheating!", SAY_SHOUT, 4000}})
+ AddSkipFunction(midAnimAD, SkipMidAnimAlone, {})
+
+ table.insert(failAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {2299, 1687, 2294, 1841}}})
+ table.insert(failAnimAD, {func = AnimTeleportGear, args = {leaks, 2090, 1841}})
+ table.insert(failAnimAD, {func = AnimCustomFunction, swh = false, args = {cyborg, SetupKillRoom, {}}})
+ table.insert(failAnimAD, {func = AnimTurn, swh = false, args = {cyborg, "Left"}})
+ table.insert(failAnimAD, {func = AnimTurn, swh = false, args = {princess, "Left"}})
+ table.insert(failAnimAD, {func = AnimTurn, swh = false, args = {leaks, "Right"}})
+ table.insert(failAnimAD, {func = AnimWait, args = {cyborg, 1000}})
+ table.insert(failAnimAD, {func = AnimSay, args = {cyborg, "You have failed to complete your task, young one!", SAY_SAY, 6000}})
+ table.insert(failAnimAD, {func = AnimSay, args = {cyborg, "It's time you learned that your actions have consequences!", SAY_SAY, 7000}})
+ table.insert(failAnimAD, {func = AnimSay, args = {princess, "No! Please, help me!", SAY_SAY, 4000}})
+ table.insert(failAnimAD, {func = AnimSwitchHog, args = {cyborg}})
+ table.insert(failAnimAD, {func = AnimCustomFunction, args = {cyborg, DumpMines, {}}})
+ table.insert(failAnimAD, {func = AnimCustomFunction, args = {cyborg, KillPrincess, {}}})
+ table.insert(failAnimAD, {func = AnimWait, args = {cyborg, 12000}})
+ table.insert(failAnimAD, {func = AnimSay, args = {leaks, "No! What have I done?! What have YOU done?!", SAY_SHOUT, 6000}})
+
+ table.insert(endAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {437, 1700, 519, 1722}}})
+ table.insert(endAnimAD, {func = AnimTurn, swh = false, args = {cyborg, "Right"}})
+ table.insert(endAnimAD, {func = AnimTurn, swh = false, args = {princess, "Right"}})
+ table.insert(endAnimAD, {func = AnimSay, args = {princess, "Help me, Leaks!", SAY_SHOUT, 3000}})
+ table.insert(endAnimAD, {func = AnimSay, args = {leaks, "But you said you'd let her go!", SAY_SHOUT, 5000}})
+ table.insert(endAnimAD, {func = AnimSay, args = {cyborg, "And you believed me? Oh, god, that's cute!", SAY_SHOUT, 7000}})
+ table.insert(endAnimAD, {func = AnimSay, args = {leaks, "I won't let you kill her!", SAY_SHOUT, 4000}})
+ AddSkipFunction(endAnimAD, SkipEndAnimAlone, {})
+
+ table.insert(endFailAnim, {func = AnimCaption, args = {leaks, "Leaks A Lot, depressed for killing his loved one, failed to save the village...", 3000}})
+
+ table.insert(winAnimAD, {func = AnimSay, args = {princess, "Thank you, oh, thank you, Leaks A Lot!", SAY_SAY, 5000}})
+ table.insert(winAnimAD, {func = AnimSay, args = {princess, "How can I ever repay you for saving my life?", SAY_SAY, 6000}})
+ table.insert(winAnimAD, {func = AnimSay, args = {leaks, "There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!", SAY_SAY, 10000}})
+ table.insert(winAnimAD, {func = AnimSay, args = {leaks, "Let's go home!", SAY_SAY, 3000}})
+ table.insert(winAnimAD, {func = AnimCaption, args = {leaks, "And so they discovered that cyborgs weren't invulnerable...", 2000}})
+
+ startAnim = startAnimAD
+ midAnim = midAnimAD
+ failAnim = failAnimAD
+ endAnim = endAnimAD
+ endFailAnim = endFailAnimAD
+ winAnim = winAnimAD
+end
+
+function SetupAnimAcceptedLived()
+ table.insert(startAnimAL, {func = AnimWait, args = {leaks, 3000}})
+ table.insert(startAnimAL, {func = AnimCustomFunction, args = {dense, CondNeedToTurn, {leaks, dense}}})
+ table.insert(startAnimAL, {func = AnimSay, args = {leaks, "All right, we just need to get to the other side of the island!", SAY_SAY, 8000}})
+ table.insert(startAnimAL, {func = AnimSay, args = {dense, "We have no time to waste...", SAY_SAY, 4000}})
+ table.insert(startAnimAL, {func = AnimSwitchHog, args = {leaks}})
+ AddSkipFunction(startAnimAL, SkipStartAnim, {})
+
+ table.insert(pastFlowerAnimAL, {func = AnimCustomFunction, args = {dense, RestoreCyborgOnly, {unpack(startCyborgPosDuo)}}, swh = false})
+ table.insert(pastFlowerAnimAL, {func = AnimTurn, args = {cyborg, "Right"}})
+ table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, "Well, well! Isn't that the cutest thing you've ever seen?", SAY_SAY, 7000}})
+ table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, "Two little hogs cooperating, getting past obstacles...", SAY_SAY, 7000}})
+ table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, "Let me test your skills a little, will you?", SAY_SAY, 6000}})
+ table.insert(pastFlowerAnimAL, {func = AnimTeleportGear, args = {cyborg, 2456, 1842}})
+ table.insert(pastFlowerAnimAL, {func = AnimTeleportGear, args = {dense, 2656, 1842}})
+ table.insert(pastFlowerAnimAL, {func = AnimCustomFunction, args = {dense, CondNeedToTurn, {cyborg, dense}}})
+ table.insert(pastFlowerAnimAL, {func = AnimSay, args = {dense, "Why are you doing this?", SAY_SAY, 4000}})
+ table.insert(pastFlowerAnimAL, {func = AnimSay, args = {cyborg, "To help you, of course!", SAY_SAY, 4000}})
+ table.insert(pastFlowerAnimAL, {func = AnimSwitchHog, args = {dense}})
+ table.insert(pastFlowerAnimAL, {func = AnimDisappear, swh = false, args = {cyborg, 3781, 1583}})
+ table.insert(pastFlowerAnimAL, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborgOnly, {}}})
+ AddSkipFunction(pastFlowerAnimAL, SkipPastFlowerAnim, {})
+
+ table.insert(outPitAnimAL, {func = AnimCustomFunction, args = {dense, RestoreCyborgOnly, {unpack(midCyborgPosDuo)}}, swh = false})
+ table.insert(outPitAnimAL, {func = AnimTurn, args = {cyborg, "Right"}})
+ table.insert(outPitAnimAL, {func = AnimTeleportGear, args = {dense, unpack(midDensePosDuo)}})
+ table.insert(outPitAnimAL, {func = AnimSay, args = {dense, "OH, COME ON!", SAY_SHOUT, 3000}})
+ table.insert(outPitAnimAL, {func = AnimSay, args = {cyborg, "Let's see what your comrade does now!", SAY_SAY, 5000}})
+ table.insert(outPitAnimAL, {func = AnimSwitchHog, args = {dense}})
+ table.insert(outPitAnimAL, {func = AnimDisappear, swh = false, args = {cyborg, 3781, 1583}})
+ table.insert(outPitAnimAL, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborgOnly, {}}})
+ AddSkipFunction(outPitAnimAL, SkipOutPitAnim, {})
+
+ table.insert(endAnim, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {437, 1700, 519, 1722}}})
+ table.insert(endAnim, {func = AnimTeleportGear, args = {leaks, 763, 1760}})
+ table.insert(endAnim, {func = AnimTeleportGear, args = {dense, 835, 1519}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {leaks, "Left"}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {dense, "Left"}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {cyborg, "Right"}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {princess, "Right"}})
+ table.insert(endAnim, {func = AnimSay, args = {princess, "Help me, please!", SAY_SHOUT, 3000}})
+ table.insert(endAnim, {func = AnimSay, args = {leaks, "What are you doing? Let her go!", SAY_SHOUT, 5000}})
+ table.insert(endAnim, {func = AnimSay, args = {cyborg, "Yeah? Watcha gonna do? Cry?", SAY_SHOUT, 5000}})
+ table.insert(endAnim, {func = AnimSay, args = {leaks, "We won't let you hurt her!", SAY_SHOUT, 4000}})
+ AddSkipFunction(endAnim, SkipEndAnimDuo, {})
+
+ table.insert(endFailAnim, {func = AnimCaption, args = {leaks, "Leaks A Lot, depressed for killing his loved one, failed to save the village...", 3000}})
+
+ table.insert(winAnim, {func = AnimSay, args = {princess, "Thank you, oh, thank you, my heroes!", SAY_SAY, 5000}})
+ table.insert(winAnim, {func = AnimSay, args = {princess, "How can I ever repay you for saving my life?", SAY_SAY, 6000}})
+ table.insert(winAnim, {func = AnimSay, args = {leaks, "There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!", SAY_SAY, 10000}})
+ table.insert(winAnim, {func = AnimSay, args = {leaks, "Let's go home!", SAY_SAY, 3000}})
+ table.insert(winAnim, {func = AnimCaption, args = {leaks, "And so they discovered that cyborgs weren't invulnerable...", 2000}})
+
+ startAnim = startAnimAL
+ pastFlowerAnim = pastFlowerAnimAL
+ outPitAnim = outPitAnimAL
+end
+
+function SetupAnimRefusedLived()
+ table.insert(startAnimRL, {func = AnimWait, args = {leaks, 3000}})
+ table.insert(startAnimRL, {func = AnimCustomFunction, args = {dense, CondNeedToTurn, {leaks, dense}}})
+ table.insert(startAnimRL, {func = AnimSay, args = {leaks, "All right, we just need to get to the other side of the island!", SAY_SAY, 7000}})
+ table.insert(startAnimRL, {func = AnimSay, args = {dense, "Dude, can you see Ramon and Spiky?", SAY_SAY, 5000}})
+ table.insert(startAnimRL, {func = AnimSay, args = {leaks, "No...I wonder where they disappeared?!", SAY_SAY, 5000}})
+ AddSkipFunction(startAnimRL, SkipStartAnim, {})
+
+ table.insert(pastFlowerAnimRL, {func = AnimCustomFunction, args = {dense, RestoreCyborgOnly, {unpack(startCyborgPosDuo)}}, swh = false})
+ table.insert(pastFlowerAnimRL, {func = AnimTurn, args = {cyborg, "Right"}})
+ table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, "Well, well! Isn't that the cutest thing you've ever seen?", SAY_SAY, 7000}})
+ table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, "Two little hogs cooperating, getting past obstacles...", SAY_SAY, 7000}})
+ table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, "Let me test your skills a little, will you?", SAY_SAY, 6000}})
+ table.insert(pastFlowerAnimRL, {func = AnimTeleportGear, args = {cyborg, 2456, 1842}})
+ table.insert(pastFlowerAnimRL, {func = AnimTeleportGear, args = {dense, 2656, 1842}})
+ table.insert(pastFlowerAnimRL, {func = AnimCustomFunction, args = {dense, CondNeedToTurn, {cyborg, dense}}})
+ table.insert(pastFlowerAnimRL, {func = AnimSay, args = {dense, "Why are you doing this?", SAY_SAY, 4000}})
+ table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, "You couldn't possibly believe that after refusing my offer I'd just let you go!", SAY_SAY, 9000}})
+ table.insert(pastFlowerAnimRL, {func = AnimSay, args = {cyborg, "You're funny!", SAY_SAY, 4000}})
+ table.insert(pastFlowerAnimRL, {func = AnimSwitchHog, args = {dense}})
+ table.insert(pastFlowerAnimRL, {func = AnimDisappear, swh = false, args = {cyborg, 3781, 1583}})
+ table.insert(pastFlowerAnimRL, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborgOnly, {}}})
+ AddSkipFunction(pastFlowerAnimRL, SkipPastFlowerAnim, {})
+
+ table.insert(outPitAnimRL, {func = AnimCustomFunction, args = {dense, RestoreCyborgOnly, {unpack(midCyborgPosDuo)}}, swh = false})
+ table.insert(outPitAnimRL, {func = AnimTurn, args = {cyborg, "Right"}})
+ table.insert(outPitAnimRL, {func = AnimTeleportGear, args = {dense, unpack(midDensePosDuo)}})
+ table.insert(outPitAnimRL, {func = AnimSay, args = {dense, "OH, COME ON!", SAY_SHOUT, 3000}})
+ table.insert(outPitAnimRL, {func = AnimSay, args = {cyborg, "Let's see what your comrade does now!", SAY_SAY, 5000}})
+ table.insert(outPitAnimRL, {func = AnimSwitchHog, args = {dense}})
+ table.insert(outPitAnimRL, {func = AnimDisappear, swh = false, args = {cyborg, 3781, 1583}})
+ table.insert(outPitAnimRL, {func = AnimCustomFunction, swh = false, args = {cyborg, HideCyborgOnly, {}}})
+ AddSkipFunction(outPitAnimRL, SkipOutPitAnim, {})
+
+ table.insert(endAnim, {func = AnimCustomFunction, args = {leaks, RestoreCyborg, {437, 1700, 519, 1722}}})
+ table.insert(endAnim, {func = AnimTeleportGear, args = {leaks, 763, 1760}})
+ table.insert(endAnim, {func = AnimTeleportGear, args = {dense, 835, 1519}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {leaks, "Left"}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {dense, "Left"}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {cyborg, "Right"}})
+ table.insert(endAnim, {func = AnimTurn, swh = false, args = {princess, "Right"}})
+ table.insert(endAnim, {func = AnimSay, args = {princess, "Help me, please!", SAY_SHOUT, 3000}})
+ table.insert(endAnim, {func = AnimSay, args = {leaks, "What are you doing? Let her go!", SAY_SHOUT, 5000}})
+ table.insert(endAnim, {func = AnimSay, args = {cyborg, "Yeah? Watcha gonna do? Cry?", SAY_SHOUT, 5000}})
+ table.insert(endAnim, {func = AnimSay, args = {leaks, "We won't let you hurt her!", SAY_SHOUT, 4000}})
+ AddSkipFunction(endAnim, SkipEndAnimDuo, {})
+
+ table.insert(endFailAnim, {func = AnimCaption, args = {leaks, "Leaks A Lot, depressed for killing his loved one, failed to save the village...", 3000}})
+
+ table.insert(winAnim, {func = AnimSay, args = {princess, "Thank you, oh, thank you, my heroes!", SAY_SAY, 5000}})
+ table.insert(winAnim, {func = AnimSay, args = {princess, "How can I ever repay you for saving my life?", SAY_SAY, 6000}})
+ table.insert(winAnim, {func = AnimSay, args = {leaks, "There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!", SAY_SAY, 10000}})
+ table.insert(winAnim, {func = AnimSay, args = {leaks, "Let's go home!", SAY_SAY, 3000}})
+ table.insert(winAnim, {func = AnimCaption, args = {leaks, "And so they discovered that cyborgs weren't invulnerable...", 2000}})
+
+ startAnim = startAnimRL
+ pastFlowerAnim = pastFlowerAnimRL
+ outPitAnim = outPitAnimRL
+end
+
+function KillPrincess()
+ ParseCommand("teamgone Cannibal Sentry")
+ TurnTimeLeft = 0
+end
+--/////////////////////////////Misc Functions////////////////////////
+
+function CondNeedToTurn(hog1, hog2)
+ xl, xd = GetX(hog1), GetX(hog2)
+ if xl > xd then
+ AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
+ AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
+ elseif xl < xd then
+ AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}})
+ AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}})
+ end
+end
+
+function SetupPlaceAlone()
+ ------ AMMO CRATE LIST ------
+ --SpawnAmmoCrate(3122, 994, amShotgun)
+ SpawnAmmoCrate(3124, 952, amBaseballBat)
+ SpawnAmmoCrate(2508, 1110, amFirePunch)
+ ------ UTILITY CRATE LIST ------
+ blowCrate = SpawnUtilityCrate(3675, 1480, amBlowTorch)
+ gravityCrate = SpawnUtilityCrate(3448, 1349, amLowGravity)
+ SpawnUtilityCrate(3212, 1256, amGirder)
+ SpawnUtilityCrate(3113, 911, amParachute)
+ sniperCrate = SpawnAmmoCrate(784, 1715, amSniperRifle)
+ ------ MINE LIST ------
+ SetTimer(AddGear(3328, 1399, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(3028, 1262, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2994, 1274, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2956, 1277, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2925, 1282, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2838, 1276, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2822, 1278, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2786, 1283, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2766, 1270, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2749, 1231, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2717, 1354, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2167, 1330, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2201, 1321, gtMine, 0, 0, 0, 0), 3000)
+ SetTimer(AddGear(2239, 1295, gtMine, 0, 0, 0, 0), 3000)
+
+ SetGearPosition(leaks, 3781, 1583)
+ --SetGearPosition(leaks, 1650, 1583)
+ AddAmmo(cannibals[1], amShotgun, 100)
+end
+
+function SetupPlaceDuo()
+ PlaceCratesDuo()
+ SetGearPosition(leaks, unpack(startLeaksPosDuo))
+ SetGearPosition(dense, unpack(startDensePosDuo))
+end
+
+function SetupEventsDuo()
+ AddEvent(CheckPastFlower, {}, DoPastFlower, {}, 0)
+ AddEvent(CheckLeaksDead, {}, DoLeaksDead, {}, 0)
+ AddEvent(CheckDenseDead, {}, DoDenseDead, {}, 0)
+ AddEvent(CheckTookSniper2, {}, DoTookSniper2, {}, 0)
+end
+
+function SetupEventsAlone()
+ AddEvent(CheckLeaksDead, {}, DoLeaksDead, {}, 0)
+ AddEvent(CheckTookBlowTorch, {}, DoTookBlowTorch, {}, 0)
+ AddEvent(CheckTookLowGravity, {}, DoTookLowGravity, {}, 0)
+ AddEvent(CheckOnBridge, {}, DoOnBridge, {}, 0)
+end
+
+function StartMission()
+ m2Choice = 2
+ m2DenseDead = 1
+
+ HideHog(cyborg)
+ HideHog(princess)
+ cyborgHidden = true
+ princessHidden = true
+ for i = 5, 8 do
+ HideHog(cannibals[i])
+ end
+
+ if m2DenseDead == 1 then
+ DeleteGear(dense)
+ if m2Choice == choiceAccepted then
+ SetupAnimAcceptedDied()
+ elseif m2Choice == choiceRefused then
+ SetupAnimRefusedDied()
+ else
+ SetupAnimAttacked()
+ end
+ SetupPlaceAlone()
+ SetupEventsAlone()
+ AddAnim(startAnim)
+ AddFunction({func = AfterStartAnim, args = {}})
+ else
+ if m2Choice == choiceAccepted then
+ SetupAnimAcceptedLived()
+ else
+ SetupAnimRefusedLived()
+ end
+ SetupPlaceDuo()
+ SetupEventsDuo()
+ AddAnim(startAnim)
+ AddFunction({func = AfterStartAnim, args = {}})
+ end
+end
+
+function SetupCourse()
+
+ ------ GIRDER LIST ------
+ PlaceGirder(1091, 1150, 6)
+ PlaceGirder(1091, 989, 6)
+ PlaceGirder(1091, 829, 6)
+ PlaceGirder(1091, 669, 6)
+ PlaceGirder(1091, 668, 6)
+ PlaceGirder(1091, 669, 6)
+ PlaceGirder(1088, 667, 6)
+ PlaceGirder(1091, 658, 6)
+ PlaceGirder(1091, 646, 6)
+ PlaceGirder(1091, 607, 6)
+ PlaceGirder(1091, 571, 6)
+ PlaceGirder(1376, 821, 6)
+ PlaceGirder(1145, 1192, 1)
+ PlaceGirder(1169, 1076, 3)
+ PlaceGirder(1351, 1082, 4)
+ PlaceGirder(1469, 987, 3)
+ PlaceGirder(1386, 951, 0)
+ PlaceGirder(1465, 852, 3)
+ PlaceGirder(1630, 913, 0)
+ PlaceGirder(1733, 856, 7)
+ PlaceGirder(1688, 713, 5)
+ PlaceGirder(1556, 696, 2)
+ PlaceGirder(1525, 696, 2)
+ PlaceGirder(1457, 697, 2)
+ PlaceGirder(1413, 700, 3)
+ PlaceGirder(1270, 783, 2)
+ PlaceGirder(1207, 825, 2)
+ PlaceGirder(1135, 775, 1)
+
+ ------ UTILITY CRATE LIST ------
+ SpawnUtilityCrate(1540, 628, amParachute)
+ SpawnAmmoCrate(1540, 100, amDynamite)
+ SpawnUtilityCrate(2175, 1815, amLowGravity)
+ SpawnUtilityCrate(2210, 1499, amFirePunch)
+ girderCrate = SpawnUtilityCrate(2300, 1663, amGirder)
+ SpawnUtilityCrate(610, 1394, amPickHammer)
+
+ ------ BARREL LIST ------
+ SetHealth(AddGear(1148, 736, gtExplosives, 0, 0, 0, 0), 20)
+
+end
+
+function PlaceCourseMines()
+ SetTimer(AddGear(1215, 1193, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1259, 1199, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1310, 1198, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1346, 1196, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1383, 1192, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1436, 1196, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1487, 1199, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1651, 1209, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1708, 1209, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1759, 1190, gtMine, 0, 0, 0, 0), 5000)
+ SetTimer(AddGear(1815, 1184, gtMine, 0, 0, 0, 0), 5000)
+end
+
+
+--////////////////////////////Event Functions////////////////////////
+function CheckTookFire()
+ return fireTaken
+end
+
+function DoTookFire()
+ AddAmmo(leaks, amFirePunch, 100)
+end
+
+function CheckTookGirder1()
+ return girder1Taken
+end
+
+function CheckTookGirder2()
+ return girder2Taken
+end
+
+function DoTookGirder1()
+ AddAmmo(dense, amGirder, 2)
+end
+
+function DoTookGirder2()
+ AddAmmo(dense, amGirder, 3)
+end
+
+function CheckDensePit()
+ return GetY(dense) < 1250 and StoppedGear(dense)
+end
+
+function DoDensePit()
+ AddAnim(outPitAnim)
+ AddFunction({func = AfterOutPitAnim, args = {}})
+end
+
+function CheckPastFlower()
+ if denseDead == true or leaksDead == true then
+ return false
+ end
+ return (GetX(dense) < startEventXDuo and StoppedGear(dense))
+ or (GetX(leaks) < startEventXDuo and StoppedGear(leaks))
+end
+
+function DoPastFlower()
+ AddAnim(pastFlowerAnim)
+ AddFunction({func = AfterPastFlowerAnim, args = {}})
+end
+
+
+function CheckLeaksDead()
+ return leaksDead
+end
+
+function DoLeaksDead()
+ AddCaption("The village, unprepared, was destroyed by the cyborgs...")
+ ParseCommand("teamgone Natives")
+end
+
+function CheckDenseDead()
+ return denseDead
+end
+
+function DoDenseDead()
+ AddCaption("The village, unprepared, was destroyed by the cyborgs...")
+ ParseCommand("teamgone Natives")
+end
+
+function CheckTookBlowTorch()
+ return blowTaken
+end
+
+function DoTookBlowTorch()
+ ShowMission("The Journey Back", "The Tunnel Maker", "Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate.", 0, 6000)
+end
+
+function CheckTookLowGravity()
+ return gravityTaken
+end
+
+function DoTookLowGravity()
+ ShowMission("The Journey Back", "The Moonwalk", "Hint: Select the LowGravity and press [Fire].", 0, 6000)
+end
+
+function CheckOnBridge()
+ return leaksDead == false and GetX(leaks) < 1651 and StoppedGear(leaks)
+end
+
+function DoOnBridge()
+ AddAnim(midAnim)
+ AddFunction({func = AfterMidAnimAlone, args = {}})
+end
+
+function CheckGirderTaken()
+ return girderTaken
+end
+
+function DoGirderTaken()
+ AddAmmo(leaks, amGirder, 2)
+-- AddAmmo(leaks, amGirder, 3)
+end
+
+function CheckOnFirstGirder()
+ return leaksDead == false and GetX(leaks) < 1160 and StoppedGear(leaks)
+end
+
+function DoOnFirstGirder()
+ PlaceCourseMines()
+ ShowMission("The Journey Back", "Slippery", "You'd better watch your steps...", 0, 4000)
+end
+
+function CheckTookSniper()
+ return sniperTaken and StoppedGear(leaks)
+end
+
+function DoTookSniper()
+ AddAnim(endAnim)
+ AddFunction({func = AfterEndAnimAlone, args = {}})
+end
+
+function CheckTookSniper2()
+ return sniperTaken and StoppedGear(leaks) and StoppedGear(dense)
+end
+
+function DoTookSniper2()
+ AddAnim(endAnim)
+ AddFunction({func = AfterEndAnimDuo, args = {}})
+end
+
+function CheckLost()
+ return princessDead
+end
+
+function DoLost()
+ AddAnim(endFailAnim)
+ AddFunction({func = ParseCommand, args = {'teamgone Natives'}})
+end
+
+function CheckWon()
+ return cyborgDead and not princessDead
+end
+
+function DoWon()
+ SaveCampaignVar("Progress", "3")
+ AddAnim(winAnim)
+ AddFunction({func = FinishWon, args = {}})
+end
+
+function FinishWon()
+ SwitchHog(leaks)
+ ParseCommand("teamgone Cannibal Sentry")
+ ParseCommand("teamgone 011101001")
+ TurnTimeLeft = 0
+end
+
+function CheckFailedCourse()
+ return TurnsLeft == 0
+end
+
+function DoFailedCourse()
+ AddAnim(failAnim)
+ AddFunction({func = AfterMidFailAnim, args = {}})
+end
+
+--////////////////////////////Main Functions/////////////////////////
+
+function onGameInit()
+ Seed = 0
+ TemplateFilter = 3
+ GameFlags = gfSolidLand + gfDisableWind
+ TurnTime = 25000
+ CaseFreq = 0
+ MinesNum = 0
+ MinesTime = 3000
+ Explosives = 0
+ Delay = 5
+ MapGen = 0
+ Theme = "Nature"
+ SuddenDeathTurns = 3000
+
+ AddTeam("Natives", 2567585, "Bone", "Island", "HillBilly", "cm_birdy")
+ leaks = AddHog("Leaks A Lot", 0, 100, "Rambo")
+ dense = AddHog("Dense Cloud", 0, 100, "RobinHood")
+
+ AddTeam("Cannibal Sentry", 14483456, "Skull", "Island", "Pirate","cm_vampire")
+ cannibals = {}
+ for i = 1, 4 do
+ cannibals[i] = AddHog(cannibalNames[i], 3, 40, "Zombi")
+ SetGearPosition(cannibals[i], unpack(cannibalPos[i]))
+ end
+
+ for i = 5, 8 do
+ cannibals[i] = AddHog(cannibalNames[i], 3, 40, "Zombi")
+ SetGearPosition(cannibals[i], 0, 0)
+ end
+
+ AddTeam("011101001", 14483456, "ring", "UFO", "Robot", "cm_star")
+ cyborg = AddHog("Y3K1337", 0, 200, "cyborg1")
+ princess = AddHog("Fell From Heaven", 0, 200, "tiara")
+
+ SetGearPosition(dense, 0, 0)
+ SetGearPosition(leaks, 0, 0)
+ SetGearPosition(cyborg, 0, 0)
+ SetGearPosition(princess, 0, 0)
+
+ AnimInit()
+end
+
+function onGameStart()
+ m2Choice = tonumber(GetCampaignVar("M2Choice"))
+ m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
+ m2RamonDead = tonumber(GetCampaignVar("M2RamonDead"))
+ m2SpikyDead = tonumber(GetCampaignVar("M2SpikyDead"))
+ StartMission()
+end
+
+function onGameTick()
+ AnimUnWait()
+ if ShowAnimation() == false then
+ return
+ end
+ ExecuteAfterAnimations()
+ CheckEvents()
+end
+
+function onGearDelete(gear)
+ if gear == blowCrate then
+ blowTaken = true
+ elseif gear == fireCrate then
+ fireTaken = true
+ elseif gear == gravityCrate then
+ gravityTaken = true
+ elseif gear == leaks then
+ leaksDead = true
+ elseif gear == dense then
+ denseDead = true
+ elseif gear == cyborg then
+ cyborgDead = true
+ elseif gear == princess then
+ princessDead = true
+ elseif gear == girderCrate then
+ girderTaken = true
+ elseif gear == girderCrate1 then
+ girder1Taken = true
+ elseif gear == girderCrate2 then
+ girder2Taken = true
+ elseif gear == sniperCrate then
+ sniperTaken = true
+ else
+ for i = 1, 4 do
+ if gear == cannibals[i] then
+ cannibalDead[i] = true
+ end
+ end
+ end
+end
+
+function onGearAdd(gear)
+end
+
+function onAmmoStoreInit()
+ SetAmmo(amBlowTorch, 0, 0, 0, 1)
+ SetAmmo(amParachute, 0, 0, 0, 1)
+ SetAmmo(amGirder, 0, 0, 0, 3)
+ SetAmmo(amLowGravity, 0, 0, 0, 1)
+ SetAmmo(amBaseballBat, 0, 0, 0, 1)
+ SetAmmo(amFirePunch, 0, 0, 0, 1)
+ SetAmmo(amSkip, 9, 0, 0, 0)
+ SetAmmo(amSwitch, 9, 0, 0, 0)
+ SetAmmo(amDEagle, 9, 0, 0, 0)
+ SetAmmo(amRope, 0, 0, 0, 1)
+ SetAmmo(amSniperRifle, 0, 0, 0, 1)
+ SetAmmo(amDynamite, 0, 0, 0, 1)
+ SetAmmo(amPickHammer, 0, 0, 0, 1)
+end
+
+function onNewTurn()
+ if AnimInProgress() then
+ TurnTimeLeft = -1
+ elseif stage == endStage and CurrentHedgehog ~= leaks then
+ AnimSwitchHog(leaks)
+ SetGearMessage(leaks, 0)
+ TurnTimeLeft = -1
+ elseif GetHogTeamName(CurrentHedgehog) ~= "Natives" then
+ for i = 1, 4 do
+ if cannibalDead[i] ~= true then
+ if GetX(cannibals[i]) < GetX(leaks) then
+ HogTurnLeft(cannibals[i], false)
+ else
+ HogTurnLeft(cannibals[i], true)
+ end
+ end
+ end
+ SetInputMask(band(0xFFFFFFFF, bnot(gmLeft + gmRight + gmLJump + gmHJump)))
+ else
+ SetInputMask(0xFFFFFFFF)
+ TurnsLeft = TurnsLeft - 1
+ end
+end
+
+function onGearDamage(gear, damage)
+end
+
+function onPrecise()
+ if GameTime > 2500 then
+ SetAnimSkip(true)
+ end
+end
+