Subversion Repositories spacemission

Rev

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