hedgewars/uLandGraphics.pas
author unc0rr
Fri, 01 May 2009 09:01:44 +0000
changeset 2021 a591afb43768
parent 1892 fddc1201df25
child 2167 4e9ad395c1d1
permissions -rw-r--r--
Some changes in try to fix issue when you enter room with painted map, but frontend shows generated one (most probably bug is triggered by template filters) Untested.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
393
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
     1
(*
1066
1f1b3686a2b0 Update copyright headers a bit
unc0rr
parents: 883
diff changeset
     2
 * Hedgewars, a free turn based strategy game
883
07a568ba44e0 Update copyright info in source files headers
unc0rr
parents: 855
diff changeset
     3
 * Copyright (c) 2005-2008 Andrey Korotaev <unC0Rr@gmail.com>
393
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
     4
 *
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
     8
 *
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    12
 * GNU General Public License for more details.
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    13
 *
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    14
 * You should have received a copy of the GNU General Public License
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    15
 * along with this program; if not, write to the Free Software
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    17
 *)
db01cc79f278 Update copyright information
unc0rr
parents: 371
diff changeset
    18
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    19
unit uLandGraphics;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    20
interface
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
    21
uses uFloat, uConsts;
345
fa39c61be4de Some fixes, revert debug code
unc0rr
parents: 196
diff changeset
    22
{$INCLUDE options.inc}
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    23
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    24
type PRangeArray = ^TRangeArray;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    25
     TRangeArray = array[0..31] of record
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
    26
                                   Left, Right: LongInt;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    27
                                   end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    28
1792
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
    29
function SweepDirty: boolean;
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
    30
function Despeckle(X, Y: LongInt): boolean;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
    31
procedure DrawExplosion(X, Y, Radius: LongInt);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
    32
procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
    33
procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
    34
procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword);
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
    35
procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    36
520
e83dfb7ffead Teleportation tool
unc0rr
parents: 511
diff changeset
    37
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean): boolean;
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
    38
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    39
implementation
1806
3c4f0886c123 More reorganization
unc0rr
parents: 1792
diff changeset
    40
uses SDLh, uMisc, uLand, uLandTexture;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    41
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
    42
procedure FillCircleLines(x, y, dx, dy: LongInt; Value: Longword);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
    43
var i: LongInt;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    44
begin
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    45
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    46
    for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do 
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    47
        if Land[y + dy, i] <> COLOR_INDESTRUCTIBLE then
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    48
            Land[y + dy, i]:= Value;
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    49
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    50
   for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do 
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    51
        if Land[y - dy, i] <> COLOR_INDESTRUCTIBLE then
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    52
            Land[y - dy, i]:= Value;
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    53
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    54
    for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do 
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    55
        if Land[y + dx, i] <> COLOR_INDESTRUCTIBLE then
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    56
            Land[y + dx, i]:= Value;
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    57
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    58
    for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do 
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    59
        if Land[y - dx, i] <> COLOR_INDESTRUCTIBLE then
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    60
            Land[y - dx, i]:= Value;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    61
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
    62
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
    63
procedure ChangeCircleLines(x, y, dx, dy: LongInt; doSet: boolean);
504
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
    64
var i: LongInt;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
    65
begin
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
    66
if not doSet then
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
    67
   begin
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    68
   if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    69
      for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do
1861
unc0rr
parents: 1849
diff changeset
    70
          if (Land[y + dy, i] > 0) and (Land[y + dy, i] < 256) then dec(Land[y + dy, i]); // check > 0 because explosion can erase collision data
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    71
   if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    72
      for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do
1861
unc0rr
parents: 1849
diff changeset
    73
          if (Land[y - dy, i] > 0) and (Land[y - dy, i] < 256) then dec(Land[y - dy, i]);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    74
   if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    75
      for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do
1861
unc0rr
parents: 1849
diff changeset
    76
          if (Land[y + dx, i] > 0) and (Land[y + dx, i] < 256) then dec(Land[y + dx, i]);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    77
   if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
    78
      for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do
1861
unc0rr
parents: 1849
diff changeset
    79
          if (Land[y - dx, i] > 0) and (Land[y - dx, i] < 256) then dec(Land[y - dx, i]);
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
    80
   end else
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
    81
   begin
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    82
   if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
1861
unc0rr
parents: 1849
diff changeset
    83
      for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do 
unc0rr
parents: 1849
diff changeset
    84
          if (Land[y + dy, i] < 256) then
unc0rr
parents: 1849
diff changeset
    85
              inc(Land[y + dy, i]);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    86
   if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
1861
unc0rr
parents: 1849
diff changeset
    87
      for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do 
unc0rr
parents: 1849
diff changeset
    88
          if (Land[y - dy, i] < 256) then
unc0rr
parents: 1849
diff changeset
    89
              inc(Land[y - dy, i]);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    90
   if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
1861
unc0rr
parents: 1849
diff changeset
    91
      for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do
unc0rr
parents: 1849
diff changeset
    92
          if (Land[y + dx, i] < 256) then
unc0rr
parents: 1849
diff changeset
    93
              inc(Land[y + dx, i]);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
    94
   if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
1861
unc0rr
parents: 1849
diff changeset
    95
      for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do
unc0rr
parents: 1849
diff changeset
    96
          if (Land[y - dx, i] < 256) then
unc0rr
parents: 1849
diff changeset
    97
              inc(Land[y - dx, i]);
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
    98
   end
504
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
    99
end;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   100
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   101
procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   102
var dx, dy, d: LongInt;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   103
begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   104
  dx:= 0;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   105
  dy:= Radius;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   106
  d:= 3 - 2 * Radius;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   107
  while (dx < dy) do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   108
     begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   109
     FillCircleLines(x, y, dx, dy, Value);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   110
     if (d < 0)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   111
     then d:= d + 4 * dx + 6
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   112
     else begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   113
          d:= d + 4 * (dx - dy) + 10;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   114
          dec(dy)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   115
          end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   116
     inc(dx)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   117
     end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   118
  if (dx = dy) then FillCircleLines(x, y, dx, dy, Value);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   119
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   120
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
   121
procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean);
504
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   122
var dx, dy, d: LongInt;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   123
begin
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   124
  dx:= 0;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   125
  dy:= Radius;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   126
  d:= 3 - 2 * Radius;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   127
  while (dx < dy) do
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   128
     begin
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
   129
     ChangeCircleLines(x, y, dx, dy, doSet);
504
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   130
     if (d < 0)
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   131
     then d:= d + 4 * dx + 6
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   132
     else begin
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   133
          d:= d + 4 * (dx - dy) + 10;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   134
          dec(dy)
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   135
          end;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   136
     inc(dx)
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   137
     end;
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
   138
  if (dx = dy) then ChangeCircleLines(x, y, dx, dy, doSet)
504
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   139
end;
13b6ebc53627 Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents: 495
diff changeset
   140
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   141
procedure FillLandCircleLines0(x, y, dx, dy: LongInt);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   142
var i: LongInt;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   143
begin
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   144
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   145
    for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do 
1849
2a989e5abda6 4 utilities by nemo
unc0rr
parents: 1809
diff changeset
   146
        if Land[y + dy, i] = COLOR_LAND then
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   147
            LandPixels[y + dy, i]:= 0;
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   148
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   149
    for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do 
1849
2a989e5abda6 4 utilities by nemo
unc0rr
parents: 1809
diff changeset
   150
        if Land[y - dy, i] = COLOR_LAND then
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   151
             LandPixels[y - dy, i]:= 0;
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   152
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   153
    for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do 
1849
2a989e5abda6 4 utilities by nemo
unc0rr
parents: 1809
diff changeset
   154
        if Land[y + dx, i] = COLOR_LAND then
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   155
            LandPixels[y + dx, i]:= 0;
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   156
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   157
    for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do 
1849
2a989e5abda6 4 utilities by nemo
unc0rr
parents: 1809
diff changeset
   158
        if Land[y - dx, i] = COLOR_LAND then
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   159
             LandPixels[y - dx, i]:= 0;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   160
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   161
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   162
procedure FillLandCircleLinesEBC(x, y, dx, dy: LongInt);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   163
var i: LongInt;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   164
begin
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   165
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   166
   for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   167
       if Land[y + dy, i] = COLOR_LAND then 
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   168
          begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   169
          LandPixels[y + dy, i]:= cExplosionBorderColor;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   170
//          Despeckle(y + dy, i);
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   171
          LandDirty[(y + dy) div 32, i div 32]:= 1;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   172
          end;
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   173
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   174
   for i:= max(x - dx, 0) to min(x + dx, LAND_WIDTH - 1) do
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   175
       if Land[y - dy, i] = COLOR_LAND then
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   176
          begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   177
          LandPixels[y - dy, i]:= cExplosionBorderColor;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   178
//          Despeckle(y - dy, i);
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   179
          LandDirty[(y - dy) div 32, i div 32]:= 1;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   180
          end;
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   181
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   182
   for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   183
       if Land[y + dx, i] = COLOR_LAND then
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   184
           begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   185
           LandPixels[y + dx, i]:= cExplosionBorderColor;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   186
//           Despeckle(y + dx, i);
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   187
           LandDirty[(y + dx) div 32, i div 32]:= 1;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   188
           end;
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   189
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
1760
55a1edd97911 Fix nemo's large land patch
unc0rr
parents: 1753
diff changeset
   190
   for i:= max(x - dy, 0) to min(x + dy, LAND_WIDTH - 1) do
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   191
       if Land[y - dx, i] = COLOR_LAND then
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   192
          begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   193
          LandPixels[y - dx, i]:= cExplosionBorderColor;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   194
//          Despeckle(y - dx, i);
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   195
          LandDirty[(y - dx) div 32, i div 32]:= 1;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   196
          end;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   197
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   198
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   199
procedure DrawExplosion(X, Y, Radius: LongInt);
1807
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   200
var dx, dy, ty, tx, d: LongInt;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   201
begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   202
  dx:= 0;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   203
  dy:= Radius;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   204
  d:= 3 - 2 * Radius;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   205
  while (dx < dy) do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   206
     begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   207
     FillLandCircleLines0(x, y, dx, dy);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   208
     if (d < 0)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   209
     then d:= d + 4 * dx + 6
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   210
     else begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   211
          d:= d + 4 * (dx - dy) + 10;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   212
          dec(dy)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   213
          end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   214
     inc(dx)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   215
     end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   216
  if (dx = dy) then FillLandCircleLines0(x, y, dx, dy);
1849
2a989e5abda6 4 utilities by nemo
unc0rr
parents: 1809
diff changeset
   217
  // FillRoundInLand after erasing land pixels to allow Land 0 check for mask.png to function
2a989e5abda6 4 utilities by nemo
unc0rr
parents: 1809
diff changeset
   218
  FillRoundInLand(X, Y, Radius, 0);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   219
  inc(Radius, 4);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   220
  dx:= 0;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   221
  dy:= Radius;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   222
  d:= 3 - 2 * Radius;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   223
  while (dx < dy) do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   224
     begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   225
     FillLandCircleLinesEBC(x, y, dx, dy);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   226
     if (d < 0)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   227
     then d:= d + 4 * dx + 6
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   228
     else begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   229
          d:= d + 4 * (dx - dy) + 10;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   230
          dec(dy)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   231
          end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   232
     inc(dx)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   233
     end;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 345
diff changeset
   234
  if (dx = dy) then FillLandCircleLinesEBC(x, y, dx, dy);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 345
diff changeset
   235
1807
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   236
tx:= max(X - Radius - 1, 0);
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   237
dx:= min(X + Radius + 1, LAND_WIDTH) - tx;
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   238
ty:= max(Y - Radius - 1, 0);
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   239
dy:= min(Y + Radius + 1, LAND_HEIGHT) - ty;
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   240
UpdateLandTexture(tx, dx, ty, dy)
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   241
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   242
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   243
procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   244
var tx, ty, i: LongInt;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   245
begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   246
for i:= 0 to Pred(Count) do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   247
    begin
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   248
    for ty:= max(y - Radius, 0) to min(y + Radius, LAND_HEIGHT) do
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   249
        for tx:= max(0, ar^[i].Left - Radius) to min(LAND_WIDTH, ar^[i].Right + Radius) do
1849
2a989e5abda6 4 utilities by nemo
unc0rr
parents: 1809
diff changeset
   250
            if Land[ty, tx] = COLOR_LAND then
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   251
                LandPixels[ty, tx]:= 0;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   252
    inc(y, dY)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   253
    end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   254
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   255
inc(Radius, 4);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 345
diff changeset
   256
dec(y, Count * dY);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   257
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   258
for i:= 0 to Pred(Count) do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   259
    begin
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   260
    for ty:= max(y - Radius, 0) to min(y + Radius, LAND_HEIGHT) do
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   261
        for tx:= max(0, ar^[i].Left - Radius) to min(LAND_WIDTH, ar^[i].Right + Radius) do
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   262
            if Land[ty, tx] = COLOR_LAND then
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   263
                begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   264
                LandPixels[ty, tx]:= cExplosionBorderColor;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   265
                LandDirty[trunc((y + dy)/32), trunc(i/32)]:= 1;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   266
                end;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   267
    inc(y, dY)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   268
    end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   269
818
635e58295079 Fix drill bug
unc0rr
parents: 772
diff changeset
   270
1807
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   271
UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT)
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   272
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   273
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   274
//
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   275
//  - (dX, dY) - direction, vector of length = 0.5
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   276
//
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 358
diff changeset
   277
procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt);
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   278
var nx, ny, dX8, dY8: hwFloat;
1809
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   279
    i, t, tx, ty, stX, stY, ddy, ddx: Longint;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   280
begin  // (-dY, dX) is (dX, dY) rotated by PI/2
772
e8d530ca77be Don't update all land texture when drawing tunnel (saves video throughput)
unc0rr
parents: 769
diff changeset
   281
stY:= hwRound(Y);
1809
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   282
stX:= hwRound(X);
772
e8d530ca77be Don't update all land texture when drawing tunnel (saves video throughput)
unc0rr
parents: 769
diff changeset
   283
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   284
nx:= X + dY * (HalfWidth + 8);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   285
ny:= Y - dX * (HalfWidth + 8);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   286
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   287
dX8:= dX * 8;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   288
dY8:= dY * 8;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   289
for i:= 0 to 7 do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   290
    begin
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   291
    X:= nx - dX8;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   292
    Y:= ny - dY8;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   293
    for t:= -8 to ticks + 8 do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   294
        {$include tunsetborder.inc}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   295
    nx:= nx - dY;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   296
    ny:= ny + dX;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   297
    end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   298
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   299
for i:= -HalfWidth to HalfWidth do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   300
    begin
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   301
    X:= nx - dX8;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   302
    Y:= ny - dY8;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   303
    for t:= 0 to 7 do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   304
        {$include tunsetborder.inc}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   305
    X:= nx;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   306
    Y:= ny;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   307
    for t:= 0 to ticks do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   308
        begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   309
        X:= X + dX;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   310
        Y:= Y + dY;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 345
diff changeset
   311
        tx:= hwRound(X);
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 345
diff changeset
   312
        ty:= hwRound(Y);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   313
        if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) then
511
2b5b9e00419d - Further work on new collisions implementation
unc0rr
parents: 505
diff changeset
   314
         if Land[ty, tx] = COLOR_LAND then
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   315
           begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   316
           Land[ty, tx]:= 0;
768
2886dafa5bcf Store Land surface in memory:
unc0rr
parents: 767
diff changeset
   317
           LandPixels[ty, tx]:= 0;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   318
           end
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   319
        end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   320
    for t:= 0 to 7 do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   321
        {$include tunsetborder.inc}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   322
    nx:= nx - dY;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   323
    ny:= ny + dX;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   324
    end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   325
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   326
for i:= 0 to 7 do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   327
    begin
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   328
    X:= nx - dX8;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   329
    Y:= ny - dY8;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   330
    for t:= -8 to ticks + 8 do
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   331
        {$include tunsetborder.inc}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   332
    nx:= nx - dY;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   333
    ny:= ny + dX;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   334
    end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   335
1809
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   336
tx:= max(stX - HalfWidth * 2 - 4 - abs(hwRound(dX * ticks)), 0);
1807
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   337
ty:= max(stY - HalfWidth * 2 - 4 - abs(hwRound(dY * ticks)), 0);
1809
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   338
ddx:= min(stX + HalfWidth * 2 + 4 + abs(hwRound(dX * ticks)), LAND_WIDTH) - tx;
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   339
ddy:= min(stY + HalfWidth * 2 + 4 + abs(hwRound(dY * ticks)), LAND_HEIGHT) - ty;
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   340
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   341
UpdateLandTexture(tx, ddx, ty, ddy)
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   342
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   343
520
e83dfb7ffead Teleportation tool
unc0rr
parents: 511
diff changeset
   344
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean): boolean;
769
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   345
var X, Y, bpp, h, w: LongInt;
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   346
    p: PByteArray;
769
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   347
    Image: PSDL_Surface;
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   348
begin
769
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   349
TryDo(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true);
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   350
Image:= SpritesData[Obj].Surface;
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   351
w:= SpritesData[Obj].Width;
769
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   352
h:= SpritesData[Obj].Height;
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   353
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   354
if SDL_MustLock(Image) then
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   355
   SDLTry(SDL_LockSurface(Image) >= 0, true);
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   356
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   357
bpp:= Image^.format^.BytesPerPixel;
769
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   358
TryDo(bpp = 4, 'It should be 32 bpp sprite', true);
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   359
// Check that sprite fits free space
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   360
p:= @(PByteArray(Image^.pixels)^[Image^.pitch * Frame * h]);
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   361
case bpp of
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   362
     4: for y:= 0 to Pred(h) do
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   363
            begin
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   364
            for x:= 0 to Pred(w) do
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   365
                if PLongword(@(p^[x * 4]))^ <> 0 then
1792
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   366
                   if ((cpY + y) < Longint(topY)) or
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   367
                      ((cpY + y) > LAND_HEIGHT) or
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   368
                      ((cpX + x) < Longint(leftX)) or
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   369
                      ((cpX + x) > Longint(rightX)) or
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   370
                      (Land[cpY + y, cpX + x] <> 0) then
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   371
                      begin
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   372
                      if SDL_MustLock(Image) then
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   373
                         SDL_UnlockSurface(Image);
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   374
                      exit(false)
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   375
                      end;
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   376
            p:= @(p^[Image^.pitch]);
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   377
            end;
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   378
     end;
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   379
520
e83dfb7ffead Teleportation tool
unc0rr
parents: 511
diff changeset
   380
TryPlaceOnLand:= true;
769
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   381
if not doPlace then
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   382
   begin
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   383
   if SDL_MustLock(Image) then
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   384
      SDL_UnlockSurface(Image);
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   385
   exit
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   386
   end;
520
e83dfb7ffead Teleportation tool
unc0rr
parents: 511
diff changeset
   387
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   388
// Checked, now place
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   389
p:= @(PByteArray(Image^.pixels)^[Image^.pitch * Frame * h]);
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   390
case bpp of
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   391
     4: for y:= 0 to Pred(h) do
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   392
            begin
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   393
            for x:= 0 to Pred(w) do
769
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   394
                if PLongword(@(p^[x * 4]))^ <> 0 then
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   395
                   begin
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   396
                   Land[cpY + y, cpX + x]:= COLOR_LAND;
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   397
                   LandPixels[cpY + y, cpX + x]:= PLongword(@(p^[x * 4]))^
788efc1d649f - Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents: 768
diff changeset
   398
                   end;
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   399
            p:= @(p^[Image^.pitch]);
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   400
            end;
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   401
     end;
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   402
if SDL_MustLock(Image) then
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   403
   SDL_UnlockSurface(Image);
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   404
1807
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   405
x:= max(cpX, leftX);
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   406
w:= min(cpX + Image^.w, LAND_WIDTH) - x;
1792
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   407
y:= max(cpY, topY);
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   408
h:= min(cpY + Image^.h, LAND_HEIGHT) - y;
1807
795f97007833 Split land texture into small ones:
unc0rr
parents: 1806
diff changeset
   409
UpdateLandTexture(x, w, y, h)
409
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   410
end;
4f1841929ccc Construction tool
unc0rr
parents: 393
diff changeset
   411
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   412
// was experimenting with applying as damage occurred.
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   413
function Despeckle(X, Y: LongInt): boolean;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   414
var nx, ny, i, j, c: LongInt;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   415
begin
1792
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   416
if (Land[Y, X] <> 0) and (Land[Y, X] <> COLOR_INDESTRUCTIBLE) and (LandPixels[Y, X] = cExplosionBorderColor)then // check neighbours
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   417
	begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   418
	c:= 0;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   419
	for i:= -1 to 1 do
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   420
		for j:= -1 to 1 do
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   421
			if (i <> 0) or (j <> 0) then
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   422
				begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   423
				ny:= Y + i;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   424
				nx:= X + j;
1753
2ccba26f1aa4 Apply nemo's world resize patch
unc0rr
parents: 1738
diff changeset
   425
				if ((ny and LAND_HEIGHT_MASK) = 0) and ((nx and LAND_WIDTH_MASK) = 0) then
1892
fddc1201df25 Some tweaks by nemo
unc0rr
parents: 1861
diff changeset
   426
					if Land[ny, nx] > 255 then
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   427
						inc(c);
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   428
				end;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   429
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   430
	if c < 4 then // 0-3 neighbours
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   431
		begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   432
		LandPixels[Y, X]:= 0;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   433
		Land[Y, X]:= 0;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   434
		exit(true);
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   435
		end;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   436
	end;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   437
Despeckle:= false
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   438
end;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   439
1792
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   440
function SweepDirty: boolean;
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   441
var x, y, xx, yy: LongInt;
1809
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   442
    Result, updateBlock: boolean;
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   443
begin
1792
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   444
Result:= false;
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   445
1761
c7038eade58d Fix width/height dependant consts
unc0rr
parents: 1760
diff changeset
   446
for y:= 0 to LAND_HEIGHT div 32 - 1 do
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   447
	begin
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   448
	
1761
c7038eade58d Fix width/height dependant consts
unc0rr
parents: 1760
diff changeset
   449
	for x:= 0 to LAND_WIDTH div 32 - 1 do
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   450
		begin
1809
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   451
		if LandDirty[y, x] <> 0 then
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   452
			begin
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   453
			updateBlock:= false;
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   454
			for yy:= y * 32 to y * 32 + 31 do
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   455
				for xx:= x * 32 to x * 32 + 31 do
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   456
					if Despeckle(xx, yy) then
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   457
						begin
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   458
						Result:= true;
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   459
						updateBlock:= true;
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   460
						end;
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   461
			if updateBlock then UpdateLandTexture(x * 32, 32, y * 32, 32);
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   462
			LandDirty[y, x]:= 0;
77923087a1ce Some optimization of land texture updating
unc0rr
parents: 1807
diff changeset
   463
			end;
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   464
		end;
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   465
	end;
1792
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   466
c30c6944bd49 engine part of nemo's patch
unc0rr
parents: 1761
diff changeset
   467
SweepDirty:= Result
1738
00e8dadce69a Add nemo's depixeling patch. Still needs some polishing for the case when we delete pixel on which hedgehog stays
unc0rr
parents: 1066
diff changeset
   468
end;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   469
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 109
diff changeset
   470
end.