------------------- ABOUT ----------------------
--
-- Hero has to get to the surface as soon as possible.
-- Tunnel is about to get flooded.

HedgewarsScriptLoad("/Scripts/Locale.lua")
HedgewarsScriptLoad("/Scripts/Animate.lua")
HedgewarsScriptLoad("/Scripts/Achievements.lua")
HedgewarsScriptLoad("/Missions/Campaign/A_Space_Adventure/global_functions.lua")

----------------- VARIABLES --------------------
-- globals
local missionName = loc("Running for survival")
local startChallenge = false
-- dialogs
local dialog01 = {}
-- mission objectives
local goals = {
	[dialog01] = {missionName, loc("Getting ready"), loc("Use the rope to quickly get to the surface!") .. "|" .. loc("Mines time: 1 second"), 1, 4500},
}
-- For an achievement/award (see below)
local cratesCollected = 0
local totalCrates = 0
local damageTaken = false
local animStarted = false
local record
-- health crates
healthX = 565
health1Y = 1400
health2Y = 850
-- hogs
local hero = {}
-- teams
local teamA = {}
-- hedgehogs values
hero.name = loc("Hog Solo")
hero.x = 1600
hero.y = 1950
hero.dead = false
teamA.name = loc("Hog Solo")
teamA.color = -6
-- way points
local current waypoint = 1
local waypoints = {
	[1] = {x=1450, y=140},
	[2] = {x=990, y=580},
	[3] = {x=1650, y=950},
	[4] = {x=620, y=630},
	[5] = {x=1470, y=540},
	[6] = {x=1960, y=60},
	[7] = {x=1600, y=400},
	[8] = {x=240, y=940},
	[9] = {x=200, y=530},
	[10] = {x=1180, y=120},
	[11] = {x=1950, y=660},
	[12] = {x=1280, y=980},
	[13] = {x=590, y=1100},
	[14] = {x=20, y=620},
	[15] = {x=hero.x, y=hero.y}
}

-------------- LuaAPI EVENT HANDLERS ------------------

function onGameInit()
	GameFlags = gfOneClanMode
	Seed = 1
	TurnTime = 8000
	CaseFreq = 0
	HealthCaseAmount = 50
	MinesNum = 500
	MinesTime = 1000
	MineDudPercent = 75
	Explosives = 0
	SuddenDeathTurns = 1
	WaterRise = 150
	HealthDecrease = 0
	Map = "desert02_map"
	Theme = "Desert"

	-- Hero
	teamA.name = AddMissionTeam(teamA.color)
	hero.gear = AddMissionHog(100)
	hero.name = GetHogName(hero.gear)
	AnimSetGearPosition(hero.gear, hero.x, hero.y)
	HogTurnLeft(hero.gear, true)

 	record = tonumber(GetCampaignVar("FastestMineEscape"))
	initCheckpoint("desert02")

	AnimInit(true)
	AnimationSetup()
end

function onAmmoStoreInit()
	SetAmmo(amRope, 9, 0, 0, 0)
	SetAmmo(amSkip, 9, 0, 0, 0)
end

function onGameStart()
	AnimWait(hero.gear, 3000)
	FollowGear(hero.gear)

	if record ~= nil then
		goals[dialog01][3] = goals[dialog01][3] .. "|" .. string.format(loc("Fastest escape: %d turns"), record)
	end
	ShowMission(unpack(goals[dialog01]))
	HideMission()

	AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0)
	AddEvent(onHeroSafe, {hero.gear}, heroSafe, {hero.gear}, 0)

	SpawnHealthCrate(healthX, health1Y)
	SpawnHealthCrate(healthX, health2Y)

	SendHealthStatsOff()
end

function onNewTurn()
	if not animStarted then
		AddAnim(dialog01)
		animStarted = true
	end
	SetWeapon(amRope)
	if TotalRounds >= 0 and record ~= nil then
		SetTeamLabel(teamA.name, tostring(TotalRounds))
	end
end

function onGameTick()
	AnimUnWait()
	if ShowAnimation() == false then
		return
	end
	ExecuteAfterAnimations()
	CheckEvents()
end

function onGearAdd(gear)
	if GetGearType(gear) == gtRope then
		HideMission()
	elseif GetGearType(gear) == gtCase then
		totalCrates = totalCrates + 1
	end
end

function onGearDelete(gear)
	if gear == hero.gear then
		hero.dead = true
		damageTaken = true
	end
	-- Crate collected
	if GetGearType(gear) == gtCase and band(GetGearMessage(gear), gmDestroy) ~= 0 then
		cratesCollected = cratesCollected + 1
	end
end

function onGearDamage(gear)
	if gear == hero.gear then
		damageTaken = true
	end
end

function onPrecise()
	if GameTime > 3000 then
		SetAnimSkip(true)
	end
end

-------------- EVENTS ------------------

function onHeroDeath(gear)
	if hero.dead then
		return true
	end
	return false
end

function onHeroSafe(gear)
	if not hero.dead and GetY(hero.gear) < 170 and StoppedGear(hero.gear) then
		return true
	end
	return false
end

-------------- ACTIONS ------------------

function heroDeath(gear)
	SendStat(siGameResult, string.format(loc("%s lost, try again!"), hero.name))
	SendStat(siCustomAchievement, loc("To win the game you have to go to the surface."))
	SendStat(siCustomAchievement, loc("Most mines are not active."))
	SendStat(siCustomAchievement, loc("From the second turn and beyond the water rises."))
	sendSimpleTeamRankings({teamA.name})
	EndGame()
end

function heroSafe(gear)
	SendStat(siGameResult, loc("Congratulations, you won!"))
	SendStat(siCustomAchievement, loc("You have escaped successfully."))
	SendStat(siCustomAchievement, string.format(loc("Your escape took you %d turns."), TotalRounds))
	if record ~= nil and TotalRounds >= record then
		SendStat(siCustomAchievement, string.format(loc("Your fastest escape so far: %d turns"), record))
	end
	if record == nil or TotalRounds < record then
		SaveCampaignVar("FastestMineEscape", tostring(TotalRounds))
		if record ~= nil then
			SendStat(siCustomAchievement, loc("This is a new personal best, congratulations!"))
		end
	end
	-- Achievement awarded for escaping with all crates collected and no damage taken
	if (not damageTaken) and (cratesCollected >= totalCrates) then
		awardAchievement(loc("Better Safe Than Sorry"))
	end
	sendSimpleTeamRankings({teamA.name})
	SaveCampaignVar("Mission7Won", "true")
	checkAllMissionsCompleted()
	EndGame()
end

-------------- ANIMATIONS ------------------

function Skipanim(anim)
	if goals[anim] ~= nil then
		ShowMission(unpack(goals[anim]))
	end
	challengeStart()
end

function AnimationSetup()
	-- DIALOG 01 - Start
	AddSkipFunction(dialog01, Skipanim, {dialog01})
	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}})
	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Many meters below the surface ..."), 5000}})
	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("The tunnel is about to get flooded!"), SAY_THINK, 4000}})
	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I have to reach the surface as quickly as I can."), SAY_THINK, 4000}})
	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}})
	table.insert(dialog01, {func = ShowMission, args = goals[dialog01]})
	table.insert(dialog01, {func = challengeStart, args = {hero.gear}})
end

------------------ Other Functions -------------------

function challengeStart()
	startChallenge = true
	EndTurn(true)
	if record ~= nil then
		SetTeamLabel(teamA.name, "0")
	end
end
