# HG changeset patch # User Wuzzy # Date 1506714275 -7200 # Node ID d8adae379d3c5db3c6df418fe86dd58ddd5b49e7 # Parent b4b5484be65131073388c11792cc57f12226c825 A Space Adventure: Add outro sequence / epilogue in the final mission diff -r b4b5484be651 -r d8adae379d3c ChangeLog.txt --- a/ChangeLog.txt Fri Sep 29 19:31:25 2017 +0200 +++ b/ChangeLog.txt Fri Sep 29 21:44:35 2017 +0200 @@ -208,6 +208,7 @@ + Side missions: Remove or shorten intro sequences + Side missions: Generous ready time to give more time to read the mission panel + Getting to the device: Put device part in a real crate, improve some dialogues + + Final mission: Add outro sequence instead of instantly quitting * Spacetrip: Fix various bugs and logic flaws in the initial mission * A frozen adventure: Fix bazooka and excess freezers (>6) not retained over checkpoints * A frozen adventure: Fix and improve poorly written messages @@ -307,6 +308,7 @@ + New variable: ReadyTimeLeft -- Remaining ready time, 0 if turn in progress. Can be set in onNewTurn + Locale library: loc_noop -- Mark string for translation but don't translate it + Animate library: AnimInit([startAnimating]) -- New parameter startAnimating: if true, will start game in cinematic mode with most controls disabled. Must play an animation after that + + Animate library: AnimSetInputMask(extraInputMask) -- Set input mask in a manner comptible with the Animate library * Fixed call: HideHog(gear) -- Fix crash when gear is invalid. Returns true on success or false otherwise * Fixed call: SwitchHog(gear) -- Fix new hog being unable to open ammo menu * Removed call: SetAmmoStore -- Old undocumented function of questional use, has never been used diff -r b4b5484be651 -r d8adae379d3c share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua Fri Sep 29 19:31:25 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua Fri Sep 29 21:44:35 2017 +0200 @@ -16,6 +16,8 @@ loc("Red areas are indestructible.").."|".. loc("Green areas are portal-proof.").."|".. loc("Mines time: 0 seconds") + +local dialog01 = {} local explosives = {} local currentHealth = 1 local currentDamage = 0 @@ -88,7 +90,8 @@ AddAmmo(hero.gear, amFirePunch, 1) AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) - AddEvent(onHeroWin, {hero.gear}, heroWin, {hero.gear}, 0) + AddEvent(onBoom, {hero.gear}, heroBoomReaction, {hero.gear}, 0) + AnimationSetup() SendHealthStatsOff() end @@ -111,6 +114,9 @@ function onNewTurn() currentDamage = 0 currentHealth = GetHealth(hero.gear) + if onBoom(hero.gear) then + heroWin(hero.gear) + end end function onGearDamage(gear, damage) @@ -128,7 +134,7 @@ return false end -function onHeroWin(gear) +function onBoom(gear) local win = true for i=1,table.getn(explosives) do if GetHealth(explosives[i]) then @@ -153,7 +159,19 @@ EndGame() end +function heroBoomReaction(gear) + if GetHealth(gear) and GetHealth(gear) > 0 then + HogSay(gear, loc("Kaboom! Hahahaha! Take this, stupid meteorite!"), SAY_SHOUT, 2) + end +end + function heroWin(gear) + AddAnim(dialog01) +end + +function win() + SetWeapon(amNothing) + AnimSetInputMask(0) saveCompletedStatus(7) SaveCampaignVar("Won", "true") checkAllMissionsCompleted() @@ -162,3 +180,41 @@ sendSimpleTeamRankings({teamA.name}) EndGame() end + +------------ ANIMATION STUFF ------------ + +function Skipanim(anim) + if anim == dialog01 then + win() + end +end + +function onPrecise() + if GameTime > 3000 then + SetAnimSkip(true) + end +end + +function AnimationSetup() + -- DIALOG 01 - Start, welcome to moon + AddSkipFunction(dialog01, Skipanim, {dialog01}) + table.insert(dialog01, {func = AnimWait, args = {hero.gear, 100}}) + table.insert(dialog01, {func = FollowGear, args = {hero.gear}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Hooray! I actually did it! Hogera is safe!"), SAY_SHOUT, 3000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I'm so glad this is finally over!"), SAY_SAY, 3000}}) + table.insert(dialog01, {func = AnimWait, args = {hero.gear, 4000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Wait a moment …"), SAY_THINK, 2000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("If some good old explosives were enough to save Hogera …"), SAY_THINK, 5000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("… why did I risk my life to collect all the parts of the anti-gravity device?"), SAY_THINK, 6000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("It was completely useless!"), SAY_THINK, 3000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("We could just have blown up the meteorite from the the beginning!"), SAY_THINK, 5000}}) + -- Hogerian = Inhabitant of the planet Hogera + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Stupid, stupid Hogerians!"), SAY_SAY, 5000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"), SAY_THINK, 9000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Nah, probably everyone was just stupid."), SAY_THINK, 4000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Except me, of course! I just saved a whole planet!"), SAY_THINK, 5000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("But one thing's for sure:"), SAY_THINK, 4000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Hogera is definitely the last planet I saved!"), SAY_THINK, 4000}}) + table.insert(dialog01, {func = win, args = {hero.gear}}) +end + diff -r b4b5484be651 -r d8adae379d3c share/hedgewars/Data/Scripts/Animate.lua --- a/share/hedgewars/Data/Scripts/Animate.lua Fri Sep 29 19:31:25 2017 +0200 +++ b/share/hedgewars/Data/Scripts/Animate.lua Fri Sep 29 21:44:35 2017 +0200 @@ -5,6 +5,8 @@ local FunctionList, FunctionListNum local skipFuncList local skipping +local baseInputMask = 0xFFFFFFFF +local extraInputMask = baseInputMask --------------------------------Animation--------------------------------- --------------------------(In-game cinematics)---------------------------- @@ -50,16 +52,27 @@ RemoveFunction() end +local function updateInputMask() + SetInputMask(band(baseInputMask, extraInputMask)) +end + local function startCinemaLock() SetCinematicMode(true) - SetInputMask(bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon)) + baseInputMask = bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon) + updateInputMask() end local function stopCinemaLock() - SetInputMask(0xFFFFFFFF) + baseInputMask = 0xFFFFFFFF + updateInputMask() SetCinematicMode(false) end +function AnimSetInputMask(newExtraInputMask) + extraInputMask = newExtraInputMask + updateInputMask() +end + function AnimInit(startAnimating) lastx = 0 lasty = 0