author | nemo |
Tue, 09 Aug 2011 21:18:12 -0400 | |
changeset 5529 | 9a47cff3910a |
parent 5480 | 37bafa5a7016 |
child 5687 | fac606654317 |
permissions | -rw-r--r-- |
393 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
4976 | 3 |
* Copyright (c) 2004-2011 Andrey Korotaev <unC0Rr@gmail.com> |
393 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
17 |
*) |
|
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
184 | 21 |
unit uLandGraphics; |
22 |
interface |
|
4357
a1fcfc341a52
Introduce unit uTypes in order to remove some cyclic unit dependencies
unC0Rr
parents:
3749
diff
changeset
|
23 |
uses uFloat, uConsts, uTypes; |
184 | 24 |
|
25 |
type PRangeArray = ^TRangeArray; |
|
26 |
TRangeArray = array[0..31] of record |
|
371 | 27 |
Left, Right: LongInt; |
184 | 28 |
end; |
29 |
||
4791 | 30 |
function addBgColor(OldColor, NewColor: LongWord): LongWord; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
31 |
function SweepDirty: boolean; |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
32 |
function Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord; |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
33 |
procedure Smooth(X, Y: LongInt); |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
34 |
function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; |
4377 | 35 |
function DrawExplosion(X, Y, Radius: LongInt): Longword; |
371 | 36 |
procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte); |
37 |
procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt); |
|
38 |
procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); |
|
511 | 39 |
procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean); |
4367 | 40 |
function LandBackPixel(x, y: LongInt): LongWord; |
184 | 41 |
|
4886 | 42 |
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; indestructible: boolean): boolean; |
409 | 43 |
|
184 | 44 |
implementation |
4403 | 45 |
uses SDLh, uLandTexture, uVariables, uUtils, uDebug; |
184 | 46 |
|
4791 | 47 |
function addBgColor(OldColor, NewColor: LongWord): LongWord; |
48 |
// Factor ranges from 0 to 100% NewColor |
|
49 |
var |
|
50 |
oRed, oBlue, oGreen, oAlpha, nRed, nBlue, nGreen, nAlpha: Byte; |
|
51 |
begin |
|
52 |
// Get colors |
|
5041 | 53 |
oAlpha := (OldColor shr AShift) and $FF; |
54 |
oRed := (OldColor shr RShift) and $FF; |
|
55 |
oGreen := (OldColor shr GShift) and $FF; |
|
56 |
oBlue := (OldColor shr BShift) and $FF; |
|
4791 | 57 |
|
5041 | 58 |
nAlpha := (NewColor shr AShift) and $FF; |
59 |
nRed := (NewColor shr RShift) and $FF; |
|
60 |
nGreen := (NewColor shr GShift) and $FF; |
|
61 |
nBlue := (NewColor shr BShift) and $FF; |
|
4791 | 62 |
|
63 |
// Mix colors |
|
64 |
nAlpha := min(255, oAlpha + nAlpha); |
|
5179
8d64dcb566ea
Fix "Mixing signed expressions and longwords gives a 64bit result" warnings
unc0rr
parents:
5041
diff
changeset
|
65 |
nRed := ((oRed * oAlpha) + (nRed * Byte(255-oAlpha))) div 255; |
8d64dcb566ea
Fix "Mixing signed expressions and longwords gives a 64bit result" warnings
unc0rr
parents:
5041
diff
changeset
|
66 |
nGreen := ((oGreen * oAlpha) + (nGreen * Byte(255-oAlpha))) div 255; |
8d64dcb566ea
Fix "Mixing signed expressions and longwords gives a 64bit result" warnings
unc0rr
parents:
5041
diff
changeset
|
67 |
nBlue := ((oBlue * oAlpha) + (nBlue * Byte(255-oAlpha))) div 255; |
4791 | 68 |
|
5041 | 69 |
addBgColor := (nAlpha shl AShift) or (nRed shl RShift) or (nGreen shl GShift) or (nBlue shl BShift); |
4791 | 70 |
end; |
71 |
||
371 | 72 |
procedure FillCircleLines(x, y, dx, dy: LongInt; Value: Longword); |
73 |
var i: LongInt; |
|
184 | 74 |
begin |
1753 | 75 |
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
4374 | 76 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
3519 | 77 |
if (Land[y + dy, i] and lfIndestructible) = 0 then |
1753 | 78 |
Land[y + dy, i]:= Value; |
79 |
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
|
4374 | 80 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
3519 | 81 |
if (Land[y - dy, i] and lfIndestructible) = 0 then |
1753 | 82 |
Land[y - dy, i]:= Value; |
83 |
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
|
4374 | 84 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
3519 | 85 |
if (Land[y + dx, i] and lfIndestructible) = 0 then |
1753 | 86 |
Land[y + dx, i]:= Value; |
87 |
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
|
4374 | 88 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
3519 | 89 |
if (Land[y - dx, i] and lfIndestructible) = 0 then |
1753 | 90 |
Land[y - dx, i]:= Value; |
184 | 91 |
end; |
92 |
||
511 | 93 |
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
|
94 |
var i: LongInt; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
95 |
begin |
511 | 96 |
if not doSet then |
97 |
begin |
|
1753 | 98 |
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
4374 | 99 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
1861 | 100 |
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 | 101 |
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
4374 | 102 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
1861 | 103 |
if (Land[y - dy, i] > 0) and (Land[y - dy, i] < 256) then dec(Land[y - dy, i]); |
1753 | 104 |
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
4374 | 105 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
1861 | 106 |
if (Land[y + dx, i] > 0) and (Land[y + dx, i] < 256) then dec(Land[y + dx, i]); |
1753 | 107 |
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
4374 | 108 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
1861 | 109 |
if (Land[y - dx, i] > 0) and (Land[y - dx, i] < 256) then dec(Land[y - dx, i]); |
511 | 110 |
end else |
111 |
begin |
|
1753 | 112 |
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
4374 | 113 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
3608
c509bbc779e7
Revert prior attempted optimisation. Gridding the land pays in some situations, but not all. Restricting to an upper bound might help, but overall, seems too fuzzy to be worth it. On one side is increased cost of Add/Delete + extra test on collision check, on the other is skipping the list iteration. Perhaps for large lists.
nemo
parents:
3603
diff
changeset
|
114 |
if (Land[y + dy, i] < 256) then |
1861 | 115 |
inc(Land[y + dy, i]); |
1753 | 116 |
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
4374 | 117 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
3608
c509bbc779e7
Revert prior attempted optimisation. Gridding the land pays in some situations, but not all. Restricting to an upper bound might help, but overall, seems too fuzzy to be worth it. On one side is increased cost of Add/Delete + extra test on collision check, on the other is skipping the list iteration. Perhaps for large lists.
nemo
parents:
3603
diff
changeset
|
118 |
if (Land[y - dy, i] < 256) then |
1861 | 119 |
inc(Land[y - dy, i]); |
1753 | 120 |
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
4374 | 121 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
3608
c509bbc779e7
Revert prior attempted optimisation. Gridding the land pays in some situations, but not all. Restricting to an upper bound might help, but overall, seems too fuzzy to be worth it. On one side is increased cost of Add/Delete + extra test on collision check, on the other is skipping the list iteration. Perhaps for large lists.
nemo
parents:
3603
diff
changeset
|
122 |
if (Land[y + dx, i] < 256) then |
1861 | 123 |
inc(Land[y + dx, i]); |
1753 | 124 |
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
4374 | 125 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
3608
c509bbc779e7
Revert prior attempted optimisation. Gridding the land pays in some situations, but not all. Restricting to an upper bound might help, but overall, seems too fuzzy to be worth it. On one side is increased cost of Add/Delete + extra test on collision check, on the other is skipping the list iteration. Perhaps for large lists.
nemo
parents:
3603
diff
changeset
|
126 |
if (Land[y - dx, i] < 256) then |
1861 | 127 |
inc(Land[y - dx, i]); |
511 | 128 |
end |
504
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
129 |
end; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
130 |
|
371 | 131 |
procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); |
132 |
var dx, dy, d: LongInt; |
|
184 | 133 |
begin |
134 |
dx:= 0; |
|
135 |
dy:= Radius; |
|
136 |
d:= 3 - 2 * Radius; |
|
137 |
while (dx < dy) do |
|
138 |
begin |
|
139 |
FillCircleLines(x, y, dx, dy, Value); |
|
140 |
if (d < 0) |
|
141 |
then d:= d + 4 * dx + 6 |
|
142 |
else begin |
|
143 |
d:= d + 4 * (dx - dy) + 10; |
|
144 |
dec(dy) |
|
145 |
end; |
|
146 |
inc(dx) |
|
147 |
end; |
|
148 |
if (dx = dy) then FillCircleLines(x, y, dx, dy, Value); |
|
149 |
end; |
|
150 |
||
511 | 151 |
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
|
152 |
var dx, dy, d: LongInt; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
153 |
begin |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
154 |
dx:= 0; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
155 |
dy:= Radius; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
156 |
d:= 3 - 2 * Radius; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
157 |
while (dx < dy) do |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
158 |
begin |
511 | 159 |
ChangeCircleLines(x, y, dx, dy, doSet); |
504
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
160 |
if (d < 0) |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
161 |
then d:= d + 4 * dx + 6 |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
162 |
else begin |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
163 |
d:= d + 4 * (dx - dy) + 10; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
164 |
dec(dy) |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
165 |
end; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
166 |
inc(dx) |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
167 |
end; |
511 | 168 |
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
|
169 |
end; |
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
170 |
|
2603 | 171 |
procedure FillLandCircleLines0(x, y, dx, dy: LongInt); |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
172 |
var i, t: LongInt; |
184 | 173 |
begin |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
174 |
t:= y + dy; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
175 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 176 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
177 |
if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
178 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
179 |
LandPixels[t, i]:= 0 |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
180 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
181 |
LandPixels[t div 2, i div 2]:= 0; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
182 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
183 |
t:= y - dy; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
184 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 185 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
186 |
if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
187 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
188 |
LandPixels[t, i]:= 0 |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
189 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
190 |
LandPixels[t div 2, i div 2]:= 0; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
191 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
192 |
t:= y + dx; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
193 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 194 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
195 |
if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
196 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
197 |
LandPixels[t, i]:= 0 |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
198 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
199 |
LandPixels[t div 2, i div 2]:= 0; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
200 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
201 |
t:= y - dx; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
202 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 203 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
204 |
if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
205 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
206 |
LandPixels[t, i]:= 0 |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
207 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
208 |
LandPixels[t div 2, i div 2]:= 0; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
209 |
|
184 | 210 |
end; |
211 |
||
3689 | 212 |
function FillLandCircleLinesBG(x, y, dx, dy: LongInt): Longword; |
5480 | 213 |
var i, t, by, bx: LongInt; |
3689 | 214 |
cnt: Longword; |
2647 | 215 |
begin |
3689 | 216 |
cnt:= 0; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
217 |
t:= y + dy; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
218 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 219 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
5480 | 220 |
begin |
221 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
222 |
begin |
|
223 |
by:= t; bx:= i; |
|
224 |
end |
|
225 |
else |
|
226 |
begin |
|
227 |
by:= t div 2; bx:= i div 2; |
|
228 |
end; |
|
229 |
if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then |
|
3689 | 230 |
begin |
231 |
inc(cnt); |
|
5480 | 232 |
LandPixels[by, bx]:= LandBackPixel(i, t) |
3689 | 233 |
end |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
234 |
else |
5480 | 235 |
if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then |
236 |
LandPixels[by, bx]:= 0 |
|
237 |
end; |
|
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
238 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
239 |
t:= y - dy; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
240 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 241 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
5480 | 242 |
begin |
243 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
244 |
begin |
|
245 |
by:= t; bx:= i; |
|
246 |
end |
|
247 |
else |
|
248 |
begin |
|
249 |
by:= t div 2; bx:= i div 2; |
|
250 |
end; |
|
251 |
if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then |
|
3689 | 252 |
begin |
253 |
inc(cnt); |
|
5480 | 254 |
LandPixels[by, bx]:= LandBackPixel(i, t) |
3689 | 255 |
end |
5480 | 256 |
else if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then |
257 |
LandPixels[by, bx]:= 0 |
|
258 |
end; |
|
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
259 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
260 |
t:= y + dx; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
261 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 262 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
5480 | 263 |
begin |
264 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
265 |
begin |
|
266 |
by:= t; bx:= i; |
|
267 |
end |
|
268 |
else |
|
269 |
begin |
|
270 |
by:= t div 2; bx:= i div 2; |
|
271 |
end; |
|
272 |
if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then |
|
3689 | 273 |
begin |
274 |
inc(cnt); |
|
5480 | 275 |
LandPixels[by, bx]:= LandBackPixel(i, t) |
3689 | 276 |
end |
5480 | 277 |
else if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then |
278 |
LandPixels[by, bx]:= 0 |
|
279 |
end; |
|
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
280 |
t:= y - dx; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
281 |
if (t and LAND_HEIGHT_MASK) = 0 then |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
282 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
5480 | 283 |
begin |
284 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
285 |
begin |
|
286 |
by:= t; bx:= i; |
|
287 |
end |
|
288 |
else |
|
289 |
begin |
|
290 |
by:= t div 2; bx:= i div 2; |
|
291 |
end; |
|
292 |
if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then |
|
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
293 |
begin |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
294 |
inc(cnt); |
5480 | 295 |
LandPixels[by, bx]:= LandBackPixel(i, t) |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
296 |
end |
5480 | 297 |
else if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then |
298 |
LandPixels[by, bx]:= 0 |
|
299 |
end; |
|
3689 | 300 |
FillLandCircleLinesBG:= cnt; |
2647 | 301 |
end; |
302 |
||
371 | 303 |
procedure FillLandCircleLinesEBC(x, y, dx, dy: LongInt); |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
304 |
var i, t: LongInt; |
184 | 305 |
begin |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
306 |
t:= y + dy; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
307 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 308 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
309 |
if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) 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
|
310 |
begin |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
311 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
312 |
LandPixels[t, i]:= cExplosionBorderColor |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
313 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
314 |
LandPixels[t div 2, i div 2]:= cExplosionBorderColor; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
315 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
316 |
Land[t, i]:= Land[t, i] or lfDamaged; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
317 |
//Despeckle(i, t); |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
318 |
LandDirty[t div 32, i div 32]:= 1; |
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
|
319 |
end; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
320 |
|
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
321 |
t:= y - dy; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
322 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 323 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
324 |
if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) 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
|
325 |
begin |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
326 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3697 | 327 |
LandPixels[t, i]:= cExplosionBorderColor |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
328 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
329 |
LandPixels[t div 2, i div 2]:= cExplosionBorderColor; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
330 |
Land[t, i]:= Land[t, i] or lfDamaged; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
331 |
//Despeckle(i, t); |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
332 |
LandDirty[t div 32, i div 32]:= 1; |
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
|
333 |
end; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
334 |
|
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
335 |
t:= y + dx; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
336 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 337 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
338 |
if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) 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
|
339 |
begin |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
340 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
341 |
LandPixels[t, i]:= cExplosionBorderColor |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
342 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
343 |
LandPixels[t div 2, i div 2]:= cExplosionBorderColor; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
344 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
345 |
Land[t, i]:= Land[t, i] or lfDamaged; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
346 |
//Despeckle(i, t); |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
347 |
LandDirty[t div 32, i div 32]:= 1; |
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
|
348 |
end; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
349 |
|
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
350 |
t:= y - dx; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
351 |
if (t and LAND_HEIGHT_MASK) = 0 then |
4374 | 352 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
353 |
if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) 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
|
354 |
begin |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
355 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3697 | 356 |
LandPixels[t, i]:= cExplosionBorderColor |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
357 |
else |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
358 |
LandPixels[t div 2, i div 2]:= cExplosionBorderColor; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
359 |
|
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
360 |
Land[t, i]:= Land[t, i] or lfDamaged; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
361 |
//Despeckle(i, y - dy); |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
362 |
LandDirty[t div 32, i div 32]:= 1; |
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
|
363 |
end; |
184 | 364 |
end; |
365 |
||
3689 | 366 |
function DrawExplosion(X, Y, Radius: LongInt): Longword; |
2603 | 367 |
var dx, dy, ty, tx, d: LongInt; |
3689 | 368 |
cnt: Longword; |
184 | 369 |
begin |
2647 | 370 |
|
371 |
// draw background land texture |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
372 |
begin |
3689 | 373 |
cnt:= 0; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
374 |
dx:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
375 |
dy:= Radius; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
376 |
d:= 3 - 2 * Radius; |
2647 | 377 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
378 |
while (dx < dy) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
379 |
begin |
3689 | 380 |
inc(cnt, FillLandCircleLinesBG(x, y, dx, dy)); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
381 |
if (d < 0) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
382 |
then d:= d + 4 * dx + 6 |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
383 |
else begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
384 |
d:= d + 4 * (dx - dy) + 10; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
385 |
dec(dy) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
386 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
387 |
inc(dx) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
388 |
end; |
3689 | 389 |
if (dx = dy) then inc(cnt, FillLandCircleLinesBG(x, y, dx, dy)); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
390 |
end; |
2647 | 391 |
|
392 |
// draw a hole in land |
|
2733 | 393 |
if Radius > 20 then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
394 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
395 |
dx:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
396 |
dy:= Radius - 15; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
397 |
d:= 3 - 2 * dy; |
2647 | 398 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
399 |
while (dx < dy) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
400 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
401 |
FillLandCircleLines0(x, y, dx, dy); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
402 |
if (d < 0) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
403 |
then d:= d + 4 * dx + 6 |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
404 |
else begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
405 |
d:= d + 4 * (dx - dy) + 10; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
406 |
dec(dy) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
407 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
408 |
inc(dx) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
409 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
410 |
if (dx = dy) then FillLandCircleLines0(x, y, dx, dy); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
411 |
end; |
2647 | 412 |
|
1849 | 413 |
// FillRoundInLand after erasing land pixels to allow Land 0 check for mask.png to function |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
414 |
FillRoundInLand(X, Y, Radius, 0); |
2647 | 415 |
|
416 |
// draw explosion border |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
417 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
418 |
inc(Radius, 4); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
419 |
dx:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
420 |
dy:= Radius; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
421 |
d:= 3 - 2 * Radius; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
422 |
while (dx < dy) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
423 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
424 |
FillLandCircleLinesEBC(x, y, dx, dy); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
425 |
if (d < 0) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
426 |
then d:= d + 4 * dx + 6 |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
427 |
else begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
428 |
d:= d + 4 * (dx - dy) + 10; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
429 |
dec(dy) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
430 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
431 |
inc(dx) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
432 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
433 |
if (dx = dy) then FillLandCircleLinesEBC(x, y, dx, dy); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
434 |
end; |
351 | 435 |
|
4374 | 436 |
tx:= Max(X - Radius - 1, 0); |
437 |
dx:= Min(X + Radius + 1, LAND_WIDTH) - tx; |
|
438 |
ty:= Max(Y - Radius - 1, 0); |
|
439 |
dy:= Min(Y + Radius + 1, LAND_HEIGHT) - ty; |
|
3689 | 440 |
UpdateLandTexture(tx, dx, ty, dy); |
441 |
DrawExplosion:= cnt |
|
184 | 442 |
end; |
443 |
||
371 | 444 |
procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte); |
5480 | 445 |
var tx, ty, by, bx, i: LongInt; |
184 | 446 |
begin |
447 |
for i:= 0 to Pred(Count) do |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
448 |
begin |
4374 | 449 |
for ty:= Max(y - Radius, 0) to Min(y + Radius, LAND_HEIGHT) do |
450 |
for tx:= Max(0, ar^[i].Left - Radius) to Min(LAND_WIDTH, ar^[i].Right + Radius) do |
|
5480 | 451 |
begin |
452 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
453 |
begin |
|
454 |
by:= ty; bx:= tx; |
|
455 |
end |
|
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
456 |
else |
5480 | 457 |
begin |
458 |
by:= ty div 2; bx:= tx div 2; |
|
459 |
end; |
|
460 |
if ((Land[ty, tx] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then |
|
461 |
LandPixels[by, bx]:= LandBackPixel(tx, ty) |
|
462 |
else if ((Land[ty, tx] and lfObject) <> 0) or (disableLandBack and ((Land[ty, tx] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then |
|
463 |
LandPixels[by, bx]:= 0 |
|
464 |
end; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
465 |
inc(y, dY) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
466 |
end; |
184 | 467 |
|
468 |
inc(Radius, 4); |
|
351 | 469 |
dec(y, Count * dY); |
184 | 470 |
|
471 |
for i:= 0 to Pred(Count) do |
|
472 |
begin |
|
4374 | 473 |
for ty:= Max(y - Radius, 0) to Min(y + Radius, LAND_HEIGHT) do |
474 |
for tx:= Max(0, ar^[i].Left - Radius) to Min(LAND_WIDTH, ar^[i].Right + Radius) do |
|
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
475 |
if ((Land[ty, tx] and lfBasic) <> 0) or ((Land[ty, tx] and lfObject) <> 0) 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
|
476 |
begin |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
477 |
if (cReducedQuality and rqBlurryLand) = 0 then |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
478 |
LandPixels[ty, tx]:= cExplosionBorderColor |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
479 |
else |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
480 |
LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
481 |
|
3519 | 482 |
Land[ty, tx]:= Land[ty, tx] or lfDamaged; |
3596 | 483 |
LandDirty[ty div 32, tx div 32]:= 1; |
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
|
484 |
end; |
184 | 485 |
inc(y, dY) |
486 |
end; |
|
487 |
||
818 | 488 |
|
1807 | 489 |
UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT) |
184 | 490 |
end; |
491 |
||
492 |
// |
|
493 |
// - (dX, dY) - direction, vector of length = 0.5 |
|
494 |
// |
|
371 | 495 |
procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt); |
358 | 496 |
var nx, ny, dX8, dY8: hwFloat; |
5480 | 497 |
i, t, tx, ty, by, bx, stX, stY, ddy, ddx: Longint; |
5332 | 498 |
despeckle : Boolean; |
184 | 499 |
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
|
500 |
stY:= hwRound(Y); |
1809 | 501 |
stX:= hwRound(X); |
772
e8d530ca77be
Don't update all land texture when drawing tunnel (saves video throughput)
unc0rr
parents:
769
diff
changeset
|
502 |
|
5332 | 503 |
despeckle:= HalfWidth > 1; |
504 |
||
184 | 505 |
nx:= X + dY * (HalfWidth + 8); |
506 |
ny:= Y - dX * (HalfWidth + 8); |
|
507 |
||
358 | 508 |
dX8:= dX * 8; |
509 |
dY8:= dY * 8; |
|
184 | 510 |
for i:= 0 to 7 do |
511 |
begin |
|
358 | 512 |
X:= nx - dX8; |
513 |
Y:= ny - dY8; |
|
184 | 514 |
for t:= -8 to ticks + 8 do |
2666 | 515 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
516 |
X:= X + dX; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
517 |
Y:= Y + dY; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
518 |
tx:= hwRound(X); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
519 |
ty:= hwRound(Y); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
520 |
if ((ty and LAND_HEIGHT_MASK) = 0) and |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
521 |
((tx and LAND_WIDTH_MASK) = 0) and |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
522 |
(((Land[ty, tx] and lfBasic) <> 0) or |
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
523 |
((Land[ty, tx] and lfObject) <> 0)) then |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
524 |
begin |
3519 | 525 |
Land[ty, tx]:= Land[ty, tx] or lfDamaged; |
5332 | 526 |
if despeckle then LandDirty[ty div 32, tx div 32]:= 1; |
527 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
528 |
LandPixels[ty, tx]:= cExplosionBorderColor |
5332 | 529 |
else LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
530 |
end |
2666 | 531 |
end; |
184 | 532 |
nx:= nx - dY; |
533 |
ny:= ny + dX; |
|
534 |
end; |
|
535 |
||
536 |
for i:= -HalfWidth to HalfWidth do |
|
537 |
begin |
|
358 | 538 |
X:= nx - dX8; |
539 |
Y:= ny - dY8; |
|
184 | 540 |
for t:= 0 to 7 do |
2666 | 541 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
542 |
X:= X + dX; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
543 |
Y:= Y + dY; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
544 |
tx:= hwRound(X); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
545 |
ty:= hwRound(Y); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
546 |
if ((ty and LAND_HEIGHT_MASK) = 0) and |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
547 |
((tx and LAND_WIDTH_MASK) = 0) and |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
548 |
(((Land[ty, tx] and lfBasic) <> 0) or |
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
549 |
((Land[ty, tx] and lfObject) <> 0)) then |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
550 |
begin |
3519 | 551 |
Land[ty, tx]:= Land[ty, tx] or lfDamaged; |
5332 | 552 |
if despeckle then LandDirty[ty div 32, tx div 32]:= 1; |
553 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
554 |
LandPixels[ty, tx]:= cExplosionBorderColor |
|
555 |
else LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor |
|
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
556 |
end |
2666 | 557 |
end; |
184 | 558 |
X:= nx; |
559 |
Y:= ny; |
|
560 |
for t:= 0 to ticks do |
|
561 |
begin |
|
562 |
X:= X + dX; |
|
563 |
Y:= Y + dY; |
|
351 | 564 |
tx:= hwRound(X); |
565 |
ty:= hwRound(Y); |
|
3519 | 566 |
if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and ((Land[ty, tx] and lfIndestructible) = 0) then |
2647 | 567 |
begin |
5480 | 568 |
if (cReducedQuality and rqBlurryLand) = 0 then |
569 |
begin |
|
570 |
by:= ty; bx:= tx; |
|
571 |
end |
|
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
572 |
else |
5480 | 573 |
begin |
574 |
by:= ty div 2; bx:= tx div 2; |
|
575 |
end; |
|
576 |
if ((Land[ty, tx] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then |
|
577 |
LandPixels[by, bx]:= LandBackPixel(tx, ty) |
|
578 |
else if ((Land[ty, tx] and lfObject) <> 0) or (disableLandBack and ((Land[ty, tx] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then |
|
579 |
LandPixels[by, bx]:= 0; |
|
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
580 |
|
2647 | 581 |
Land[ty, tx]:= 0; |
582 |
end |
|
184 | 583 |
end; |
584 |
for t:= 0 to 7 do |
|
2666 | 585 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
586 |
X:= X + dX; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
587 |
Y:= Y + dY; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
588 |
tx:= hwRound(X); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
589 |
ty:= hwRound(Y); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
590 |
if ((ty and LAND_HEIGHT_MASK) = 0) and |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
591 |
((tx and LAND_WIDTH_MASK) = 0) and |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
592 |
(((Land[ty, tx] and lfBasic) <> 0) or |
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
593 |
((Land[ty, tx] and lfObject) <> 0)) then |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
594 |
begin |
3519 | 595 |
Land[ty, tx]:= Land[ty, tx] or lfDamaged; |
5332 | 596 |
if despeckle then LandDirty[ty div 32, tx div 32]:= 1; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
597 |
if (cReducedQuality and rqBlurryLand) = 0 then |
5332 | 598 |
LandPixels[ty, tx]:= cExplosionBorderColor |
599 |
else LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor |
|
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
600 |
end |
2666 | 601 |
end; |
184 | 602 |
nx:= nx - dY; |
603 |
ny:= ny + dX; |
|
604 |
end; |
|
605 |
||
606 |
for i:= 0 to 7 do |
|
607 |
begin |
|
358 | 608 |
X:= nx - dX8; |
609 |
Y:= ny - dY8; |
|
184 | 610 |
for t:= -8 to ticks + 8 do |
2666 | 611 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
612 |
X:= X + dX; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
613 |
Y:= Y + dY; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
614 |
tx:= hwRound(X); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
615 |
ty:= hwRound(Y); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
616 |
if ((ty and LAND_HEIGHT_MASK) = 0) and |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
617 |
((tx and LAND_WIDTH_MASK) = 0) and |
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
618 |
(((Land[ty, tx] and lfBasic) <> 0) or |
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
619 |
((Land[ty, tx] and lfObject) <> 0)) then |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
620 |
begin |
3519 | 621 |
Land[ty, tx]:= Land[ty, tx] or lfDamaged; |
5332 | 622 |
if despeckle then LandDirty[ty div 32, tx div 32]:= 1; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
623 |
if (cReducedQuality and rqBlurryLand) = 0 then |
5332 | 624 |
LandPixels[ty, tx]:= cExplosionBorderColor |
625 |
else LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor |
|
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
626 |
end |
2666 | 627 |
end; |
184 | 628 |
nx:= nx - dY; |
629 |
ny:= ny + dX; |
|
630 |
end; |
|
631 |
||
4374 | 632 |
tx:= Max(stX - HalfWidth * 2 - 4 - abs(hwRound(dX * ticks)), 0); |
633 |
ty:= Max(stY - HalfWidth * 2 - 4 - abs(hwRound(dY * ticks)), 0); |
|
634 |
ddx:= Min(stX + HalfWidth * 2 + 4 + abs(hwRound(dX * ticks)), LAND_WIDTH) - tx; |
|
635 |
ddy:= Min(stY + HalfWidth * 2 + 4 + abs(hwRound(dY * ticks)), LAND_HEIGHT) - ty; |
|
1809 | 636 |
|
637 |
UpdateLandTexture(tx, ddx, ty, ddy) |
|
184 | 638 |
end; |
639 |
||
4886 | 640 |
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; indestructible: boolean): boolean; |
2235 | 641 |
var X, Y, bpp, h, w, row, col, numFramesFirstCol: LongInt; |
409 | 642 |
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
|
643 |
Image: PSDL_Surface; |
409 | 644 |
begin |
2235 | 645 |
numFramesFirstCol:= SpritesData[Obj].imageHeight div SpritesData[Obj].Height; |
646 |
||
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
647 |
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
|
648 |
Image:= SpritesData[Obj].Surface; |
409 | 649 |
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
|
650 |
h:= SpritesData[Obj].Height; |
2235 | 651 |
row:= Frame mod numFramesFirstCol; |
652 |
col:= Frame div numFramesFirstCol; |
|
409 | 653 |
|
654 |
if SDL_MustLock(Image) then |
|
655 |
SDLTry(SDL_LockSurface(Image) >= 0, true); |
|
656 |
||
657 |
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
|
658 |
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
|
659 |
// Check that sprite fits free space |
2236 | 660 |
p:= @(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ]); |
409 | 661 |
case bpp of |
662 |
4: for y:= 0 to Pred(h) do |
|
663 |
begin |
|
664 |
for x:= 0 to Pred(w) do |
|
665 |
if PLongword(@(p^[x * 4]))^ <> 0 then |
|
3749 | 666 |
if ((cpY + y) <= Longint(topY)) or |
667 |
((cpY + y) >= LAND_HEIGHT) or |
|
668 |
((cpX + x) <= Longint(leftX)) or |
|
669 |
((cpX + x) >= Longint(rightX)) or |
|
409 | 670 |
(Land[cpY + y, cpX + x] <> 0) then |
671 |
begin |
|
672 |
if SDL_MustLock(Image) then |
|
673 |
SDL_UnlockSurface(Image); |
|
674 |
exit(false) |
|
675 |
end; |
|
676 |
p:= @(p^[Image^.pitch]); |
|
677 |
end; |
|
678 |
end; |
|
679 |
||
520 | 680 |
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
|
681 |
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
|
682 |
begin |
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
683 |
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
|
684 |
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
|
685 |
exit |
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
686 |
end; |
520 | 687 |
|
409 | 688 |
// Checked, now place |
2236 | 689 |
p:= @(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ]); |
409 | 690 |
case bpp of |
691 |
4: for y:= 0 to Pred(h) do |
|
692 |
begin |
|
693 |
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
|
694 |
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
|
695 |
begin |
4886 | 696 |
if indestructible then |
697 |
Land[cpY + y, cpX + x]:= lfIndestructible |
|
698 |
else |
|
699 |
Land[cpY + y, cpX + x]:= lfObject; |
|
3596 | 700 |
if (cReducedQuality and rqBlurryLand) = 0 then |
701 |
LandPixels[cpY + y, cpX + x]:= PLongword(@(p^[x * 4]))^ |
|
702 |
else |
|
703 |
LandPixels[(cpY + y) div 2, (cpX + x) div 2]:= PLongword(@(p^[x * 4]))^ |
|
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
704 |
end; |
409 | 705 |
p:= @(p^[Image^.pitch]); |
706 |
end; |
|
707 |
end; |
|
708 |
if SDL_MustLock(Image) then |
|
709 |
SDL_UnlockSurface(Image); |
|
710 |
||
4374 | 711 |
x:= Max(cpX, leftX); |
712 |
w:= Min(cpX + Image^.w, LAND_WIDTH) - x; |
|
713 |
y:= Max(cpY, topY); |
|
714 |
h:= Min(cpY + Image^.h, LAND_HEIGHT) - y; |
|
1807 | 715 |
UpdateLandTexture(x, w, y, h) |
409 | 716 |
end; |
717 |
||
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
718 |
// was experimenting with applying as damage occurred. |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
719 |
function Despeckle(X, Y: LongInt; gfxOnly: boolean): LongWord; |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
720 |
var nx, ny, i, j, c, xx, yy: LongInt; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
721 |
pixelsweep: 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
|
722 |
begin |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
723 |
if (cReducedQuality and rqBlurryLand) = 0 then |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
724 |
begin |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
725 |
xx:= X; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
726 |
yy:= Y; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
727 |
end |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
728 |
else |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
729 |
begin |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
730 |
xx:= X div 2; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
731 |
yy:= Y div 2; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
732 |
end; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
733 |
pixelsweep:= ((Land[Y, X] and $FF00) = 0) and (LandPixels[yy, xx] <> 0); |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
734 |
if not pixelsweep and gfxOnly then exit(0); |
5364
30752b2e99b3
Sweep all pixels at 0 or 1 neighbours, whether damaged or not. Intended to handled output of Smooth, might be nice to cut down on the counting somehow though.
nemo
parents:
5349
diff
changeset
|
735 |
if ((Land[Y, X] > 255) and ((Land[Y, X] and lfIndestructible) = 0)) or pixelsweep then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
736 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
737 |
c:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
738 |
for i:= -1 to 1 do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
739 |
for j:= -1 to 1 do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
740 |
if (i <> 0) or (j <> 0) then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
741 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
742 |
ny:= Y + i; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
743 |
nx:= X + j; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
744 |
if ((ny and LAND_HEIGHT_MASK) = 0) and ((nx and LAND_WIDTH_MASK) = 0) then |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
745 |
begin |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
746 |
if pixelsweep then |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
747 |
begin |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
748 |
if ((cReducedQuality and rqBlurryLand) <> 0) then |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
749 |
begin |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
750 |
nx:= nx div 2; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
751 |
ny:= ny div 2 |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
752 |
end; |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
753 |
if LandPixels[ny, nx] <> 0 then inc(c); |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
754 |
end |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
755 |
else if Land[ny, nx] > 255 then inc(c); |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
756 |
end |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
757 |
end; |
5364
30752b2e99b3
Sweep all pixels at 0 or 1 neighbours, whether damaged or not. Intended to handled output of Smooth, might be nice to cut down on the counting somehow though.
nemo
parents:
5349
diff
changeset
|
758 |
if (c < 2) or |
30752b2e99b3
Sweep all pixels at 0 or 1 neighbours, whether damaged or not. Intended to handled output of Smooth, might be nice to cut down on the counting somehow though.
nemo
parents:
5349
diff
changeset
|
759 |
((c < 4) and (((Land[Y, X] and lfDamaged) <> 0) or pixelsweep)) then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
760 |
begin |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
761 |
if ((Land[Y, X] and lfBasic) <> 0) and not disableLandBack then |
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
762 |
LandPixels[yy, xx]:= LandBackPixel(X, Y) |
4686
3682db294dae
remove all screwing about with uLandGraphics - have not found a way to properly handle LandBackTex through despeckling or fill checks that does not result in ugly fire damage or wiped out landbacktex. Would rather some snowflakes lines than that.
nemo
parents:
4659
diff
changeset
|
763 |
else |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
764 |
LandPixels[yy, xx]:= 0; |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3554
diff
changeset
|
765 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
766 |
Land[Y, X]:= 0; |
5480 | 767 |
if not pixelsweep then exit(1) |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
768 |
else exit(2) |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
769 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
770 |
end; |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
771 |
Despeckle:= 0 |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
772 |
end; |
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
773 |
|
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
774 |
procedure Smooth(X, Y: LongInt); |
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
775 |
begin |
5261 | 776 |
// a bit of AA for explosions |
5274 | 777 |
if (Land[Y, X] = 0) and (Y > topY+1) and |
5261 | 778 |
(Y < LAND_HEIGHT-2) and (X>leftX+1) and (X<rightX-1) then |
779 |
begin |
|
780 |
if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0)) or |
|
781 |
(((Land[y, x+1] and lfDamaged) <> 0) and (((Land[y-1,x] and lfDamaged) <> 0) or ((Land[y+1,x] and lfDamaged) <> 0)))) then |
|
782 |
begin |
|
5274 | 783 |
if (cReducedQuality and rqBlurryLand) = 0 then |
784 |
begin |
|
785 |
if (LandPixels[y,x] = 0) then LandPixels[y,x]:= (cExplosionBorderColor and not AMask) or (128 shl AShift) |
|
786 |
else |
|
787 |
LandPixels[y,x]:= |
|
788 |
(((((LandPixels[y,x] and RMask shr RShift) div 2)+((cExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or |
|
789 |
(((((LandPixels[y,x] and GMask shr GShift) div 2)+((cExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or |
|
790 |
(((((LandPixels[y,x] and BMask shr BShift) div 2)+((cExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift) |
|
791 |
end; |
|
5261 | 792 |
Land[y,x]:= lfBasic |
793 |
end |
|
794 |
else if ((((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) or |
|
795 |
(((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) or |
|
796 |
(((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) or |
|
797 |
(((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) or |
|
798 |
(((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) or |
|
799 |
(((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) or |
|
800 |
(((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0)) or |
|
801 |
(((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0))) then |
|
802 |
begin |
|
5274 | 803 |
if (cReducedQuality and rqBlurryLand) = 0 then |
804 |
begin |
|
805 |
if (LandPixels[y,x] = 0) then LandPixels[y,x]:= (cExplosionBorderColor and not AMask) or (64 shl AShift) |
|
806 |
else |
|
807 |
LandPixels[y,x]:= |
|
808 |
(((((LandPixels[y,x] and RMask shr RShift) * 3 div 4)+((cExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or |
|
809 |
(((((LandPixels[y,x] and GMask shr GShift) * 3 div 4)+((cExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or |
|
810 |
(((((LandPixels[y,x] and BMask shr BShift) * 3 div 4)+((cExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift) |
|
811 |
end; |
|
5261 | 812 |
Land[y,x]:= lfBasic |
813 |
end |
|
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
814 |
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
|
815 |
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
|
816 |
|
1792 | 817 |
function SweepDirty: boolean; |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
818 |
var x, y, xx, yy, ty, tx, d: LongInt; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
819 |
bRes, updateBlock, resweepCol, resweepGfx, gfxOnly, recheck, firstpass: 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
|
820 |
begin |
2695 | 821 |
bRes:= false; |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
822 |
reCheck:= true; |
1792 | 823 |
|
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
824 |
while recheck do |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
825 |
begin |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
826 |
recheck:= false; |
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
827 |
for y:= 0 to LAND_HEIGHT div 32 - 1 do |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
828 |
begin |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
829 |
for x:= 0 to LAND_WIDTH div 32 - 1 do |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
830 |
begin |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
831 |
if LandDirty[y, x] <> 0 then |
2167
4e9ad395c1d1
Loop sweeping to avoid stray pixels. Avoided at first hoping there was a cleverer approach. Fortunately sweep is infrequent.
nemo
parents:
1892
diff
changeset
|
832 |
begin |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
833 |
updateBlock:= false; |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
834 |
resweepCol:= true; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
835 |
resweepGfx:= true; |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
836 |
firstpass:= true; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
837 |
ty:= y * 32; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
838 |
tx:= x * 32; |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
839 |
while(resweepCol or resweepGfx) do |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
840 |
begin |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
841 |
gfxOnly:= resweepGfx and not resweepCol; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
842 |
resweepCol:= false; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
843 |
resweepGfx:= false; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
844 |
for yy:= ty to ty + 31 do |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
845 |
for xx:= tx to tx + 31 do |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
846 |
begin |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
847 |
d:= Despeckle(xx, yy, gfxOnly); |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
848 |
if d <> 0 then |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
849 |
begin |
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
850 |
bRes:= true; |
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
851 |
updateBlock:= true; |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
852 |
if d = 1 then resweepCol:= true |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
853 |
else resweepGfx:= true; |
5386 | 854 |
if d = 1 then |
5384
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
855 |
if (yy = ty) and (y > 0) then |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
856 |
begin |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
857 |
LandDirty[y-1, x]:= 1; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
858 |
recheck:= true; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
859 |
end |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
860 |
else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
861 |
begin |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
862 |
LandDirty[y+1, x]:= 1; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
863 |
recheck:= true; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
864 |
end; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
865 |
if (xx = tx) and (x > 0) then |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
866 |
begin |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
867 |
LandDirty[y, x-1]:= 1; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
868 |
recheck:= true; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
869 |
end |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
870 |
else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
871 |
begin |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
872 |
LandDirty[y, x+1]:= 1; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
873 |
recheck:= true; |
83d3b50d7e24
separate landpixels/land despeckling results to avoid desyncing on blurry land due to extra despeckling passes. right now, this does mean landpixels edge-of-block recheck is not done
nemo
parents:
5364
diff
changeset
|
874 |
end |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
875 |
end; |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
876 |
if firstpass then Smooth(xx,yy); |
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
877 |
end; |
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
878 |
firstpass:= false |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
879 |
end; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
880 |
if updateBlock then UpdateLandTexture(tx, 32, ty, 32); |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
881 |
LandDirty[y, x]:= 0; |
2167
4e9ad395c1d1
Loop sweeping to avoid stray pixels. Avoided at first hoping there was a cleverer approach. Fortunately sweep is infrequent.
nemo
parents:
1892
diff
changeset
|
882 |
end; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
883 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
884 |
end; |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
885 |
end; |
1792 | 886 |
|
2695 | 887 |
SweepDirty:= bRes; |
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
|
888 |
end; |
184 | 889 |
|
2331
e4941a7986d6
Another try at keeping blowtorch/firepunch/jackhammer from going through indestructible stuff. Shame these routines don't use hedgehog movement
nemo
parents:
2236
diff
changeset
|
890 |
// Return true if outside of land or not the value tested, used right now for some X/Y movement that does not use normal hedgehog movement in GSHandlers.inc |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
891 |
function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; |
2331
e4941a7986d6
Another try at keeping blowtorch/firepunch/jackhammer from going through indestructible stuff. Shame these routines don't use hedgehog movement
nemo
parents:
2236
diff
changeset
|
892 |
begin |
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3236
diff
changeset
|
893 |
CheckLandValue:= ((X and LAND_WIDTH_MASK <> 0) or (Y and LAND_HEIGHT_MASK <> 0)) or ((Land[Y, X] and LandFlag) = 0) |
2331
e4941a7986d6
Another try at keeping blowtorch/firepunch/jackhammer from going through indestructible stuff. Shame these routines don't use hedgehog movement
nemo
parents:
2236
diff
changeset
|
894 |
end; |
4367 | 895 |
|
896 |
function LandBackPixel(x, y: LongInt): LongWord; |
|
897 |
var p: PLongWordArray; |
|
898 |
begin |
|
899 |
if LandBackSurface = nil then LandBackPixel:= 0 |
|
900 |
else |
|
901 |
begin |
|
902 |
p:= LandBackSurface^.pixels; |
|
903 |
LandBackPixel:= p^[LandBackSurface^.w * (y mod LandBackSurface^.h) + (x mod LandBackSurface^.w)];// or $FF000000; |
|
904 |
end |
|
905 |
end; |
|
906 |
||
907 |
||
184 | 908 |
end. |