source: trunk/Core.pas

Last change on this file was 115, checked in by chronos, 7 months ago
  • Modified: Automatically detect and use dark mode on Windows.
  • Modified: Use dark mode title bar on Windows 10.
File size: 8.2 KB
Line 
1unit Core;
2
3interface
4
5uses
6 Classes, SysUtils, Theme, PersistentForm, ApplicationInfo, Translator,
7 RegistryEx, ScaleDPI, Game, ActnList, Forms, Controls, Dialogs, Score;
8
9type
10
11 { TCore }
12
13 TCore = class(TDataModule)
14 AAbout: TAction;
15 AComputer: TAction;
16 AScore: TAction;
17 ARestart: TAction;
18 AHistory: TAction;
19 AHelp: TAction;
20 AUndo: TAction;
21 ASettings: TAction;
22 ActionList1: TActionList;
23 AExit: TAction;
24 ANew: TAction;
25 ApplicationInfo1: TApplicationInfo;
26 PersistentForm1: TPersistentForm;
27 ScaleDPI1: TScaleDPI;
28 ThemeManager1: TThemeManager;
29 Translator1: TTranslator;
30 procedure AAboutExecute(Sender: TObject);
31 procedure AComputerExecute(Sender: TObject);
32 procedure AExitExecute(Sender: TObject);
33 procedure AHelpExecute(Sender: TObject);
34 procedure AHistoryExecute(Sender: TObject);
35 procedure ANewExecute(Sender: TObject);
36 procedure ARestartExecute(Sender: TObject);
37 procedure AScoreExecute(Sender: TObject);
38 procedure ASettingsExecute(Sender: TObject);
39 procedure AUndoExecute(Sender: TObject);
40 procedure DataModuleCreate(Sender: TObject);
41 procedure DataModuleDestroy(Sender: TObject);
42 procedure Translator1Translate(Sender: TObject);
43 private
44 procedure GameChange(Sender: TObject);
45 procedure GamePaint(Sender: TObject);
46 procedure GameWin(Sender: TObject);
47 procedure GameWinSync;
48 procedure GameOver(Sender: TObject);
49 procedure GameOverSync;
50 procedure UpdateScores;
51 public
52 Game: TGame;
53 Scores: TScores;
54 procedure UpdateInterface;
55 procedure LoadConfig;
56 procedure SaveConfig;
57 end;
58
59var
60 Core: TCore;
61
62
63implementation
64
65{$R *.lfm}
66
67uses
68 FormMain, FormSettings, FormNew, FormHelp, FormComputer, FormAbout, FormEx,
69 FormHistory, FormScore;
70
71resourcestring
72 SGameOverCaption = 'Lost';
73 SGameOverMessage = 'Game over!';
74 SWinCaption = 'Win';
75 SWinMessage = 'You reached %s and won! You can continue to play to get higher score.';
76
77procedure Translate;
78begin
79 Game.Translate;
80end;
81
82{ TCore }
83
84procedure TCore.DataModuleCreate(Sender: TObject);
85const
86 LinuxLanguagesDir = '/usr/share/Game2048/languages';
87begin
88 {$IFDEF Linux}
89 // If installed in Linux system then use installation directory for po files
90 if not DirectoryExists(Translator1.POFilesFolder) and DirectoryExists(LinuxLanguagesDir) then
91 Translator1.POFilesFolder := LinuxLanguagesDir;
92 {$ENDIF}
93
94 Randomize;
95 Scores := TScores.Create;
96
97 Game := TGame.Create;
98 Game.Board.Size := Point(4, 4);
99 Game.OnChange := GameChange;
100 Game.OnPaint := GamePaint;
101 Game.OnWin := GameWin;
102 Game.OnGameOver := GameOver;
103 LoadConfig;
104
105 TFormEx.ScaleDPI := ScaleDPI1;
106 TFormEx.Translator := Translator1;
107 TFormEx.ThemeManager := ThemeManager1;
108 TFormEx.PersistentForm := PersistentForm1;
109end;
110
111procedure TCore.ASettingsExecute(Sender: TObject);
112var
113 FormSettings: TFormSettings;
114begin
115 FormSettings := TFormSettings.Create(nil);
116 try
117 if FormSettings.ShowModal = mrOk then begin
118 FormMain.FormMain.Redraw;
119 FormMain.FormMain.UpdateInterface;
120 ThemeManager1.UseTheme(FormMain.FormMain);
121 UpdateInterface;
122 end;
123 finally
124 FreeAndNil(FormSettings);
125 end;
126end;
127
128procedure TCore.AUndoExecute(Sender: TObject);
129begin
130 Game.Undo;
131end;
132
133procedure TCore.AAboutExecute(Sender: TObject);
134var
135 FormAbout: TFormAbout;
136begin
137 FormAbout := TFormAbout.Create(nil);
138 try
139 FormAbout.ApplicationInfo := ApplicationInfo1;
140 FormAbout.ShowModal;
141 finally
142 FormAbout.Free;
143 end;
144end;
145
146procedure TCore.AComputerExecute(Sender: TObject);
147var
148 FormComputer: TFormComputer;
149begin
150 FormComputer := TFormComputer.Create(nil);
151 try
152 FormComputer.ShowModal;
153 finally
154 FreeAndNil(FormComputer);
155 end;
156end;
157
158procedure TCore.AExitExecute(Sender: TObject);
159begin
160 FormMain.FormMain.Close;
161end;
162
163procedure TCore.AHelpExecute(Sender: TObject);
164var
165 FormHelp: TFormHelp;
166begin
167 FormHelp := TFormHelp.Create(nil);
168 try
169 FormHelp.ShowModal;
170 finally
171 FreeAndNil(FormHelp);
172 end;
173end;
174
175procedure TCore.AHistoryExecute(Sender: TObject);
176var
177 FormHistory: TFormHistory;
178begin
179 FormHistory := TFormHistory.Create(nil);
180 try
181 FormHistory.ShowModal;
182 finally
183 FreeAndNil(FormHistory);
184 end;
185end;
186
187procedure TCore.ANewExecute(Sender: TObject);
188var
189 FormNew: TFormNew;
190begin
191 UpdateScores;
192 FormNew := TFormNew.Create(nil);
193 try
194 FormNew.Load(Core.Game);
195 if FormNew.ShowModal = mrOk then begin
196 FormNew.Save(Core.Game);
197 Game.New;
198 UpdateInterface;
199 FormMain.FormMain.UpdateInterface;
200 end;
201 finally
202 FreeAndNil(FormNew);
203 end;
204end;
205
206procedure TCore.ARestartExecute(Sender: TObject);
207begin
208 UpdateScores;
209 Game.Restart;
210 UpdateInterface;
211 FormMain.FormMain.UpdateInterface;
212end;
213
214procedure TCore.AScoreExecute(Sender: TObject);
215var
216 FormScore: TFormScore;
217begin
218 UpdateScores;
219 FormScore := TFormScore.Create(nil);
220 try
221 FormScore.Scores := Scores;
222 if FormScore.ShowModal = mrOk then begin
223 end;
224 finally
225 FreeAndNil(FormScore);
226 end;
227end;
228
229procedure TCore.DataModuleDestroy(Sender: TObject);
230begin
231 UpdateScores;
232 SaveConfig;
233 FreeAndNil(Game);
234 FreeAndNil(Scores);
235end;
236
237procedure TCore.Translator1Translate(Sender: TObject);
238begin
239 Translate;
240end;
241
242procedure TCore.GameChange(Sender: TObject);
243begin
244 UpdateInterface;
245end;
246
247procedure TCore.GamePaint(Sender: TObject);
248begin
249 if Assigned(FormMain.FormMain) then FormMain.FormMain.Redraw;
250end;
251
252procedure TCore.GameWin(Sender: TObject);
253begin
254 TThread.Synchronize(FormMain.FormMain.MoveThread, GameWinSync);
255end;
256
257procedure TCore.GameWinSync;
258begin
259 MessageDlg(SWinCaption, Format(SWinMessage, [Game.GetTileSkinValue(Game.WinTileValue)]), mtInformation, [mbOk], 0);
260 UpdateScores;
261end;
262
263procedure TCore.GameOver(Sender: TObject);
264begin
265 TThread.Synchronize(FormMain.FormMain.MoveThread, GameOverSync);
266end;
267
268procedure TCore.GameOverSync;
269begin
270 MessageDlg(SGameOverCaption, SGameOverMessage, mtInformation, [mbOK], 0);
271 UpdateScores;
272end;
273
274procedure TCore.UpdateScores;
275var
276 Score: TScore;
277begin
278 if Game.Score = 0 then Exit; // Do not record zero score
279
280 Score := Scores.SearchByTime(Game.StartTime);
281 if not Assigned(Score) then Score := Scores.AddNew;
282 Score.StartTime := Game.StartTime;
283 Score.Score := Game.Score;
284 Score.Moves := Game.Moves;
285 Score.UsedUndos := Game.UsedUndos;
286 Score.BoardSize := IntToStr(Game.Board.Size.X) + 'x' + IntToStr(Game.Board.Size.Y);
287 Score.DisabledTiles := Game.DisabledTilesCount;
288 Score.UnmergeableTiles := Game.UnmergeableTilesCount;
289 Score.Duration := Now - Game.StartTime;
290 Score.BiggestTile := Game.Board.GetBiggestTile;
291end;
292
293procedure TCore.UpdateInterface;
294begin
295 AUndo.Enabled := Game.CanUndo;
296 AHistory.Enabled := Game.RecordHistory;
297 {$IFDEF DEBUG}
298 AComputer.Enabled := True;
299 AComputer.Visible := True;
300 {$ELSE}
301 AComputer.Enabled := False;
302 AComputer.Visible := False;
303 {$ENDIF}
304end;
305
306procedure TCore.LoadConfig;
307var
308 Reg: TRegistryEx;
309 RegContext: TRegistryContext;
310begin
311 Reg := TRegistryEx.Create;
312 with Reg do
313 try
314 CurrentContext := ApplicationInfo1.GetRegistryContext;
315
316 if ValueExists('LanguageCode') then
317 Translator1.Language := Translator1.Languages.SearchByCode(ReadStringWithDefault('LanguageCode', ''))
318 else Translator1.Language := Translator1.Languages.SearchByCode('');
319 ThemeManager1.Theme := ThemeManager1.Themes.FindByName(ReadStringWithDefault('Theme', 'System'));
320
321 RegContext := ApplicationInfo1.GetRegistryContext;
322 Game.LoadFromRegistry(Reg, RegContext);
323 Scores.LoadFromRegistry(Reg, TRegistryContext.Create(RegContext.RootKey, RegContext.Key + '\Scores'));
324 finally
325 Reg.Free;
326 end;
327end;
328
329procedure TCore.SaveConfig;
330var
331 Reg: TRegistryEx;
332 RegContext: TRegistryContext;
333begin
334 Reg := TRegistryEx.Create;
335 with Reg do
336 try
337 CurrentContext := ApplicationInfo1.GetRegistryContext;
338
339 if Assigned(Translator1.Language) and (Translator1.Language.Code <> '') then
340 WriteString('LanguageCode', Translator1.Language.Code)
341 else DeleteValue('LanguageCode');
342 WriteString('Theme', ThemeManager1.Theme.Name);
343
344 RegContext := ApplicationInfo1.GetRegistryContext;
345 Game.SaveToRegistry(Reg, RegContext);
346 Scores.SaveToRegistry(Reg, TRegistryContext.Create(RegContext.RootKey, RegContext.Key + '\Scores'));
347 finally
348 Reg.Free;
349 end;
350end;
351
352end.
353
Note: See TracBrowser for help on using the repository browser.