share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/dragon.lua
author Wuzzy <Wuzzy2@mail.ru>
Sun, 29 Oct 2017 00:53:11 +0200
changeset 12794 bca911f8e804
parent 12625 52ed732cf494
child 12798 fdb3730aa0e2
permissions -rw-r--r--
Add comments for all A Classic Fairytale missions to summarize the story in a flow chart-like fashion

--[[
A Classic Fairytale: Dragon's Lair

= SUMMARY =
Hero must collect an utility crate on the other side of the river.
To accomplish that, hero must first collect a series of crates with
the rope and wipe out the cyborgs.

= GOALS =
- Mission goal (leads to immediate victory): Collect utility crate at the right side of the river
- First sub-goal: Collect (or destroy) a series of crates (all other utility crates)
- Second sub-goal: Wipe out the cyborgs

= FLOW CHART =
- Cut scene: Intro
- TBS
| Player accomplishes first sub-goal first:
    - Cut scene: Cyborg reveals second goal
| Player accomplshed second sub-goal first:
    - Hero reminds player to collect/destroy remaining crates
- Player accomplished both goals
- Cut scene: Cyborg teleports hero and congrats hero and reveals portal gun
- A teleporter crate appears, allowing the player to complete the mission
- Player takes final crate at the very right
> Victory

]]

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()
  AnimSetGearPosition(native, 457, 1955)
  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 CheckPutCrates(gear)
  if gear and GetHealth(gear) then
    return StoppedGear(gear)
  else
    return false
  end
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(CheckPutCrates, {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)
  EndTurn(true)
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)
  EndTurn(true)
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
    EndTurn(true)
  else
    SetInputMask(0xFFFFFFFF)
  end
end

function onPrecise()
  if GameTime > 2500 and AnimInProgress() then
    SetAnimSkip(true)
  end
end