Make bouncing a bit less wtf for various gears tested (hog, 'zooka, saucer hog, drill strike). Less hacky is another matter.
authornemo
Sun, 05 Apr 2015 16:41:39 -0400
changeset 10895 bce67defd804
parent 10893 b085cf83ab4c
child 10897 8ea636ce120a
Make bouncing a bit less wtf for various gears tested (hog, 'zooka, saucer hog, drill strike). Less hacky is another matter.
hedgewars/uGearsHandlersMess.pas
hedgewars/uGearsHedgehog.pas
--- a/hedgewars/uGearsHandlersMess.pas	Sun Apr 05 12:44:54 2015 +0900
+++ b/hedgewars/uGearsHandlersMess.pas	Sun Apr 05 16:41:39 2015 -0400
@@ -437,7 +437,26 @@
             Gear^.dY := tdX*cElastic
             end;
 
-        Gear^.dY.isNegative := not tdY.isNegative;
+        Gear^.dX.isNegative:= tdX.isNegative;
+        Gear^.dY.isNegative:= tdY.isNegative;
+        if (collV > 0) and (collH > 0) and (not tdX.isNegative) and (not tdY.isNegative) then
+            begin
+            Gear^.dX.isNegative := true;
+            Gear^.dY.isNegative := true
+            end
+        else if (collV > 0) and (collH < 0) and (tdX.isNegative or tdY.isNegative) then
+            begin
+            Gear^.dY.isNegative := not tdY.isNegative;
+            if not tdY.isNegative then Gear^.dX.isNegative := false
+            end
+        else if (collV < 0) and (collH > 0) and (not tdX.isNegative) then
+            begin
+            Gear^.dX.isNegative := true;
+            Gear^.dY.isNegative := false
+            end
+        else if (collV < 0) and (collH < 0) and tdX.isNegative and tdY.isNegative then
+            Gear^.dX.isNegative := false;
+       
         isFalling := false;
         Gear^.AdvBounce := 10;
         end;
@@ -463,7 +482,10 @@
         Gear^.State := Gear^.State or gstMoving;
 
     if ((xland or land) and lfBouncy <> 0) and (Gear^.dX.QWordValue < _0_15.QWordValue) and (Gear^.dY.QWordValue < _0_15.QWordValue) then
+        begin
         Gear^.State := Gear^.State or gstCollision;
+        AddFileLog('no more bounce for you!');
+        end;
 
     if ((xland or land) and lfBouncy <> 0) and (Gear^.Radius >= 3) and
        ((Gear^.dX.QWordValue > _0_15.QWordValue) or (Gear^.dY.QWordValue > _0_15.QWordValue)) then
@@ -3484,6 +3506,7 @@
         begin
         StopSoundChan(Gear^.SoundChannel);
         Gear^.Tag := 1;
+        Gear^.AdvBounce:= 50;
         Gear^.doStep := @doStepDrill
         end;
 
--- a/hedgewars/uGearsHedgehog.pas	Sun Apr 05 12:44:54 2015 +0900
+++ b/hedgewars/uGearsHedgehog.pas	Sun Apr 05 16:41:39 2015 -0400
@@ -895,6 +895,7 @@
         if land and lfBouncy <> 0 then
             begin
             doStepFallingGear(Gear);
+            Gear^.AdvBounce:= 1;
             Gear^.dX:= Gear^.dX * _0_8
             end;
         if (land and lfBouncy = 0) or (Gear^.State and gstCollision <> 0) then
@@ -935,6 +936,7 @@
         if land and lfBouncy <> 0 then
             begin
             doStepFallingGear(Gear);
+            Gear^.AdvBounce:= 1;
             // hogs for some reason have very low friction. slippery little buggers
             Gear^.dX:= Gear^.dX * _0_8
             end;
@@ -1072,6 +1074,7 @@
         land:= TestCollisionYwithXYShift(Gear, 0, 1, 1);
         if land and lfBouncy <> 0 then
             doStepFallingGear(Gear);
+            Gear^.AdvBounce:= 1;
 
         if (land <> 0) and ((land and lfBouncy = 0) or (Gear^.State and gstCollision <> 0)) then
             begin