Make cake bounce off bounce edge, stop cake at wrap edge to prevent other bug
authorWuzzy <Wuzzy2@mail.ru>
Fri, 03 Aug 2018 00:39:50 +0200
changeset 13607 212036414957
parent 13606 ba6648614cd7
child 13608 92b87845beeb
Make cake bounce off bounce edge, stop cake at wrap edge to prevent other bug The "other bug" is that the cake just walks through terrain when it hits the wrap world edge. This behaviour is even worse.
ChangeLog.txt
hedgewars/uGearsHandlers.pas
hedgewars/uGearsHandlersMess.pas
--- a/ChangeLog.txt	Fri Aug 03 15:34:23 2018 -0400
+++ b/ChangeLog.txt	Fri Aug 03 00:39:50 2018 +0200
@@ -14,6 +14,8 @@
  * Fix hammer and pickhammer not digging correctly at wrap world edge
  * Fix freezer ray not working through wrap world edge
  * Fix freezer ray going through bounce world edge
+ * Fix cake walking through bounce world edge
+ * Cake now stops at wrap world edge instead of walking through land (temporary fix)
  * Laser sight now works properly through wrap world edge
  * Fix extreme amounts of droplets when shooting with minigun into ocean world edge
  * Fix hog being unable to walk after using sniper rifle without firing both shots
--- a/hedgewars/uGearsHandlers.pas	Fri Aug 03 15:34:23 2018 -0400
+++ b/hedgewars/uGearsHandlers.pas	Fri Aug 03 00:39:50 2018 +0200
@@ -27,7 +27,7 @@
 
 implementation
 
-uses SDLh, uFloat, uCollisions;
+uses SDLh, uFloat, uCollisions, uVariables, uGearsUtils;
 
 
 
@@ -95,6 +95,28 @@
                 end
             end;
 
+    // Handle world wrap and bounce edge manually
+    if (WorldEdge = weWrap) and
+        ((hwRound(Gear^.X) <= LongInt(leftX)) or (hwRound(Gear^.X) >= LongInt(rightX))) then
+        begin
+        LeftImpactTimer:= 150;
+        RightImpactTimer:= 150;
+        Gear^.WDTimer:= 4;
+        Gear^.Karma:= 2;
+        end
+    else if (WorldEdge = weBounce) and
+        (((hwRound(Gear^.X) - Gear^.Radius) < LongInt(leftX)) or ((hwRound(Gear^.X) + Gear^.Radius) > LongInt(rightX))) then
+        begin
+        if (hwRound(Gear^.X) - Gear^.Radius < LongInt(leftX)) then
+            LeftImpactTimer:= 333
+        else
+            RightImpactTimer:= 333;
+        Gear^.Karma:= 1;
+        Gear^.WDTimer:= 0;
+        if (Gear^.Radius > 2) and (Gear^.dX.QWordValue > _0_001.QWordValue) then
+            AddBounceEffectForGear(Gear);
+        end;
+
     cakeStep:= Gear^.WDTimer < 4
 end;
 
--- a/hedgewars/uGearsHandlersMess.pas	Fri Aug 03 15:34:23 2018 -0400
+++ b/hedgewars/uGearsHandlersMess.pas	Fri Aug 03 00:39:50 2018 +0200
@@ -3559,6 +3559,23 @@
 
     if not cakeStep(Gear) then Gear^.doStep:= @doStepCakeFall;
 
+    if (Gear^.Karma = 1) then
+        begin
+        // Cake hit bouncy edge, turn around
+        Gear^.dX.isNegative := (not Gear^.dX.isNegative);
+        Gear^.WDTimer := 0;
+        Gear^.Angle := (LongInt(Gear^.Angle) + 2) and 3;
+        Gear^.Karma := 0;
+        end
+    else if (Gear^.Karma = 2) then
+        begin
+        // Cake doesn't know how walk through world wrap
+        // so it gives up and stops.
+        // TODO: Teach cake how to deal with world wrap.
+        Gear^.Health := 0;
+        Gear^.Karma := 0;
+        end;
+
     if Gear^.Tag = 0 then
         begin
         cakeData:= PCakeData(Gear^.Data);