# HG changeset patch # User Wuzzy # Date 1506529115 -7200 # Node ID 846fa8bb856ecc8ed17c427cce28cb520ed4cf9b # Parent d51ea6ac1ca174c50141fbb7bb0d523bb05e5044 ASA: Spacetrip: Fix guards ignoring stealing completely, fix various other game logic fails diff -r d51ea6ac1ca1 -r 846fa8bb856e share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua Wed Sep 27 15:45:42 2017 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua Wed Sep 27 18:18:35 2017 +0200 @@ -16,6 +16,8 @@ local timeForGuard1ToTurnLeft = timeForGuard1ToTurn local saucerAcquired = false local status +local getReadyForRumble = false -- guards wake up +local ropeDestroyed = false -- for detecting if player roped to the moon local checkPointReached = 1 -- 1 is start of the game local objectives = loc("Go to the moon by using the flying saucer and complete the main mission").."|".. loc("Come back to this mission and visit the other planets to collect the crates").."|".. @@ -86,7 +88,7 @@ function onGameInit() Seed = 35 GameFlags = gfSolidLand + gfDisableWind - TurnTime = 40000 + TurnTime = 15000 CaseFreq = 0 MinesNum = 0 Explosives = 0 @@ -179,12 +181,12 @@ if checkPointReached == 1 then AddAnim(dialog01) AddAmmo(hero.gear, amRope, 1) - AddAmmo(guard1.gear, amDEagle, 2) - AddAmmo(guard2.gear, amDEagle, 2) + AddAmmo(guard1.gear, amDEagle, 100) + AddAmmo(guard2.gear, amDEagle, 100) SpawnUtilityCrate(saucerX, saucerY, amJetpack) -- EVENT HANDLERS AddEvent(onHeroBeforeTreePosition, {hero.gear}, heroBeforeTreePosition, {hero.gear}, 0) - AddEvent(onHeroAtSaucerPosition, {hero.gear}, heroAtSaucerPosition, {hero.gear}, 0) + AddEvent(onHeroAcquiredSaucer, {hero.gear}, heroAcquiredSaucer, {hero.gear}, 0) AddEvent(onHeroOutOfGuardSight, {hero.gear}, heroOutOfGuardSight, {hero.gear}, 0) elseif checkPointReached == 2 then AddAmmo(hero.gear, amJetpack, 1) @@ -261,6 +263,12 @@ local abandonCheck = false function onNewTurn() + if saucerAcquired then + -- The only way for the player to have a saucer at turn start is by having used the rope + -- before; there's no other way to get it. We can therefore conclude the rope has been + -- used. + ropeDestroyed = true + end if not abandonCheck and checkPointReached == 5 then if abandonedPlanetMission then HogSay(hero.gear, loc("I just forgot all checkpoints of incomplete missions."), SAY_THINK) @@ -268,10 +276,22 @@ abandonCheck = false end - if guard1.keepTurning then - AnimSwitchHog(hero.gear) - TurnTimeLeft = -1 + if CurrentHedgehog == hero.gear then + -- Hero just got spotted by guards + if getReadyForRumble then + EndTurn(true) + getReadyForRumble = false + else + if guard1.keepTurning then + TurnTimeLeft = -1 + end + end + elseif CurrentHedgehog == director.gear or CurrentHedgehog == doctor.gear then + EndTurn(true) + elseif (CurrentHedgehog == guard1.gear or CurrentHedgehog == guard2.gear) and guard1.keepTurning then + EndTurn(true) end + end -------------- EVENTS ------------------ @@ -283,16 +303,6 @@ return false end -function onHeroAtSaucerPosition(gear) - if GetHealth(hero.gear) and GetX(gear) >= saucerX-25 and GetX(gear) <= saucerX+32 and GetY(gear) >= saucerY-32 and GetY(gear) <= saucerY+32 then - saucerAcquired = true - end - if saucerAcquired and GetHealth(hero.gear) and StoppedGear(gear) then - return true - end - return false -end - function onGearAdd(gear) if GetGearType(gear) == gtJetpack then saucerGear = gear @@ -301,7 +311,7 @@ function onGearDelete(gear) if GetGearType(gear) == gtCase and band(GetGearMessage(gear), gmDestroy) ~= 0 then - heroAtSaucerPosition() + saucerAcquired = true elseif GetGearType(gear) == gtJetpack then saucerGear = nil end @@ -378,29 +388,44 @@ AnimCaption(hero.gear, loc("Use the rope to get to the crate"), 4000) end -function heroAtSaucerPosition(gear) - if not saucerAcquired then +function prepareDialog02(gear) + if StoppedGear(gear) and guard1.keepTurning and checkPointReached < 2 then EndTurn(true) -- save check point SaveCampaignVar("CosmosCheckPoint", "2") checkPointReached = 2 AddAnim(dialog02) - -- check if he was spotted by the guard - if guard1.turn and GetX(hero.gear) > saucerX-150 then - guard1.keepTurning = false - AddAnim(dialog03) - end - saucerAcquired = true end end +function heroAcquiredSaucer(gear) + SetGearMessage(hero.gear, 0) + -- check if he was spotted by the guard + if guard1.turn and guard1.keepTurning and GetX(hero.gear) > saucerX-150 then + guard1.keepTurning = false + SetGearVelocity(gear, 0, 0) + AddAnim(dialog03) + end + + prepareDialog02(gear) +end + +function onHeroAcquiredSaucer(gear) + return saucerAcquired +end + function heroOutOfGuardSight(gear) + SetGearMessage(hero.gear, 0) guard1.keepTurning = true AddAnim(dialog04) + + if onHeroAcquiredSaucer(gear) then + prepareDialog02(gear) + end end function moonLanding(gear) - if checkPointReached == 1 then + if checkPointReached == 1 and not ropeDestroyed then -- player climbed the moon with rope FollowGear(doctor.gear) AnimSay(doctor.gear, loc("One does not simply rope to the moon!"), SAY_SHOUT, 4000) @@ -559,8 +584,8 @@ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - if CurrentHedgehog ~= hero.gear and anim ~= dialog03 then + end + if CurrentHedgehog ~= hero.gear and anim ~= dialog03 then AnimSwitchHog(hero.gear) elseif anim == dialog03 then startCombat() @@ -596,8 +621,8 @@ table.insert(dialog02, {func = AnimGearWait, args = {hero.gear, 500}}) -- DIALOG 03 - Hero got spotted by guard AddSkipFunction(dialog03, Skipanim, {dialog03}) - table.insert(dialog03, {func = AnimWait, args = {guard1.gear, 4000}}) - table.insert(dialog03, {func = AnimCaption, args = {guard1.gear, loc("Prepare to flee!"), 4000}}) + table.insert(dialog03, {func = AnimWait, args = {guard1.gear, 500}}) + table.insert(dialog03, {func = AnimCaption, args = {guard1.gear, loc("Prepare to flee!"), 1000}}) table.insert(dialog03, {func = AnimSay, args = {guard1.gear, string.format(loc("Hey, %s! Look, someone is stealing the saucer!"), guard2.name), SAY_SHOUT, 4000}}) table.insert(dialog03, {func = AnimSay, args = {guard2.gear, loc("I'll get him!"), SAY_SAY, 4000}}) table.insert(dialog03, {func = startCombat, args = {guard1.gear}}) @@ -640,9 +665,9 @@ ------------------- custom "animation" functions -------------------------- function startCombat() - -- use this so guard2 will gain control - AnimSwitchHog(hero.gear) + -- Use this so guard2 gains control EndTurn(true) + getReadyForRumble = true end function sendStats(planetMsg)