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. |