Subversion Repositories spacemission

Rev

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