share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/family.lua
branchwebgl
changeset 9521 8054d9d775fd
parent 9282 92af50454cf2
parent 9519 b8b5c82eb61b
child 9950 2759212a27de
equal deleted inserted replaced
9282:92af50454cf2 9521:8054d9d775fd
     1 HedgewarsScriptLoad("/Scripts/Locale.lua")
       
     2 HedgewarsScriptLoad("/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 = {45, 45, 45, 40, 40, 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 = {natives[1], GetX(natives[1]) + dif, GetY(natives[1]) + dif, vgtSteam, 0, true}, swh = false})
       
   112   AnimInsertStepNext({func = AnimVisualGear, args = {natives[1], GetX(natives[1]) + dif, GetY(natives[1]) + dif, vgtSteam, 0, true}, swh = false})
       
   113   AnimInsertStepNext({func = AnimVisualGear, args = {natives[1], GetX(natives[1]) + dif, GetY(natives[1]) + dif, vgtSteam, 0, true}, swh = false})
       
   114   AnimInsertStepNext({func = AnimWait, args = {natives[1], 800}})
       
   115   AnimInsertStepNext({func = AnimVisualGear, args = {natives[1], GetX(natives[1]) + dif, GetY(natives[1]) + dif, vgtSteam, 0, true}, swh = false})
       
   116   AnimInsertStepNext({func = AnimVisualGear, args = {natives[1], GetX(natives[1]) + dif, GetY(natives[1]) + dif, vgtSteam, 0, true}, swh = false})
       
   117   AnimInsertStepNext({func = AnimWait, args = {natives[1], 800}})
       
   118   AnimInsertStepNext({func = AnimVisualGear, args = {natives[1], GetX(natives[1]) + dif, GetY(natives[1]) + 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, SkipMidAnim, {})
       
   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 = 0
       
   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.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"), 1, 7000)
       
   190   vCirc = AddVisualGear(0,0,vgtCircle,0,true)
       
   191   SetVisualGearValues(vCirc, 2625, 1500, 100, 255, 1, 10, 0, 120, 3, 0xff00ffff)
       
   192 end
       
   193   
       
   194 function SkipMidAnim()
       
   195   AnimTeleportGear(natives[1], unpack(nativeMidPos2))
       
   196   SkipStartAnim()
       
   197 end
       
   198 
       
   199 function SetupPlace3()
       
   200   SpawnUtilityCrate(2086, 1887, amRope, 1)
       
   201   SpawnUtilityCrate(2147, 728, amBlowTorch, 2)
       
   202   SpawnUtilityCrate(2778, 1372, amPickHammer, 3)
       
   203   SpawnUtilityCrate(2579, 1886, amPickHammer, 3)
       
   204   SpawnUtilityCrate(2622, 1893, amGirder, 1)
       
   205   SpawnUtilityCrate(2671, 1883, amPortalGun, 3)
       
   206   SpawnUtilityCrate(2831, 1384, amGirder, 3)
       
   207 
       
   208   SetTimer(AddGear(2725, 1387, gtMine, 0, 0, 0, 0), 5000)
       
   209   SetTimer(AddGear(2760, 1351, gtMine, 0, 0, 0, 0), 5000)
       
   210 	SetTimer(AddGear(2805, 1287, gtMine, 0, 0, 0, 0), 5000)
       
   211 	SetTimer(AddGear(2831, 1376, gtMine, 0, 0, 0, 0), 5000)
       
   212 	SetTimer(AddGear(2684, 1409, gtMine, 0, 0, 0, 0), 5000)
       
   213 	SetTimer(AddGear(2637, 1428, gtMine, 0, 0, 0, 0), 5000)
       
   214 	SetTimer(AddGear(2278, 1280, gtMine, 0, 0, 0, 0), 5000)
       
   215 	SetTimer(AddGear(2311, 1160, gtMine, 0, 0, 0, 0), 5000)
       
   216 	SetTimer(AddGear(2339, 1162, gtMine, 0, 0, 0, 0), 5000)
       
   217 	SetTimer(AddGear(2362, 1184, gtMine, 0, 0, 0, 0), 5000)
       
   218 	SetTimer(AddGear(2407, 1117, gtMine, 0, 0, 0, 0), 5000)
       
   219 	SetTimer(AddGear(2437, 1143, gtMine, 0, 0, 0, 0), 5000)
       
   220 	SetTimer(AddGear(2472, 1309, gtMine, 0, 0, 0, 0), 5000)
       
   221 	SetTimer(AddGear(2495, 1331, gtMine, 0, 0, 0, 0), 5000)
       
   222 	SetTimer(AddGear(2536, 1340, gtMine, 0, 0, 0, 0), 5000)
       
   223 	SetTimer(AddGear(2569, 1360, gtMine, 0, 0, 0, 0), 5000)
       
   224 	SetTimer(AddGear(2619, 1379, gtMine, 0, 0, 0, 0), 5000)
       
   225 	SetTimer(AddGear(2596, 1246, gtMine, 0, 0, 0, 0), 5000)
       
   226 end
       
   227 
       
   228 function SkipStartAnim()
       
   229   AnimSwitchHog(natives[1])
       
   230   AnimWait(natives[1], 1)
       
   231 end
       
   232 
       
   233 function AfterStartAnim()
       
   234   HideHedge(cyborg)
       
   235   SetupPlace2()
       
   236   SetGearMessage(natives[1], 0)
       
   237   AddNewEvent(CheckGearDead, {natives[1]}, EndMission, {}, 0)
       
   238   AddNewEvent(CheckGearDead, {natives[2]}, EndMission, {}, 0)
       
   239   AddNewEvent(CheckGearDead, {natives[3]}, EndMission, {}, 0)
       
   240   AddNewEvent(CheckGearDead, {princess}, EndMission, {}, 0)
       
   241   AddNewEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0)
       
   242   for i = 1, cyborgsNum do
       
   243     AddNewEvent(CheckGearDead, {cyborgs[i]}, DoCyborgDead, {i}, 0)
       
   244   end
       
   245   AddNewEvent(CheckOutOfCluster, {}, DoOutOfCluster, {}, 1)
       
   246   AddNewEvent(CheckOutOfGrenade, {}, DoOutOfGrenade, {}, 1)
       
   247 --  AddNewEvent(CheckNeedToHide, {}, DoNeedToHide, {}, 1)
       
   248   TurnTimeLeft = TurnTime
       
   249   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!|Hint: You might want to spare a girder for cover!"), 1, 7000)
       
   250 end
       
   251 
       
   252 function SetupPlace2()
       
   253 	PlaceGirder(709, 564, 7)
       
   254 	PlaceGirder(591, 677, 7)
       
   255 	PlaceGirder(473, 794, 7)
       
   256 	PlaceGirder(433, 933, 5)
       
   257 	PlaceGirder(553, 1052, 5)
       
   258 	PlaceGirder(674, 1170, 5)
       
   259 	PlaceGirder(710, 1310, 7)
       
   260 	PlaceGirder(648, 1427, 5)
       
   261   PlaceGirder(2110, 980, 0)
       
   262 
       
   263 	SpawnAmmoCrate(814, 407, amBazooka, 4)
       
   264 	clusterCrate = SpawnAmmoCrate(862, 494, amClusterBomb, 4)
       
   265 	SpawnAmmoCrate(855, 486, amBee, 3)
       
   266 	grenadeCrate1 = SpawnAmmoCrate(849, 459, amGrenade, 4)
       
   267 	SpawnAmmoCrate(2077, 847, amWatermelon, 3)
       
   268 	grenadeCrate2 = SpawnAmmoCrate(2122, 847, amGrenade, 3)
       
   269 
       
   270 	SpawnUtilityCrate(747, 1577, amPickHammer, 1)
       
   271 	SpawnUtilityCrate(496, 1757, amGirder, 2)
       
   272   SpawnUtilityCrate(1809, 1880, amGirder, 1)
       
   273 	SpawnUtilityCrate(530, 1747, amPortalGun, 1)
       
   274 end
       
   275 
       
   276 -----------------------------Events------------------------------------
       
   277 function CheckPrincessFreed()
       
   278   if GetX(natives[1]) == nil or GetX(natives[2]) == nil or GetX(natives[3]) == nil or GetX(princess) == nil then
       
   279     return false
       
   280   end
       
   281   return math.abs(GetX(natives[1]) - GetX(princess)) <= 15 and math.abs(GetY(natives[1]) - GetY(princess)) <= 15 and StoppedGear(natives[1]) 
       
   282         and GetY(natives[2]) < 1500 and GetY(natives[3]) < 1500 and StoppedGear(natives[2]) and StoppedGear(natives[3])
       
   283 end
       
   284 
       
   285 function DoPrincessFreed()
       
   286   AnimSay(princess, loc("Thank you, my hero!"), SAY_SAY, 0)
       
   287   if progress and progress<7 then
       
   288     SaveCampaignVar("Progress", "7")
       
   289   end
       
   290   ParseCommand("teamgone " .. loc("011101001"))
       
   291   TurnTimeLeft = 0
       
   292 end
       
   293 
       
   294 function CheckCyborgsDead()
       
   295   return cyborgsLeft == 0
       
   296 end
       
   297 
       
   298 function DoCyborgsDead()
       
   299   SetGearMessage(CurrentHedgehog, 0)
       
   300   RestoreHedge(princess)
       
   301 --  RemoveEventFunc(CheckNeedToHide)
       
   302   AddAnim(midAnim)
       
   303   AddFunction({func = AfterMidAnim, args = {}})
       
   304 end
       
   305 
       
   306 function DoCyborgDead(index)
       
   307   if cyborgsLeft == 0 then
       
   308     return
       
   309   end
       
   310   if index == 1 then
       
   311     SpawnAmmoCrate(1700, 407, amBazooka, 3)
       
   312   elseif index == 2 then
       
   313     SpawnAmmoCrate(1862, 494, amClusterBomb, 3)
       
   314   elseif index == 3 then
       
   315   	SpawnAmmoCrate(1855, 486, amBee, 1)
       
   316   elseif index == 4 then
       
   317     SpawnAmmoCrate(1849, 459, amGrenade, 3)
       
   318   elseif index == 5 then
       
   319     SpawnAmmoCrate(2122, 847, amGrenade, 3)
       
   320   elseif index == 6 then
       
   321     SpawnAmmoCrate(2077, 847, amWatermelon, 1)
       
   322   end
       
   323 end
       
   324 
       
   325 function CheckGearsDead(gearList)
       
   326   for i = 1, # gearList do
       
   327     if gearDead[gearList[i]] ~= true then
       
   328       return false
       
   329     end
       
   330   end
       
   331   return true
       
   332 end
       
   333 
       
   334 
       
   335 function CheckGearDead(gear)
       
   336   return gearDead[gear]
       
   337 end
       
   338 
       
   339 function EndMission()
       
   340   RemoveEventFunc(CheckPrincessFreed)
       
   341   AddCaption("So the princess was never heard of again...")
       
   342   ParseCommand("teamgone " .. loc("Natives"))
       
   343   ParseCommand("teamgone " .. loc("011101001"))
       
   344   TurnTimeLeft = 0
       
   345 end
       
   346 
       
   347 function CheckOutOfCluster()
       
   348   return CheckGearDead(clusterCrate) and GetAmmoCount(natives[1], amClusterBomb) == 0
       
   349 end
       
   350 
       
   351 function CheckOutOfGrenade()
       
   352   return CheckGearDead(grenadeCrate1) and CheckGearDead(grenadeCrate2) and GetAmmoCount(natives[1], amGrenade) == 0
       
   353 end
       
   354 
       
   355 function DoOutOfCluster()
       
   356   if (GetX(natives[1]) == nil) then
       
   357     return
       
   358   end
       
   359   clusterCrate = SpawnAmmoCrate(GetX(natives[1]) - 50, GetY(natives[1]) - 50, amClusterBomb, 3)
       
   360 end
       
   361 
       
   362 function DoOutOfGrenade()
       
   363   if (GetX(natives[1]) == nil) then
       
   364     return
       
   365   end
       
   366   grenadeCrate2 = SpawnAmmoCrate(GetX(natives[1]) - 50, GetY(natives[1]) - 50, amGrenade, 3)
       
   367 end
       
   368 
       
   369 function CheckNeedToHide()
       
   370   if gearDead[princess] == true then
       
   371     return false
       
   372   end
       
   373   return TurnTimeLeft == 0
       
   374 end
       
   375 
       
   376 function DoNeedToHide()
       
   377   HideHedge(princess)
       
   378 end
       
   379 -----------------------------Misc--------------------------------------
       
   380 function HideHedge(hedge)
       
   381   if hedgeHidden[hedge] ~= true then
       
   382     HideHog(hedge)
       
   383     hedgeHidden[hedge] = true
       
   384   end
       
   385 end
       
   386 
       
   387 function RestoreHedge(hedge)
       
   388   if hedgeHidden[hedge] == true then
       
   389     RestoreHog(hedge)
       
   390     hedgeHidden[hedge] = false
       
   391   end
       
   392 end
       
   393 
       
   394 function GetVariables()
       
   395   progress = tonumber(GetCampaignVar("Progress"))
       
   396   m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum"))
       
   397   m2Choice = tonumber(GetCampaignVar("M2Choice"))
       
   398   m5Choice = tonumber(GetCampaignVar("M5Choice"))
       
   399 end
       
   400 
       
   401 function SetupPlace()
       
   402   SetHogHat(natives[1], nativeHats[m5DeployedNum])
       
   403   SetHogName(natives[1], nativeNames[m5DeployedNum])
       
   404   if m2Choice ~= choiceAccepted or m5Choice ~= choiceEliminate then
       
   405     DeleteGear(cyborgs[cyborgsNum])
       
   406     cyborgsNum = cyborgsNum - 1
       
   407   end
       
   408   HideHedge(cyborg)
       
   409 end
       
   410 
       
   411 function SetupAmmo()
       
   412   AddAmmo(cyborgs[1], amBazooka, 100)
       
   413   AddAmmo(cyborgs[1], amGrenade, 100)
       
   414   AddAmmo(cyborgs[1], amClusterBomb, 100)
       
   415   AddAmmo(cyborgs[1], amSniperRifle, 1)
       
   416   AddAmmo(cyborgs[1], amDynamite, 100)
       
   417   AddAmmo(cyborgs[1], amBaseballBat, 100)
       
   418   AddAmmo(cyborgs[1], amMolotov, 100)
       
   419   AddAmmo(cyborgs[1], amWatermelon, 1)
       
   420   AddAmmo(cyborgs[1], amAirStrike, 2)
       
   421   AddAmmo(cyborgs[1], amDrillStrike, 1)
       
   422 end
       
   423 
       
   424 function AddHogs()
       
   425 	AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy")
       
   426   for i = 7, 9 do
       
   427     natives[i-6] = AddHog(nativeNames[i], 0, 100, nativeHats[i])
       
   428     gearDead[natives[i-6]] = false
       
   429   end
       
   430 
       
   431   AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star")
       
   432   cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
       
   433   princess = AddHog(loc("Fell From Heaven"), 0, 333, "tiara")
       
   434   gearDead[cyborg] = false
       
   435   gearDead[princess] = false
       
   436 
       
   437   AddTeam(loc("Biomechanic Team"), 14483456, "ring", "UFO", "Robot", "cm_star")
       
   438   for i = 1, cyborgsNum do
       
   439     cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2")
       
   440     gearDead[cyborgs[i]] = false
       
   441   end
       
   442   cyborgsLeft = cyborgsNum
       
   443 
       
   444   for i = 1, 3 do
       
   445     AnimSetGearPosition(natives[i], unpack(nativePos[i]))
       
   446   end
       
   447 
       
   448   AnimSetGearPosition(cyborg, unpack(cyborgPos))
       
   449   AnimSetGearPosition(princess, unpack(princessPos))
       
   450   AnimTurn(princess, "Left")
       
   451 
       
   452   for i = 1, cyborgsNum do
       
   453     AnimSetGearPosition(cyborgs[i], unpack(cyborgsPos[i]))
       
   454     AnimTurn(cyborgs[i], cyborgsDir[i])
       
   455   end
       
   456 end
       
   457 
       
   458 function CondNeedToTurn(hog1, hog2)
       
   459   xl, xd = GetX(hog1), GetX(hog2)
       
   460   if xl == nil or xd == nil then
       
   461     return
       
   462   end
       
   463   if xl > xd then
       
   464     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
       
   465     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
       
   466   elseif xl < xd then
       
   467     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}})
       
   468     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}})
       
   469   end
       
   470 end
       
   471 
       
   472 -----------------------------Main Functions----------------------------
       
   473 
       
   474 function onGameInit()
       
   475 	Seed = 0
       
   476 	GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableGirders
       
   477 	TurnTime = 60000 
       
   478 	CaseFreq = 0
       
   479 	MinesNum = 0
       
   480 	MinesTime = 3000
       
   481 	Explosives = 0
       
   482 	Delay = 10 
       
   483   MapGen = 2
       
   484 	Theme = "Hell"
       
   485   SuddenDeathTurns = 35
       
   486 
       
   487 	for i = 1, #map do
       
   488 		ParseCommand('draw ' .. map[i])
       
   489 	end
       
   490 
       
   491   AddHogs()
       
   492   AnimInit()
       
   493 end
       
   494 
       
   495 function onGameStart()
       
   496   GetVariables()
       
   497   SetupAmmo()
       
   498   SetupPlace()
       
   499   AnimationSetup()
       
   500   AddAnim(startAnim)
       
   501   AddFunction({func = AfterStartAnim, args = {}})
       
   502 end
       
   503 
       
   504 function onGameTick()
       
   505   AnimUnWait()
       
   506   if ShowAnimation() == false then
       
   507     return
       
   508   end
       
   509   ExecuteAfterAnimations()
       
   510   CheckEvents()
       
   511 end
       
   512 
       
   513 function onGearDelete(gear)
       
   514   gearDead[gear] = true
       
   515   if GetGearType(gear) == gtHedgehog then
       
   516     if GetHogTeamName(gear) == loc("Biomechanic Team") then
       
   517       cyborgsLeft = cyborgsLeft - 1
       
   518     end
       
   519   end
       
   520 end
       
   521 
       
   522 function onAmmoStoreInit()
       
   523   SetAmmo(amSkip, 9, 0, 0, 0)
       
   524   SetAmmo(amSwitch, 9, 0, 0, 0)
       
   525 	SetAmmo(amBazooka, 0, 0, 0, 8)
       
   526 	SetAmmo(amClusterBomb,0, 0, 0, 8)
       
   527 	SetAmmo(amBee, 0, 0, 0, 3)
       
   528 	SetAmmo(amGrenade, 0, 0, 0, 8)
       
   529 	SetAmmo(amWatermelon, 0, 0, 0, 2)
       
   530 	SetAmmo(amSniperRifle, 0, 0, 0, 3)
       
   531 	SetAmmo(amPickHammer, 0, 0, 0, 1)
       
   532 	SetAmmo(amGirder, 0, 0, 0, 3)
       
   533 	SetAmmo(amPortalGun, 0, 0, 0, 1)
       
   534 end
       
   535 
       
   536 function onNewTurn()
       
   537   if AnimInProgress() then
       
   538     TurnTimeLeft = -1
       
   539     return
       
   540   end
       
   541   if GetHogTeamName(CurrentHedgehog) == loc("011101001") then
       
   542     if CheckCyborgsDead() ~= true then
       
   543       for i = 1, 3 do
       
   544         if gearDead[natives[i]] ~= true then
       
   545           HideHedge(natives[i])
       
   546         end
       
   547       end
       
   548     end
       
   549     TurnTimeLeft = 0
       
   550   else
       
   551     for i = 1, 3 do
       
   552       if gearDead[natives[i]] ~= true then
       
   553         RestoreHedge(natives[i])
       
   554       end
       
   555     end
       
   556   end
       
   557 end
       
   558 
       
   559 function onPrecise()
       
   560   if GameTime > 2500 and AnimInProgress() then
       
   561     SetAnimSkip(true)
       
   562     return
       
   563   end
       
   564 --  HideHedge(princess)
       
   565 --  for i = 1, 5 do
       
   566 --    DeleteGear(cyborgs[i])
       
   567 --  end
       
   568 --  AddAmmo(natives[1], amTeleport, 100)
       
   569 end