------------------- 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