# HG changeset patch # User Wuzzy # Date 1533663153 -7200 # Node ID 35d93b1e7fef16f8ce128c28825922ab71427962 # Parent 4c49a49448841bcb0fc4c7e1501d0cd6fee9aca9 Fix foreground flakes (layer 2+6) disappearing when moving camera in world wrap world diff -r 4c49a4944884 -r 35d93b1e7fef ChangeLog.txt --- a/ChangeLog.txt Tue Aug 07 16:23:51 2018 +0200 +++ b/ChangeLog.txt Tue Aug 07 19:32:33 2018 +0200 @@ -20,6 +20,7 @@ * Laser sight now works properly through wrap world edge * Fix projectiles behaving incorrectly with land just behind the wrap world edge * Fix extreme amounts of droplets when shooting with minigun into ocean world edge + * Fix some flakes disappearing in world wrap worlds while moving camera * Fix hog being unable to walk after using sniper rifle without firing both shots * Fix video recorder not working when game audio was disabled * Fix cursor teleporting to center after leaving game with a video recording diff -r 4c49a4944884 -r 35d93b1e7fef hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Tue Aug 07 16:23:51 2018 +0200 +++ b/hedgewars/uVisualGears.pas Tue Aug 07 19:32:33 2018 +0200 @@ -35,7 +35,7 @@ procedure freeModule; procedure ProcessVisualGears(Steps: Longword); -procedure DrawVisualGears(Layer: LongWord); +procedure DrawVisualGears(Layer: LongWord; worldIsShifted: boolean); procedure AddClouds; procedure AddFlakes; @@ -138,7 +138,7 @@ exit(@SpritesData[GetSprite(sprite, SDsprite)]); end; -procedure DrawVisualGears(Layer: LongWord); +procedure DrawVisualGears(Layer: LongWord; worldIsShifted: boolean); var Gear: PVisualGear; tinted, speedlessFlakes: boolean; tmp: real; @@ -163,23 +163,24 @@ 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:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL)); - if cFlattenFlakes then + vgtFlake: if (not worldIsShifted) then begin - if speedlessFlakes then - DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) + sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL)); + if cFlattenFlakes then + begin + if speedlessFlakes then + DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) + else + DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); + end else - DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); - end - else - begin - if speedlessFlakes then - DrawTextureF(SpritesData[sprite].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) - else - DrawTextureRotatedF(SpritesData[sprite].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle); + begin + if speedlessFlakes then + DrawTextureF(SpritesData[sprite].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) + else + DrawTextureRotatedF(SpritesData[sprite].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle); + end; end; - end; end; if Gear^.Tint <> $FFFFFFFF then untint; @@ -195,13 +196,14 @@ if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); case Gear^.Kind of - vgtFlake: begin - 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 - DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); - end; + vgtFlake: if (not worldIsShifted) then + begin + 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 + DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); + end; vgtSmokeTrace: if Gear^.State < 8 then DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State); vgtEvilTrace: if Gear^.State < 8 then @@ -368,13 +370,14 @@ vgtBulletHit: DrawSpriteRotatedF(sprBulletHit, round(Gear^.X) + WorldDx - 0, round(Gear^.Y) + WorldDy - 0, 7 - (Gear^.FrameTicks div 50), 1, Gear^.Angle); end; case Gear^.Kind of - vgtFlake: begin - 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 - DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle); - end; + vgtFlake: if (not worldIsShifted) then + begin + 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 + DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle); + end; vgtCircle: if gear^.Angle = 1 then begin tmp:= Gear^.State / 100; @@ -400,13 +403,14 @@ 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(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 - DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle); - end; + vgtFlake: if (not worldIsShifted) then + begin + 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 + DrawTextureRotatedF(spriteData^.Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height, Gear^.Angle); + end; end; if (Gear^.Tint <> $FFFFFFFF) then untint; @@ -425,13 +429,14 @@ 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:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL)); - if speedlessFlakes then - DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) - else - DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); - end; + vgtFlake: if not (worldIsShifted) then + begin + 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 + DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); + end; end; if (Gear^.Tint <> $FFFFFFFF) then untint; @@ -446,13 +451,14 @@ if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); case Gear^.Kind of - vgtFlake: begin - 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 - DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle) - end; + vgtFlake: if (not worldIsShifted) then + begin + 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 + DrawSpriteRotatedF(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle) + end; vgtNoPlaceWarn: DrawTexture(round(Gear^.X) + WorldDx - round(Gear^.Tex^.w * Gear^.Scale) div 2, round(Gear^.Y) + WorldDy - round(Gear^.Tex^.h * Gear^.Scale) div 2, Gear^.Tex, Gear^.Scale); end; diff -r 4c49a4944884 -r 35d93b1e7fef hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Tue Aug 07 16:23:51 2018 +0200 +++ b/hedgewars/uWorld.pas Tue Aug 07 19:32:33 2018 +0200 @@ -1225,9 +1225,9 @@ untint; end; -DrawVisualGears(0); +DrawVisualGears(0, false); ChangeDepth(RM, -cStereo_MidDistance); -DrawVisualGears(4); +DrawVisualGears(4, false); if (cReducedQuality and rq2DWater) = 0 then begin @@ -1246,7 +1246,7 @@ DrawWaves(-1, 100, - cWaveHeight div 2, - cWaveHeight div 2, 0); ChangeDepth(RM, cStereo_Land); -DrawVisualGears(5); +DrawVisualGears(5, false); DrawLand(WorldDx, WorldDy); if replicateToLeft then @@ -1295,26 +1295,26 @@ if replicateToLeft then begin ShiftWorld(-1); - DrawVisualGears(1); + DrawVisualGears(1, true); DrawGears(); - DrawVisualGears(6); + DrawVisualGears(6, true); UnshiftWorld(); end; if replicateToRight then begin ShiftWorld(1); - DrawVisualGears(1); + DrawVisualGears(1, true); DrawGears(); - DrawVisualGears(6); + DrawVisualGears(6, true); UnshiftWorld(); end; bShowFinger:= tmp; -DrawVisualGears(1); +DrawVisualGears(1, false); DrawGears; -DrawVisualGears(6); +DrawVisualGears(6, false); if SuddenDeathDmg then @@ -1356,18 +1356,18 @@ if replicateToLeft then begin ShiftWorld(-1); - DrawVisualGears(2); + DrawVisualGears(2, true); UnshiftWorld(); end; if replicateToRight then begin ShiftWorld(1); - DrawVisualGears(2); + DrawVisualGears(2, true); UnshiftWorld(); end; - DrawVisualGears(2); + DrawVisualGears(2, false); // everything after this ResetDepth will be drawn at screen level (depth = 0) // note: everything that needs to be readable should be on this level @@ -1376,18 +1376,18 @@ if replicateToLeft then begin ShiftWorld(-1); - DrawVisualGears(3); + DrawVisualGears(3, true); UnshiftWorld(); end; if replicateToRight then begin ShiftWorld(1); - DrawVisualGears(3); + DrawVisualGears(3, true); UnshiftWorld(); end; - DrawVisualGears(3); + DrawVisualGears(3, false); {$WARNINGS OFF} // Target