hedgewars/uVisualGearsHandlers.pas
changeset 15608 19c85b010144
parent 15607 f8c1492601fe
child 15794 95db10dcad71
--- a/hedgewars/uVisualGearsHandlers.pas	Wed May 27 01:24:50 2020 +0200
+++ b/hedgewars/uVisualGearsHandlers.pas	Wed May 27 01:58:27 2020 +0200
@@ -79,11 +79,12 @@
 
 procedure doStepFlake(Gear: PVisualGear; Steps: Longword);
 var sign: real;
-    moved, rising, outside: boolean;
+    moved, rising, outside, fallingFadeIn: boolean;
     vfc, vft, diff: LongWord;
     spawnMargin: LongInt;
 const
     randMargin = 50;
+    maxFallSpeedForFadeIn = 750;
 begin
 if SuddenDeathDmg then
     begin
@@ -103,12 +104,14 @@
         Y:= Y + (dY + tdY + cGravityf * vobSDFallSpeed) * Steps * Gear^.Scale;
         vfc:= vobSDFramesCount;
         vft:= vobSDFrameTicks;
+        fallingFadeIn := vobSDFallSpeed <= maxFallSpeedForFadeIn;
         end
     else
         begin
         Y:= Y + (dY + tdY + cGravityf * vobFallSpeed) * Steps * Gear^.Scale;
         vfc:= vobFramesCount;
         vft:= vobFrameTicks;
+        fallingFadeIn := vobFallSpeed <= maxFallSpeedForFadeIn;
         end;
 
     if vft > 0 then
@@ -186,6 +189,7 @@
         if outside then
             begin
             if rising then
+                // rising flake
                 begin
                 if State = 0 then
                     begin
@@ -194,6 +198,7 @@
                     diff:= Min(diff*2, $FF);
                     if diff >= $FF then
                         begin
+                        // end of fade-out
                         diff:= $FF;
                         State:= 1;
                         end;
@@ -201,6 +206,7 @@
                     end
                 else
                     begin
+                    // reset and move back to bottom
                     Y:= LAND_HEIGHT + spawnMargin + random(50);
                     moved:= true;
                     State:= 0;
@@ -208,12 +214,29 @@
                     end;
                 end
             else
+                // falling flake
                 begin
+                // move back to top
                 Y:= Y - (1024 + spawnMargin + random(50));
                 moved:= true;
+                // activate fade-in if not falling too fast
+                if fallingFadeIn then
+                    begin
+                    State:= $FF;
+                    Tint:= (Tint and $FFFFFF00) or ($FF - State);
+                    end;
                 end;
             if moved then
                 X:= cLeftScreenBorder + random(cScreenSpace);
+            end
+        else if (not rising) and (State > 0) then
+            begin
+            // quickly fade in falling flake after appearing at top
+            if State > 16 then
+                Dec(State, 16)
+            else
+                State:= 0;
+            Tint:= (Tint and $FFFFFF00) or ($FF - State);
             end;
 
         if moved then