share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/family.lua
changeset 7434 3daea8c9a770
child 7436 4802191f6a09
equal deleted inserted replaced
7431:fee9ae17c007 7434:3daea8c9a770
       
     1 loadfile(GetDataPath() .. "Scripts/Locale.lua")()
       
     2 loadfile(GetDataPath() .. "Scripts/Animate.lua")()
       
     3 
       
     4 -----------------------------Map--------------------------------------
       
     5 local map = 
       
     6 {
       
     7 	"\255\242\4\218\132\0\53\4\253\0\0\53\4\253\132\0\102\5\92\0\0\102\5\92\132\0\106\5\205\0\0\106\5\205\132\1\1\6\37\0",
       
     8 	"\1\1\6\37\132\1\124\6\160\0\1\113\6\160\132\2\157\6\111\0\2\164\6\107\132\2\252\6\178\0\2\252\6\178\132\3\224\4\179\0",
       
     9 	"\3\224\4\179\132\3\38\2\209\0\3\38\2\209\132\4\109\3\179\0\4\109\3\179\132\5\124\3\172\0\5\128\3\172\132\6\69\4\239\0",
       
    10 	"\6\69\4\239\132\7\175\4\32\0\7\172\4\46\132\8\116\5\18\0\3\38\2\213\132\3\41\1\244\0\3\41\1\244\132\3\94\2\245\0",
       
    11 	"\8\127\5\8\132\8\127\0\14\0\8\127\0\14\132\8\194\5\29\0\8\194\5\29\132\9\36\5\82\0\9\29\5\75\132\9\180\5\103\0",
       
    12 	"\9\194\5\92\132\10\51\6\5\0\10\51\6\5\132\10\216\5\152\0\10\227\5\145\132\11\189\5\212\0\11\189\5\212\132\12\91\5\131\0",
       
    13 	"\12\91\5\131\132\12\253\5\191\0\12\253\5\191\132\13\149\5\106\0\13\149\5\106\132\16\11\5\106\0\14\19\5\110\132\14\16\4\236\0",
       
    14 	"\14\16\4\236\132\15\66\4\236\0\15\66\4\236\132\15\66\5\110\0\14\79\4\194\132\15\6\4\194\0\14\255\4\176\132\14\255\4\49\0",
       
    15 	"\14\255\4\49\132\14\76\4\53\0\14\76\4\53\132\14\76\4\201\0\14\125\4\74\128\14\128\4\187\0\14\188\4\77\128\14\185\4\179\0",
       
    16 	"\14\111\4\39\129\14\76\3\252\0\14\72\3\249\129\14\72\3\147\0\14\72\3\147\129\14\97\3\235\0\14\97\3\235\129\14\146\4\28\0",
       
    17 	"\14\202\4\28\129\14\248\3\238\0\14\248\3\238\129\15\17\3\133\0\15\17\3\133\129\15\27\3\235\0\15\27\3\235\129\14\230\4\49\0",
       
    18 	"\1\124\6\220\130\1\244\7\13\0\1\244\7\13\130\2\104\6\206\0\2\100\6\206\130\2\30\6\178\0\2\12\6\181\130\1\135\6\213\0",
       
    19 	"\3\172\7\136\130\15\41\7\136\0\15\41\7\136\130\15\41\7\62\0\15\41\7\62\130\3\175\7\52\0\3\175\7\52\130\3\126\6\206\0",
       
    20 	"\3\126\6\206\130\3\122\7\133\0\3\122\7\133\130\3\186\7\136\0\8\123\7\94\136\9\173\7\101\0\8\88\7\66\130\8\88\7\119\0",
       
    21 	"\9\212\7\69\130\9\212\7\126\0\8\155\0\14\133\8\151\5\11\0\8\190\2\160\131\8\194\5\1\0\14\83\3\235\131\14\114\4\21\0",
       
    22 	"\15\10\3\196\131\15\10\3\235\0\15\10\3\235\131\14\220\4\32\0\14\65\5\47\137\15\20\5\36\0\15\41\5\82\132\15\41\5\82\0",
       
    23 	"\3\94\3\17\138\4\137\5\124\0\3\221\3\119\138\5\57\4\250\0\4\102\4\67\160\5\26\4\74\0\4\113\5\36\161\5\142\4\222\0",
       
    24 	"\4\42\5\216\169\9\89\6\26\0\6\100\5\22\145\8\134\5\64\0\6\255\4\197\140\7\161\4\120\0\7\214\4\204\146\7\214\4\204\0",
       
    25 	"\10\55\6\97\147\11\13\5\247\0\11\59\6\26\146\11\224\6\30\0\12\95\6\16\153\14\55\6\90\0\13\173\5\226\153\15\196\5\212\0",
       
    26 	"\15\172\7\91\152\15\165\5\230\0\15\235\7\221\142\255\238\7\207\0\14\248\6\188\152\3\217\6\178\0\3\112\6\83\143\3\31\7\101\0",
       
    27 	"\3\73\7\143\140\3\73\7\143\0\15\62\7\13\140\15\62\7\13\0\15\101\7\157\140\15\101\7\157\0\2\181\6\220\141\1\205\7\108\0",
       
    28 	"\2\86\6\160\137\2\150\6\128\0\2\26\6\153\134\1\96\6\195\0\1\82\6\241\136\1\226\7\59\0\2\157\7\98\155\2\157\7\98\0",
       
    29 	"\1\64\7\80\149\255\249\7\27\0\1\4\6\174\148\0\25\6\86\0\0\211\6\58\139\0\7\5\219\0\0\35\5\159\142\0\4\5\47\0",
       
    30 	"\8\123\0\14\199\8\187\0\11\0\16\14\5\99\199\16\14\7\245\0\255\235\4\218\199\255\238\8\25\0\8\67\2\72\202\8\208\2\72\0",
       
    31 	"\8\141\1\251\202\8\141\0\74\0\8\201\2\143\195\8\204\4\49\0\8\84\2\185\205\8\204\2\188\0\8\99\2\230\205\8\187\2\230\0",
       
    32 	"\8\165\3\41\131\8\144\3\3\0\8\144\3\3\131\8\60\2\248\0\8\60\2\248\131\7\252\3\59\0\7\252\3\59\131\8\137\3\31\0",
       
    33 	"\8\56\3\20\131\8\102\3\20\0\8\60\3\13\194\8\60\3\13\0\8\60\3\3\128\8\60\3\31\0\7\238\3\66\128\7\214\3\84\0",
       
    34 	"\7\217\3\87\128\7\217\3\98\0\7\217\3\87\128\7\200\3\91\0\6\209\4\70\208\8\18\4\95\0\0\11\4\225\131\0\0\8\21\0",
       
    35 	"\15\224\5\99\131\15\245\7\252\0\15\242\5\191\192\15\196\6\33\0\15\196\6\33\192\15\245\6\209\0\15\245\6\209\192\15\193\7\115\0",
       
    36 	"\15\193\7\115\192\15\235\8\18\0\15\249\5\223\196\15\217\6\40\0\15\217\6\40\196\16\4\6\188\0\15\245\6\16\196\16\21\7\77\0",
       
    37 	"\16\0\6\245\196\15\214\7\112\0\15\207\7\129\196\16\0\8\4\0\15\245\7\80\196\16\4\7\207\0\15\221\5\85\196\16\11\5\184\0",
       
    38 }
       
    39 --------------------------------------------Constants------------------------------------
       
    40 choiceAccepted = 1
       
    41 choiceRefused = 2
       
    42 choiceAttacked = 3
       
    43 
       
    44 choiceEliminate = 1
       
    45 choiceSpare = 2
       
    46 
       
    47 leaksNum = 1
       
    48 denseNum = 2
       
    49 waterNum = 3
       
    50 buffaloNum = 4
       
    51 chiefNum = 5
       
    52 girlNum = 6
       
    53 wiseNum = 7
       
    54 
       
    55 nativeNames = {loc("Leaks A Lot"), loc("Dense Cloud"), loc("Fiery Water"), 
       
    56                loc("Raging Buffalo"), loc("Righteous Beard"), loc("Fell From Grace"),
       
    57                loc("Wise Oak"), loc("Ramon"), loc("Spiky Cheese")
       
    58               }
       
    59 
       
    60 nativeUnNames = {loc("Zork"), loc("Steve"), loc("Jack"),
       
    61                  loc("Lee"), loc("Elmo"), loc("Rachel"),
       
    62                  loc("Muriel")}
       
    63 
       
    64 nativeHats = {"Rambo", "RobinHood", "pirate_jack", "zoo_Bunny", "IndianChief",
       
    65               "tiara", "AkuAku", "rasta", "hair_yellow"}
       
    66 
       
    67 nativePos = {{110, 1310}, {984, 1907}, {1040, 1907}}
       
    68 nativePos2 = {196, 1499}
       
    69 
       
    70 cyborgNames = {loc("Unit 0x0007"), loc("Hogminator"), loc("Carol"), 
       
    71                loc("Blender"), loc("Elderbot"), loc("Fiery Water")}
       
    72 cyborgsDif = {2, 2, 2, 2, 2, 1}
       
    73 cyborgsHealth = {90, 90, 90, 80, 80, 20}
       
    74 cyborgPos = {945, 1216}
       
    75 cyborgsNum = 6
       
    76 cyborgsPos = {{2243, 1043}, {3588, 1227}, {2781, 1388},
       
    77               {3749, 1040}, {2475, 1338}, {3853, 881}}
       
    78 cyborgsDir = {"Left", "Left", "Left", "Left", "Left", "Right"}
       
    79 
       
    80 princessPos = {3737, 1181}
       
    81 crateConsts = {}
       
    82 reactions = {}
       
    83 
       
    84 nativeMidPos = {1991, 841}
       
    85 cyborgMidPos = {2109, 726}
       
    86 nativeMidPos2 = {2250, 1071}
       
    87 -----------------------------Variables---------------------------------
       
    88 natives = {}
       
    89 native = nil
       
    90 
       
    91 cyborgs = {}
       
    92 cyborg = nil
       
    93 
       
    94 gearDead = {}
       
    95 hedgeHidden = {}
       
    96 
       
    97 startAnim = {}
       
    98 midAnim = {}
       
    99 
       
   100 freshDead = nil
       
   101 crates = {}
       
   102 cratesNum = 0
       
   103 -----------------------------Animations--------------------------------
       
   104 function EmitDenseClouds(dir)
       
   105   local dif
       
   106   if dir == "Left" then
       
   107     dif = 10
       
   108   else
       
   109     dif = -10
       
   110   end
       
   111   AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
       
   112   AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
       
   113   AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
       
   114   AnimInsertStepNext({func = AnimWait, args = {native, 800}})
       
   115   AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
       
   116   AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
       
   117   AnimInsertStepNext({func = AnimWait, args = {native, 800}})
       
   118   AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
       
   119 end
       
   120 
       
   121 function AnimationSetup()
       
   122   table.insert(startAnim, {func = AnimWait, args = {natives[1], 4000}})
       
   123   table.insert(startAnim, {func = AnimMove, args = {natives[1], "Right", unpack(nativePos2)}})
       
   124   if m5DeployedNum == leaksNum then
       
   125     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Those aliens are destroying the island!"), SAY_THINK, 5000}})
       
   126   elseif m5DeployedNum == denseNum then
       
   127     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Dude, all the plants are gone!"), SAY_THINK, 3500}})
       
   128     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What am I gonna...eat, yo?"), SAY_THINK, 3500}})
       
   129   elseif m5DeployedNum == girlNum then
       
   130     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Fell From Heaven is the best! Fell From Heaven is the greatest!"), SAY_THINK, 7000}})
       
   131     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Yuck! I bet they'll keep worshipping her even after I save the village!"), SAY_THINK, 7500}})
       
   132   elseif m5DeployedNum == chiefNum then
       
   133     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I'm getting old for this!"), SAY_THINK, 4000}})
       
   134   elseif m5DeployedNum == waterNum then
       
   135     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I'm getting thirsty..."), SAY_THINK, 3000}})
       
   136   elseif m5DeployedNum == buffaloNum then
       
   137     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I wonder why I'm so angry all the time..."), SAY_THINK, 6000}})
       
   138     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("It must be a childhood trauma..."), SAY_THINK, 4000}})
       
   139     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Just wait till I get my hands on that trauma! ARGH!"), SAY_THINK, 6500}})
       
   140   elseif m5DeployedNum == wiseNum then
       
   141     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I could just teleport myself there..."), SAY_THINK, 4500}})
       
   142     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("It's a shame, I forgot how to do that!"), SAY_THINK, 4500}})
       
   143   end
       
   144   table.insert(startAnim, {func = AnimCustomFunction, args = {natives[1], RestoreHedge, {cyborg}}})
       
   145   table.insert(startAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgPos)}})
       
   146   table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}})
       
   147   table.insert(startAnim, {func = AnimTurn, args = {natives[2], "Left"}})
       
   148   table.insert(startAnim, {func = AnimTurn, args = {natives[3], "Left"}})
       
   149   table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Hello again, ") .. nativeUnNames[m5DeployedNum] .. "!", SAY_SAY, 2500}})
       
   150   table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("I just found out that they have captured your princess!"), SAY_SAY, 7000}})
       
   151   if m5DeployedNum == girlNum then
       
   152     table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Of course I have to save her. What did I expect?!"), SAY_SAY, 7000}})
       
   153   elseif m5DeployedNum == denseNum then
       
   154     table.insert(startAnim, {func = AnimCustomFunction, args = {natives[1], EmitDenseClouds, {"Right"}}})
       
   155   end
       
   156   table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("She's behind that tall thingy."), SAY_SAY, 5000}})
       
   157   table.insert(startAnim, {func = FollowGear, swh = false, args = {princess}})
       
   158   table.insert(startAnim, {func = AnimWait, swh = false, args = {princess, 1000}})
       
   159   table.insert(startAnim, {func = FollowGear, swh = false, args = {cyborg}})
       
   160   table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("I'm here to help you rescue her."), SAY_SAY, 5000}})
       
   161   table.insert(startAnim, {func = AnimSay, args = {natives[2], loc("Yo, dude, we're here, too!"), SAY_SHOUT, 4000}})
       
   162   table.insert(startAnim, {func = AnimSay, args = {natives[3], loc("We were trying to save her and we got lost."), SAY_SHOUT, 6000}})
       
   163   table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("That's typical of you!"), SAY_SAY, 3000}})
       
   164   table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why are you helping us, uhm...?"), SAY_SAY, 3000}})
       
   165   table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Call me Beep! Well, 'cause I'm such a nice...person!"), SAY_SAY, 2500}})
       
   166   table.insert(startAnim, {func = AnimDisappear, args = {cyborg, unpack(cyborgPos)}})
       
   167   table.insert(startAnim, {func = AnimSwitchHog, args = {natives[1]}})
       
   168   table.insert(startAnim, {func = AnimWait, args = {natives[1], 1}})
       
   169   AddSkipFunction(startAnim, SkipStartAnim, {})
       
   170 
       
   171   table.insert(midAnim, {func = AnimCustomFunction, args = {natives[1], RestoreHedge, {cyborg}}})
       
   172   table.insert(midAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgMidPos)}}) 
       
   173   table.insert(midAnim, {func = AnimTurn, args = {cyborg, "Left"}})
       
   174   table.insert(midAnim, {func = AnimTeleportGear, args = {natives[1], unpack(nativeMidPos)}})
       
   175   table.insert(midAnim, {func = AnimSay, args = {cyborg, loc("Here, let me help you save her!"), SAY_SAY, 5000}})
       
   176   table.insert(midAnim, {func = AnimSay, args = {natives[1], loc("Thanks!"), SAY_SAY, 2000}})
       
   177   table.insert(midAnim, {func = AnimTeleportGear, args = {natives[1], unpack(nativeMidPos2)}})
       
   178   table.insert(midAnim, {func = AnimSay, args = {natives[1], loc("Why can't he just let her go?!"), SAY_THINK, 5000}})
       
   179   AddSkipFunction(midAnim, SkipStartAnim, {})
       
   180 end
       
   181 
       
   182 --------------------------Anim skip functions--------------------------
       
   183 function AfterMidAnim()
       
   184   HideHedge(cyborg)
       
   185   SetupPlace3()
       
   186   SetGearMessage(natives[1], 0)
       
   187   AddNewEvent(CheckPrincessFreed, {}, DoPrincessFreed, {}, 0)
       
   188   TurnTimeLeft = TurnTime
       
   189   ShowMission(loc("Family Reunion"), loc("Salvation"), loc("Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything."), 1, 7000)
       
   190 end
       
   191   
       
   192 function SetupPlace3()
       
   193   SpawnUtilityCrate(2086, 1887, amRope, 1)
       
   194   SpawnUtilityCrate(2147, 728, amBlowTorch, 2)
       
   195   SpawnUtilityCrate(2778, 1372, amPickHammer, 2)
       
   196   SpawnUtilityCrate(2579, 1886, amPickHammer, 2)
       
   197   SpawnUtilityCrate(2622, 1893, amGirder, 1)
       
   198   SpawnUtilityCrate(2671, 1883, amPortalGun, 3)
       
   199   SpawnUtilityCrate(2831, 1384, amGirder, 3)
       
   200 
       
   201   SetTimer(AddGear(2725, 1387, gtMine, 0, 0, 0, 0), 5000)
       
   202   SetTimer(AddGear(2760, 1351, gtMine, 0, 0, 0, 0), 5000)
       
   203 	SetTimer(AddGear(2805, 1287, gtMine, 0, 0, 0, 0), 5000)
       
   204 	SetTimer(AddGear(2831, 1376, gtMine, 0, 0, 0, 0), 5000)
       
   205 	SetTimer(AddGear(2684, 1409, gtMine, 0, 0, 0, 0), 5000)
       
   206 	SetTimer(AddGear(2637, 1428, gtMine, 0, 0, 0, 0), 5000)
       
   207 	SetTimer(AddGear(2278, 1280, gtMine, 0, 0, 0, 0), 5000)
       
   208 	SetTimer(AddGear(2311, 1160, gtMine, 0, 0, 0, 0), 5000)
       
   209 	SetTimer(AddGear(2339, 1162, gtMine, 0, 0, 0, 0), 5000)
       
   210 	SetTimer(AddGear(2362, 1184, gtMine, 0, 0, 0, 0), 5000)
       
   211 	SetTimer(AddGear(2407, 1117, gtMine, 0, 0, 0, 0), 5000)
       
   212 	SetTimer(AddGear(2437, 1143, gtMine, 0, 0, 0, 0), 5000)
       
   213 	SetTimer(AddGear(2472, 1309, gtMine, 0, 0, 0, 0), 5000)
       
   214 	SetTimer(AddGear(2495, 1331, gtMine, 0, 0, 0, 0), 5000)
       
   215 	SetTimer(AddGear(2536, 1340, gtMine, 0, 0, 0, 0), 5000)
       
   216 	SetTimer(AddGear(2569, 1360, gtMine, 0, 0, 0, 0), 5000)
       
   217 	SetTimer(AddGear(2619, 1379, gtMine, 0, 0, 0, 0), 5000)
       
   218 	SetTimer(AddGear(2596, 1246, gtMine, 0, 0, 0, 0), 5000)
       
   219 end
       
   220 
       
   221 function SkipStartAnim()
       
   222   AnimSwitchHog(natives[1])
       
   223   AnimWait(natives[1], 1)
       
   224 end
       
   225 
       
   226 function AfterStartAnim()
       
   227   HideHedge(cyborg)
       
   228   SetupPlace2()
       
   229   SetGearMessage(natives[1], 0)
       
   230   AddNewEvent(CheckGearDead, {natives[1]}, EndMission, {}, 0)
       
   231   AddNewEvent(CheckGearDead, {natives[2]}, EndMission, {}, 0)
       
   232   AddNewEvent(CheckGearDead, {natives[3]}, EndMission, {}, 0)
       
   233   AddNewEvent(CheckGearDead, {princess}, EndMission, {}, 0)
       
   234   AddNewEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0)
       
   235   for i = 1, cyborgsNum do
       
   236     AddNewEvent(CheckGearDead, {cyborgs[i]}, DoCyborgDead, {i}, 0)
       
   237   end
       
   238   TurnTimeLeft = TurnTime
       
   239   ShowMission(loc("Family Reunion"), loc("Hostage Situation"), loc("Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!"), 1, 7000)
       
   240 end
       
   241 
       
   242 function SetupPlace2()
       
   243 	PlaceGirder(709, 564, 7)
       
   244 	PlaceGirder(591, 677, 7)
       
   245 	PlaceGirder(473, 794, 7)
       
   246 	PlaceGirder(433, 933, 5)
       
   247 	PlaceGirder(553, 1052, 5)
       
   248 	PlaceGirder(674, 1170, 5)
       
   249 	PlaceGirder(710, 1310, 7)
       
   250 	PlaceGirder(648, 1427, 5)
       
   251   PlaceGirder(2110, 980, 0)
       
   252 
       
   253 	SpawnAmmoCrate(814, 407, amBazooka, 8)
       
   254 	SpawnAmmoCrate(862, 494, amClusterBomb, 8)
       
   255 	SpawnAmmoCrate(855, 486, amBee, 5)
       
   256 	SpawnAmmoCrate(849, 459, amGrenade, 8)
       
   257 	SpawnAmmoCrate(2077, 847, amWatermelon, 3)
       
   258 	SpawnAmmoCrate(2122, 847, amGrenade, 8)
       
   259 
       
   260 	SpawnUtilityCrate(747, 1577, amPickHammer, 1)
       
   261 	SpawnUtilityCrate(496, 1757, amGirder, 2)
       
   262   SpawnUtilityCrate(1809, 1880, amGirder, 1)
       
   263 	SpawnUtilityCrate(530, 1747, amPortalGun, 1)
       
   264 end
       
   265 
       
   266 -----------------------------Events------------------------------------
       
   267 function CheckPrincessFreed()
       
   268   return math.abs(GetX(natives[1]) - GetX(princess)) <= 10 and math.abs(GetX(natives[1]) - GetX(princess)) <= 10 and StoppedGear(natives[1]) 
       
   269         and GetY(natives[2]) < 1500 and GetY(natives[3]) < 1500 and StoppedGear(natives[2]) and StoppedGear(natives[3])
       
   270 end
       
   271 
       
   272 function DoPrincessFreed()
       
   273   AnimSay(princess, loc("Thank you, my hero!"), SAY_SAY, 0)
       
   274   SaveCampaignVar("Progress", "7")
       
   275   ParseCommand("teamgone " .. loc("011101001"))
       
   276   TurnTimeLeft = 0
       
   277 end
       
   278 
       
   279 function CheckCyborgsDead()
       
   280   return cyborgsLeft == 0
       
   281 end
       
   282 
       
   283 function DoCyborgsDead()
       
   284   AddAnim(midAnim)
       
   285   AddFunction({func = AfterMidAnim, args = {}})
       
   286 end
       
   287 
       
   288 function DoCyborgDead(index)
       
   289   if cyborgsLeft == 0 then
       
   290     return
       
   291   end
       
   292   if index == 1 then
       
   293     SpawnAmmoCrate(1700, 407, amBazooka, 3)
       
   294   elseif index == 2 then
       
   295     SpawnAmmoCrate(1862, 494, amClusterBomb, 3)
       
   296   elseif index == 3 then
       
   297   	SpawnAmmoCrate(1855, 486, amBee, 1)
       
   298   elseif index == 4 then
       
   299     SpawnAmmoCrate(1849, 459, amGrenade, 3)
       
   300   elseif index == 5 then
       
   301     SpawnAmmoCrate(2122, 847, amGrenade, 3)
       
   302   elseif index == 6 then
       
   303     SpawnAmmoCrate(2077, 847, amWatermelon, 1)
       
   304   end
       
   305 end
       
   306 
       
   307 function CheckGearsDead(gearList)
       
   308   for i = 1, # gearList do
       
   309     if gearDead[gearList[i]] ~= true then
       
   310       return false
       
   311     end
       
   312   end
       
   313   return true
       
   314 end
       
   315 
       
   316 
       
   317 function CheckGearDead(gear)
       
   318   return gearDead[gear] and retry == false
       
   319 end
       
   320 
       
   321 function EndMission()
       
   322   AddCaption("So the princess was never heard of again...")
       
   323   ParseCommand("teamgone " .. loc("Natives"))
       
   324   ParseCommand("teamgone " .. loc("011101001"))
       
   325   TurnTimeLeft = 0
       
   326 end
       
   327 
       
   328 -----------------------------Misc--------------------------------------
       
   329 function HideHedge(hedge)
       
   330   if hedgeHidden[hedge] ~= true then
       
   331     HideHog(hedge)
       
   332     hedgeHidden[hedge] = true
       
   333   end
       
   334 end
       
   335 
       
   336 function RestoreHedge(hedge)
       
   337   if hedgeHidden[hedge] == true then
       
   338     RestoreHog(hedge)
       
   339     hedgeHidden[hedge] = false
       
   340   end
       
   341 end
       
   342 
       
   343 function GetVariables()
       
   344   m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum"))
       
   345   m2Choice = tonumber(GetCampaignVar("M2Choice"))
       
   346   m5Choice = tonumber(GetCampaignVar("M5Choice"))
       
   347 end
       
   348 
       
   349 function SetupPlace()
       
   350   SetHogHat(natives[1], nativeHats[m5DeployedNum])
       
   351   SetHogName(natives[1], nativeNames[m5DeployedNum])
       
   352   if m2Choice ~= choiceAccepted or m5Choice ~= choiceEliminate then
       
   353     DeleteGear(cyborgs[cyborgsNum])
       
   354     cyborgsNum = cyborgsNum - 1
       
   355   end
       
   356   HideHedge(cyborg)
       
   357   AddGear(princessPos[1], princessPos[2], gtCase, 0, 0, 0, 0)
       
   358 end
       
   359 
       
   360 function SetupEvents()
       
   361 end
       
   362 
       
   363 function SetupAmmo()
       
   364   AddAmmo(cyborgs[1], amBazooka, 100)
       
   365   AddAmmo(cyborgs[1], amGrenade, 100)
       
   366   AddAmmo(cyborgs[1], amClusterBomb, 100)
       
   367   AddAmmo(cyborgs[1], amSniperRifle, 1)
       
   368   AddAmmo(cyborgs[1], amDynamite, 100)
       
   369   AddAmmo(cyborgs[1], amBaseballBat, 100)
       
   370   AddAmmo(cyborgs[1], amMolotov, 100)
       
   371 end
       
   372 
       
   373 function AddHogs()
       
   374 	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
       
   375   for i = 7, 9 do
       
   376     natives[i-6] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
       
   377     gearDead[natives[i-6]] = false
       
   378   end
       
   379 
       
   380   AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star")
       
   381   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
       
   382   princess = AddHog(loc("Fell From Heaven"), 0, 133, "tiara")
       
   383   gearDead[cyborg] = false
       
   384   gearDead[princess] = false
       
   385 
       
   386   AddTeam(loc("Biomechanic Team"), 14483457, "ring", "UFO", "Robot", "cm_star")
       
   387   for i = 1, cyborgsNum do
       
   388     cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2")
       
   389     gearDead[cyborgs[i]] = false
       
   390   end
       
   391   cyborgsLeft = cyborgsNum
       
   392 
       
   393   for i = 1, 3 do
       
   394     SetGearPosition(natives[i], unpack(nativePos[i]))
       
   395   end
       
   396 
       
   397   SetGearPosition(cyborg, unpack(cyborgPos))
       
   398   SetGearPosition(princess, unpack(princessPos))
       
   399 
       
   400   for i = 1, cyborgsNum do
       
   401     SetGearPosition(cyborgs[i], unpack(cyborgsPos[i]))
       
   402     AnimTurn(cyborgs[i], cyborgsDir[i])
       
   403   end
       
   404 end
       
   405 
       
   406 function CondNeedToTurn(hog1, hog2)
       
   407   xl, xd = GetX(hog1), GetX(hog2)
       
   408   if xl > xd then
       
   409     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
       
   410     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
       
   411   elseif xl < xd then
       
   412     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}})
       
   413     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}})
       
   414   end
       
   415 end
       
   416 
       
   417 -----------------------------Main Functions----------------------------
       
   418 
       
   419 function onGameInit()
       
   420 	Seed = 0
       
   421 	GameFlags = gfOneClanMode + gfSolidLand + gfDisableLandObjects + gfDisableGirders
       
   422 	TurnTime = 60000 
       
   423 	CaseFreq = 0
       
   424 	MinesNum = 0
       
   425 	MinesTime = 3000
       
   426 	Explosives = 0
       
   427 	Delay = 10 
       
   428   MapGen = 2
       
   429 	Theme = "Hell"
       
   430   SuddenDeathTurns = 25
       
   431 
       
   432 	for i = 1, #map do
       
   433 		ParseCommand('draw ' .. map[i])
       
   434 	end
       
   435 
       
   436   AddHogs()
       
   437   AnimInit()
       
   438 end
       
   439 
       
   440 function onGameStart()
       
   441   GetVariables()
       
   442   SetupAmmo()
       
   443   SetupPlace()
       
   444   AnimationSetup()
       
   445   SetupEvents()
       
   446   AddAnim(startAnim)
       
   447   AddFunction({func = AfterStartAnim, args = {}})
       
   448 end
       
   449 
       
   450 function onGameTick()
       
   451   AnimUnWait()
       
   452   if ShowAnimation() == false then
       
   453     return
       
   454   end
       
   455   ExecuteAfterAnimations()
       
   456   CheckEvents()
       
   457 end
       
   458 
       
   459 function onGearDelete(gear)
       
   460   gearDead[gear] = true
       
   461   if GetGearType(gear) == gtHedgehog then
       
   462     if GetHogTeamName(gear) == loc("Biomechanic Team") then
       
   463       cyborgsLeft = cyborgsLeft - 1
       
   464     end
       
   465   end
       
   466 end
       
   467 
       
   468 function onGearAdd(gear)
       
   469 end
       
   470 
       
   471 function onAmmoStoreInit()
       
   472   SetAmmo(amSkip, 9, 0, 0, 0)
       
   473   SetAmmo(amSwitch, 9, 0, 0, 0)
       
   474 	SetAmmo(amBazooka, 0, 0, 0, 8)
       
   475 	SetAmmo(amClusterBomb,0, 0, 0, 8)
       
   476 	SetAmmo(amBee, 0, 0, 0, 3)
       
   477 	SetAmmo(amGrenade, 0, 0, 0, 8)
       
   478 	SetAmmo(amWatermelon, 0, 0, 0, 2)
       
   479 	SetAmmo(amSniperRifle, 0, 0, 0, 3)
       
   480 	SetAmmo(amPickHammer, 0, 0, 0, 1)
       
   481 	SetAmmo(amGirder, 0, 0, 0, 3)
       
   482 	SetAmmo(amPortalGun, 0, 0, 0, 1)
       
   483 end
       
   484 
       
   485 function onNewTurn()
       
   486   if AnimInProgress() then
       
   487     TurnTimeLeft = -1
       
   488     return
       
   489   end
       
   490   if GetHogTeamName(CurrentHedgehog) == loc("011101001") then
       
   491     TurnTimeLeft = 0
       
   492   elseif GetHogTeamName(CurrentHedgehog) == loc("Biomechanic Team") then
       
   493     HideHedge(princess)
       
   494   else
       
   495     RestoreHedge(princess)
       
   496   end
       
   497 end
       
   498 
       
   499 function onGearDamage(gear, damage)
       
   500 end
       
   501 
       
   502 function onPrecise()
       
   503   if GameTime > 2500 and AnimInProgress() then
       
   504     SetAnimSkip(true)
       
   505   end
       
   506 end