source: trunk/Forms/FormMain.pas

Last change on this file was 114, checked in by chronos, 6 months ago
  • Fixed: Linux data directories detection.
File size: 7.7 KB
Line 
1unit FormMain;
2
3interface
4
5uses
6 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, LCLType, FormEx,
7 Dialogs, ExtCtrls, ComCtrls, Menus, ActnList, Engine, Platform, Math,
8 DateUtils, GraphType, PersistentForm, ApplicationInfo, Translator,
9 RegistryEx, FormAbout, FormNewGame, FormMap;
10
11type
12
13 { TFormMain }
14
15 TFormMain = class(TFormEx)
16 AAbout: TAction;
17 AShowRawImageDesc: TAction;
18 AShowMap: TAction;
19 ANewGame: TAction;
20 AExit: TAction;
21 AFullScreen: TAction;
22 ActionList1: TActionList;
23 Image1: TImage;
24 MainMenu1: TMainMenu;
25 MenuItem1: TMenuItem;
26 MenuItem2: TMenuItem;
27 MenuItem3: TMenuItem;
28 MenuItem4: TMenuItem;
29 MenuItem5: TMenuItem;
30 MenuItem6: TMenuItem;
31 MenuItem7: TMenuItem;
32 MenuItem8: TMenuItem;
33 MenuItem9: TMenuItem;
34 StatusBar1: TStatusBar;
35 TimerDraw: TTimer;
36 TimerEngineTick: TTimer;
37 procedure AAboutExecute(Sender: TObject);
38 procedure AExitExecute(Sender: TObject);
39 procedure AFullScreenExecute(Sender: TObject);
40 procedure ANewGameExecute(Sender: TObject);
41 procedure AShowMapExecute(Sender: TObject);
42 procedure AShowRawImageDescExecute(Sender: TObject);
43 procedure FormCreate(Sender: TObject);
44 procedure FormDestroy(Sender: TObject);
45 procedure FormDeactivate(Sender: TObject);
46 procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
47 procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
48 procedure FormShow(Sender: TObject);
49 procedure Image1Resize(Sender: TObject);
50 procedure TimerDrawTimer(Sender: TObject);
51 private
52 StartTime: TDateTime;
53 Drawing: Boolean;
54 procedure LoadConfig;
55 procedure SaveConfig;
56 procedure UpdateInterface;
57 public
58 Engine: TEngine;
59 FormNewGame: TFormNewGame;
60 FormMap: TFormMap;
61 procedure EraseBackground(DC: HDC); override;
62 end;
63
64var
65 FormMain: TFormMain;
66
67
68implementation
69
70{$R *.lfm}
71
72uses
73 Core;
74
75resourcestring
76 SRound = '%0:s';
77
78{ TFormMain }
79
80procedure TFormMain.TimerDrawTimer(Sender: TObject);
81begin
82 if not Drawing then
83 try
84 Drawing := True;
85 StartTime := NowPrecise;
86 //Engine.Draw;
87 if Assigned(Engine) then begin
88 Engine.Lock.Acquire;
89 try
90 //StatusBar1.Panels[1].Text := IntToStr(TPlayer(Engine.Players[0]).Position.X) + ', ' +
91 // IntToStr(TPlayer(Engine.Players[0]).Position.Y) + ' ' +
92 // IntToStr(TPlayer(Engine.Players[0]).Direction);
93 StatusBar1.Panels[2].Text := FloatToStr(RoundTo(Engine.DrawDuration / OneMillisecond, -2));
94 StatusBar1.Panels[3].Text := Format(SRound, [IntToStr(Engine.CurrentRound)]);
95 finally
96 Engine.Lock.Release;
97 end;
98 end;
99 finally
100 Drawing := False;
101 end;
102 if Engine.ThreadErrorMessage <> '' then begin
103 ShowMessage(Engine.ThreadErrorMessage);
104 Engine.ThreadErrorMessage := '';
105 end;
106end;
107
108procedure TFormMain.LoadConfig;
109var
110 LangCode: string;
111begin
112 with TRegistryEx.Create do
113 try
114 CurrentContext := Core.Core.ApplicationInfo.GetRegistryContext;
115
116 if ValueExists('LanguageCode') then begin
117 LangCode := ReadStringWithDefault('LanguageCode', '');
118 Core.Core.Translator1.Language := Core.Core.Translator1.Languages.SearchByCode(LangCode);
119 end else Core.Core.Translator1.Language := Core.Core.Translator1.Languages.SearchByCode('');
120 Engine.LoadFromRegistry(CurrentContext);
121 finally
122 Free;
123 end;
124end;
125
126procedure TFormMain.SaveConfig;
127begin
128 with TRegistryEx.Create do
129 try
130 CurrentContext := Core.Core.ApplicationInfo.GetRegistryContext;
131
132 if Assigned(Core.Core.Translator1.Language) and (Core.Core.Translator1.Language.Code <> '') then
133 WriteString('LanguageCode', Core.Core.Translator1.Language.Code)
134 else DeleteValue('LanguageCode');
135 Engine.SaveToRegistry(CurrentContext);
136 finally
137 Free;
138 end;
139end;
140
141procedure TFormMain.UpdateInterface;
142begin
143 {$IFDEF LCLQT5}
144 MenuItem1.Visible := not FullScreen;
145 MenuItem4.Visible := not FullScreen;
146 MenuItem7.Visible := not FullScreen;
147 {$ELSE}
148 if FullScreen then Menu := nil
149 else Menu := MainMenu1;
150 {$ENDIF}
151 {$IFDEF DEBUG}
152 StatusBar1.Visible := not FullScreen;
153 AShowMap.Visible := True;
154 ANewGame.Visible := True;
155 AShowRawImageDesc.Visible := True;
156 {$ENDIF}
157end;
158
159procedure TFormMain.EraseBackground(DC: HDC);
160begin
161 // Do nothing
162end;
163
164procedure TFormMain.FormCreate(Sender: TObject);
165{$IFDEF UNIX}
166const
167 LanguagesDirName = 'Languages';
168 UnixLanguagesDir = '../share/Tunneler/' + LanguagesDirName;
169var
170 BaseDir: string;
171 NewDir: string;
172{$ENDIF}
173begin
174 BaseDir := ExcludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
175 Core.Core.Translator1.POFilesFolder := BaseDir + DirectorySeparator + LanguagesDirName;
176
177 {$IFDEF UNIX}
178 // If installed in UNIX system then use installation directory for po files
179 NewDir := ExpandFileName(BaseDir + DirectorySeparator + UnixLanguagesDir);
180 if not DirectoryExists(Core.Core.Translator1.POFilesFolder) and DirectoryExists(NewDir) then
181 Core.Core.Translator1.POFilesFolder := NewDir;
182 {$ENDIF}
183
184 Image1.ControlStyle := Image1.ControlStyle + [csOpaque];
185 FullScreen := True;
186
187 Application.OnDeactivate := FormDeactivate;
188 Randomize;
189 DoubleBuffered := False;
190 Engine := TEngine.Create(nil);
191 Engine.OnClose := AExitExecute;
192 Engine.InitPlayerPool;
193 Engine.HomePage := Core.Core.ApplicationInfo.HomePage;
194 LoadConfig;
195 Engine.Translate;
196 Engine.Bitmap := Image1.Picture.Bitmap;
197 Engine.NewGame;
198 Image1Resize(Self);
199 Engine.Active := True;
200end;
201
202procedure TFormMain.FormDeactivate(Sender: TObject);
203begin
204 if Assigned(Engine) then Engine.KeyBoard.ClearAll;
205end;
206
207procedure TFormMain.FormDestroy(Sender: TObject);
208begin
209 SaveConfig;
210 TimerDraw.Enabled := False;
211 FreeAndNil(PersistentForm);
212 FreeAndNil(Engine);
213end;
214
215procedure TFormMain.AFullScreenExecute(Sender: TObject);
216begin
217 FullScreen := not FullScreen;
218 TFormEx.PersistentForm.Load(Self);
219 TFormEx.PersistentForm.SetFullScreen(FullScreen);
220 UpdateInterface;
221end;
222
223procedure TFormMain.ANewGameExecute(Sender: TObject);
224begin
225 FormNewGame := TFormNewGame.Create(nil);
226 try
227 FormNewGame.LoadData(Engine);
228 if FormNewGame.ShowModal = mrOk then begin
229 FormNewGame.SaveData(Engine);
230 Engine.NewGame;
231 end;
232 finally
233 FreeAndNil(FormNewGame);
234 end;
235end;
236
237procedure TFormMain.AShowMapExecute(Sender: TObject);
238begin
239 if not Assigned(FormMap) then FormMap := TFormMap.Create(Self);
240 FormMap.Show;
241end;
242
243procedure TFormMain.AShowRawImageDescExecute(Sender: TObject);
244begin
245 ShowMessage(Image1.Picture.Bitmap.RawImage.Description.AsString);
246end;
247
248procedure TFormMain.AExitExecute(Sender: TObject);
249begin
250 Close;
251end;
252
253procedure TFormMain.AAboutExecute(Sender: TObject);
254var
255 FormAbout: TFormAbout;
256begin
257 try
258 FormAbout := TFormAbout.Create(nil);
259 FormAbout.ApplicationInfo := Core.Core.ApplicationInfo;
260 FormAbout.ShowModal;
261 finally
262 FreeAndNil(FormAbout);
263 end;
264end;
265
266procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word;
267 Shift: TShiftState);
268begin
269 Engine.KeyDown(Key);
270 StatusBar1.Panels[0].Text := IntToStr(Key);
271end;
272
273procedure TFormMain.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState
274 );
275begin
276 Engine.KeyUp(Key);
277end;
278
279procedure TFormMain.FormShow(Sender: TObject);
280begin
281 UpdateInterface;
282end;
283
284procedure TFormMain.Image1Resize(Sender: TObject);
285begin
286 Engine.Lock.Acquire;
287 try
288 Image1.Picture.Bitmap.SetSize(Image1.Width, Image1.Height);
289 Engine.ResizePlayerFrames;
290 finally
291 Engine.Lock.Release;
292 end;
293end;
294
295end.
296
Note: See TracBrowser for help on using the repository browser.