# HG changeset patch # User Wuzzy # Date 1507124262 -7200 # Node ID f30b709765778d949cb152f133e27fd4228c2581 # Parent 36a650c0a885ae4c3bced0069bad6f5a05d6e750 Fix cake taking >200s to explode when it's completely stuck and can't move (bug 194) diff -r 36a650c0a885 -r f30b70976577 ChangeLog.txt --- a/ChangeLog.txt Wed Oct 04 15:28:32 2017 +0200 +++ b/ChangeLog.txt Wed Oct 04 15:37:42 2017 +0200 @@ -45,6 +45,7 @@ * Fixed enemy saying "Missed” when giving poison without direct damage * Fixed hedgehogs not saying “Stupid” and not displaying announcer message for inflicting self-harm * Fixed incorrect time box tooltip when in Sudden Death + * Fixed cake taking over 200 seconds to explode when its stuck and can't move * Remove buggy /finish chat command * Various other fixes diff -r 36a650c0a885 -r f30b70976577 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Wed Oct 04 15:28:32 2017 +0200 +++ b/hedgewars/uGearsHandlersMess.pas Wed Oct 04 15:37:42 2017 +0200 @@ -3294,7 +3294,7 @@ if Gear^.Health mod 100 = 0 then Gear^.PortalCounter:= 0; // This is not seconds, but at least it is *some* feedback - if (Gear^.Health = 0) or ((Gear^.Message and gmAttack) <> 0) then + if (Gear^.Health <= 0) or ((Gear^.Message and gmAttack) <> 0) then begin FollowGear := Gear; Gear^.RenderTimer := false; @@ -3329,12 +3329,14 @@ AllInactive := false; inc(Gear^.Tag); - if Gear^.Tag < 100 then + // Animation delay. Skipped if cake only dropped a very short distance. + if (Gear^.Tag < 100) and (Gear^.FlightTime > 1) then exit; Gear^.Tag := 0; - if Gear^.Pos = 6 then - begin + if (Gear^.Pos = 6) or (Gear^.FlightTime <= 1) then + begin + Gear^.Pos := 6; cakeData:= PCakeData(Gear^.Data); with cakeData^ do begin @@ -3345,6 +3347,13 @@ end; CakeI := 0; end; + (* This is called frequently if the cake is completely stuck. + With this a stuck cake takes equally long to explode then + a normal cake. Removing this code just makes the cake walking + for a few seconds longer. *) + if (Gear^.FlightTime <= 1) and (Gear^.Health > 2) then + dec(Gear^.Health); + Gear^.FlightTime := 0; Gear^.doStep := @doStepCakeWalk end else @@ -3356,6 +3365,8 @@ AllInactive := false; Gear^.dY := Gear^.dY + cGravity; + // FlightTime remembers the drop time + inc(Gear^.FlightTime); if TestCollisionYwithGear(Gear, 1) <> 0 then Gear^.doStep := @doStepCakeUp else diff -r 36a650c0a885 -r f30b70976577 hedgewars/uGearsList.pas --- a/hedgewars/uGearsList.pas Wed Oct 04 15:28:32 2017 +0200 +++ b/hedgewars/uGearsList.pas Wed Oct 04 15:37:42 2017 +0200 @@ -580,6 +580,8 @@ gear^.Z:= cOnHHZ; gear^.RenderTimer:= false; gear^.DirAngle:= -90 * hwSign(Gear^.dX); + gear^.FlightTime:= 100; // (roughly) ticks spent dropping, used to skip getting up anim when stuck. + // Initially set to a high value so cake has at least one getting up anim. if not dX.isNegative then gear^.Angle:= 1 else