hedgewars/uLandGraphics.pas
branchtransitional_engine
changeset 15901 f39f0f614dbf
parent 15900 128ace913837
equal deleted inserted replaced
15900:128ace913837 15901:f39f0f614dbf
    76 function drawPixelBG(landX, landY, pixelX, pixelY: Longint): Longword;
    76 function drawPixelBG(landX, landY, pixelX, pixelY: Longint): Longword;
    77 begin
    77 begin
    78 drawPixelBG := 0;
    78 drawPixelBG := 0;
    79 if (LandGet(LandY, landX) and lfIndestructible) = 0 then
    79 if (LandGet(LandY, landX) and lfIndestructible) = 0 then
    80     begin
    80     begin
    81         if ((LandGet(landY, landX) and lfBasic) <> 0) and (((LandPixels[pixelY, pixelX] and AMask) shr AShift) = 255) and (not disableLandBack) then
    81         if ((LandGet(landY, landX) and lfBasic) <> 0) and (((LandPixelGet(pixelY, pixelX) and AMask) shr AShift) = 255) and (not disableLandBack) then
    82         begin
    82         begin
    83             LandPixels[pixelY, pixelX]:= LandBackPixel(landX, landY);
    83             LandPixelSet(pixelY, pixelX, LandBackPixel(landX, landY));
    84             inc(drawPixelBG);
    84             inc(drawPixelBG);
    85         end
    85         end
    86         else if ((LandGet(landY, landX) and lfObject) <> 0) or (((LandPixels[pixelY, pixelX] and AMask) shr AShift) < 255) then
    86         else if ((LandGet(landY, landX) and lfObject) <> 0) or (((LandPixelGet(pixelY, pixelX) and AMask) shr AShift) < 255) then
    87             LandPixels[pixelY, pixelX]:= ExplosionBorderColorNoA
    87             LandPixelSet(pixelY, pixelX, ExplosionBorderColorNoA)
    88     end;
    88     end;
    89 end;
    89 end;
    90 
    90 
    91 procedure drawPixelEBC(landX, landY, pixelX, pixelY: Longint);
    91 procedure drawPixelEBC(landX, landY, pixelX, pixelY: Longint);
    92 begin
    92 begin
    93 if (LandGet(landY, landX) and lfIndestructible = 0) and
    93 if (LandGet(landY, landX) and lfIndestructible = 0) and
    94     (((LandGet(landY, landX) and lfBasic) <> 0) or ((LandGet(landY, landX) and lfObject) <> 0)) then
    94     (((LandGet(landY, landX) and lfBasic) <> 0) or ((LandGet(landY, landX) and lfObject) <> 0)) then
    95     begin
    95     begin
    96     LandPixels[pixelY, pixelX]:= ExplosionBorderColor;
    96     LandPixelSet(pixelY, pixelX, ExplosionBorderColor);
    97     LandSet(landY, landX, (LandGet(landY, landX) or lfDamaged) and (not lfIce));
    97     LandSet(landY, landX, (LandGet(landY, landX) or lfDamaged) and (not lfIce));
    98     LandDirty[landY div 32, landX div 32]:= 1;
    98     LandDirty[landY div 32, landX div 32]:= 1;
    99     end;
    99     end;
   100 end;
   100 end;
   101 
   101 
   134 begin
   134 begin
   135     if cOnlyStats then exit;
   135     if cOnlyStats then exit;
   136     // So. 3 parameters here. Ice colour, Ice opacity, and a bias on the greyscaled pixel towards lightness
   136     // So. 3 parameters here. Ice colour, Ice opacity, and a bias on the greyscaled pixel towards lightness
   137     iceSurface:= SpritesData[sprIceTexture].Surface;
   137     iceSurface:= SpritesData[sprIceTexture].Surface;
   138     icePixels := iceSurface^.pixels;
   138     icePixels := iceSurface^.pixels;
   139     w:= LandPixels[pixelY, pixelX];
   139     w:= LandPixelGet(pixelY, pixelX);
   140     if w > 0 then
   140     if w > 0 then
   141         begin
   141         begin
   142         w:= round(((w shr RShift and $FF) * RGB_LUMINANCE_RED +
   142         w:= round(((w shr RShift and $FF) * RGB_LUMINANCE_RED +
   143               (w shr BShift and $FF) * RGB_LUMINANCE_GREEN +
   143               (w shr BShift and $FF) * RGB_LUMINANCE_GREEN +
   144               (w shr GShift and $FF) * RGB_LUMINANCE_BLUE));
   144               (w shr GShift and $FF) * RGB_LUMINANCE_BLUE));
   145         if w < 128 then w:= w+128;
   145         if w < 128 then w:= w+128;
   146         if w > 255 then w:= 255;
   146         if w > 255 then w:= 255;
   147         w:= (w shl RShift) or (w shl BShift) or (w shl GShift) or (LandPixels[pixelY, pixelX] and AMask);
   147         w:= (w shl RShift) or (w shl BShift) or (w shl GShift) or (LandPixelGet(pixelY, pixelX) and AMask);
   148         LandPixels[pixelY, pixelX]:= addBgColor(w, IceColor);
   148         LandPixelSet(pixelY, pixelX, addBgColor(w, IceColor));
   149         LandPixels[pixelY, pixelX]:= addBgColor(LandPixels[pixelY, pixelX], icePixels^[iceSurface^.w * (pixelY mod iceSurface^.h) + (pixelX mod iceSurface^.w)])
   149         LandPixelSet(pixelY, pixelX, addBgColor(LandPixelGet(pixelY, pixelX), icePixels^[iceSurface^.w * (pixelY mod iceSurface^.h) + (pixelX mod iceSurface^.w)]))
   150         end
   150         end
   151     else
   151     else
   152         begin
   152         begin
   153         LandPixels[pixelY, pixelX]:= IceColor and (not AMask) or $E8 shl AShift;
   153         LandPixelSet(pixelY, pixelX, IceColor and (not AMask) or $E8 shl AShift);
   154         LandPixels[pixelY, pixelX]:= addBgColor(LandPixels[pixelY, pixelX], icePixels^[iceSurface^.w * (pixelY mod iceSurface^.h) + (pixelX mod iceSurface^.w)]);
   154         LandPixelSet(pixelY, pixelX, addBgColor(LandPixelGet(pixelY, pixelX), icePixels^[iceSurface^.w * (pixelY mod iceSurface^.h) + (pixelX mod iceSurface^.w)]));
   155         // silly workaround to avoid having to make background erasure a tadb it smarter about sea ice
   155         // silly workaround to avoid having to make background erasure a tadb it smarter about sea ice
   156         if LandPixels[pixelY, pixelX] and AMask shr AShift = 255 then
   156         if LandPixelGet(pixelY, pixelX) and AMask shr AShift = 255 then
   157             LandPixels[pixelY, pixelX]:= LandPixels[pixelY, pixelX] and (not AMask) or 254 shl AShift;
   157             LandPixelSet(pixelY, pixelX, LandPixelGet(pixelY, pixelX) and (not AMask) or 254 shl AShift);
   158         end;
   158         end;
   159 end;
   159 end;
   160 
   160 
   161 
   161 
   162 procedure DrawPixelIce(landX, landY, pixelX, pixelY: Longint);
   162 procedure DrawPixelIce(landX, landY, pixelX, pixelY: Longint);
   163 begin
   163 begin
   164 if ((LandGet(landY, landX) and lfIce) <> 0) then exit;
   164 if ((LandGet(landY, landX) and lfIce) <> 0) then exit;
   165 if (pixelX < LeftX) or (pixelX > RightX) or (pixelY < TopY) then exit;
   165 if (pixelX < LeftX) or (pixelX > RightX) or (pixelY < TopY) then exit;
   166 if isLandscapeEdge(getPixelWeight(landX, landY)) then
   166 if isLandscapeEdge(getPixelWeight(landX, landY)) then
   167     begin
   167     begin
   168     if (LandPixels[pixelY, pixelX] and AMask < 255) and (LandPixels[pixelY, pixelX] and AMask > 0) then
   168     if (LandPixelGet(pixelY, pixelX) and AMask < 255) and (LandPixelGet(pixelY, pixelX) and AMask > 0) then
   169         LandPixels[pixelY, pixelX] := (IceEdgeColor and (not AMask)) or (LandPixels[pixelY, pixelX] and AMask)
   169         LandPixelSet(pixelY, pixelX, (IceEdgeColor and (not AMask)) or (LandPixelGet(pixelY, pixelX) and AMask))
   170     else if (LandPixels[pixelY, pixelX] and AMask < 255) or (LandGet(landY, landX) > 255) then
   170     else if (LandPixelGet(pixelY, pixelX) and AMask < 255) or (LandGet(landY, landX) > 255) then
   171         LandPixels[pixelY, pixelX] := IceEdgeColor
   171         LandPixelSet(pixelY, pixelX, IceEdgeColor)
   172     end
   172     end
   173 else if LandGet(landY, landX) > 255 then
   173 else if LandGet(landY, landX) > 255 then
   174     begin
   174     begin
   175         fillPixelFromIceSprite(pixelX, pixelY);
   175         fillPixelFromIceSprite(pixelX, pixelY);
   176     end;
   176     end;
   201     nullPixel:
   201     nullPixel:
   202         for i:= fromPix to toPix do
   202         for i:= fromPix to toPix do
   203             begin
   203             begin
   204             calculatePixelsCoordinates(i, y, px, py);
   204             calculatePixelsCoordinates(i, y, px, py);
   205             if ((LandGet(y, i) and lfIndestructible) = 0) and (not disableLandBack or (LandGet(y, i) > 255))  then
   205             if ((LandGet(y, i) and lfIndestructible) = 0) and (not disableLandBack or (LandGet(y, i) > 255))  then
   206                 LandPixels[py, px]:= ExplosionBorderColorNoA;
   206                 LandPixelSet(py, px, ExplosionBorderColorNoA);
   207             end;
   207             end;
   208     icePixel:
   208     icePixel:
   209         for i:= fromPix to toPix do
   209         for i:= fromPix to toPix do
   210             begin
   210             begin
   211             calculatePixelsCoordinates(i, y, px, py);
   211             calculatePixelsCoordinates(i, y, px, py);
   486                     end
   486                     end
   487                 else
   487                 else
   488                     begin
   488                     begin
   489                     by:= ty div 2; bx:= tx div 2;
   489                     by:= ty div 2; bx:= tx div 2;
   490                     end;
   490                     end;
   491                 if ((LandGet(ty, tx) and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
   491                 if ((LandGet(ty, tx) and lfBasic) <> 0) and (((LandPixelGet(by,bx) and AMask) shr AShift) = 255) and (not disableLandBack) then
   492                     LandPixels[by, bx]:= LandBackPixel(tx, ty)
   492                     LandPixelSet(by, bx, LandBackPixel(tx, ty))
   493                 else if ((LandGet(ty, tx) and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
   493                 else if ((LandGet(ty, tx) and lfObject) <> 0) or (((LandPixelGet(by,bx) and AMask) shr AShift) < 255) then
   494                     LandPixels[by, bx]:= LandPixels[by, bx] and (not AMASK)
   494                     LandPixelSet(by, bx, LandPixelGet(by, bx) and (not AMASK))
   495                 end
   495                 end
   496             end;
   496             end;
   497     inc(y, dY)
   497     inc(y, dY)
   498     end;
   498     end;
   499 
   499 
   505     for ty:= Max(y - Radius, 0) to Min(y + Radius, TopY) do
   505     for ty:= Max(y - Radius, 0) to Min(y + Radius, TopY) do
   506         for tx:= Max(LeftX, ar^[i].Left - Radius) to Min(RightX, ar^[i].Right + Radius) do
   506         for tx:= Max(LeftX, ar^[i].Left - Radius) to Min(RightX, ar^[i].Right + Radius) do
   507             if ((LandGet(ty, tx) and lfBasic) <> 0) or ((LandGet(ty, tx) and lfObject) <> 0) then
   507             if ((LandGet(ty, tx) and lfBasic) <> 0) or ((LandGet(ty, tx) and lfObject) <> 0) then
   508                 begin
   508                 begin
   509                  if (cReducedQuality and rqBlurryLand) = 0 then
   509                  if (cReducedQuality and rqBlurryLand) = 0 then
   510                     LandPixels[ty, tx]:= ExplosionBorderColor
   510                     LandPixelSet(ty, tx, ExplosionBorderColor)
   511                 else
   511                 else
   512                     LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor;
   512                     LandPixelSet(ty div 2, tx div 2, ExplosionBorderColor);
   513 
   513 
   514                 LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce));
   514                 LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce));
   515                 LandDirty[ty div 32, tx div 32]:= 1;
   515                 LandDirty[ty div 32, tx div 32]:= 1;
   516                 end;
   516                 end;
   517     inc(y, dY)
   517     inc(y, dY)
   538         begin
   538         begin
   539         LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce));
   539         LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce));
   540         if despeckle then
   540         if despeckle then
   541             LandDirty[ty div 32, tx div 32]:= 1;
   541             LandDirty[ty div 32, tx div 32]:= 1;
   542         if (cReducedQuality and rqBlurryLand) = 0 then
   542         if (cReducedQuality and rqBlurryLand) = 0 then
   543             LandPixels[ty, tx]:= ExplosionBorderColor
   543             LandPixelSet(ty, tx, ExplosionBorderColor)
   544         else
   544         else
   545             LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor
   545             LandPixelSet(ty div 2, tx div 2, ExplosionBorderColor)
   546         end
   546         end
   547     end;
   547     end;
   548 end;
   548 end;
   549 
   549 
   550 type TWrapNeeded = (wnNone, wnLeft, wnRight);
   550 type TWrapNeeded = (wnNone, wnLeft, wnRight);
   588             begin
   588             begin
   589             LandSet(ty, tx, LandGet(ty, tx) or lfDamaged);
   589             LandSet(ty, tx, LandGet(ty, tx) or lfDamaged);
   590             LandDirty[ty div 32, tx div 32]:= 1
   590             LandDirty[ty div 32, tx div 32]:= 1
   591             end;
   591             end;
   592         if (cReducedQuality and rqBlurryLand) = 0 then
   592         if (cReducedQuality and rqBlurryLand) = 0 then
   593             LandPixels[ty, tx]:= ExplosionBorderColor
   593             LandPixelSet(ty, tx, ExplosionBorderColor)
   594         else
   594         else
   595             LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor
   595             LandPixelSet(ty div 2, tx div 2, ExplosionBorderColor)
   596         end
   596         end
   597     end;
   597     end;
   598     nx:= nx - dY;
   598     nx:= nx - dY;
   599     ny:= ny + dX;
   599     ny:= ny + dX;
   600     end;
   600     end;
   620                 end
   620                 end
   621             else
   621             else
   622                 begin
   622                 begin
   623                 by:= ty div 2; bx:= tx div 2;
   623                 by:= ty div 2; bx:= tx div 2;
   624                 end;
   624                 end;
   625             if ((LandGet(ty, tx) and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
   625             if ((LandGet(ty, tx) and lfBasic) <> 0) and (((LandPixelGet(by,bx) and AMask) shr AShift) = 255) and (not disableLandBack) then
   626                 LandPixels[by, bx]:= LandBackPixel(tx, ty)
   626                 LandPixelSet(by, bx, LandBackPixel(tx, ty))
   627             else if ((LandGet(ty, tx) and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
   627             else if ((LandGet(ty, tx) and lfObject) <> 0) or (((LandPixelGet(by,bx) and AMask) shr AShift) < 255) then
   628                 LandPixels[by, bx]:= LandPixels[by, bx] and (not AMASK);
   628                 LandPixelSet(by, bx, LandPixelGet(by, bx) and (not AMASK));
   629             LandSet(ty, tx, 0);
   629             LandSet(ty, tx, 0);
   630             end
   630             end
   631         end;
   631         end;
   632     DrawExplosionBorder(X, Y, dx, dy, despeckle);
   632     DrawExplosionBorder(X, Y, dx, dy, despeckle);
   633     nx:= nx - dY;
   633     nx:= nx - dY;
   649         begin
   649         begin
   650         LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce));
   650         LandSet(ty, tx, (LandGet(ty, tx) or lfDamaged) and (not lfIce));
   651         if despeckle then
   651         if despeckle then
   652             LandDirty[ty div 32, tx div 32]:= 1;
   652             LandDirty[ty div 32, tx div 32]:= 1;
   653         if (cReducedQuality and rqBlurryLand) = 0 then
   653         if (cReducedQuality and rqBlurryLand) = 0 then
   654             LandPixels[ty, tx]:= ExplosionBorderColor
   654             LandPixelSet(ty, tx, ExplosionBorderColor)
   655         else
   655         else
   656             LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor
   656             LandPixelSet(ty div 2, tx div 2, ExplosionBorderColor)
   657         end
   657         end
   658     end;
   658     end;
   659     nx:= nx - dY;
   659     nx:= nx - dY;
   660     ny:= ny + dX;
   660     ny:= ny + dX;
   661     end;
   661     end;
   794                     gY:= (cpY + y) div 2;
   794                     gY:= (cpY + y) div 2;
   795                     end;
   795                     end;
   796                 if (not behind) or (LandGet(cpY + y, cpX + x) and lfLandMask = 0) then
   796                 if (not behind) or (LandGet(cpY + y, cpX + x) and lfLandMask = 0) then
   797                     begin
   797                     begin
   798                     if (LandFlags and lfBasic <> 0) or
   798                     if (LandFlags and lfBasic <> 0) or
   799                        ((LandPixels[gY, gX] and AMask shr AShift > 128) and  // This test assumes lfBasic and lfObject differ only graphically
   799                        ((LandPixelGet(gY, gX) and AMask shr AShift > 128) and  // This test assumes lfBasic and lfObject differ only graphically
   800                          (LandFlags and (lfObject or lfIce) = 0)) then
   800                          (LandFlags and (lfObject or lfIce) = 0)) then
   801                          LandSet(cpY + y, cpX + x, lfBasic or LandFlags)
   801                          LandSet(cpY + y, cpX + x, lfBasic or LandFlags)
   802                     else if (LandFlags and lfIce = 0) then
   802                     else if (LandFlags and lfIce = 0) then
   803 						 LandSet(cpY + y, cpX + x, lfObject or LandFlags)
   803 						 LandSet(cpY + y, cpX + x, lfObject or LandFlags)
   804 					else LandSet(cpY + y, cpX + x, LandFlags)
   804 					else LandSet(cpY + y, cpX + x, LandFlags)
   805                     end;
   805                     end;
   806                 if (not behind) or (LandPixels[gY, gX] = 0) then
   806                 if (not behind) or (LandPixelGet(gY, gX) = 0) then
   807                     begin
   807                     begin
   808                     if tint = $FFFFFFFF then
   808                     if tint = $FFFFFFFF then
   809                         LandPixels[gY, gX]:= PLongword(@(p^[x * 4]))^
   809                         LandPixelSet(gY, gX, PLongword(@(p^[x * 4]))^)
   810                     else
   810                     else
   811                         begin
   811                         begin
   812                         pixel:= PLongword(@(p^[x * 4]))^;
   812                         pixel:= PLongword(@(p^[x * 4]))^;
   813                         LandPixels[gY, gX]:=
   813                         LandPixelSet(gY, gX,
   814                            ceil((pixel shr RShift and $FF) * ((tint shr 24) / 255)) shl RShift or
   814                            ceil((pixel shr RShift and $FF) * ((tint shr 24) / 255)) shl RShift or
   815                            ceil((pixel shr GShift and $FF) * ((tint shr 16 and $ff) / 255)) shl GShift or
   815                            ceil((pixel shr GShift and $FF) * ((tint shr 16 and $ff) / 255)) shl GShift or
   816                            ceil((pixel shr BShift and $FF) * ((tint shr  8 and $ff) / 255)) shl BShift or
   816                            ceil((pixel shr BShift and $FF) * ((tint shr  8 and $ff) / 255)) shl BShift or
   817                            ceil((pixel shr AShift and $FF) * ((tint and $ff) / 255)) shl AShift;
   817                            ceil((pixel shr AShift and $FF) * ((tint and $ff) / 255)) shl AShift);
   818                         end
   818                         end
   819                     end
   819                     end
   820                 end;
   820                 end;
   821         p:= PByteArray(@(p^[Image^.pitch]));
   821         p:= PByteArray(@(p^[Image^.pitch]));
   822         end;
   822         end;
   845 var tx, ty: LongWord;
   845 var tx, ty: LongWord;
   846 begin
   846 begin
   847 for ty:= 0 to height - 1 do
   847 for ty:= 0 to height - 1 do
   848     for tx:= 0 to width - 1 do
   848     for tx:= 0 to width - 1 do
   849         begin
   849         begin
   850         LandPixels[ty, tx]:= 0;
   850         LandPixelSet(ty, tx, 0);
   851         LandSet(Y + ty, X + tx, 0);
   851         LandSet(Y + ty, X + tx, 0);
   852         end;
   852         end;
   853 end;
   853 end;
   854 
   854 
   855 procedure EraseLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert: boolean);
   855 procedure EraseLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert: boolean);
   916                 if (not eraseOnLFMatch or (LandGet(cpY + y, cpX + x) and LandFlags <> 0)) and
   916                 if (not eraseOnLFMatch or (LandGet(cpY + y, cpX + x) and LandFlags <> 0)) and
   917                     ((PLongword(@(p^[x * 4]))^) and AMask <> 0) then
   917                     ((PLongword(@(p^[x * 4]))^) and AMask <> 0) then
   918                     begin
   918                     begin
   919                     if not onlyEraseLF then
   919                     if not onlyEraseLF then
   920                         begin
   920                         begin
   921                         LandPixels[gY, gX]:= 0;
   921                         LandPixelSet(gY, gX, 0);
   922                         LandSet(cpY + y, cpX + x, 0)
   922                         LandSet(cpY + y, cpX + x, 0)
   923                         end
   923                         end
   924                     else LandSet(cpY + y, cpX + x, LandGet(cpY + y, cpX + x) and (not LandFlags))
   924                     else LandSet(cpY + y, cpX + x, LandGet(cpY + y, cpX + x) and (not LandFlags))
   925                     end
   925                     end
   926                 end;
   926                 end;
  1026     begin
  1026     begin
  1027         xx:= X div 2;
  1027         xx:= X div 2;
  1028         yy:= Y div 2;
  1028         yy:= Y div 2;
  1029     end;
  1029     end;
  1030 
  1030 
  1031     pixelsweep:= (LandGet(Y, X) <= lfAllObjMask) and ((LandPixels[yy, xx] and AMask) <> 0);
  1031     pixelsweep:= (LandGet(Y, X) <= lfAllObjMask) and ((LandPixelGet(yy, xx) and AMask) <> 0);
  1032     if (((LandGet(Y, X) and lfDamaged) <> 0) and ((LandGet(Y, X) and lfIndestructible) = 0)) or pixelsweep then
  1032     if (((LandGet(Y, X) and lfDamaged) <> 0) and ((LandGet(Y, X) and lfIndestructible) = 0)) or pixelsweep then
  1033     begin
  1033     begin
  1034         c:= 0;
  1034         c:= 0;
  1035         for i:= -1 to 1 do
  1035         for i:= -1 to 1 do
  1036             for j:= -1 to 1 do
  1036             for j:= -1 to 1 do
  1045                             if ((cReducedQuality and rqBlurryLand) <> 0) then
  1045                             if ((cReducedQuality and rqBlurryLand) <> 0) then
  1046                             begin
  1046                             begin
  1047                                 ny:= Y div 2 + i;
  1047                                 ny:= Y div 2 + i;
  1048                                 nx:= X div 2 + j;
  1048                                 nx:= X div 2 + j;
  1049                                 if ((ny and (LAND_HEIGHT_MASK div 2)) = 0) and ((nx and (LAND_WIDTH_MASK div 2)) = 0) then
  1049                                 if ((ny and (LAND_HEIGHT_MASK div 2)) = 0) and ((nx and (LAND_WIDTH_MASK div 2)) = 0) then
  1050                                     if (LandPixels[ny, nx] and AMASK) <> 0 then
  1050                                     if (LandPixelGet(ny, nx) and AMASK) <> 0 then
  1051                                         inc(c);
  1051                                         inc(c);
  1052                             end
  1052                             end
  1053                             else if (LandPixels[ny, nx] and AMASK)  <> 0 then
  1053                             else if (LandPixelGet(ny, nx) and AMASK)  <> 0 then
  1054                                     inc(c);
  1054                                     inc(c);
  1055                         end
  1055                         end
  1056                     else if LandGet(ny, nx) > 255 then
  1056                     else if LandGet(ny, nx) > 255 then
  1057                         inc(c);
  1057                         inc(c);
  1058                     end
  1058                     end
  1059                 end;
  1059                 end;
  1060 
  1060 
  1061         if c < 4 then // 0-3 neighbours
  1061         if c < 4 then // 0-3 neighbours
  1062         begin
  1062         begin
  1063             if ((LandGet(Y, X) and lfBasic) <> 0) and (not disableLandBack) then
  1063             if ((LandGet(Y, X) and lfBasic) <> 0) and (not disableLandBack) then
  1064                 LandPixels[yy, xx]:= LandBackPixel(X, Y)
  1064                 LandPixelSet(yy, xx, LandBackPixel(X, Y))
  1065             else
  1065             else
  1066                 LandPixels[yy, xx]:= LandPixels[yy, xx] and (not AMASK);
  1066                 LandPixelSet(yy, xx, LandPixelGet(yy, xx) and (not AMASK));
  1067 
  1067 
  1068             if not pixelsweep then
  1068             if not pixelsweep then
  1069             begin
  1069             begin
  1070                 LandSet(Y, X, 0);
  1070                 LandSet(Y, X, 0);
  1071                 exit
  1071                 exit
  1104 for nx:= X-1 to X+1 do
  1104 for nx:= X-1 to X+1 do
  1105     for ny:= Y-1 to Y+1 do
  1105     for ny:= Y-1 to Y+1 do
  1106         // only consider undamaged neighbors (also leads to skipping itself)
  1106         // only consider undamaged neighbors (also leads to skipping itself)
  1107         if (LandGet(ny, nx) and lfDamaged) = 0 then
  1107         if (LandGet(ny, nx) and lfDamaged) = 0 then
  1108             begin
  1108             begin
  1109             pixel:= LandPixels[ny, nx];
  1109             pixel:= LandPixelGet(ny, nx);
  1110             inc(r, (pixel and RMask) shr RShift);
  1110             inc(r, (pixel and RMask) shr RShift);
  1111             inc(g, (pixel and GMask) shr GShift);
  1111             inc(g, (pixel and GMask) shr GShift);
  1112             inc(b, (pixel and BMask) shr BShift);
  1112             inc(b, (pixel and BMask) shr BShift);
  1113             inc(a, (pixel and AMask) shr AShift);
  1113             inc(a, (pixel and AMask) shr AShift);
  1114             dec(c);
  1114             dec(c);
  1130 // set resulting color value based on average of all neighbors
  1130 // set resulting color value based on average of all neighbors
  1131 r:= r div 8;
  1131 r:= r div 8;
  1132 g:= g div 8;
  1132 g:= g div 8;
  1133 b:= b div 8;
  1133 b:= b div 8;
  1134 a:= a div 8;
  1134 a:= a div 8;
  1135 LandPixels[y,x]:= (r shl RShift) or (g shl GShift) or (b shl BShift) or (a shl AShift);
  1135 LandPixelSet(y, x, (r shl RShift) or (g shl GShift) or (b shl BShift) or (a shl AShift));
  1136 
  1136 
  1137 end;
  1137 end;
  1138 
  1138 
  1139 procedure Smooth_oldImpl(X, Y: LongInt);
  1139 procedure Smooth_oldImpl(X, Y: LongInt);
  1140 begin
  1140 begin
  1145     if ((((LandGet(y, x-1) and lfDamaged) <> 0) and (((LandGet(y+1,x) and lfDamaged) <> 0)) or ((LandGet(y-1,x) and lfDamaged) <> 0))
  1145     if ((((LandGet(y, x-1) and lfDamaged) <> 0) and (((LandGet(y+1,x) and lfDamaged) <> 0)) or ((LandGet(y-1,x) and lfDamaged) <> 0))
  1146     or (((LandGet(y, x+1) and lfDamaged) <> 0) and (((LandGet(y-1,x) and lfDamaged) <> 0) or ((LandGet(y+1,x) and lfDamaged) <> 0)))) then
  1146     or (((LandGet(y, x+1) and lfDamaged) <> 0) and (((LandGet(y-1,x) and lfDamaged) <> 0) or ((LandGet(y+1,x) and lfDamaged) <> 0)))) then
  1147         begin
  1147         begin
  1148         if (cReducedQuality and rqBlurryLand) = 0 then
  1148         if (cReducedQuality and rqBlurryLand) = 0 then
  1149             begin
  1149             begin
  1150             if ((LandPixels[y,x] and AMask) shr AShift) < 10 then
  1150             if ((LandPixelGet(y,x) and AMask) shr AShift) < 10 then
  1151                 LandPixels[y,x]:= (ExplosionBorderColor and (not AMask)) or (128 shl AShift)
  1151                 LandPixelSet(y,x, (ExplosionBorderColor and (not AMask)) or (128 shl AShift))
  1152             else
  1152             else
  1153                 LandPixels[y,x]:=
  1153                 LandPixelSet(y,x,
  1154                                 (((((LandPixels[y,x] and RMask shr RShift) div 2)+((ExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or
  1154                                 (((((LandPixelGet(y,x) and RMask shr RShift) div 2)+((ExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or
  1155                                 (((((LandPixels[y,x] and GMask shr GShift) div 2)+((ExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or
  1155                                 (((((LandPixelGet(y,x) and GMask shr GShift) div 2)+((ExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or
  1156                                 (((((LandPixels[y,x] and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift)
  1156                                 (((((LandPixelGet(y,x) and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift))
  1157             end;
  1157             end;
  1158 {
  1158 {
  1159         if (LandGet(y, x-1) = lfObject) then
  1159         if (LandGet(y, x-1) = lfObject) then
  1160             LandGet(y,x):= lfObject
  1160             LandSet(y,x, lfObject)
  1161         else if (LandGet(y, x+1) = lfObject) then
  1161         else if (LandGet(y, x+1) = lfObject) then
  1162             LandGet(y,x):= lfObject
  1162             LandSet(y,x, lfObject)
  1163         else
  1163         else
  1164             LandGet(y,x):= lfBasic;
  1164             LandSet(y,x, lfBasic);
  1165 }
  1165 }
  1166         end
  1166         end
  1167     else if ((((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1167     else if ((((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1168     or (((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0))
  1168     or (((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0))
  1169     or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1169     or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1173     or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))
  1173     or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))
  1174     or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))) then
  1174     or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))) then
  1175         begin
  1175         begin
  1176         if (cReducedQuality and rqBlurryLand) = 0 then
  1176         if (cReducedQuality and rqBlurryLand) = 0 then
  1177             begin
  1177             begin
  1178             if ((LandPixels[y,x] and AMask) shr AShift) < 10 then
  1178             if ((LandPixelGet(y,x) and AMask) shr AShift) < 10 then
  1179                 LandPixels[y,x]:= (ExplosionBorderColor and (not AMask)) or (64 shl AShift)
  1179                 LandPixelSet(y,x, (ExplosionBorderColor and (not AMask)) or (64 shl AShift))
  1180             else
  1180             else
  1181                 LandPixels[y,x]:=
  1181                 LandPixelSet(y,x,
  1182                                 (((((LandPixels[y,x] and RMask shr RShift) * 3 div 4)+((ExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or
  1182                                 (((((LandPixelGet(y,x) and RMask shr RShift) * 3 div 4)+((ExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or
  1183                                 (((((LandPixels[y,x] and GMask shr GShift) * 3 div 4)+((ExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or
  1183                                 (((((LandPixelGet(y,x) and GMask shr GShift) * 3 div 4)+((ExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or
  1184                                 (((((LandPixels[y,x] and BMask shr BShift) * 3 div 4)+((ExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift)
  1184                                 (((((LandPixelGet(y,x) and BMask shr BShift) * 3 div 4)+((ExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift))
  1185             end;
  1185             end;
  1186 {
  1186 {
  1187         if (LandGet(y, x-1) = lfObject) then
  1187         if (LandGet(y, x-1) = lfObject) then
  1188             LandGet(y, x):= lfObject
  1188             LandGet(y, x):= lfObject
  1189         else if (LandGet(y, x+1) = lfObject) then
  1189         else if (LandGet(y, x+1) = lfObject) then
  1194         LandGet(y, x):= lfObject
  1194         LandGet(y, x):= lfObject
  1195         else LandGet(y,x):= lfBasic
  1195         else LandGet(y,x):= lfBasic
  1196 }
  1196 }
  1197         end
  1197         end
  1198     end
  1198     end
  1199 else if ((cReducedQuality and rqBlurryLand) = 0) and ((LandPixels[Y, X] and AMask) = AMask)
  1199 else if ((cReducedQuality and rqBlurryLand) = 0) and ((LandPixelGet(Y, X) and AMask) = AMask)
  1200 and (LandGet(Y, X) and (lfDamaged or lfBasic) = lfBasic)
  1200 and (LandGet(Y, X) and (lfDamaged or lfBasic) = lfBasic)
  1201 and (Y > topY + 1) and (Y < LAND_HEIGHT-2) and (X > leftX + 1) and (X < rightX - 1) then
  1201 and (Y > topY + 1) and (Y < LAND_HEIGHT-2) and (X > leftX + 1) and (X < rightX - 1) then
  1202     begin
  1202     begin
  1203     if ((((LandGet(y, x-1) and lfDamaged) <> 0) and (((LandGet(y+1,x) and lfDamaged) <> 0)) or ((LandGet(y-1,x) and lfDamaged) <> 0))
  1203     if ((((LandGet(y, x-1) and lfDamaged) <> 0) and (((LandGet(y+1,x) and lfDamaged) <> 0)) or ((LandGet(y-1,x) and lfDamaged) <> 0))
  1204     or (((LandGet(y, x+1) and lfDamaged) <> 0) and (((LandGet(y-1,x) and lfDamaged) <> 0) or ((LandGet(y+1,x) and lfDamaged) <> 0)))) then
  1204     or (((LandGet(y, x+1) and lfDamaged) <> 0) and (((LandGet(y-1,x) and lfDamaged) <> 0) or ((LandGet(y+1,x) and lfDamaged) <> 0)))) then
  1205         begin
  1205         begin
  1206         LandPixels[y,x]:=
  1206         LandPixelSet(y,x,
  1207                         (((((LandPixels[y,x] and RMask shr RShift) div 2)+((ExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or
  1207                         (((((LandPixelGet(y,x) and RMask shr RShift) div 2)+((ExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or
  1208                         (((((LandPixels[y,x] and GMask shr GShift) div 2)+((ExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or
  1208                         (((((LandPixelGet(y,x) and GMask shr GShift) div 2)+((ExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or
  1209                         (((((LandPixels[y,x] and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift)
  1209                         (((((LandPixelGet(y,x) and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift))
  1210         end
  1210         end
  1211     else if ((((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1211     else if ((((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1212     or (((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0))
  1212     or (((LandGet(y, x-1) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0))
  1213     or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1213     or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y+2,x) and lfDamaged) <> 0))
  1214     or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0))
  1214     or (((LandGet(y, x+1) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y-2,x) and lfDamaged) <> 0))
  1215     or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0))
  1215     or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0))
  1216     or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0))
  1216     or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x+1) and lfDamaged) <> 0) and ((LandGet(y,x+2) and lfDamaged) <> 0))
  1217     or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))
  1217     or (((LandGet(y+1, x) and lfDamaged) <> 0) and ((LandGet(y+1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))
  1218     or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))) then
  1218     or (((LandGet(y-1, x) and lfDamaged) <> 0) and ((LandGet(y-1,x-1) and lfDamaged) <> 0) and ((LandGet(y,x-2) and lfDamaged) <> 0))) then
  1219         begin
  1219         begin
  1220         LandPixels[y,x]:=
  1220         LandPixelSet(y,x,
  1221                         (((((LandPixels[y,x] and RMask shr RShift) * 3 div 4)+((ExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or
  1221                         (((((LandPixelGet(y,x) and RMask shr RShift) * 3 div 4)+((ExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or
  1222                         (((((LandPixels[y,x] and GMask shr GShift) * 3 div 4)+((ExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or
  1222                         (((((LandPixelGet(y,x) and GMask shr GShift) * 3 div 4)+((ExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or
  1223                         (((((LandPixels[y,x] and BMask shr BShift) * 3 div 4)+((ExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift)
  1223                         (((((LandPixelGet(y,x) and BMask shr BShift) * 3 div 4)+((ExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift))
  1224         end
  1224         end
  1225     end
  1225     end
  1226 end;
  1226 end;
  1227 
  1227 
  1228 function SweepDirty: boolean;
  1228 function SweepDirty: boolean;