Subversion Repositories spacemission

Rev

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