close Warning: Can't synchronize with repository "(default)" (No changeset 184 in the repository). Look in the Trac log for more information.

source: tags/1.1.0/UCore.pas

Last change on this file was 134, checked in by chronos, 7 years ago
  • Added: Player starts units can be configured in player dialog.
File size: 12.5 KB
Line 
1unit UCore;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils, XMLConf, FileUtil, ActnList, Controls, Dialogs, Forms,
9 UGame, UApplicationInfo, UPersistentForm, UScaleDPI, UCoolTranslator,
10 URegistry, ULastOpenedList, Registry, Menus;
11
12type
13
14 { TCore }
15
16 TCore = class(TDataModule)
17 AAbout: TAction;
18 AShowCharts: TAction;
19 AHelp: TAction;
20 AGameSave: TAction;
21 AGameLoad: TAction;
22 ApplicationInfo: TApplicationInfo;
23 ASettings: TAction;
24 ActionList1: TActionList;
25 AExit: TAction;
26 AGameEnd: TAction;
27 AGameEndTurn: TAction;
28 AGameNew: TAction;
29 AGameRestart: TAction;
30 CoolTranslator1: TCoolTranslator;
31 ImageListLarge: TImageList;
32 ImageListSmall: TImageList;
33 LastOpenedList1: TLastOpenedList;
34 OpenDialog1: TOpenDialog;
35 PersistentForm: TPersistentForm;
36 SaveDialog1: TSaveDialog;
37 ScaleDPI1: TScaleDPI;
38 XMLConfig1: TXMLConfig;
39 procedure AAboutExecute(Sender: TObject);
40 procedure AExitExecute(Sender: TObject);
41 procedure AGameEndExecute(Sender: TObject);
42 procedure AGameEndTurnExecute(Sender: TObject);
43 procedure AGameLoadExecute(Sender: TObject);
44 procedure AGameNewExecute(Sender: TObject);
45 procedure AGameRestartExecute(Sender: TObject);
46 procedure AGameSaveExecute(Sender: TObject);
47 procedure AHelpExecute(Sender: TObject);
48 procedure ASettingsExecute(Sender: TObject);
49 procedure AShowChartsExecute(Sender: TObject);
50 procedure CoolTranslator1Translate(Sender: TObject);
51 procedure DataModuleCreate(Sender: TObject);
52 procedure DataModuleDestroy(Sender: TObject);
53 procedure LastOpenedList1Change(Sender: TObject);
54 private
55 FInitialized: Boolean;
56 StoredDimension: TControlDimension;
57 RegistryContext: TRegistryContext;
58 procedure LoadRecentExecute(Sender: TObject);
59 procedure ProcessComputerTurns;
60 procedure StartNewGame;
61 procedure DoPlayerChange(Sender: TObject);
62 procedure DoOnMove(CellFrom, CellTo: TCell; var CountOnce,
63 CountRepeat: Integer; Update: Boolean; var Confirm: Boolean);
64 procedure DoOnWin(Player: TPlayer);
65 procedure Delay(Time: Integer);
66 procedure GameNewTurnExecute(Sender: TObject);
67 procedure AutoSave;
68 function GetPlayer: TPlayer;
69 procedure LoadConfig;
70 procedure SaveConfig;
71 procedure CommandLineParams;
72 procedure ScaleDPI;
73 procedure SelectClient;
74 procedure LoadGame(FileName: string);
75 public
76 Game: TGame;
77 UseSingleView: Boolean;
78 DevelMode: Boolean;
79 AnimationSpeed: Integer;
80 AutoSaveEnabled: Boolean;
81 CurrentClient: TClient;
82 procedure UpdateActions;
83 procedure Init;
84 property Initialized: Boolean read FInitialized;
85 end;
86
87var
88 Core: TCore;
89
90
91implementation
92
93{$R *.lfm}
94
95uses
96 UFormMove, UFormMain, UFormNew, UFormSettings, UFormAbout, UFormPlayer,
97 UFormHelp, UFormCharts;
98
99const
100 DefaultRegKey = '\Software\Chronosoft\xTactics';
101
102resourcestring
103 SPlayerWins = 'Player %s wins';
104 SEndGame = 'End game?';
105 SEndGameQuestion = 'Do you want to end current game?';
106 SRestartGame = 'Restart game?';
107 SRestartGameQuestion = 'Do you want to restart current game?';
108
109
110{ TCore }
111
112procedure TCore.DoOnMove(CellFrom, CellTo: TCell; var CountOnce,
113 CountRepeat: Integer; Update: Boolean; var Confirm: Boolean);
114var
115 I: Integer;
116begin
117 if Update then FormMove.SpinEditOnce.MaxValue := CellFrom.GetAvialPower + CountOnce
118 else FormMove.SpinEditOnce.MaxValue := CellFrom.GetAvialPower;
119 FormMove.SpinEditOnce.Value := CountOnce;
120 FormMove.TrackBarOnce.Max := FormMove.SpinEditOnce.MaxValue;
121 FormMove.TrackBarOnce.Position := FormMove.SpinEditOnce.Value;
122 FormMove.SpinEditRepeat.MaxValue := Game.Map.MaxPower;
123 FormMove.SpinEditRepeat.Value := CountRepeat;
124 FormMove.TrackBarRepeat.Max := FormMove.SpinEditRepeat.MaxValue;
125 FormMove.TrackBarRepeat.Position := FormMove.SpinEditRepeat.Value;
126 FormMove.DefendCount := CellTo.Power;
127 // Attack count from other surrounding cells without current move if already exists
128 FormMove.AttackCount := 0;
129 for I := 0 to CellTo.MovesTo.Count - 1 do
130 if TUnitMove(CellTo.MovesTo[I]).CellFrom <> CellFrom then
131 FormMove.AttackCount := FormMove.AttackCount + TUnitMove(CellTo.MovesTo[I]).CountOnce;
132 FormMove.ShowWinProbability := CellTo.Player <> CellFrom.Player;
133
134 if FormMove.ShowModal = mrOk then begin
135 CountOnce := FormMove.SpinEditOnce.Value;
136 CountRepeat := FormMove.SpinEditRepeat.Value;
137 Confirm := True;
138 end else Confirm := False;
139end;
140
141procedure TCore.DoOnWin(Player: TPlayer);
142begin
143 FormMain.Redraw;
144 ShowMessage(Format(SPlayerWins, [Player.Name]));
145end;
146
147procedure TCore.Delay(Time: Integer);
148const
149 Slice = 50; // ms
150begin
151 while Time > 0 do begin
152 Application.ProcessMessages;
153 if Time > Slice then Sleep(Slice) else Sleep(Time);
154 Dec(Time, Slice);
155 end;
156end;
157
158procedure TCore.GameNewTurnExecute(Sender: TObject);
159begin
160 if AutoSaveEnabled then AutoSave;
161end;
162
163procedure TCore.AutoSave;
164var
165 OldFileName: string;
166begin
167 OldFileName := Game.FileName;
168 Game.SaveToFile(GetAppConfigDir(False) + 'AutoSave.xtg');
169 Game.FileName := OldFileName;
170end;
171
172function TCore.GetPlayer: TPlayer;
173begin
174 Result := Game.CurrentPlayer;
175end;
176
177procedure TCore.LoadConfig;
178begin
179 RegistryContext := RegContext(HKEY_CURRENT_USER, DefaultRegKey);
180 PersistentForm.RegistryContext := RegistryContext;
181 XMLConfig1.Filename := GetAppConfigDir(False) + 'Config.xml';
182
183 LastOpenedList1.LoadFromXMLConfig(XMLConfig1, 'RecentFiles');
184 DevelMode := XMLConfig1.GetValue('DevelMode', false);
185 AnimationSpeed := XMLConfig1.GetValue('AnimationSpeed', 50);
186 AutoSaveEnabled := XMLConfig1.GetValue('AutoSave', True);
187 CoolTranslator1.Language := CoolTranslator1.Languages.SearchByCode(String(XMLConfig1.GetValue('Language', '')));
188 ScaleDPI1.DPI := Point(XMLConfig1.GetValue('DPIX', 96), XMLConfig1.GetValue('DPIY', 96));
189 ScaleDPI1.AutoDetect := XMLConfig1.GetValue('DPIAuto', True);
190end;
191
192procedure TCore.SaveConfig;
193begin
194 XMLConfig1.SetValue('Language', WideString(CoolTranslator1.Language.Code));
195 LastOpenedList1.SaveToXMLConfig(XMLConfig1, 'RecentFiles');
196 XMLConfig1.SetValue('DevelMode', DevelMode);
197 XMLConfig1.SetValue('AnimationSpeed', AnimationSpeed);
198 XMLConfig1.SetValue('AutoSave', AutoSaveEnabled);
199 XMLConfig1.SetValue('DPIX', ScaleDPI1.DPI.X);
200 XMLConfig1.SetValue('DPIY', ScaleDPI1.DPI.Y);
201 XMLConfig1.SetValue('DPIAuto', ScaleDPI1.AutoDetect);
202end;
203
204procedure TCore.CommandLineParams;
205var
206 FileName: string;
207begin
208 // Command line parameter handling
209 if (ParamCount > 0) then begin
210 FileName := UTF8Encode(ParamStr(1));
211 if FileExists(FileName) then LoadGame(FileName);
212 end;
213end;
214
215procedure TCore.ScaleDPI;
216var
217 I: Integer;
218begin
219 {$ifdef DEBUG}
220 with Core.ScaleDPI1 do begin
221 //DesignDPI := Point(144, 144);
222 if (DesignDPI.X <> DPI.X) or (DesignDPI.Y <> DPI.Y) then begin
223 //ApplyToAll(DesignDPI);
224 FormNew.Show;
225 FormNew.Hide;
226 for I := 0 to Screen.FormCount - 1 do
227 if (Screen.Forms[I].WindowState = wsNormal) or
228 (Screen.Forms[I].WindowState = wsMinimized) then begin
229 StoreDimensions(Screen.Forms[I], StoredDimension);
230 ScaleDimensions(Screen.Forms[I], StoredDimension);
231 end;
232 ScaleImageList(Core.ImageListSmall, DesignDPI);
233 ScaleImageList(Core.ImageListLarge, DesignDPI);
234 end;
235 end;
236 {$endif}
237end;
238
239procedure TCore.SelectClient;
240var
241 FirstHuman: TPlayer;
242begin
243 FirstHuman := Game.Players.GetFirstHuman;
244 if Assigned(FirstHuman) then CurrentClient := FirstHuman.Client
245 else CurrentClient := TClient(Game.Clients.First);
246end;
247
248procedure TCore.UpdateActions;
249begin
250 Core.AGameEndTurn.Enabled := Core.Game.Running;
251 Core.AGameEnd.Enabled := Core.Game.Running;
252end;
253
254procedure TCore.AExitExecute(Sender: TObject);
255begin
256 Game.Running := False;
257 Application.Terminate;
258end;
259
260procedure TCore.AAboutExecute(Sender: TObject);
261begin
262 FormAbout := TFormAbout.Create(Self);
263 try
264 FormAbout.ShowModal;
265 finally
266 FreeAndNil(FormAbout);
267 end;
268end;
269
270procedure TCore.AGameEndExecute(Sender: TObject);
271begin
272 if MessageDlg(SEndGame, SEndGameQuestion, mtConfirmation, mbYesNo, 0) = mrYes then begin
273 Game.Running := False;
274 FormMain.Redraw;
275 UpdateActions;
276 end;
277end;
278
279procedure TCore.ProcessComputerTurns;
280var
281 Computer: TComputer;
282begin
283 while Game.Running and (Game.CurrentPlayer.Mode <> pmHuman) do begin
284 if Game.CurrentPlayer.Mode = pmComputer then begin
285 Computer := TComputer.Create;
286 try
287 Computer.Game := Game;
288 Computer.Process;
289 finally
290 Computer.Free;
291 end;
292 FormMain.Redraw;
293 Delay(Trunc((100 - AnimationSpeed) / 100 * 2000));
294 end;
295 Game.NextTurn;
296 FormMain.Redraw;
297 Application.ProcessMessages;
298 Sleep(1);
299 end;
300end;
301
302procedure TCore.AGameEndTurnExecute(Sender: TObject);
303begin
304 Game.NextTurn;
305 FormMain.Redraw;
306 ProcessComputerTurns;
307 UpdateActions;
308end;
309
310procedure TCore.AGameLoadExecute(Sender: TObject);
311begin
312 if (Game.FileName = '') and (LastOpenedList1.Items.Count > 0) then
313 OpenDialog1.FileName := LastOpenedList1.Items[0]
314 else OpenDialog1.FileName := Game.FileName;
315 if OpenDialog1.Execute then begin
316 LoadGame(OpenDialog1.FileName);
317 end;
318end;
319
320procedure TCore.AGameNewExecute(Sender: TObject);
321begin
322 FormNew.Load(Game);
323 if FormNew.ShowModal = mrOk then begin
324 FormNew.Save(Game);
325 StartNewGame;
326 end;
327end;
328
329procedure TCore.AGameRestartExecute(Sender: TObject);
330begin
331 if MessageDlg(SRestartGame, SRestartGameQuestion, mtConfirmation, mbYesNo, 0) = mrYes then begin
332 StartNewGame;
333 end;
334end;
335
336procedure TCore.AGameSaveExecute(Sender: TObject);
337begin
338 if (Game.FileName = '') and (LastOpenedList1.Items.Count > 0) then
339 SaveDialog1.FileName := ExtractFileDir(LastOpenedList1.Items[0])
340 else SaveDialog1.FileName := Game.FileName;
341 if SaveDialog1.Execute then begin
342 Game.SaveToFile(SaveDialog1.FileName);
343 LastOpenedList1.AddItem(SaveDialog1.FileName);
344 end;
345end;
346
347procedure TCore.AHelpExecute(Sender: TObject);
348begin
349 FormHelp := TFormHelp.Create(Self);
350 try
351 FormHelp.ShowModal;
352 finally
353 FreeAndNil(FormHelp);
354 end;
355end;
356
357procedure TCore.ASettingsExecute(Sender: TObject);
358begin
359 FormSettings.Load;
360 if FormSettings.ShowModal = mrOk then begin
361 FormSettings.Save;
362 Game.SaveConfig(XMLConfig1, 'Game');
363 end;
364end;
365
366procedure TCore.AShowChartsExecute(Sender: TObject);
367begin
368 FormCharts.Show;
369end;
370
371procedure TCore.CoolTranslator1Translate(Sender: TObject);
372begin
373 UGame.InitStrings;
374 FormNew.Translate;
375 FormPlayer.Translate;
376end;
377
378procedure TCore.DataModuleCreate(Sender: TObject);
379begin
380 Game := TGame.Create;
381 Game.OnMove := DoOnMove;
382 Game.OnWin := DoOnWin;
383 Game.OnNewTurn := GameNewTurnExecute;
384 Game.OnPlayerChange := DoPlayerChange;
385 StoredDimension := TControlDimension.Create;
386 XMLConfig1.Filename := GetAppConfigDir(False) + 'Config.xml';
387 ForceDirectories(GetAppConfigDir(False));
388end;
389
390procedure TCore.DataModuleDestroy(Sender: TObject);
391begin
392 StoredDimension.Free;;
393 Game.SaveConfig(XMLConfig1, 'Game');
394 SaveConfig;
395 FreeAndNil(Game);
396end;
397
398procedure TCore.LastOpenedList1Change(Sender: TObject);
399begin
400 LastOpenedList1.LoadToMenuItem(FormMain.MenuItemLoadRecent, LoadRecentExecute);
401end;
402
403procedure TCore.LoadRecentExecute(Sender: TObject);
404begin
405 LoadGame((Sender as TMenuItem).Caption);
406end;
407
408procedure TCore.LoadGame(FileName: string);
409begin
410 Game.LoadFromFile(FileName);
411 SelectClient;
412 LastOpenedList1.AddItem(FileName);
413 with Core.CurrentClient do
414 View.DestRect := Bounds(0, 0, FormMain.PaintBox1.Width, FormMain.PaintBox1.Height);
415 FormMain.AZoomAll.Execute;
416 FormMain.Redraw;
417 if FormCharts.Visible then FormCharts.Redraw;
418end;
419
420procedure TCore.StartNewGame;
421begin
422 Game.New;
423 SelectClient;
424 Game.Running := True;
425 FormMain.Redraw;
426 if FormCharts.Visible then FormCharts.Redraw;
427 ProcessComputerTurns;
428 UpdateActions;
429end;
430
431procedure TCore.DoPlayerChange(Sender: TObject);
432begin
433 if Assigned(Game.CurrentPlayer) and Assigned(Game.CurrentPlayer.Client) then
434 CurrentClient := Game.CurrentPlayer.Client;
435 if FormCharts.Visible then FormCharts.Redraw;
436end;
437
438procedure TCore.Init;
439begin
440 if not Core.Initialized then begin
441 {$IFDEF Linux}
442 // If installed in Linux system then use installation directory for po files
443 if Application.ExeName = '/usr/bin/xtactics' then
444 CoolTranslator1.POFilesFolder := '/usr/share/xtactics/languages';
445 {$ENDIF}
446 FInitialized := True;
447
448 LoadConfig;
449 Game.LoadConfig(XMLConfig1, 'Game');
450
451 // Update translated default player names
452 TPlayer(Game.Players[0]).Name := SPlayer + ' 1';
453 TPlayer(Game.Players[1]).Name := SPlayer + ' 2';
454
455 CommandLineParams;
456 ScaleDPI;
457
458 if Game.FileName = '' then StartNewGame;
459 end;
460end;
461
462end.
463
Note: See TracBrowser for help on using the repository browser.