23 interface |
23 interface |
24 |
24 |
25 procedure LoadFromFile(fileName: shortstring); |
25 procedure LoadFromFile(fileName: shortstring); |
26 |
26 |
27 implementation |
27 implementation |
|
28 uses uLandGraphics, uConsts, uUtils, SDLh; |
28 |
29 |
29 type PointRec = packed record |
30 type PointRec = packed record |
30 x, y: ShortInt; |
31 X, Y: SmallInt; |
31 flags: byte; |
32 flags: byte; |
32 end; |
33 end; |
|
34 |
|
35 procedure DrawLineOnLand(X1, Y1, X2, Y2: LongInt); |
|
36 var eX, eY, dX, dY: LongInt; |
|
37 i, sX, sY, x, y, d: LongInt; |
|
38 b: boolean; |
|
39 len: LongWord; |
|
40 begin |
|
41 len:= 0; |
|
42 if (X1 = X2) and (Y1 = Y2) then |
|
43 begin |
|
44 exit |
|
45 end; |
|
46 eX:= 0; |
|
47 eY:= 0; |
|
48 dX:= X2 - X1; |
|
49 dY:= Y2 - Y1; |
|
50 |
|
51 if (dX > 0) then sX:= 1 |
|
52 else |
|
53 if (dX < 0) then |
|
54 begin |
|
55 sX:= -1; |
|
56 dX:= -dX |
|
57 end else sX:= dX; |
|
58 |
|
59 if (dY > 0) then sY:= 1 |
|
60 else |
|
61 if (dY < 0) then |
|
62 begin |
|
63 sY:= -1; |
|
64 dY:= -dY |
|
65 end else sY:= dY; |
|
66 |
|
67 if (dX > dY) then d:= dX |
|
68 else d:= dY; |
|
69 |
|
70 x:= X1; |
|
71 y:= Y1; |
|
72 |
|
73 for i:= 0 to d do |
|
74 begin |
|
75 inc(eX, dX); |
|
76 inc(eY, dY); |
|
77 b:= false; |
|
78 if (eX > d) then |
|
79 begin |
|
80 dec(eX, d); |
|
81 inc(x, sX); |
|
82 b:= true |
|
83 end; |
|
84 if (eY > d) then |
|
85 begin |
|
86 dec(eY, d); |
|
87 inc(y, sY); |
|
88 b:= true |
|
89 end; |
|
90 if b then |
|
91 begin |
|
92 inc(len); |
|
93 if (len mod 4) = 0 then FillRoundInLand(X, Y, 34, lfBasic) |
|
94 end |
|
95 end |
|
96 end; |
|
97 |
33 |
98 |
34 procedure LoadFromFile(fileName: shortstring); |
99 procedure LoadFromFile(fileName: shortstring); |
35 var |
100 var |
36 f: file of PointRec; |
101 f: file of PointRec; |
37 rec: PointRec; |
102 rec, prevRec: PointRec; |
38 begin |
103 begin |
39 fileMode = foReadOnly; |
104 fileMode:= 0; |
40 |
105 |
41 assignFile(f, fileName); |
106 assignFile(f, fileName); |
42 reset(f); |
107 reset(f); |
43 |
108 |
44 while not eof(f) do |
109 while not eof(f) do |
45 begin |
110 begin |
46 read(f, rec); |
111 read(f, rec); |
|
112 rec.X:= SDLNet_Read16(@rec.X); |
|
113 rec.Y:= SDLNet_Read16(@rec.Y); |
|
114 |
|
115 // FIXME: handle single point |
|
116 if eof(f) or (rec.flags and $80 <> 0) then |
|
117 else |
|
118 DrawLineOnLand(prevRec.X, prevRec.Y, rec.X, rec.Y); |
|
119 |
|
120 prevRec:= rec; |
47 end; |
121 end; |
48 |
122 |
49 closeFile(f); |
123 closeFile(f); |
50 end; |
124 end; |
51 |
125 |