hedgewars/uLandPainted.pas
author alfadur
Sun, 16 Jun 2019 19:16:26 +0300
changeset 15168 bcb98009ad39
parent 15162 490bd70dac6e
child 15245 4195d2852974
permissions -rw-r--r--
avoid allocation in hash comparison
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     1
(*
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     2
 * Hedgewars, a free turn based strategy game
11046
47a8c19ecb60 more copyright fixes
sheepluva
parents: 10246
diff changeset
     3
 * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     4
 *
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     8
 *
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    12
 * GNU General Public License for more details.
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    13
 *
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
10108
c68cf030eded update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents: 10015
diff changeset
    16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    17
 *)
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    18
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    19
{$INCLUDE "options.inc"}
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    20
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    21
unit uLandPainted;
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    22
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    23
interface
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    24
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    25
procedure Draw;
4490
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
    26
procedure initModule;
5066
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
    27
procedure freeModule;
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    28
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    29
implementation
10246
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
    30
uses uLandGraphics, uConsts, uVariables, uUtils, SDLh, uCommands, uScript, uIO;
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    31
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    32
type PointRec = packed record
4458
7351e6f1ee28 Halfplement decode/drawing routine
unc0rr
parents: 4457
diff changeset
    33
    X, Y: SmallInt;
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    34
    flags: byte;
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    35
    end;
10131
4b4a043111f4 - pas2c recognizes typecasts in initialization expressions
unc0rr
parents: 10108
diff changeset
    36
    PPointRec = ^PointRec;
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
    37
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    38
type
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    39
    PPointEntry = ^PointEntry;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    40
    PointEntry = record
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    41
        point: PointRec;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    42
        next: PPointEntry;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    43
        end;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    44
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    45
var pointsListHead, pointsListLast: PPointEntry;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    46
4490
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
    47
procedure chDraw(var s: shortstring);
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    48
var rec: PointRec;
10131
4b4a043111f4 - pas2c recognizes typecasts in initialization expressions
unc0rr
parents: 10108
diff changeset
    49
    prec: PPointRec;
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    50
    pe: PPointEntry;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    51
    i, l: byte;
4490
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
    52
begin
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    53
    i:= 1;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    54
    l:= length(s);
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    55
    while i < l do
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    56
        begin
10131
4b4a043111f4 - pas2c recognizes typecasts in initialization expressions
unc0rr
parents: 10108
diff changeset
    57
        prec:= PPointRec(@s[i]);
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    58
        rec:= prec^;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    59
        rec.X:= SDLNet_Read16(@rec.X);
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    60
        rec.Y:= SDLNet_Read16(@rec.Y);
14421
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
    61
		
7287
nemo
parents: 7277
diff changeset
    62
        if rec.X < -318 then rec.X:= -318;
7583
8a9edc7cf98f drawn maps have a fixed 4096x2048 area right now
nemo
parents: 7287
diff changeset
    63
        if rec.X > 4096+318 then rec.X:= 4096+318;
7287
nemo
parents: 7277
diff changeset
    64
        if rec.Y < -318 then rec.Y:= -318;
7583
8a9edc7cf98f drawn maps have a fixed 4096x2048 area right now
nemo
parents: 7287
diff changeset
    65
        if rec.Y > 2048+318 then rec.Y:= 2048+318;
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    66
7043
7c080e5ac8d0 Some work to make more units compile after conversion to c
unc0rr
parents: 6898
diff changeset
    67
        new(pe);
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    68
        if pointsListLast = nil then
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    69
            pointsListHead:= pe
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    70
        else
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    71
            pointsListLast^.next:= pe;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    72
        pointsListLast:= pe;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    73
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    74
        pe^.point:= rec;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    75
        pe^.next:= nil;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    76
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    77
        inc(i, 5)
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    78
        end;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    79
end;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    80
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    81
procedure Draw;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    82
var pe: PPointEntry;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    83
    prevPoint: PointRec;
6781
23f627ba8ee9 Variable pen width
unc0rr
parents: 6700
diff changeset
    84
    radius: LongInt;
14421
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
    85
    color, Xoffset, Yoffset: Longword;
10246
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
    86
    lineNumber, linePoints: Longword;
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    87
begin
4648
d8e1b43482d2 - Remove loading from file procedure
unc0rr
parents: 4494
diff changeset
    88
    // shutup compiler
d8e1b43482d2 - Remove loading from file procedure
unc0rr
parents: 4494
diff changeset
    89
    prevPoint.X:= 0;
d8e1b43482d2 - Remove loading from file procedure
unc0rr
parents: 4494
diff changeset
    90
    prevPoint.Y:= 0;
6781
23f627ba8ee9 Variable pen width
unc0rr
parents: 6700
diff changeset
    91
    radius:= 0;
10246
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
    92
    linePoints:= 0;
14421
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
    93
 	Xoffset:= (LAND_WIDTH-(4096*max(min(cFeatureSize,24),3) div 12)) div 2;
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
    94
 	Yoffset:= (LAND_HEIGHT-(2048*max(min(cFeatureSize,24),3) div 12));
4648
d8e1b43482d2 - Remove loading from file procedure
unc0rr
parents: 4494
diff changeset
    95
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
    96
    pe:= pointsListHead;
9472
265e5997580e Incomplete implementation of 'special points' in drawn maps (crashes engine)
unc0rr
parents: 9080
diff changeset
    97
    while (pe <> nil) and (pe^.point.flags and $80 = 0) do
265e5997580e Incomplete implementation of 'special points' in drawn maps (crashes engine)
unc0rr
parents: 9080
diff changeset
    98
        begin
265e5997580e Incomplete implementation of 'special points' in drawn maps (crashes engine)
unc0rr
parents: 9080
diff changeset
    99
        ScriptCall('onSpecialPoint', pe^.point.X, pe^.point.Y, pe^.point.flags);
265e5997580e Incomplete implementation of 'special points' in drawn maps (crashes engine)
unc0rr
parents: 9080
diff changeset
   100
        pe:= pe^.next;
265e5997580e Incomplete implementation of 'special points' in drawn maps (crashes engine)
unc0rr
parents: 9080
diff changeset
   101
        end;
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   102
10246
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   103
    lineNumber:= 0;
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   104
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   105
    while(pe <> nil) do
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   106
        begin
14421
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
   107
		pe^.point.X:= (LongInt(pe^.point.X) * max(min(cFeatureSize,24),3)) div 12 + Xoffset;
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
   108
		pe^.point.Y:= (LongInt(pe^.point.Y) * max(min(cFeatureSize,24),3)) div 12 + Yoffset;
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   109
        if (pe^.point.flags and $80 <> 0) then
4649
82bf0a0fa8b0 Add logging of map drawing process
unc0rr
parents: 4648
diff changeset
   110
            begin
10246
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   111
            if (lineNumber > 0) and (linePoints = 0) and cAdvancedMapGenMode then
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   112
                    SendIPC('|' + inttostr(lineNumber - 1));
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   113
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   114
            inc(lineNumber);
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   115
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   116
            if (pe^.point.flags and $40 <> 0) then
6873
30840365af0a Eraser tool
unc0rr
parents: 6781
diff changeset
   117
                color:= 0
30840365af0a Eraser tool
unc0rr
parents: 6781
diff changeset
   118
                else
30840365af0a Eraser tool
unc0rr
parents: 6781
diff changeset
   119
                color:= lfBasic;
30840365af0a Eraser tool
unc0rr
parents: 6781
diff changeset
   120
            radius:= (pe^.point.flags and $3F) * 5 + 3;
14421
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
   121
			radius:= (radius * max(min(cFeatureSize,24),3)) div 12;
10246
8da91cd7a32a Inform frontend of lines which didn't change anything on the map in advanced drawn maps mode
unc0rr
parents: 10244
diff changeset
   122
            linePoints:= FillRoundInLand(pe^.point.X, pe^.point.Y, radius, color);
4649
82bf0a0fa8b0 Add logging of map drawing process
unc0rr
parents: 4648
diff changeset
   123
            end
14421
96624a6cdb93 Allow scaling hand drawn maps
nemo
parents: 11046
diff changeset
   124
		else
4649
82bf0a0fa8b0 Add logging of map drawing process
unc0rr
parents: 4648
diff changeset
   125
            begin
10244
f7b5b4b88171 Count number of pixels changed during draw
unc0rr
parents: 10243
diff changeset
   126
            inc(linePoints, DrawThickLine(prevPoint.X, prevPoint.Y, pe^.point.X, pe^.point.Y, radius, color));
4649
82bf0a0fa8b0 Add logging of map drawing process
unc0rr
parents: 4648
diff changeset
   127
            end;
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   128
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   129
        prevPoint:= pe^.point;
9472
265e5997580e Incomplete implementation of 'special points' in drawn maps (crashes engine)
unc0rr
parents: 9080
diff changeset
   130
        pe:= pe^.next;
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   131
        end;
15146
af14c418c92f Drawn maps: Erase land outside of land bounds
Wuzzy <Wuzzy2@mail.ru>
parents: 14421
diff changeset
   132
af14c418c92f Drawn maps: Erase land outside of land bounds
Wuzzy <Wuzzy2@mail.ru>
parents: 14421
diff changeset
   133
    if (topY > 0) then
15162
490bd70dac6e Drawn maps: Fix off-by-one errors in land erasing code
Wuzzy <Wuzzy2@mail.ru>
parents: 15146
diff changeset
   134
        EraseLandRectRaw(0, 0, LAND_WIDTH, topY);
15146
af14c418c92f Drawn maps: Erase land outside of land bounds
Wuzzy <Wuzzy2@mail.ru>
parents: 14421
diff changeset
   135
    if (leftX > 0) then
15162
490bd70dac6e Drawn maps: Fix off-by-one errors in land erasing code
Wuzzy <Wuzzy2@mail.ru>
parents: 15146
diff changeset
   136
        EraseLandRectRaw(0, topY, leftX, LAND_HEIGHT - topY);
15146
af14c418c92f Drawn maps: Erase land outside of land bounds
Wuzzy <Wuzzy2@mail.ru>
parents: 14421
diff changeset
   137
    if (rightX < (LAND_WIDTH - 1)) then
af14c418c92f Drawn maps: Erase land outside of land bounds
Wuzzy <Wuzzy2@mail.ru>
parents: 14421
diff changeset
   138
        EraseLandRectRaw(rightX + 1, topY, LAND_WIDTH - (rightX + 1), LAND_HEIGHT - topY);
4490
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
   139
end;
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
   140
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
   141
procedure initModule;
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
   142
begin
4494
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   143
    pointsListHead:= nil;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   144
    pointsListLast:= nil;
9585435e20f7 Pass hardcoded drawn map from frontend into engine \o/
unc0rr
parents: 4490
diff changeset
   145
6898
344b0dbd9690 - Remove support for variables in command handlers
unc0rr
parents: 6873
diff changeset
   146
    RegisterVariable('draw', @chDraw, false);
4490
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
   147
end;
f6840f7e2f60 Stub to recieve /draw command
unc0rr
parents: 4458
diff changeset
   148
5066
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   149
procedure freeModule;
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   150
var pe, pp: PPointEntry;
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   151
begin
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   152
    pe:= pointsListHead;
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   153
    while(pe <> nil) do
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   154
        begin
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   155
        pp:= pe;
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   156
        pe:= pe^.next;
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   157
        dispose(pp);
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   158
        end;
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   159
end;
d2684b6f02ce fix leaking of hand-drawn maps
sheepluva
parents: 4976
diff changeset
   160
4457
ffb766e85150 - Change painted map file format
unc0rr
parents:
diff changeset
   161
end.