home *** CD-ROM | disk | FTP | other *** search
/ CD PowerPlay 6 / TheCompleteAdventureCollection1995 / CDPP6.ISO / utility / agtsrc / saverest.pa4 < prev    next >
Encoding:
Text File  |  1989-12-28  |  13.6 KB  |  420 lines

  1.  
  2.   {SAVEREST.PA2}
  3.  
  4.   PROCEDURE ChangeDriveDirectory;
  5.  
  6.   VAR
  7.     NumPara, Spot : Integer;
  8.     P, p1, p2, p3 : words;
  9.     Answer : s;
  10.  
  11.     PROCEDURE Handle_File_Name;
  12.  
  13.     BEGIN
  14.       IF POS(':', p2) = 0 THEN
  15.         BEGIN
  16.           Spot := Length(p2);
  17.           IF Spot = 1 THEN p2 := p2 + ':'; {append : to Drive Letter}
  18.         END;
  19.       IF p2 <> '' THEN            {need to change directory}
  20.         BEGIN
  21.           Spot := Length(p2);
  22.           IF p2[Spot] = '\' THEN p2 := Copy(p2, 1, Spot-1); {strip off last '\'}
  23.           {$I-} ChDir(p2);
  24.           IF IoResult <> 0 THEN
  25.             WriteLn(IO,'Cannot find Drive and/or Directory: ', p2);
  26.         END;                      {change directory}
  27.     END;                          {Handle_File_Name}
  28.  
  29.   BEGIN
  30.     {$V-}
  31.     Write(IO, 'Do you want to change either the Drive or the Directory? (Y or N): ');
  32.     Answer := GetInputString;
  33.     Capitalize(Answer);
  34.     IF Answer[1] = 'Y' THEN
  35.       BEGIN
  36.         Write(IO, 'Enter the Drive and/or the Directory (i.e., A: or B:\SAVED): ');
  37.         Answer := GetInputString;
  38.         p2 := Answer;
  39.         Handle_File_Name;
  40.       END;
  41.   END;                            {ChangeDriveDirectory}
  42.  
  43.  
  44.   {Save Game}
  45.  
  46.   PROCEDURE Save;
  47.  
  48.   LABEL AllDone;
  49.  
  50.   VAR
  51.     i, dot_spot : Integer;
  52.     save_file_name, OldPath : s;
  53.     save_file : Text;
  54.     SwappedDisk : Boolean;
  55.     Answer : s;
  56.     EstimatedSize, FreeBytes : Real;
  57.     Dir : Direction;
  58.  
  59.     FUNCTION Free : Real;
  60.       {Returns free space on the default disk}
  61.     VAR
  62.       reg : registers;
  63.  
  64.     BEGIN                         {Free}
  65.       WITH reg DO
  66.         BEGIN
  67.           ah := $36;              {DOS function number}
  68.           dl := $00;              {drive number: default=00;a=01,b=02,c=03,etc}
  69.           MSDOS(Dos.registers(reg)); {call DOS}
  70.           Free := 1.0*ax*bx*cx;   {multiple by 1.0 to create a REAL value}
  71.         END;
  72.     END;                          {Free}
  73.  
  74.   BEGIN                           {save}
  75.     OldPath := '';
  76.     GetDir(0, OldPath);           {Get current Drive and/or Directory};
  77.     ChangeDriveDirectory; {Change only if player wants to change}
  78.     SwappedDisk := False;
  79.     Write(IO, 'Name to save under (1-8 characters, CR to abort): ');
  80.     save_file_name := GetInputString;
  81.     IF save_file_name = '' THEN GOTO AllDone; {Exit if RETURN}
  82.     dot_spot := POS('.', save_file_name);
  83.     IF dot_spot <> 0 THEN save_file_name := Copy(save_file_name, 1, dot_spot-1);
  84.     {strip off . and extension}
  85.     IF Length(save_file_name) > 8 THEN save_file_name := Copy(save_file_name, 1, 8);
  86.     {limit name to 8 characters}
  87.     save_file_name := save_file_name+'.$AV';
  88.     {add .$AV extension}
  89.     EstimatedSize := 20.0;        {Large saved file takes 14K -- 20K is plenty}
  90.     FreeBytes := (Free+500.0)/1000.0; {free space in K on default drive}
  91.     IF Length(save_file_name) > 0
  92.     THEN BEGIN
  93.       IF File_Exists(save_file_name)
  94.       THEN BEGIN
  95.         Write(IO, 'File exists. Overwrite (y/n)?');
  96.         Answer := GetInputString;
  97.         IF (Answer[1] <> 'y') AND (Answer[1] <> 'Y')
  98.         THEN save_file_name := ''
  99.         ELSE EstimatedSize := 0.1;
  100.       END;
  101.       IF save_file_name = '' THEN GOTO AllDone; {Exit if RETURN}
  102.  
  103.       {Wait until enough room on disk to save file}
  104.       IF (FreeBytes < (1.05*EstimatedSize)) THEN BEGIN
  105.         REPEAT
  106.           WriteLn(IO, ' ');
  107.           WriteLn(IO, 'Save files require approximately ', EstimatedSize:5:0, ' K bytes of disk space.');
  108.           WriteLn(IO, 'There are currently ', FreeBytes:5:0, ' K bytes free on your disk.');
  109.           WriteLn(IO, ' ');
  110.           WriteLn(IO, 'Please insert a fresh disk (already FORMATed).');
  111.           SwappedDisk := True;
  112.           WriteLn(IO, ' ');
  113.           Write(IO, 'Hit RETURN when ready to proceed ');
  114.           ReadLn;
  115.           FreeBytes := (Free+500.0)/1000.0; {free space in K on default drive}
  116.         UNTIL (FreeBytes > (1.05*EstimatedSize))
  117.       END;
  118.  
  119.       {Save Game}
  120.       Assign(save_file, save_file_name);
  121.       Rewrite(save_file);
  122.       WriteLn(save_file, data_file_name);
  123.       WriteLn(save_file, FileSize(descr_file));
  124.       WriteLn(save_file, Num_turns);
  125.       Num_saves := Num_saves+1;
  126.       WriteLn(save_file, Num_saves);
  127.       WriteLn(save_file, num_restores);
  128.       WriteLn(save_file, ScoreAdjustment);
  129.       WriteLn(save_file, Treasure_Room);
  130.       WriteLn(save_file, Maximum_Score);
  131.       WriteLn(save_file, Current_Life);
  132.       WriteLn(save_file, Items_Being_Carried);
  133.       WriteLn(save_file, Items_Being_Worn);
  134.       IF verbose
  135.       THEN WriteLn(save_file, 'verbose')
  136.       ELSE WriteLn(save_file, 'brief');
  137.       WriteLn(save_file, Current_room);
  138.       FOR i := 0 TO MaxFlag DO
  139.         IF Flag[i]
  140.         THEN WriteLn(save_file, 'TRUE')
  141.         ELSE WriteLn(save_file, 'FALSE');
  142.       FOR i := 0 TO MaxCounter DO
  143.         WriteLn(save_file, counter[i]);
  144.       FOR i := 0 TO MaxVariable DO
  145.         WriteLn(save_file, Variable[i]);
  146.       FOR i := First_Room TO MaxRoom DO
  147.         BEGIN
  148.           IF Room[i]^.has_seen
  149.           THEN WriteLn(save_file, 'has')
  150.           ELSE WriteLn(save_file, 'has not');
  151.           WriteLn(save_file, Room[i]^.nouns_inside);
  152.           FOR Dir := NORTH TO Exit DO
  153.             WriteLn(save_file, Room[i]^.Path[Dir]);
  154.         END;
  155.       FOR i := First_noun TO MaxNoun DO
  156.         WITH N[i]^ DO
  157.           BEGIN
  158.             IF open
  159.             THEN WriteLn(save_file, 'open')
  160.             ELSE WriteLn(save_file, 'closed');
  161.             IF on
  162.             THEN WriteLn(save_file, 'on')
  163.             ELSE WriteLn(save_file, 'off');
  164.             IF locked
  165.             THEN WriteLn(save_file, 'locked')
  166.             ELSE WriteLn(save_file, 'unlocked');
  167.             IF can_shoot
  168.             THEN WriteLn(save_file, 'can_shoot')
  169.             ELSE WriteLn(save_file, 'cant_shoot');
  170.             WriteLn(save_file, num_shots);
  171.             WriteLn(save_file, location);
  172.             WriteLn(save_file, nouns_inside);
  173.             WriteLn(save_file, position);
  174.           END;
  175.       FOR i := First_creature TO MaxCreature DO
  176.         WITH M[i]^ DO
  177.           BEGIN
  178.             WriteLn(save_file, location);
  179.             WriteLn(save_file, nouns_inside);
  180.             WriteLn(save_file, counter);
  181.             WriteLn(save_file, timecounter);
  182.             IF groupmember
  183.             THEN WriteLn(save_file, 'TRUE')
  184.             ELSE WriteLn(save_file, 'FALSE');
  185.           END;
  186.       Close(save_file)
  187.     END;
  188.  
  189.     IF SwappedDisk THEN
  190.       BEGIN
  191.         WriteLn(IO, ' ');
  192.         WriteLn(IO, 'Please re-insert the Adventure Game Disk now.');
  193.         WriteLn(IO, ' ');
  194.         Write(IO, 'Hit RETURN when ready to proceed ');
  195.         ReadLn;
  196.         WriteLn(IO, ' ');
  197.       END;
  198.  
  199. AllDone:
  200.     {$I-} ChDir(OldPath);
  201.  
  202.   END;                            {save}
  203.  
  204.   {Restore Game}
  205.  
  206.   PROCEDURE Restore;
  207.  
  208.     PROCEDURE ListSavedFiles(VAR SomeOnDisk : Boolean);
  209.     LABEL Done;
  210.     TYPE strtype = String[12];
  211.     VAR fname : strtype;
  212.       List : ARRAY[1..30] OF strtype;
  213.       fncnt, Spot : Integer;
  214.       fileinfo : SearchRec;
  215.  
  216.     BEGIN
  217.       fncnt := 0;
  218.       FindFirst('*.$AV', 0, fileinfo);
  219.       IF DosError <> 0 THEN
  220.         BEGIN
  221.           WriteLn(IO, 'No saved files on this disk.  Please insert another disk and try again.');
  222.           SomeOnDisk := False;
  223.           GOTO Done;
  224.         END;
  225.       WHILE (DosError = 0) AND (fncnt < 31) DO
  226.         BEGIN
  227.           Inc(fncnt);
  228.           fname := fileinfo.name;
  229.           Spot := POS('.', fname);
  230.           IF Spot <> 0 THEN fname := Copy(fname, 1, Spot-1);
  231.           List[fncnt] := fname;
  232.           FindNext(fileinfo);
  233.         END;
  234.       SomeOnDisk := True;
  235.       Write(IO, 'Saved files on this disk:');
  236.       FOR Spot := 1 TO fncnt DO Write(IO, ' ', List[Spot]);
  237.       WriteLn(IO, ' ');
  238.       WriteLn(IO, ' ');
  239. Done:
  240.     END;                          {ListSavedFiles}
  241.  
  242.   LABEL AllDone, AlmostDone;
  243.  
  244.   VAR
  245.     i, dot_spot : Integer;
  246.     st : words;
  247.     save_file_name, Answer, OldPath : s;
  248.     save_file : Text;
  249.     old_file_name : words;
  250.     old_file_size : Integer;
  251.     Dir : Direction;
  252.     SwappedDisk, FoundSome : Boolean;
  253.  
  254.   BEGIN                           {Restore}
  255.     OldPath := '';
  256.     GetDir(0, OldPath);           {Get current Drive and/or Directory};
  257.     ChangeDriveDirectory; {Change only if player wants to change}
  258.     ListSavedFiles(FoundSome);
  259.     IF NOT FoundSome THEN
  260.       BEGIN
  261.         Pause;
  262.         ListSavedFiles(FoundSome);
  263.       END;
  264.     IF NOT FoundSome THEN
  265.       BEGIN
  266.         SwappedDisk := True;
  267.         GOTO AlmostDone;
  268.       END;
  269.     SwappedDisk := False;
  270.     Write(IO, 'Name saved under (1-8 characters, CR to abort): ');
  271.     save_file_name := GetInputString;
  272.     IF save_file_name = '' THEN GOTO AllDone; {Exit if RETURN}
  273.     WriteLn(IO, ' ');
  274.     dot_spot := POS('.', save_file_name);
  275.     IF dot_spot <> 0 THEN save_file_name := Copy(save_file_name, 1, dot_spot-1);
  276.     {strip off . and extension}
  277.     IF Length(save_file_name) > 8 THEN save_file_name := Copy(save_file_name, 1, 8);
  278.     {limit name to 8 characters}
  279.     save_file_name := save_file_name+'.$AV';
  280.     {add .$AV extension}
  281.     IF save_file_name = '' THEN GOTO AllDone; {CR to abort restore}
  282.     IF Length(save_file_name) > 0
  283.     THEN IF NOT File_Exists(save_file_name)
  284.       THEN BEGIN
  285.         WriteLn(IO, 'File not found, can''t restore ', save_file_name);
  286.         Write(IO, 'Does File exists on another disk (y/n)? ');
  287.         Answer := GetInputString;
  288.         IF (Answer[1] = 'y') OR (Answer[1] = 'Y')
  289.         THEN BEGIN
  290.           WriteLn(IO, ' ');
  291.           WriteLn(IO, 'Please insert the disk with the saved game on it now.');
  292.           WriteLn(IO, ' ');
  293.           Write(IO, 'Hit RETURN when ready to proceed ');
  294.           ReadLn;
  295.           SwappedDisk := True;
  296.           IF NOT File_Exists(save_file_name)
  297.           THEN BEGIN
  298.             WriteLn(IO, 'File not found, can''t restore ', save_file_name);
  299.             GOTO AlmostDone;
  300.           END;
  301.         END
  302.         ELSE GOTO AllDone;        {no saved file -- so kiss it off}
  303.       END;                        {can't find file on current game disk}
  304.  
  305.     {restore the game}
  306.     Assign(save_file, save_file_name);
  307.     Reset(save_file);
  308.     ReadLn(save_file, old_file_name);
  309.     ReadLn(save_file, old_file_size);
  310.     IF (old_file_name <> data_file_name)
  311.     THEN WriteLn(IO, 'Saved from game "', old_file_name,
  312.                  '" - can''t restore')
  313.     ELSE IF (old_file_size <> FileSize(descr_file))
  314.     THEN WriteLn(IO, 'File changed since this game was saved - can''t restore')
  315.     ELSE BEGIN
  316.       ReadLn(save_file, st);
  317.       Num_turns := Value(st);
  318.       ReadLn(save_file, st);
  319.       Num_saves := Value(st);
  320.       ReadLn(save_file, st);
  321.       num_restores := Value(st)+1;
  322.       ReadLn(save_file, st);
  323.       ScoreAdjustment := Value(st);
  324.       ReadLn(save_file, st);
  325.       Treasure_Room := Value(st);
  326.       ReadLn(save_file, st);
  327.       Maximum_Score := Value(st);
  328.       ReadLn(save_file, st);
  329.       Current_Life := Value(st);
  330.       ReadLn(save_file, st);
  331.       Items_Being_Carried := Value(st);
  332.       ReadLn(save_file, st);
  333.       Items_Being_Worn := Value(st);
  334.       ReadLn(save_file, st);
  335.       verbose := (st = 'verbose');
  336.       ReadLn(save_file, st);
  337.       Current_room := Value(st);
  338.       FOR i := 0 TO MaxFlag DO
  339.         BEGIN
  340.           ReadLn(save_file, st);
  341.           Flag[i] := (st = 'TRUE')
  342.         END;
  343.       FOR i := 0 TO MaxCounter DO
  344.         BEGIN
  345.           ReadLn(save_file, st);
  346.           counter[i] := Value(st);
  347.         END;
  348.       FOR i := 0 TO MaxVariable DO
  349.         BEGIN
  350.           ReadLn(save_file, st);
  351.           Variable[i] := Value(st);
  352.         END;
  353.       FOR i := First_Room TO MaxRoom DO
  354.         BEGIN
  355.           ReadLn(save_file, st);
  356.           Room[i]^.has_seen := (st = 'has');
  357.           ReadLn(save_file, st);
  358.           Room[i]^.nouns_inside := Value(st);
  359.           FOR Dir := NORTH TO Exit DO
  360.             BEGIN
  361.               ReadLn(save_file, st);
  362.               Room[i]^.Path[Dir] := Value(st);
  363.             END;
  364.         END;
  365.       FOR i := First_noun TO MaxNoun DO
  366.         WITH N[i]^ DO
  367.           BEGIN
  368.             ReadLn(save_file, st);
  369.             open := (st = 'open');
  370.             ReadLn(save_file, st);
  371.             on := (st = 'on');
  372.             ReadLn(save_file, st);
  373.             locked := (st = 'locked');
  374.             ReadLn(save_file, st);
  375.             can_shoot := (st = 'can_shoot');
  376.             ReadLn(save_file, st);
  377.             num_shots := Value(st);
  378.             ReadLn(save_file, st);
  379.             location := Value(st);
  380.             ReadLn(save_file, st);
  381.             nouns_inside := Value(st);
  382.             ReadLn(save_file, position);
  383.           END;
  384.       FOR i := First_creature TO MaxCreature DO
  385.         WITH M[i]^ DO
  386.           BEGIN
  387.             ReadLn(save_file, st);
  388.             location := Value(st);
  389.             ReadLn(save_file, st);
  390.             nouns_inside := Value(st);
  391.             ReadLn(save_file, st);
  392.             counter := Value(st);
  393.             ReadLn(save_file, st);
  394.             timecounter := Value(st);
  395.             ReadLn(save_file, st);
  396.             groupmember := (st = 'TRUE')
  397.           END;
  398.       Close(save_file);
  399.       CLRSCR;
  400.       Previous_room := 3000;      {forces "verbose" description}
  401.       Describe_scene;
  402.     END;
  403.  
  404. AlmostDone:
  405.  
  406.     IF SwappedDisk THEN
  407.       BEGIN
  408.         WriteLn(IO, ' ');
  409.         WriteLn(IO, 'Please re-insert the Adventure Game Disk now.');
  410.         WriteLn(IO, ' ');
  411.         Write(IO, 'Hit RETURN when ready to proceed ');
  412.         ReadLn;
  413.       END;
  414.  
  415. AllDone:
  416.     {$I-} ChDir(OldPath);
  417.  
  418.   END;                            {restore}
  419.  
  420.