HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") -----------------------------Map-------------------------------------- local map = { "\0\91\4\253\131\0\88\0\46\0\0\91\0\49\131\15\196\0\53\0\15\196\0\53\131\15\196\4\250\0\255\242\7\179\131\1\128\7\214\0", "\1\113\7\207\131\3\182\7\157\0\3\175\7\143\131\6\58\7\200\0\6\76\7\193\131\6\188\7\129\0\6\188\7\129\131\6\248\6\216\0", "\6\248\6\216\131\7\52\8\14\0\10\206\8\0\131\11\203\6\65\0\11\203\6\65\131\12\18\7\66\0\12\18\7\69\131\16\0\7\69\0", "\0\109\1\1\131\2\111\0\49\0\2\111\0\49\131\3\133\1\18\0\3\140\1\18\131\4\162\0\165\0\4\162\0\165\131\5\135\1\29\0", "\5\145\1\22\131\8\84\0\232\0\8\84\0\232\131\9\26\0\70\0\9\26\0\70\131\10\5\1\4\0\10\48\0\243\131\10\2\1\8\0", "\10\58\0\243\131\10\118\1\15\0\10\118\1\15\131\10\234\1\173\0\11\10\1\177\131\12\11\1\22\0\12\39\1\40\131\12\243\2\9\0", "\12\243\2\9\131\13\106\0\165\0\13\131\0\176\131\15\186\1\78\0\1\244\0\81\136\0\120\0\84\0\1\99\0\123\137\0\130\0\215\0", "\0\158\0\130\143\0\158\0\130\0\2\216\0\88\138\4\165\0\102\0\4\91\0\127\142\3\129\0\197\0\3\69\0\134\142\3\69\0\134\0", "\4\215\0\120\143\8\88\0\134\0\8\187\0\84\139\8\187\0\84\0\8\239\0\70\135\8\239\0\70\0\8\60\0\187\138\5\99\0\222\0", "\5\61\0\197\138\5\61\0\197\0\9\99\0\81\137\10\23\0\218\0\9\187\0\77\137\11\31\1\117\0\10\30\0\88\137\15\161\0\109\0", "\15\126\0\225\144\13\177\0\116\0\15\150\0\144\139\15\157\1\26\0\10\202\0\169\152\12\246\0\169\0\10\72\0\144\145\11\122\1\36\0", "\11\17\1\121\141\11\17\1\121\0\12\229\1\194\138\12\229\1\194\0\12\208\1\85\150\12\208\1\85\0\12\148\1\15\147\12\148\1\15\0", "\13\145\0\208\147\13\145\0\208\0\6\238\7\45\135\7\10\7\238\0\6\220\7\150\135\6\206\7\242\0\6\174\7\175\135\6\135\8\7\0", "\6\118\7\214\135\6\62\7\238\0\6\30\7\245\140\3\217\7\210\0\3\161\7\221\138\255\252\7\231\0\15\242\7\165\148\11\115\7\175\0", "\11\196\6\164\138\11\10\8\4\0\11\210\7\31\141\11\210\7\31\0\14\216\2\72\166\14\216\2\72\0\14\213\4\4\166\14\213\4\4\0", "\13\216\1\159\148\13\216\1\159\0\13\159\2\143\148\13\159\2\143\0\13\230\3\69\145\13\230\3\69\0\13\163\4\11\145\13\166\4\11\0", "\13\237\4\208\145\13\237\4\208\0\14\195\5\61\145\14\195\5\61\0\13\78\1\254\136\13\78\1\254\0\12\239\2\93\136\12\239\2\93\0", "\12\250\2\227\136\12\250\2\227\0\13\71\3\59\136\13\71\3\59\0\13\1\3\168\136\13\1\3\168\0\12\243\4\32\136\12\246\4\32\0", "\13\40\4\130\136\13\43\4\134\0\13\92\4\243\136\13\92\4\243\0\13\142\5\135\136\13\142\5\135\0\14\33\5\106\136\14\33\5\106\0", "\14\111\5\208\136\14\121\5\216\0\15\13\5\237\136\15\13\5\237\0\15\73\5\128\136\15\73\5\128\0\15\84\4\243\136\15\84\4\243\0", "\14\199\6\33\133\14\199\6\33\0\14\97\6\44\133\14\83\6\44\0\14\9\5\240\133\14\9\5\240\0\13\226\5\163\133\13\226\5\163\0", "\13\170\5\233\133\13\170\5\233\0\13\71\5\205\133\13\71\5\205\0\13\61\5\117\133\13\61\5\117\0\13\22\5\40\133\13\22\5\40\0", "\12\253\4\211\133\12\253\4\211\0\12\197\4\169\133\12\197\4\169\0\12\204\4\106\133\12\204\4\106\0\12\162\4\46\133\12\162\4\42\0", "\12\194\3\200\133\12\194\3\196\0\12\201\3\84\133\12\201\3\84\0\12\253\3\62\133\12\253\3\62\0\12\169\2\241\133\12\169\2\241\0", "\12\187\2\167\133\12\187\2\167\0\12\158\2\93\133\12\158\2\93\0\12\162\2\9\133\12\162\2\9\0\12\123\1\205\132\12\123\1\205\0", "\12\84\1\251\132\12\84\1\251\0\12\91\2\55\132\12\95\2\55\0\12\63\2\139\132\12\63\2\139\0\12\120\2\164\132\12\120\2\164\0", "\12\81\2\206\132\12\81\2\206\0\12\106\3\17\132\12\109\3\20\0\12\137\3\73\132\12\137\3\73\0\12\84\3\122\132\12\84\3\122\0", "\12\137\3\150\132\12\137\3\150\0\12\95\3\217\132\12\95\3\217\0\12\134\3\231\132\12\134\3\231\0\12\106\4\63\132\12\106\4\63\0", "\12\137\4\120\132\12\141\4\120\0\12\88\4\179\132\12\88\4\183\0\12\134\4\190\132\12\134\4\190\0\12\158\4\232\132\12\165\4\232\0", "\12\215\5\15\132\12\215\5\15\0\12\91\4\243\130\12\91\4\243\0\12\144\5\26\130\12\144\5\26\0\12\176\5\54\130\12\176\5\54\0", "\12\225\5\82\130\12\225\5\82\0\13\4\5\117\130\13\1\5\117\0\12\239\5\166\130\12\239\5\166\0\13\8\5\184\130\13\11\5\184\0", "\13\8\5\226\130\13\8\5\226\0\13\54\6\12\130\13\57\6\12\0\13\106\6\2\130\13\106\5\254\0\13\138\6\12\130\13\138\6\12\0", "\13\184\6\30\130\13\187\6\30\0\13\223\5\254\130\13\223\5\254\0\13\149\6\69\130\13\145\6\69\0\13\128\6\33\130\13\128\6\33\0", "\13\85\6\40\130\13\85\6\40\0\12\232\6\2\130\12\232\6\2\0\12\204\5\205\130\12\204\5\201\0\12\183\5\159\130\12\183\5\156\0", "\12\211\5\128\130\12\211\5\128\0\12\165\5\103\130\12\165\5\103\0\12\123\5\64\130\12\120\5\64\0\12\81\5\71\130\12\81\5\71\0", "\12\84\5\18\130\12\84\5\18\0\12\39\4\243\130\12\39\4\243\0\12\35\4\194\130\12\35\4\194\0\12\63\4\127\130\12\63\4\127\0", "\12\91\4\106\130\12\91\4\106\0\12\53\4\60\130\12\53\4\60\0\12\74\4\25\130\12\84\4\21\0\12\120\4\4\130\12\120\4\4\0", "\12\42\3\231\130\12\42\3\231\0\12\39\3\189\130\12\42\3\186\0\12\60\3\175\130\12\60\3\175\0\12\39\3\133\130\12\39\3\133\0", "\12\70\3\73\130\12\70\3\73\0\12\25\3\77\130\12\25\3\77\0\12\42\3\13\130\12\46\3\13\0\12\81\3\31\130\12\81\3\31\0", "\12\32\2\213\130\12\32\2\213\0\12\14\2\178\130\12\14\2\178\0\12\42\2\181\130\12\46\2\181\0\12\14\2\128\130\12\14\2\128\0", "\12\39\2\100\130\12\42\2\100\0\12\74\2\104\130\12\77\2\104\0\12\106\2\135\130\12\109\2\135\0\12\39\2\72\130\12\39\2\69\0", "\12\35\2\37\130\12\35\2\37\0\12\32\2\2\130\12\32\2\2\0\12\28\1\226\130\12\28\1\223\0\12\63\1\208\130\12\63\1\208\0", "\12\84\1\173\130\12\84\1\170\0\12\63\1\159\130\12\60\1\159\0\12\39\1\113\130\12\39\1\113\0\12\14\1\96\130\12\11\1\96\0", "\11\228\1\131\130\11\228\1\135\0\12\7\1\149\130\12\7\1\149\0\12\21\1\177\130\12\25\1\177\0\11\242\1\201\130\11\242\1\201\0", "\13\226\6\58\130\13\226\6\58\0\14\16\6\40\130\14\16\6\40\0\13\208\6\86\130\13\208\6\86\0\13\247\6\111\130\13\247\6\114\0", "\13\184\6\121\130\13\184\6\121\0\13\198\6\146\130\13\201\6\146\0\13\244\6\139\130\13\244\6\139\0\13\223\6\185\130\13\223\6\185\0", "\13\173\6\199\130\13\173\6\199\0\13\159\6\171\130\13\159\6\171\0\13\138\6\220\130\13\138\6\220\0\13\184\6\238\130\13\184\6\238\0", "\13\208\6\223\130\13\208\6\223\0\13\216\7\10\130\13\216\7\10\0\13\184\7\10\130\13\180\7\10\0\13\142\7\38\130\13\142\7\41\0", "\13\128\7\6\130\13\128\7\6\0\13\85\7\34\130\13\89\7\34\0\13\89\7\3\130\13\89\7\3\0\13\117\6\220\130\13\121\6\220\0", "\13\75\6\195\130\13\75\6\195\0\13\110\6\164\130\13\110\6\164\0\13\156\6\125\130\13\156\6\125\0\13\106\6\135\130\13\106\6\135\0", "\13\103\6\100\130\13\103\6\100\0\13\64\6\143\130\13\64\6\143\0\13\47\6\104\130\13\47\6\104\0\13\71\6\79\130\13\71\6\79\0", "\13\40\6\65\130\13\36\6\65\0\13\8\6\44\130\13\1\6\44\0\13\8\6\76\130\13\8\6\76\0\13\1\6\132\130\13\1\6\132\0", "\13\33\6\135\130\13\33\6\135\0\13\26\6\178\130\13\22\6\178\0\13\47\6\202\130\13\50\6\202\0\13\54\6\245\130\13\54\6\245\0", "\13\22\7\3\130\13\22\7\3\0\13\43\7\27\130\13\43\7\27\0\12\253\6\248\130\12\250\6\248\0\12\253\6\220\130\12\253\6\220\0", "\12\215\6\174\130\12\225\6\174\0\12\253\6\174\130\12\253\6\174\0\12\215\6\121\130\12\215\6\121\0\12\229\6\76\130\12\229\6\76\0", "\12\201\6\51\130\12\201\6\51\0\12\190\6\19\130\12\190\6\19\0\12\151\5\223\130\12\151\5\223\0\12\148\5\194\130\12\151\5\194\0", "\12\155\5\159\130\12\155\5\156\0\12\144\5\121\130\12\144\5\121\0\12\95\5\110\130\12\95\5\110\0\12\102\5\156\130\12\102\5\159\0", "\12\99\5\216\130\12\106\5\219\0\12\148\6\40\130\12\148\6\40\0\12\127\6\19\130\12\127\6\19\0\12\176\6\104\130\12\176\6\104\0", "\12\141\6\72\130\12\141\6\72\0\12\162\6\139\130\12\162\6\143\0\12\172\6\181\130\12\172\6\181\0\12\204\6\216\130\12\208\6\216\0", "\12\201\7\3\130\12\201\7\3\0\12\236\7\24\130\12\236\7\24\0\12\120\6\146\130\12\120\6\146\0\12\123\6\104\130\12\123\6\104\0", "\12\123\6\185\130\12\123\6\185\0\12\162\6\227\130\12\162\6\227\0\12\134\6\241\130\12\134\6\241\0\12\155\7\10\130\12\155\7\10\0", "\12\190\7\41\130\12\190\7\41\0\11\228\1\96\129\11\228\1\96\0\11\200\1\121\129\11\200\1\121\0\11\193\1\156\129\11\196\1\156\0", "\11\221\1\170\129\11\221\1\170\0\11\217\1\208\129\11\217\1\208\0\11\245\1\230\129\11\245\1\230\0\11\245\2\16\129\11\245\2\16\0", "\12\14\2\62\129\12\18\2\62\0\11\242\2\93\129\11\242\2\93\0\11\235\2\178\129\11\235\2\178\0\11\231\2\238\129\11\235\2\238\0", "\12\4\2\252\129\12\4\2\252\0\11\252\3\34\129\11\252\3\34\0\11\235\3\87\129\11\238\3\87\0\12\11\3\119\129\12\11\3\119\0", "\12\4\3\168\129\12\4\3\168\0\11\245\3\200\129\11\245\3\200\0\11\252\3\238\129\11\252\3\242\0\12\11\4\7\129\12\11\4\7\0", "\11\245\4\60\129\11\238\4\60\0\11\224\4\74\129\11\221\4\74\0\11\210\4\137\129\11\210\4\137\0\11\228\4\151\129\11\231\4\151\0", "\11\242\4\130\129\11\242\4\130\0\12\4\4\113\129\12\7\4\113\0\12\28\4\102\129\12\28\4\102\0\12\11\4\141\129\12\11\4\141\0", "\11\249\4\162\129\11\249\4\162\0\11\221\4\116\129\11\221\4\116\0\11\214\4\106\129\11\217\4\102\0\12\4\4\211\129\12\4\4\211\0", "\11\249\5\8\129\11\252\5\8\0\12\39\5\11\129\12\42\5\11\0\12\56\5\50\129\12\60\5\47\0\12\46\5\96\129\12\49\5\96\0", "\12\70\5\113\129\12\70\5\113\0\12\56\5\166\129\12\63\5\166\0\12\70\5\145\129\12\74\5\145\0\12\70\5\194\129\12\77\5\194\0", "\12\70\5\237\129\12\74\5\237\0\12\106\5\240\129\12\109\5\240\0\12\99\6\33\129\12\99\6\33\0\12\88\6\72\129\12\88\6\72\0", "\12\91\6\107\129\12\95\6\107\0\12\77\6\146\129\12\81\6\146\0\12\88\6\181\129\12\91\6\181\0\12\91\6\220\129\12\99\6\220\0", "\12\113\7\10\129\12\116\7\10\0\8\116\4\18\179\8\116\4\18\0\9\205\3\73\156\9\205\3\73\0\10\83\2\146\144\10\83\2\146\0", "\10\153\2\44\136\10\153\2\44\0\10\181\1\240\132\10\181\1\240\0\10\199\1\205\131\10\199\1\205\0\10\209\1\184\129\10\209\1\184\0", "\8\42\2\167\150\8\42\2\167\0\8\53\1\240\141\8\53\1\237\0\8\67\1\135\134\8\67\1\135\0\11\224\5\8\129\11\224\5\8\0", "\11\200\5\8\129\11\200\5\8\0\11\182\5\8\129\11\182\5\8\0\11\154\5\4\129\11\154\5\4\0\11\129\5\8\129\11\129\5\8\0", "\11\119\3\84\129\11\119\3\84\0\11\140\3\87\129\11\140\3\87\0\11\165\3\87\129\11\165\3\87\0\11\182\3\87\129\11\182\3\87\0", "\11\203\3\87\129\11\203\3\87\0\9\33\6\223\132\9\33\8\11\0\9\33\6\188\129\9\33\6\188\0\0\123\1\26\136\0\211\2\223\0", "\0\211\2\223\136\0\120\3\84\0\0\130\3\101\136\0\211\4\53\0\0\204\4\53\136\0\120\4\151\0\0\130\3\193\136\0\127\4\63\0", "\0\130\3\31\136\0\130\1\201\0\0\91\4\253\130\0\91\6\76\0\7\94\3\136\138\7\94\3\136\0\7\24\3\77\135\7\24\3\77\0", "\6\238\3\24\132\6\241\3\24\0\6\223\2\238\131\6\223\2\238\0\6\220\2\209\129\6\220\2\209\0\7\87\4\14\133\7\87\4\14\0", "\7\38\4\0\131\7\38\4\0\0\7\6\3\242\130\7\6\3\242\0\6\241\3\228\129\6\241\3\228\0\6\227\3\217\128\6\227\3\217\0", "\0\109\4\197\135\0\162\5\99\0\0\144\5\121\135\0\123\6\9\0\0\127\5\92\135\0\127\5\92\0\0\127\5\54\135\0\127\5\54\0", "\0\134\6\23\132\0\236\6\97\0\0\236\6\97\132\1\106\6\135\0\1\117\6\135\132\1\177\6\143\0\2\234\7\80\130\3\69\7\80\0", "\3\69\7\80\130\3\84\7\101\0\3\84\7\101\130\3\87\7\129\0\3\87\7\129\130\3\84\7\150\0\0\183\5\103\130\1\92\5\159\0", "\1\11\5\138\130\0\253\5\180\0\0\253\5\180\130\0\158\5\166\0\0\239\4\60\131\1\166\4\95\0\2\104\3\133\131\3\84\3\129\0", "\4\162\2\181\131\4\162\3\147\0\3\115\2\26\131\4\74\2\30\0\2\23\1\54\131\2\230\1\54\0\0\204\2\5\131\1\194\2\5\0", "\4\74\2\33\131\5\226\1\223\0\0\225\5\121\197\1\135\5\163\0\0\204\5\173\197\1\1\5\173\0\0\179\5\152\131\1\57\5\163\0", "\1\57\5\159\131\1\106\5\219\0\0\165\5\226\130\0\253\5\230\0\0\253\5\230\130\1\8\5\159\0\1\254\6\86\131\1\254\6\86\0", "\1\254\6\33\131\1\254\6\33\0\1\254\5\230\131\1\254\5\230\0\1\254\5\170\131\1\254\5\170\0\1\254\5\113\131\1\254\5\113\0", "\1\251\6\5\129\1\251\6\5\0\1\254\5\201\129\1\254\5\201\0\1\254\5\138\129\1\254\5\138\0\1\254\6\58\129\1\254\6\58\0", "\1\254\5\78\129\1\254\5\78\0\2\2\5\40\131\2\2\5\40\0\2\2\4\246\131\2\2\4\246\0\1\237\4\204\131\1\237\4\204\0", "\2\40\4\190\131\2\40\4\190\0\6\160\7\52\223\7\27\7\126\0\1\219\4\172\204\1\219\4\172\0\2\37\4\183\197\2\37\4\183\0", "\3\98\3\122\131\3\126\3\84\0\3\126\3\84\131\3\126\3\52\0\3\126\3\41\131\3\80\3\24\0\3\80\3\24\131\3\112\2\248\0", "\3\112\2\248\131\3\98\2\188\0", } -----------------------------Constants--------------------------------- choiceAccepted = 1 choiceRefused = 2 choiceAttacked = 3 choiceEliminate = 1 choiceSpare = 2 leaksNum = 1 denseNum = 2 waterNum = 3 buffaloNum = 4 chiefNum = 5 girlNum = 6 wiseNum = 7 nativeNames = {loc("Leaks A Lot"), loc("Dense Cloud"), loc("Fiery Water"), loc("Raging Buffalo"), loc("Righteous Beard"), loc("Fell From Grace"), loc("Wise Oak")} nativeUnNames = {loc("Zork"), loc("Steve"), loc("Jack"), loc("Lee"), loc("Elmo"), loc("Rachel"), loc("Muriel")} nativeHats = {"Rambo", "RobinHood", "pirate_jack", "zoo_Bunny", "IndianChief", "tiara", "AkuAku"} nativePos = {257, 1950} cyborgNames = {loc("Syntax Errol"), loc("Segmentation Paul"), loc("Unexpected Igor"), loc("Jeremiah")} cyborgPos = {745, 1847} cyborgsPos = {{2937, 831}, {2945, 1264}, {2335, 1701}, {448, 484}} cyborgsDir = {"Left", "Left", "Left", "Right"} cratePos = { {{788, 1919, amGirder, 2}, true}, {{412, 1615, amGirder, 1}, true}, {{209, 1474, amSniperRifle, 1}}, {{1178, 637, amDEagle, 1}}, {{633, 268, amDEagle, 1}}, {{3016, 1545, amDEagle, 1}}, {{249, 1377, amRope, 3}, true}, {{330, 1018, amGirder, 1}, true}, {{888, 647, amRope, 3}, true}, {{2116, 337, amRope, 3}, true}, {{1779, 948, amRope, 3}, true}, {{3090, 1066, amRope, 3}, true}, {{947, 480, amBazooka, 3}}, {{1097, 480, amMortar, 3}}, {{1139, 451, amSnowball, 3}}, {{1207, 468, amShotgun, 3}}, {{1024, 393, amSniperRifle, 2}}, {{998, 391, amDynamite, 2}}, {{1024, 343, amRope, 2}, true}, {{998, 341, amRope, 2}, true}, } reactions = {loc("Yeah, take that!"), loc("Bullseye"), loc("Die, die, die!")} secondPos = {{1010, 510}, {1067, 510}} -----------------------------Variables--------------------------------- natives = {} native = nil cyborgs = {} cyborg = {} cyborgsLeft = 0 gearDead = {} hedgeHidden = {} startAnim = {} killAnim = {} killedAnim = {} freshDead = nil crates = {} cratesNum = 0 jetCrate = nil firstTurn = true cyborgsKilledBeforeCrates = false cratesTaken = false doneCyborgsDead = false -----------------------------Animations-------------------------------- function EmitDenseClouds(dir) local dif if dir == "Left" then dif = 10 else dif = -10 end AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false}) AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false}) AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false}) AnimInsertStepNext({func = AnimWait, args = {native, 800}}) AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false}) AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false}) AnimInsertStepNext({func = AnimWait, args = {native, 800}}) AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false}) end function AnimationSetup() startAnim = {} local m = m5DeployedNum table.insert(startAnim, {func = AnimWait, args = {native, 3000}}) table.insert(startAnim, {func = AnimCaption, args = {native, string.format(loc("With the rest of the tribe gone, it was up to %s to save the village."), nativeNames[m5DeployedNum]), 5000}}) table.insert(startAnim, {func = AnimCaption, args = {native, loc("But it proved to be no easy task!"), 2000}}) for i = 1, 4 do table.insert(startAnim, {func = FollowGear, swh = false, args = {cyborgs[i]}}) table.insert(startAnim, {func = AnimWait, args = {native, 1000}}) end table.insert(startAnim, {func = FollowGear, swh = false, args = {native}}) if m == leaksNum then table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("What a strange cave!"), SAY_THINK, 0}}) table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("Now how do I get on the other side?!"), SAY_THINK, 5500}}) elseif m == denseNum then table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("Dude, what's this place?!"), SAY_THINK, 0}}) table.insert(startAnim, {func = AnimCustomFunction, args = {native, EmitDenseClouds, {"Right"}}}) table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("And where's all the weed?"), SAY_THINK, 4000}}) elseif m == waterNum then table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("Is this place in my head?"), SAY_THINK, 0}}) table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("I shouldn't have drunk that last pint."), SAY_THINK, 6000}}) elseif m == buffaloNum then table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("Where did that alien run?"), SAY_THINK, 0}}) table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("When I find it..."), SAY_THINK, 3000}}) elseif m == girlNum then table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("This is typical!"), SAY_THINK, 0}}) table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("It's always up to women to clear up the mess men created!"), SAY_THINK, 8500}}) elseif m == chiefNum then table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("What is this place?"), SAY_THINK, 0}}) table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("It doesn't matter. I won't let that alien hurt my daughter!"), SAY_THINK, 8500}}) elseif m == wiseNum then table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("Every single time!"), SAY_THINK, 0}}) table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("How come in a village full of warriors, it's up to me to save it?"), SAY_THINK, 8500}}) end table.insert(startAnim, {func = AnimCustomFunction, args = {native, RestoreHedge, {cyborg, unpack(cyborgPos)}}}) table.insert(startAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgPos)}}) table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}}) table.insert(startAnim, {func = AnimSay, args = {cyborg, string.format(loc("Greetings, %s!"), nativeUnNames[m]), SAY_SAY, 2500}}) table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("As you can see, there is no way to get on the other side!"), SAY_SAY, 7000}}) table.insert(startAnim, {func = AnimSay, args = {cyborg, string.format(loc("I wish to help you, %s!"), nativeUnNames[m]), SAY_SAY, 4000}}) table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Beware, though! If you are slow, you die!"), SAY_SAY, 7000}}) table.insert(startAnim, {func = AnimDisappear, args = {cyborg, unpack(cyborgPos)}}) table.insert(startAnim, {func = AnimSwitchHog, args = {native}}) table.insert(startAnim, {func = AnimCustomFunction, args = {native, HideHedge, {cyborg}}}) table.insert(startAnim, {func = AnimSay, args = {native, loc("Talk about mixed signals..."), SAY_SAY, 4000}}) AddSkipFunction(startAnim, SkipStartAnim, {}) end function SetupKillAnim() table.insert(killAnim, {func = AnimSay, args = {native, loc("Well, that was a waste of time."), SAY_THINK, 5000}}) table.insert(killAnim, {func = AnimCustomFunction, args = {native, RestoreHedge, {cyborg, unpack(cyborgPos)}}}) table.insert(killAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgPos)}}) table.insert(killAnim, {func = AnimCustomFunction, args = {cyborg, CondNeedToTurn, {cyborg, native}}}) table.insert(killAnim, {func = AnimSay, args = {cyborg, string.format(loc("You bear impressive skills, %s!"), nativeUnNames[m5DeployedNum]), SAY_SHOUT, 4000}}) if CheckCyborgsDead() then table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("I see you already took care of your enemies."), SAY_SHOUT, 7000}}) table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("Those were scheduled for disposal anyway."), SAY_SHOUT, 4000}}) table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("So you basically did the dirty work for us."), SAY_SHOUT, 4000}}) cyborgsKilledBeforeCrates = true else table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("However, my mates don't agree with me on letting you go..."), SAY_SHOUT, 7000}}) table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("I guess you'll have to kill them."), SAY_SHOUT, 4000}}) end table.insert(killAnim, {func = AnimDisappear, args = {cyborg, unpack(cyborgPos)}}) table.insert(killAnim, {func = AnimSwitchHog, args = {native}}) table.insert(killAnim, {func = AnimWait, args = {native, 1}}) table.insert(killAnim, {func = AnimCustomFunction, args = {native, HideHedge, {cyborg}}}) local function checkCyborgsAgain() if CheckCyborgsDead() then DoCyborgsDead() end end table.insert(killAnim, {func = AnimCustomFunction, args = {native, checkCyborgsAgain, {}}}) AddSkipFunction(killAnim, SkipKillAnim, {}) end function SetupKilledAnim() table.insert(killedAnim, {func = AnimWait, args = {cyborg, 500}}) table.insert(killedAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(secondPos[2])}}) table.insert(killedAnim, {func = AnimOutOfNowhere, args = {native, unpack(secondPos[1])}}) table.insert(killedAnim, {func = AnimCustomFunction, args = {cyborg, CondNeedToTurn, {cyborg, native}}}) if not cyborgsKilledBeforeCrates then table.insert(killedAnim, {func = AnimSay, args = {cyborg, string.format(loc("Nice work, %s!"), nativeUnNames[m5DeployedNum]), SAY_SHOUT, 4000}}) end table.insert(killedAnim, {func = AnimSay, args = {cyborg, loc("As a reward for your performance, here's some new technology!"), SAY_SHOUT, 8000}}) table.insert(killedAnim, {func = AnimSay, args = {cyborg, loc("Use it wisely!"), SAY_SHOUT, 3000}}) table.insert(killedAnim, {func = AnimDisappear, args = {cyborg, unpack(secondPos[2])}}) table.insert(killedAnim, {func = AnimSwitchHog, args = {native}}) AddSkipFunction(killedAnim, SkipKilledAnim, {}) end --------------------------Anim skip functions-------------------------- function SkipStartAnim() AnimSwitchHog(native) AnimWait(native, 1) AddFunction({func = HideHedge, args = {cyborg}}) end function SpawnCrateByID(id) if cratePos[id][2] == true then crates[id] = SpawnUtilityCrate(unpack(cratePos[id][1])) else crates[id] = SpawnAmmoCrate(unpack(cratePos[id][1])) end return crates[id] end function AfterStartAnim() SetGearMessage(native, 0) cratesNum = 0 for i = 1, 6 do SpawnCrateByID(i) cratesNum = cratesNum + 1 end FollowGear(native) AddNewEvent(CheckGearsDead, {{crates[1], crates[2]}}, PutCrates, {2}, 0) TurnTimeLeft = TurnTime ShowMission(loc("Dragon's Lair"), loc("Obstacle course"), loc("In order to get to the other side, you need to get rid of the crates first.") .. "|" .. loc("As the ammo is sparse, you might want to reuse ropes while mid-air.") .. "|" .. loc("The enemy can't move but it might be a good idea to stay out of sight!") .. "|" .. loc("Mines time: 5 seconds"), 1, 0) end function SkipKillAnim() AnimSwitchHog(native) AnimWait(native, 1) AddFunction({func = HideHedge, args = {cyborg}}) end function AfterKillAnim() PutWeaponCrates() TurnTimeLeft = TurnTime AddEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0) ShowMission(loc("Dragon's Lair"), loc("The Slaughter"), loc("Kill the aliens!").."|"..loc("Mines time: 5 seconds"), 1, 2000) end function SkipKilledAnim() AnimSetGearPosition(native, unpack(secondPos[1])) AnimSwitchHog(native) AnimWait(native, 1) end function AfterKilledAnim() HideHedge(cyborg) TurnTimeLeft = TurnTime SetGearMessage(native, 0) AddAmmo(native, amPortalGun, 100) SpawnUtilityCrate(2259, 755, amTeleport, 2) SpawnHealthCrate(secondPos[1][1] + 30, secondPos[1][2]) ShowMission(loc("Dragon's Lair"), loc("The what?!"), loc("Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|").. loc("Portal hint: one goes to the destination, and one is the entrance.|").. loc("Teleport hint: just use the mouse to select the destination!").."|".. loc("Mines time: 5 seconds"), 1, 0) end -----------------------------Events------------------------------------ function CheckCyborgsDead() return cyborgsLeft == 0 end function NullifyAmmo() AddAmmo(native, amRope, 0) AddAmmo(native, amGirder, 0) AddAmmo(native, amLowGravity, 0) AddAmmo(native, amBazooka, 0) AddAmmo(native, amSniperRifle, 0) AddAmmo(native, amDEagle, 0) AddAmmo(native, amDynamite, 0) AddAmmo(native, amFirePunch, 0) AddAmmo(native, amBaseballBat, 0) AddAmmo(native, amMortar, 0) AddAmmo(native, amSnowball, 0) AddAmmo(native, amShotgun, 0) end function DoCyborgsDead() if cratesTaken and not doneCyborgsDead then NullifyAmmo() RestoreHedge(cyborg) SetupKilledAnim() SetGearMessage(CurrentHedgehog, 0) AddAnim(killedAnim) AddFunction({func = AfterKilledAnim, args = {}}) doneCyborgsDead = true end end function PutWeaponCrates() for i = 1, 8 do cratesNum = cratesNum + 1 SpawnCrateByID(cratesNum) end FollowGear(native) end function DoCratesTaken() cratesTaken = true SetupKillAnim() SetGearMessage(CurrentHedgehog, 0) AddAnim(killAnim) AddFunction({func = AfterKillAnim, args = {}}) end function PutCrates(index) if index <= 7 then cratesNum = cratesNum + 1 SpawnCrateByID(cratesNum) AddNewEvent(CheckGearDead, {crates[cratesNum]}, PutCrates, {index + 1}, 0) FollowGear(native) else AddEvent(StoppedGear, {native}, DoCratesTaken, {}, 0) end if index == 4 then AnimSay(native, loc("I'm a ninja."), SAY_THINK, 0) end end function CheckMissionFinished() return gearDead[jetCrate] == true end function DoMissionFinished() AddCaption(loc("Salvation was one step closer now...")) if progress and progress<6 then SaveCampaignVar("Progress", "6") end RestoreHedge(cyborg) DeleteGear(cyborg) TurnTimeLeft = 0 end function CheckGearsDead(gearList) for i = 1, # gearList do if gearDead[gearList[i]] ~= true then return false end end return true end function CheckGearDead(gear) return gearDead[gear] end function EndMission() RestoreHedge(cyborg) DeleteGear(cyborg) TurnTimeLeft = 0 end function CheckFreshDead() return freshDead ~= nil end function CyborgDeadReact() freshDead = nil if cyborgsLeft == 0 then if not cratesTaken then AnimSay(native, loc("I still have to get rid of the crates."), SAY_THINK, 8000) end return end AnimSay(native, reactions[cyborgsLeft]) end -----------------------------Misc-------------------------------------- function HideHedge(hedge) if hedgeHidden[hedge] ~= true then HideHog(hedge) hedgeHidden[hedge] = true end end function RestoreHedge(hedge) if hedgeHidden[hedge] == true then RestoreHog(hedge) hedgeHidden[hedge] = false end end function GetVariables() progress = tonumber(GetCampaignVar("Progress")) m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum")) end function SetupPlace() for i = 1, 7 do if i ~= m5DeployedNum then DeleteGear(natives[i]) else native = natives[i] end end HideHedge(cyborg) jetCrate = SpawnUtilityCrate(3915, 1723, amJetpack) --[[ Block the left entrance. Otherwise the player could rope out of the map and go all the way around to the final crate. ]] PlaceGirder(90, 1709, 6) PlaceGirder(90, 1875, 6) -- Place mines on the ground floor AddGear(1071, 1913, gtMine, 0, 0, 0, 0) AddGear(1098, 1919, gtMine, 0, 0, 0, 0) AddGear(1136, 1923, gtMine, 0, 0, 0, 0) AddGear(1170, 1930, gtMine, 0, 0, 0, 0) AddGear(1203, 1924, gtMine, 0, 0, 0, 0) AddGear(1228, 1939, gtMine, 0, 0, 0, 0) AddGear(1264, 1931, gtMine, 0, 0, 0, 0) AddGear(1309, 1938, gtMine, 0, 0, 0, 0) AddGear(1352, 1936, gtMine, 0, 0, 0, 0) AddGear(1386, 1939, gtMine, 0, 0, 0, 0) AddGear(1432, 1942, gtMine, 0, 0, 0, 0) AddGear(1483, 1950, gtMine, 0, 0, 0, 0) AddGear(1530, 1954, gtMine, 0, 0, 0, 0) AddGear(1579, 1959, gtMine, 0, 0, 0, 0) AddGear(1000, 1903, gtMine, 0, 0, 0, 0) AddGear(957, 1903, gtMine, 0, 0, 0, 0) AddGear(909, 1910, gtMine, 0, 0, 0, 0) AddGear(889, 1917, gtMine, 0, 0, 0, 0) ------ STICKY MINE LIST ------ tempG = AddGear(1199, 733, gtSMine, 0, 0, 0, 0) tempG = AddGear(1195, 793, gtSMine, 0, 0, 0, 0) tempG = AddGear(1201, 861, gtSMine, 0, 0, 0, 0) tempG = AddGear(682, 878, gtSMine, 0, 0, 0, 0) tempG = AddGear(789, 876, gtSMine, 0, 0, 0, 0) end function SetupEvents() AddNewEvent(CheckMissionFinished, {}, DoMissionFinished, {}, 0) AddNewEvent(CheckGearDead, {native}, EndMission, {}, 0) AddNewEvent(CheckFreshDead, {}, CyborgDeadReact, {}, 1) end function SetupAmmo() AddAmmo(cyborgs[1], amBazooka, 100) AddAmmo(cyborgs[1], amShotgun, 100) AddAmmo(cyborgs[1], amSwitch, 100) end function AddHogs() AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy") for i = 1, 7 do natives[i] = AddHog(nativeNames[i], 0, 200, nativeHats[i]) gearDead[natives[i]] = false end AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1") gearDead[cyborg] = false AddTeam(loc("011101000"), 14483455, "ring", "UFO", "Robot", "cm_binary") for i = 1, 4 do cyborgs[i] = AddHog(cyborgNames[i], 2, 100, "cyborg2") gearDead[cyborgs[i]] = false end cyborgsLeft = 4 for i = 1, 7 do AnimSetGearPosition(natives[i], unpack(nativePos)) end AnimSetGearPosition(cyborg, unpack(cyborgPos)) for i = 1, 4 do AnimSetGearPosition(cyborgs[i], unpack(cyborgsPos[i])) AnimTurn(cyborgs[i], cyborgsDir[i]) end end 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 -----------------------------Main Functions---------------------------- function onGameInit() Seed = 0 GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableWind + gfDisableGirders TurnTime = 60000 CaseFreq = 0 MinesNum = 20 MinesTime = 5000 Explosives = 6 Delay = 10 MapGen = mgDrawn Theme = "City" SuddenDeathTurns = 25 for i = 1, #map do ParseCommand('draw ' .. map[i]) end AddHogs() AnimInit(true) end function onGameStart() GetVariables() SetupAmmo() SetupPlace() AnimationSetup() SetupEvents() ShowMission(loc("Dragon's Lair"), loc("Y Chwiliad"), loc("Find your tribe!|Cross the lake!"), 1, 0) end function onGameTick() AnimUnWait() if ShowAnimation() == false then return end ExecuteAfterAnimations() CheckEvents() end function onGearDelete(gear) gearDead[gear] = true if GetGearType(gear) == gtHedgehog then if GetHogTeamName(gear) == loc("011101000") then freshDead = GetHogName(gear) cyborgsLeft = cyborgsLeft - 1 end end end function onAmmoStoreInit() SetAmmo(amFirePunch, 3, 0, 0, 0) SetAmmo(amBaseballBat, 2, 0, 0, 0) SetAmmo(amGirder, 0, 0, 0, 2) SetAmmo(amLowGravity, 0, 0, 0, 1) SetAmmo(amSkip, 9, 0, 0, 0) end function onNewTurn() if firstTurn then AddAnim(startAnim) AddFunction({func = AfterStartAnim, args = {}}) firstTurn = false end if GetHogTeamName(CurrentHedgehog) == loc("011101000") then SetInputMask(band(0xFFFFFFFF, bnot(gmLeft + gmRight + gmLJump + gmHJump))) for i = 1, 4 do if gearDead[CurrentHedgehog] ~= true and gearDead[native] ~= true then if gearDead[cyborgs[i]] ~= true and GetX(cyborgs[i]) < GetX(native) then HogTurnLeft(cyborgs[i], false) else HogTurnLeft(cyborgs[i], true) end end end if TotalRounds % 6 == 0 then AddAmmo(CurrentHedgehog, amSniperRifle, 1) AddAmmo(CurrentHedgehog, amDEagle, 1) end TurnTimeLeft = 30000 elseif GetHogTeamName(CurrentHedgehog) == loc("011101001") then TurnTimeLeft = 0 else SetInputMask(0xFFFFFFFF) end end function onPrecise() if GameTime > 2500 and AnimInProgress() then SetAnimSkip(true) end end