Subversion Repositories spacemission

Rev

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

  1. unit GamSpeicherung;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, ExtCtrls, Spin{$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.     LevelName: TEdit;
  22.     ElPanel1: TPanel;
  23.     li4a: TLabel;
  24.     li1: TLabel;
  25.     li3b: TLabel;
  26.     li3a: TLabel;
  27.     li4b: TLabel;
  28.     liu: TLabel;
  29.     liw: TLabel;
  30.     li2a: TLabel;
  31.     li2b: TLabel;
  32.     procedure LoeschenBtnClick(Sender: TObject);
  33.     procedure LadenBtnClick(Sender: TObject);
  34.     procedure SpeichernBtnClick(Sender: TObject);
  35.     procedure LevelListBoxClick(Sender: TObject);
  36.     procedure LevelNameChange(Sender: TObject);
  37.     procedure Button4Click(Sender: TObject);
  38.     procedure FormShow(Sender: TObject);
  39.     procedure DsFancyButton2Click(Sender: TObject);
  40.     procedure AbbrechenBtnClick(Sender: TObject);
  41.     procedure FormHide(Sender: TObject);
  42.     procedure LevelListBoxDblClick(Sender: TObject);
  43.   private
  44.     function GetSpielstandVerzeichnisSystem: string;
  45.     function GetSpielstandVerzeichnisUser: string;
  46.     function GetSaveGameFileName(SpielstandName: string; forceuserdir: boolean): string;
  47.   public
  48.     procedure SearchSaves;
  49.   end;
  50.  
  51. var
  52.   SpeicherungForm: TSpeicherungForm;
  53.  
  54. implementation
  55.  
  56. uses
  57.   Global, GamMain, ComLevelReader;
  58.  
  59. {$R *.DFM}
  60.  
  61. { TSpeicherungForm }
  62.  
  63. procedure TSpeicherungForm.SearchSaves;
  64. var
  65.   sr: TSearchRec;
  66.   res: integer;
  67. begin
  68.   LevelName.text := '';
  69.   LevelListBox.items.clear;
  70.   li1.visible := false;
  71.   li2a.visible := false;
  72.   li2b.visible := false;
  73.   li3a.visible := false;
  74.   li3b.visible := false;
  75.   li4a.visible := false;
  76.   li4b.visible := false;
  77.   liu.visible := false;
  78.   liw.visible := true;
  79.   li1.caption := 'n/a';
  80.   li2b.caption := 'n/a';
  81.   li3b.caption := 'n/a';
  82.   li4b.caption := 'n/a';
  83.   LadenBtn.enabled := false;
  84.   LoeschenBtn.enabled := false;
  85.   res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisSystem)+'*.sav', 0, sr);
  86.   try
  87.     while (res = 0) do
  88.     begin
  89.       if (sr.name <> '.') and (sr.name <> '..') then
  90.         LevelListBox.items.Add(ChangeFileExt(sr.Name, ''));
  91.       res := FindNext(sr);
  92.     end;
  93.   finally
  94.     FindClose(sr);
  95.   end;
  96.   res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisUser)+'*.sav', 0, sr);
  97.   try
  98.     while (res = 0) do
  99.     begin
  100.       // Anmerkung: Contains() ist nicht case-sensitive
  101.       if (sr.name <> '.') and (sr.name <> '..') and not LevelListBox.Items.Contains(ChangeFileExt(sr.Name, '')) then
  102.         LevelListBox.items.Add(ChangeFileExt(sr.Name, ''));
  103.       res := FindNext(sr);
  104.     end;
  105.   finally
  106.     FindClose(sr);
  107.   end;
  108.   LevelListBox.Sorted := true;
  109. end;
  110.  
  111. procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
  112. var
  113.   fil: string;
  114. begin
  115.   if LevelListBox.ItemIndex = -1 then exit;
  116.  
  117.   if MessageDlg('Diesen Spielstand wirklich löschen?', mtConfirmation, mbYesNoCancel, 0) = mrYes then
  118.   begin
  119.     li1.visible := false;
  120.     li2a.visible := false;
  121.     li2b.visible := false;
  122.     li3a.visible := false;
  123.     li3b.visible := false;
  124.     li4a.visible := false;
  125.     li4b.visible := false;
  126.     liu.visible := false;
  127.     liw.visible := false;
  128.     li1.caption := 'n/a';
  129.     li2b.caption := 'n/a';
  130.     li3b.caption := 'n/a';
  131.     li4b.caption := 'n/a';
  132.     LadenBtn.enabled := false;
  133.     LoeschenBtn.enabled := false;
  134.     fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false);
  135.     if not fileexists(fil) then raise Exception.Create('Spielstandsdatei nicht gefunden');
  136.     deletefile(fil);
  137.     searchsaves;
  138.   end;
  139. end;
  140.  
  141. function TSpeicherungForm.GetSaveGameFileName(SpielstandName: string; forceuserdir: boolean): string;
  142. var
  143.   usr, sys: string;
  144. begin
  145.   usr := IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisUser) + SpielstandName + '.sav'; // ab SpaceMission 1.2+
  146.   sys := IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisSystem) + SpielstandName + '.sav'; // alte Versionen von SpaceMission <1.2
  147.   if fileexists(usr) or forceuserdir then exit(usr);
  148.   if fileexists(sys) then exit(sys);
  149.   exit(usr);
  150. end;
  151.  
  152. procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
  153. var
  154.   SavGame: TSaveData;
  155.   fil: string;
  156. begin
  157.   if LevelListBox.ItemIndex = -1 then exit;
  158.  
  159.   if LevelListBox.items.count = 0 then
  160.   begin
  161.     li1.visible := false;
  162.     li2a.visible := false;
  163.     li2b.visible := false;
  164.     li3a.visible := false;
  165.     li3b.visible := false;
  166.     li4a.visible := false;
  167.     li4b.visible := false;
  168.     liu.visible := false;
  169.     liw.visible := false;
  170.     li1.caption := 'n/a';
  171.     li2b.caption := 'n/a';
  172.     li3b.caption := 'n/a';
  173.     li4b.caption := 'n/a';
  174.     LadenBtn.enabled := false;
  175.     LoeschenBtn.enabled := false;
  176.   end;
  177.   {if liu.visible or (LevelListBox.items.count=0) then
  178.     exit;}
  179.   SavGame := TSaveData.Create;
  180.   try
  181.     fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false);
  182.     if not fileexists(fil) then raise Exception.Create('Spielstandsdatei nicht gefunden');
  183.     SavGame.LoadFromFile(fil);
  184.     mainform.FScore := SavGame.Score;
  185.     mainform.FLife := SavGame.Life;
  186.     mainform.FLevel := SavGame.Level;
  187.     mainform.FGameMode := SavGame.GameMode;
  188.     MainForm.FLevelDataAlreadyLoaded := true; // do not call NewLevel() in StartSceneMain
  189.     if Assigned(SavGame.LevelData) then
  190.     begin
  191.       MainForm.LevelData.Assign(SavGame.LevelData);
  192.     end;
  193.   finally
  194.     FreeAndNil(SavGame);
  195.   end;
  196.   mainform.playsound(smsSceneMov, false);
  197.   mainform.FNextScene := gsNewLevel;
  198.   mainform.FCheat := false;
  199.   close;
  200. end;
  201.  
  202. procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
  203. var
  204.   SavGame: TSaveData;
  205.   i: integer;
  206. begin
  207.   if Levelname.text = '' then
  208.   begin
  209.     MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
  210.     LevelName.setfocus;
  211.     exit;
  212.   end;
  213.   for i := 0 to length(LevelName.text) do
  214.   begin
  215.     if (copy(LevelName.text, i, 1) = '\') or
  216.       (copy(LevelName.text, i, 1) = '/') or
  217.       (copy(LevelName.text, i, 1) = ':') or
  218.       (copy(LevelName.text, i, 1) = '*') or
  219.       (copy(LevelName.text, i, 1) = '?') or
  220.       (copy(LevelName.text, i, 1) = '"') or
  221.       (copy(LevelName.text, i, 1) = '<') or
  222.       (copy(LevelName.text, i, 1) = '>') or
  223.       (copy(LevelName.text, i, 1) = '|') then
  224.     begin
  225.       MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
  226.       LevelName.setfocus;
  227.       exit;
  228.     end;
  229.   end;
  230.   if LevelListBox.items.IndexOf(LevelName.text) > -1 then
  231.   begin
  232.     if MessageDlg('Spielstand ist bereits vorhanden. Ersetzen?', mtConfirmation, mbYesNoCancel, 0) <> mrYes then
  233.       exit;
  234.   end;
  235.  
  236.   SavGame := TSaveData.Create;
  237.   try
  238.     SavGame.Score := mainform.FScoreAtLevelStart;//mainform.FScore;
  239.     SavGame.Life := mainform.FLifeAtLevelStart;//mainform.FLife;
  240.     SavGame.Level := mainform.FLevel;
  241.     SavGame.GameMode := mainform.FGameMode;
  242.     if not Assigned(SavGame.LevelData) then SavGame.LevelData := TLevelData.Create;
  243.     SavGame.LevelData.Assign(mainForm.LevelData);
  244.     SavGame.SaveToFile(GetSaveGameFileName(LevelName.text, true));
  245.   finally
  246.     FreeAndNil(SavGame);
  247.   end;
  248.  
  249.   SearchSaves;
  250. end;
  251.  
  252. procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
  253. var
  254.   SavGame: TSaveData;
  255.   Punkte, Leben, Level: integer;
  256.   BeinhaltetLevelDaten: boolean;
  257.   Art: TGameMode;
  258.   fil: string;
  259. begin
  260.   ladenbtn.enabled := true;
  261.   loeschenbtn.enabled := true;
  262.   li1.visible := false;
  263.   li2a.visible := false;
  264.   li2b.visible := false;
  265.   li3a.visible := false;
  266.   li3b.visible := false;
  267.   li4a.visible := false;
  268.   li4b.visible := false;
  269.   liu.visible := false;
  270.   liw.visible := false;
  271.   li1.caption := 'n/a';
  272.   li2b.caption := 'n/a';
  273.   li3b.caption := 'n/a';
  274.   li4b.caption := 'n/a';
  275.   if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
  276.   begin
  277.     ladenbtn.enabled := false;
  278.     loeschenbtn.enabled := false;
  279.     liw.visible := true;
  280.     exit;
  281.   end;
  282.   LevelName.Text := LevelListBox.Items.strings[LevelListBox.itemindex];
  283.  
  284.   SavGame := TSaveData.Create;
  285.   try
  286.     try
  287.       fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false);
  288.       if not fileexists(fil) then raise Exception.Create('Spielstandsdatei nicht gefunden');
  289.       SavGame.LoadFromFile(fil);
  290.       Punkte := SavGame.Score;
  291.       Leben := SavGame.Life;
  292.       Level := SavGame.Level;
  293.       Art := SavGame.GameMode;
  294.       BeinhaltetLevelDaten := Assigned(SavGame.LevelData);
  295.     except
  296.       liu.visible := true;
  297.       ladenbtn.enabled := false;
  298.       exit;
  299.     end;
  300.   finally
  301.     FreeAndNil(SavGame);
  302.   end;
  303.   li1.visible := true;
  304.   li2a.visible := true;
  305.   li2b.visible := true;
  306.   li3a.visible := true;
  307.   li3b.visible := true;
  308.   li4a.visible := true;
  309.   li4b.visible := true;
  310.   if Art = gmLevels then
  311.     li1.caption := 'Das Level ist ein norm. Level'
  312.   else
  313.     li1.caption := 'Das Level ist ein Zufallslevel';
  314.   if BeinhaltetLevelDaten then
  315.     li1.Caption := li1.Caption + ' mit Karte';
  316.   li3b.caption := inttostr(Level);
  317.   li4b.caption := inttostr(Leben);
  318.   li2b.caption := inttostr(Punkte);
  319. end;
  320.  
  321. procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
  322. begin
  323.   //listbox1.Items.indexof('Level '+spinedit1.text);
  324. end;
  325.  
  326. procedure TSpeicherungForm.Button4Click(Sender: TObject);
  327. begin
  328.   mainform.dxtimer.enabled := not mainform.gamepause.checked;
  329.   close;
  330. end;
  331.  
  332. procedure TSpeicherungForm.FormShow(Sender: TObject);
  333. begin
  334.   mainform.dxtimer.enabled := false;
  335.   SearchSaves;
  336.   if mainform.FNotSave then
  337.   begin
  338.     label1.enabled := false;
  339.     LevelName.enabled := false;
  340.     SpeichernBtn.enabled := false;
  341.   end
  342.   else
  343.   begin
  344.     label1.enabled := true;
  345.     LevelName.enabled := true;
  346.     SpeichernBtn.enabled := true;
  347.   end;
  348. end;
  349.  
  350. function TSpeicherungForm.GetSpielstandVerzeichnisSystem: string;
  351. begin
  352.   // nicht mehr verwendet seit version 1.2
  353.   result := OwnDirectory + 'Spielstände';
  354. end;
  355.  
  356. function TSpeicherungForm.GetSpielstandVerzeichnisUser: string;
  357. begin
  358.   try
  359.     result := GetKnownFolderPath(FOLDERID_SavedGames);
  360.   except
  361.     result := '';
  362.   end;
  363.   if result = '' then
  364.   begin
  365.     // Pre Vista
  366.     result := OwnDirectory + 'Spielstände';
  367.   end
  368.   else
  369.   begin
  370.     result := IncludeTrailingPathDelimiter(result);
  371.     result := result + 'SpaceMission';
  372.   end;
  373.   result := IncludeTrailingPathDelimiter(result);
  374.   ForceDirectories(result);
  375. end;
  376.  
  377. procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
  378. begin
  379.   SearchSaves;
  380. end;
  381.  
  382. procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
  383. begin
  384.   close;
  385. end;
  386.  
  387. procedure TSpeicherungForm.FormHide(Sender: TObject);
  388. begin
  389.   if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
  390. end;
  391.  
  392. procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
  393. begin
  394.   LadenBtn.click;
  395. end;
  396.  
  397. end.
  398.  
  399.