1--[[
2A Classic Fairytale: Dragon's Lair
3
4= SUMMARY =
5Hero must collect an utility crate on the other side of the river.
6To accomplish that, hero must first collect a series of crates with
7the rope and wipe out the cyborgs.
8The hero is one survivor of the previous missions.
9
10= GOALS =
11- Mission goal (leads to immediate victory): Collect utility crate at the right side of the river
12- First sub-goal: Collect (or destroy) a series of crates (all other utility crates)
13- Second sub-goal: Wipe out the cyborgs
14
15= FLOW CHART =
16- Choose hog to be hero (read from m5DeployedNum)
17- Cut scene: Intro
18- TBS
19| Player accomplishes first sub-goal first:
20    - Cut scene: Cyborg reveals second goal
21    - A ton of weapon crates and some rope crates spawn on the long platform
22| Player accomplshed second sub-goal first:
23    - Hero reminds player to collect/destroy remaining crates
24- Player accomplished both goals
25- Cut scene: Cyborg teleports hero to the long platform and congrats hero
26- Hero's ammo is cleared, all crates, mines, sticky mines and barrels are removed from platform
27- Spawn a portal gun crate on the long platform and also a teleportation crate further to the right
28- (These utilities can be used to finish the mission)
29- Player takes final crate at the very right
30> Victory
31
32]]
33
34HedgewarsScriptLoad("/Scripts/Locale.lua")
35HedgewarsScriptLoad("/Scripts/Animate.lua")
36
37-----------------------------Map--------------------------------------
38local map =
39{
40	"\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",
41	"\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",
42	"\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",
43	"\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",
44	"\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",
45	"\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",
46	"\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",
47	"\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",
48	"\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",
49	"\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",
50	"\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",
51	"\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",
52	"\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",
53	"\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",
54	"\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",
55	"\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",
56	"\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",
57	"\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",
58	"\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",
59	"\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",
60	"\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",
61	"\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",
62	"\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",
63	"\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",
64	"\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",
65	"\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",
66	"\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",
67	"\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",
68	"\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",
69	"\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",
70	"\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",
71	"\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",
72	"\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",
73	"\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",
74	"\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",
75	"\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",
76	"\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",
77	"\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",
78	"\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",
79	"\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",
80	"\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",
81	"\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",
82	"\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",
83	"\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",
84	"\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",
85	"\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",
86	"\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",
87	"\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",
88	"\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",
89	"\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",
90	"\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",
91	"\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",
92	"\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",
93	"\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",
94	"\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",
95	"\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",
96	"\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",
97	"\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",
98	"\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",
99	"\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",
100	"\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",
101	"\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",
102	"\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",
103	"\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",
104	"\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",
105	"\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",
106	"\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",
107	"\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",
108	"\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",
109	"\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",
110	"\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",
111	"\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",
112	"\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",
113	"\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",
114	"\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",
115	"\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",
116	"\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",
117	"\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",
118	"\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",
119	"\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",
120	"\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",
121	"\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",
122	"\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",
123	"\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",
124	"\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",
125	"\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",
126	"\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",
127	"\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",
128	"\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",
129	"\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",
130	"\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",
131	"\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",
132	"\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",
133	"\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",
134	"\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",
135	"\3\112\2\248\131\3\98\2\188\0",
136}
137
138
139-----------------------------Constants---------------------------------
140choiceAccepted = 1
141choiceRefused = 2
142choiceAttacked = 3
143
144choiceEliminate = 1
145choiceSpare = 2
146
147leaksNum = 1
148denseNum = 2
149waterNum = 3
150buffaloNum = 4
151chiefNum = 5
152girlNum = 6
153wiseNum = 7
154
155nativeNames = {loc("Leaks A Lot"), loc("Dense Cloud"), loc("Fiery Water"),
156               loc("Raging Buffalo"), loc("Righteous Beard"), loc("Fell From Grace"),
157               loc("Wise Oak")}
158
159nativeUnNames = {loc("Zork"), loc("Steve"), loc("Jack"),
160                 loc("Lee"), loc("Elmo"), loc("Rachel"),
161                 loc("Muriel")}
162
163nativeHats = {"Rambo", "RobinHood", "pirate_jack", "zoo_Bunny", "IndianChief",
164              "tiara", "AkuAku"}
165
166nativePos = {257, 1950}
167
168cyborgNames = {loc("Syntax Errol"), loc("Segmentation Paul"), loc("Unexpected Igor"), loc("Jeremiah")}
169cyborgPos = {745, 1847}
170cyborgsPos = {{2937, 831}, {2945, 1264}, {2335, 1701}, {448, 484}}
171cyborgsDir = {"Left", "Left", "Left", "Right"}
172
173cyborgTeamName, fighterTeamName, nativesTeamName = nil, nil, nil
174
175cratePos = {
176            {{788, 1919, amGirder, 2}, true}, {{412, 1615, amGirder, 1}, true},
177            {{209, 1474, amSniperRifle, 1}}, {{1178, 637, amDEagle, 1}},
178            {{633, 268, amDEagle, 1}}, {{3016, 1545, amDEagle, 1}},
179            {{249, 1377, amRope, 3}, true}, {{330, 1018, amGirder, 1}, true},
180            {{888, 647, amRope, 3}, true}, {{2116, 337, amRope, 3}, true},
181            {{1779, 948, amRope, 3}, true}, {{3090, 1066, amRope, 3}, true},
182            {{947, 480, amBazooka, 3}}, {{1097, 480, amMortar, 3}},
183            {{1139, 451, amSnowball, 3}}, {{1207, 468, amShotgun, 3}},
184            {{1024, 393, amSniperRifle, 2}}, {{998, 391, amDynamite, 2}},
185            {{1024, 343, amRope, 2}, true}, {{998, 341, amRope, 2}, true},
186           }
187reactions = {loc("Yeah, take that!"), loc("Bullseye"), loc("Die, die, die!")}
188
189secondPos = {{1010, 510}, {1067, 510}}
190-----------------------------Variables---------------------------------
191natives = {}
192native = nil
193
194cyborgs = {}
195cyborg = {}
196cyborgsLeft = 0
197
198gearDead = {}
199hedgeHidden = {}
200
201startAnim = {}
202killAnim = {}
203killedAnim = {}
204
205freshDead = nil
206crates = {}
207cratesNum = 0
208jetCrate = nil
209
210firstTurn = true
211cyborgsKilledBeforeCrates = false
212cratesTaken = false
213doneCyborgsDead = false
214
215timeAfterCratesTaken = nil
216
217annoyingGearsForPortalScene = {}
218-----------------------------Animations--------------------------------
219function EmitDenseClouds(dir)
220  local dif
221  if dir == "Left" then
222    dif = 10
223  else
224    dif = -10
225  end
226  AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
227  AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
228  AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
229  AnimInsertStepNext({func = AnimWait, args = {native, 800}})
230  AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
231  AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
232  AnimInsertStepNext({func = AnimWait, args = {native, 800}})
233  AnimInsertStepNext({func = AnimVisualGear, args = {native, GetX(native) + dif, GetY(native) + dif, vgtSteam, 0, true}, swh = false})
234end
235
236function AnimationSetup()
237  startAnim = {}
238  local m = m5DeployedNum
239  table.insert(startAnim, {func = AnimWait, args = {native, 3000}})
240  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}})
241  table.insert(startAnim, {func = AnimCaption, args = {native, loc("But it proved to be no easy task!"), 2000}})
242  for i = 1, 4 do
243    table.insert(startAnim, {func = FollowGear, swh = false, args = {cyborgs[i]}})
244    table.insert(startAnim, {func = AnimWait, args = {native, 1000}})
245  end
246  table.insert(startAnim, {func = FollowGear, swh = false, args = {native}})
247  if m == leaksNum then
248    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}})
249    table.insert(startAnim, {func = AnimSay, args = {native, loc("What a strange cave!"), SAY_THINK, 0}})
250    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}})
251    table.insert(startAnim, {func = AnimSay, args = {native, loc("Now how do I get on the other side?!"), SAY_THINK, 5500}})
252  elseif m == denseNum then
253    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}})
254    table.insert(startAnim, {func = AnimSay, args = {native, loc("Dude, what's this place?!"), SAY_THINK, 0}})
255    table.insert(startAnim, {func = AnimCustomFunction, args = {native, EmitDenseClouds, {"Right"}}})
256    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}})
257    table.insert(startAnim, {func = AnimSay, args = {native, loc("And where's all the weed?"), SAY_THINK, 4000}})
258  elseif m == waterNum then
259    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}})
260    table.insert(startAnim, {func = AnimSay, args = {native, loc("Is this place in my head?"), SAY_THINK, 0}})
261    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}})
262    table.insert(startAnim, {func = AnimSay, args = {native, loc("I shouldn't have drunk that last pint."), SAY_THINK, 6000}})
263  elseif m == buffaloNum then
264    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}})
265    table.insert(startAnim, {func = AnimSay, args = {native, loc("Where did that alien run?"), SAY_THINK, 0}})
266    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}})
267    table.insert(startAnim, {func = AnimSay, args = {native, loc("When I find it..."), SAY_THINK, 3000}})
268  elseif m == girlNum then
269    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}})
270    table.insert(startAnim, {func = AnimSay, args = {native, loc("This is typical!"), SAY_THINK, 0}})
271    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}})
272    table.insert(startAnim, {func = AnimSay, args = {native, loc("It's always up to women to clear up the mess men created!"), SAY_THINK, 8500}})
273  elseif m == chiefNum then
274    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}})
275    table.insert(startAnim, {func = AnimSay, args = {native, loc("What is this place?"), SAY_THINK, 0}})
276    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}})
277    table.insert(startAnim, {func = AnimSay, args = {native, loc("It doesn't matter. I won't let that alien hurt my daughter!"), SAY_THINK, 8500}})
278  elseif m == wiseNum then
279    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 50, 0}})
280    table.insert(startAnim, {func = AnimSay, args = {native, loc("Every single time!"), SAY_THINK, 0}})
281    table.insert(startAnim, {func = AnimMove, args = {native, "Right", nativePos[1] + 200, 0}})
282    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}})
283  end
284
285  table.insert(startAnim, {func = AnimCustomFunction, args = {native, RestoreHedge, {cyborg, unpack(cyborgPos)}}})
286  table.insert(startAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgPos)}})
287  table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}})
288  table.insert(startAnim, {func = AnimSay, args = {cyborg, string.format(loc("Greetings, %s!"), nativeUnNames[m]), SAY_SAY, 2500}})
289  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}})
290  table.insert(startAnim, {func = AnimSay, args = {cyborg, string.format(loc("I wish to help you, %s!"), nativeUnNames[m]), SAY_SAY, 4000}})
291  table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Beware, though! If you are slow, you die!"), SAY_SAY, 7000}})
292  table.insert(startAnim, {func = AnimDisappear, args = {cyborg, unpack(cyborgPos)}})
293  table.insert(startAnim, {func = AnimSwitchHog, args = {native}})
294  table.insert(startAnim, {func = AnimCustomFunction, args = {native, HideHedge, {cyborg}}})
295  table.insert(startAnim, {func = AnimSay, args = {native, loc("Talk about mixed signals..."), SAY_SAY, 4000}})
296  AddSkipFunction(startAnim, SkipStartAnim, {})
297end
298
299function SetupKillAnim()
300  table.insert(killAnim, {func = AnimSay, args = {native, loc("Well, that was a waste of time."), SAY_THINK, 5000}})
301  table.insert(killAnim, {func = AnimCustomFunction, args = {native, RestoreHedge, {cyborg, unpack(cyborgPos)}}})
302  table.insert(killAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgPos)}})
303  table.insert(killAnim, {func = AnimCustomFunction, args = {cyborg, CondNeedToTurn, {cyborg, native}}})
304  table.insert(killAnim, {func = AnimSay, args = {cyborg, string.format(loc("You bear impressive skills, %s!"), nativeUnNames[m5DeployedNum]), SAY_SHOUT, 4000}})
305  if CheckCyborgsDead() then
306    table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("I see you already took care of your enemies."), SAY_SHOUT, 7000}})
307    table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("Those were scheduled for disposal anyway."), SAY_SHOUT, 4000}})
308    table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("So you basically did the dirty work for us."), SAY_SHOUT, 4000}})
309    cyborgsKilledBeforeCrates = true
310  else
311    table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("However, my mates don't agree with me on letting you go..."), SAY_SHOUT, 7000}})
312    table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("I guess you'll have to kill them."), SAY_SHOUT, 4000}})
313  end
314  table.insert(killAnim, {func = AnimDisappear, args = {cyborg, unpack(cyborgPos)}})
315  table.insert(killAnim, {func = AnimSwitchHog, args = {native}})
316  table.insert(killAnim, {func = AnimWait, args = {native, 1}})
317  table.insert(killAnim, {func = AnimCustomFunction, args = {native, HideHedge, {cyborg}}})
318
319  local function checkCyborgsAgain()
320     if CheckCyborgsDead() then
321        DoCyborgsDead()
322     end
323  end
324  table.insert(killAnim, {func = AnimCustomFunction, args = {native, checkCyborgsAgain, {}}})
325
326  AddSkipFunction(killAnim, SkipKillAnim, {})
327end
328
329function SetupKilledAnim()
330  table.insert(killedAnim, {func = AnimWait, args = {cyborg, 500}})
331  table.insert(killedAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(secondPos[2])}})
332  table.insert(killedAnim, {func = AnimOutOfNowhere, args = {native, unpack(secondPos[1])}})
333  table.insert(killedAnim, {func = AnimCustomFunction, args = {cyborg, CondNeedToTurn, {cyborg, native}}})
334  if not cyborgsKilledBeforeCrates then
335    table.insert(killedAnim, {func = AnimSay, args = {cyborg, string.format(loc("Nice work, %s!"), nativeUnNames[m5DeployedNum]), SAY_SHOUT, 4000}})
336  end
337  table.insert(killedAnim, {func = AnimSay, args = {cyborg, loc("As a reward for your performance, here's some new technology!"), SAY_SHOUT, 8000}})
338  table.insert(killedAnim, {func = AnimSay, args = {cyborg, loc("Use it wisely!"), SAY_SHOUT, 3000}})
339  table.insert(killedAnim, {func = AnimDisappear, args = {cyborg, unpack(secondPos[2])}})
340  table.insert(killedAnim, {func = AnimSwitchHog, args = {native}})
341  AddSkipFunction(killedAnim, SkipKilledAnim, {})
342end
343--------------------------Anim skip functions--------------------------
344function SkipStartAnim()
345  AnimSetGearPosition(native, 457, 1955)
346  AnimSwitchHog(native)
347  AnimWait(native, 1)
348  AddFunction({func = HideHedge, args = {cyborg}})
349end
350
351function SpawnCrateByID(id)
352    if cratePos[id][2] == true then
353       crates[id] = SpawnSupplyCrate(unpack(cratePos[id][1]))
354    else
355       crates[id] = SpawnSupplyCrate(unpack(cratePos[id][1]))
356    end
357    return crates[id]
358end
359
360function AfterStartAnim()
361  SetGearMessage(native, 0)
362  cratesNum = 0
363  for i = 1, 6 do
364    SpawnCrateByID(i)
365    cratesNum = cratesNum + 1
366  end
367  FollowGear(native)
368  AddNewEvent(CheckGearsDead, {{crates[1], crates[2]}}, PutCrates, {2}, 0)
369  SetTurnTimeLeft(TurnTime)
370  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.") .. "|" ..
371                                                  loc("As the ammo is sparse, you might want to reuse ropes while mid-air.") .. "|" ..
372                                                  loc("The enemy can't move but it might be a good idea to stay out of sight!") .. "|" ..
373                                                  loc("Mines time: 5 seconds"), 1, 0)
374end
375
376function SkipKillAnim()
377  AnimSwitchHog(native)
378  AnimWait(native, 1)
379  AddFunction({func = HideHedge, args = {cyborg}})
380  if CheckCyborgsDead() then
381    DoCyborgsDead()
382  end
383end
384
385function AfterKillAnim()
386  if not cyborgsKilledBeforeCrates then
387    PutWeaponCrates()
388    if timeAfterCratesTaken then
389      SetTurnTimeLeft(timeAfterCratesTaken)
390    else
391      SetTurnTimeLeft(TurnTime)
392    end
393    SetReadyTimeLeft(Ready)
394    AddEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0)
395    ShowMission(loc("Dragon's Lair"), loc("The Slaughter"), loc("Kill the aliens!").."|"..loc("Mines time: 5 seconds"), 1, 2000)
396  end
397end
398
399function SkipKilledAnim()
400  AnimSetGearPosition(native, unpack(secondPos[1]))
401  AnimSwitchHog(native)
402  AnimWait(native, 1)
403end
404
405function AfterKilledAnim()
406  -- Final mission segment with the portal gun
407  HideHedge(cyborg)
408  EndTurn(true)
409  SetGearMessage(native, 0)
410  SpawnSupplyCrate(1184, 399, amPortalGun, 100)
411  SpawnSupplyCrate(2259, 755, amTeleport, 2)
412  SpawnHealthCrate(secondPos[1][1] + 50, secondPos[1][2] - 20)
413  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!|")..
414                                             loc("Portal hint: One goes to the destination, the other one is the entrance.|")..
415                                             loc("Teleport hint: Just use the mouse to select the destination!").."|"..
416                                             loc("Mines time: 5 seconds"), 1, 8000)
417end
418-----------------------------Events------------------------------------
419
420function CheckCyborgsDead()
421  return cyborgsLeft == 0
422end
423
424function NullifyAmmo()
425  -- Clear the ammo and delete all inappropirate gears on the long platform for the portal scene
426  AddAmmo(native, amRope, 0)
427  AddAmmo(native, amGirder, 0)
428  AddAmmo(native, amLowGravity, 0)
429  AddAmmo(native, amBazooka, 0)
430  AddAmmo(native, amSniperRifle, 0)
431  AddAmmo(native, amDEagle, 0)
432  AddAmmo(native, amDynamite, 0)
433  AddAmmo(native, amFirePunch, 0)
434  AddAmmo(native, amBaseballBat, 0)
435  AddAmmo(native, amMortar, 0)
436  AddAmmo(native, amSnowball, 0)
437  AddAmmo(native, amShotgun, 0)
438
439  for i=1, #annoyingGearsForPortalScene do
440    local gear = annoyingGearsForPortalScene[i]
441    if not gearDead[gear] and GetY(gear) > 100 and GetY(gear) < 571 and GetX(gear) > 840 and GetX(gear) < 1550 then
442      DeleteGear(annoyingGearsForPortalScene[i])
443    end
444  end
445end
446
447function DoCyborgsDead()
448  if cratesTaken and not doneCyborgsDead then
449    NullifyAmmo()
450    RestoreHedge(cyborg)
451    SetupKilledAnim()
452    SetGearMessage(CurrentHedgehog, 0)
453    AddAnim(killedAnim)
454    AddFunction({func = AfterKilledAnim, args = {}})
455    doneCyborgsDead = true
456  end
457end
458
459
460function PutWeaponCrates()
461  for i = 1, 8 do
462    cratesNum = cratesNum + 1
463    SpawnCrateByID(cratesNum)
464  end
465  FollowGear(native)
466end
467
468function DoCratesTaken()
469  cratesTaken = true
470  timeAfterCratesTaken = TurnTimeLeft
471  SetupKillAnim()
472  SetGearMessage(CurrentHedgehog, 0)
473  AddAnim(killAnim)
474  AddFunction({func = AfterKillAnim, args = {}})
475end
476
477function CheckPutCrates(gear)
478  if gear and GetHealth(gear) then
479    return StoppedGear(gear)
480  else
481    return false
482  end
483end
484
485function PutCrates(index)
486  if index <= 7 then
487    cratesNum = cratesNum + 1
488    SpawnCrateByID(cratesNum)
489    AddNewEvent(CheckGearDead, {crates[cratesNum]}, PutCrates, {index + 1}, 0)
490    FollowGear(native)
491  else
492    AddEvent(CheckPutCrates, {native}, DoCratesTaken, {}, 0)
493  end
494  if index == 4 then
495    AnimSay(native, loc("I'm a ninja."), SAY_THINK, 0)
496  end
497end
498
499function CheckMissionFinished()
500  return gearDead[jetCrate] == true
501end
502
503function DoMissionFinished()
504  AddCaption(loc("Salvation was one step closer now..."))
505  if progress and progress<6 then
506    SaveCampaignVar("Progress", "6")
507  end
508  RestoreHedge(cyborg)
509  DeleteGear(cyborg)
510  DismissTeam(fighterTeamName) -- just in case
511  EndTurn(true)
512end
513
514function CheckGearsDead(gearList)
515  for i = 1, # gearList do
516    if gearDead[gearList[i]] ~= true then
517      return false
518    end
519  end
520  return true
521end
522
523
524function CheckGearDead(gear)
525  return gearDead[gear]
526end
527
528function EndMission()
529  RestoreHedge(cyborg)
530  DeleteGear(cyborg)
531  EndTurn(true)
532end
533
534function CheckFreshDead()
535  return freshDead ~= nil
536end
537
538function CyborgDeadReact()
539  freshDead = nil
540  if cyborgsLeft == 0 then
541    if (not cratesTaken) and (not CheckMissionFinished()) then
542       AnimSay(native, loc("I still have to get rid of the crates."), SAY_THINK, 8000)
543    end
544    return
545  end
546  AnimSay(native, reactions[cyborgsLeft])
547end
548-----------------------------Misc--------------------------------------
549function HideHedge(hedge)
550  if hedgeHidden[hedge] ~= true then
551    HideHog(hedge)
552    hedgeHidden[hedge] = true
553  end
554end
555
556function RestoreHedge(hedge)
557  if hedgeHidden[hedge] == true then
558    RestoreHog(hedge)
559    hedgeHidden[hedge] = false
560  end
561end
562
563function GetVariables()
564  progress = tonumber(GetCampaignVar("Progress"))
565  m5DeployedNum = tonumber(GetCampaignVar("M5DeployedNum")) or leaksNum
566end
567
568function SetupPlace()
569  for i = 1, 7 do
570    if i ~= m5DeployedNum then
571      DeleteGear(natives[i])
572    else
573      native = natives[i]
574    end
575  end
576  HideHedge(cyborg)
577  -- Collect this crate to win
578  jetCrate = SpawnSupplyCrate(3915, 1723, amJetpack)
579  -- Protect crate from damage, just in case
580  SetState(jetCrate, bor(GetState(jetCrate), gstNoDamage))
581
582  --[[ Block the left entrance.
583       Otherwise the player could rope out of the map and
584       go all the way around to the final crate. ]]
585  PlaceGirder(90, 1709, 6)
586  PlaceGirder(90, 1875, 6)
587
588  -- Place mines on the ground floor
589  AddGear(1071, 1913, gtMine, 0, 0, 0, 0)
590  AddGear(1098, 1919, gtMine, 0, 0, 0, 0)
591  AddGear(1136, 1923, gtMine, 0, 0, 0, 0)
592  AddGear(1170, 1930, gtMine, 0, 0, 0, 0)
593  AddGear(1203, 1924, gtMine, 0, 0, 0, 0)
594  AddGear(1228, 1939, gtMine, 0, 0, 0, 0)
595  AddGear(1264, 1931, gtMine, 0, 0, 0, 0)
596  AddGear(1309, 1938, gtMine, 0, 0, 0, 0)
597  AddGear(1352, 1936, gtMine, 0, 0, 0, 0)
598  AddGear(1386, 1939, gtMine, 0, 0, 0, 0)
599  AddGear(1432, 1942, gtMine, 0, 0, 0, 0)
600  AddGear(1483, 1950, gtMine, 0, 0, 0, 0)
601  AddGear(1530, 1954, gtMine, 0, 0, 0, 0)
602  AddGear(1579, 1959, gtMine, 0, 0, 0, 0)
603  AddGear(1000, 1903, gtMine, 0, 0, 0, 0)
604  AddGear(957, 1903, gtMine, 0, 0, 0, 0)
605  AddGear(909, 1910, gtMine, 0, 0, 0, 0)
606  AddGear(889, 1917, gtMine, 0, 0, 0, 0)
607
608  -- Place misc. mines
609  AddGear(759, 878, gtMine, 0, 0, 0, 0)
610  AddGear(2388, 759, gtMine, 0, 0, 0, 0)
611  AddGear(2498, 696, gtMine, 0, 0, 0, 0)
612  AddGear(2936, 1705, gtMine, 0, 0, 0, 0)
613  AddGear(3119, 1366, gtMine, 0, 0, 0, 0)
614  AddGear(2001, 832, gtMine, 0, 0, 0, 0)
615  AddGear(2008, 586, gtMine, 0, 0, 0, 0)
616  AddGear(511, 1245, gtMine, 0, 0, 0, 0)
617
618  -- And one barrel for fun
619  AddGear(719, 276, gtExplosives, 0, 0, 0, 0)
620
621  ------ STICKY MINE LIST ------
622  AddGear(1199, 733, gtSMine, 0, 0, 0, 0)
623  AddGear(1195, 793, gtSMine, 0, 0, 0, 0)
624  AddGear(1201, 861, gtSMine, 0, 0, 0, 0)
625  AddGear(682, 878, gtSMine, 0, 0, 0, 0)
626  AddGear(789, 876, gtSMine, 0, 0, 0, 0)
627end
628
629function SetupEvents()
630  AddNewEvent(CheckMissionFinished, {}, DoMissionFinished, {}, 0)
631  AddNewEvent(CheckGearDead, {native}, EndMission, {}, 0)
632  AddNewEvent(CheckFreshDead, {}, CyborgDeadReact, {}, 1)
633end
634
635function SetupAmmo()
636  AddAmmo(cyborgs[1], amBazooka, 100)
637  AddAmmo(cyborgs[1], amShotgun, 100)
638  AddAmmo(cyborgs[1], amSwitch, 100)
639end
640
641function AddHogs()
642  nativesTeamName = AddMissionTeam(-2)
643  for i = 1, 7 do
644    natives[i] = AddHog(nativeNames[i], 0, 200, nativeHats[i])
645    gearDead[natives[i]] = false
646  end
647
648  cyborgTeamName = AddTeam(loc("011101001"), -1, "ring", "UFO", "Robot_qau", "cm_binary")
649  cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1")
650  gearDead[cyborg] = false
651
652  fighterTeamName = AddTeam(loc("011101000"), -9, "ring", "UFO", "Robot_qau", "cm_binary")
653  for i = 1, 4 do
654    cyborgs[i] = AddHog(cyborgNames[i], 2, 100, "cyborg2")
655    gearDead[cyborgs[i]] = false
656    SetEffect(cyborgs[i], heArtillery, 1)
657  end
658  cyborgsLeft = 4
659
660  for i = 1, 7 do
661    AnimSetGearPosition(natives[i], unpack(nativePos))
662  end
663
664  AnimSetGearPosition(cyborg, unpack(cyborgPos))
665
666  for i = 1, 4 do
667    AnimSetGearPosition(cyborgs[i], unpack(cyborgsPos[i]))
668    AnimTurn(cyborgs[i], cyborgsDir[i])
669  end
670
671end
672
673function CondNeedToTurn(hog1, hog2)
674  xl, xd = GetX(hog1), GetX(hog2)
675  if xl > xd then
676    AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
677    AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
678  elseif xl < xd then
679    AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}})
680    AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}})
681  end
682end
683
684-----------------------------Main Functions----------------------------
685
686function onGameInit()
687  Seed = 0
688  GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableWind + gfDisableGirders
689  TurnTime = 60000
690  CaseFreq = 0
691  MinesNum = 0
692  MinesTime = 5000
693  Explosives = 0
694  MapGen = mgDrawn
695  Theme = "City"
696  WaterRise = 0
697  HealthDecrease = 0
698
699  for i = 1, #map do
700     ParseCommand('draw ' .. map[i])
701  end
702
703  AddHogs()
704  AnimInit(true)
705end
706
707function onGameStart()
708  GetVariables()
709  SetupAmmo()
710  SetupPlace()
711  AnimationSetup()
712  SetupEvents()
713  ShowMission(loc("Dragon's Lair"), loc("Y Chwiliad"), loc("Find your tribe!|Cross the lake!"), 10, 0)
714end
715
716function onGameTick()
717  AnimUnWait()
718  if ShowAnimation() == false then
719    return
720  end
721  ExecuteAfterAnimations()
722  CheckEvents()
723end
724
725function onGearDelete(gear)
726  gearDead[gear] = true
727  if GetGearType(gear) == gtHedgehog then
728    if GetHogTeamName(gear) == fighterTeamName then
729      freshDead = GetHogName(gear)
730      cyborgsLeft = cyborgsLeft - 1
731    end
732  end
733end
734
735function onGearAdd(gear)
736  -- Track gears for removal when reaching the portal segment
737  local gt = GetGearType(gear)
738  if gt == gtMine or gt == gtSMine or gt == gtCase or gt == gtExplosives then
739    table.insert(annoyingGearsForPortalScene, gear)
740  end
741end
742
743function onAmmoStoreInit()
744  SetAmmo(amFirePunch, 3, 0, 0, 0)
745  SetAmmo(amBaseballBat, 2, 0, 0, 0)
746  SetAmmo(amGirder, 0, 0, 0, 2)
747  SetAmmo(amLowGravity, 0, 0, 0, 1)
748  SetAmmo(amJetpack, 0, 0, 0, 1)
749  SetAmmo(amSkip, 9, 0, 0, 0)
750end
751
752function onNewTurn()
753  if firstTurn then
754    AddAnim(startAnim)
755    AddFunction({func = AfterStartAnim, args = {}})
756    firstTurn = false
757  end
758  if GetHogTeamName(CurrentHedgehog) == fighterTeamName then
759    if TotalRounds % 6 == 0 then
760      AddAmmo(CurrentHedgehog, amSniperRifle, 1)
761      AddAmmo(CurrentHedgehog, amDEagle, 1)
762    end
763    SetTurnTimeLeft(30000)
764  elseif GetHogTeamName(CurrentHedgehog) == cyborgTeamName then
765    EndTurn(true)
766  end
767end
768
769function onPrecise()
770  if GameTime > 2500 and AnimInProgress() then
771    SetAnimSkip(true)
772  end
773end
774
775function onGameResult(winner)
776  if winner == GetTeamClan(nativesTeamName) then
777    SendStat(siGameResult, loc("Mission succeeded!"))
778  else
779    SendStat(siGameResult, loc("Mission failed!"))
780  end
781end
782
783