Subversion Repositories jumper

Rev

Rev 21 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 21 Rev 22
1
unit Choice;
1
unit Choice;
2
 
2
 
3
interface
3
interface
4
 
4
 
5
uses
5
uses
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7
  Dialogs, StdCtrls, ImgList, ComCtrls, Menus, ExtCtrls, System.ImageList, LevelFunctions;
7
  Dialogs, StdCtrls, ImgList, ComCtrls, Menus, ExtCtrls, System.ImageList, LevelFunctions;
8
 
8
 
9
type
9
type
10
  TLevelChoice = class(TForm)
10
  TLevelChoice = class(TForm)
11
    PlayBtn: TButton;
11
    PlayBtn: TButton;
12
    CancelBtn: TButton;
12
    CancelBtn: TButton;
13
    LevelImageList: TImageList;
13
    LevelImageList: TImageList;
14
    LevelPopupMenu: TPopupMenu;
14
    LevelPopupMenu: TPopupMenu;
15
    PLoadLevel: TMenuItem;
15
    PLoadLevel: TMenuItem;
16
    PRefreshList: TMenuItem;
16
    PRefreshList: TMenuItem;
17
    PreviewGrp: TGroupBox;
17
    PreviewGrp: TGroupBox;
18
    PreviewImage: TImage;
18
    PreviewImage: TImage;
19
    LevelGrp: TGroupBox;
19
    LevelGrp: TGroupBox;
20
    LevelList: TListView;
20
    LevelList: TListView;
21
    procedure PlayBtnClick(Sender: TObject);
21
    procedure PlayBtnClick(Sender: TObject);
22
    procedure CancelBtnClick(Sender: TObject);
22
    procedure CancelBtnClick(Sender: TObject);
23
    procedure FormShow(Sender: TObject);
23
    procedure FormShow(Sender: TObject);
24
    procedure LevelListClick(Sender: TObject);
24
    procedure LevelListClick(Sender: TObject);
25
    procedure LevelListChange(Sender: TObject; Item: TListItem; Change: TItemChange);
25
    procedure LevelListChange(Sender: TObject; Item: TListItem; Change: TItemChange);
26
    procedure PRefreshListClick(Sender: TObject);
26
    procedure PRefreshListClick(Sender: TObject);
27
    procedure FormCreate(Sender: TObject);
27
    procedure FormCreate(Sender: TObject);
28
  private
28
  private
29
    procedure RefreshList;
29
    procedure RefreshList;
30
    procedure DrawLevelPreview(Level: TLevel);
30
    procedure DrawLevelPreview(Level: TLevel);
31
  public
31
  public
32
    function SelectedLevel: string;
32
    function SelectedLevel: string;
33
  end;
33
  end;
34
 
34
 
35
var
35
var
36
  LevelChoice: TLevelChoice;
36
  LevelChoice: TLevelChoice;
37
 
37
 
38
implementation
38
implementation
39
 
39
 
40
{$R *.dfm}
40
{$R *.dfm}
41
 
41
 
42
uses
42
uses
43
  Functions, Constants;
43
  Functions, Constants;
44
 
44
 
45
procedure TLevelChoice.DrawLevelPreview(Level: TLevel);
45
procedure TLevelChoice.DrawLevelPreview(Level: TLevel);
46
var
46
var
47
  LevelArray: TLevelArray;
47
  LevelArray: TLevelArray;
48
  y, x: integer;
48
  y, x: integer;
49
  t: TFieldType;
49
  t: TFieldType;
50
  indent: Integer;
50
  indent: Integer;
51
  Image: TImage;
51
  Image: TImage;
52
  BackgroundColor: TColor;
52
  BackgroundColor: TColor;
53
const
53
const
54
  PREVIEW_BLOCK_SIZE = 10; // Enthält Field und Abstand
54
  PREVIEW_BLOCK_SIZE = 10; // Enthält Field und Abstand
55
  PREVIEW_TAB_SIZE = PREVIEW_BLOCK_SIZE div 2; // 5
55
  PREVIEW_TAB_SIZE = PREVIEW_BLOCK_SIZE div 2; // 5
56
begin
56
begin
57
  Image := PreviewImage;
57
  Image := PreviewImage;
58
  BackgroundColor := Self.Color;
58
  BackgroundColor := Self.Color;
59
 
59
 
60
  LevelArray := nil;
60
  LevelArray := nil;
61
 
61
 
62
  ClearImage(Image, BackgroundColor);
62
  ClearImage(Image, BackgroundColor);
63
 
63
 
64
  LevelArray := Level.LevelStringToLevelArray(false);
64
  LevelArray := Level.LevelStringToLevelArray(false);
65
 
65
 
66
  for y := Low(LevelArray) to High(LevelArray) do
66
  for y := Low(LevelArray) to High(LevelArray) do
67
  begin
67
  begin
68
    for x := Low(LevelArray[y].Fields) to High(LevelArray[y].Fields) do
68
    for x := Low(LevelArray[y].Fields) to High(LevelArray[y].Fields) do
69
    begin
69
    begin
70
      t      := LevelArray[y].Fields[x].Typ;
70
      t      := LevelArray[y].Fields[x].Typ;
71
      indent := LevelArray[y].Indent;
71
      indent := LevelArray[y].Indent;
72
 
72
 
73
      case t of
73
      case t of
74
        ftFullSpace: Image.Canvas.Brush.Color := BackgroundColor;
74
        ftFullSpace: Image.Canvas.Brush.Color := BackgroundColor;
75
        ftEmpty:     Image.Canvas.Brush.Color := clWhite;
75
        ftEmpty:     Image.Canvas.Brush.Color := clWhite;
76
        ftGreen:     Image.Canvas.Brush.Color := clLime;
76
        ftGreen:     Image.Canvas.Brush.Color := clLime;
77
        ftYellow:    Image.Canvas.Brush.Color := clYellow;
77
        ftYellow:    Image.Canvas.Brush.Color := clYellow;
78
        ftRed:       Image.Canvas.Brush.Color := clRed;
78
        ftRed:       Image.Canvas.Brush.Color := clRed;
79
      end;
79
      end;
80
 
80
 
81
      if LevelArray[y].Fields[x].Goal then
81
      if LevelArray[y].Fields[x].Goal then
82
        Image.Canvas.Pen.Color := clBlack
82
        Image.Canvas.Pen.Color := clBlack
83
      else
83
      else
84
        Image.Canvas.Pen.Color := BackgroundColor;
84
        Image.Canvas.Pen.Color := BackgroundColor;
85
 
85
 
86
      Image.Canvas.Rectangle(x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE,
86
      Image.Canvas.Rectangle(x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE,
87
                             y*PREVIEW_BLOCK_SIZE,
87
                             y*PREVIEW_BLOCK_SIZE,
88
                             x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE + PREVIEW_BLOCK_SIZE,
88
                             x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE + PREVIEW_BLOCK_SIZE,
89
                             y*PREVIEW_BLOCK_SIZE                           + PREVIEW_BLOCK_SIZE);
89
                             y*PREVIEW_BLOCK_SIZE                           + PREVIEW_BLOCK_SIZE);
90
    end;
90
    end;
91
  end;
91
  end;
92
end;
92
end;
93
 
93
 
94
function TLevelChoice.SelectedLevel: string;
94
function TLevelChoice.SelectedLevel: string;
95
begin
95
begin
96
  result := Format(LVL_FILE, [LevelList.Selected.Caption]);
96
  result := Format(LVL_FILE, [LevelList.Selected.Caption]);
97
end;
97
end;
98
 
98
 
99
procedure TLevelChoice.PlayBtnClick(Sender: TObject);
99
procedure TLevelChoice.PlayBtnClick(Sender: TObject);
100
var
100
var
101
  Level: TLevel;
101
  Level: TLevel;
102
begin
102
begin
103
  if Assigned(LevelList.Selected) then
103
  if Assigned(LevelList.Selected) then
104
  begin
104
  begin
105
    if LevelList.Selected.ImageIndex = 2 then
105
    if LevelList.Selected.ImageIndex = 2 then
106
    begin
106
    begin
107
      Level := TLevel.Create(Format(LVL_FILE, [LevelList.Selected.Caption]));
107
      Level := TLevel.Create(Format(LVL_FILE, [LevelList.Selected.Caption]));
108
      try
108
      try
109
        if Level.CheckLevelIntegrity(true) <> leNone then
109
        if Level.CheckLevelIntegrity(true) <> leNone then
110
        begin
110
        begin
111
          exit;
111
          exit;
112
        end;
112
        end;
113
      finally
113
      finally
114
        FreeAndNil(Level);
114
        FreeAndNil(Level);
115
      end;
115
      end;
116
    end;
116
    end;
117
    ModalResult := mrOk;
117
    ModalResult := mrOk;
118
  end;
118
  end;
119
end;
119
end;
120
 
120
 
121
procedure TLevelChoice.CancelBtnClick(Sender: TObject);
121
procedure TLevelChoice.CancelBtnClick(Sender: TObject);
122
begin
122
begin
123
  ModalResult := mrCancel;
123
  ModalResult := mrCancel;
124
end;
124
end;
125
 
125
 
126
procedure TLevelChoice.FormShow(Sender: TObject);
126
procedure TLevelChoice.FormShow(Sender: TObject);
127
begin
127
begin
128
  RefreshList;
128
  RefreshList;
129
end;
129
end;
130
 
130
 
131
procedure TLevelChoice.LevelListClick(Sender: TObject);
131
procedure TLevelChoice.LevelListClick(Sender: TObject);
132
var
132
var
133
  LevelFile: string;
133
  LevelFile: string;
134
  Level: TLevel;
134
  Level: TLevel;
135
begin
135
begin
136
  PlayBtn.Enabled := Assigned(LevelList.Selected);
136
  PlayBtn.Enabled := Assigned(LevelList.Selected);
137
  PLoadLevel.Enabled := Assigned(LevelList.Selected);
137
  PLoadLevel.Enabled := Assigned(LevelList.Selected);
138
 
138
 
139
  if Assigned(LevelList.Selected) then
139
  if Assigned(LevelList.Selected) then
140
  begin
140
  begin
141
    LevelFile := Format(LVL_FILE, [LevelList.Selected.Caption]);
141
    LevelFile := Format(LVL_FILE, [LevelList.Selected.Caption]);
142
    Level := TLevel.Create(LevelFile);
142
    Level := TLevel.Create(LevelFile);
143
    try
143
    try
144
      DrawLevelPreview(Level);
144
      DrawLevelPreview(Level);
145
    finally
145
    finally
146
      FreeAndNil(Level);
146
      FreeAndNil(Level);
147
    end;
147
    end;
148
  end
148
  end
149
  else
149
  else
150
  begin
150
  begin
151
    ClearImage(PreviewImage, Color);
151
    ClearImage(PreviewImage, Color);
152
  end;
152
  end;
153
end;
153
end;
154
 
154
 
155
procedure TLevelChoice.LevelListChange(Sender: TObject; Item: TListItem;
155
procedure TLevelChoice.LevelListChange(Sender: TObject; Item: TListItem;
156
  Change: TItemChange);
156
  Change: TItemChange);
157
begin
157
begin
158
  if Change = ctState then LevelListClick(self);
158
  if Change = ctState then LevelListClick(self);
159
end;
159
end;
160
 
160
 
161
procedure TLevelChoice.PRefreshListClick(Sender: TObject);
161
procedure TLevelChoice.PRefreshListClick(Sender: TObject);
162
begin
162
begin
163
  RefreshList;
163
  RefreshList;
164
end;
164
end;
165
 
165
 
166
procedure TLevelChoice.RefreshList;
166
procedure TLevelChoice.RefreshList;
167
var
167
var
168
  s: TSearchRec;
168
  s: TSearchRec;
169
  Level: TLevel;
169
  Level: TLevel;
170
begin
170
begin
171
  LevelList.Clear;
171
  LevelList.Clear;
172
 
172
 
173
  // Levels auflisten
173
  // Levels auflisten
174
  if FindFirst(Format(LVL_FILE, ['*']), faAnyFile, s) = 0 then
174
  if FindFirst(Format(LVL_FILE, ['*']), faAnyFile, s) = 0 then
175
  begin
175
  begin
176
    repeat
176
    repeat
177
      with LevelList.Items.Add do
177
      with LevelList.Items.Add do
178
      begin
178
      begin
179
        Caption := Copy(s.Name, 1, Length(s.Name)-Length(LVL_EXT));
179
        Caption := Copy(s.Name, 1, Length(s.Name)-Length(LVL_EXT));
180
        Level := TLevel.Create(LVL_PATH + s.Name);
180
        Level := TLevel.Create(LVL_PATH + s.Name);
181
 
181
 
182
        if Level.CheckLevelIntegrity <> leNone then
182
        if Level.CheckLevelIntegrity <> leNone then
183
          ImageIndex := 2{Error}
183
          ImageIndex := 2{Error}
184
        else case Level.GetGameMode of
184
        else case Level.GameMode of
185
          gmNormal: ImageIndex := 0{Normal};
185
          gmNormal: ImageIndex := 0{Normal};
186
          gmDiagonal: ImageIndex := 1{Diagonal};
186
          gmDiagonal: ImageIndex := 1{Diagonal};
187
          gmUndefined: ImageIndex := 2{Error};
187
          gmUndefined: ImageIndex := 2{Error};
188
        end;
188
        end;
189
      end;
189
      end;
190
    until FindNext(s) <> 0;
190
    until FindNext(s) <> 0;
191
    FindClose(s);
191
    FindClose(s);
192
  end;
192
  end;
193
end;
193
end;
194
 
194
 
195
procedure TLevelChoice.FormCreate(Sender: TObject);
195
procedure TLevelChoice.FormCreate(Sender: TObject);
196
begin
196
begin
197
  if not ForceDirectories(ExtractFilePath(Application.ExeName) + LVL_PATH) then
197
  if not ForceDirectories(ExtractFilePath(Application.ExeName) + LVL_PATH) then
198
  begin
198
  begin
199
    MessageDlg(Format(LNG_COULD_NOT_CREATE_DIR, [LVL_PATH]), mtError, [mbOK], 0);
199
    MessageDlg(Format(LNG_COULD_NOT_CREATE_DIR, [LVL_PATH]), mtError, [mbOK], 0);
200
  end;
200
  end;
201
end;
201
end;
202
 
202
 
203
end.
203
end.
204
 
204