hedgewars/uVisualGears.pas
branchqmlfrontend
changeset 12855 1b2b84315d27
parent 12702 0dfb49261cab
child 13048 9dd724e8d620
--- a/hedgewars/uVisualGears.pas	Thu Aug 11 23:05:14 2016 +0300
+++ b/hedgewars/uVisualGears.pas	Sun Dec 17 00:09:24 2017 +0100
@@ -125,6 +125,14 @@
         exit(sprite);
 end;
 
+function GetSpriteByWind(sprite, Lsprite: TSprite): TSprite; inline;
+begin
+    if (SpritesData[Lsprite].Texture <> nil) and (cWindSpeedf<0) then
+        exit(Lsprite)
+    else
+        exit(sprite);
+end;
+
 function GetSpriteData(sprite, SDsprite: TSprite): PSpriteData; inline;
 begin
     exit(@SpritesData[GetSprite(sprite, SDsprite)]);
@@ -152,11 +160,11 @@
             if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
             case Gear^.Kind of
               vgtCloud: begin
-                        spriteData:= GetSpriteData(sprCloud, sprSDCloud);
+                        spriteData:= GetSpriteData(GetSpriteByWind(sprCloud, sprCloudL), GetSpriteByWind(sprSDCloud, sprSDCloudL));
                         DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
                         end;
                vgtFlake: begin
-                         sprite:= GetSprite(sprFlake, sprSDFlake);
+                         sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
                          if cFlattenFlakes then
                              begin
                              if speedlessFlakes then
@@ -188,7 +196,7 @@
               Tint(Gear^.Tint);
           case Gear^.Kind of
               vgtFlake: begin
-                         sprite:= GetSprite(sprFlake, sprSDFlake);
+                         sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
                          if speedlessFlakes then
                              DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
                          else
@@ -331,7 +339,8 @@
                             tinted:= true;
                             Tint($FF, $FF, $FF, round(Gear^.alpha * $FF));
                             DrawTextureF(ropeIconTex, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 32, 32);
-                            DrawTextureF(SpritesData[sprAMAmmos].Texture, Gear^.scale * 0.90, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame - 1, 1, 32, 32);
+                            if Gear^.Frame <> ord(amNothing) then
+                                DrawTextureF(SpritesData[sprAMAmmos].Texture, Gear^.scale * 0.90, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame - 1, 1, 32, 32);
                             end;
                    vgtShell: begin
                              if Gear^.FrameTicks < $FF then
@@ -360,7 +369,7 @@
                end;
            case Gear^.Kind of
                vgtFlake: begin
-                         spriteData:= GetSpriteData(sprFlake, sprSDFlake);
+                         spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL));
                          if speedlessFlakes then
                              DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
                          else
@@ -388,11 +397,11 @@
                 Tint(Gear^.Tint);
             case Gear^.Kind of
                vgtCloud: begin
-                         spriteData:= GetSpriteData(sprCloud, sprSDCloud);
+                         spriteData:= GetSpriteData(GetSpriteByWind(sprCloud, sprCloudL), GetSpriteByWind(sprSDCloud, sprSDCloudL));
                          DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height);
                          end;
               vgtFlake: begin
-                        spriteData:= GetSpriteData(sprFlake, sprSDFlake);
+                        spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL));
                         if speedlessFlakes then
                             DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height)
                         else
@@ -413,11 +422,11 @@
                 Tint(Gear^.Tint);
             case Gear^.Kind of
                 vgtCloud: begin
-                          sprite:= GetSprite(sprCloud, sprSDCloud);
+                        sprite:= GetSpriteByWind(GetSprite(sprCloud, sprSDCloud), GetSprite(sprCloudL, sprSDCloudL));
                           DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
                           end;
               vgtFlake: begin
-                        sprite:= GetSprite(sprFlake, sprSDFlake);
+                        sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
                         if speedlessFlakes then
                             DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
                         else
@@ -438,7 +447,7 @@
                 Tint(Gear^.Tint);
             case Gear^.Kind of
                 vgtFlake: begin
-                          sprite:= GetSprite(sprFlake, sprSDFlake);
+                         sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL));
                           if speedlessFlakes then
                               DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
                           else
@@ -463,22 +472,25 @@
 end;
 
 procedure ChangeToSDClouds;
-var       i: LongInt;
+var       i, j: LongInt;
     vg, tmp: PVisualGear;
 begin
 if cCloudsNumber = cSDCloudsNumber then
     exit;
-vg:= VisualGearLayers[0];
-while vg <> nil do
-    if vg^.Kind = vgtCloud then
-        begin
-        tmp:= vg^.NextGear;
-        DeleteVisualGear(vg);
-        vg:= tmp
-        end
-    else vg:= vg^.NextGear;
-for i:= 0 to cSDCloudsNumber - 1 do
-    AddVisualGear(cLeftScreenBorder + i * LongInt(cScreenSpace div (cSDCloudsNumber + 1)), LAND_HEIGHT-1184, vgtCloud)
+for i:= 0 to 6 do
+    begin
+    vg:= VisualGearLayers[i];
+    while vg <> nil do
+        if vg^.Kind = vgtCloud then
+            begin
+            tmp:= vg^.NextGear;
+            DeleteVisualGear(vg);
+            vg:= tmp
+            end
+        else vg:= vg^.NextGear;
+    for j:= 0 to cSDCloudsNumber - 1 do
+        AddVisualGear(cLeftScreenBorder + j * LongInt(cScreenSpace div (cSDCloudsNumber + 1)), LAND_HEIGHT-1184, vgtCloud)
+    end;
 end;
 
 procedure AddFlakes;