source: tags/1.3.0/LocalPlayer/TechTree.pas

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