author | sheepluva |
Wed, 11 Nov 2015 23:29:49 +0100 | |
branch | sdl2transition |
changeset 11368 | c481d087f653 |
parent 11362 | ed5a6478e710 |
child 11507 | bd9a2f1b0080 |
permissions | -rw-r--r-- |
393 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
11046 | 3 |
* Copyright (c) 2004-2015 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 |
|
10108
c68cf030eded
update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents:
10099
diff
changeset
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
393 | 17 |
*) |
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
184 | 21 |
unit uLandGraphics; |
22 |
interface |
|
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
23 |
uses uFloat, uConsts, uTypes, Math, uRenderUtils; |
184 | 24 |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
25 |
type |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
26 |
fillType = (nullPixel, backgroundPixel, ebcPixel, icePixel, setNotCurrentMask, changePixelSetNotCurrent, setCurrentHog, changePixelNotSetNotCurrent); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
27 |
|
7035 | 28 |
type TRangeArray = array[0..31] of record |
371 | 29 |
Left, Right: LongInt; |
184 | 30 |
end; |
7035 | 31 |
PRangeArray = ^TRangeArray; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
32 |
TLandCircleProcedure = procedure (landX, landY, pixelX, pixelY: Longint); |
184 | 33 |
|
4791 | 34 |
function addBgColor(OldColor, NewColor: LongWord): LongWord; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2695
diff
changeset
|
35 |
function SweepDirty: boolean; |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
36 |
function Despeckle(X, Y: LongInt): Boolean; |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
37 |
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
|
38 |
function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; |
4377 | 39 |
function DrawExplosion(X, Y, Radius: LongInt): Longword; |
371 | 40 |
procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte); |
41 |
procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt); |
|
10244 | 42 |
function FillRoundInLand(X, Y, Radius: LongInt; Value: Longword): Longword; |
9876 | 43 |
function FillRoundInLandFT(X, Y, Radius: LongInt; fill: fillType): Longword; |
7270
93e92e82d5c8
Step 1. Add current hedgehog as top bit of bottom byte.
nemo
parents:
7268
diff
changeset
|
44 |
procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean); |
4367 | 45 |
function LandBackPixel(x, y: LongInt): LongWord; |
6490 | 46 |
procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword); |
10246
8da91cd7a32a
Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents:
10244
diff
changeset
|
47 |
function DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword): Longword; |
7268 | 48 |
procedure DumpLandToLog(x, y, r: LongInt); |
8602 | 49 |
procedure DrawIceBreak(x, y, iceRadius, iceHeight: Longint); |
10295 | 50 |
function TryPlaceOnLandSimple(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; inline; |
10296 | 51 |
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; LandFlags: Word): boolean; inline; |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
52 |
function ForcePlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; Tint: LongWord; Behind, flipHoriz, flipVert: boolean): boolean; inline; |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
53 |
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, outOfMap, force, behind, flipHoriz, flipVert: boolean; LandFlags: Word; Tint: LongWord): boolean; |
10903 | 54 |
procedure EraseLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert: boolean); |
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
55 |
function GetPlaceCollisionTex(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt): PTexture; |
409 | 56 |
|
184 | 57 |
implementation |
10541 | 58 |
uses SDLh, uLandTexture, uTextures, uVariables, uUtils, uDebug, uScript; |
184 | 59 |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
60 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
61 |
procedure calculatePixelsCoordinates(landX, landY: Longint; var pixelX, pixelY: Longint); inline; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
62 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
63 |
if (cReducedQuality and rqBlurryLand) = 0 then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
64 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
65 |
pixelX := landX; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
66 |
pixelY := landY; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
67 |
end |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
68 |
else |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
69 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
70 |
pixelX := LandX div 2; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
71 |
pixelY := LandY div 2; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
72 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
73 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
74 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
75 |
function drawPixelBG(landX, landY, pixelX, pixelY: Longint): Longword; inline; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
76 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
77 |
drawPixelBG := 0; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
78 |
if (Land[LandY, landX] and lfIndestructible) = 0 then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
79 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
80 |
if ((Land[landY, landX] and lfBasic) <> 0) and (((LandPixels[pixelY, pixelX] and AMask) shr AShift) = 255) and (not disableLandBack) then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
81 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
82 |
LandPixels[pixelY, pixelX]:= LandBackPixel(landX, landY); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
83 |
inc(drawPixelBG); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
84 |
end |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
85 |
else if ((Land[landY, landX] and lfObject) <> 0) or (((LandPixels[pixelY, pixelX] and AMask) shr AShift) < 255) then |
10878 | 86 |
LandPixels[pixelY, pixelX]:= ExplosionBorderColorNoA |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
87 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
88 |
end; |
8795 | 89 |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
90 |
procedure drawPixelEBC(landX, landY, pixelX, pixelY: Longint); inline; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
91 |
begin |
10957 | 92 |
if (Land[landY, landX] and lfIndestructible = 0) and |
93 |
(((Land[landY, landX] and lfBasic) <> 0) or ((Land[landY, landX] and lfObject) <> 0)) then |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
94 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
95 |
LandPixels[pixelY, pixelX]:= ExplosionBorderColor; |
8839 | 96 |
Land[landY, landX]:= (Land[landY, landX] or lfDamaged) and (not lfIce); |
8795 | 97 |
LandDirty[landY div 32, landX div 32]:= 1; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
98 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
99 |
end; |
8795 | 100 |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
101 |
function isLandscapeEdge(weight:Longint):boolean; inline; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
102 |
begin |
8841 | 103 |
isLandscapeEdge := (weight < 8) and (weight >= 2); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
104 |
end; |
8795 | 105 |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
106 |
function getPixelWeight(x, y:Longint): Longint; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
107 |
var |
8841 | 108 |
i, j, r: Longint; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
109 |
begin |
8841 | 110 |
r := 0; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
111 |
for i := x - 1 to x + 1 do |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
112 |
for j := y - 1 to y + 1 do |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
113 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
114 |
if (i < 0) or |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
115 |
(i > LAND_WIDTH - 1) or |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
116 |
(j < 0) or |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
117 |
(j > LAND_HEIGHT -1) then |
8841 | 118 |
exit(9); |
119 |
||
8839 | 120 |
if Land[j, i] and lfLandMask and (not lfIce) = 0 then |
8841 | 121 |
inc(r) |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
122 |
end; |
8841 | 123 |
|
124 |
getPixelWeight:= r |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
125 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
126 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
127 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
128 |
procedure fillPixelFromIceSprite(pixelX, pixelY:Longint); inline; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
129 |
var |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
130 |
iceSurface: PSDL_Surface; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
131 |
icePixels: PLongwordArray; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
132 |
w: LongWord; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
133 |
begin |
9460
7d7e4ca70f6b
Skip some LandPixels manipulations in stats-only mode
unc0rr
parents:
9080
diff
changeset
|
134 |
if cOnlyStats then exit; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
135 |
// So. 3 parameters here. Ice colour, Ice opacity, and a bias on the greyscaled pixel towards lightness |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
136 |
iceSurface:= SpritesData[sprIceTexture].Surface; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
137 |
icePixels := iceSurface^.pixels; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
138 |
w:= LandPixels[pixelY, pixelX]; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
139 |
if w > 0 then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
140 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
141 |
w:= round(((w shr RShift and $FF) * RGB_LUMINANCE_RED + |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
142 |
(w shr BShift and $FF) * RGB_LUMINANCE_GREEN + |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
143 |
(w shr GShift and $FF) * RGB_LUMINANCE_BLUE)); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
144 |
if w < 128 then w:= w+128; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
145 |
if w > 255 then w:= 255; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
146 |
w:= (w shl RShift) or (w shl BShift) or (w shl GShift) or (LandPixels[pixelY, pixelX] and AMask); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
147 |
LandPixels[pixelY, pixelX]:= addBgColor(w, IceColor); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
148 |
LandPixels[pixelY, pixelX]:= addBgColor(LandPixels[pixelY, pixelX], icePixels^[iceSurface^.w * (pixelY mod iceSurface^.h) + (pixelX mod iceSurface^.w)]) |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
149 |
end |
8795 | 150 |
else |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
151 |
begin |
8839 | 152 |
LandPixels[pixelY, pixelX]:= IceColor and (not AMask) or $E8 shl AShift; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
153 |
LandPixels[pixelY, pixelX]:= addBgColor(LandPixels[pixelY, pixelX], icePixels^[iceSurface^.w * (pixelY mod iceSurface^.h) + (pixelX mod iceSurface^.w)]); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
154 |
// silly workaround to avoid having to make background erasure a tadb it smarter about sea ice |
8795 | 155 |
if LandPixels[pixelY, pixelX] and AMask shr AShift = 255 then |
8839 | 156 |
LandPixels[pixelY, pixelX]:= LandPixels[pixelY, pixelX] and (not AMask) or 254 shl AShift; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
157 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
158 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
159 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
160 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
161 |
procedure DrawPixelIce(landX, landY, pixelX, pixelY: Longint); inline; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
162 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
163 |
if ((Land[landY, landX] and lfIce) <> 0) then exit; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
164 |
if isLandscapeEdge(getPixelWeight(landX, landY)) then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
165 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
166 |
if (LandPixels[pixelY, pixelX] and AMask < 255) and (LandPixels[pixelY, pixelX] and AMask > 0) then |
8839 | 167 |
LandPixels[pixelY, pixelX] := (IceEdgeColor and (not AMask)) or (LandPixels[pixelY, pixelX] and AMask) |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
168 |
else if (LandPixels[pixelY, pixelX] and AMask < 255) or (Land[landY, landX] > 255) then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
169 |
LandPixels[pixelY, pixelX] := IceEdgeColor |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
170 |
end |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
171 |
else if Land[landY, landX] > 255 then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
172 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
173 |
fillPixelFromIceSprite(pixelX, pixelY); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
174 |
end; |
8839 | 175 |
if Land[landY, landX] > 255 then Land[landY, landX] := Land[landY, landX] or lfIce and (not lfDamaged); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
176 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
177 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
178 |
|
9876 | 179 |
function FillLandCircleLineFT(y, fromPix, toPix: LongInt; fill : fillType): Longword; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
180 |
var px, py, i: LongInt; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
181 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
182 |
//get rid of compiler warning |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
183 |
px := 0; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
184 |
py := 0; |
9876 | 185 |
FillLandCircleLineFT := 0; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
186 |
case fill of |
8795 | 187 |
backgroundPixel: |
9877 | 188 |
for i:= fromPix to toPix do |
189 |
begin |
|
190 |
calculatePixelsCoordinates(i, y, px, py); |
|
191 |
inc(FillLandCircleLineFT, drawPixelBG(i, y, px, py)); |
|
192 |
end; |
|
8795 | 193 |
ebcPixel: |
9877 | 194 |
for i:= fromPix to toPix do |
195 |
begin |
|
196 |
calculatePixelsCoordinates(i, y, px, py); |
|
197 |
drawPixelEBC(i, y, px, py); |
|
198 |
end; |
|
8795 | 199 |
nullPixel: |
9877 | 200 |
for i:= fromPix to toPix do |
201 |
begin |
|
202 |
calculatePixelsCoordinates(i, y, px, py); |
|
203 |
if ((Land[y, i] and lfIndestructible) = 0) and (not disableLandBack or (Land[y, i] > 255)) then |
|
10878 | 204 |
LandPixels[py, px]:= ExplosionBorderColorNoA; |
9877 | 205 |
end; |
8795 | 206 |
icePixel: |
9877 | 207 |
for i:= fromPix to toPix do |
208 |
begin |
|
209 |
calculatePixelsCoordinates(i, y, px, py); |
|
210 |
DrawPixelIce(i, y, px, py); |
|
211 |
end; |
|
8795 | 212 |
setNotCurrentMask: |
9877 | 213 |
for i:= fromPix to toPix do |
214 |
begin |
|
215 |
Land[y, i]:= Land[y, i] and lfNotCurrentMask; |
|
216 |
end; |
|
8795 | 217 |
changePixelSetNotCurrent: |
9877 | 218 |
for i:= fromPix to toPix do |
219 |
begin |
|
220 |
if Land[y, i] and lfObjMask > 0 then |
|
9878 | 221 |
Land[y, i]:= Land[y, i] - 1; |
9877 | 222 |
end; |
8795 | 223 |
setCurrentHog: |
9877 | 224 |
for i:= fromPix to toPix do |
225 |
begin |
|
226 |
Land[y, i]:= Land[y, i] or lfCurrentHog |
|
227 |
end; |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
228 |
changePixelNotSetNotCurrent: |
9877 | 229 |
for i:= fromPix to toPix do |
230 |
begin |
|
231 |
if Land[y, i] and lfObjMask < lfObjMask then |
|
9878 | 232 |
Land[y, i]:= Land[y, i] + 1 |
9877 | 233 |
end; |
8795 | 234 |
end; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
235 |
end; |
8795 | 236 |
|
9876 | 237 |
function FillLandCircleSegmentFT(x, y, dx, dy: LongInt; fill : fillType): Longword; inline; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
238 |
begin |
9876 | 239 |
FillLandCircleSegmentFT := 0; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
240 |
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
9876 | 241 |
inc(FillLandCircleSegmentFT, FillLandCircleLineFT(y + dy, Max(x - dx, 0), Min(x + dx, LAND_WIDTH - 1), fill)); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
242 |
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
9876 | 243 |
inc(FillLandCircleSegmentFT, FillLandCircleLineFT(y - dy, Max(x - dx, 0), Min(x + dx, LAND_WIDTH - 1), fill)); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
244 |
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
9876 | 245 |
inc(FillLandCircleSegmentFT, FillLandCircleLineFT(y + dx, Max(x - dy, 0), Min(x + dy, LAND_WIDTH - 1), fill)); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
246 |
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
9876 | 247 |
inc(FillLandCircleSegmentFT, FillLandCircleLineFT(y - dx, Max(x - dy, 0), Min(x + dy, LAND_WIDTH - 1), fill)); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
248 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
249 |
|
9876 | 250 |
function FillRoundInLandFT(X, Y, Radius: LongInt; fill: fillType): Longword; inline; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
251 |
var dx, dy, d: LongInt; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
252 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
253 |
dx:= 0; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
254 |
dy:= Radius; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
255 |
d:= 3 - 2 * Radius; |
9876 | 256 |
FillRoundInLandFT := 0; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
257 |
while (dx < dy) do |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
258 |
begin |
9876 | 259 |
inc(FillRoundInLandFT, FillLandCircleSegmentFT(x, y, dx, dy, fill)); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
260 |
if (d < 0) then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
261 |
d:= d + 4 * dx + 6 |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
262 |
else |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
263 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
264 |
d:= d + 4 * (dx - dy) + 10; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
265 |
dec(dy) |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
266 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
267 |
inc(dx) |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
268 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
269 |
if (dx = dy) then |
9876 | 270 |
inc (FillRoundInLandFT, FillLandCircleSegmentFT(x, y, dx, dy, fill)); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
271 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
272 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
273 |
|
4791 | 274 |
function addBgColor(OldColor, NewColor: LongWord): LongWord; |
275 |
// Factor ranges from 0 to 100% NewColor |
|
276 |
var |
|
6011
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
277 |
oRed, oBlue, oGreen, oAlpha, nRed, nBlue, nGreen, nAlpha: byte; |
4791 | 278 |
begin |
6011
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
279 |
oAlpha := (OldColor shr AShift); |
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
280 |
nAlpha := (NewColor shr AShift); |
5692 | 281 |
// shortcircuit |
282 |
if (oAlpha = 0) or (nAlpha = $FF) then |
|
283 |
begin |
|
284 |
addBgColor:= NewColor; |
|
285 |
exit |
|
7492
3188794b9d87
Perf opt for the c conversion. Use downto instead to avoid repeated function calls in the loop
nemo
parents:
7270
diff
changeset
|
286 |
end; |
4791 | 287 |
// Get colors |
6011
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
288 |
oRed := (OldColor shr RShift); |
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
289 |
oGreen := (OldColor shr GShift); |
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
290 |
oBlue := (OldColor shr BShift); |
4791 | 291 |
|
6011
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
292 |
nRed := (NewColor shr RShift); |
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
293 |
nGreen := (NewColor shr GShift); |
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
294 |
nBlue := (NewColor shr BShift); |
4791 | 295 |
|
296 |
// Mix colors |
|
6011
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
297 |
nRed := min(255,((nRed*nAlpha) div 255) + ((oRed*oAlpha*byte(255-nAlpha)) div 65025)); |
519f8a58c021
Fix a bunch of warnings (also improves speed a bit in 32 bit code)
unC0Rr
parents:
5895
diff
changeset
|
298 |
nGreen := min(255,((nGreen*nAlpha) div 255) + ((oGreen*oAlpha*byte(255-nAlpha)) div 65025)); |
7492
3188794b9d87
Perf opt for the c conversion. Use downto instead to avoid repeated function calls in the loop
nemo
parents:
7270
diff
changeset
|
299 |
nBlue := min(255,((nBlue*nAlpha) div 255) + ((oBlue*oAlpha*byte(255-nAlpha)) div 65025)); |
4791 | 300 |
nAlpha := min(255, oAlpha + nAlpha); |
301 |
||
5041 | 302 |
addBgColor := (nAlpha shl AShift) or (nRed shl RShift) or (nGreen shl GShift) or (nBlue shl BShift); |
4791 | 303 |
end; |
304 |
||
10244 | 305 |
function FillCircleLines(x, y, dx, dy: LongInt; Value: Longword): Longword; |
371 | 306 |
var i: LongInt; |
184 | 307 |
begin |
10244 | 308 |
FillCircleLines:= 0; |
309 |
||
310 |
if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
|
311 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
|
312 |
if (Land[y + dy, i] and lfIndestructible) = 0 then |
|
313 |
begin |
|
314 |
if Land[y + dy, i] <> Value then inc(FillCircleLines); |
|
315 |
Land[y + dy, i]:= Value; |
|
316 |
end; |
|
317 |
if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
|
318 |
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
|
319 |
if (Land[y - dy, i] and lfIndestructible) = 0 then |
|
320 |
begin |
|
321 |
if Land[y - dy, i] <> Value then inc(FillCircleLines); |
|
322 |
Land[y - dy, i]:= Value; |
|
323 |
end; |
|
324 |
if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
|
325 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
|
326 |
if (Land[y + dx, i] and lfIndestructible) = 0 then |
|
327 |
begin |
|
328 |
if Land[y + dx, i] <> Value then inc(FillCircleLines); |
|
329 |
Land[y + dx, i]:= Value; |
|
330 |
end; |
|
331 |
if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
|
332 |
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
|
333 |
if (Land[y - dx, i] and lfIndestructible) = 0 then |
|
334 |
begin |
|
335 |
if Land[y - dx, i] <> Value then inc(FillCircleLines); |
|
336 |
Land[y - dx, i]:= Value; |
|
337 |
end; |
|
184 | 338 |
end; |
339 |
||
10244 | 340 |
function FillRoundInLand(X, Y, Radius: LongInt; Value: Longword): Longword; |
371 | 341 |
var dx, dy, d: LongInt; |
184 | 342 |
begin |
10244 | 343 |
FillRoundInLand:= 0; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
344 |
dx:= 0; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
345 |
dy:= Radius; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
346 |
d:= 3 - 2 * Radius; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
347 |
while (dx < dy) do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
348 |
begin |
10244 | 349 |
inc(FillRoundInLand, FillCircleLines(x, y, dx, dy, Value)); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
350 |
if (d < 0) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
351 |
d:= d + 4 * dx + 6 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
352 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
353 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
354 |
d:= d + 4 * (dx - dy) + 10; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
355 |
dec(dy) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
356 |
end; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
357 |
inc(dx) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
358 |
end; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
359 |
if (dx = dy) then |
10244 | 360 |
inc(FillRoundInLand, FillCircleLines(x, y, dx, dy, Value)); |
184 | 361 |
end; |
362 |
||
7270
93e92e82d5c8
Step 1. Add current hedgehog as top bit of bottom byte.
nemo
parents:
7268
diff
changeset
|
363 |
procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean); |
504
13b6ebc53627
Fix collision info artifacts in Land array when two objects intersect
unc0rr
parents:
495
diff
changeset
|
364 |
begin |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
365 |
if not doSet and isCurrent then |
9876 | 366 |
FillRoundInLandFT(X, Y, Radius, setNotCurrentMask) |
9954 | 367 |
else if not doSet and (not IsCurrent) then |
9876 | 368 |
FillRoundInLandFT(X, Y, Radius, changePixelSetNotCurrent) |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
369 |
else if doSet and IsCurrent then |
9876 | 370 |
FillRoundInLandFT(X, Y, Radius, setCurrentHog) |
9954 | 371 |
else if doSet and (not IsCurrent) then |
9876 | 372 |
FillRoundInLandFT(X, Y, Radius, changePixelNotSetNotCurrent); |
8583 | 373 |
end; |
374 |
||
8602 | 375 |
procedure DrawIceBreak(x, y, iceRadius, iceHeight: Longint); |
376 |
var |
|
10582 | 377 |
i, j, iceL, iceR, IceT, iceB: LongInt; |
8602 | 378 |
landRect: TSDL_Rect; |
379 |
begin |
|
10582 | 380 |
// figure out bottom/left/right/top coords of ice to draw |
381 |
||
382 |
// determine absolute limits first |
|
383 |
iceT:= 0; |
|
384 |
iceB:= min(cWaterLine, LAND_HEIGHT - 1); |
|
385 |
||
386 |
iceL:= 0; |
|
387 |
iceR:= LAND_WIDTH - 1; |
|
388 |
||
389 |
if WorldEdge <> weNone then |
|
390 |
begin |
|
391 |
iceL:= max(leftX, iceL); |
|
392 |
iceR:= min(rightX, iceR); |
|
393 |
end; |
|
394 |
||
395 |
// adjust based on location but without violating absolute limits |
|
396 |
if y >= cWaterLine then |
|
8602 | 397 |
begin |
10582 | 398 |
iceL:= max(x - iceRadius, iceL); |
399 |
iceR:= min(x + iceRadius, iceR); |
|
400 |
iceT:= max(cWaterLine - iceHeight, iceT); |
|
401 |
end |
|
402 |
else {if WorldEdge = weSea then} |
|
403 |
begin |
|
404 |
iceT:= max(y - iceRadius, iceT); |
|
405 |
iceB:= min(y + iceRadius, iceB); |
|
406 |
if x <= leftX then |
|
407 |
iceR:= min(leftX + iceHeight, iceR) |
|
408 |
else {if x >= rightX then} |
|
409 |
iceL:= max(LongInt(rightX) - iceHeight, iceL); |
|
410 |
end; |
|
411 |
||
412 |
// don't continue if all ice is outside land array |
|
413 |
if (iceL > iceR) or (iceT > iceB) then |
|
414 |
exit(); |
|
415 |
||
416 |
for i := iceL to iceR do |
|
417 |
begin |
|
418 |
for j := iceT to iceB do |
|
8602 | 419 |
begin |
8624 | 420 |
if Land[j, i] = 0 then |
8602 | 421 |
begin |
8795 | 422 |
Land[j, i] := lfIce; |
10099
67b7bc539639
fix for Issue 777 (IceGun: Segfault when freezing water, with rqBlurryLand enabled)
sheepluva
parents:
10040
diff
changeset
|
423 |
if (cReducedQuality and rqBlurryLand) = 0 then |
67b7bc539639
fix for Issue 777 (IceGun: Segfault when freezing water, with rqBlurryLand enabled)
sheepluva
parents:
10040
diff
changeset
|
424 |
fillPixelFromIceSprite(i, j) |
67b7bc539639
fix for Issue 777 (IceGun: Segfault when freezing water, with rqBlurryLand enabled)
sheepluva
parents:
10040
diff
changeset
|
425 |
else |
67b7bc539639
fix for Issue 777 (IceGun: Segfault when freezing water, with rqBlurryLand enabled)
sheepluva
parents:
10040
diff
changeset
|
426 |
fillPixelFromIceSprite(i div 2, j div 2); |
8602 | 427 |
end; |
8795 | 428 |
end; |
8602 | 429 |
end; |
10582 | 430 |
|
431 |
landRect.x := iceL; |
|
432 |
landRect.y := iceT; |
|
433 |
landRect.w := iceR - IceL + 1; |
|
434 |
landRect.h := iceB - iceT + 1; |
|
435 |
||
8795 | 436 |
UpdateLandTexture(landRect.x, landRect.w, landRect.y, landRect.h, true); |
8602 | 437 |
end; |
438 |
||
3689 | 439 |
function DrawExplosion(X, Y, Radius: LongInt): Longword; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
440 |
var |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
441 |
tx, ty, dx, dy: Longint; |
184 | 442 |
begin |
9876 | 443 |
DrawExplosion := FillRoundInLandFT(x, y, Radius, backgroundPixel); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
444 |
if Radius > 20 then |
9876 | 445 |
FillRoundInLandFT(x, y, Radius - 15, nullPixel); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
446 |
FillRoundInLand(X, Y, Radius, 0); |
9876 | 447 |
FillRoundInLandFT(x, y, Radius + 4, ebcPixel); |
8828 | 448 |
tx:= Max(X - Radius - 5, 0); |
449 |
dx:= Min(X + Radius + 5, LAND_WIDTH) - tx; |
|
450 |
ty:= Max(Y - Radius - 5, 0); |
|
451 |
dy:= Min(Y + Radius + 5, LAND_HEIGHT) - ty; |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
452 |
UpdateLandTexture(tx, dx, ty, dy, false); |
184 | 453 |
end; |
454 |
||
371 | 455 |
procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte); |
5480 | 456 |
var tx, ty, by, bx, i: LongInt; |
184 | 457 |
begin |
458 |
for i:= 0 to Pred(Count) do |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
459 |
begin |
7509 | 460 |
for ty:= Max(y - Radius, 0) to Min(y + Radius, LAND_HEIGHT) do |
461 |
for tx:= Max(0, ar^[i].Left - Radius) to Min(LAND_WIDTH, ar^[i].Right + Radius) do |
|
5480 | 462 |
begin |
6096
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
463 |
if (Land[ty, tx] and lfIndestructible) = 0 then |
5480 | 464 |
begin |
6096
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
465 |
if (cReducedQuality and rqBlurryLand) = 0 then |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
466 |
begin |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
467 |
by:= ty; bx:= tx; |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
468 |
end |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
469 |
else |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
470 |
begin |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
471 |
by:= ty div 2; bx:= tx div 2; |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
472 |
end; |
6355 | 473 |
if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then |
6096
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
474 |
LandPixels[by, bx]:= LandBackPixel(tx, ty) |
7492
3188794b9d87
Perf opt for the c conversion. Use downto instead to avoid repeated function calls in the loop
nemo
parents:
7270
diff
changeset
|
475 |
else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then |
10152
15e9bb6fcab2
fix remaining alpha pixel issues (explosion landbacktex borders etc
sheepluva
parents:
10138
diff
changeset
|
476 |
LandPixels[by, bx]:= LandPixels[by, bx] and (not AMASK) |
6096
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
477 |
end |
5480 | 478 |
end; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
479 |
inc(y, dY) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
480 |
end; |
184 | 481 |
|
482 |
inc(Radius, 4); |
|
351 | 483 |
dec(y, Count * dY); |
184 | 484 |
|
485 |
for i:= 0 to Pred(Count) do |
|
486 |
begin |
|
7509 | 487 |
for ty:= Max(y - Radius, 0) to Min(y + Radius, LAND_HEIGHT) do |
488 |
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
|
489 |
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
|
490 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
491 |
if (cReducedQuality and rqBlurryLand) = 0 then |
6982 | 492 |
LandPixels[ty, tx]:= ExplosionBorderColor |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
493 |
else |
6982 | 494 |
LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor; |
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
|
495 |
|
8839 | 496 |
Land[ty, tx]:= (Land[ty, tx] or lfDamaged) and (not lfIce); |
3596 | 497 |
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
|
498 |
end; |
184 | 499 |
inc(y, dY) |
500 |
end; |
|
501 |
||
818 | 502 |
|
7170
84ac6c6d2d8e
Only create textures for non-empty LandPixel chunks. This should save a fair amount of memory, especially on smaller maps, and eliminate a number of draws
nemo
parents:
7150
diff
changeset
|
503 |
UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT, false) |
184 | 504 |
end; |
505 |
||
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
506 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
507 |
|
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
508 |
procedure DrawExplosionBorder(X, Y, dx, dy:hwFloat; despeckle : Boolean); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
509 |
var |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
510 |
t, tx, ty :Longint; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
511 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
512 |
for t:= 0 to 7 do |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
513 |
begin |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
514 |
X:= X + dX; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
515 |
Y:= Y + dY; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
516 |
tx:= hwRound(X); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
517 |
ty:= hwRound(Y); |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
518 |
if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and (((Land[ty, tx] and lfBasic) <> 0) |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
519 |
or ((Land[ty, tx] and lfObject) <> 0)) then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
520 |
begin |
8839 | 521 |
Land[ty, tx]:= (Land[ty, tx] or lfDamaged) and (not lfIce); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
522 |
if despeckle then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
523 |
LandDirty[ty div 32, tx div 32]:= 1; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
524 |
if (cReducedQuality and rqBlurryLand) = 0 then |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
525 |
LandPixels[ty, tx]:= ExplosionBorderColor |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
526 |
else |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
527 |
LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
528 |
end |
8795 | 529 |
end; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
530 |
end; |
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
531 |
|
10674
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
532 |
type TWrapNeeded = (wnNone, wnLeft, wnRight); |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
533 |
|
184 | 534 |
// |
535 |
// - (dX, dY) - direction, vector of length = 0.5 |
|
536 |
// |
|
10674
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
537 |
function DrawTunnel_real(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt): TWrapNeeded; |
358 | 538 |
var nx, ny, dX8, dY8: hwFloat; |
5480 | 539 |
i, t, tx, ty, by, bx, stX, stY, ddy, ddx: Longint; |
5332 | 540 |
despeckle : Boolean; |
184 | 541 |
begin // (-dY, dX) is (dX, dY) rotated by PI/2 |
10674
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
542 |
DrawTunnel_real:= wnNone; |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
543 |
|
772
e8d530ca77be
Don't update all land texture when drawing tunnel (saves video throughput)
unc0rr
parents:
769
diff
changeset
|
544 |
stY:= hwRound(Y); |
1809 | 545 |
stX:= hwRound(X); |
772
e8d530ca77be
Don't update all land texture when drawing tunnel (saves video throughput)
unc0rr
parents:
769
diff
changeset
|
546 |
|
5332 | 547 |
despeckle:= HalfWidth > 1; |
548 |
||
184 | 549 |
nx:= X + dY * (HalfWidth + 8); |
550 |
ny:= Y - dX * (HalfWidth + 8); |
|
551 |
||
358 | 552 |
dX8:= dX * 8; |
553 |
dY8:= dY * 8; |
|
184 | 554 |
for i:= 0 to 7 do |
555 |
begin |
|
358 | 556 |
X:= nx - dX8; |
557 |
Y:= ny - dY8; |
|
184 | 558 |
for t:= -8 to ticks + 8 do |
2666 | 559 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
560 |
X:= X + dX; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
561 |
Y:= Y + dY; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
562 |
tx:= hwRound(X); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
563 |
ty:= hwRound(Y); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
564 |
if ((ty and LAND_HEIGHT_MASK) = 0) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
565 |
and ((tx and LAND_WIDTH_MASK) = 0) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
566 |
and (((Land[ty, tx] and lfBasic) <> 0) or ((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
|
567 |
begin |
8839 | 568 |
Land[ty, tx]:= Land[ty, tx] and (not lfIce); |
7492
3188794b9d87
Perf opt for the c conversion. Use downto instead to avoid repeated function calls in the loop
nemo
parents:
7270
diff
changeset
|
569 |
if despeckle then |
5887 | 570 |
begin |
571 |
Land[ty, tx]:= Land[ty, tx] or lfDamaged; |
|
572 |
LandDirty[ty div 32, tx div 32]:= 1 |
|
573 |
end; |
|
5332 | 574 |
if (cReducedQuality and rqBlurryLand) = 0 then |
6982 | 575 |
LandPixels[ty, tx]:= ExplosionBorderColor |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
576 |
else |
6982 | 577 |
LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor |
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
|
578 |
end |
2666 | 579 |
end; |
184 | 580 |
nx:= nx - dY; |
581 |
ny:= ny + dX; |
|
582 |
end; |
|
583 |
||
584 |
for i:= -HalfWidth to HalfWidth do |
|
585 |
begin |
|
358 | 586 |
X:= nx - dX8; |
587 |
Y:= ny - dY8; |
|
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
588 |
DrawExplosionBorder(X, Y, dx, dy, despeckle); |
184 | 589 |
X:= nx; |
590 |
Y:= ny; |
|
591 |
for t:= 0 to ticks do |
|
592 |
begin |
|
593 |
X:= X + dX; |
|
594 |
Y:= Y + dY; |
|
351 | 595 |
tx:= hwRound(X); |
596 |
ty:= hwRound(Y); |
|
3519 | 597 |
if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and ((Land[ty, tx] and lfIndestructible) = 0) then |
2647 | 598 |
begin |
5480 | 599 |
if (cReducedQuality and rqBlurryLand) = 0 then |
600 |
begin |
|
601 |
by:= ty; bx:= tx; |
|
602 |
end |
|
4690
490cf71b436a
revert last change. ordinary fire is fine, but HHG screws up.
nemo
parents:
4688
diff
changeset
|
603 |
else |
5480 | 604 |
begin |
605 |
by:= ty div 2; bx:= tx div 2; |
|
606 |
end; |
|
6355 | 607 |
if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then |
6096
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
608 |
LandPixels[by, bx]:= LandBackPixel(tx, ty) |
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
609 |
else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then |
10152
15e9bb6fcab2
fix remaining alpha pixel issues (explosion landbacktex borders etc
sheepluva
parents:
10138
diff
changeset
|
610 |
LandPixels[by, bx]:= LandPixels[by, bx] and (not AMASK); |
6097 | 611 |
Land[ty, tx]:= 0; |
2647 | 612 |
end |
184 | 613 |
end; |
8783
f1231a48fc48
Remove some duplicating code from uLandGraphics.pas
Urbertar
parents:
8773
diff
changeset
|
614 |
DrawExplosionBorder(X, Y, dx, dy, despeckle); |
184 | 615 |
nx:= nx - dY; |
616 |
ny:= ny + dX; |
|
617 |
end; |
|
618 |
||
619 |
for i:= 0 to 7 do |
|
620 |
begin |
|
358 | 621 |
X:= nx - dX8; |
622 |
Y:= ny - dY8; |
|
184 | 623 |
for t:= -8 to ticks + 8 do |
2666 | 624 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
625 |
X:= X + dX; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
626 |
Y:= Y + dY; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
627 |
tx:= hwRound(X); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
628 |
ty:= hwRound(Y); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
629 |
if ((ty and LAND_HEIGHT_MASK) = 0) and ((tx and LAND_WIDTH_MASK) = 0) and (((Land[ty, tx] and lfBasic) <> 0) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
630 |
or ((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
|
631 |
begin |
8839 | 632 |
Land[ty, tx]:= (Land[ty, tx] or lfDamaged) and (not lfIce); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
633 |
if despeckle then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
634 |
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
|
635 |
if (cReducedQuality and rqBlurryLand) = 0 then |
6982 | 636 |
LandPixels[ty, tx]:= ExplosionBorderColor |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
637 |
else |
6982 | 638 |
LandPixels[ty div 2, tx div 2]:= ExplosionBorderColor |
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
|
639 |
end |
2666 | 640 |
end; |
184 | 641 |
nx:= nx - dY; |
642 |
ny:= ny + dX; |
|
643 |
end; |
|
644 |
||
10674
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
645 |
tx:= stX - HalfWidth * 2 - 4 - abs(hwRound(dX * ticks)); |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
646 |
ddx:= stX + HalfWidth * 2 + 4 + abs(hwRound(dX * ticks)); |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
647 |
|
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
648 |
if WorldEdge = weWrap then |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
649 |
begin |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
650 |
if (tx < leftX) or (ddx < leftX) then |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
651 |
DrawTunnel_real:= wnLeft |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
652 |
else if (tx > rightX) or (ddx > rightX) then |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
653 |
DrawTunnel_real:= wnRight; |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
654 |
end; |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
655 |
|
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
656 |
tx:= Max(tx, 0); |
4374 | 657 |
ty:= Max(stY - HalfWidth * 2 - 4 - abs(hwRound(dY * ticks)), 0); |
10674
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
658 |
ddx:= Min(ddx, LAND_WIDTH) - tx; |
4374 | 659 |
ddy:= Min(stY + HalfWidth * 2 + 4 + abs(hwRound(dY * ticks)), LAND_HEIGHT) - ty; |
1809 | 660 |
|
7170
84ac6c6d2d8e
Only create textures for non-empty LandPixel chunks. This should save a fair amount of memory, especially on smaller maps, and eliminate a number of draws
nemo
parents:
7150
diff
changeset
|
661 |
UpdateLandTexture(tx, ddx, ty, ddy, false) |
184 | 662 |
end; |
663 |
||
10674
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
664 |
procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt); |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
665 |
var wn: TWrapNeeded; |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
666 |
begin |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
667 |
wn:= DrawTunnel_real(X, Y, dX, dY, ticks, HalfWidth); |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
668 |
if wn <> wnNone then |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
669 |
begin |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
670 |
if wn = wnLeft then |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
671 |
DrawTunnel_real(X + int2hwFloat(playWidth), Y, dX, dY, ticks, HalfWidth) |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
672 |
else |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
673 |
DrawTunnel_real(X - int2hwFloat(playWidth), Y, dX, dY, ticks, HalfWidth); |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
674 |
end; |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
675 |
end; |
fddbab2eecea
Issue 852: Using blowtorch to dig through the wrap-around border in caves fails miserably
sheepluva
parents:
10601
diff
changeset
|
676 |
|
10295 | 677 |
function TryPlaceOnLandSimple(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, indestructible: boolean): boolean; inline; |
10296 | 678 |
var lf: Word; |
9768
08799c901a42
Add rubber utility. Graphics are still incomplete. Also flag snow/ice in theme config.
nemo
parents:
9460
diff
changeset
|
679 |
begin |
10286
1940e937fc08
fix TryPlaceOnLand's ambiguity/messup wrt to making terrain indestructible (had boolean parameter for indestructible AND landflags parameters that could contain lfIndestructibly)
sheepluva
parents:
10253
diff
changeset
|
680 |
if indestructible then |
1940e937fc08
fix TryPlaceOnLand's ambiguity/messup wrt to making terrain indestructible (had boolean parameter for indestructible AND landflags parameters that could contain lfIndestructibly)
sheepluva
parents:
10253
diff
changeset
|
681 |
lf:= lfIndestructible |
1940e937fc08
fix TryPlaceOnLand's ambiguity/messup wrt to making terrain indestructible (had boolean parameter for indestructible AND landflags parameters that could contain lfIndestructibly)
sheepluva
parents:
10253
diff
changeset
|
682 |
else |
1940e937fc08
fix TryPlaceOnLand's ambiguity/messup wrt to making terrain indestructible (had boolean parameter for indestructible AND landflags parameters that could contain lfIndestructibly)
sheepluva
parents:
10253
diff
changeset
|
683 |
lf:= 0; |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
684 |
TryPlaceOnLandSimple:= TryPlaceOnLand(cpX, cpY, Obj, Frame, doPlace, false, false, false, false, false, lf, $FFFFFFFF); |
9768
08799c901a42
Add rubber utility. Graphics are still incomplete. Also flag snow/ice in theme config.
nemo
parents:
9460
diff
changeset
|
685 |
end; |
08799c901a42
Add rubber utility. Graphics are still incomplete. Also flag snow/ice in theme config.
nemo
parents:
9460
diff
changeset
|
686 |
|
10296 | 687 |
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; LandFlags: Word): boolean; inline; |
10253 | 688 |
begin |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
689 |
TryPlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, doPlace, false, false, false, false, false, LandFlags, $FFFFFFFF); |
10253 | 690 |
end; |
691 |
||
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
692 |
function ForcePlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; Tint: LongWord; Behind, flipHoriz, flipVert: boolean): boolean; inline; |
10368
7ebb71a36e95
Forced sprites placing mode, exposed to scripts (not tested at all)
unc0rr
parents:
10296
diff
changeset
|
693 |
begin |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
694 |
ForcePlaceOnLand:= TryPlaceOnLand(cpX, cpY, Obj, Frame, true, false, true, behind, flipHoriz, flipVert, LandFlags, Tint) |
9768
08799c901a42
Add rubber utility. Graphics are still incomplete. Also flag snow/ice in theme config.
nemo
parents:
9460
diff
changeset
|
695 |
end; |
08799c901a42
Add rubber utility. Graphics are still incomplete. Also flag snow/ice in theme config.
nemo
parents:
9460
diff
changeset
|
696 |
|
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
697 |
function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace, outOfMap, force, behind, flipHoriz, flipVert: boolean; LandFlags: Word; Tint: LongWord): boolean; |
6077
d8fa5a85d24f
This prevents girders from erasing landbacktex (square windows in tunnels and such), at the cost of requiring lfBasic and lfObject to be treated the same apart from graphically
nemo
parents:
6011
diff
changeset
|
698 |
var X, Y, bpp, h, w, row, col, gx, gy, numFramesFirstCol: LongInt; |
409 | 699 |
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
|
700 |
Image: PSDL_Surface; |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
701 |
pixel: LongWord; |
409 | 702 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
703 |
TryPlaceOnLand:= false; |
2235 | 704 |
numFramesFirstCol:= SpritesData[Obj].imageHeight div SpritesData[Obj].Height; |
705 |
||
10253 | 706 |
if outOfMap then doPlace:= false; // just using for a check |
707 |
||
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
708 |
TryDo(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true); |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
709 |
|
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
710 |
Image:= SpritesData[Obj].Surface; |
409 | 711 |
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
|
712 |
h:= SpritesData[Obj].Height; |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
713 |
if flipVert then flipSurface(Image, true); |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
714 |
if flipHoriz then flipSurface(Image, false); |
2235 | 715 |
row:= Frame mod numFramesFirstCol; |
716 |
col:= Frame div numFramesFirstCol; |
|
409 | 717 |
|
718 |
if SDL_MustLock(Image) then |
|
11362 | 719 |
SDLTry(SDL_LockSurface(Image) >= 0, 'TryPlaceOnLand', true); |
409 | 720 |
|
721 |
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
|
722 |
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
|
723 |
// Check that sprite fits free space |
10131
4b4a043111f4
- pas2c recognizes typecasts in initialization expressions
unc0rr
parents:
10108
diff
changeset
|
724 |
p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ])); |
409 | 725 |
case bpp of |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
726 |
4: for y:= 0 to Pred(h) do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
727 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
728 |
for x:= 0 to Pred(w) do |
10138
1a71d28392cb
Only check alpha channel like BlitImageAndGenerateCollisionInfo does
unc0rr
parents:
10131
diff
changeset
|
729 |
if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then |
10510 | 730 |
if (outOfMap and |
10368
7ebb71a36e95
Forced sprites placing mode, exposed to scripts (not tested at all)
unc0rr
parents:
10296
diff
changeset
|
731 |
((cpY + y) < LAND_HEIGHT) and ((cpY + y) >= 0) and |
7ebb71a36e95
Forced sprites placing mode, exposed to scripts (not tested at all)
unc0rr
parents:
10296
diff
changeset
|
732 |
((cpX + x) < LAND_WIDTH) and ((cpX + x) >= 0) and |
10374 | 733 |
((not force) and (Land[cpY + y, cpX + x] <> 0))) or |
10253 | 734 |
|
735 |
(not outOfMap and |
|
736 |
(((cpY + y) <= Longint(topY)) or ((cpY + y) >= LAND_HEIGHT) or |
|
10510 | 737 |
((cpX + x) <= Longint(leftX)) or ((cpX + x) >= Longint(rightX)) or |
10374 | 738 |
((not force) and (Land[cpY + y, cpX + x] <> 0)))) then |
10253 | 739 |
begin |
740 |
if SDL_MustLock(Image) then |
|
741 |
SDL_UnlockSurface(Image); |
|
742 |
exit |
|
743 |
end; |
|
10901 | 744 |
p:= PByteArray(@(p^[Image^.pitch])) |
745 |
end |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
746 |
end; |
409 | 747 |
|
520 | 748 |
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
|
749 |
if not doPlace then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
750 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
751 |
if SDL_MustLock(Image) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
752 |
SDL_UnlockSurface(Image); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
753 |
exit |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
754 |
end; |
520 | 755 |
|
409 | 756 |
// Checked, now place |
10131
4b4a043111f4
- pas2c recognizes typecasts in initialization expressions
unc0rr
parents:
10108
diff
changeset
|
757 |
p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ])); |
409 | 758 |
case bpp of |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
759 |
4: for y:= 0 to Pred(h) do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
760 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
761 |
for x:= 0 to Pred(w) do |
10138
1a71d28392cb
Only check alpha channel like BlitImageAndGenerateCollisionInfo does
unc0rr
parents:
10131
diff
changeset
|
762 |
if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then |
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
763 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
764 |
if (cReducedQuality and rqBlurryLand) = 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
765 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
766 |
gX:= cpX + x; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
767 |
gY:= cpY + y; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
768 |
end |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
769 |
else |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
770 |
begin |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
771 |
gX:= (cpX + x) div 2; |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
772 |
gY:= (cpY + y) div 2; |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
773 |
end; |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
774 |
if not behind or (Land[cpY + y, cpX + x] and lfLandMask = 0) then |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
775 |
begin |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
776 |
if (LandFlags and lfBasic <> 0) or |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
777 |
(((LandPixels[gY, gX] and AMask) shr AShift = 255) and // This test assumes lfBasic and lfObject differ only graphically |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
778 |
(LandFlags or lfObject = 0)) then |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
779 |
Land[cpY + y, cpX + x]:= lfBasic or LandFlags |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
780 |
else Land[cpY + y, cpX + x]:= lfObject or LandFlags |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
781 |
end; |
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
782 |
if not behind or (LandPixels[gY, gX] = 0) then |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
783 |
begin |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
784 |
if tint = $FFFFFFFF then |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
785 |
LandPixels[gY, gX]:= PLongword(@(p^[x * 4]))^ |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
786 |
else |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
787 |
begin |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
788 |
pixel:= PLongword(@(p^[x * 4]))^; |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
789 |
LandPixels[gY, gX]:= |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
790 |
ceil((pixel shr RShift and $FF) * ((tint shr 24) / 255)) shl RShift or |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
791 |
ceil((pixel shr GShift and $FF) * ((tint shr 16 and $ff) / 255)) shl GShift or |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
792 |
ceil((pixel shr BShift and $FF) * ((tint shr 8 and $ff) / 255)) shl BShift or |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
793 |
ceil((pixel shr AShift and $FF) * ((tint and $ff) / 255)) shl AShift; |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
794 |
end |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
795 |
end |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
796 |
end; |
10131
4b4a043111f4
- pas2c recognizes typecasts in initialization expressions
unc0rr
parents:
10108
diff
changeset
|
797 |
p:= PByteArray(@(p^[Image^.pitch])); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
798 |
end; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
799 |
end; |
409 | 800 |
if SDL_MustLock(Image) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
801 |
SDL_UnlockSurface(Image); |
409 | 802 |
|
10897
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
803 |
if flipVert then flipSurface(Image, true); |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
804 |
if flipHoriz then flipSurface(Image, false); |
8ea636ce120a
Add options to set colouring, behind existing land, and horizontal/vertical flipping to PlaceSprite
nemo
parents:
10878
diff
changeset
|
805 |
|
4374 | 806 |
x:= Max(cpX, leftX); |
807 |
w:= Min(cpX + Image^.w, LAND_WIDTH) - x; |
|
808 |
y:= Max(cpY, topY); |
|
809 |
h:= Min(cpY + Image^.h, LAND_HEIGHT) - y; |
|
10541 | 810 |
UpdateLandTexture(x, w, y, h, true); |
811 |
||
812 |
ScriptCall('onSpritePlacement', ord(Obj), cpX + w div 2, cpY + h div 2); |
|
813 |
if Obj = sprAmGirder then |
|
814 |
ScriptCall('onGirderPlacement', frame, cpX + w div 2, cpY + h div 2) |
|
815 |
else if Obj = sprAmRubber then |
|
816 |
ScriptCall('onRubberPlacement', frame, cpX + w div 2, cpY + h div 2); |
|
817 |
||
409 | 818 |
end; |
819 |
||
10903 | 820 |
procedure EraseLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; LandFlags: Word; eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert: boolean); |
6077
d8fa5a85d24f
This prevents girders from erasing landbacktex (square windows in tunnels and such), at the cost of requiring lfBasic and lfObject to be treated the same apart from graphically
nemo
parents:
6011
diff
changeset
|
821 |
var X, Y, bpp, h, w, row, col, gx, gy, numFramesFirstCol: LongInt; |
409 | 822 |
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
|
823 |
Image: PSDL_Surface; |
409 | 824 |
begin |
10901 | 825 |
numFramesFirstCol:= SpritesData[Obj].imageHeight div SpritesData[Obj].Height; |
826 |
||
827 |
TryDo(SpritesData[Obj].Surface <> nil, 'Assert SpritesData[Obj].Surface failed', true); |
|
828 |
||
829 |
Image:= SpritesData[Obj].Surface; |
|
830 |
w:= SpritesData[Obj].Width; |
|
831 |
h:= SpritesData[Obj].Height; |
|
832 |
if flipVert then flipSurface(Image, true); |
|
833 |
if flipHoriz then flipSurface(Image, false); |
|
834 |
row:= Frame mod numFramesFirstCol; |
|
835 |
col:= Frame div numFramesFirstCol; |
|
836 |
||
837 |
if SDL_MustLock(Image) then |
|
11362 | 838 |
SDLTry(SDL_LockSurface(Image) >= 0, 'EraseLand', true); |
10901 | 839 |
|
840 |
bpp:= Image^.format^.BytesPerPixel; |
|
841 |
TryDo(bpp = 4, 'It should be 32 bpp sprite', true); |
|
842 |
// Check that sprite fits free space |
|
843 |
p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ])); |
|
844 |
case bpp of |
|
845 |
4: for y:= 0 to Pred(h) do |
|
846 |
begin |
|
847 |
for x:= 0 to Pred(w) do |
|
848 |
if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then |
|
849 |
if ((cpY + y) <= Longint(topY)) or ((cpY + y) >= LAND_HEIGHT) or |
|
850 |
((cpX + x) <= Longint(leftX)) or ((cpX + x) >= Longint(rightX)) then |
|
851 |
begin |
|
852 |
if SDL_MustLock(Image) then |
|
853 |
SDL_UnlockSurface(Image); |
|
854 |
exit |
|
855 |
end; |
|
856 |
p:= PByteArray(@(p^[Image^.pitch])) |
|
857 |
end |
|
858 |
end; |
|
859 |
||
860 |
// Checked, now place |
|
861 |
p:= PByteArray(@(PByteArray(Image^.pixels)^[ Image^.pitch * row * h + col * w * 4 ])); |
|
862 |
case bpp of |
|
863 |
4: for y:= 0 to Pred(h) do |
|
864 |
begin |
|
865 |
for x:= 0 to Pred(w) do |
|
866 |
if ((PLongword(@(p^[x * 4]))^) and AMask) <> 0 then |
|
867 |
begin |
|
868 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
869 |
begin |
|
870 |
gX:= cpX + x; |
|
871 |
gY:= cpY + y; |
|
872 |
end |
|
873 |
else |
|
874 |
begin |
|
875 |
gX:= (cpX + x) div 2; |
|
876 |
gY:= (cpY + y) div 2; |
|
877 |
end; |
|
878 |
if (not eraseOnLFMatch or (Land[cpY + y, cpX + x] and LandFlags <> 0)) and |
|
10909 | 879 |
((PLongword(@(p^[x * 4]))^) and AMask <> 0) then |
10901 | 880 |
begin |
10903 | 881 |
if not onlyEraseLF then |
882 |
begin |
|
883 |
LandPixels[gY, gX]:= 0; |
|
884 |
Land[cpY + y, cpX + x]:= 0 |
|
885 |
end |
|
10909 | 886 |
else Land[cpY + y, cpX + x]:= Land[cpY + y, cpX + x] and (not LandFlags) |
10901 | 887 |
end |
888 |
end; |
|
889 |
p:= PByteArray(@(p^[Image^.pitch])); |
|
890 |
end; |
|
891 |
end; |
|
892 |
if SDL_MustLock(Image) then |
|
893 |
SDL_UnlockSurface(Image); |
|
894 |
||
895 |
if flipVert then flipSurface(Image, true); |
|
896 |
if flipHoriz then flipSurface(Image, false); |
|
897 |
||
898 |
x:= Max(cpX, leftX); |
|
899 |
w:= Min(cpX + Image^.w, LAND_WIDTH) - x; |
|
900 |
y:= Max(cpY, topY); |
|
901 |
h:= Min(cpY + Image^.h, LAND_HEIGHT) - y; |
|
902 |
UpdateLandTexture(x, w, y, h, true) |
|
903 |
end; |
|
904 |
||
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
905 |
function GetPlaceCollisionTex(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt): PTexture; |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
906 |
var X, Y, bpp, h, w, row, col, numFramesFirstCol: LongInt; |
10677 | 907 |
p, pt: PLongWordArray; |
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
908 |
Image, finalSurface: PSDL_Surface; |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
909 |
begin |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
910 |
GetPlaceCollisionTex:= nil; |
2235 | 911 |
numFramesFirstCol:= SpritesData[Obj].imageHeight div SpritesData[Obj].Height; |
912 |
||
769
788efc1d649f
- Save 8 MB of memory by freeing LandSurface and not using it anymore after game initialization
unc0rr
parents:
768
diff
changeset
|
913 |
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
|
914 |
Image:= SpritesData[Obj].Surface; |
409 | 915 |
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
|
916 |
h:= SpritesData[Obj].Height; |
2235 | 917 |
row:= Frame mod numFramesFirstCol; |
918 |
col:= Frame div numFramesFirstCol; |
|
409 | 919 |
|
920 |
if SDL_MustLock(Image) then |
|
9682 | 921 |
SDLTry(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true); |
409 | 922 |
|
923 |
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
|
924 |
TryDo(bpp = 4, 'It should be 32 bpp sprite', true); |
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
925 |
|
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
926 |
|
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
927 |
|
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
928 |
finalSurface:= SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RMask, GMask, BMask, AMask); |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
929 |
|
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
930 |
TryDo(finalSurface <> nil, 'GetPlaceCollisionTex: fail to create surface', true); |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
931 |
|
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
932 |
if SDL_MustLock(finalSurface) then |
11362 | 933 |
SDLTry(SDL_LockSurface(finalSurface) >= 0, 'GetPlaceCollisionTex', true); |
409 | 934 |
|
10677 | 935 |
p:= PLongWordArray(@(PLongWordArray(Image^.pixels)^[ (Image^.pitch div 4) * row * h + col * w ])); |
936 |
pt:= PLongWordArray(finalSurface^.pixels); |
|
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
937 |
|
10677 | 938 |
for y:= 0 to Pred(h) do |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
939 |
begin |
10677 | 940 |
for x:= 0 to Pred(w) do |
941 |
if ((p^[x] and AMask) <> 0) |
|
942 |
and (((cpY + y) < Longint(topY)) or ((cpY + y) >= LAND_HEIGHT) or |
|
943 |
((cpX + x) < Longint(leftX)) or ((cpX + x) > Longint(rightX)) or (Land[cpY + y, cpX + x] <> 0)) then |
|
944 |
pt^[x]:= cWhiteColor |
|
945 |
else |
|
946 |
(pt^[x]):= cWhiteColor and (not AMask); |
|
947 |
p:= PLongWordArray(@(p^[Image^.pitch div 4])); |
|
948 |
pt:= PLongWordArray(@(pt^[finalSurface^.pitch div 4])); |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
949 |
end; |
520 | 950 |
|
409 | 951 |
if SDL_MustLock(Image) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
952 |
SDL_UnlockSurface(Image); |
409 | 953 |
|
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
954 |
if SDL_MustLock(finalSurface) then |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
955 |
SDL_UnlockSurface(finalSurface); |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
956 |
|
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
957 |
GetPlaceCollisionTex:= Surface2Tex(finalSurface, true); |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
958 |
|
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
959 |
SDL_FreeSurface(finalSurface); |
409 | 960 |
end; |
961 |
||
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10246
diff
changeset
|
962 |
|
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
963 |
function Despeckle(X, Y: LongInt): boolean; |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
964 |
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
|
965 |
pixelsweep: boolean; |
10023 | 966 |
|
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
|
967 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
968 |
Despeckle:= true; |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
969 |
|
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
970 |
if (cReducedQuality and rqBlurryLand) = 0 then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
971 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
972 |
xx:= X; |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
973 |
yy:= Y; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
974 |
end |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
975 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
976 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
977 |
xx:= X div 2; |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
978 |
yy:= Y div 2; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
979 |
end; |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
980 |
|
10600 | 981 |
pixelsweep:= (Land[Y, X] <= lfAllObjMask) and ((LandPixels[yy, xx] and AMASK) <> 0); |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
982 |
if (((Land[Y, X] and lfDamaged) <> 0) 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
|
983 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
984 |
c:= 0; |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
985 |
for i:= -1 to 1 do |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
986 |
for j:= -1 to 1 do |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
987 |
if (i <> 0) or (j <> 0) then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
988 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
989 |
ny:= Y + i; |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
990 |
nx:= X + j; |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
991 |
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
|
992 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
993 |
if pixelsweep then |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
994 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
995 |
if ((cReducedQuality and rqBlurryLand) <> 0) then |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
996 |
begin |
10023 | 997 |
ny:= Y div 2 + i; |
998 |
nx:= X div 2 + j; |
|
999 |
if ((ny and (LAND_HEIGHT_MASK div 2)) = 0) and ((nx and (LAND_WIDTH_MASK div 2)) = 0) then |
|
10600 | 1000 |
if (LandPixels[ny, nx] and AMASK) <> 0 then |
10023 | 1001 |
inc(c); |
1002 |
end |
|
10600 | 1003 |
else if (LandPixels[ny, nx] and AMASK) <> 0 then |
10023 | 1004 |
inc(c); |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
1005 |
end |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1006 |
else if Land[ny, nx] > 255 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1007 |
inc(c); |
4695
ac2cb3b99d70
add a disabling for landback, set it if flakes are enabled
nemo
parents:
4690
diff
changeset
|
1008 |
end |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
1009 |
end; |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1010 |
|
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1011 |
if c < 4 then // 0-3 neighbours |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
1012 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1013 |
if ((Land[Y, X] and lfBasic) <> 0) and (not disableLandBack) then |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1014 |
LandPixels[yy, xx]:= LandBackPixel(X, Y) |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1015 |
else |
10152
15e9bb6fcab2
fix remaining alpha pixel issues (explosion landbacktex borders etc
sheepluva
parents:
10138
diff
changeset
|
1016 |
LandPixels[yy, xx]:= LandPixels[yy, xx] and (not AMASK); |
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
|
1017 |
|
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1018 |
if not pixelsweep then |
6681 | 1019 |
begin |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1020 |
Land[Y, X]:= 0; |
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1021 |
exit |
6681 | 1022 |
end |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
1023 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
1024 |
end; |
6990
40e5af28d026
change every return value into a more pascal-ish form, using the name of the fucntion (helps the parser and macpas compaitilibity)
koda
parents:
6982
diff
changeset
|
1025 |
Despeckle:= false |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
1026 |
end; |
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
1027 |
|
10877 | 1028 |
// a bit of AA for explosions |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
1029 |
procedure Smooth(X, Y: LongInt); |
10877 | 1030 |
var c, r, g, b, a, i: integer; |
1031 |
nx, ny: LongInt; |
|
1032 |
pixel: LongWord; |
|
1033 |
begin |
|
1034 |
||
1035 |
// only AA inwards |
|
1036 |
if (Land[Y, X] and lfDamaged) = 0 then |
|
1037 |
exit; |
|
1038 |
||
1039 |
// check location |
|
1040 |
if (Y <= LongInt(topY) + 1) or (Y >= LAND_HEIGHT-2) |
|
1041 |
or (X <= LongInt(leftX) + 1) or (X >= LongInt(rightX) - 1) then |
|
1042 |
exit; |
|
1043 |
||
1044 |
// counter for neighbor pixels that are not known to be undamaged |
|
1045 |
c:= 8; |
|
1046 |
||
1047 |
// accumalating rgba value of relevant pixels here |
|
1048 |
r:= 0; |
|
1049 |
g:= 0; |
|
1050 |
b:= 0; |
|
1051 |
a:= 0; |
|
1052 |
||
1053 |
// iterate over all neighbor pixels (also itself, will be skipped anyway) |
|
1054 |
for nx:= X-1 to X+1 do |
|
1055 |
for ny:= Y-1 to Y+1 do |
|
1056 |
// only consider undamaged neighbors (also leads to skipping itself) |
|
1057 |
if (Land[ny, nx] and lfDamaged) = 0 then |
|
1058 |
begin |
|
1059 |
pixel:= LandPixels[ny, nx]; |
|
1060 |
inc(r, (pixel and RMask) shr RShift); |
|
1061 |
inc(g, (pixel and GMask) shr GShift); |
|
1062 |
inc(b, (pixel and BMask) shr BShift); |
|
1063 |
inc(a, (pixel and AMask) shr AShift); |
|
1064 |
dec(c); |
|
1065 |
end; |
|
1066 |
||
1067 |
// nothing do to if all neighbors damaged |
|
1068 |
if c < 1 then |
|
1069 |
exit; |
|
1070 |
||
1071 |
// use explosion color for damaged pixels |
|
1072 |
for i:= 1 to c do |
|
1073 |
begin |
|
1074 |
inc(r, ExplosionBorderColorR); |
|
1075 |
inc(g, ExplosionBorderColorG); |
|
1076 |
inc(b, ExplosionBorderColorB); |
|
1077 |
inc(a, 255); |
|
1078 |
end; |
|
1079 |
||
1080 |
// set resulting color value based on average of all neighbors |
|
1081 |
r:= r div 8; |
|
1082 |
g:= g div 8; |
|
1083 |
b:= b div 8; |
|
1084 |
a:= a div 8; |
|
1085 |
LandPixels[y,x]:= (r shl RShift) or (g shl GShift) or (b shl BShift) or (a shl AShift); |
|
1086 |
||
1087 |
end; |
|
1088 |
||
1089 |
procedure Smooth_oldImpl(X, Y: LongInt); |
|
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
1090 |
begin |
5261 | 1091 |
// a bit of AA for explosions |
7492
3188794b9d87
Perf opt for the c conversion. Use downto instead to avoid repeated function calls in the loop
nemo
parents:
7270
diff
changeset
|
1092 |
if (Land[Y, X] = 0) and (Y > LongInt(topY) + 1) and |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1093 |
(Y < LAND_HEIGHT-2) and (X > LongInt(leftX) + 1) and (X < LongInt(rightX) - 1) then |
5261 | 1094 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1095 |
if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1096 |
or (((Land[y, x+1] and lfDamaged) <> 0) and (((Land[y-1,x] and lfDamaged) <> 0) or ((Land[y+1,x] and lfDamaged) <> 0)))) then |
5261 | 1097 |
begin |
5274 | 1098 |
if (cReducedQuality and rqBlurryLand) = 0 then |
1099 |
begin |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1100 |
if ((LandPixels[y,x] and AMask) shr AShift) < 10 then |
6982 | 1101 |
LandPixels[y,x]:= (ExplosionBorderColor and (not AMask)) or (128 shl AShift) |
5274 | 1102 |
else |
1103 |
LandPixels[y,x]:= |
|
6982 | 1104 |
(((((LandPixels[y,x] and RMask shr RShift) div 2)+((ExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or |
1105 |
(((((LandPixels[y,x] and GMask shr GShift) div 2)+((ExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or |
|
1106 |
(((((LandPixels[y,x] and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift) |
|
5274 | 1107 |
end; |
10864
9cf20f487ee9
don't modify collision data when applying visual edge smoothing
sheepluva
parents:
10677
diff
changeset
|
1108 |
{ |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1109 |
if (Land[y, x-1] = lfObject) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1110 |
Land[y,x]:= lfObject |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1111 |
else if (Land[y, x+1] = lfObject) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1112 |
Land[y,x]:= lfObject |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1113 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1114 |
Land[y,x]:= lfBasic; |
10864
9cf20f487ee9
don't modify collision data when applying visual edge smoothing
sheepluva
parents:
10677
diff
changeset
|
1115 |
} |
5261 | 1116 |
end |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1117 |
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)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1118 |
or (((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1119 |
or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1120 |
or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1121 |
or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1122 |
or (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1123 |
or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1124 |
or (((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 |
5261 | 1125 |
begin |
5274 | 1126 |
if (cReducedQuality and rqBlurryLand) = 0 then |
1127 |
begin |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1128 |
if ((LandPixels[y,x] and AMask) shr AShift) < 10 then |
6982 | 1129 |
LandPixels[y,x]:= (ExplosionBorderColor and (not AMask)) or (64 shl AShift) |
5274 | 1130 |
else |
1131 |
LandPixels[y,x]:= |
|
6982 | 1132 |
(((((LandPixels[y,x] and RMask shr RShift) * 3 div 4)+((ExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or |
1133 |
(((((LandPixels[y,x] and GMask shr GShift) * 3 div 4)+((ExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or |
|
1134 |
(((((LandPixels[y,x] and BMask shr BShift) * 3 div 4)+((ExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift) |
|
5274 | 1135 |
end; |
10864
9cf20f487ee9
don't modify collision data when applying visual edge smoothing
sheepluva
parents:
10677
diff
changeset
|
1136 |
{ |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1137 |
if (Land[y, x-1] = lfObject) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1138 |
Land[y, x]:= lfObject |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1139 |
else if (Land[y, x+1] = lfObject) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1140 |
Land[y, x]:= lfObject |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1141 |
else if (Land[y+1, x] = lfObject) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1142 |
Land[y, x]:= lfObject |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1143 |
else if (Land[y-1, x] = lfObject) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1144 |
Land[y, x]:= lfObject |
5687
fac606654317
Die speckles, round N. Check that alpha is not basically empty while blending, try to match the damaged land type.
nemo
parents:
5480
diff
changeset
|
1145 |
else Land[y,x]:= lfBasic |
10864
9cf20f487ee9
don't modify collision data when applying visual edge smoothing
sheepluva
parents:
10677
diff
changeset
|
1146 |
} |
5261 | 1147 |
end |
5267
e9ae019e9bb4
move smoothing into separate function, adjust call order
nemo
parents:
5266
diff
changeset
|
1148 |
end |
10490 | 1149 |
else if ((cReducedQuality and rqBlurryLand) = 0) and ((LandPixels[Y, X] and AMask) = AMask) |
8598
9d21bab30893
Apologies if jaree had done something similar, but didn't see anything in repo pull. This removes Land[] mixed w/ LandPixels[] and streamlines things a little
nemo
parents:
8596
diff
changeset
|
1150 |
and (Land[Y, X] and (lfDamaged or lfBasic) = lfBasic) |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1151 |
and (Y > LongInt(topY) + 1) and (Y < LAND_HEIGHT-2) and (X > LongInt(leftX) + 1) and (X < LongInt(rightX) - 1) then |
6130 | 1152 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1153 |
if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1154 |
or (((Land[y, x+1] and lfDamaged) <> 0) and (((Land[y-1,x] and lfDamaged) <> 0) or ((Land[y+1,x] and lfDamaged) <> 0)))) then |
6130 | 1155 |
begin |
1156 |
LandPixels[y,x]:= |
|
6982 | 1157 |
(((((LandPixels[y,x] and RMask shr RShift) div 2)+((ExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or |
1158 |
(((((LandPixels[y,x] and GMask shr GShift) div 2)+((ExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or |
|
1159 |
(((((LandPixels[y,x] and BMask shr BShift) div 2)+((ExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift) |
|
6130 | 1160 |
end |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1161 |
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)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1162 |
or (((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1163 |
or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1164 |
or (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1165 |
or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1166 |
or (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1167 |
or (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0)) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1168 |
or (((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 |
6130 | 1169 |
begin |
1170 |
LandPixels[y,x]:= |
|
6982 | 1171 |
(((((LandPixels[y,x] and RMask shr RShift) * 3 div 4)+((ExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or |
1172 |
(((((LandPixels[y,x] and GMask shr GShift) * 3 div 4)+((ExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or |
|
1173 |
(((((LandPixels[y,x] and BMask shr BShift) * 3 div 4)+((ExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift) |
|
6130 | 1174 |
end |
1175 |
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
|
1176 |
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
|
1177 |
|
1792 | 1178 |
function SweepDirty: boolean; |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1179 |
var x, y, xx, yy, ty, tx: LongInt; |
10601 | 1180 |
bRes, resweep, recheck: 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
|
1181 |
begin |
2695 | 1182 |
bRes:= false; |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1183 |
reCheck:= true; |
1792 | 1184 |
|
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1185 |
while recheck do |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
1186 |
begin |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1187 |
recheck:= false; |
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1188 |
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
|
1189 |
begin |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1190 |
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
|
1191 |
begin |
5895 | 1192 |
if LandDirty[y, x] = 1 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
|
1193 |
begin |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1194 |
resweep:= true; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
1195 |
ty:= y * 32; |
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
1196 |
tx:= x * 32; |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1197 |
while(resweep) do |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1198 |
begin |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1199 |
resweep:= false; |
3602
99c93fa258d6
Restore prior optimisation with the wildly out-of-bounds tx in LandDirty removed
nemo
parents:
3601
diff
changeset
|
1200 |
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
|
1201 |
for xx:= tx to tx + 31 do |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1202 |
if Despeckle(xx, yy) then |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1203 |
begin |
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1204 |
bRes:= true; |
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1205 |
resweep:= true; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1206 |
if (yy = ty) and (y > 0) then |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1207 |
begin |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1208 |
LandDirty[y-1, x]:= 1; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1209 |
recheck:= true; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1210 |
end |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1211 |
else if (yy = ty+31) and (y < LAND_HEIGHT div 32 - 1) then |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1212 |
begin |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1213 |
LandDirty[y+1, x]:= 1; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1214 |
recheck:= true; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1215 |
end; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1216 |
if (xx = tx) and (x > 0) then |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1217 |
begin |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1218 |
LandDirty[y, x-1]:= 1; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1219 |
recheck:= true; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1220 |
end |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1221 |
else if (xx = tx+31) and (x < LAND_WIDTH div 32 - 1) then |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1222 |
begin |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1223 |
LandDirty[y, x+1]:= 1; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1224 |
recheck:= true; |
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1225 |
end |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1226 |
end; |
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1227 |
end; |
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
|
1228 |
end; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
1229 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2741
diff
changeset
|
1230 |
end; |
3554
066faceb977d
Extend pixel sweep to recheck neighbours if erasing on edges
nemo
parents:
3521
diff
changeset
|
1231 |
end; |
1792 | 1232 |
|
10877 | 1233 |
// smooth explosion borders (except if land is blurry) |
1234 |
if (cReducedQuality and rqBlurryLand) = 0 then |
|
1235 |
for y:= 0 to LAND_HEIGHT div 32 - 1 do |
|
1236 |
for x:= 0 to LAND_WIDTH div 32 - 1 do |
|
1237 |
if LandDirty[y, x] <> 0 then |
|
1238 |
begin |
|
1239 |
ty:= y * 32; |
|
1240 |
tx:= x * 32; |
|
1241 |
for yy:= ty to ty + 31 do |
|
1242 |
for xx:= tx to tx + 31 do |
|
1243 |
Smooth(xx,yy) |
|
1244 |
end; |
|
5895 | 1245 |
|
1246 |
for y:= 0 to LAND_HEIGHT div 32 - 1 do |
|
1247 |
for x:= 0 to LAND_WIDTH div 32 - 1 do |
|
1248 |
if LandDirty[y, x] <> 0 then |
|
1249 |
begin |
|
1250 |
LandDirty[y, x]:= 0; |
|
1251 |
ty:= y * 32; |
|
1252 |
tx:= x * 32; |
|
10601 | 1253 |
UpdateLandTexture(tx, 32, ty, 32, false); |
5895 | 1254 |
end; |
1255 |
||
2695 | 1256 |
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
|
1257 |
end; |
184 | 1258 |
|
5885
ae257409bcff
Remove extra graphical resweeps, and smooth prior to despeckling. Was getting odd desync here without Land[] seemingly incorrect at end of passes. Just removing seems to fix, and code wasn't that good an idea in its prior state anyway.
nemo
parents:
5832
diff
changeset
|
1259 |
|
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
|
1260 |
// 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 |
6096
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
1261 |
function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; inline; |
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
|
1262 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1263 |
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
|
1264 |
end; |
4367 | 1265 |
|
6096
a00dbbf49d6c
Add landbacktex to a few maps, just to see how it looks.
nemo
parents:
6081
diff
changeset
|
1266 |
function LandBackPixel(x, y: LongInt): LongWord; inline; |
4367 | 1267 |
var p: PLongWordArray; |
1268 |
begin |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1269 |
if LandBackSurface = nil then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1270 |
LandBackPixel:= 0 |
4367 | 1271 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1272 |
begin |
4367 | 1273 |
p:= LandBackSurface^.pixels; |
1274 |
LandBackPixel:= p^[LandBackSurface^.w * (y mod LandBackSurface^.h) + (x mod LandBackSurface^.w)];// or $FF000000; |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1275 |
end |
4367 | 1276 |
end; |
1277 |
||
1278 |
||
6490 | 1279 |
procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword); |
1280 |
var |
|
1281 |
eX, eY, dX, dY: LongInt; |
|
1282 |
i, sX, sY, x, y, d: LongInt; |
|
1283 |
begin |
|
1284 |
eX:= 0; |
|
1285 |
eY:= 0; |
|
1286 |
dX:= X2 - X1; |
|
1287 |
dY:= Y2 - Y1; |
|
1288 |
||
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1289 |
if (dX > 0) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1290 |
sX:= 1 |
6490 | 1291 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1292 |
if (dX < 0) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1293 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1294 |
sX:= -1; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1295 |
dX:= -dX |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1296 |
end |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1297 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1298 |
sX:= dX; |
6490 | 1299 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1300 |
if (dY > 0) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1301 |
sY:= 1 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1302 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1303 |
if (dY < 0) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1304 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1305 |
sY:= -1; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1306 |
dY:= -dY |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1307 |
end |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1308 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1309 |
sY:= dY; |
6490 | 1310 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1311 |
if (dX > dY) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1312 |
d:= dX |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1313 |
else |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1314 |
d:= dY; |
6490 | 1315 |
|
1316 |
x:= X1; |
|
1317 |
y:= Y1; |
|
1318 |
||
1319 |
for i:= 0 to d do |
|
1320 |
begin |
|
1321 |
inc(eX, dX); |
|
1322 |
inc(eY, dY); |
|
1323 |
if (eX > d) then |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1324 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1325 |
dec(eX, d); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1326 |
inc(x, sX); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1327 |
end; |
6490 | 1328 |
if (eY > d) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1329 |
begin |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1330 |
dec(eY, d); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1331 |
inc(y, sY); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1332 |
end; |
6490 | 1333 |
|
1334 |
if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6490
diff
changeset
|
1335 |
Land[y, x]:= Color; |
6490 | 1336 |
end |
1337 |
end; |
|
1338 |
||
10244 | 1339 |
function DrawDots(x, y, xx, yy: Longint; Color: Longword): Longword; inline; |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1340 |
begin |
10246
8da91cd7a32a
Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents:
10244
diff
changeset
|
1341 |
DrawDots:= 0; |
8da91cd7a32a
Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents:
10244
diff
changeset
|
1342 |
|
10510 | 1343 |
if (((x + xx) and LAND_WIDTH_MASK) = 0) and (((y + yy) and LAND_HEIGHT_MASK) = 0) and (Land[y + yy, x + xx] <> Color) then |
10244 | 1344 |
begin inc(DrawDots); Land[y + yy, x + xx]:= Color; end; |
10510 | 1345 |
if (((x + xx) and LAND_WIDTH_MASK) = 0) and (((y - yy) and LAND_HEIGHT_MASK) = 0) and (Land[y - yy, x + xx] <> Color) then |
10244 | 1346 |
begin inc(DrawDots); Land[y - yy, x + xx]:= Color; end; |
10510 | 1347 |
if (((x - xx) and LAND_WIDTH_MASK) = 0) and (((y + yy) and LAND_HEIGHT_MASK) = 0) and (Land[y + yy, x - xx] <> Color) then |
10244 | 1348 |
begin inc(DrawDots); Land[y + yy, x - xx]:= Color; end; |
10510 | 1349 |
if (((x - xx) and LAND_WIDTH_MASK) = 0) and (((y - yy) and LAND_HEIGHT_MASK) = 0) and (Land[y - yy, x - xx] <> Color) then |
10244 | 1350 |
begin inc(DrawDots); Land[y - yy, x - xx]:= Color; end; |
10510 | 1351 |
if (((x + yy) and LAND_WIDTH_MASK) = 0) and (((y + xx) and LAND_HEIGHT_MASK) = 0) and (Land[y + xx, x + yy] <> Color) then |
10244 | 1352 |
begin inc(DrawDots); Land[y + xx, x + yy]:= Color; end; |
10510 | 1353 |
if (((x + yy) and LAND_WIDTH_MASK) = 0) and (((y - xx) and LAND_HEIGHT_MASK) = 0) and (Land[y - xx, x + yy] <> Color) then |
10244 | 1354 |
begin inc(DrawDots); Land[y - xx, x + yy]:= Color; end; |
10510 | 1355 |
if (((x - yy) and LAND_WIDTH_MASK) = 0) and (((y + xx) and LAND_HEIGHT_MASK) = 0) and (Land[y + xx, x - yy] <> Color) then |
10244 | 1356 |
begin inc(DrawDots); Land[y + xx, x - yy]:= Color; end; |
10510 | 1357 |
if (((x - yy) and LAND_WIDTH_MASK) = 0) and (((y - xx) and LAND_HEIGHT_MASK) = 0) and (Land[y - xx, x - yy] <> Color) then |
10244 | 1358 |
begin inc(DrawDots); Land[y - xx, x - yy]:= Color; end; |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1359 |
end; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1360 |
|
10244 | 1361 |
function DrawLines(X1, Y1, X2, Y2, XX, YY: LongInt; color: Longword): Longword; |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1362 |
var |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1363 |
eX, eY, dX, dY: LongInt; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1364 |
i, sX, sY, x, y, d: LongInt; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1365 |
f: boolean; |
7147 | 1366 |
begin |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1367 |
eX:= 0; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1368 |
eY:= 0; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1369 |
dX:= X2 - X1; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1370 |
dY:= Y2 - Y1; |
10244 | 1371 |
DrawLines:= 0; |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1372 |
|
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1373 |
if (dX > 0) then |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1374 |
sX:= 1 |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1375 |
else |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1376 |
if (dX < 0) then |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1377 |
begin |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1378 |
sX:= -1; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1379 |
dX:= -dX |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1380 |
end |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1381 |
else |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1382 |
sX:= dX; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1383 |
|
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1384 |
if (dY > 0) then |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1385 |
sY:= 1 |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1386 |
else |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1387 |
if (dY < 0) then |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1388 |
begin |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1389 |
sY:= -1; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1390 |
dY:= -dY |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1391 |
end |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1392 |
else |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1393 |
sY:= dY; |
7147 | 1394 |
|
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1395 |
if (dX > dY) then |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1396 |
d:= dX |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1397 |
else |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1398 |
d:= dY; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1399 |
|
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1400 |
x:= X1; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1401 |
y:= Y1; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1402 |
|
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1403 |
for i:= 0 to d do |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1404 |
begin |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1405 |
inc(eX, dX); |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1406 |
inc(eY, dY); |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1407 |
|
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1408 |
f:= eX > d; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1409 |
if f then |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1410 |
begin |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1411 |
dec(eX, d); |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1412 |
inc(x, sX); |
10244 | 1413 |
inc(DrawLines, DrawDots(x, y, xx, yy, color)) |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1414 |
end; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1415 |
if (eY > d) then |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1416 |
begin |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1417 |
dec(eY, d); |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1418 |
inc(y, sY); |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1419 |
f:= true; |
10244 | 1420 |
inc(DrawLines, DrawDots(x, y, xx, yy, color)) |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1421 |
end; |
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1422 |
|
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1423 |
if not f then |
10244 | 1424 |
inc(DrawLines, DrawDots(x, y, xx, yy, color)) |
7150
fba3b14ff746
This should make drawn maps rendering even more faster
unc0rr
parents:
7147
diff
changeset
|
1425 |
end |
7147 | 1426 |
end; |
1427 |
||
10244 | 1428 |
function DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword): Longword; |
7147 | 1429 |
var dx, dy, d: LongInt; |
1430 |
begin |
|
10244 | 1431 |
DrawThickLine:= 0; |
1432 |
||
7147 | 1433 |
dx:= 0; |
1434 |
dy:= Radius; |
|
1435 |
d:= 3 - 2 * Radius; |
|
1436 |
while (dx < dy) do |
|
1437 |
begin |
|
10244 | 1438 |
inc(DrawThickLine, DrawLines(x1, y1, x2, y2, dx, dy, color)); |
7147 | 1439 |
if (d < 0) then |
1440 |
d:= d + 4 * dx + 6 |
|
1441 |
else |
|
1442 |
begin |
|
1443 |
d:= d + 4 * (dx - dy) + 10; |
|
1444 |
dec(dy) |
|
1445 |
end; |
|
1446 |
inc(dx) |
|
1447 |
end; |
|
1448 |
if (dx = dy) then |
|
10244 | 1449 |
inc(DrawThickLine, DrawLines(x1, y1, x2, y2, dx, dy, color)); |
7147 | 1450 |
end; |
1451 |
||
7268 | 1452 |
|
1453 |
procedure DumpLandToLog(x, y, r: LongInt); |
|
1454 |
var xx, yy, dx: LongInt; |
|
1455 |
s: shortstring; |
|
1456 |
begin |
|
1457 |
s[0]:= char(r * 2 + 1); |
|
1458 |
for yy:= y - r to y + r do |
|
1459 |
begin |
|
1460 |
for dx:= 0 to r*2 do |
|
1461 |
begin |
|
1462 |
xx:= dx - r + x; |
|
1463 |
if (xx = x) and (yy = y) then |
|
1464 |
s[dx + 1]:= 'X' |
|
1465 |
else if Land[yy, xx] > 255 then |
|
1466 |
s[dx + 1]:= 'O' |
|
1467 |
else if Land[yy, xx] > 0 then |
|
1468 |
s[dx + 1]:= '*' |
|
1469 |
else |
|
1470 |
s[dx + 1]:= '.' |
|
1471 |
end; |
|
1472 |
AddFileLog('Land dump: ' + s); |
|
1473 |
end; |
|
1474 |
end; |
|
1475 |
||
184 | 1476 |
end. |