Subversion Repositories jumper

Rev

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

  1. unit Choice;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ImgList, ComCtrls, Menus, ExtCtrls, ImageList,
  8.   LevelFunctions;
  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);
  26.     procedure LevelListChange(Sender: TObject; Item: TListItem; Change: TItemChange);
  27.     procedure PRefreshListClick(Sender: TObject);
  28.     procedure FormCreate(Sender: TObject);
  29.   private
  30.     procedure RefreshList;
  31.     procedure DrawLevelPreview(Level: TLevel);
  32.   public
  33.     function SelectedLevel: string;
  34.   end;
  35.  
  36. var
  37.   LevelChoice: TLevelChoice;
  38.  
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43. uses
  44.   Functions, Constants;
  45.  
  46. procedure TLevelChoice.DrawLevelPreview(Level: TLevel);
  47. var
  48.   PlaygroundMatrix: TPlayGroundMatrix;
  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.  
  62.   Level.FillPlaygroundMatrix(PlaygroundMatrix, false);
  63.   try
  64.     for x := Low(PlaygroundMatrix.Fields) to High(PlaygroundMatrix.Fields) do
  65.     begin
  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;
  76.  
  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);
  94.       end;
  95.     end;
  96.   finally
  97.     PlaygroundMatrix.ClearMatrix(true);
  98.   end;
  99. end;
  100.  
  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
  108.   Level: TLevel;
  109. begin
  110.   if Assigned(LevelList.Selected) then
  111.   begin
  112.     if LevelList.Selected.ImageIndex = 2 then
  113.     begin
  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);
  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
  140.   LevelFile: string;
  141.   Level: TLevel;
  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]);
  149.     Level := TLevel.Create(LevelFile);
  150.     try
  151.       DrawLevelPreview(Level);
  152.     finally
  153.       FreeAndNil(Level);
  154.     end;
  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;
  176.   Level: TLevel;
  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));
  187.         Level := TLevel.Create(LVL_PATH + s.Name);
  188.  
  189.         if Level.CheckLevelIntegrity <> leNone then
  190.           ImageIndex := 2{Error}
  191.         else case Level.GameMode of
  192.           gmNormal: ImageIndex := 0{Normal};
  193.           gmDiagonal: ImageIndex := 1{Diagonal};
  194.           gmUndefined: ImageIndex := 2{Error};
  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
  206.     MessageDlg(Format(LNG_COULD_NOT_CREATE_DIR, [LVL_PATH]), mtError, [mbOK], 0);
  207.   end;
  208. end;
  209.  
  210. end.
  211.