4,8 → 4,7 |
|
uses |
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, |
Dialogs, StdCtrls, ImgList, ComCtrls, Menus, ExtCtrls, ImageList, |
LevelFunctions; |
Dialogs, StdCtrls, ImgList, ComCtrls, Menus, ExtCtrls; |
|
type |
TLevelChoice = class(TForm) |
23,12 → 22,13 |
procedure CancelBtnClick(Sender: TObject); |
procedure FormShow(Sender: TObject); |
procedure LevelListClick(Sender: TObject); |
procedure LevelListChange(Sender: TObject; Item: TListItem; Change: TItemChange); |
procedure LevelListChange(Sender: TObject; Item: TListItem; |
Change: TItemChange); |
procedure PRefreshListClick(Sender: TObject); |
procedure FormResize(Sender: TObject); |
procedure FormCreate(Sender: TObject); |
private |
procedure RefreshList; |
procedure DrawLevelPreview(Level: TLevel); |
public |
function SelectedLevel: string; |
end; |
41,63 → 41,8 |
{$R *.dfm} |
|
uses |
Functions, Constants; |
Functions, LevelFunctions, Constants; |
|
procedure TLevelChoice.DrawLevelPreview(Level: TLevel); |
var |
PlaygroundMatrix: TPlayGroundMatrix; |
y, x: integer; |
indent: Integer; |
Image: TImage; |
BackgroundColor: TColor; |
const |
PREVIEW_BLOCK_SIZE = 10; // Enthält Field und Abstand |
PREVIEW_TAB_SIZE = PREVIEW_BLOCK_SIZE div 2; // 5 |
begin |
Image := PreviewImage; |
BackgroundColor := Self.Color; |
|
ClearImage(Image, BackgroundColor); |
|
Level.FillPlaygroundMatrix(PlaygroundMatrix, false); |
try |
for x := Low(PlaygroundMatrix.Fields) to High(PlaygroundMatrix.Fields) do |
begin |
for y := Low(PlaygroundMatrix.Fields[x]) to High(PlaygroundMatrix.Fields[x]) do |
begin |
// Rectange filling |
case PlaygroundMatrix.Fields[x,y].FieldType of |
ftFullSpace: Image.Canvas.Brush.Color := BackgroundColor; // invisible |
ftEmpty: Image.Canvas.Brush.Color := clWhite; |
ftGreen: Image.Canvas.Brush.Color := clLime; |
ftYellow: Image.Canvas.Brush.Color := clYellow; |
ftRed: Image.Canvas.Brush.Color := clRed; |
end; |
|
// Rectangle border |
if PlaygroundMatrix.Fields[x,y].Goal then |
Image.Canvas.Pen.Color := clBlack |
else |
begin |
if PlaygroundMatrix.Fields[x,y].FieldType = ftFullSpace then |
Image.Canvas.Pen.Color := BackgroundColor // invisible |
else |
Image.Canvas.Pen.Color := clLtGray; |
end; |
|
// Draw the rectangle |
indent := PlaygroundMatrix.Fields[x,y].Indent; |
Image.Canvas.Rectangle(x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE, |
y*PREVIEW_BLOCK_SIZE, |
x*PREVIEW_BLOCK_SIZE + indent*PREVIEW_TAB_SIZE + PREVIEW_BLOCK_SIZE, |
y*PREVIEW_BLOCK_SIZE + PREVIEW_BLOCK_SIZE); |
end; |
end; |
finally |
PlaygroundMatrix.ClearMatrix(true); |
end; |
end; |
|
function TLevelChoice.SelectedLevel: string; |
begin |
result := Format(LVL_FILE, [LevelList.Selected.Caption]); |
105,22 → 50,19 |
|
procedure TLevelChoice.PlayBtnClick(Sender: TObject); |
var |
Level: TLevel; |
LevelString: string; |
begin |
if Assigned(LevelList.Selected) then |
begin |
if LevelList.Selected.ImageIndex = 2 then |
begin |
Level := TLevel.Create(Format(LVL_FILE, [LevelList.Selected.Caption])); |
try |
if Level.CheckLevelIntegrity(true) <> leNone then |
LevelString := Functions.ReadFile(Format(LVL_FILE, [LevelList.Selected.Caption])); |
// leNone könnte auftreten, wenn das Level z.B. repariert wurde... |
if CheckLevelIntegrity(LevelString, true) <> leNone then |
begin |
exit; |
end; |
finally |
FreeAndNil(Level); |
end; |
end; |
ModalResult := mrOk; |
end; |
end; |
137,8 → 79,7 |
|
procedure TLevelChoice.LevelListClick(Sender: TObject); |
var |
LevelFile: string; |
Level: TLevel; |
LevelFile, LevelString: string; |
begin |
PlayBtn.Enabled := Assigned(LevelList.Selected); |
PLoadLevel.Enabled := Assigned(LevelList.Selected); |
146,12 → 87,8 |
if Assigned(LevelList.Selected) then |
begin |
LevelFile := Format(LVL_FILE, [LevelList.Selected.Caption]); |
Level := TLevel.Create(LevelFile); |
try |
DrawLevelPreview(Level); |
finally |
FreeAndNil(Level); |
end; |
LevelString := Functions.ReadFile(LevelFile); |
DrawLevelPreview(LevelString, PreviewImage, Color); |
end |
else |
begin |
173,7 → 110,7 |
procedure TLevelChoice.RefreshList; |
var |
s: TSearchRec; |
Level: TLevel; |
LevelString: string; |
begin |
LevelList.Clear; |
|
184,14 → 121,11 |
with LevelList.Items.Add do |
begin |
Caption := Copy(s.Name, 1, Length(s.Name)-Length(LVL_EXT)); |
Level := TLevel.Create(LVL_PATH + s.Name); |
|
if Level.CheckLevelIntegrity <> leNone then |
ImageIndex := 2{Error} |
else case Level.GameMode of |
gmNormal: ImageIndex := 0{Normal}; |
gmDiagonal: ImageIndex := 1{Diagonal}; |
gmUndefined: ImageIndex := 2{Error}; |
LevelString := Functions.ReadFile(LVL_PATH + s.Name); |
case GetLevelType(LevelString) of |
ltStandard: ImageIndex := 0; |
ltDiagonal: ImageIndex := 1; |
ltError: ImageIndex := 2; |
end; |
end; |
until FindNext(s) <> 0; |
199,11 → 133,35 |
end; |
end; |
|
procedure TLevelChoice.FormResize(Sender: TObject); |
var |
p: integer; |
begin |
// WIDTH |
p := ClientWidth - 3*LevelGrp.Left; // 100% useable |
LevelGrp.Width := Round((1-MET_PREVIEW_SIZE_RATIO) * p); |
PreviewGrp.Width := Round(MET_PREVIEW_SIZE_RATIO * p); |
PreviewGrp.Left := 2*LevelGrp.Left + LevelGrp.Width; |
LevelList.Width := LevelGrp.Width - 2*LevelList.Left; |
PreviewImage.Width := PreviewGrp.Width - 2*PreviewImage.Left; |
PlayBtn.Left := (LevelGrp.Left + LevelGrp.Width) - PlayBtn.Width; |
|
// HEIGHT |
LevelGrp.Height := ClientHeight - 3*LevelGrp.Top - PlayBtn.Height; |
PreviewGrp.Height := LevelGrp.Height; |
PlayBtn.Top := 2*LevelGrp.Top + LevelGrp.Height; |
CancelBtn.Top := PlayBtn.Top; |
LevelList.Height := LevelGrp.Height - 2*LevelList.Top; |
PreviewImage.Height := PreviewGrp.Height - 2*PreviewImage.Top; |
|
// TODO: Icons rearrangieren |
end; |
|
procedure TLevelChoice.FormCreate(Sender: TObject); |
begin |
if not ForceDirectories(ExtractFilePath(Application.ExeName) + LVL_PATH) then |
begin |
MessageDlg(Format(LNG_COULD_NOT_CREATE_DIR, [LVL_PATH]), mtError, [mbOK], 0); |
ShowMessage(Format(LNG_COULD_NOT_CREATE_DIR, [LVL_PATH])); |
end; |
end; |
|