hedgewars/uGearsList.pas
branchqmlfrontend
changeset 12855 1b2b84315d27
parent 12828 948eae885eac
child 12898 8a40ce061d94
--- a/hedgewars/uGearsList.pas	Thu Aug 11 23:05:14 2016 +0300
+++ b/hedgewars/uGearsList.pas	Sun Dec 17 00:09:24 2017 +0100
@@ -105,6 +105,7 @@
 (*        gtAddAmmo *) , amNothing
 (*  gtGenericFaller *) , amNothing
 (*          gtKnife *) , amKnife
+(*           gtDuck *) , amDuck
     );
 
 
@@ -263,6 +264,7 @@
                     else Gear^.Boom := 3;
     gtPoisonCloud: Gear^.Boom := 20;
           gtKnife: Gear^.Boom := 40000; // arbitrary scaling factor since impact-based
+           gtDuck: Gear^.Boom := 40;
     end;
 
 case Kind of
@@ -507,7 +509,11 @@
                 gear^.Density:= _1_5;
                 gear^.RenderTimer:= true
                 end;
-      gtShover: gear^.Radius:= 20;
+      gtShover: begin
+                gear^.Radius:= 20;
+                gear^.Tag:= 0;
+                gear^.Timer:= 50;
+                end;
        gtFlame: begin
                 gear^.Tag:= GetRandom(32);
                 gear^.Radius:= 1;
@@ -574,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
@@ -631,6 +639,8 @@
      gtMolotov: begin
                 gear^.AdvBounce:= 1;
                 gear^.Radius:= 6;
+                gear^.Elasticity:= _0_8;
+                gear^.Friction:= _0_8;
                 gear^.Density:= _2
                 end;
        gtBirdy: begin
@@ -713,6 +723,24 @@
                 gear^.Health:= 1000;
                 gear^.Radius:= 8;
                 end;
+        gtDuck: begin
+                gear^.Pos:= 0;               // 0: in air, 1-4: on water, 5-8: underwater
+                                             // 1: bottom, 2: bottom (mirrored),
+                                             // 3: left Sea edge, 4: right Sea edge
+                                             // 6: bottom, 7: bottom (mirrored)
+                                             // 7: left Sea edge, 8: right Sea edge
+                gear^.Tag:= 1;               // 1: facing right, -1: facing left
+                if gear^.Timer = 0 then      
+                    gear^.Timer:= 15000;     // Explosion timer to avoid duck existing forever
+                gear^.Radius:= 9;            // Collision radius (with landscape)
+                gear^.Karma:= 24;            // Distance from water when swimming
+                gear^.Damage:= 500;          // Speed factor when swimming on water (multiplied with wind speed)
+                gear^.State:= gear^.State or gstSubmersible;
+                gear^.Elasticity:= _0_6;
+                gear^.Friction:= _0_8;
+                gear^.Density:= _0_5;
+                gear^.AdvBounce:= 1;
+                end;
 gtGenericFaller:begin
                 gear^.AdvBounce:= 1;
                 gear^.Radius:= 1;