# HG changeset patch # User Wuzzy # Date 1547399224 -3600 # Node ID e26fa5ea2bf68f7d93e3bb93762df8aa0e29272c # Parent 5de4d470dafe8eb7b4d961fdb21a5bda270bc2c7 Air attack: Don't spawn missile if it would end up inside bounce world edge of other side diff -r 5de4d470dafe -r e26fa5ea2bf6 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Sun Jan 13 17:49:29 2019 +0100 +++ b/hedgewars/uGearsHandlersMess.pas Sun Jan 13 18:07:04 2019 +0100 @@ -3019,6 +3019,15 @@ if (Gear^.Health > 0) and (not (Gear^.X < Gear^.dX)) and (Gear^.X < Gear^.dX + cAirPlaneSpeed) then begin dec(Gear^.Health); + if (WorldEdge = weBounce) and (((Gear^.Tag = 1) and (hwRound(Gear^.X) > rightX)) or ((Gear^.Tag = -1) and (hwRound(Gear^.X) < leftX))) then + begin + // Don't spawn missile if it would end up inside bounce world edge of the opposite side + PlaySound(sndVaporize); + AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmoke); + end + else + begin + // Spawn missile case Gear^.State of 0: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0); 1: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMine, 0, cBombsSpeed * Gear^.Tag, _0, 0); @@ -3027,9 +3036,10 @@ //4: FollowGear := AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtWaterMelon, 0, cBombsSpeed * // Gear^.Tag, _0, 5000); end; - Gear^.dX := Gear^.dX + int2hwFloat(Gear^.Damage * Gear^.Tag); - if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then - FollowGear^.State:= FollowGear^.State or gstSubmersible; + Gear^.dX := Gear^.dX + int2hwFloat(Gear^.Damage * Gear^.Tag); + if CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y)) then + FollowGear^.State:= FollowGear^.State or gstSubmersible; + end; StopSoundChan(Gear^.SoundChannel, 4000); end; @@ -3051,11 +3061,16 @@ AllInactive := false; valid:= true; + // Bounce world edge restrictions ... if (WorldEdge = weBounce) then + // If plane flies right, deny placement inside the right bounce side if (Gear^.X.QWordValue = 0) and (Gear^.Target.X > rightX) then valid:= false + // If plane flies left, deny placement inside the left bounce side else if (Gear^.X.QWordValue <> 0) and (Gear^.Target.X < leftX) then valid:= false + // Deny placement of high targets. This serves as a buffer to further + // reduce potentially weird bouncy gear behaviour else if (Gear^.Target.Y < (topY - 50)) then valid:= false;