Subversion Repositories jumper

Rev

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