hedgewars/uLand.pas
author unc0rr
Mon, 29 Sep 2008 22:14:23 +0000
changeset 1301 c6fe8a4bfd34
parent 1292 a63a13eda583
child 1428 0855275d443f
permissions -rw-r--r--
Fix a bug screwing team selection up in network game (REMOVETEAM message doesn't have teamID, and after removing the team QMap still contains old info, when add and remove team with the same name, total hedgehogs number will be decreased by first team hh number)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
     1
(*
1066
1f1b3686a2b0 Update copyright headers a bit
unc0rr
parents: 955
diff changeset
     2
 * Hedgewars, a free turn based strategy game
883
07a568ba44e0 Update copyright info in source files headers
unc0rr
parents: 840
diff changeset
     3
 * Copyright (c) 2005-2008 Andrey Korotaev <unC0Rr@gmail.com>
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
     4
 *
183
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
     8
 *
183
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
    12
 * GNU General Public License for more details.
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    13
 *
183
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
    14
 * You should have received a copy of the GNU General Public License
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
    15
 * along with this program; if not, write to the Free Software
57c2ef19f719 Relicense to GPL
unc0rr
parents: 173
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    17
 *)
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    18
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    19
unit uLand;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    20
interface
755
edf26e9554ac Now show sprites too
unc0rr
parents: 754
diff changeset
    21
uses SDLh, uLandTemplates, uFloat, GL, uConsts;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    22
{$include options.inc}
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    23
type TLandArray = packed array[0..1023, 0..2047] of LongWord;
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
    24
     TPreview = packed array[0..127, 0..31] of byte;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    25
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    26
var  Land: TLandArray;
768
2886dafa5bcf Store Land surface in memory:
unc0rr
parents: 767
diff changeset
    27
     LandPixels: TLandArray;
766
cdc8f75ab7bc - Update land texture after explosions
unc0rr
parents: 760
diff changeset
    28
     LandTexture: PTexture = nil;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    29
37
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
    30
procedure GenMap;
766
cdc8f75ab7bc - Update land texture after explosions
unc0rr
parents: 760
diff changeset
    31
function  GenPreview: TPreview;
367
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    32
procedure CheckLandDigest(s: shortstring);
767
697728ffe39f Introduce UpdateLandTexture function to update just parts of surface
unc0rr
parents: 766
diff changeset
    33
procedure UpdateLandTexture(Y, Height: LongInt);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    34
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    35
implementation
755
edf26e9554ac Now show sprites too
unc0rr
parents: 754
diff changeset
    36
uses uConsole, uStore, uMisc, uRandom, uTeams, uLandObjects, uSHA, uIO;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    37
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    38
type TPixAr = record
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    39
              Count: Longword;
22
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
    40
              ar: array[0..Pred(cMaxEdgePoints)] of TPoint;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    41
              end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
    42
37
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
    43
procedure LogLandDigest;
316
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    44
var ctx: TSHA1Context;
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    45
    dig: TSHA1Digest;
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    46
    s: shortstring;
37
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
    47
begin
316
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    48
SHA1Init(ctx);
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    49
SHA1Update(ctx, @Land, sizeof(Land));
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    50
dig:= SHA1Final(ctx);
367
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    51
s:='M{'+inttostr(dig[0])+':'
316
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    52
       +inttostr(dig[1])+':'
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    53
       +inttostr(dig[2])+':'
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    54
       +inttostr(dig[3])+':'
57d50189ad86 Calculate land digest
unc0rr
parents: 196
diff changeset
    55
       +inttostr(dig[4])+'}';
699
353382e07407 Fix previous commit
unc0rr
parents: 698
diff changeset
    56
CheckLandDigest(s);
367
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    57
SendIPCRaw(@s[0], Length(s) + 1)
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    58
end;
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    59
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    60
procedure CheckLandDigest(s: shortstring);
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    61
const digest: shortstring = '';
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    62
begin
368
fe71e55d2d7b Make SHA really work
unc0rr
parents: 367
diff changeset
    63
{$IFDEF DEBUGFILE}
fe71e55d2d7b Make SHA really work
unc0rr
parents: 367
diff changeset
    64
AddFileLog('CheckLandDigest: ' + s);
fe71e55d2d7b Make SHA really work
unc0rr
parents: 367
diff changeset
    65
{$ENDIF}
367
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    66
if digest = '' then
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    67
   digest:= s
bc3c3edc5ce1 Check land digest
unc0rr
parents: 365
diff changeset
    68
else
700
be4847674071 - Revert previous debug things
unc0rr
parents: 699
diff changeset
    69
   TryDo(s = digest, 'Different maps generated, sorry', true)
37
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
    70
end;
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
    71
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
    72
procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword);
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    73
var
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
    74
  eX, eY, dX, dY: LongInt;
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
    75
  i, sX, sY, x, y, d: LongInt;
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    76
begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    77
eX:= 0;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    78
eY:= 0;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    79
dX:= X2 - X1;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    80
dY:= Y2 - Y1;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    81
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    82
if (dX > 0) then sX:= 1
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    83
else
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    84
  if (dX < 0) then
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    85
     begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    86
     sX:= -1;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    87
     dX:= -dX
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    88
     end else sX:= dX;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    89
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    90
if (dY > 0) then sY:= 1
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    91
  else
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    92
  if (dY < 0) then
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    93
     begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    94
     sY:= -1;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    95
     dY:= -dY
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    96
     end else sY:= dY;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    97
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    98
if (dX > dY) then d:= dX
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
    99
             else d:= dY;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   100
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   101
x:= X1;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   102
y:= Y1;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   103
 
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   104
for i:= 0 to d do
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   105
    begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   106
    inc(eX, dX);
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   107
    inc(eY, dY);
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   108
    if (eX > d) then
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   109
       begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   110
       dec(eX, d);
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   111
       inc(x, sX);
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   112
       end;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   113
    if (eY > d) then
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   114
       begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   115
       dec(eY, d);
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   116
       inc(y, sY);
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   117
       end;
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   118
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   119
    if ((x and $FFFFF800) = 0) and ((y and $FFFFFC00) = 0) then
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   120
       Land[y, x]:= Color;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   121
    end
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   122
end;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   123
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   124
procedure DrawEdge(var pa: TPixAr; Color: Longword);
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   125
var i: LongInt;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   126
begin
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   127
i:= 0;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   128
with pa do
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   129
while i < LongInt(Count) - 1 do
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   130
    if (ar[i + 1].X = NTPX) then inc(i, 2)
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   131
       else begin
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   132
       DrawLine(ar[i].x, ar[i].y, ar[i + 1].x, ar[i + 1].y, Color);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   133
       inc(i)
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   134
       end
22
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   135
end;
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   136
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   137
procedure Vector(p1, p2, p3: TPoint; var Vx, Vy: hwFloat);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   138
var d1, d2, d: hwFloat;
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   139
begin
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   140
Vx:= int2hwFloat(p1.X - p3.X);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   141
Vy:= int2hwFloat(p1.Y - p3.Y);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   142
d:= DistanceI(p2.X - p1.X, p2.Y - p1.Y);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   143
d1:= DistanceI(p2.X - p3.X, p2.Y - p3.Y);
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   144
d2:= Distance(Vx, Vy);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   145
if d1 < d then d:= d1;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   146
if d2 < d then d:= d2;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   147
d:= d * _1div3;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   148
if d2.QWordValue = 0 then
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   149
   begin
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   150
   Vx:= _0;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   151
   Vy:= _0
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   152
   end else
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   153
   begin
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   154
   d2:= _1 / d2;
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   155
   Vx:= Vx * d2;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   156
   Vy:= Vy * d2;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   157
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   158
   Vx:= Vx * d;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   159
   Vy:= Vy * d
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   160
   end
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   161
end;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   162
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   163
procedure AddLoopPoints(var pa, opa: TPixAr; StartI, EndI: LongInt; Delta: hwFloat);
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   164
var i, pi, ni: LongInt;
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   165
    NVx, NVy, PVx, PVy: hwFloat;
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   166
    x1, x2, y1, y2: LongInt;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   167
    tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   168
    X, Y: LongInt;
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   169
begin
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   170
pi:= EndI;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   171
i:= StartI;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   172
ni:= Succ(StartI);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   173
Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   174
repeat
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   175
    inc(pi);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   176
    if pi > EndI then pi:= StartI;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   177
    inc(i);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   178
    if i > EndI then i:= StartI;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   179
    inc(ni);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   180
    if ni > EndI then ni:= StartI;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   181
    PVx:= NVx;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   182
    PVy:= NVy;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   183
    Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   184
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   185
    x1:= opa.ar[pi].x;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   186
    y1:= opa.ar[pi].y;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   187
    x2:= opa.ar[i].x;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   188
    y2:= opa.ar[i].y;
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   189
    cx1:= int2hwFloat(x1) - PVx;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   190
    cy1:= int2hwFloat(y1) - PVy;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   191
    cx2:= int2hwFloat(x2) + NVx;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   192
    cy2:= int2hwFloat(y2) + NVy;
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   193
    t:= _0;
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   194
    while t.Round = 0 do
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   195
          begin
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   196
          tsq:= t * t;
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   197
          tcb:= tsq * t;
498
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   198
          r1:= (_1 - t*3 + tsq*3 - tcb);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   199
          r2:= (     t*3 - tsq*6 + tcb*3);
9c8b385dc9a1 - Get rid of operator := to have GPC support
unc0rr
parents: 495
diff changeset
   200
          r3:= (           tsq*3 - tcb*3);
430
57d05fb13ea7 Small performance optimization
unc0rr
parents: 429
diff changeset
   201
          X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
57d05fb13ea7 Small performance optimization
unc0rr
parents: 429
diff changeset
   202
          Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   203
          t:= t + Delta;
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   204
          pa.ar[pa.Count].x:= X;
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   205
          pa.ar[pa.Count].y:= Y;
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   206
          inc(pa.Count);
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   207
          TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   208
          end;
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   209
until i = StartI;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   210
pa.ar[pa.Count].x:= opa.ar[StartI].X;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   211
pa.ar[pa.Count].y:= opa.ar[StartI].Y;
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   212
inc(pa.Count)
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   213
end;
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   214
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   215
procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
495
62c1c2b4414c - Fix most of the warnings in hwengine
unc0rr
parents: 431
diff changeset
   216
var i, StartLoop: LongInt;
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   217
    opa: TPixAr;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   218
begin
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   219
opa:= pa;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   220
pa.Count:= 0;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   221
i:= 0;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   222
StartLoop:= 0;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   223
while i < LongInt(opa.Count) do
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   224
    if (opa.ar[i + 1].X = NTPX) then
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   225
       begin
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   226
       AddLoopPoints(pa, opa, StartLoop, i, Delta);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   227
       inc(i, 2);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   228
       StartLoop:= i;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   229
       pa.ar[pa.Count].X:= NTPX;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   230
       inc(pa.Count);
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   231
       end else inc(i)
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   232
end;
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   233
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   234
procedure FillLand(x, y: LongInt);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   235
var Stack: record
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   236
           Count: Longword;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   237
           points: array[0..8192] of record
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   238
                                     xl, xr, y, dir: LongInt;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   239
                                     end
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   240
           end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   241
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   242
    procedure Push(_xl, _xr, _y, _dir: LongInt);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   243
    begin
75
d2b737858ff7 - New First Aid powerup
unc0rr
parents: 74
diff changeset
   244
    TryDo(Stack.Count <= 8192, 'FillLand: stack overflow', true);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   245
    _y:= _y + _dir;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   246
    if (_y < 0) or (_y > 1023) then exit;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   247
    with Stack.points[Stack.Count] do
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   248
         begin
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   249
         xl:= _xl;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   250
         xr:= _xr;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   251
         y:= _y;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   252
         dir:= _dir
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   253
         end;
75
d2b737858ff7 - New First Aid powerup
unc0rr
parents: 74
diff changeset
   254
    inc(Stack.Count)
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   255
    end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   256
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   257
    procedure Pop(var _xl, _xr, _y, _dir: LongInt);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   258
    begin
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   259
    dec(Stack.Count);
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   260
    with Stack.points[Stack.Count] do
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   261
         begin
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   262
         _xl:= xl;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   263
         _xr:= xr;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   264
         _y:= y;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   265
         _dir:= dir
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   266
         end
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   267
    end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   268
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   269
var xl, xr, dir: LongInt;
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
   270
begin
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   271
Stack.Count:= 0;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   272
xl:= x - 1;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   273
xr:= x;
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   274
Push(xl, xr, y, -1);
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   275
Push(xl, xr, y,  1);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   276
while Stack.Count > 0 do
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   277
      begin
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   278
      Pop(xl, xr, y, dir);
51
b6e3ae05857f - Get rid of hwserv and runhelper
unc0rr
parents: 37
diff changeset
   279
      while (xl > 0) and (Land[y, xl] <> 0) do dec(xl);
b6e3ae05857f - Get rid of hwserv and runhelper
unc0rr
parents: 37
diff changeset
   280
      while (xr < 2047) and (Land[y, xr] <> 0) do inc(xr);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   281
      while (xl < xr) do
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   282
            begin
51
b6e3ae05857f - Get rid of hwserv and runhelper
unc0rr
parents: 37
diff changeset
   283
            while (xl <= xr) and (Land[y, xl] = 0) do inc(xl);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   284
            x:= xl;
51
b6e3ae05857f - Get rid of hwserv and runhelper
unc0rr
parents: 37
diff changeset
   285
            while (xl <= xr) and (Land[y, xl] <> 0) do
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   286
                  begin
51
b6e3ae05857f - Get rid of hwserv and runhelper
unc0rr
parents: 37
diff changeset
   287
                  Land[y, xl]:= 0;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   288
                  inc(xl)
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   289
                  end;
22
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   290
            if x < xl then
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   291
               begin
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   292
               Push(x, Pred(xl), y, dir);
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   293
               Push(x, Pred(xl), y,-dir);
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   294
               end;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   295
            end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   296
      end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   297
end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   298
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   299
procedure ColorizeLand(Surface: PSDL_Surface);
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   300
var tmpsurf: PSDL_Surface;
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   301
    r, rr: TSDL_Rect;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   302
    x, yd, yu: LongInt;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   303
begin
567
b6de36975a3c Small fixes
unc0rr
parents: 566
diff changeset
   304
tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/LandTex', false, true, false);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   305
r.y:= 0;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   306
while r.y < 1024 do
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   307
	begin
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   308
	r.x:= 0;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   309
	while r.x < 2048 do
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   310
		begin
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   311
		SDL_UpperBlit(tmpsurf, nil, Surface, @r);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   312
		inc(r.x, tmpsurf^.w)
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   313
		end;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   314
	inc(r.y, tmpsurf^.h)
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   315
	end;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   316
SDL_FreeSurface(tmpsurf);
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   317
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
   318
tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/Border', false, true, true);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   319
for x:= 0 to 2047 do
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   320
	begin
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   321
	yd:= 1023;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   322
	repeat
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   323
		while (yd > 0   ) and (Land[yd, x] =  0) do dec(yd);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   324
		
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   325
		if (yd < 0) then yd:= 0;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   326
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   327
		while (yd < 1024) and (Land[yd, x] <> 0) do inc(yd);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   328
		dec(yd);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   329
		yu:= yd;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   330
		
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   331
		while (yu > 0  ) and (Land[yu, x] <> 0) do dec(yu);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   332
		while (yu < yd ) and (Land[yu, x] =  0) do inc(yu);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   333
		
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   334
		if (yd < 1023) and ((yd - yu) >= 16) then
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   335
			begin
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   336
			rr.x:= x;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   337
			rr.y:= yd - 15;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   338
			r.x:= x mod tmpsurf^.w;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   339
			r.y:= 16;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   340
			r.w:= 1;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   341
			r.h:= 16;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   342
			SDL_UpperBlit(tmpsurf, @r, Surface, @rr);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   343
			end;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   344
		if (yu > 0) then
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   345
			begin
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   346
			rr.x:= x;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   347
			rr.y:= yu;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   348
			r.x:= x mod tmpsurf^.w;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   349
			r.y:= 0;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   350
			r.w:= 1;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   351
			r.h:= min(16, yd - yu + 1);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   352
			SDL_UpperBlit(tmpsurf, @r, Surface, @rr);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   353
			end;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   354
		yd:= yu - 1;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   355
	until yd < 0;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   356
	end;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   357
end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   358
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   359
procedure SetPoints(var Template: TEdgeTemplate; var pa: TPixAr);
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   360
var i: LongInt;
22
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   361
begin
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   362
with Template do
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   363
     begin
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   364
     pa.Count:= BasePointsCount;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   365
     for i:= 0 to pred(pa.Count) do
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   366
         begin
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   367
         pa.ar[i].x:= BasePoints^[i].x + LongInt(GetRandom(BasePoints^[i].w));
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   368
         pa.ar[i].y:= BasePoints^[i].y + LongInt(GetRandom(BasePoints^[i].h))
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   369
         end;
1183
540cea859395 Step 4: repair girder rendering (girder is 32bit now)
unc0rr
parents: 1182
diff changeset
   370
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   371
     if canMirror then
360
ab6a94334d6d - Two more templates
unc0rr
parents: 359
diff changeset
   372
        if getrandom(2) = 0 then
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   373
           begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   374
           for i:= 0 to pred(BasePointsCount) do
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   375
             if pa.ar[i].x <> NTPX then
360
ab6a94334d6d - Two more templates
unc0rr
parents: 359
diff changeset
   376
               pa.ar[i].x:= 2047 - pa.ar[i].x;
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   377
           for i:= 0 to pred(FillPointsCount) do
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   378
               FillPoints^[i].x:= 2047 - FillPoints^[i].x;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   379
           end;
22
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   380
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   381
     if canFlip then
360
ab6a94334d6d - Two more templates
unc0rr
parents: 359
diff changeset
   382
        if getrandom(2) = 0 then
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   383
           begin
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   384
           for i:= 0 to pred(BasePointsCount) do
360
ab6a94334d6d - Two more templates
unc0rr
parents: 359
diff changeset
   385
               pa.ar[i].y:= 1023 - pa.ar[i].y;
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   386
           for i:= 0 to pred(FillPointsCount) do
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   387
               FillPoints^[i].y:= 1023 - FillPoints^[i].y;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   388
           end;
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   389
     end
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   390
end;
67
3101306251e5 - 2 more Land templates
unc0rr
parents: 64
diff changeset
   391
561
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   392
function CheckIntersect(V1, V2, V3, V4: TPoint): boolean;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   393
var c1, c2, dm: LongInt;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   394
begin
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   395
dm:= (V4.y - V3.y) * (V2.x - V1.x) - (V4.x - V3.x) * (V2.y - V1.y);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   396
c1:= (V4.x - V3.x) * (V1.y - V3.y) - (V4.y - V3.y) * (V1.x - V3.x);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   397
if dm = 0 then exit(false);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   398
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   399
c2:= (V2.x - V3.x) * (V1.y - V3.y) - (V2.y - V3.y) * (V1.x - V3.x);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   400
if dm > 0 then
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   401
   begin
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   402
   if (c1 < 0) or (c1 > dm) then exit(false);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   403
   if (c2 < 0) or (c2 > dm) then exit(false)
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   404
   end else
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   405
   begin
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   406
   if (c1 > 0) or (c1 < dm) then exit(false);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   407
   if (c2 > 0) or (c2 < dm) then exit(false)
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   408
   end;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   409
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   410
//AddFileLog('1  (' + inttostr(V1.x) + ',' + inttostr(V1.y) + ')x(' + inttostr(V2.x) + ',' + inttostr(V2.y) + ')');
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   411
//AddFileLog('2  (' + inttostr(V3.x) + ',' + inttostr(V3.y) + ')x(' + inttostr(V4.x) + ',' + inttostr(V4.y) + ')');
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   412
CheckIntersect:= true
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   413
end;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   414
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   415
function CheckSelfIntersect(var pa: TPixAr; ind: Longword): boolean;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   416
var i: Longword;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   417
begin
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   418
if (ind <= 0) or (ind >= Pred(pa.Count)) then exit(false);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   419
for i:= 1 to pa.Count - 3 do
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   420
    if (i <= ind - 1) or (i >= ind + 2) then
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   421
      begin
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   422
      if (i <> ind - 1) and
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   423
         CheckIntersect(pa.ar[ind], pa.ar[ind - 1], pa.ar[i], pa.ar[i - 1]) then exit(true);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   424
      if (i <> ind + 2) and
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   425
         CheckIntersect(pa.ar[ind], pa.ar[ind + 1], pa.ar[i], pa.ar[i - 1]) then exit(true);
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   426
      end;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   427
CheckSelfIntersect:= false
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   428
end;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   429
429
7f69c7ac2e97 One more land template + some templates tuning
unc0rr
parents: 393
diff changeset
   430
procedure RandomizePoints(var pa: TPixAr);
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   431
const cEdge = 55;
561
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   432
      cMinDist = 8;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   433
var radz: array[0..Pred(cMaxEdgePoints)] of LongInt;
561
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   434
    i, k, dist, px, py: LongInt;
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   435
begin
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   436
radz[0]:= 0;
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   437
for i:= 0 to Pred(pa.Count) do
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   438
  with pa.ar[i] do
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   439
    if x <> NTPX then
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   440
      begin
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   441
      radz[i]:= Min(Max(x - cEdge, 0), Max(2048 - cEdge - x, 0));
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   442
      radz[i]:= Min(radz[i], Min(Max(y - cEdge, 0), Max(1024 - cEdge - y, 0)));
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   443
      if radz[i] > 0 then
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   444
        for k:= 0 to Pred(i) do
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   445
          begin
429
7f69c7ac2e97 One more land template + some templates tuning
unc0rr
parents: 393
diff changeset
   446
          dist:= Max(abs(x - pa.ar[k].x), abs(y - pa.ar[k].y));
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   447
          radz[k]:= Max(0, Min((dist - cMinDist) div 2, radz[k]));
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   448
          radz[i]:= Max(0, Min(dist - radz[k] - cMinDist, radz[i]))
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   449
        end
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   450
      end;
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   451
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   452
for i:= 0 to Pred(pa.Count) do
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   453
  with pa.ar[i] do
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   454
    if ((x and $FFFFF800) = 0) and ((y and $FFFFFC00) = 0) then
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   455
      begin
561
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   456
      px:= x;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   457
      py:= y;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   458
      x:= x + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3;
561
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   459
      y:= y + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   460
      if CheckSelfIntersect(pa, i) then
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   461
         begin
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   462
         x:= px;
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   463
         y:= py
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   464
         end;
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   465
      end
67
3101306251e5 - 2 more Land templates
unc0rr
parents: 64
diff changeset
   466
end;
3101306251e5 - 2 more Land templates
unc0rr
parents: 64
diff changeset
   467
364
52cb4d6f84b7 - Better land generator
unc0rr
parents: 360
diff changeset
   468
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   469
procedure GenBlank(var Template: TEdgeTemplate);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   470
var pa: TPixAr;
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   471
    i: Longword;
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   472
    y, x: Longword;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   473
begin
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   474
for y:= 0 to 1023 do
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   475
    for x:= 0 to 2047 do
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   476
        Land[y, x]:= COLOR_LAND;
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   477
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   478
SetPoints(Template, pa);
429
7f69c7ac2e97 One more land template + some templates tuning
unc0rr
parents: 393
diff changeset
   479
for i:= 1 to Template.BezierizeCount do
7f69c7ac2e97 One more land template + some templates tuning
unc0rr
parents: 393
diff changeset
   480
    begin
431
79ac59673df3 - Two more land templates
unc0rr
parents: 430
diff changeset
   481
    BezierizeEdge(pa, _0_5);
561
19d2d422ff84 Improve land generator
unc0rr
parents: 547
diff changeset
   482
    RandomizePoints(pa);
429
7f69c7ac2e97 One more land template + some templates tuning
unc0rr
parents: 393
diff changeset
   483
    RandomizePoints(pa)
7f69c7ac2e97 One more land template + some templates tuning
unc0rr
parents: 393
diff changeset
   484
    end;
7f69c7ac2e97 One more land template + some templates tuning
unc0rr
parents: 393
diff changeset
   485
for i:= 1 to Template.RandPassesCount do RandomizePoints(pa);
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   486
BezierizeEdge(pa, _0_1);
27
c374fe590272 - improve land generation
unc0rr
parents: 24
diff changeset
   487
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   488
DrawEdge(pa, 0);
27
c374fe590272 - improve land generation
unc0rr
parents: 24
diff changeset
   489
358
236bbd12d4d9 - New Land Generator
unc0rr
parents: 351
diff changeset
   490
with Template do
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   491
     for i:= 0 to pred(FillPointsCount) do
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   492
         with FillPoints^[i] do
89
f9db56409a86 - Fix various bugs
unc0rr
parents: 80
diff changeset
   493
              FillLand(x, y);
f9db56409a86 - Fix various bugs
unc0rr
parents: 80
diff changeset
   494
365
a26cec847dd7 - New land generator feature: islands in the sky
unc0rr
parents: 364
diff changeset
   495
DrawEdge(pa, COLOR_LAND)
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   496
end;
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   497
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   498
function SelectTemplate: LongInt;
161
d8870bbf960e - AmmoMenu
unc0rr
parents: 160
diff changeset
   499
begin
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
   500
SelectTemplate:= getrandom(Succ(High(EdgeTemplates)))
161
d8870bbf960e - AmmoMenu
unc0rr
parents: 160
diff changeset
   501
end;
d8870bbf960e - AmmoMenu
unc0rr
parents: 160
diff changeset
   502
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   503
procedure LandSurface2LandPixels(Surface: PSDL_Surface);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   504
var x, y: LongInt;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   505
	p: PLongwordArray;
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   506
begin
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   507
TryDo(Surface <> nil, 'Assert (LandSurface <> nil) failed', true);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   508
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   509
if SDL_MustLock(Surface) then
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   510
	SDLTry(SDL_LockSurface(Surface) >= 0, true);
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   511
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   512
p:= Surface^.pixels;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   513
for y:= 0 to 1023 do
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   514
	begin
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   515
	for x:= 0 to 2047 do
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   516
		if Land[y, x] <> 0 then LandPixels[y, x]:= p^[x] or $FF000000;
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   517
	p:= @(p^[Surface^.pitch div 4]);
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   518
	end;
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   519
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   520
if SDL_MustLock(Surface) then
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   521
	SDL_UnlockSurface(Surface)
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   522
end;
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   523
23
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   524
procedure GenLandSurface;
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   525
var tmpsurf: PSDL_Surface;
16322d14f068 - Land generator uses templates to generate
unc0rr
parents: 22
diff changeset
   526
begin
53
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   527
WriteLnToConsole('Generating land...');
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   528
161
d8870bbf960e - AmmoMenu
unc0rr
parents: 160
diff changeset
   529
GenBlank(EdgeTemplates[SelectTemplate]);
22
517be8dc5b76 - Fixed spawning boxes under water
unc0rr
parents: 10
diff changeset
   530
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   531
AddProgress;
754
94ac14829085 Some further work on switching to OpenGL rendering
unc0rr
parents: 753
diff changeset
   532
758
bebfae2063b3 - Start conveting pngs to have alpha-channel
unc0rr
parents: 757
diff changeset
   533
tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, 2048, 1024, 32, RMask, GMask, BMask, 0);
754
94ac14829085 Some further work on switching to OpenGL rendering
unc0rr
parents: 753
diff changeset
   534
67
3101306251e5 - 2 more Land templates
unc0rr
parents: 64
diff changeset
   535
TryDo(tmpsurf <> nil, 'Error creating pre-land surface', true);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   536
ColorizeLand(tmpsurf);
1190
73ec31d8bb6f Enable back rendering objects that are put on top of land texture
unc0rr
parents: 1183
diff changeset
   537
AddOnLandObjects(tmpsurf);
754
94ac14829085 Some further work on switching to OpenGL rendering
unc0rr
parents: 753
diff changeset
   538
1182
e2e13aa055c1 Step 3: Maps are rendered correctly, but without objects yet
unc0rr
parents: 1181
diff changeset
   539
LandSurface2LandPixels(tmpsurf);
70
82d93eeecebe - Many AI improvements
unc0rr
parents: 67
diff changeset
   540
SDL_FreeSurface(tmpsurf);
24
79c411363184 Add theme objects to land
unc0rr
parents: 23
diff changeset
   541
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   542
AddProgress;
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   543
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   544
AddObjects;
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   545
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   546
UpdateLandTexture(0, 1023);
70
82d93eeecebe - Many AI improvements
unc0rr
parents: 67
diff changeset
   547
AddProgress
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   548
end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   549
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   550
procedure MakeFortsMap;
547
b81a055f2d06 Convert teams list to array
unc0rr
parents: 498
diff changeset
   551
var tmpsurf: PSDL_Surface;
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   552
begin
53
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   553
WriteLnToConsole('Generating forts land...');
955
474afaab0365 Fix forts mode to take in account clans, not teams
unc0rr
parents: 883
diff changeset
   554
TryDo(ClansCount = 2, 'More or less than 2 clans on map in forts mode!', true);
547
b81a055f2d06 Convert teams list to array
unc0rr
parents: 498
diff changeset
   555
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   556
tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[0]^.Teams[0]^.FortName + 'L', true, true, true);
1183
540cea859395 Step 4: repair girder rendering (girder is 32bit now)
unc0rr
parents: 1182
diff changeset
   557
BlitImageAndGenerateCollisionInfo(0, 0, 1024, tmpsurf);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   558
SDL_FreeSurface(tmpsurf);
547
b81a055f2d06 Convert teams list to array
unc0rr
parents: 498
diff changeset
   559
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   560
tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[0]^.Teams[0]^.FortName + 'R', true, true, true);
1183
540cea859395 Step 4: repair girder rendering (girder is 32bit now)
unc0rr
parents: 1182
diff changeset
   561
BlitImageAndGenerateCollisionInfo(1024, 0, 1024, tmpsurf);
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   562
SDL_FreeSurface(tmpsurf);
754
94ac14829085 Some further work on switching to OpenGL rendering
unc0rr
parents: 753
diff changeset
   563
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   564
UpdateLandTexture(0, 1023)
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   565
end;
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   566
53
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   567
procedure LoadMap;
1292
a63a13eda583 Bot could use firepunch if it doesn't find anything else useful, and it has land above his head
unc0rr
parents: 1190
diff changeset
   568
var tmpsurf: PSDL_Surface;
53
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   569
begin
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   570
WriteLnToConsole('Loading land from file...');
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   571
AddProgress;
1181
3ae244bffef9 Step 2: painted maps loading correctly
unc0rr
parents: 1180
diff changeset
   572
tmpsurf:= LoadImage(Pathz[ptMapCurrent] + '/map', true, true, true);
3ae244bffef9 Step 2: painted maps loading correctly
unc0rr
parents: 1180
diff changeset
   573
TryDo((tmpsurf^.w = 2048) and (tmpsurf^.h = 1024), 'Map dimensions should be 2048x1024!', true);
53
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   574
1181
3ae244bffef9 Step 2: painted maps loading correctly
unc0rr
parents: 1180
diff changeset
   575
TryDo(tmpsurf^.format^.BytesPerPixel = 4, 'Map should be 32bit', true);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
   576
1183
540cea859395 Step 4: repair girder rendering (girder is 32bit now)
unc0rr
parents: 1182
diff changeset
   577
BlitImageAndGenerateCollisionInfo(0, 0, 2048, tmpsurf);
1181
3ae244bffef9 Step 2: painted maps loading correctly
unc0rr
parents: 1180
diff changeset
   578
SDL_FreeSurface(tmpsurf);
754
94ac14829085 Some further work on switching to OpenGL rendering
unc0rr
parents: 753
diff changeset
   579
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   580
UpdateLandTexture(0, 1023)
53
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   581
end;
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   582
37
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
   583
procedure GenMap;
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
   584
begin
1085
0b82870073b5 Load flakes information from theme.cfg when playing painted map
unc0rr
parents: 1066
diff changeset
   585
LoadThemeConfig;
0b82870073b5 Load flakes information from theme.cfg when playing painted map
unc0rr
parents: 1066
diff changeset
   586
53
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   587
if (GameFlags and gfForts) = 0 then
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   588
   if Pathz[ptMapCurrent] <> '' then LoadMap
0e27949850e3 - Fixed bubble theme object
unc0rr
parents: 51
diff changeset
   589
                                else GenLandSurface
37
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
   590
                               else MakeFortsMap;
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
   591
AddProgress;
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
   592
{$IFDEF DEBUGFILE}LogLandDigest{$ENDIF}
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
   593
end;
2b7f2a43b999 - Properly get seed in net game
unc0rr
parents: 35
diff changeset
   594
566
1c1cb593cb81 Save some memory
unc0rr
parents: 561
diff changeset
   595
function GenPreview: TPreview;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 368
diff changeset
   596
var x, y, xx, yy, t, bit: LongInt;
566
1c1cb593cb81 Save some memory
unc0rr
parents: 561
diff changeset
   597
    Preview: TPreview;
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   598
begin
160
207f520b9e83 Soma small fixes + new land template
unc0rr
parents: 155
diff changeset
   599
WriteLnToConsole('Generating preview...');
161
d8870bbf960e - AmmoMenu
unc0rr
parents: 160
diff changeset
   600
GenBlank(EdgeTemplates[SelectTemplate]);
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   601
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   602
for y:= 0 to 127 do
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   603
    for x:= 0 to 31 do
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   604
        begin
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   605
        Preview[y, x]:= 0;
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   606
        for bit:= 0 to 7 do
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   607
            begin
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   608
            t:= 0;
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   609
            for yy:= y * 8 to y * 8 + 7 do
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   610
                for xx:= x * 64 + bit * 8 to x * 64 + bit * 8 + 7 do
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   611
                    if Land[yy, xx] <> 0 then inc(t);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 316
diff changeset
   612
            if t > 8 then Preview[y, x]:= Preview[y, x] or ($80 shr bit)
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   613
            end
566
1c1cb593cb81 Save some memory
unc0rr
parents: 561
diff changeset
   614
        end;
1c1cb593cb81 Save some memory
unc0rr
parents: 561
diff changeset
   615
GenPreview:= Preview
155
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   616
end;
401f4ea24715 Engine can generate land preview and send it via IPC
unc0rr
parents: 109
diff changeset
   617
767
697728ffe39f Introduce UpdateLandTexture function to update just parts of surface
unc0rr
parents: 766
diff changeset
   618
procedure UpdateLandTexture(Y, Height: LongInt);
766
cdc8f75ab7bc - Update land texture after explosions
unc0rr
parents: 760
diff changeset
   619
begin
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   620
if (Height <= 0) then exit;
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   621
TryDo((Y >= 0) and (Y < 1024), 'UpdateLandTexture: wrong Y parameter', true);
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   622
TryDo(Y + Height < 1024, 'UpdateLandTexture: wrong Height parameter', true);
768
2886dafa5bcf Store Land surface in memory:
unc0rr
parents: 767
diff changeset
   623
1180
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   624
if LandTexture = nil then
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   625
	LandTexture:= NewTexture(2048, 1024, @LandPixels)
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   626
else
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   627
	begin
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   628
	glBindTexture(GL_TEXTURE_2D, LandTexture^.id);
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   629
	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, Y, 2048, Height, GL_RGBA, GL_UNSIGNED_BYTE, @LandPixels[Y, 0]);
e56317fdf78d Start implementing support for 32bit sprites concerned in map generation process.
unc0rr
parents: 1085
diff changeset
   630
	end
766
cdc8f75ab7bc - Update land texture after explosions
unc0rr
parents: 760
diff changeset
   631
end;
cdc8f75ab7bc - Update land texture after explosions
unc0rr
parents: 760
diff changeset
   632
51
b6e3ae05857f - Get rid of hwserv and runhelper
unc0rr
parents: 37
diff changeset
   633
initialization
b6e3ae05857f - Get rid of hwserv and runhelper
unc0rr
parents: 37
diff changeset
   634
4
bcbd7adb4e4b - set svn:eol-style to native
unc0rr
parents: 1
diff changeset
   635
end.