source: trunk/UCore.pas

Last change on this file was 84, checked in by chronos, 3 years ago
  • Fixed: Use clear background color under score text instead of solid.
  • Fixed: Missing snap package x11 plug.
  • Fixed: Snap package was not able to use language files.
  • Modified: Build snap using lxd instead of multipass.
File size: 5.8 KB
Line 
1unit UCore;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils, UTheme, UPersistentForm, UApplicationInfo, UTranslator,
9 URegistry, UAboutDialog, UGame, ActnList, Forms, Controls, Dialogs;
10
11type
12
13 { TCore }
14
15 TCore = class(TDataModule)
16 AAbout: TAction;
17 AboutDialog1: TAboutDialog;
18 AComputer: TAction;
19 AHistory: TAction;
20 AHelp: TAction;
21 AUndo: TAction;
22 ASettings: TAction;
23 ActionList1: TActionList;
24 AExit: TAction;
25 ANew: TAction;
26 ApplicationInfo1: TApplicationInfo;
27 PersistentForm1: TPersistentForm;
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 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
58implementation
59
60{$R *.lfm}
61
62uses
63 UFormMain, UFormSettings, UFormNew, UFormHelp, UFormComputer,
64 UFormHistory;
65
66resourcestring
67 SGameOverCaption = 'Lost';
68 SGameOverMessage = 'Game over!';
69 SWinCaption = 'Win';
70 SWinMessage = 'You reached %s and won! You can continue to play to get higher score.';
71
72{ TCore }
73
74procedure TCore.DataModuleCreate(Sender: TObject);
75const
76 LinuxLanguagesDir = '/usr/share/Game2048/languages';
77begin
78 {$IFDEF Linux}
79 // If installed in Linux system then use installation directory for po files
80 if not DirectoryExists(Translator1.POFilesFolder) and DirectoryExists(LinuxLanguagesDir) then
81 Translator1.POFilesFolder := LinuxLanguagesDir;
82 {$ENDIF}
83
84 Randomize;
85 Game := TGame.Create;
86 Game.Board.Size := Point(4, 4);
87 Game.OnChange := GameChange;
88 Game.OnPaint := GamePaint;
89 Game.OnWin := GameWin;
90 Game.OnGameOver := GameOver;
91 LoadConfig;
92end;
93
94procedure TCore.ASettingsExecute(Sender: TObject);
95begin
96 FormSettings := TFormSettings.Create(nil);
97 try
98 if FormSettings.ShowModal = mrOk then begin
99 FormMain.Redraw;
100 FormMain.UpdateInterface;
101 UpdateInterface;
102 end;
103 finally
104 FreeAndNil(FormSettings);
105 end;
106end;
107
108procedure TCore.AUndoExecute(Sender: TObject);
109begin
110 Game.Undo;
111end;
112
113procedure TCore.AAboutExecute(Sender: TObject);
114begin
115 AboutDialog1.Show;
116end;
117
118procedure TCore.AComputerExecute(Sender: TObject);
119begin
120 FormComputer := TFormComputer.Create(nil);
121 try
122 FormComputer.ShowModal;
123 finally
124 FreeAndNil(FormComputer);
125 end;
126end;
127
128procedure TCore.AExitExecute(Sender: TObject);
129begin
130 FormMain.Close;
131end;
132
133procedure TCore.AHelpExecute(Sender: TObject);
134begin
135 FormHelp := TFormHelp.Create(nil);
136 try
137 FormHelp.ShowModal;
138 finally
139 FreeAndNil(FormHelp);
140 end;
141end;
142
143procedure TCore.AHistoryExecute(Sender: TObject);
144begin
145 FormHistory := TFormHistory.Create(nil);
146 try
147 FormHistory.ShowModal;
148 finally
149 FreeAndNil(FormHistory);
150 end;
151end;
152
153procedure TCore.ANewExecute(Sender: TObject);
154begin
155 FormNew := TFormNew.Create(nil);
156 try
157 FormNew.Load(Core.Game);
158 if FormNew.ShowModal = mrOk then begin
159 FormNew.Save(Core.Game);
160 Game.New;
161 UpdateInterface;
162 FormMain.UpdateInterface;
163 end;
164 finally
165 FreeAndNil(FormNew);
166 end;
167end;
168
169procedure TCore.DataModuleDestroy(Sender: TObject);
170begin
171 SaveConfig;
172 FreeAndNil(Game);
173end;
174
175procedure TCore.Translator1Translate(Sender: TObject);
176begin
177 UGame.Translate;
178end;
179
180procedure TCore.GameChange(Sender: TObject);
181begin
182 UpdateInterface;
183end;
184
185procedure TCore.GamePaint(Sender: TObject);
186begin
187 if Assigned(FormMain) then FormMain.Redraw;
188end;
189
190procedure TCore.GameWin(Sender: TObject);
191begin
192 TThread.Synchronize(FormMain.MoveThread, GameWinSync);
193end;
194
195procedure TCore.GameWinSync;
196begin
197 MessageDlg(SWinCaption, Format(SWinMessage, [Game.GetTileSkinValue(Game.WinTileValue)]), mtInformation, [mbOk], 0);
198end;
199
200procedure TCore.GameOver(Sender: TObject);
201begin
202 TThread.Synchronize(FormMain.MoveThread, GameOverSync);
203end;
204
205procedure TCore.GameOverSync;
206begin
207 MessageDlg(SGameOverCaption, SGameOverMessage, mtInformation, [mbOK], 0);
208end;
209
210procedure TCore.UpdateInterface;
211begin
212 AUndo.Enabled := Game.CanUndo;
213 AHistory.Enabled := Game.RecordHistory;
214 {$IFDEF DEBUG}
215 AComputer.Enabled := True;
216 AComputer.Visible := True;
217 {$ELSE}
218 AComputer.Enabled := False;
219 AComputer.Visible := False;
220 {$ENDIF}
221end;
222
223procedure TCore.LoadConfig;
224begin
225 with TRegistryEx.Create do
226 try
227 CurrentContext := ApplicationInfo1.GetRegistryContext;
228
229 if ValueExists('LanguageCode') then
230 Translator1.Language := Translator1.Languages.SearchByCode(ReadStringWithDefault('LanguageCode', ''))
231 else Translator1.Language := Translator1.Languages.SearchByCode('');
232 ThemeManager1.Theme := ThemeManager1.Themes.FindByName(ReadStringWithDefault('Theme', 'System'));
233 finally
234 Free;
235 end;
236 Game.LoadFromRegistry(ApplicationInfo1.GetRegistryContext);
237end;
238
239procedure TCore.SaveConfig;
240begin
241 with TRegistryEx.Create do
242 try
243 CurrentContext := ApplicationInfo1.GetRegistryContext;
244
245 if Assigned(Translator1.Language) and (Translator1.Language.Code <> '') then
246 WriteString('LanguageCode', Translator1.Language.Code)
247 else DeleteValue('LanguageCode');
248 WriteString('Theme', ThemeManager1.Theme.Name);
249 finally
250 Free;
251 end;
252 Game.SaveToRegistry(ApplicationInfo1.GetRegistryContext);
253end;
254
255end.
256
Note: See TracBrowser for help on using the repository browser.