Subversion Repositories spacemission

Rev

Rev 15 | Rev 24 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit LevSpeicherung;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, ExtCtrls, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes{$IFEND};
  8.  
  9. type
  10.   TSpeicherungForm = class(TForm)
  11.     Bevel1: TBevel;
  12.     LadenBtn: TButton;                      
  13.     LoeschenBtn: TButton;
  14.     AktualisierenBtn: TButton;
  15.     SpeichernBtn: TButton;
  16.     AbbrechenBtn: TButton;
  17.     LevelListBox: TListBox;
  18.     Label2: TLabel;
  19.     Label3: TLabel;
  20.     Label1: TLabel;
  21.     ElPanel1: TPanel;
  22.     li3a: TLabel;
  23.     li1b: TLabel;
  24.     li1a: TLabel;
  25.     li2b: TLabel;
  26.     li2a: TLabel;
  27.     li3b: TLabel;
  28.     liu: TLabel;
  29.     liw: TLabel;
  30.     SpinEditEdt: TEdit;
  31.     SpinEdit: TUpDown;
  32.     procedure LoeschenBtnClick(Sender: TObject);
  33.     procedure LadenBtnClick(Sender: TObject);
  34.     procedure SpeichernBtnClick(Sender: TObject);
  35.     procedure LevelListBoxClick(Sender: TObject);
  36.     procedure Button4Click(Sender: TObject);
  37.     procedure FormShow(Sender: TObject);
  38.     procedure DsFancyButton2Click(Sender: TObject);
  39.     procedure AbbrechenBtnClick(Sender: TObject);
  40.     procedure LevelNameChange(Sender: TObject);
  41.     procedure LevelListBoxDblClick(Sender: TObject);
  42.     procedure FormHide(Sender: TObject);
  43.     procedure SpinEditClick(Sender: TObject; Button: TUDBtnType);
  44.     procedure SpinEditEdtKeyPress(Sender: TObject; var Key: Char);
  45.     procedure SpinEditEdtChange(Sender: TObject);
  46.   public
  47.     procedure SearchLevels;
  48.     function RightStr(str: string; count: integer): string;
  49.     function Filter(n: integer; s: string): string;
  50.   end;
  51.  
  52. var
  53.   SpeicherungForm: TSpeicherungForm;
  54.  
  55. implementation
  56.  
  57. uses
  58.   Global, LevMain, ComLevelReader;
  59.  
  60. {$R *.DFM}
  61.  
  62. procedure TSpeicherungForm.SearchLevels;
  63. var
  64.   i: integer;
  65. begin
  66.   //SpinEdit.Value := 1;
  67.   LevelListBox.items.clear;
  68.   li1a.visible := false;
  69.   li2a.visible := false;
  70.   li3a.visible := false;
  71.   li1b.visible := false;
  72.   li2b.visible := false;
  73.   li3b.visible := false;
  74.   liw.visible := true;
  75.   LadenBtn.enabled := false;
  76.   LoeschenBtn.enabled := false;
  77.   for i := 1 to 9999 do
  78.   begin
  79.     if fileexists(GetLevelFileName(i)) then
  80.       LevelListBox.items.Add(ExtractFileName(GetLevelFileName(i)));
  81.   end;
  82. end;
  83.  
  84. procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
  85. var
  86.   Markiert: boolean;
  87.   i: integer;
  88. begin
  89.   Markiert := false;
  90.   for i := 0 to LevelListBox.items.Count-1 do
  91.   begin
  92.     if LevelListBox.Selected[i] then Markiert := true;
  93.   end;
  94.   if not Markiert then exit;
  95.   if MessageDlg('Dieses Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  96.   begin
  97.     li1a.visible := false;
  98.     li2a.visible := false;
  99.     li3a.visible := false;
  100.     li1b.visible := false;
  101.     li2b.visible := false;
  102.     li3b.visible := false;
  103.     liu.visible := false;
  104.     liw.visible := true;
  105.     LadenBtn.enabled := false;
  106.     LoeschenBtn.enabled := false;
  107.     deletefile(IncludeTrailingPathDelimiter(ExtractFilePath(GetLevelFileName(1)))+
  108.       LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
  109.     SearchLevels;
  110.   end;
  111. end;
  112.  
  113. procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
  114. var
  115.   Markiert: boolean;
  116.   i, TempArtMain, TempLiveMain: integer;
  117.   LevelData: TLevelData;
  118. begin
  119.   Markiert := false;
  120.   for i := 0 to LevelListBox.items.Count-1 do
  121.   begin
  122.     if LevelListBox.Selected[i] then Markiert := true;
  123.   end;
  124.   if not Markiert then exit;
  125.   if LevelListBox.items.count = 0 then
  126.   begin
  127.     li1a.visible := false;
  128.     li2a.visible := false;
  129.     li3a.visible := false;
  130.     li1b.visible := false;
  131.     li2b.visible := false;
  132.     li3b.visible := false;
  133.     liw.visible := true;
  134.     LadenBtn.enabled := false;
  135.     LoeschenBtn.enabled := false;
  136.   end;
  137.   // Da Button bei ungültigen Level deaktiviert wird, ist das nicht mehr nötig.
  138.   {if liu.visible or (LevelListBox.items.count=0) then
  139.     exit;}
  140.   // Vorbereiten
  141.   MainForm.DestroyLevel;
  142.   MainForm.LevChanged := false;
  143.  
  144.   LevelData := TLevelData.Create;
  145.   try
  146.     LevelData.Load(IncludeTrailingPathDelimiter(ExtractFilePath(GetLevelFileName(1)))+
  147.       LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
  148.     MainForm.ScrollBar.Max := LevelData.LevelEditorLength;
  149.     MainForm.Enemys.Clear;
  150.     TempArtMain := MainForm.ArtChecked;
  151.     TempLiveMain := MainForm.LiveEdit;
  152.     MainForm.NumEnemys := Length(LevelData.EnemyAdventTable);
  153.     for i := 0 to MainForm.NumEnemys-1 do
  154.     begin
  155.       MainForm.EnemyAdd(
  156.         LevelData.EnemyAdventTable[i].x,
  157.         LevelData.EnemyAdventTable[i].y,
  158.         Ord(LevelData.EnemyAdventTable[i].enemyType),
  159.         LevelData.EnemyAdventTable[i].lifes
  160.       );
  161.       MainForm.ArtChecked := Ord(LevelData.EnemyAdventTable[i].enemyType);
  162.       MainForm.LiveEdit := LevelData.EnemyAdventTable[i].lifes;
  163.       MainForm.EnemyCreate(
  164.         LevelData.EnemyAdventTable[i].x,
  165.         LevelData.EnemyAdventTable[i].y
  166.       );
  167.       if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then MainForm.Boss := true;
  168.     end;
  169.   finally
  170.     FreeAndNil(LevelData);
  171.   end;
  172.   MainForm.LiveEdit := TempLiveMain;
  173.   MainForm.ArtChecked := TempArtMain;
  174.   // Nacharbeiten
  175.   MainForm.AnzeigeAct;
  176.   close;
  177. end;
  178.  
  179. function TSpeicherungForm.RightStr(str: string; count: integer): string;
  180. begin
  181.   result := copy(str, length(str)-(count-1), count);
  182. end;
  183.  
  184. function TSpeicherungForm.Filter(n: integer; s: string): string;
  185. var
  186.   i, last: integer;
  187.   start, start2: boolean;
  188.   temp: string;
  189. begin
  190.   last := 0;
  191.   start := false;
  192.   start2 := false;
  193.   temp := '';
  194.   if n = 1 then
  195.   begin
  196.     for i := 1 to length(s)+1 do
  197.     begin
  198.       if copy(s, i, 1) = '-' then
  199.       begin
  200.         last := i;
  201.         break;
  202.       end;
  203.     end;
  204.     temp := copy(s, 1, last-1);
  205.   end;
  206.   if n = 2 then
  207.   begin
  208.     for i := 1 to length(s)+1 do
  209.     begin
  210.       if start2 then start := true;
  211.       if copy(s, i, 1) = '-' then start2 := true;
  212.       if (copy(s, i, 1) = ':') and start then break;
  213.       if start then temp := temp + copy(s, i, 1)
  214.     end;
  215.   end;
  216.   if n = 3 then
  217.   begin
  218.     for i := 1 to length(s)+1 do
  219.     begin
  220.       if start2 then start := true;
  221.       if copy(s, i, 1) = ':' then start2 := true;
  222.       if (copy(s, i, 1) = '(') and start then break;
  223.       if start then temp := temp + copy(s, i, 1)
  224.     end;
  225.   end;
  226.   if n = 4 then
  227.   begin
  228.     for i := 1 to length(s)+1 do
  229.     begin
  230.       if start2 then start := true;
  231.       if copy(s, i, 1) = '(' then start2 := true;
  232.       if (copy(s, i, 1) = ')') and start then break;
  233.       if start then temp := temp + copy(s, i, 1)
  234.     end;
  235.   end;
  236.   result := temp;
  237. end;
  238.  
  239. procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
  240. var
  241.   LevelData: TLevelData;
  242.   i, j: integer;
  243.   puffer: string;
  244. begin
  245.   if mainform.Enemys.count = 0 then
  246.   begin
  247.     MessageDlg('Das Level ist leer!', mtError, [mbOK], 0);
  248.     SpinEdit.SetFocus;
  249.     exit;
  250.   end;
  251.   {for i := 0 to length(LevelName.text) do
  252.   begin
  253.     if (copy(LevelName.text, i, 1) = '\') or
  254.       (copy(LevelName.text, i, 1) = '/') or
  255.       (copy(LevelName.text, i, 1) = ':') or
  256.       (copy(LevelName.text, i, 1) = '*') or
  257.       (copy(LevelName.text, i, 1) = '?') or
  258.       (copy(LevelName.text, i, 1) = '"') or
  259.       (copy(LevelName.text, i, 1) = '<') or
  260.       (copy(LevelName.text, i, 1) = '>') or
  261.       (copy(LevelName.text, i, 1) = '|') then
  262.     begin
  263.       MessageDlg('Dies ist kein gültiger Levelname!', mtError, [mbOK], 0);
  264.       LevelName.SetFocus;
  265.       exit;
  266.     end;
  267.   end;}
  268.   if LevelListBox.items.IndexOf('Level ' + inttostr(SpinEdit.Position)) > -1 then
  269.   begin
  270.     if MessageDlg('Level ist bereits vorhanden. Ersetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
  271.       exit;
  272.   end;
  273.  
  274.   // Sortierung (wichtig)
  275.   for j := 0 to mainform.enemys.Count - 2 do
  276.   begin
  277.     for i := 0 to mainform.enemys.Count - 2 do
  278.     begin
  279.       if strtoint(filter(1, mainform.enemys.Strings[i])) > strtoint(filter(1, mainform.enemys.Strings[i + 1])) then
  280.       begin
  281.         puffer := mainform.enemys.Strings[i];
  282.         mainform.enemys.Strings[i] := mainform.enemys.Strings[i + 1];
  283.         mainform.enemys.Strings[i + 1] := puffer;
  284.       end;
  285.     end;
  286.   end;
  287.  
  288.   // Speichern
  289.   LevelData := TLevelData.Create;
  290.   try
  291.     LevelData.LevelEditorLength := MainForm.ScrollBar.Max;
  292.     SetLength(LevelData.EnemyAdventTable, mainform.enemys.count);
  293.     for i := 0 to mainform.enemys.count-1 do
  294.     begin
  295.       LevelData.EnemyAdventTable[i].enemyType := TEnemyType(StrToInt(filter(3, mainform.enemys.Strings[i])));
  296.       LevelData.EnemyAdventTable[i].x := StrToInt(filter(1, mainform.enemys.Strings[i]));
  297.       LevelData.EnemyAdventTable[i].y := StrToInt(filter(2, mainform.enemys.Strings[i]));
  298.       LevelData.EnemyAdventTable[i].lifes := StrToInt(filter(4, mainform.enemys.Strings[i]));
  299.     end;
  300.     LevelData.Save(GetLevelFileName(SpinEdit.Position));
  301.   finally
  302.     FreeAndNil(LevelData);
  303.   end;
  304.  
  305.   // Nacharbeiten
  306.   MainForm.LevChanged := false;
  307.   MainForm.AnzeigeAct;
  308.   SearchLevels;
  309. end;
  310.  
  311. procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
  312. var
  313.   LevelData: TLevelData;
  314.   boss: boolean;
  315.   i: Integer;
  316.   temp: string;
  317.   anzahlEinheiten: integer;
  318. begin
  319.   li1a.visible := false;
  320.   li2a.visible := false;
  321.   li3a.visible := false;
  322.   li1b.visible := false;
  323.   li2b.visible := false;
  324.   li3b.visible := false;
  325.   liu.visible := false;
  326.   liw.visible := false;
  327.   if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
  328.   begin
  329.     ladenbtn.enabled := false;
  330.     loeschenbtn.enabled := false;
  331.     liw.visible := true;
  332.     exit;
  333.   end;
  334.   temp := LevelListBox.Items.strings[LevelListBox.itemindex];
  335.   SpinEdit.Position := strtoint(RightStr(temp, length(temp)-6));
  336.  
  337.   LevelData := TLevelData.Create;
  338.   try
  339.     try
  340.       LevelData.Load(IncludeTrailingPathDelimiter(ExtractFilePath(GetLevelFileName(1)))+
  341.         LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
  342.     except
  343.       liu.visible := true;
  344.       LadenBtn.enabled := false;
  345.     end;
  346.  
  347.     boss := false;
  348.     anzahlEinheiten := Length(LevelData.EnemyAdventTable);
  349.     for i := 0 to anzahlEinheiten - 1 do
  350.     begin
  351.       if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then
  352.       begin
  353.         boss := true;
  354.       end;
  355.     end;
  356.  
  357.     li1a.visible := true;
  358.     li2a.visible := true;
  359.     li3a.visible := true;
  360.     li1b.visible := true;
  361.     li2b.visible := true;
  362.     li3b.visible := true;
  363.     LadenBtn.enabled := true;
  364.     LoeschenBtn.enabled := true;
  365.     li1b.caption := inttostr(anzahlEinheiten);
  366.     if boss then
  367.       li2b.caption := 'Ja'
  368.     else
  369.       li2b.caption := 'Nein';
  370.     li3b.caption := IntToStr(LevelData.LevelEditorLength) + ' Felder';
  371.   finally
  372.     FreeAndNil(LevelData);
  373.   end;
  374. end;
  375.  
  376. procedure TSpeicherungForm.Button4Click(Sender: TObject);
  377. begin
  378.   close;
  379. end;
  380.  
  381. procedure TSpeicherungForm.FormShow(Sender: TObject);
  382. begin
  383.   mainform.dxtimer.enabled := false;
  384.   SearchLevels;
  385. end;
  386.  
  387. procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
  388. begin
  389.   SearchLevels;
  390. end;
  391.  
  392. procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
  393. begin
  394.   close;
  395. end;
  396.  
  397. procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
  398. begin
  399.   {...}
  400. end;
  401.  
  402. procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
  403. begin
  404.   LadenBtn.click;
  405. end;
  406.  
  407. procedure TSpeicherungForm.FormHide(Sender: TObject);
  408. begin
  409.   mainform.dxtimer.enabled := true;
  410. end;
  411.  
  412. procedure TSpeicherungForm.SpinEditClick(Sender: TObject;
  413.   Button: TUDBtnType);
  414. begin
  415.   SpinEditEdt.Text := inttostr(SpinEdit.position);
  416. end;
  417.  
  418. procedure TSpeicherungForm.SpinEditEdtKeyPress(Sender: TObject;
  419.   var Key: Char);
  420. begin
  421.   {$IFDEF UNICODE}
  422.   if not CharInSet(Key, [#13, #08, '0'..'9']) then
  423.   {$ELSE}
  424.   if not (Key in [#13, #08, '0'..'9']) then
  425.   {$ENDIF}
  426.     Key := #0;
  427. end;
  428.  
  429. procedure TSpeicherungForm.SpinEditEdtChange(Sender: TObject);
  430. begin
  431.   SpinEdit.Position := strtoint(SpinEditEdt.text);
  432. end;
  433.  
  434. end.
  435.  
  436.