Bee:
authorsheepluva
Mon, 31 Oct 2011 16:44:25 +0100
changeset 6251 5cd33711afb9
parent 6250 cd01e4f93ed9
child 6252 8d598aa498b0
Bee: + don't explode on time expiration but fall instead (still explodes on impact) * avoid side-effects by removing flag sharing between different bees.
hedgewars/GSHandlers.inc
--- a/hedgewars/GSHandlers.inc	Mon Oct 31 14:44:43 2011 +0100
+++ b/hedgewars/GSHandlers.inc	Mon Oct 31 16:44:25 2011 +0100
@@ -385,7 +385,8 @@
 
     Gear^.X := Gear^.X + Gear^.dX;
     Gear^.Y := Gear^.Y + Gear^.dY;
-    CheckGearDrowning(Gear);
+    if Gear^.Kind <> gtBee then
+        CheckGearDrowning(Gear);
     //if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and
     if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) < _0_02.QWordValue) and
        (not isFalling) then
@@ -841,16 +842,18 @@
 var 
     t: hwFloat;
     gX,gY,i: LongInt;
-    nuw: boolean;
+    uw, nuw: boolean;
     flower: PVisualGear;
 
-const uw: boolean =   false;
 begin
     AllInactive := false;
     gX := hwRound(Gear^.X);
     gY := hwRound(Gear^.Y);
-    nuw := (cWaterLine < gy + Gear^.Radius);
-    if nuw and not uw then
+    uw := (Gear^.Tag <> 0); // was bee underwater last tick?
+    nuw := (cWaterLine < gy + Gear^.Radius); // is bee underwater now?
+
+    // if water entered or left
+    if nuw <> uw then
     begin
         AddVisualGear(gX, cWaterLine, vgtSplash);
         AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet);
@@ -858,36 +861,43 @@
         AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet);
         AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet);
         StopSound(Gear^.SoundChannel);
-        Gear^.SoundChannel := LoopSound(sndBeeWater);
-        uw := nuw
-    end
-    else if not nuw and uw then
+        if nuw then
         begin
-            AddVisualGear(gX, cWaterLine, vgtSplash);
-            StopSound(Gear^.SoundChannel);
+            Gear^.SoundChannel := LoopSound(sndBeeWater);
+            Gear^.Tag := 1;
+        end
+        else
+        begin
             Gear^.SoundChannel := LoopSound(sndBee);
-            uw := nuw
+            Gear^.Tag := 0;
         end;
-
-
-    if (GameTicks and $F) = 0 then
+    end;
+
+
+    if Gear^.Timer = 0 then
+        Gear^.RenderTimer:= false
+    else
     begin
-        if (GameTicks and $30) = 0 then
-            AddVisualGear(gX, gY, vgtBeeTrace);
-        Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (Gear^.Target.X - gX));
-        Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (Gear^.Target.Y - gY));
-        // make sure new speed isn't higher than original one (which we stored in Friction variable)
-        t := Gear^.Friction / Distance(Gear^.dX, Gear^.dY);
-        Gear^.dX := Gear^.dX * t;
-        Gear^.dY := Gear^.dY * t;
+        if (GameTicks and $F) = 0 then
+        begin
+            if (GameTicks and $30) = 0 then
+                AddVisualGear(gX, gY, vgtBeeTrace);
+            Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (Gear^.Target.X - gX));
+            Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (Gear^.Target.Y - gY));
+            // make sure new speed isn't higher than original one (which we stored in Friction variable)
+            t := Gear^.Friction / Distance(Gear^.dX, Gear^.dY);
+            Gear^.dX := Gear^.dX * t;
+            Gear^.dY := Gear^.dY * t;
+        end;
+
+        Gear^.X := Gear^.X + Gear^.dX;
+        Gear^.Y := Gear^.Y + Gear^.dY;
+
     end;
 
-    Gear^.X := Gear^.X + Gear^.dX;
-    Gear^.Y := Gear^.Y + Gear^.dY;
 
     CheckCollision(Gear);
-    dec(Gear^.Timer);
-    if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then
+    if ((Gear^.State and gstCollision) <> 0) then
     begin
         StopSound(Gear^.SoundChannel);
         doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, Gear^.Hedgehog, EXPLAutoSound);
@@ -908,6 +918,19 @@
             end;
         DeleteGear(Gear);
     end;
+
+    if (Gear^.Timer > 0) then
+        dec(Gear^.Timer)
+    else
+    begin
+        if nuw then
+        begin
+            StopSound(Gear^.SoundChannel);
+            CheckGearDrowning(Gear);
+        end
+        else
+            doStepFallingGear(Gear);
+    end;
 end;
 
 procedure doStepBee(Gear: PGear);