Subversion Repositories jumper

Rev

Rev 22 | Details | Compare with Previous | Last modification | View Log | RSS feed

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