source: tags/1.2.0/LocalPlayer/TechTree.pas

Last change on this file was 220, checked in by chronos, 4 years ago
  • Modified: Use wsFullScreen to switch to fullscreen mode.
  • Fixed: Image memory leak in TechTree.
File size: 7.2 KB
Line 
1{$INCLUDE Switches.inc}
2unit TechTree;
3
4interface
5
6uses
7 ScreenTools, LCLIntf, LCLType, SysUtils, Classes, Graphics,
8 Controls, Forms, ButtonB, DrawDlg;
9
10type
11
12 { TTechTreeDlg }
13
14 TTechTreeDlg = class(TDrawDlg)
15 CloseBtn: TButtonB;
16 procedure FormCreate(Sender: TObject);
17 procedure FormDestroy(Sender: TObject);
18 procedure FormPaint(Sender: TObject);
19 procedure FormShow(Sender: TObject);
20 procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
21 Shift: TShiftState; X, Y: Integer);
22 procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
23 Shift: TShiftState; X, Y: Integer);
24 procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
25 procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
26 procedure CloseBtnClick(Sender: TObject);
27 private
28 xOffset, yOffset, xDown, yDown: Integer;
29 Image: TBitmap;
30 Dragging: Boolean;
31 end;
32
33var
34 TechTreeDlg: TTechTreeDlg;
35
36
37implementation
38
39uses
40 Directories;
41
42{$R *.lfm}
43
44const
45 BlackBorder = 4;
46 LeftBorder = 72;
47 RightBorder = 45;
48 TopBorder = 16;
49 BottomBorder = 48;
50 xStart = 0;
51 yStart = 40;
52 xPitch = 160;
53 yPitch = 90;
54 xLegend = 44;
55 yLegend = 79;
56 yLegendPitch = 32;
57
58function min(a, b: Integer): Integer;
59begin
60 if a < b then
61 result := a
62 else
63 result := b;
64end;
65
66function max(a, b: Integer): Integer;
67begin
68 if a > b then
69 result := a
70 else
71 result := b;
72end;
73
74procedure TTechTreeDlg.FormCreate(Sender: TObject);
75begin
76 InitButtons;
77 Image := nil;
78end;
79
80procedure TTechTreeDlg.FormDestroy(Sender: TObject);
81begin
82 FreeAndNil(Image);
83end;
84
85procedure TTechTreeDlg.FormPaint(Sender: TObject);
86var
87 X, w: Integer;
88begin
89 with Canvas do begin
90 // black border
91 brush.color := $000000;
92 fillrect(rect(0, 0, BlackBorder, ClientHeight));
93 fillrect(rect(BlackBorder, 0, ClientWidth - BlackBorder, BlackBorder));
94 fillrect(rect(ClientWidth - BlackBorder, 0, ClientWidth, ClientHeight));
95 fillrect(rect(BlackBorder, ClientHeight - BlackBorder,
96 ClientWidth - BlackBorder, ClientHeight));
97
98 // texturize empty space
99 brush.color := $FFFFFF;
100 if xOffset > 0 then
101 FillRectSeamless(Canvas, BlackBorder, BlackBorder, BlackBorder + xOffset,
102 ClientHeight - BlackBorder, -BlackBorder - xOffset,
103 -BlackBorder - yOffset, Paper);
104 if xOffset + Image.width < ClientWidth - 2 * BlackBorder then
105 FillRectSeamless(Canvas, BlackBorder + xOffset + Image.width, BlackBorder,
106 ClientWidth - BlackBorder, ClientHeight - BlackBorder,
107 -BlackBorder - xOffset, -BlackBorder - yOffset, Paper);
108 X := max(BlackBorder, BlackBorder + xOffset);
109 w := min(BlackBorder + xOffset + Image.width, ClientWidth - BlackBorder);
110 if yOffset > 0 then
111 FillRectSeamless(Canvas, X, BlackBorder, w, BlackBorder + yOffset,
112 -BlackBorder - xOffset, -BlackBorder - yOffset, Paper);
113 if yOffset + Image.height < ClientHeight - 2 * BlackBorder then
114 FillRectSeamless(Canvas, X, BlackBorder + yOffset + Image.height, w,
115 ClientHeight - BlackBorder, -BlackBorder - xOffset,
116 -BlackBorder - yOffset, Paper);
117 end;
118 BitBltCanvas(Canvas, max(BlackBorder, BlackBorder + xOffset),
119 max(BlackBorder, BlackBorder + yOffset),
120 min(Image.width, min(Image.width + xOffset,
121 min(ClientWidth - 2 * BlackBorder, ClientWidth - 2 * BlackBorder - xOffset))
122 ), min(Image.height, min(Image.height + yOffset,
123 min(ClientHeight - 2 * BlackBorder, ClientHeight - 2 * BlackBorder -
124 yOffset))), Image.Canvas, max(0, -xOffset),
125 max(0, -yOffset));
126end;
127
128procedure TTechTreeDlg.FormShow(Sender: TObject);
129var
130 X, Y, ad: Integer;
131 s: string;
132 NewWidth: Integer;
133 NewHeight: Integer;
134const
135 TransparentColor = $7F007F;
136begin
137 if Image = nil then begin
138 Image := TBitmap.Create;
139 Image.PixelFormat := pf24bit;
140 LoadGraphicFile(Image, HomeDir + 'Help' + DirectorySeparator + 'AdvTree.png', gfNoGamma);
141
142 with Image.Canvas do begin
143 // write advance names
144 Font.Assign(UniFont[ftSmall]);
145 Font.color := clBlack;
146 brush.Style := bsClear;
147 for X := 0 to (Image.width - xStart) div xPitch do
148 for Y := 0 to (Image.height - yStart) div yPitch do
149 begin
150 ad := Pixels[xStart + X * xPitch + 10, yStart + Y * yPitch - 1];
151 if ad and $FFFF00 = 0 then
152 begin
153 s := Phrases.Lookup('ADVANCES', ad);
154 while TextWidth(s) > 112 do
155 Delete(s, Length(s), 1);
156 TextOut(xStart + X * xPitch + 2, yStart + Y * yPitch, s);
157 Pixels[xStart + X * xPitch + 10, yStart + Y * yPitch - 1]
158 := TransparentColor;
159 end
160 end;
161
162 // write legend
163 TextOut(xLegend, yLegend, Phrases2.Lookup('ADVTREE_UP0'));
164 TextOut(xLegend, yLegend + yLegendPitch, Phrases2.Lookup('ADVTREE_UP1'));
165 TextOut(xLegend, yLegend + 2 * yLegendPitch,
166 Phrases2.Lookup('ADVTREE_UP2'));
167 TextOut(xLegend, yLegend + 3 * yLegendPitch,
168 Phrases2.Lookup('ADVTREE_GOV'));
169 TextOut(xLegend, yLegend + 4 * yLegendPitch,
170 Phrases2.Lookup('ADVTREE_OTHER'));
171 end;
172
173 Texturize(Image, Paper, TransparentColor);
174 end;
175
176 // fit window to image, center image in window, center window to screen
177 NewWidth := Min(Screen.Width - 40, Image.Width + LeftBorder + RightBorder + 2 * BlackBorder);
178 NewHeight := Min(Screen.Height - 40, Image.Height + TopBorder + BottomBorder + 2 * BlackBorder);
179 BoundsRect := Bounds((Screen.Width - NewWidth) div 2,
180 (Screen.Height - NewHeight) div 2,
181 NewWidth, NewHeight);
182 CloseBtn.Left := width - CloseBtn.width - BlackBorder - 8;
183 CloseBtn.Top := BlackBorder + 8;
184 xOffset := (ClientWidth - Image.Width + LeftBorder - RightBorder) div 2 -
185 BlackBorder;
186 yOffset := ClientHeight - 2 * BlackBorder - Image.Height - BottomBorder;
187end;
188
189procedure TTechTreeDlg.FormMouseDown(Sender: TObject; Button: TMouseButton;
190 Shift: TShiftState; X, Y: Integer);
191begin
192 if Button = mbLeft then
193 begin
194 dragging := true;
195 xDown := X;
196 yDown := Y;
197 end;
198end;
199
200procedure TTechTreeDlg.FormMouseUp(Sender: TObject; Button: TMouseButton;
201 Shift: TShiftState; X, Y: Integer);
202begin
203 dragging := false;
204end;
205
206procedure TTechTreeDlg.FormMouseMove(Sender: TObject; Shift: TShiftState;
207 X, Y: Integer);
208begin
209 if dragging then
210 begin
211 xOffset := xOffset + X - xDown;
212 yOffset := yOffset + Y - yDown;
213 xDown := X;
214 yDown := Y;
215
216 if xOffset > LeftBorder then
217 xOffset := LeftBorder;
218 if xOffset < ClientWidth - 2 * BlackBorder - Image.width - RightBorder then
219 xOffset := ClientWidth - 2 * BlackBorder - Image.width - RightBorder;
220 if yOffset > TopBorder then
221 yOffset := TopBorder;
222 if yOffset < ClientHeight - 2 * BlackBorder - Image.height - BottomBorder
223 then
224 yOffset := ClientHeight - 2 * BlackBorder - Image.height - BottomBorder;
225
226 SmartInvalidate;
227 end;
228end;
229
230procedure TTechTreeDlg.FormKeyDown(Sender: TObject; var Key: Word;
231 Shift: TShiftState);
232begin
233 if Key = VK_ESCAPE then
234 Close;
235end;
236
237procedure TTechTreeDlg.CloseBtnClick(Sender: TObject);
238begin
239 Close;
240end;
241
242end.
Note: See TracBrowser for help on using the repository browser.