source: trunk/Forms/FormMain.pas

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