Subversion Repositories jumper

Rev

Rev 9 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 daniel-mar 1
unit Finish;
2
 
3
interface
4
 
5
uses
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
21 daniel-mar 7
  Dialogs, StdCtrls, MMSystem, Math, ExtCtrls, Registry, LevelFunctions;
1 daniel-mar 8
 
9
type
10
  TFinishForm = class(TForm)
11
    Label1: TLabel;
12
    Label2: TLabel;
13
    SaveBtn: TButton;
14
    CancelBtn: TButton;
15
    NameEdit: TEdit;
16
    PerformanceMemo: TMemo;
17
    Label3: TLabel;
18
    CupImage: TImage;
19
    ReplayCheckBox: TCheckBox;
20
    JumpHistoryLink: TLabel;
21
    procedure CancelBtnClick(Sender: TObject);
22
    procedure SaveBtnClick(Sender: TObject);
23
    procedure JumpHistoryLinkClick(Sender: TObject);
24
    procedure FormCreate(Sender: TObject);
25
  private
26
    FLevel: String;
27
    FScore: integer;
28
    FStonesTotal: integer;
29
    FStonesRemoved: integer;
30
    FSeconds: integer;
31
    FHistory: TStringList;
8 daniel-mar 32
    FGoalStatus: TGoalStatus;
1 daniel-mar 33
    procedure SaveToJournal(PlayerName: String; Score, StonesTotal, StonesRemoved, Seconds: Integer);
34
    procedure LoadSettings;
35
  public
36
    procedure SaveSettings;
8 daniel-mar 37
    function Execute(LevelName: String; Score, StonesTotal, StonesRemoved, Seconds: Integer; GoalStatus: TGoalStatus; JumpHistory: TStringList): Integer;
1 daniel-mar 38
  end;
39
 
40
var
41
  FinishForm: TFinishForm;
42
 
43
implementation
44
 
45
uses
21 daniel-mar 46
  History, Constants;
1 daniel-mar 47
 
48
{$R *.dfm}
49
 
50
procedure TFinishForm.CancelBtnClick(Sender: TObject);
51
begin
52
  Close;
53
end;
54
 
8 daniel-mar 55
function TFinishForm.Execute(LevelName: String; Score, StonesTotal, StonesRemoved, Seconds: Integer; GoalStatus: TGoalStatus; JumpHistory: TStringList): Integer;
21 daniel-mar 56
resourcestring
57
  LNG_SCORE = 'Score: %d';
58
  LNG_REMAINING = 'Remaining stones: %d (%f%%)';
59
  LNG_TIME_SECONDS = 'Time: %d seconds';
60
  LNG_POINTS_PER_MINUTE = '%d points per minute';
61
  LNG_GOAL_RED = 'Red stone in target field (%d points)';
62
  LNG_GOAL_YELLOW = 'Yellow stone in target field (%d points)';
63
  LNG_GOAL_GREEN = 'Green stone in target field (%d points)';
64
  LNG_GOAL_MISSED = 'No stone in target field (%d points)';
8 daniel-mar 65
var
66
  ExtraPoints: Integer;
1 daniel-mar 67
begin
68
  FLevel := LevelName;
69
  FScore := Score;
70
  FStonesTotal := StonesTotal;
71
  FStonesRemoved := StonesRemoved;
72
  FSeconds := Seconds;
8 daniel-mar 73
  FGoalStatus := GoalStatus;
1 daniel-mar 74
  FHistory := JumpHistory;
75
 
8 daniel-mar 76
  PerformanceMemo.Lines.Clear;
77
  PerformanceMemo.Lines.Add('');
78
  PerformanceMemo.Lines.Add(Format(LNG_REMAINING, [FStonesTotal - 1 - FStonesRemoved,
79
                            RoundTo(((FStonesTotal - 1 - FStonesRemoved) / FStonesTotal * 100), -2)]));
80
  PerformanceMemo.Lines.Add(Format(LNG_TIME_SECONDS, [FSeconds]));
81
  PerformanceMemo.Lines.Add(Format(LNG_POINTS_PER_MINUTE, [Round(FScore / FSeconds * 60)]));
82
 
83
  if FGoalStatus = gsLastStoneInGoalRed then
84
  begin
85
    ExtraPoints := FieldTypeWorth(ftRed) * 100;
9 daniel-mar 86
    PerformanceMemo.Lines.Add(Format(LNG_GOAL_RED, [ExtraPoints]));
87
    Inc(FScore, ExtraPoints);
8 daniel-mar 88
  end
89
  else if FGoalStatus = gsLastStoneInGoalYellow then
90
  begin
91
    ExtraPoints := FieldTypeWorth(ftYellow) * 100;
9 daniel-mar 92
    PerformanceMemo.Lines.Add(Format(LNG_GOAL_YELLOW, [ExtraPoints]));
93
    Inc(FScore, ExtraPoints);
8 daniel-mar 94
  end
95
  else if FGoalStatus = gsLastStoneInGoalGreen then
96
  begin
97
    ExtraPoints := FieldTypeWorth(ftGreen) * 100;
9 daniel-mar 98
    PerformanceMemo.Lines.Add(Format(LNG_GOAL_GREEN, [ExtraPoints]));
99
    Inc(FScore, ExtraPoints);
8 daniel-mar 100
  end
101
  else if FGoalStatus = gsLastStoneOutsideGoal then
102
  begin
103
    ExtraPoints := 0;
9 daniel-mar 104
    PerformanceMemo.Lines.Add(Format(LNG_GOAL_MISSED, [ExtraPoints]));
105
    Inc(FScore, ExtraPoints);
8 daniel-mar 106
  end;
107
 
108
  PerformanceMemo.Lines.Strings[0] := Format(LNG_SCORE, [FScore]);
109
 
1 daniel-mar 110
  result := ShowModal;
111
end;
112
 
113
procedure TFinishForm.SaveToJournal(PlayerName: String; Score, StonesTotal, StonesRemoved, Seconds: Integer);
114
var
115
  f: textfile;
116
  tmp: string;
117
begin
118
  tmp := Format(JNL_FILE, [FLevel]);
119
 
120
  AssignFile(f, tmp);
121
  if FileExists(tmp) then
122
    Append(f)
123
  else
124
    ReWrite(f);
8 daniel-mar 125
 
126
  // TODO: Maybe we should do much more details, like, how many green stones were removed, how many yellows etc., and which stone was in the goal?
127
  WriteLn(f, Format(JNL_ENTRY, [DateTimeToStr(now()), NameEdit.Text, FScore, FSeconds, FStonesRemoved, FStonesTotal-1]));
128
 
1 daniel-mar 129
  CloseFile(f);
130
end;
131
 
132
procedure TFinishForm.SaveSettings;
133
var
134
  reg: TRegistry;
135
begin
136
  reg := TRegistry.Create;
137
  try
138
    reg.RootKey := HKEY_CURRENT_USER;
139
    if reg.OpenKey(REG_KEY, true) then
140
    begin
141
      reg.WriteString(REG_PLAYERNAME, NameEdit.Text);
142
      reg.WriteBool(REG_REPLAY, ReplayCheckbox.Checked);
143
      reg.CloseKey;
144
    end;
145
  finally
146
    reg.Free;
147
  end;
148
end;
149
 
150
procedure TFinishForm.LoadSettings;
151
var
152
  reg: TRegistry;
153
begin
154
  NameEdit.Text := '';
155
  reg := TRegistry.Create;
156
  try
157
    reg.RootKey := HKEY_CURRENT_USER;
158
    if reg.OpenKeyReadOnly(REG_KEY) then
159
    begin
160
      if reg.ValueExists(REG_PLAYERNAME) then
161
        NameEdit.Text := reg.ReadString(REG_PLAYERNAME);
162
      if reg.ValueExists(REG_REPLAY) then
163
        ReplayCheckBox.Checked := reg.ReadBool(REG_REPLAY);
164
      reg.CloseKey;
165
    end;
166
  finally
167
    reg.Free;
168
  end;
169
end;
170
 
171
procedure TFinishForm.SaveBtnClick(Sender: TObject);
21 daniel-mar 172
resourcestring
173
  LNG_ENTER_NAME = 'Please enter your name to get added to the high score lists.';
1 daniel-mar 174
begin
175
  if NameEdit.Text = '' then
176
  begin
9 daniel-mar 177
    MessageDlg(LNG_ENTER_NAME, mtWarning, [mbOk], 0);
1 daniel-mar 178
    NameEdit.SetFocus;
8 daniel-mar 179
    Exit;
1 daniel-mar 180
  end;
181
 
8 daniel-mar 182
  SaveToJournal(NameEdit.Text, FScore, FStonesTotal, FStonesRemoved, FSeconds);
1 daniel-mar 183
  ModalResult := mrOK;
184
end;
185
 
186
procedure TFinishForm.JumpHistoryLinkClick(Sender: TObject);
187
begin
188
  HistoryForm.JumpMemo.Lines.Assign(FHistory);
189
  HistoryForm.ShowModal();
190
end;
191
 
192
procedure TFinishForm.FormCreate(Sender: TObject);
193
begin
194
  if not ForceDirectories(ExtractFilePath(Application.ExeName) + JNL_PATH) then
195
  begin
9 daniel-mar 196
    MessageDlg(Format(LNG_COULD_NOT_CREATE_DIR, [JNL_PATH]), mtError, [mbOk], 0);
1 daniel-mar 197
  end;
198
 
199
  LoadSettings;
200
end;
201
 
202
end.