author | koda |
Sat, 03 Jul 2010 05:51:24 +0200 | |
changeset 3617 | 1df21e06b8ba |
parent 3612 | b50215a8a43d |
child 3630 | 2c7a9d5aa18c |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
3236
4ab3917d7d44
Update (c) lines to 2010 as unc0rr requested - they all had varying values so I just took the first year mentioned, then tacked on -2010
nemo
parents:
3228
diff
changeset
|
3 |
* Copyright (c) 2005-2010 Andrey Korotaev <unC0Rr@gmail.com> |
4 | 4 |
* |
183 | 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 |
|
4 | 8 |
* |
183 | 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. |
|
4 | 13 |
* |
183 | 14 |
* You should have received a copy of the GNU General Public License |
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
4 | 17 |
*) |
18 |
||
2599 | 19 |
{$INCLUDE "options.inc"} |
2587
0dfa56a8513c
fix a segfault in the iphone simulator by moving options.inc at the beginning of the file
koda
parents:
2376
diff
changeset
|
20 |
|
4 | 21 |
unit uLand; |
22 |
interface |
|
3165
3ec07a7d8456
just some very sane stuff for the iphone port (plus some macro on pascal files)
koda
parents:
3141
diff
changeset
|
23 |
uses SDLh, uLandTemplates, uFloat, uConsts, GLunit; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
24 |
|
3509
d72c2219595d
Make land types flagged (to allow stacking future attributes such as indestructible ice, but also for a damaged flag)
nemo
parents:
3463
diff
changeset
|
25 |
type |
3612
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
26 |
TLandArray = packed array of array of LongWord; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
27 |
TCollisionArray = packed array of array of Word; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
28 |
TPreview = packed array[0..127, 0..31] of byte; |
3612
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
29 |
TDirtyTag = packed array of array of byte; |
4 | 30 |
|
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
31 |
var Land: TCollisionArray; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
32 |
LandPixels: TLandArray; |
3608
c509bbc779e7
Revert prior attempted optimisation. Gridding the land pays in some situations, but not all. Restricting to an upper bound might help, but overall, seems too fuzzy to be worth it. On one side is increased cost of Add/Delete + extra test on collision check, on the other is skipping the list iteration. Perhaps for large lists.
nemo
parents:
3607
diff
changeset
|
33 |
LandDirty: TDirtyTag; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
34 |
hasBorder: boolean; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
35 |
hasGirders: boolean; |
2981 | 36 |
isMap: boolean; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
37 |
playHeight, playWidth, leftX, rightX, topY, MaxHedgehogs: Longword; // idea is that a template can specify height/width. Or, a map, a height/width by the dimensions of the image. If the map has pixels near top of image, it triggers border. |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
38 |
LandBackSurface: PSDL_Surface; |
3369
c7289e42f0ee
add other controls for map preview, also fix a bug in digest
koda
parents:
3365
diff
changeset
|
39 |
digest: shortstring; |
4 | 40 |
|
3242 | 41 |
type direction = record x, y: LongInt; end; |
3181 | 42 |
const DIR_N: direction = (x: 0; y: -1); |
43 |
DIR_E: direction = (x: 1; y: 0); |
|
44 |
DIR_S: direction = (x: 0; y: 1); |
|
45 |
DIR_W: direction = (x: -1; y: 0); |
|
3133 | 46 |
|
3038 | 47 |
procedure initModule; |
48 |
procedure freeModule; |
|
37 | 49 |
procedure GenMap; |
766 | 50 |
function GenPreview: TPreview; |
367 | 51 |
procedure CheckLandDigest(s: shortstring); |
2692
ce9992075118
better network support + initial work for returning to frontend
koda
parents:
2665
diff
changeset
|
52 |
function LandBackPixel(x, y: LongInt): LongWord; |
4 | 53 |
|
54 |
implementation |
|
3526
a1d2180fef42
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
nemo
parents:
3519
diff
changeset
|
55 |
uses uConsole, uStore, uMisc, uRandom, uTeams, uLandObjects, Adler32, uIO, uLandTexture; |
4 | 56 |
|
3133 | 57 |
operator=(const a, b: direction) c: Boolean; |
58 |
begin |
|
59 |
c := (a.x = b.x) and (a.y = b.y); |
|
60 |
end; |
|
61 |
||
4 | 62 |
type TPixAr = record |
63 |
Count: Longword; |
|
22 | 64 |
ar: array[0..Pred(cMaxEdgePoints)] of TPoint; |
4 | 65 |
end; |
66 |
||
37 | 67 |
procedure LogLandDigest; |
3526
a1d2180fef42
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
nemo
parents:
3519
diff
changeset
|
68 |
var s: shortstring; |
a1d2180fef42
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
nemo
parents:
3519
diff
changeset
|
69 |
adler: LongInt; |
37 | 70 |
begin |
3526
a1d2180fef42
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
nemo
parents:
3519
diff
changeset
|
71 |
adler:= 1; |
a1d2180fef42
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
nemo
parents:
3519
diff
changeset
|
72 |
Adler32Update(adler, @Land, sizeof(Land)); |
a1d2180fef42
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
nemo
parents:
3519
diff
changeset
|
73 |
s:= 'M'+inttostr(adler); |
a1d2180fef42
Replace SHA1 with adler32. For simple purposes of checking to see if players are playing the same map, this should be quite adequate and runs 15 times faster.
nemo
parents:
3519
diff
changeset
|
74 |
|
699 | 75 |
CheckLandDigest(s); |
367 | 76 |
SendIPCRaw(@s[0], Length(s) + 1) |
77 |
end; |
|
78 |
||
79 |
procedure CheckLandDigest(s: shortstring); |
|
80 |
begin |
|
368 | 81 |
{$IFDEF DEBUGFILE} |
3369
c7289e42f0ee
add other controls for map preview, also fix a bug in digest
koda
parents:
3365
diff
changeset
|
82 |
AddFileLog('CheckLandDigest: ' + s + ' digest : ' + digest); |
368 | 83 |
{$ENDIF} |
3369
c7289e42f0ee
add other controls for map preview, also fix a bug in digest
koda
parents:
3365
diff
changeset
|
84 |
if digest = '' then |
c7289e42f0ee
add other controls for map preview, also fix a bug in digest
koda
parents:
3365
diff
changeset
|
85 |
digest:= s |
c7289e42f0ee
add other controls for map preview, also fix a bug in digest
koda
parents:
3365
diff
changeset
|
86 |
else |
c7289e42f0ee
add other controls for map preview, also fix a bug in digest
koda
parents:
3365
diff
changeset
|
87 |
TryDo(s = digest, 'Different maps generated, sorry', true); |
37 | 88 |
end; |
89 |
||
371 | 90 |
procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword); |
358 | 91 |
var |
371 | 92 |
eX, eY, dX, dY: LongInt; |
93 |
i, sX, sY, x, y, d: LongInt; |
|
358 | 94 |
begin |
95 |
eX:= 0; |
|
96 |
eY:= 0; |
|
97 |
dX:= X2 - X1; |
|
98 |
dY:= Y2 - Y1; |
|
99 |
||
100 |
if (dX > 0) then sX:= 1 |
|
101 |
else |
|
102 |
if (dX < 0) then |
|
103 |
begin |
|
104 |
sX:= -1; |
|
105 |
dX:= -dX |
|
106 |
end else sX:= dX; |
|
107 |
||
108 |
if (dY > 0) then sY:= 1 |
|
109 |
else |
|
110 |
if (dY < 0) then |
|
111 |
begin |
|
112 |
sY:= -1; |
|
113 |
dY:= -dY |
|
114 |
end else sY:= dY; |
|
115 |
||
116 |
if (dX > dY) then d:= dX |
|
117 |
else d:= dY; |
|
118 |
||
119 |
x:= X1; |
|
120 |
y:= Y1; |
|
2376 | 121 |
|
358 | 122 |
for i:= 0 to d do |
123 |
begin |
|
124 |
inc(eX, dX); |
|
125 |
inc(eY, dY); |
|
126 |
if (eX > d) then |
|
127 |
begin |
|
128 |
dec(eX, d); |
|
129 |
inc(x, sX); |
|
130 |
end; |
|
131 |
if (eY > d) then |
|
132 |
begin |
|
133 |
dec(eY, d); |
|
134 |
inc(y, sY); |
|
135 |
end; |
|
364 | 136 |
|
1753 | 137 |
if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then |
358 | 138 |
Land[y, x]:= Color; |
139 |
end |
|
140 |
end; |
|
141 |
||
365 | 142 |
procedure DrawEdge(var pa: TPixAr; Color: Longword); |
371 | 143 |
var i: LongInt; |
4 | 144 |
begin |
365 | 145 |
i:= 0; |
4 | 146 |
with pa do |
371 | 147 |
while i < LongInt(Count) - 1 do |
365 | 148 |
if (ar[i + 1].X = NTPX) then inc(i, 2) |
149 |
else begin |
|
150 |
DrawLine(ar[i].x, ar[i].y, ar[i + 1].x, ar[i + 1].y, Color); |
|
151 |
inc(i) |
|
152 |
end |
|
22 | 153 |
end; |
154 |
||
365 | 155 |
procedure Vector(p1, p2, p3: TPoint; var Vx, Vy: hwFloat); |
156 |
var d1, d2, d: hwFloat; |
|
364 | 157 |
begin |
498 | 158 |
Vx:= int2hwFloat(p1.X - p3.X); |
159 |
Vy:= int2hwFloat(p1.Y - p3.Y); |
|
160 |
d:= DistanceI(p2.X - p1.X, p2.Y - p1.Y); |
|
161 |
d1:= DistanceI(p2.X - p3.X, p2.Y - p3.Y); |
|
365 | 162 |
d2:= Distance(Vx, Vy); |
163 |
if d1 < d then d:= d1; |
|
164 |
if d2 < d then d:= d2; |
|
165 |
d:= d * _1div3; |
|
166 |
if d2.QWordValue = 0 then |
|
167 |
begin |
|
498 | 168 |
Vx:= _0; |
169 |
Vy:= _0 |
|
365 | 170 |
end else |
171 |
begin |
|
498 | 172 |
d2:= _1 / d2; |
365 | 173 |
Vx:= Vx * d2; |
174 |
Vy:= Vy * d2; |
|
175 |
||
176 |
Vx:= Vx * d; |
|
177 |
Vy:= Vy * d |
|
178 |
end |
|
179 |
end; |
|
180 |
||
371 | 181 |
procedure AddLoopPoints(var pa, opa: TPixAr; StartI, EndI: LongInt; Delta: hwFloat); |
182 |
var i, pi, ni: LongInt; |
|
365 | 183 |
NVx, NVy, PVx, PVy: hwFloat; |
498 | 184 |
x1, x2, y1, y2: LongInt; |
185 |
tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat; |
|
371 | 186 |
X, Y: LongInt; |
365 | 187 |
begin |
188 |
pi:= EndI; |
|
189 |
i:= StartI; |
|
190 |
ni:= Succ(StartI); |
|
3407 | 191 |
{$HINTS OFF} |
365 | 192 |
Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
3407 | 193 |
{$HINTS ON} |
365 | 194 |
repeat |
195 |
inc(pi); |
|
196 |
if pi > EndI then pi:= StartI; |
|
197 |
inc(i); |
|
198 |
if i > EndI then i:= StartI; |
|
199 |
inc(ni); |
|
200 |
if ni > EndI then ni:= StartI; |
|
201 |
PVx:= NVx; |
|
202 |
PVy:= NVy; |
|
203 |
Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
|
204 |
||
205 |
x1:= opa.ar[pi].x; |
|
206 |
y1:= opa.ar[pi].y; |
|
207 |
x2:= opa.ar[i].x; |
|
208 |
y2:= opa.ar[i].y; |
|
498 | 209 |
cx1:= int2hwFloat(x1) - PVx; |
210 |
cy1:= int2hwFloat(y1) - PVy; |
|
211 |
cx2:= int2hwFloat(x2) + NVx; |
|
212 |
cy2:= int2hwFloat(y2) + NVy; |
|
213 |
t:= _0; |
|
364 | 214 |
while t.Round = 0 do |
215 |
begin |
|
216 |
tsq:= t * t; |
|
217 |
tcb:= tsq * t; |
|
498 | 218 |
r1:= (_1 - t*3 + tsq*3 - tcb); |
219 |
r2:= ( t*3 - tsq*6 + tcb*3); |
|
220 |
r3:= ( tsq*3 - tcb*3); |
|
430 | 221 |
X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2); |
222 |
Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2); |
|
364 | 223 |
t:= t + Delta; |
224 |
pa.ar[pa.Count].x:= X; |
|
225 |
pa.ar[pa.Count].y:= Y; |
|
226 |
inc(pa.Count); |
|
227 |
TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true) |
|
228 |
end; |
|
365 | 229 |
until i = StartI; |
230 |
pa.ar[pa.Count].x:= opa.ar[StartI].X; |
|
231 |
pa.ar[pa.Count].y:= opa.ar[StartI].Y; |
|
364 | 232 |
inc(pa.Count) |
233 |
end; |
|
234 |
||
365 | 235 |
procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat); |
495 | 236 |
var i, StartLoop: LongInt; |
365 | 237 |
opa: TPixAr; |
238 |
begin |
|
239 |
opa:= pa; |
|
240 |
pa.Count:= 0; |
|
241 |
i:= 0; |
|
242 |
StartLoop:= 0; |
|
371 | 243 |
while i < LongInt(opa.Count) do |
365 | 244 |
if (opa.ar[i + 1].X = NTPX) then |
245 |
begin |
|
246 |
AddLoopPoints(pa, opa, StartLoop, i, Delta); |
|
247 |
inc(i, 2); |
|
248 |
StartLoop:= i; |
|
249 |
pa.ar[pa.Count].X:= NTPX; |
|
3224 | 250 |
pa.ar[pa.Count].Y:= 0; |
365 | 251 |
inc(pa.Count); |
252 |
end else inc(i) |
|
253 |
end; |
|
254 |
||
371 | 255 |
procedure FillLand(x, y: LongInt); |
4 | 256 |
var Stack: record |
257 |
Count: Longword; |
|
258 |
points: array[0..8192] of record |
|
371 | 259 |
xl, xr, y, dir: LongInt; |
4 | 260 |
end |
261 |
end; |
|
262 |
||
371 | 263 |
procedure Push(_xl, _xr, _y, _dir: LongInt); |
4 | 264 |
begin |
75 | 265 |
TryDo(Stack.Count <= 8192, 'FillLand: stack overflow', true); |
4 | 266 |
_y:= _y + _dir; |
1760 | 267 |
if (_y < 0) or (_y >= LAND_HEIGHT) then exit; |
4 | 268 |
with Stack.points[Stack.Count] do |
269 |
begin |
|
270 |
xl:= _xl; |
|
271 |
xr:= _xr; |
|
272 |
y:= _y; |
|
273 |
dir:= _dir |
|
274 |
end; |
|
75 | 275 |
inc(Stack.Count) |
4 | 276 |
end; |
277 |
||
371 | 278 |
procedure Pop(var _xl, _xr, _y, _dir: LongInt); |
4 | 279 |
begin |
280 |
dec(Stack.Count); |
|
281 |
with Stack.points[Stack.Count] do |
|
282 |
begin |
|
283 |
_xl:= xl; |
|
284 |
_xr:= xr; |
|
285 |
_y:= y; |
|
286 |
_dir:= dir |
|
287 |
end |
|
288 |
end; |
|
289 |
||
371 | 290 |
var xl, xr, dir: LongInt; |
351 | 291 |
begin |
4 | 292 |
Stack.Count:= 0; |
293 |
xl:= x - 1; |
|
294 |
xr:= x; |
|
23 | 295 |
Push(xl, xr, y, -1); |
296 |
Push(xl, xr, y, 1); |
|
3407 | 297 |
dir:= 0; |
4 | 298 |
while Stack.Count > 0 do |
299 |
begin |
|
300 |
Pop(xl, xr, y, dir); |
|
51 | 301 |
while (xl > 0) and (Land[y, xl] <> 0) do dec(xl); |
1760 | 302 |
while (xr < LAND_WIDTH - 1) and (Land[y, xr] <> 0) do inc(xr); |
4 | 303 |
while (xl < xr) do |
304 |
begin |
|
51 | 305 |
while (xl <= xr) and (Land[y, xl] = 0) do inc(xl); |
4 | 306 |
x:= xl; |
51 | 307 |
while (xl <= xr) and (Land[y, xl] <> 0) do |
4 | 308 |
begin |
51 | 309 |
Land[y, xl]:= 0; |
4 | 310 |
inc(xl) |
311 |
end; |
|
22 | 312 |
if x < xl then |
313 |
begin |
|
314 |
Push(x, Pred(xl), y, dir); |
|
315 |
Push(x, Pred(xl), y,-dir); |
|
316 |
end; |
|
4 | 317 |
end; |
318 |
end; |
|
319 |
end; |
|
320 |
||
2647 | 321 |
function LandBackPixel(x, y: LongInt): LongWord; |
322 |
var p: PLongWordArray; |
|
323 |
begin |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
324 |
if LandBackSurface = nil then LandBackPixel:= 0 |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
325 |
else |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
326 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
327 |
p:= LandBackSurface^.pixels; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
328 |
LandBackPixel:= p^[LandBackSurface^.w * (y mod LandBackSurface^.h) + (x mod LandBackSurface^.w)];// or $FF000000; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
329 |
end |
2647 | 330 |
end; |
331 |
||
4 | 332 |
procedure ColorizeLand(Surface: PSDL_Surface); |
333 |
var tmpsurf: PSDL_Surface; |
|
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
334 |
r, rr: TSDL_Rect; |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
335 |
x, yd, yu: LongInt; |
4 | 336 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
337 |
tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/LandTex', ifCritical or ifIgnoreCaps); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
338 |
r.y:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
339 |
while r.y < LAND_HEIGHT do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
340 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
341 |
r.x:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
342 |
while r.x < LAND_WIDTH do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
343 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
344 |
SDL_UpperBlit(tmpsurf, nil, Surface, @r); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
345 |
inc(r.x, tmpsurf^.w) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
346 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
347 |
inc(r.y, tmpsurf^.h) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
348 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
349 |
SDL_FreeSurface(tmpsurf); |
4 | 350 |
|
3038 | 351 |
// freed in freeModule() below |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
352 |
LandBackSurface:= LoadImage(Pathz[ptCurrTheme] + '/LandBackTex', ifIgnoreCaps or ifTransparent); |
2647 | 353 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
354 |
tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/Border', ifCritical or ifIgnoreCaps or ifTransparent); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
355 |
for x:= 0 to LAND_WIDTH - 1 do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
356 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
357 |
yd:= LAND_HEIGHT - 1; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
358 |
repeat |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
359 |
while (yd > 0) and (Land[yd, x] = 0) do dec(yd); |
2376 | 360 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
361 |
if (yd < 0) then yd:= 0; |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
362 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
363 |
while (yd < LAND_HEIGHT) and (Land[yd, x] <> 0) do inc(yd); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
364 |
dec(yd); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
365 |
yu:= yd; |
2376 | 366 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
367 |
while (yu > 0 ) and (Land[yu, x] <> 0) do dec(yu); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
368 |
while (yu < yd ) and (Land[yu, x] = 0) do inc(yu); |
2376 | 369 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
370 |
if (yd < LAND_HEIGHT - 1) and ((yd - yu) >= 16) then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
371 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
372 |
rr.x:= x; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
373 |
rr.y:= yd - 15; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
374 |
r.x:= x mod tmpsurf^.w; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
375 |
r.y:= 16; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
376 |
r.w:= 1; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
377 |
r.h:= 16; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
378 |
SDL_UpperBlit(tmpsurf, @r, Surface, @rr); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
379 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
380 |
if (yu > 0) then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
381 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
382 |
rr.x:= x; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
383 |
rr.y:= yu; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
384 |
r.x:= x mod tmpsurf^.w; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
385 |
r.y:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
386 |
r.w:= 1; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
387 |
r.h:= min(16, yd - yu + 1); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
388 |
SDL_UpperBlit(tmpsurf, @r, Surface, @rr); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
389 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
390 |
yd:= yu - 1; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
391 |
until yd < 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
392 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
393 |
SDL_FreeSurface(tmpsurf); |
4 | 394 |
end; |
395 |
||
358 | 396 |
procedure SetPoints(var Template: TEdgeTemplate; var pa: TPixAr); |
371 | 397 |
var i: LongInt; |
22 | 398 |
begin |
23 | 399 |
with Template do |
400 |
begin |
|
358 | 401 |
pa.Count:= BasePointsCount; |
402 |
for i:= 0 to pred(pa.Count) do |
|
23 | 403 |
begin |
371 | 404 |
pa.ar[i].x:= BasePoints^[i].x + LongInt(GetRandom(BasePoints^[i].w)); |
1792 | 405 |
if pa.ar[i].x <> NTPX then |
406 |
pa.ar[i].x:= pa.ar[i].x + ((LAND_WIDTH - Template.TemplateWidth) div 2); |
|
3407 | 407 |
pa.ar[i].y:= BasePoints^[i].y + LongInt(GetRandom(BasePoints^[i].h)) + LAND_HEIGHT - LongInt(Template.TemplateHeight) |
23 | 408 |
end; |
1183
540cea859395
Step 4: repair girder rendering (girder is 32bit now)
unc0rr
parents:
1182
diff
changeset
|
409 |
|
358 | 410 |
if canMirror then |
360 | 411 |
if getrandom(2) = 0 then |
358 | 412 |
begin |
413 |
for i:= 0 to pred(BasePointsCount) do |
|
365 | 414 |
if pa.ar[i].x <> NTPX then |
1760 | 415 |
pa.ar[i].x:= LAND_WIDTH - 1 - pa.ar[i].x; |
358 | 416 |
for i:= 0 to pred(FillPointsCount) do |
1760 | 417 |
FillPoints^[i].x:= LAND_WIDTH - 1 - FillPoints^[i].x; |
358 | 418 |
end; |
22 | 419 |
|
2338
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
420 |
(* Experiment in making this option more useful |
2376 | 421 |
if ((not isNegative) and (cTemplateFilter = 4)) or |
2338
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
422 |
(canFlip and (getrandom(2) = 0)) then |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
423 |
begin |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
424 |
for i:= 0 to pred(BasePointsCount) do |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
425 |
begin |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
426 |
pa.ar[i].y:= LAND_HEIGHT - 1 - pa.ar[i].y + (LAND_HEIGHT - TemplateHeight) * 2; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
427 |
if pa.ar[i].y > LAND_HEIGHT - 1 then |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
428 |
pa.ar[i].y:= LAND_HEIGHT - 1; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
429 |
end; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
430 |
for i:= 0 to pred(FillPointsCount) do |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
431 |
begin |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
432 |
FillPoints^[i].y:= LAND_HEIGHT - 1 - FillPoints^[i].y + (LAND_HEIGHT - TemplateHeight) * 2; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
433 |
if FillPoints^[i].y > LAND_HEIGHT - 1 then |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
434 |
FillPoints^[i].y:= LAND_HEIGHT - 1; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
435 |
end; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
436 |
end; |
2376 | 437 |
end |
2338
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
438 |
*) |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
439 |
// template recycling. Pull these off the floor a bit |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
440 |
if (not isNegative) and (cTemplateFilter = 4) then |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
441 |
begin |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
442 |
for i:= 0 to pred(BasePointsCount) do |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
443 |
begin |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
444 |
dec(pa.ar[i].y, 100); |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
445 |
if pa.ar[i].y < 0 then |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
446 |
pa.ar[i].y:= 0; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
447 |
end; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
448 |
for i:= 0 to pred(FillPointsCount) do |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
449 |
begin |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
450 |
dec(FillPoints^[i].y, 100); |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
451 |
if FillPoints^[i].y < 0 then |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
452 |
FillPoints^[i].y:= 0; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
453 |
end; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
454 |
end; |
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
455 |
|
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
456 |
if (canFlip and (getrandom(2) = 0)) then |
358 | 457 |
begin |
458 |
for i:= 0 to pred(BasePointsCount) do |
|
1760 | 459 |
pa.ar[i].y:= LAND_HEIGHT - 1 - pa.ar[i].y; |
358 | 460 |
for i:= 0 to pred(FillPointsCount) do |
1760 | 461 |
FillPoints^[i].y:= LAND_HEIGHT - 1 - FillPoints^[i].y; |
358 | 462 |
end; |
463 |
end |
|
4 | 464 |
end; |
67 | 465 |
|
561 | 466 |
function CheckIntersect(V1, V2, V3, V4: TPoint): boolean; |
467 |
var c1, c2, dm: LongInt; |
|
468 |
begin |
|
469 |
dm:= (V4.y - V3.y) * (V2.x - V1.x) - (V4.x - V3.x) * (V2.y - V1.y); |
|
470 |
c1:= (V4.x - V3.x) * (V1.y - V3.y) - (V4.y - V3.y) * (V1.x - V3.x); |
|
471 |
if dm = 0 then exit(false); |
|
472 |
||
473 |
c2:= (V2.x - V3.x) * (V1.y - V3.y) - (V2.y - V3.y) * (V1.x - V3.x); |
|
474 |
if dm > 0 then |
|
475 |
begin |
|
476 |
if (c1 < 0) or (c1 > dm) then exit(false); |
|
477 |
if (c2 < 0) or (c2 > dm) then exit(false) |
|
478 |
end else |
|
479 |
begin |
|
480 |
if (c1 > 0) or (c1 < dm) then exit(false); |
|
481 |
if (c2 > 0) or (c2 < dm) then exit(false) |
|
482 |
end; |
|
483 |
||
484 |
//AddFileLog('1 (' + inttostr(V1.x) + ',' + inttostr(V1.y) + ')x(' + inttostr(V2.x) + ',' + inttostr(V2.y) + ')'); |
|
485 |
//AddFileLog('2 (' + inttostr(V3.x) + ',' + inttostr(V3.y) + ')x(' + inttostr(V4.x) + ',' + inttostr(V4.y) + ')'); |
|
486 |
CheckIntersect:= true |
|
487 |
end; |
|
488 |
||
489 |
function CheckSelfIntersect(var pa: TPixAr; ind: Longword): boolean; |
|
490 |
var i: Longword; |
|
491 |
begin |
|
492 |
if (ind <= 0) or (ind >= Pred(pa.Count)) then exit(false); |
|
493 |
for i:= 1 to pa.Count - 3 do |
|
494 |
if (i <= ind - 1) or (i >= ind + 2) then |
|
495 |
begin |
|
496 |
if (i <> ind - 1) and |
|
497 |
CheckIntersect(pa.ar[ind], pa.ar[ind - 1], pa.ar[i], pa.ar[i - 1]) then exit(true); |
|
498 |
if (i <> ind + 2) and |
|
499 |
CheckIntersect(pa.ar[ind], pa.ar[ind + 1], pa.ar[i], pa.ar[i - 1]) then exit(true); |
|
500 |
end; |
|
501 |
CheckSelfIntersect:= false |
|
502 |
end; |
|
503 |
||
429 | 504 |
procedure RandomizePoints(var pa: TPixAr); |
364 | 505 |
const cEdge = 55; |
561 | 506 |
cMinDist = 8; |
371 | 507 |
var radz: array[0..Pred(cMaxEdgePoints)] of LongInt; |
561 | 508 |
i, k, dist, px, py: LongInt; |
364 | 509 |
begin |
510 |
for i:= 0 to Pred(pa.Count) do |
|
3225
5d8f4737b6cd
another uninitialised value radz[k] for corresponding pa.ar of NTPX
nemo
parents:
3224
diff
changeset
|
511 |
begin |
5d8f4737b6cd
another uninitialised value radz[k] for corresponding pa.ar of NTPX
nemo
parents:
3224
diff
changeset
|
512 |
radz[i]:= 0; |
364 | 513 |
with pa.ar[i] do |
365 | 514 |
if x <> NTPX then |
515 |
begin |
|
1760 | 516 |
radz[i]:= Min(Max(x - cEdge, 0), Max(LAND_WIDTH - cEdge - x, 0)); |
517 |
radz[i]:= Min(radz[i], Min(Max(y - cEdge, 0), Max(LAND_HEIGHT - cEdge - y, 0))); |
|
365 | 518 |
if radz[i] > 0 then |
519 |
for k:= 0 to Pred(i) do |
|
364 | 520 |
begin |
429 | 521 |
dist:= Max(abs(x - pa.ar[k].x), abs(y - pa.ar[k].y)); |
365 | 522 |
radz[k]:= Max(0, Min((dist - cMinDist) div 2, radz[k])); |
523 |
radz[i]:= Max(0, Min(dist - radz[k] - cMinDist, radz[i])) |
|
524 |
end |
|
525 |
end; |
|
3225
5d8f4737b6cd
another uninitialised value radz[k] for corresponding pa.ar of NTPX
nemo
parents:
3224
diff
changeset
|
526 |
end; |
364 | 527 |
|
528 |
for i:= 0 to Pred(pa.Count) do |
|
529 |
with pa.ar[i] do |
|
1753 | 530 |
if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then |
364 | 531 |
begin |
561 | 532 |
px:= x; |
533 |
py:= y; |
|
371 | 534 |
x:= x + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3; |
561 | 535 |
y:= y + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3; |
536 |
if CheckSelfIntersect(pa, i) then |
|
537 |
begin |
|
538 |
x:= px; |
|
539 |
y:= py |
|
540 |
end; |
|
364 | 541 |
end |
67 | 542 |
end; |
543 |
||
364 | 544 |
|
23 | 545 |
procedure GenBlank(var Template: TEdgeTemplate); |
4 | 546 |
var pa: TPixAr; |
23 | 547 |
i: Longword; |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
548 |
y, x: Longword; |
4 | 549 |
begin |
1760 | 550 |
for y:= 0 to LAND_HEIGHT - 1 do |
551 |
for x:= 0 to LAND_WIDTH - 1 do |
|
3519 | 552 |
Land[y, x]:= lfBasic; |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
553 |
|
3407 | 554 |
{$HINTS OFF} |
358 | 555 |
SetPoints(Template, pa); |
3407 | 556 |
{$HINTS ON} |
429 | 557 |
for i:= 1 to Template.BezierizeCount do |
558 |
begin |
|
431 | 559 |
BezierizeEdge(pa, _0_5); |
561 | 560 |
RandomizePoints(pa); |
429 | 561 |
RandomizePoints(pa) |
562 |
end; |
|
563 |
for i:= 1 to Template.RandPassesCount do RandomizePoints(pa); |
|
365 | 564 |
BezierizeEdge(pa, _0_1); |
27 | 565 |
|
365 | 566 |
DrawEdge(pa, 0); |
27 | 567 |
|
358 | 568 |
with Template do |
23 | 569 |
for i:= 0 to pred(FillPointsCount) do |
570 |
with FillPoints^[i] do |
|
89 | 571 |
FillLand(x, y); |
572 |
||
3519 | 573 |
DrawEdge(pa, lfBasic); |
1773 | 574 |
|
1792 | 575 |
MaxHedgehogs:= Template.MaxHedgehogs; |
1776 | 576 |
hasGirders:= Template.hasGirders; |
577 |
playHeight:= Template.TemplateHeight; |
|
578 |
playWidth:= Template.TemplateWidth; |
|
579 |
leftX:= ((LAND_WIDTH - playWidth) div 2); |
|
580 |
rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1; |
|
581 |
topY:= LAND_HEIGHT - playHeight; |
|
582 |
||
1797 | 583 |
// force to only cavern even if a cavern map is invertable if cTemplateFilter = 4 ? |
2376 | 584 |
if (cTemplateFilter = 4) or |
2338
8f6508c97f3f
An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
nemo
parents:
2308
diff
changeset
|
585 |
(Template.canInvert and (getrandom(2) = 0)) or |
2376 | 586 |
(not Template.canInvert and Template.isNegative) then |
1776 | 587 |
begin |
588 |
hasBorder:= true; |
|
1773 | 589 |
for y:= 0 to LAND_HEIGHT - 1 do |
590 |
for x:= 0 to LAND_WIDTH - 1 do |
|
1776 | 591 |
if (y < topY) or (x < leftX) or (x > rightX) then |
592 |
Land[y, x]:= 0 |
|
593 |
else |
|
594 |
begin |
|
595 |
if Land[y, x] = 0 then |
|
3519 | 596 |
Land[y, x]:= lfBasic |
597 |
else if Land[y, x] = lfBasic then |
|
1776 | 598 |
Land[y, x]:= 0; |
599 |
end; |
|
600 |
end; |
|
23 | 601 |
end; |
602 |
||
371 | 603 |
function SelectTemplate: LongInt; |
161 | 604 |
begin |
3612
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
605 |
if (cReducedQuality and rqLowRes) <> 0 then |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
606 |
SelectTemplate:= SmallTemplates[getrandom(Succ(High(SmallTemplates)))] |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
607 |
else |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
608 |
case cTemplateFilter of |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
609 |
0: SelectTemplate:= getrandom(Succ(High(EdgeTemplates))); |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
610 |
1: SelectTemplate:= SmallTemplates[getrandom(Succ(High(SmallTemplates)))]; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
611 |
2: SelectTemplate:= MediumTemplates[getrandom(Succ(High(MediumTemplates)))]; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
612 |
3: SelectTemplate:= LargeTemplates[getrandom(Succ(High(LargeTemplates)))]; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
613 |
4: SelectTemplate:= CavernTemplates[getrandom(Succ(High(CavernTemplates)))]; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
614 |
5: SelectTemplate:= WackyTemplates[getrandom(Succ(High(WackyTemplates)))]; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
615 |
end; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
616 |
|
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
617 |
WriteLnToConsole('Selected template #'+inttostr(SelectTemplate)+' using filter #'+inttostr(cTemplateFilter)); |
161 | 618 |
end; |
619 |
||
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
620 |
procedure LandSurface2LandPixels(Surface: PSDL_Surface); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
621 |
var x, y: LongInt; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
622 |
p: PLongwordArray; |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
623 |
begin |
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
624 |
TryDo(Surface <> nil, 'Assert (LandSurface <> nil) failed', true); |
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
625 |
|
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
626 |
if SDL_MustLock(Surface) then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
627 |
SDLTry(SDL_LockSurface(Surface) >= 0, true); |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
628 |
|
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
629 |
p:= Surface^.pixels; |
1760 | 630 |
for y:= 0 to LAND_HEIGHT - 1 do |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
631 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
632 |
for x:= 0 to LAND_WIDTH - 1 do |
3598 | 633 |
if Land[y, x] <> 0 then |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
634 |
if (cReducedQuality and rqBlurryLand) = 0 then |
3598 | 635 |
LandPixels[y, x]:= p^[x] or AMask |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
636 |
else |
3598 | 637 |
LandPixels[y div 2, x div 2]:= p^[x] or AMask; |
2376 | 638 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
639 |
p:= @(p^[Surface^.pitch div 4]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
640 |
end; |
1180
e56317fdf78d
Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents:
1085
diff
changeset
|
641 |
|
1182
e2e13aa055c1
Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents:
1181
diff
changeset
|
642 |
if SDL_MustLock(Surface) then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
643 |
SDL_UnlockSurface(Surface); |
1754 | 644 |
end; |
645 |
||
3133 | 646 |
procedure GenMaze; |
647 |
const small_cell_size = 128; |
|
648 |
medium_cell_size = 192; |
|
649 |
large_cell_size = 256; |
|
3138 | 650 |
braidness = 10; |
3133 | 651 |
|
3242 | 652 |
var x, y: LongInt; |
3133 | 653 |
cellsize: LongInt; //selected by the user in the gui |
3242 | 654 |
seen_cells_x, seen_cells_y: LongInt; //number of cells that can be visited by the generator, that is every second cell in x and y direction. the cells between there are walls that will be removed when we move from one cell to another |
655 |
num_edges_x, num_edges_y: LongInt; //number of resulting edges that need to be vertexificated |
|
656 |
num_cells_x, num_cells_y: LongInt; //actual number of cells, depending on cell size |
|
657 |
seen_list: array of array of LongInt; |
|
3133 | 658 |
xwalls: array of array of Boolean; |
659 |
ywalls: array of array of Boolean; |
|
660 |
x_edge_list: array of array of Boolean; |
|
661 |
y_edge_list: array of array of Boolean; |
|
662 |
maze: array of array of Boolean; |
|
663 |
pa: TPixAr; |
|
3242 | 664 |
num_vertices: LongInt; |
3133 | 665 |
off_y: LongInt; |
3242 | 666 |
num_steps: LongInt; |
667 |
current_step: LongInt; |
|
3181 | 668 |
step_done: array of Boolean; |
669 |
done: Boolean; |
|
3242 | 670 |
last_cell: array of record x, y: LongInt; end; |
671 |
came_from: array of array of record x, y: LongInt; end; |
|
672 |
came_from_pos: array of LongInt; |
|
3181 | 673 |
maze_inverted: Boolean; |
3133 | 674 |
|
3242 | 675 |
function when_seen(x: LongInt; y: LongInt): LongInt; |
3133 | 676 |
begin |
677 |
if (x < 0) or (x >= seen_cells_x) or (y < 0) or (y >= seen_cells_y) then |
|
3181 | 678 |
when_seen := current_step |
3133 | 679 |
else |
3181 | 680 |
when_seen := seen_list[x, y]; |
3133 | 681 |
end; |
682 |
||
3242 | 683 |
function is_x_edge(x, y: LongInt): Boolean; |
3133 | 684 |
begin |
685 |
if (x < 0) or (x > num_edges_x) or (y < 0) or (y > num_cells_y) then |
|
686 |
is_x_edge := false |
|
687 |
else |
|
688 |
is_x_edge := x_edge_list[x, y]; |
|
689 |
end; |
|
690 |
||
3242 | 691 |
function is_y_edge(x, y: LongInt): Boolean; |
3133 | 692 |
begin |
693 |
if (x < 0) or (x > num_cells_x) or (y < 0) or (y > num_edges_y) then |
|
694 |
is_y_edge := false |
|
695 |
else |
|
696 |
is_y_edge := y_edge_list[x, y]; |
|
697 |
end; |
|
698 |
||
3181 | 699 |
procedure see_cell; |
3133 | 700 |
var dir: direction; |
3242 | 701 |
tries: LongInt; |
702 |
x, y: LongInt; |
|
3181 | 703 |
found_cell: Boolean; |
704 |
next_dir_clockwise: Boolean; |
|
705 |
||
3133 | 706 |
begin |
3181 | 707 |
x := last_cell[current_step].x; |
708 |
y := last_cell[current_step].y; |
|
709 |
seen_list[x, y] := current_step; |
|
3133 | 710 |
case GetRandom(4) of |
711 |
0: dir := DIR_N; |
|
712 |
1: dir := DIR_E; |
|
713 |
2: dir := DIR_S; |
|
714 |
3: dir := DIR_W; |
|
715 |
end; |
|
716 |
tries := 0; |
|
3181 | 717 |
found_cell := false; |
718 |
if getrandom(2) = 1 then next_dir_clockwise := true |
|
719 |
else next_dir_clockwise := false; |
|
720 |
||
721 |
while (tries < 5) and not found_cell do |
|
3133 | 722 |
begin |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
723 |
if when_seen(x + dir.x, y + dir.y) = current_step then //we are seeing ourselves, try another direction |
3133 | 724 |
begin |
725 |
//we have already seen the target cell, decide if we should remove the wall anyway |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
726 |
//(or put a wall there if maze_inverted, but we are not doing that right now) |
3133 | 727 |
if not maze_inverted and (GetRandom(braidness) = 0) then |
3181 | 728 |
//or just warn that inverted+braid+indestructible terrain != good idea |
3133 | 729 |
begin |
730 |
case dir.x of |
|
731 |
-1: if x > 0 then ywalls[x-1, y] := false; |
|
732 |
1: if x < seen_cells_x - 1 then ywalls[x, y] := false; |
|
733 |
end; |
|
734 |
case dir.y of |
|
735 |
-1: if y > 0 then xwalls[x, y-1] := false; |
|
736 |
1: if y < seen_cells_y - 1 then xwalls[x, y] := false; |
|
737 |
end; |
|
738 |
end; |
|
3181 | 739 |
if next_dir_clockwise then |
740 |
begin |
|
741 |
if dir = DIR_N then |
|
742 |
dir := DIR_E |
|
743 |
else if dir = DIR_E then |
|
744 |
dir := DIR_S |
|
745 |
else if dir = DIR_S then |
|
746 |
dir := DIR_W |
|
747 |
else |
|
748 |
dir := DIR_N; |
|
749 |
end |
|
3133 | 750 |
else |
3181 | 751 |
begin |
752 |
if dir = DIR_N then |
|
753 |
dir := DIR_W |
|
754 |
else if dir = DIR_E then |
|
755 |
dir := DIR_N |
|
756 |
else if dir = DIR_S then |
|
757 |
dir := DIR_E |
|
758 |
else |
|
759 |
dir := DIR_S; |
|
760 |
end |
|
3133 | 761 |
end |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
762 |
else if when_seen(x + dir.x, y + dir.y) = -1 then //cell was not seen yet, go there |
3133 | 763 |
begin |
764 |
case dir.y of |
|
765 |
-1: xwalls[x, y-1] := false; |
|
766 |
1: xwalls[x, y] := false; |
|
767 |
end; |
|
768 |
case dir.x of |
|
769 |
-1: ywalls[x-1, y] := false; |
|
770 |
1: ywalls[x, y] := false; |
|
771 |
end; |
|
3181 | 772 |
last_cell[current_step].x := x+dir.x; |
773 |
last_cell[current_step].y := y+dir.y; |
|
774 |
came_from_pos[current_step] := came_from_pos[current_step] + 1; |
|
775 |
came_from[current_step, came_from_pos[current_step]].x := x; |
|
776 |
came_from[current_step, came_from_pos[current_step]].y := y; |
|
777 |
found_cell := true; |
|
778 |
end |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
779 |
else //we are seeing someone else, quit |
3181 | 780 |
begin |
781 |
step_done[current_step] := true; |
|
782 |
found_cell := true; |
|
3133 | 783 |
end; |
784 |
||
785 |
tries := tries + 1; |
|
786 |
end; |
|
3181 | 787 |
if not found_cell then |
788 |
begin |
|
789 |
last_cell[current_step].x := came_from[current_step, came_from_pos[current_step]].x; |
|
790 |
last_cell[current_step].y := came_from[current_step, came_from_pos[current_step]].y; |
|
791 |
came_from_pos[current_step] := came_from_pos[current_step] - 1; |
|
792 |
if came_from_pos[current_step] >= 0 then see_cell |
|
793 |
else step_done[current_step] := true; |
|
794 |
end; |
|
795 |
end; |
|
3133 | 796 |
|
3242 | 797 |
procedure add_vertex(x, y: LongInt); |
798 |
var tmp_x, tmp_y: LongInt; |
|
3133 | 799 |
begin |
800 |
if x = NTPX then |
|
801 |
begin |
|
3138 | 802 |
if pa.ar[num_vertices - 6].x = NTPX then |
803 |
begin |
|
804 |
num_vertices := num_vertices - 6; |
|
805 |
end |
|
806 |
else |
|
807 |
begin |
|
808 |
pa.ar[num_vertices].x := NTPX; |
|
809 |
pa.ar[num_vertices].y := 0; |
|
810 |
end |
|
3133 | 811 |
end |
812 |
else |
|
813 |
begin |
|
3181 | 814 |
if maze_inverted or (x mod 2 = 0) then tmp_x := cellsize |
3138 | 815 |
else tmp_x := cellsize * 2 div 3; |
3181 | 816 |
if maze_inverted or (y mod 2 = 0) then tmp_y := cellsize |
3138 | 817 |
else tmp_y := cellsize * 2 div 3; |
818 |
||
819 |
pa.ar[num_vertices].x := (x-1)*cellsize + tmp_x; |
|
820 |
pa.ar[num_vertices].y := (y-1)*cellsize + tmp_y + off_y; |
|
3133 | 821 |
end; |
822 |
num_vertices := num_vertices + 1; |
|
823 |
end; |
|
824 |
||
3242 | 825 |
procedure add_edge(x, y: LongInt; dir: direction); |
826 |
var i: LongInt; |
|
3133 | 827 |
begin |
828 |
if dir = DIR_N then |
|
829 |
begin |
|
830 |
dir := DIR_W |
|
831 |
end |
|
832 |
else if dir = DIR_E then |
|
833 |
begin |
|
834 |
dir := DIR_N |
|
835 |
end |
|
836 |
else if dir = DIR_S then |
|
837 |
begin |
|
838 |
dir := DIR_E |
|
839 |
end |
|
840 |
else |
|
841 |
begin |
|
842 |
dir := DIR_S; |
|
843 |
end; |
|
844 |
||
845 |
for i := 0 to 3 do |
|
846 |
begin |
|
847 |
if dir = DIR_N then |
|
848 |
dir := DIR_E |
|
849 |
else if dir = DIR_E then |
|
850 |
dir := DIR_S |
|
851 |
else if dir = DIR_S then |
|
852 |
dir := DIR_W |
|
853 |
else |
|
854 |
dir := DIR_N; |
|
855 |
||
856 |
if (dir = DIR_N) and is_x_edge(x, y) then |
|
857 |
begin |
|
858 |
x_edge_list[x, y] := false; |
|
859 |
add_vertex(x+1, y); |
|
860 |
add_edge(x, y-1, DIR_N); |
|
861 |
break; |
|
862 |
end; |
|
863 |
||
864 |
if (dir = DIR_E) and is_y_edge(x+1, y) then |
|
865 |
begin |
|
866 |
y_edge_list[x+1, y] := false; |
|
867 |
add_vertex(x+2, y+1); |
|
868 |
add_edge(x+1, y, DIR_E); |
|
869 |
break; |
|
870 |
end; |
|
871 |
||
872 |
if (dir = DIR_S) and is_x_edge(x, y+1) then |
|
873 |
begin |
|
874 |
x_edge_list[x, y+1] := false; |
|
875 |
add_vertex(x+1, y+2); |
|
876 |
add_edge(x, y+1, DIR_S); |
|
877 |
break; |
|
878 |
end; |
|
879 |
||
880 |
if (dir = DIR_W) and is_y_edge(x, y) then |
|
881 |
begin |
|
882 |
y_edge_list[x, y] := false; |
|
883 |
add_vertex(x, y+1); |
|
884 |
add_edge(x-1, y, DIR_W); |
|
885 |
break; |
|
886 |
end; |
|
887 |
end; |
|
888 |
||
889 |
end; |
|
890 |
||
891 |
begin |
|
892 |
case cMazeSize of |
|
3181 | 893 |
0: begin |
894 |
cellsize := small_cell_size; |
|
895 |
maze_inverted := false; |
|
896 |
end; |
|
897 |
1: begin |
|
898 |
cellsize := medium_cell_size; |
|
899 |
maze_inverted := false; |
|
900 |
end; |
|
901 |
2: begin |
|
902 |
cellsize := large_cell_size; |
|
903 |
maze_inverted := false; |
|
904 |
end; |
|
905 |
3: begin |
|
906 |
cellsize := small_cell_size; |
|
907 |
maze_inverted := true; |
|
908 |
end; |
|
909 |
4: begin |
|
910 |
cellsize := medium_cell_size; |
|
911 |
maze_inverted := true; |
|
912 |
end; |
|
913 |
5: begin |
|
914 |
cellsize := large_cell_size; |
|
915 |
maze_inverted := true; |
|
916 |
end; |
|
3133 | 917 |
end; |
918 |
||
919 |
num_cells_x := LAND_WIDTH div cellsize; |
|
3228 | 920 |
if not odd(num_cells_x) then num_cells_x := num_cells_x - 1; //needs to be odd |
3133 | 921 |
num_cells_y := LAND_HEIGHT div cellsize; |
3228 | 922 |
if not odd(num_cells_y) then num_cells_y := num_cells_y - 1; |
3133 | 923 |
num_edges_x := num_cells_x - 1; |
924 |
num_edges_y := num_cells_y - 1; |
|
925 |
seen_cells_x := num_cells_x div 2; |
|
926 |
seen_cells_y := num_cells_y div 2; |
|
927 |
||
3181 | 928 |
if maze_inverted then |
929 |
num_steps := 3 //TODO randomize, between 3 and 5? |
|
930 |
else |
|
931 |
num_steps := 1; |
|
932 |
SetLength(step_done, num_steps); |
|
933 |
SetLength(last_cell, num_steps); |
|
934 |
SetLength(came_from_pos, num_steps); |
|
935 |
SetLength(came_from, num_steps, num_cells_x*num_cells_y); |
|
936 |
done := false; |
|
937 |
for current_step := 0 to num_steps - 1 do |
|
938 |
step_done[current_step] := false; |
|
939 |
came_from_pos[current_step] := 0; |
|
940 |
current_step := 0; |
|
941 |
||
3133 | 942 |
SetLength(seen_list, seen_cells_x, seen_cells_y); |
943 |
SetLength(xwalls, seen_cells_x, seen_cells_y - 1); |
|
944 |
SetLength(ywalls, seen_cells_x - 1, seen_cells_y); |
|
945 |
SetLength(x_edge_list, num_edges_x, num_cells_y); |
|
946 |
SetLength(y_edge_list, num_cells_x, num_edges_y); |
|
947 |
SetLength(maze, num_cells_x, num_cells_y); |
|
948 |
||
949 |
num_vertices := 0; |
|
950 |
||
951 |
playHeight := num_cells_y * cellsize; |
|
952 |
playWidth := num_cells_x * cellsize; |
|
953 |
off_y := LAND_HEIGHT - playHeight; |
|
954 |
||
955 |
for x := 0 to playWidth do |
|
956 |
for y := 0 to off_y - 1 do |
|
3181 | 957 |
Land[y, x] := 0; |
3133 | 958 |
|
959 |
for x := 0 to playWidth do |
|
960 |
for y := off_y to LAND_HEIGHT - 1 do |
|
3519 | 961 |
Land[y, x] := lfBasic; |
3133 | 962 |
|
963 |
for y := 0 to num_cells_y - 1 do |
|
964 |
for x := 0 to num_cells_x - 1 do |
|
965 |
maze[x, y] := false; |
|
966 |
||
967 |
for x := 0 to seen_cells_x - 1 do |
|
968 |
for y := 0 to seen_cells_y - 2 do |
|
969 |
xwalls[x, y] := true; |
|
970 |
||
971 |
for x := 0 to seen_cells_x - 2 do |
|
972 |
for y := 0 to seen_cells_y - 1 do |
|
973 |
ywalls[x, y] := true; |
|
974 |
||
975 |
for x := 0 to seen_cells_x - 1 do |
|
976 |
for y := 0 to seen_cells_y - 1 do |
|
3181 | 977 |
seen_list[x, y] := -1; |
3133 | 978 |
|
979 |
for x := 0 to num_edges_x - 1 do |
|
980 |
for y := 0 to num_cells_y - 1 do |
|
981 |
x_edge_list[x, y] := false; |
|
982 |
||
983 |
for x := 0 to num_cells_x - 1 do |
|
984 |
for y := 0 to num_edges_y - 1 do |
|
985 |
y_edge_list[x, y] := false; |
|
986 |
||
3181 | 987 |
for current_step := 0 to num_steps-1 do |
988 |
begin |
|
3242 | 989 |
x := GetRandom(seen_cells_x - 1) div LongWord(num_steps); |
3181 | 990 |
last_cell[current_step].x := x + current_step * seen_cells_x div num_steps; |
991 |
last_cell[current_step].y := GetRandom(seen_cells_y); |
|
992 |
end; |
|
993 |
||
994 |
while not done do |
|
995 |
begin |
|
996 |
done := true; |
|
997 |
for current_step := 0 to num_steps-1 do |
|
998 |
begin |
|
999 |
if not step_done[current_step] then |
|
1000 |
begin |
|
1001 |
see_cell; |
|
1002 |
done := false; |
|
1003 |
end; |
|
1004 |
end; |
|
1005 |
end; |
|
3133 | 1006 |
|
1007 |
for x := 0 to seen_cells_x - 1 do |
|
1008 |
for y := 0 to seen_cells_y - 1 do |
|
3181 | 1009 |
if seen_list[x, y] > -1 then |
3133 | 1010 |
maze[(x+1)*2-1, (y+1)*2-1] := true; |
1011 |
||
1012 |
for x := 0 to seen_cells_x - 1 do |
|
1013 |
for y := 0 to seen_cells_y - 2 do |
|
1014 |
if not xwalls[x, y] then |
|
1015 |
maze[x*2 + 1, y*2 + 2] := true; |
|
1016 |
||
1017 |
||
1018 |
for x := 0 to seen_cells_x - 2 do |
|
1019 |
for y := 0 to seen_cells_y - 1 do |
|
1020 |
if not ywalls[x, y] then |
|
1021 |
maze[x*2 + 2, y*2 + 1] := true; |
|
1022 |
||
1023 |
for x := 0 to num_edges_x - 1 do |
|
1024 |
for y := 0 to num_cells_y - 1 do |
|
1025 |
if maze[x, y] xor maze[x+1, y] then |
|
1026 |
x_edge_list[x, y] := true |
|
1027 |
else |
|
1028 |
x_edge_list[x, y] := false; |
|
1029 |
||
1030 |
for x := 0 to num_cells_x - 1 do |
|
1031 |
for y := 0 to num_edges_y - 1 do |
|
1032 |
if maze[x, y] xor maze[x, y+1] then |
|
1033 |
y_edge_list[x, y] := true |
|
1034 |
else |
|
1035 |
y_edge_list[x, y] := false; |
|
1036 |
||
1037 |
for x := 0 to num_edges_x - 1 do |
|
1038 |
for y := 0 to num_cells_y - 1 do |
|
1039 |
if x_edge_list[x, y] then |
|
1040 |
begin |
|
1041 |
x_edge_list[x, y] := false; |
|
1042 |
add_vertex(x+1, y+1); |
|
1043 |
add_vertex(x+1, y); |
|
1044 |
add_edge(x, y-1, DIR_N); |
|
1045 |
add_vertex(NTPX, 0); |
|
1046 |
end; |
|
1047 |
||
1048 |
pa.count := num_vertices; |
|
1049 |
||
1050 |
RandomizePoints(pa); |
|
1051 |
BezierizeEdge(pa, _0_25); |
|
1052 |
RandomizePoints(pa); |
|
3138 | 1053 |
BezierizeEdge(pa, _0_25); |
3133 | 1054 |
|
1055 |
DrawEdge(pa, 0); |
|
1056 |
||
3181 | 1057 |
if maze_inverted then |
1058 |
FillLand(1, 1+off_y) |
|
1059 |
else |
|
1060 |
begin |
|
1061 |
x := 0; |
|
3519 | 1062 |
while Land[cellsize div 2 + cellsize + off_y, x] = lfBasic do |
3181 | 1063 |
x := x + 1; |
1064 |
while Land[cellsize div 2 + cellsize + off_y, x] = 0 do |
|
1065 |
x := x + 1; |
|
1066 |
FillLand(x+1, cellsize div 2 + cellsize + off_y); |
|
1067 |
end; |
|
3133 | 1068 |
|
1069 |
MaxHedgehogs:= 32; |
|
3141
70d65353bd60
prg adds option to toggle girders in maze, adjusts some frontend strings
nemo
parents:
3138
diff
changeset
|
1070 |
if (GameFlags and gfDisableGirders) <> 0 then hasGirders:= false |
70d65353bd60
prg adds option to toggle girders in maze, adjusts some frontend strings
nemo
parents:
3138
diff
changeset
|
1071 |
else hasGirders := true; |
3133 | 1072 |
leftX:= 0; |
1073 |
rightX:= playWidth; |
|
1074 |
topY:= off_y; |
|
3181 | 1075 |
hasBorder := false; |
3133 | 1076 |
end; |
1077 |
||
1754 | 1078 |
procedure GenLandSurface; |
1079 |
var tmpsurf: PSDL_Surface; |
|
1080 |
begin |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1081 |
WriteLnToConsole('Generating land...'); |
3133 | 1082 |
case cMapGen of |
1083 |
0: GenBlank(EdgeTemplates[SelectTemplate]); |
|
1084 |
1: GenMaze; |
|
1085 |
end; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1086 |
AddProgress(); |
1754 | 1087 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1088 |
tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, LAND_WIDTH, LAND_HEIGHT, 32, RMask, GMask, BMask, 0); |
1754 | 1089 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1090 |
TryDo(tmpsurf <> nil, 'Error creating pre-land surface', true); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1091 |
ColorizeLand(tmpsurf); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1092 |
AddOnLandObjects(tmpsurf); |
1754 | 1093 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1094 |
LandSurface2LandPixels(tmpsurf); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1095 |
SDL_FreeSurface(tmpsurf); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1096 |
AddProgress(); |
1754 | 1097 |
end; |
1098 |
||
1099 |
procedure MakeFortsMap; |
|
1100 |
var tmpsurf: PSDL_Surface; |
|
1101 |
begin |
|
2866 | 1102 |
MaxHedgehogs:= 32; |
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2163
diff
changeset
|
1103 |
// For now, defining a fort is playable area as 3072x1200 - there are no tall forts. The extra height is to avoid triggering border with current code, also if user turns on a border, it will give a bit more maneuvering room. |
1784 | 1104 |
playHeight:= 1200; |
2096 | 1105 |
playWidth:= 2560; |
1776 | 1106 |
leftX:= (LAND_WIDTH - playWidth) div 2; |
1107 |
rightX:= ((playWidth + (LAND_WIDTH - playWidth) div 2) - 1); |
|
1108 |
topY:= LAND_HEIGHT - playHeight; |
|
1109 |
||
1754 | 1110 |
WriteLnToConsole('Generating forts land...'); |
1111 |
||
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2163
diff
changeset
|
1112 |
tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[0]^.Teams[0]^.FortName + 'L', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps); |
1784 | 1113 |
BlitImageAndGenerateCollisionInfo(leftX+150, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); |
1754 | 1114 |
SDL_FreeSurface(tmpsurf); |
1115 |
||
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2163
diff
changeset
|
1116 |
tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[1]^.Teams[0]^.FortName + 'R', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps); |
1784 | 1117 |
BlitImageAndGenerateCollisionInfo(rightX - 150 - tmpsurf^.w, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); |
1754 | 1118 |
SDL_FreeSurface(tmpsurf); |
1119 |
end; |
|
1120 |
||
1792 | 1121 |
// Hi unC0Rr. |
1122 |
// This is a function that Tiy assures me would not be good for gameplay. |
|
1123 |
// It allows the setting of arbitrary portions of landscape as indestructible, or regular, or even blank. |
|
2154
3d2917be12c3
Change default output to stderr since /tmp doesn't exist under windows and is useless under iphoneos, add a couple of extra parameters
nemo
parents:
2152
diff
changeset
|
1124 |
// He said I could add it here only when I swore it would not impact gameplay. Which, as far as I can tell, is true. |
3d2917be12c3
Change default output to stderr since /tmp doesn't exist under windows and is useless under iphoneos, add a couple of extra parameters
nemo
parents:
2152
diff
changeset
|
1125 |
// I would just like to play with it with my friends if you do not mind. |
1792 | 1126 |
// Can allow for amusing maps. |
1127 |
procedure LoadMask; |
|
1128 |
var tmpsurf: PSDL_Surface; |
|
1129 |
p: PLongwordArray; |
|
1130 |
x, y, cpX, cpY: Longword; |
|
1131 |
begin |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1132 |
tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1133 |
if (tmpsurf <> nil) and (tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT) and (tmpsurf^.format^.BytesPerPixel = 4) then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1134 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1135 |
cpX:= (LAND_WIDTH - tmpsurf^.w) div 2; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1136 |
cpY:= LAND_HEIGHT - tmpsurf^.h; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1137 |
if SDL_MustLock(tmpsurf) then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1138 |
SDLTry(SDL_LockSurface(tmpsurf) >= 0, true); |
2376 | 1139 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1140 |
p:= tmpsurf^.pixels; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1141 |
for y:= 0 to Pred(tmpsurf^.h) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1142 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1143 |
for x:= 0 to Pred(tmpsurf^.w) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1144 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1145 |
if ((AMask and p^[x]) = 0) then // Tiy was having trouble generating transparent black |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1146 |
Land[cpY + y, cpX + x]:= 0 |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1147 |
else if p^[x] = (AMask or RMask) then |
3519 | 1148 |
Land[cpY + y, cpX + x]:= lfIndestructible |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1149 |
else if p^[x] = $FFFFFFFF then |
3519 | 1150 |
Land[cpY + y, cpX + x]:= lfBasic; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1151 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1152 |
p:= @(p^[tmpsurf^.pitch div 4]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1153 |
end; |
2243
b4764993f833
additional touch support and nemo's reduced land array size
koda
parents:
2240
diff
changeset
|
1154 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1155 |
if SDL_MustLock(tmpsurf) then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1156 |
SDL_UnlockSurface(tmpsurf); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1157 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1158 |
if (tmpsurf <> nil) then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1159 |
SDL_FreeSurface(tmpsurf); |
3513
f589230fa21b
now it's possible to select the scheme file in the ifrontendfix a type about loading an image (iphone file system IS case senstive)
koda
parents:
3509
diff
changeset
|
1160 |
tmpsurf:= nil; |
1792 | 1161 |
end; |
1162 |
||
1754 | 1163 |
procedure LoadMap; |
1164 |
var tmpsurf: PSDL_Surface; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1165 |
s: shortstring; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1166 |
f: textfile; |
1754 | 1167 |
begin |
2981 | 1168 |
isMap:= true; |
1754 | 1169 |
WriteLnToConsole('Loading land from file...'); |
1170 |
AddProgress; |
|
2171
8208946331ba
Smaxx refactor of LoadImage to use flags, iphone changes by koda (mostly use of rgba instead of rgb)
nemo
parents:
2163
diff
changeset
|
1171 |
tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps); |
1760 | 1172 |
TryDo((tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT), 'Map dimensions too big!', true); |
1754 | 1173 |
|
2154
3d2917be12c3
Change default output to stderr since /tmp doesn't exist under windows and is useless under iphoneos, add a couple of extra parameters
nemo
parents:
2152
diff
changeset
|
1174 |
// unC0Rr - should this be passed from the GUI? I am not sure which layer does what |
1792 | 1175 |
s:= Pathz[ptMapCurrent] + '/map.cfg'; |
1176 |
WriteLnToConsole('Fetching map HH limit'); |
|
1177 |
Assign(f, s); |
|
2747 | 1178 |
filemode:= 0; // readonly |
1792 | 1179 |
Reset(f); |
1795 | 1180 |
Readln(f); |
1181 |
if not eof(f) then Readln(f, MaxHedgehogs); |
|
1182 |
||
2705
2b5625c4ec16
fix a nasty 196 bytes memory leak in engine, plus other stuff for iphone frontend
koda
parents:
2699
diff
changeset
|
1183 |
if (MaxHedgehogs = 0) then MaxHedgehogs:= 18; |
1792 | 1184 |
|
1776 | 1185 |
playHeight:= tmpsurf^.h; |
1186 |
playWidth:= tmpsurf^.w; |
|
1187 |
leftX:= (LAND_WIDTH - playWidth) div 2; |
|
1188 |
rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1; |
|
1189 |
topY:= LAND_HEIGHT - playHeight; |
|
1190 |
||
1754 | 1191 |
TryDo(tmpsurf^.format^.BytesPerPixel = 4, 'Map should be 32bit', true); |
1192 |
||
1772 | 1193 |
BlitImageAndGenerateCollisionInfo( |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1194 |
(LAND_WIDTH - tmpsurf^.w) div 2, |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1195 |
LAND_HEIGHT - tmpsurf^.h, |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1196 |
tmpsurf^.w, |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1197 |
tmpsurf); |
1754 | 1198 |
SDL_FreeSurface(tmpsurf); |
1792 | 1199 |
|
1200 |
LoadMask; |
|
1754 | 1201 |
end; |
1202 |
||
1203 |
procedure GenMap; |
|
1784 | 1204 |
var x, y, w, c: Longword; |
1754 | 1205 |
begin |
3463 | 1206 |
hasBorder:= false; |
2891
e1f902eb0cfe
Formerly "Draw Girders" by MrMfS - now "Disable Girders" to allow template prefs to still exist
nemo
parents:
2866
diff
changeset
|
1207 |
|
3463 | 1208 |
LoadThemeConfig; |
1209 |
isMap:= false; |
|
3551 | 1210 |
|
1211 |
if ((GameFlags and gfForts) <> 0) or (Pathz[ptMapCurrent] <> '') then |
|
1212 |
FillChar(Land,SizeOf(TCollisionArray),0); |
|
1213 |
||
3463 | 1214 |
if (GameFlags and gfForts) = 0 then |
1215 |
if Pathz[ptMapCurrent] <> '' then |
|
1216 |
LoadMap |
|
1217 |
else |
|
1218 |
GenLandSurface |
|
1219 |
else |
|
1220 |
MakeFortsMap; |
|
1221 |
||
1222 |
AddProgress; |
|
1760 | 1223 |
|
1754 | 1224 |
{$IFDEF DEBUGFILE}LogLandDigest;{$ENDIF} |
1753 | 1225 |
|
1768 | 1226 |
// check for land near top |
1784 | 1227 |
c:= 0; |
1228 |
if (GameFlags and gfBorder) <> 0 then |
|
1229 |
hasBorder:= true |
|
1230 |
else |
|
1231 |
for y:= topY to topY + 5 do |
|
1232 |
for x:= leftX to rightX do |
|
1233 |
if Land[y, x] <> 0 then |
|
1234 |
begin |
|
1235 |
inc(c); |
|
1236 |
if c > 200 then // avoid accidental triggering |
|
1237 |
begin |
|
1238 |
hasBorder:= true; |
|
1239 |
break; |
|
1240 |
end; |
|
1241 |
end; |
|
1768 | 1242 |
|
1776 | 1243 |
if hasBorder then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1244 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1245 |
for y:= 0 to LAND_HEIGHT - 1 do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1246 |
for x:= 0 to LAND_WIDTH - 1 do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1247 |
if (y < topY) or (x < leftX) or (x > rightX) then |
3519 | 1248 |
Land[y, x]:= lfIndestructible; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1249 |
// experiment hardcoding cave |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1250 |
// also try basing cave dimensions on map/template dimensions, if they exist |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1251 |
for w:= 0 to 5 do // width of 3 allowed hogs to be knocked through with grenade |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1252 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1253 |
for y:= topY to LAND_HEIGHT - 1 do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1254 |
begin |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1255 |
Land[y, leftX + w]:= lfIndestructible; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1256 |
Land[y, rightX - w]:= lfIndestructible; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1257 |
if (y + w) mod 32 < 16 then |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1258 |
c:= AMask |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1259 |
else |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1260 |
c:= AMask or RMask or GMask; // FF00FFFF |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1261 |
|
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1262 |
if (cReducedQuality and rqBlurryLand) = 0 then |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1263 |
begin |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1264 |
LandPixels[y, leftX + w]:= c; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1265 |
LandPixels[y, rightX - w]:= c; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1266 |
end |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1267 |
else |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1268 |
begin |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1269 |
LandPixels[y div 2, (leftX + w) div 2]:= c; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1270 |
LandPixels[y div 2, (rightX - w) div 2]:= c; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1271 |
end; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1272 |
end; |
1768 | 1273 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1274 |
for x:= leftX to rightX do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1275 |
begin |
3595
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1276 |
Land[topY + w, x]:= lfIndestructible; |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1277 |
if (x + w) mod 32 < 16 then |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1278 |
c:= AMask |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1279 |
else |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1280 |
c:= AMask or RMask or GMask; // FF00FFFF |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1281 |
|
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1282 |
if (cReducedQuality and rqBlurryLand) = 0 then |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1283 |
LandPixels[topY + w, x]:= c |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1284 |
else |
341e407e3754
partially removing DOWNSCALE ifdef -- only two remain and their removal requires dynamic allocation (btw this breaks low quality mode)
koda
parents:
3551
diff
changeset
|
1285 |
LandPixels[(topY + w) div 2, x div 2]:= c; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1286 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1287 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1288 |
end; |
1768 | 1289 |
|
2891
e1f902eb0cfe
Formerly "Draw Girders" by MrMfS - now "Disable Girders" to allow template prefs to still exist
nemo
parents:
2866
diff
changeset
|
1290 |
if (GameFlags and gfDisableGirders) <> 0 then hasGirders:= false; |
e1f902eb0cfe
Formerly "Draw Girders" by MrMfS - now "Disable Girders" to allow template prefs to still exist
nemo
parents:
2866
diff
changeset
|
1291 |
|
3287 | 1292 |
if ((GameFlags and gfForts) = 0) |
1293 |
and ((GameFlags and gfDisableLandObjects) = 0) |
|
1294 |
and (Pathz[ptMapCurrent] = '') |
|
1295 |
then AddObjects; |
|
1776 | 1296 |
|
3058 | 1297 |
FreeLandObjects; |
1298 |
||
1807 | 1299 |
UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT); |
37 | 1300 |
end; |
1301 |
||
566 | 1302 |
function GenPreview: TPreview; |
3617 | 1303 |
var x, y, xx, yy, t, bit, cbit, lh, lw: LongInt; |
566 | 1304 |
Preview: TPreview; |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
1305 |
begin |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1306 |
WriteLnToConsole('Generating preview...'); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1307 |
case cMapGen of |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1308 |
0: GenBlank(EdgeTemplates[SelectTemplate]); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1309 |
1: GenMaze; |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1310 |
end; |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
1311 |
|
3617 | 1312 |
lh:= LAND_HEIGHT div 128; |
1313 |
lw:= LAND_WIDTH div 32; |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1314 |
for y:= 0 to 127 do |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1315 |
for x:= 0 to 31 do |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
1316 |
begin |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1317 |
Preview[y, x]:= 0; |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1318 |
for bit:= 0 to 7 do |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
1319 |
begin |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1320 |
t:= 0; |
3617 | 1321 |
cbit:= bit * 8; |
1322 |
for yy:= y * lh to y * lh + 7 do |
|
1323 |
for xx:= x * lw + cbit to x * lw + cbit + 7 do |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1324 |
if Land[yy, xx] <> 0 then inc(t); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1325 |
if t > 8 then |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1326 |
Preview[y, x]:= Preview[y, x] or ($80 shr bit); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1327 |
end; |
566 | 1328 |
end; |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1329 |
|
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3287
diff
changeset
|
1330 |
GenPreview:= Preview |
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
1331 |
end; |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
1332 |
|
3038 | 1333 |
procedure initModule; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
1334 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
1335 |
LandBackSurface:= nil; |
3369
c7289e42f0ee
add other controls for map preview, also fix a bug in digest
koda
parents:
3365
diff
changeset
|
1336 |
digest:= ''; |
3612
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1337 |
|
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1338 |
if (cReducedQuality and rqBlurryLand) = 0 then |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1339 |
SetLength(LandPixels, LAND_HEIGHT, LAND_WIDTH) |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1340 |
else |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1341 |
SetLength(LandPixels, LAND_HEIGHT div 2, LAND_WIDTH div 2); |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1342 |
|
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1343 |
SetLength(Land, LAND_HEIGHT, LAND_WIDTH); |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1344 |
SetLength(LandDirty, (LAND_HEIGHT div 32), (LAND_WIDTH div 32)); |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
1345 |
end; |
51 | 1346 |
|
3038 | 1347 |
procedure freeModule; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
1348 |
begin |
3612
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1349 |
Land:= nil; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1350 |
LandPixels:= nil; |
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3608
diff
changeset
|
1351 |
LandDirty:= nil; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
1352 |
end; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2692
diff
changeset
|
1353 |
|
4 | 1354 |
end. |