1 | {$INCLUDE switches}
|
---|
2 | unit Wonders;
|
---|
3 |
|
---|
4 | interface
|
---|
5 |
|
---|
6 | uses
|
---|
7 | ScreenTools, BaseWin, Protocol,
|
---|
8 |
|
---|
9 | Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
|
---|
10 | ButtonBase, ButtonB;
|
---|
11 |
|
---|
12 | type
|
---|
13 | TWondersDlg = class(TBufferedDrawDlg)
|
---|
14 | CloseBtn: TButtonB;
|
---|
15 | procedure FormCreate(Sender: TObject);
|
---|
16 | procedure CloseBtnClick(Sender: TObject);
|
---|
17 | procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
---|
18 | procedure FormShow(Sender: TObject);
|
---|
19 | procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
|
---|
20 | Shift: TShiftState; X, Y: Integer);
|
---|
21 |
|
---|
22 | public
|
---|
23 | procedure OffscreenPaint; override;
|
---|
24 | procedure ShowNewContent(NewMode: Integer);
|
---|
25 |
|
---|
26 | private
|
---|
27 | xm, ym, Selection: Integer;
|
---|
28 | end;
|
---|
29 |
|
---|
30 | var
|
---|
31 | WondersDlg: TWondersDlg;
|
---|
32 |
|
---|
33 | implementation
|
---|
34 |
|
---|
35 | uses
|
---|
36 | Term, ClientTools, Help, Tribes;
|
---|
37 |
|
---|
38 | {$R *.DFM}
|
---|
39 |
|
---|
40 | const
|
---|
41 | RingPosition: array [0 .. 20, 0 .. 1] of Integer = ((-80, -32), // Pyramids
|
---|
42 | (80, -32), // Zeus
|
---|
43 | (0, -64), // Gardens
|
---|
44 | (0, 0), // Colossus
|
---|
45 | (0, 64), // Lighthouse
|
---|
46 | (-80, 32), // GrLibrary
|
---|
47 | (-90, 114), // Oracle
|
---|
48 | (80, 32), // Sun
|
---|
49 | (90, -114), // Leo
|
---|
50 | (-180, 0), // Magellan
|
---|
51 | (90, 114), // Mich
|
---|
52 | (0, 0), // {11;}
|
---|
53 | (180, 0), // Newton
|
---|
54 | (-90, -114), // Bach
|
---|
55 | (0, 0), // {14;}
|
---|
56 | (-160, -64), // Liberty
|
---|
57 | (0, 128), // Eiffel
|
---|
58 | (160, -64), // Hoover
|
---|
59 | (-160, 64), // Shinkansen
|
---|
60 | (0, -128), // Manhattan
|
---|
61 | (160, 64)); // Mir
|
---|
62 |
|
---|
63 | procedure TWondersDlg.FormCreate(Sender: TObject);
|
---|
64 | begin
|
---|
65 | Canvas.Font.Assign(UniFont[ftNormal]);
|
---|
66 | Canvas.Brush.Style := bsClear;
|
---|
67 | InitButtons();
|
---|
68 | end;
|
---|
69 |
|
---|
70 | procedure TWondersDlg.FormShow(Sender: TObject);
|
---|
71 | begin
|
---|
72 | Selection := -1;
|
---|
73 | OffscreenPaint;
|
---|
74 | end;
|
---|
75 |
|
---|
76 | procedure TWondersDlg.ShowNewContent(NewMode: Integer);
|
---|
77 | begin
|
---|
78 | inherited ShowNewContent(NewMode);
|
---|
79 | end;
|
---|
80 |
|
---|
81 | procedure TWondersDlg.OffscreenPaint;
|
---|
82 | type
|
---|
83 | TLine = array [0 .. 649, 0 .. 2] of Byte;
|
---|
84 |
|
---|
85 | procedure DarkIcon(i: Integer);
|
---|
86 | var
|
---|
87 | X, Y, ch, x0Dst, y0Dst, x0Src, y0Src, darken, c: Integer;
|
---|
88 | Src, Dst: ^TLine;
|
---|
89 | begin
|
---|
90 | x0Dst := ClientWidth div 2 - xSizeBig div 2 + RingPosition[i, 0];
|
---|
91 | y0Dst := ClientHeight div 2 - ySizeBig div 2 + RingPosition[i, 1];
|
---|
92 | x0Src := (i mod 7) * xSizeBig;
|
---|
93 | y0Src := (i div 7 + SystemIconLines) * ySizeBig;
|
---|
94 | for Y := 0 to ySizeBig - 1 do
|
---|
95 | begin
|
---|
96 | Src := BigImp.ScanLine[y0Src + Y];
|
---|
97 | Dst := Offscreen.ScanLine[y0Dst + Y];
|
---|
98 | for X := 0 to xSizeBig - 1 do
|
---|
99 | begin
|
---|
100 | darken := ((255 - Src[x0Src + X][0]) * 3 + (255 - Src[x0Src + X][1]) *
|
---|
101 | 15 + (255 - Src[x0Src + X][2]) * 9) div 128;
|
---|
102 | for ch := 0 to 2 do
|
---|
103 | begin
|
---|
104 | c := Dst[x0Dst + X][ch] - darken;
|
---|
105 | if c < 0 then
|
---|
106 | Dst[x0Dst + X][ch] := 0
|
---|
107 | else
|
---|
108 | Dst[x0Dst + X][ch] := c;
|
---|
109 | end
|
---|
110 | end
|
---|
111 | end;
|
---|
112 | end;
|
---|
113 |
|
---|
114 | procedure Glow(i, GlowColor: Integer);
|
---|
115 | begin
|
---|
116 | GlowFrame(Offscreen, ClientWidth div 2 - xSizeBig div 2 + RingPosition[i,
|
---|
117 | 0], ClientHeight div 2 - ySizeBig div 2 + RingPosition[i, 1], xSizeBig,
|
---|
118 | ySizeBig, GlowColor);
|
---|
119 | end;
|
---|
120 |
|
---|
121 | const
|
---|
122 | darken = 24;
|
---|
123 | // space=pi/120;
|
---|
124 | amax0 = 15734; // 1 shl 16*tan(pi/12-space);
|
---|
125 | amin1 = 19413; // 1 shl 16*tan(pi/12+space);
|
---|
126 | amax1 = 62191; // 1 shl 16*tan(pi/4-space);
|
---|
127 | amin2 = 69061; // 1 shl 16*tan(pi/4+space);
|
---|
128 | amax2 = 221246; // 1 shl 16*tan(5*pi/12-space);
|
---|
129 | amin3 = 272977; // 1 shl 16*tan(5*pi/12+space);
|
---|
130 | var
|
---|
131 | i, X, Y, r, ax, ch, c: Integer;
|
---|
132 | HaveWonder: boolean;
|
---|
133 | Line: array [0 .. 1] of ^TLine;
|
---|
134 | s: string;
|
---|
135 | begin
|
---|
136 | if (OffscreenUser <> nil) and (OffscreenUser <> self) then
|
---|
137 | OffscreenUser.Update;
|
---|
138 | // complete working with old owner to prevent rebound
|
---|
139 | OffscreenUser := self;
|
---|
140 |
|
---|
141 | Fill(Offscreen.Canvas, 3, 3, ClientWidth - 6, ClientHeight - 6,
|
---|
142 | (wMaintexture - ClientWidth) div 2, (hMaintexture - ClientHeight) div 2);
|
---|
143 | Frame(Offscreen.Canvas, 0, 0, ClientWidth - 1, ClientHeight - 1, 0, 0);
|
---|
144 | Frame(Offscreen.Canvas, 1, 1, ClientWidth - 2, ClientHeight - 2,
|
---|
145 | MainTexture.clBevelLight, MainTexture.clBevelShade);
|
---|
146 | Frame(Offscreen.Canvas, 2, 2, ClientWidth - 3, ClientHeight - 3,
|
---|
147 | MainTexture.clBevelLight, MainTexture.clBevelShade);
|
---|
148 | Corner(Offscreen.Canvas, 1, 1, 0, MainTexture);
|
---|
149 | Corner(Offscreen.Canvas, ClientWidth - 9, 1, 1, MainTexture);
|
---|
150 | Corner(Offscreen.Canvas, 1, ClientHeight - 9, 2, MainTexture);
|
---|
151 | Corner(Offscreen.Canvas, ClientWidth - 9, ClientHeight - 9, 3, MainTexture);
|
---|
152 |
|
---|
153 | BtnFrame(Offscreen.Canvas, CloseBtn.BoundsRect, MainTexture);
|
---|
154 |
|
---|
155 | Offscreen.Canvas.Font.Assign(UniFont[ftCaption]);
|
---|
156 | s := Phrases.Lookup('TITLE_WONDERS');
|
---|
157 | RisedTextOut(Offscreen.Canvas,
|
---|
158 | (ClientWidth - BiColorTextWidth(Offscreen.Canvas, s)) div 2 - 1, 7, s);
|
---|
159 | Offscreen.Canvas.Font.Assign(UniFont[ftNormal]);
|
---|
160 |
|
---|
161 | xm := ClientWidth div 2;
|
---|
162 | ym := ClientHeight div 2;
|
---|
163 | for Y := 0 to 127 do
|
---|
164 | begin
|
---|
165 | Line[0] := Offscreen.ScanLine[ym + Y];
|
---|
166 | Line[1] := Offscreen.ScanLine[ym - 1 - Y];
|
---|
167 | for X := 0 to 179 do
|
---|
168 | begin
|
---|
169 | r := X * X * (32 * 32) + Y * Y * (45 * 45);
|
---|
170 | ax := ((1 shl 16 div 32) * 45) * Y;
|
---|
171 | if (r < 8 * 128 * 180 * 180) and
|
---|
172 | ((r >= 32 * 64 * 90 * 90) and (ax < amax2 * X) and
|
---|
173 | ((ax < amax0 * X) or (ax > amin2 * X)) or (ax > amin1 * X) and
|
---|
174 | ((ax < amax1 * X) or (ax > amin3 * X))) then
|
---|
175 | for i := 0 to 1 do
|
---|
176 | for ch := 0 to 2 do
|
---|
177 | begin
|
---|
178 | c := Line[i][xm + X][ch] - darken;
|
---|
179 | if c < 0 then
|
---|
180 | Line[i][xm + X][ch] := 0
|
---|
181 | else
|
---|
182 | Line[i][xm + X][ch] := c;
|
---|
183 | c := Line[i][xm - 1 - X][ch] - darken;
|
---|
184 | if c < 0 then
|
---|
185 | Line[i][xm - 1 - X][ch] := 0
|
---|
186 | else
|
---|
187 | Line[i][xm - 1 - X][ch] := c;
|
---|
188 | end
|
---|
189 | end;
|
---|
190 | end;
|
---|
191 |
|
---|
192 | HaveWonder := false;
|
---|
193 | for i := 0 to 20 do
|
---|
194 | if Imp[i].Preq <> preNA then
|
---|
195 | begin
|
---|
196 | case MyRO.Wonder[i].CityID of
|
---|
197 | - 1: // not built yet
|
---|
198 | begin
|
---|
199 | Fill(Offscreen.Canvas, xm - xSizeBig div 2 + RingPosition[i, 0] - 3,
|
---|
200 | ym - ySizeBig div 2 + RingPosition[i, 1] - 3, xSizeBig + 6,
|
---|
201 | ySizeBig + 6, (wMaintexture - ClientWidth) div 2,
|
---|
202 | (hMaintexture - ClientHeight) div 2);
|
---|
203 | DarkIcon(i);
|
---|
204 | end;
|
---|
205 | -2: // destroyed
|
---|
206 | begin
|
---|
207 | HaveWonder := true;
|
---|
208 | Glow(i, $000000);
|
---|
209 | BitBlt(Offscreen.Canvas.Handle, xm - xSizeBig div 2 + RingPosition
|
---|
210 | [i, 0], ym - ySizeBig div 2 + RingPosition[i, 1], xSizeBig,
|
---|
211 | ySizeBig, BigImp.Canvas.Handle, 0, (SystemIconLines + 3) *
|
---|
212 | ySizeBig, SRCCOPY);
|
---|
213 | end;
|
---|
214 | else
|
---|
215 | begin
|
---|
216 | HaveWonder := true;
|
---|
217 | if MyRO.Wonder[i].EffectiveOwner >= 0 then
|
---|
218 | Glow(i, Tribe[MyRO.Wonder[i].EffectiveOwner].Color)
|
---|
219 | else
|
---|
220 | Glow(i, $000000);
|
---|
221 | BitBlt(Offscreen.Canvas.Handle, xm - xSizeBig div 2 + RingPosition[i,
|
---|
222 | 0], ym - ySizeBig div 2 + RingPosition[i, 1], xSizeBig, ySizeBig,
|
---|
223 | BigImp.Canvas.Handle, (i mod 7) * xSizeBig,
|
---|
224 | (i div 7 + SystemIconLines) * ySizeBig, SRCCOPY);
|
---|
225 | end
|
---|
226 | end
|
---|
227 | end;
|
---|
228 |
|
---|
229 | if not HaveWonder then
|
---|
230 | begin
|
---|
231 | s := Phrases.Lookup('NOWONDER');
|
---|
232 | RisedTextOut(Offscreen.Canvas, xm - BiColorTextWidth(Offscreen.Canvas, s)
|
---|
233 | div 2, ym - Offscreen.Canvas.TextHeight(s) div 2, s);
|
---|
234 | end;
|
---|
235 |
|
---|
236 | MarkUsedOffscreen(ClientWidth, ClientHeight);
|
---|
237 | end; { OffscreenPaint }
|
---|
238 |
|
---|
239 | procedure TWondersDlg.CloseBtnClick(Sender: TObject);
|
---|
240 | begin
|
---|
241 | Close
|
---|
242 | end;
|
---|
243 |
|
---|
244 | procedure TWondersDlg.FormMouseMove(Sender: TObject; Shift: TShiftState;
|
---|
245 | X, Y: Integer);
|
---|
246 | var
|
---|
247 | i, OldSelection: Integer;
|
---|
248 | s: string;
|
---|
249 | begin
|
---|
250 | OldSelection := Selection;
|
---|
251 | Selection := -1;
|
---|
252 | for i := 0 to 20 do
|
---|
253 | if (Imp[i].Preq <> preNA) and (X >= xm - xSizeBig div 2 + RingPosition[i, 0]
|
---|
254 | ) and (X < xm + xSizeBig div 2 + RingPosition[i, 0]) and
|
---|
255 | (Y >= ym - ySizeBig div 2 + RingPosition[i, 1]) and
|
---|
256 | (Y < ym + ySizeBig div 2 + RingPosition[i, 1]) then
|
---|
257 | begin
|
---|
258 | Selection := i;
|
---|
259 | break
|
---|
260 | end;
|
---|
261 | if Selection <> OldSelection then
|
---|
262 | begin
|
---|
263 | Fill(Canvas, 9, ClientHeight - 3 - 46, ClientWidth - 18, 44,
|
---|
264 | (wMaintexture - ClientWidth) div 2, (hMaintexture - ClientHeight) div 2);
|
---|
265 | if Selection >= 0 then
|
---|
266 | begin
|
---|
267 | if MyRO.Wonder[Selection].CityID = -1 then
|
---|
268 | begin // not built yet
|
---|
269 | { s:=Phrases.Lookup('IMPROVEMENTS',Selection);
|
---|
270 | Canvas.Font.Color:=$000000;
|
---|
271 | Canvas.TextOut(
|
---|
272 | (ClientWidth-BiColorTextWidth(Canvas,s)) div 2+1,
|
---|
273 | ClientHeight-3-36+1, s);
|
---|
274 | Canvas.Font.Color:=MainTexture.clBevelLight;
|
---|
275 | Canvas.TextOut(
|
---|
276 | (ClientWidth-BiColorTextWidth(Canvas,s)) div 2,
|
---|
277 | ClientHeight-3-36, s); }
|
---|
278 | end
|
---|
279 | else
|
---|
280 | begin
|
---|
281 | s := Phrases.Lookup('IMPROVEMENTS', Selection);
|
---|
282 | if MyRO.Wonder[Selection].CityID <> -2 then
|
---|
283 | s := Format(Phrases.Lookup('WONDEROF'),
|
---|
284 | [s, CityName(MyRO.Wonder[Selection].CityID)]);
|
---|
285 | LoweredTextOut(Canvas, -1, MainTexture,
|
---|
286 | (ClientWidth - BiColorTextWidth(Canvas, s)) div 2,
|
---|
287 | ClientHeight - 3 - 36 - 10, s);
|
---|
288 | if MyRO.Wonder[Selection].CityID = -2 then
|
---|
289 | s := Phrases.Lookup('DESTROYED')
|
---|
290 | else if MyRO.Wonder[Selection].EffectiveOwner < 0 then
|
---|
291 | s := Phrases.Lookup('EXPIRED')
|
---|
292 | else
|
---|
293 | s := Tribe[MyRO.Wonder[Selection].EffectiveOwner]
|
---|
294 | .TPhrase('WONDEROWNER');
|
---|
295 | LoweredTextOut(Canvas, -1, MainTexture,
|
---|
296 | (ClientWidth - BiColorTextWidth(Canvas, s)) div 2,
|
---|
297 | ClientHeight - 3 - 36 + 10, s);
|
---|
298 | end
|
---|
299 | end;
|
---|
300 | end
|
---|
301 | end;
|
---|
302 |
|
---|
303 | procedure TWondersDlg.FormMouseDown(Sender: TObject; Button: TMouseButton;
|
---|
304 | Shift: TShiftState; X, Y: Integer);
|
---|
305 | begin
|
---|
306 | if Selection >= 0 then
|
---|
307 | HelpDlg.ShowNewContent(FWindowMode or wmPersistent, hkImp, Selection);
|
---|
308 | end;
|
---|
309 |
|
---|
310 | end.
|
---|