34 function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; |
34 function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; |
35 function DrawExplosion(X, Y, Radius: LongInt): Longword; |
35 function DrawExplosion(X, Y, Radius: LongInt): Longword; |
36 procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte); |
36 procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte); |
37 procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt); |
37 procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt); |
38 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); |
38 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); |
39 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean); |
39 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean); |
40 function LandBackPixel(x, y: LongInt): LongWord; |
40 function LandBackPixel(x, y: LongInt): LongWord; |
41 procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword); |
41 procedure DrawLine(X1, Y1, X2, Y2: LongInt; Color: Longword); |
42 procedure DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword); |
42 procedure DrawThickLine(X1, Y1, X2, Y2, radius: LongInt; color: Longword); |
43 procedure DumpLandToLog(x, y, r: LongInt); |
43 procedure DumpLandToLog(x, y, r: LongInt); |
44 |
44 |
97 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
97 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
98 if (Land[y - dx, i] and lfIndestructible) = 0 then |
98 if (Land[y - dx, i] and lfIndestructible) = 0 then |
99 Land[y - dx, i]:= Value; |
99 Land[y - dx, i]:= Value; |
100 end; |
100 end; |
101 |
101 |
102 procedure ChangeCircleLines(x, y, dx, dy: LongInt; doSet: boolean); |
102 procedure ChangeCircleLines(x, y, dx, dy: LongInt; doSet, isCurrent: boolean); |
103 var i: LongInt; |
103 var i: LongInt; |
104 begin |
104 begin |
105 if not doSet then |
105 if not doSet then |
106 begin |
106 begin |
107 if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
107 if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
108 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
108 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
109 if (Land[y + dy, i] > 0) and (Land[y + dy, i] < 256) then |
109 if isCurrent then |
110 dec(Land[y + dy, i]); // check > 0 because explosion can erase collision data |
110 Land[y + dy, i]:= Land[y + dy, i] and $FF7F |
|
111 else if Land[y + dy, i] and $007F > 0 then |
|
112 Land[y + dy, i]:= (Land[y + dy, i] and $FF80) or ((Land[y + dy, i] and $7F) - 1); |
111 if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
113 if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
112 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
114 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
113 if (Land[y - dy, i] > 0) and (Land[y - dy, i] < 256) then |
115 if isCurrent then |
114 dec(Land[y - dy, i]); |
116 Land[y - dy, i]:= Land[y - dy, i] and $FF7F |
|
117 else if Land[y - dy, i] and $007F > 0 then |
|
118 Land[y - dy, i]:= (Land[y - dy, i] and $FF80) or ((Land[y - dy, i] and $7F) - 1); |
115 if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
119 if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
116 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
120 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
117 if (Land[y + dx, i] > 0) and (Land[y + dx, i] < 256) then |
121 if isCurrent then |
118 dec(Land[y + dx, i]); |
122 Land[y + dx, i]:= Land[y + dx, i] and $FF7F |
|
123 else if Land[y + dx, i] and $007F > 0 then |
|
124 Land[y + dx, i]:= (Land[y + dx, i] and $FF80) or ((Land[y + dx, i] and $7F) - 1); |
119 if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
125 if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
120 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
126 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
121 if (Land[y - dx, i] > 0) and (Land[y - dx, i] < 256) then |
127 if isCurrent then |
122 dec(Land[y - dx, i]); |
128 Land[y - dx, i]:= Land[y - dx, i] and $FF7F |
|
129 else if Land[y - dx, i] and $007F > 0 then |
|
130 Land[y - dx, i]:= (Land[y - dx, i] and $FF80) or ((Land[y - dx, i] and $7F) - 1) |
123 end |
131 end |
124 else |
132 else |
125 begin |
133 begin |
126 if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
134 if ((y + dy) and LAND_HEIGHT_MASK) = 0 then |
127 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
135 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
128 if (Land[y + dy, i] < 256) then |
136 if isCurrent then |
129 inc(Land[y + dy, i]); |
137 Land[y + dy, i]:= Land[y + dy, i] or $80 |
130 if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
138 else if Land[y + dy, i] and $007F < 127 then |
131 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
139 Land[y + dy, i]:= (Land[y + dy, i] and $FF80) or ((Land[y + dy, i] and $7F) + 1); |
132 if (Land[y - dy, i] < 256) then |
140 if ((y - dy) and LAND_HEIGHT_MASK) = 0 then |
133 inc(Land[y - dy, i]); |
141 for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do |
134 if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
142 if isCurrent then |
135 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
143 Land[y - dy, i]:= Land[y - dy, i] or $80 |
136 if (Land[y + dx, i] < 256) then |
144 else if Land[y - dy, i] and $007F < 127 then |
137 inc(Land[y + dx, i]); |
145 Land[y - dy, i]:= (Land[y - dy, i] and $FF80) or ((Land[y - dy, i] and $7F) + 1); |
138 if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
146 if ((y + dx) and LAND_HEIGHT_MASK) = 0 then |
139 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
147 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
140 if (Land[y - dx, i] < 256) then |
148 if isCurrent then |
141 inc(Land[y - dx, i]); |
149 Land[y + dx, i]:= Land[y + dx, i] or $80 |
|
150 else if Land[y + dx, i] and $007F < 127 then |
|
151 Land[y + dx, i]:= (Land[y + dx, i] and $FF80) or ((Land[y + dx, i] and $7F) + 1); |
|
152 if ((y - dx) and LAND_HEIGHT_MASK) = 0 then |
|
153 for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do |
|
154 if isCurrent then |
|
155 Land[y - dx, i]:= Land[y - dx, i] or $80 |
|
156 else if Land[y - dx, i] and $007F < 127 then |
|
157 Land[y - dx, i]:= (Land[y - dx, i] and $FF80) or ((Land[y - dx, i] and $7F) + 1) |
142 end |
158 end |
143 end; |
159 end; |
144 |
160 |
145 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); |
161 procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); |
146 var dx, dy, d: LongInt; |
162 var dx, dy, d: LongInt; |
162 end; |
178 end; |
163 if (dx = dy) then |
179 if (dx = dy) then |
164 FillCircleLines(x, y, dx, dy, Value); |
180 FillCircleLines(x, y, dx, dy, Value); |
165 end; |
181 end; |
166 |
182 |
167 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean); |
183 procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet, isCurrent: boolean); |
168 var dx, dy, d: LongInt; |
184 var dx, dy, d: LongInt; |
169 begin |
185 begin |
170 dx:= 0; |
186 dx:= 0; |
171 dy:= Radius; |
187 dy:= Radius; |
172 d:= 3 - 2 * Radius; |
188 d:= 3 - 2 * Radius; |
173 while (dx < dy) do |
189 while (dx < dy) do |
174 begin |
190 begin |
175 ChangeCircleLines(x, y, dx, dy, doSet); |
191 ChangeCircleLines(x, y, dx, dy, doSet, isCurrent); |
176 if (d < 0) then |
192 if (d < 0) then |
177 d:= d + 4 * dx + 6 |
193 d:= d + 4 * dx + 6 |
178 else |
194 else |
179 begin |
195 begin |
180 d:= d + 4 * (dx - dy) + 10; |
196 d:= d + 4 * (dx - dy) + 10; |
181 dec(dy) |
197 dec(dy) |
182 end; |
198 end; |
183 inc(dx) |
199 inc(dx) |
184 end; |
200 end; |
185 if (dx = dy) then |
201 if (dx = dy) then |
186 ChangeCircleLines(x, y, dx, dy, doSet) |
202 ChangeCircleLines(x, y, dx, dy, doSet, isCurrent) |
187 end; |
203 end; |
188 |
204 |
189 procedure FillLandCircleLines0(x, y, dx, dy: LongInt); |
205 procedure FillLandCircleLines0(x, y, dx, dy: LongInt); |
190 var i, t: LongInt; |
206 var i, t: LongInt; |
191 begin |
207 begin |