hedgewars/uGears.pas
changeset 7754 e81dc9bef8b8
parent 7733 a1476c09403f
child 7755 b8958e64e68d
--- a/hedgewars/uGears.pas	Sun Oct 14 00:22:33 2012 +0400
+++ b/hedgewars/uGears.pas	Sun Oct 14 13:35:15 2012 -0400
@@ -730,7 +730,7 @@
 procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt);
 var t: PGearArray;
     Gear: PGear;
-    i, tmpDmg: LongInt;
+    i, j, tmpDmg: LongInt;
     VGear: PVisualGear;
 begin
 t:= CheckGearsCollision(Ammo);
@@ -769,6 +769,7 @@
             gtHedgehog,
             gtMine,
             gtSMine,
+            gtKnife,
             gtTarget,
             gtCase,
             gtExplosives,
@@ -780,7 +781,28 @@
                 exit;
                 end;
             if (not Gear^.Invulnerable) then
+                begin
+                if (Ammo^.Kind = gtKnife) and (tmpDmg > 0) then
+                    for j:= 1 to max(1,min(3,tmpDmg div 5)) do
+                        begin
+                        VGear:= AddVisualGear(hwRound(Ammo^.X-((Ammo^.X-Gear^.X)/_2)), hwRound(Ammo^.Y-((Ammo^.Y-Gear^.Y)/_2)), vgtStraightShot);
+                        if VGear <> nil then
+                            with VGear^ do
+                                begin
+                                Tint:= $FFCC00FF;
+                                Angle:= random(360);
+                                dx:= 0.0005 * (random(100));
+                                dy:= 0.0005 * (random(100));
+                                if random(2) = 0 then
+                                    dx := -dx;
+                                if random(2) = 0 then
+                                    dy := -dy;
+                                FrameTicks:= 600+random(200);
+                                State:= ord(sprStar)
+                                end
+                        end;
                 ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg, dsShove)
+                end
             else
                 Gear^.State:= Gear^.State or gstWinner;
             if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then 
@@ -790,35 +812,39 @@
                 ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsUnknown); // crank up damage for explosives + blowtorch
                 end;
 
-            DeleteCI(Gear);
             if (Gear^.Kind = gtHedgehog) and Gear^.Hedgehog^.King then
                 begin
                 Gear^.dX:= Ammo^.dX * Power * _0_005;
                 Gear^.dY:= Ammo^.dY * Power * _0_005
                 end
-            else
+            else if (Ammo^.Kind <> gtFlame) or (Gear^.Kind = gtHedgehog) then
                 begin
                 Gear^.dX:= Ammo^.dX * Power * _0_01;
                 Gear^.dY:= Ammo^.dY * Power * _0_01
                 end;
 
-            Gear^.Active:= true;
-            Gear^.State:= Gear^.State or gstMoving;
-
-            // move the gear upwards a bit to throw it over tiny obstacles at start
-            if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
+            if (not isZero(Gear^.dX)) or (not isZero(Gear^.dY)) then
                 begin
-                if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX))
-                or (TestCollisionYwithGear(Gear, -1) <> 0)) then
-                    Gear^.Y:= Gear^.Y - _1;
-                if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX))
-                or (TestCollisionYwithGear(Gear, -1) <> 0)) then
-                    Gear^.Y:= Gear^.Y - _1;
-                if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX))
-                or (TestCollisionYwithGear(Gear, -1) <> 0)) then
-                    Gear^.Y:= Gear^.Y - _1;
+                Gear^.Active:= true;
+                DeleteCI(Gear);
+                Gear^.State:= Gear^.State or gstMoving;
+                if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and not gstCollision;
+                // move the gear upwards a bit to throw it over tiny obstacles at start
+                if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
+                    begin
+                    if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX))
+                    or (TestCollisionYwithGear(Gear, -1) <> 0)) then
+                        Gear^.Y:= Gear^.Y - _1;
+                    if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX))
+                    or (TestCollisionYwithGear(Gear, -1) <> 0)) then
+                        Gear^.Y:= Gear^.Y - _1;
+                    if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX))
+                    or (TestCollisionYwithGear(Gear, -1) <> 0)) then
+                        Gear^.Y:= Gear^.Y - _1;
+                    end
                 end;
 
+
             if (Ammo^.Kind <> gtFlame) or ((Ammo^.State and gsttmpFlag) = 0) then
                 FollowGear:= Gear
             end;