source: trunk/Core.pas

Last change on this file was 91, checked in by chronos, 3 months ago
  • Added: Flatpak build files.
  • Added: Game menu restart action to start a new game without showing options dialog.
  • Fixed: Fullscreen error after another window was opened.
File size: 6.6 KB
Line 
1unit Core;
2
3interface
4
5uses
6 Classes, SysUtils, Theme, PersistentForm, ApplicationInfo, Translator,
7 RegistryEx, ScaleDPI, Game, ActnList, Forms, Controls, Dialogs;
8
9type
10
11 { TCore }
12
13 TCore = class(TDataModule)
14 AAbout: TAction;
15 AComputer: TAction;
16 ARestart: TAction;
17 AHistory: TAction;
18 AHelp: TAction;
19 AUndo: TAction;
20 ASettings: TAction;
21 ActionList1: TActionList;
22 AExit: TAction;
23 ANew: TAction;
24 ApplicationInfo1: TApplicationInfo;
25 PersistentForm1: TPersistentForm;
26 ScaleDPI1: TScaleDPI;
27 ThemeManager1: TThemeManager;
28 Translator1: TTranslator;
29 procedure AAboutExecute(Sender: TObject);
30 procedure AComputerExecute(Sender: TObject);
31 procedure AExitExecute(Sender: TObject);
32 procedure AHelpExecute(Sender: TObject);
33 procedure AHistoryExecute(Sender: TObject);
34 procedure ANewExecute(Sender: TObject);
35 procedure ARestartExecute(Sender: TObject);
36 procedure ASettingsExecute(Sender: TObject);
37 procedure AUndoExecute(Sender: TObject);
38 procedure DataModuleCreate(Sender: TObject);
39 procedure DataModuleDestroy(Sender: TObject);
40 procedure Translator1Translate(Sender: TObject);
41 private
42 procedure GameChange(Sender: TObject);
43 procedure GamePaint(Sender: TObject);
44 procedure GameWin(Sender: TObject);
45 procedure GameWinSync;
46 procedure GameOver(Sender: TObject);
47 procedure GameOverSync;
48 public
49 Game: TGame;
50 procedure UpdateInterface;
51 procedure LoadConfig;
52 procedure SaveConfig;
53 end;
54
55var
56 Core: TCore;
57
58
59implementation
60
61{$R *.lfm}
62
63uses
64 FormMain, FormSettings, FormNew, FormHelp, FormComputer, FormAbout, FormEx,
65 FormHistory;
66
67resourcestring
68 SGameOverCaption = 'Lost';
69 SGameOverMessage = 'Game over!';
70 SWinCaption = 'Win';
71 SWinMessage = 'You reached %s and won! You can continue to play to get higher score.';
72
73procedure Translate;
74begin
75 Game.Translate;
76end;
77
78{ TCore }
79
80procedure TCore.DataModuleCreate(Sender: TObject);
81const
82 LinuxLanguagesDir = '/usr/share/Game2048/languages';
83begin
84 {$IFDEF Linux}
85 // If installed in Linux system then use installation directory for po files
86 if not DirectoryExists(Translator1.POFilesFolder) and DirectoryExists(LinuxLanguagesDir) then
87 Translator1.POFilesFolder := LinuxLanguagesDir;
88 {$ENDIF}
89
90 Randomize;
91 Game := TGame.Create;
92 Game.Board.Size := Point(4, 4);
93 Game.OnChange := GameChange;
94 Game.OnPaint := GamePaint;
95 Game.OnWin := GameWin;
96 Game.OnGameOver := GameOver;
97 LoadConfig;
98
99 TFormEx.ScaleDPI := ScaleDPI1;
100 TFormEx.Translator := Translator1;
101 TFormEx.ThemeManager := ThemeManager1;
102 TFormEx.PersistentForm := PersistentForm1;
103end;
104
105procedure TCore.ASettingsExecute(Sender: TObject);
106var
107 FormSettings: TFormSettings;
108begin
109 FormSettings := TFormSettings.Create(nil);
110 try
111 if FormSettings.ShowModal = mrOk then begin
112 FormMain.FormMain.Redraw;
113 FormMain.FormMain.UpdateInterface;
114 UpdateInterface;
115 end;
116 finally
117 FreeAndNil(FormSettings);
118 end;
119end;
120
121procedure TCore.AUndoExecute(Sender: TObject);
122begin
123 Game.Undo;
124end;
125
126procedure TCore.AAboutExecute(Sender: TObject);
127var
128 FormAbout: TFormAbout;
129begin
130 FormAbout := TFormAbout.Create(nil);
131 try
132 FormAbout.ApplicationInfo := ApplicationInfo1;
133 FormAbout.ShowModal;
134 finally
135 FormAbout.Free;
136 end;
137end;
138
139procedure TCore.AComputerExecute(Sender: TObject);
140var
141 FormComputer: TFormComputer;
142begin
143 FormComputer := TFormComputer.Create(nil);
144 try
145 FormComputer.ShowModal;
146 finally
147 FreeAndNil(FormComputer);
148 end;
149end;
150
151procedure TCore.AExitExecute(Sender: TObject);
152begin
153 FormMain.FormMain.Close;
154end;
155
156procedure TCore.AHelpExecute(Sender: TObject);
157var
158 FormHelp: TFormHelp;
159begin
160 FormHelp := TFormHelp.Create(nil);
161 try
162 FormHelp.ShowModal;
163 finally
164 FreeAndNil(FormHelp);
165 end;
166end;
167
168procedure TCore.AHistoryExecute(Sender: TObject);
169var
170 FormHistory: TFormHistory;
171begin
172 FormHistory := TFormHistory.Create(nil);
173 try
174 FormHistory.ShowModal;
175 finally
176 FreeAndNil(FormHistory);
177 end;
178end;
179
180procedure TCore.ANewExecute(Sender: TObject);
181var
182 FormNew: TFormNew;
183begin
184 FormNew := TFormNew.Create(nil);
185 try
186 FormNew.Load(Core.Game);
187 if FormNew.ShowModal = mrOk then begin
188 FormNew.Save(Core.Game);
189 Game.New;
190 UpdateInterface;
191 FormMain.FormMain.UpdateInterface;
192 end;
193 finally
194 FreeAndNil(FormNew);
195 end;
196end;
197
198procedure TCore.ARestartExecute(Sender: TObject);
199begin
200 Game.New;
201 UpdateInterface;
202 FormMain.FormMain.UpdateInterface;
203end;
204
205procedure TCore.DataModuleDestroy(Sender: TObject);
206begin
207 SaveConfig;
208 FreeAndNil(Game);
209end;
210
211procedure TCore.Translator1Translate(Sender: TObject);
212begin
213 Translate;
214end;
215
216procedure TCore.GameChange(Sender: TObject);
217begin
218 UpdateInterface;
219end;
220
221procedure TCore.GamePaint(Sender: TObject);
222begin
223 if Assigned(FormMain.FormMain) then FormMain.FormMain.Redraw;
224end;
225
226procedure TCore.GameWin(Sender: TObject);
227begin
228 TThread.Synchronize(FormMain.FormMain.MoveThread, GameWinSync);
229end;
230
231procedure TCore.GameWinSync;
232begin
233 MessageDlg(SWinCaption, Format(SWinMessage, [Game.GetTileSkinValue(Game.WinTileValue)]), mtInformation, [mbOk], 0);
234end;
235
236procedure TCore.GameOver(Sender: TObject);
237begin
238 TThread.Synchronize(FormMain.FormMain.MoveThread, GameOverSync);
239end;
240
241procedure TCore.GameOverSync;
242begin
243 MessageDlg(SGameOverCaption, SGameOverMessage, mtInformation, [mbOK], 0);
244end;
245
246procedure TCore.UpdateInterface;
247begin
248 AUndo.Enabled := Game.CanUndo;
249 AHistory.Enabled := Game.RecordHistory;
250 {$IFDEF DEBUG}
251 AComputer.Enabled := True;
252 AComputer.Visible := True;
253 {$ELSE}
254 AComputer.Enabled := False;
255 AComputer.Visible := False;
256 {$ENDIF}
257end;
258
259procedure TCore.LoadConfig;
260begin
261 with TRegistryEx.Create do
262 try
263 CurrentContext := ApplicationInfo1.GetRegistryContext;
264
265 if ValueExists('LanguageCode') then
266 Translator1.Language := Translator1.Languages.SearchByCode(ReadStringWithDefault('LanguageCode', ''))
267 else Translator1.Language := Translator1.Languages.SearchByCode('');
268 ThemeManager1.Theme := ThemeManager1.Themes.FindByName(ReadStringWithDefault('Theme', 'System'));
269 finally
270 Free;
271 end;
272 Game.LoadFromRegistry(ApplicationInfo1.GetRegistryContext);
273end;
274
275procedure TCore.SaveConfig;
276begin
277 with TRegistryEx.Create do
278 try
279 CurrentContext := ApplicationInfo1.GetRegistryContext;
280
281 if Assigned(Translator1.Language) and (Translator1.Language.Code <> '') then
282 WriteString('LanguageCode', Translator1.Language.Code)
283 else DeleteValue('LanguageCode');
284 WriteString('Theme', ThemeManager1.Theme.Name);
285 finally
286 Free;
287 end;
288 Game.SaveToRegistry(ApplicationInfo1.GetRegistryContext);
289end;
290
291end.
292
Note: See TracBrowser for help on using the repository browser.