home *** CD-ROM | disk | FTP | other *** search
-
- {SAVEREST.PA2}
-
- PROCEDURE ChangeDriveDirectory;
-
- VAR
- NumPara, Spot : Integer;
- P, p1, p2, p3 : words;
- Answer : s;
-
- PROCEDURE Handle_File_Name;
-
- BEGIN
- IF POS(':', p2) = 0 THEN
- BEGIN
- Spot := Length(p2);
- IF Spot = 1 THEN p2 := p2 + ':'; {append : to Drive Letter}
- END;
- IF p2 <> '' THEN {need to change directory}
- BEGIN
- Spot := Length(p2);
- IF p2[Spot] = '\' THEN p2 := Copy(p2, 1, Spot-1); {strip off last '\'}
- {$I-} ChDir(p2);
- IF IoResult <> 0 THEN
- WriteLn(IO,'Cannot find Drive and/or Directory: ', p2);
- END; {change directory}
- END; {Handle_File_Name}
-
- BEGIN
- {$V-}
- Write(IO, 'Do you want to change either the Drive or the Directory? (Y or N): ');
- Answer := GetInputString;
- Capitalize(Answer);
- IF Answer[1] = 'Y' THEN
- BEGIN
- Write(IO, 'Enter the Drive and/or the Directory (i.e., A: or B:\SAVED): ');
- Answer := GetInputString;
- p2 := Answer;
- Handle_File_Name;
- END;
- END; {ChangeDriveDirectory}
-
-
- {Save Game}
-
- PROCEDURE Save;
-
- LABEL AllDone;
-
- VAR
- i, dot_spot : Integer;
- save_file_name, OldPath : s;
- save_file : Text;
- SwappedDisk : Boolean;
- Answer : s;
- EstimatedSize, FreeBytes : Real;
- Dir : Direction;
-
- FUNCTION Free : Real;
- {Returns free space on the default disk}
- VAR
- reg : registers;
-
- BEGIN {Free}
- WITH reg DO
- BEGIN
- ah := $36; {DOS function number}
- dl := $00; {drive number: default=00;a=01,b=02,c=03,etc}
- MSDOS(Dos.registers(reg)); {call DOS}
- Free := 1.0*ax*bx*cx; {multiple by 1.0 to create a REAL value}
- END;
- END; {Free}
-
- BEGIN {save}
- OldPath := '';
- GetDir(0, OldPath); {Get current Drive and/or Directory};
- ChangeDriveDirectory; {Change only if player wants to change}
- SwappedDisk := False;
- Write(IO, 'Name to save under (1-8 characters, CR to abort): ');
- save_file_name := GetInputString;
- IF save_file_name = '' THEN GOTO AllDone; {Exit if RETURN}
- dot_spot := POS('.', save_file_name);
- IF dot_spot <> 0 THEN save_file_name := Copy(save_file_name, 1, dot_spot-1);
- {strip off . and extension}
- IF Length(save_file_name) > 8 THEN save_file_name := Copy(save_file_name, 1, 8);
- {limit name to 8 characters}
- save_file_name := save_file_name+'.$AV';
- {add .$AV extension}
- EstimatedSize := 20.0; {Large saved file takes 14K -- 20K is plenty}
- FreeBytes := (Free+500.0)/1000.0; {free space in K on default drive}
- IF Length(save_file_name) > 0
- THEN BEGIN
- IF File_Exists(save_file_name)
- THEN BEGIN
- Write(IO, 'File exists. Overwrite (y/n)?');
- Answer := GetInputString;
- IF (Answer[1] <> 'y') AND (Answer[1] <> 'Y')
- THEN save_file_name := ''
- ELSE EstimatedSize := 0.1;
- END;
- IF save_file_name = '' THEN GOTO AllDone; {Exit if RETURN}
-
- {Wait until enough room on disk to save file}
- IF (FreeBytes < (1.05*EstimatedSize)) THEN BEGIN
- REPEAT
- WriteLn(IO, ' ');
- WriteLn(IO, 'Save files require approximately ', EstimatedSize:5:0, ' K bytes of disk space.');
- WriteLn(IO, 'There are currently ', FreeBytes:5:0, ' K bytes free on your disk.');
- WriteLn(IO, ' ');
- WriteLn(IO, 'Please insert a fresh disk (already FORMATed).');
- SwappedDisk := True;
- WriteLn(IO, ' ');
- Write(IO, 'Hit RETURN when ready to proceed ');
- ReadLn;
- FreeBytes := (Free+500.0)/1000.0; {free space in K on default drive}
- UNTIL (FreeBytes > (1.05*EstimatedSize))
- END;
-
- {Save Game}
- Assign(save_file, save_file_name);
- Rewrite(save_file);
- WriteLn(save_file, data_file_name);
- WriteLn(save_file, FileSize(descr_file));
- WriteLn(save_file, Num_turns);
- Num_saves := Num_saves+1;
- WriteLn(save_file, Num_saves);
- WriteLn(save_file, num_restores);
- WriteLn(save_file, ScoreAdjustment);
- WriteLn(save_file, Treasure_Room);
- WriteLn(save_file, Maximum_Score);
- WriteLn(save_file, Current_Life);
- WriteLn(save_file, Items_Being_Carried);
- WriteLn(save_file, Items_Being_Worn);
- IF verbose
- THEN WriteLn(save_file, 'verbose')
- ELSE WriteLn(save_file, 'brief');
- WriteLn(save_file, Current_room);
- FOR i := 0 TO MaxFlag DO
- IF Flag[i]
- THEN WriteLn(save_file, 'TRUE')
- ELSE WriteLn(save_file, 'FALSE');
- FOR i := 0 TO MaxCounter DO
- WriteLn(save_file, counter[i]);
- FOR i := 0 TO MaxVariable DO
- WriteLn(save_file, Variable[i]);
- FOR i := First_Room TO MaxRoom DO
- BEGIN
- IF Room[i]^.has_seen
- THEN WriteLn(save_file, 'has')
- ELSE WriteLn(save_file, 'has not');
- WriteLn(save_file, Room[i]^.nouns_inside);
- FOR Dir := NORTH TO Exit DO
- WriteLn(save_file, Room[i]^.Path[Dir]);
- END;
- FOR i := First_noun TO MaxNoun DO
- WITH N[i]^ DO
- BEGIN
- IF open
- THEN WriteLn(save_file, 'open')
- ELSE WriteLn(save_file, 'closed');
- IF on
- THEN WriteLn(save_file, 'on')
- ELSE WriteLn(save_file, 'off');
- IF locked
- THEN WriteLn(save_file, 'locked')
- ELSE WriteLn(save_file, 'unlocked');
- IF can_shoot
- THEN WriteLn(save_file, 'can_shoot')
- ELSE WriteLn(save_file, 'cant_shoot');
- WriteLn(save_file, num_shots);
- WriteLn(save_file, location);
- WriteLn(save_file, nouns_inside);
- WriteLn(save_file, position);
- END;
- FOR i := First_creature TO MaxCreature DO
- WITH M[i]^ DO
- BEGIN
- WriteLn(save_file, location);
- WriteLn(save_file, nouns_inside);
- WriteLn(save_file, counter);
- WriteLn(save_file, timecounter);
- IF groupmember
- THEN WriteLn(save_file, 'TRUE')
- ELSE WriteLn(save_file, 'FALSE');
- END;
- Close(save_file)
- END;
-
- IF SwappedDisk THEN
- BEGIN
- WriteLn(IO, ' ');
- WriteLn(IO, 'Please re-insert the Adventure Game Disk now.');
- WriteLn(IO, ' ');
- Write(IO, 'Hit RETURN when ready to proceed ');
- ReadLn;
- WriteLn(IO, ' ');
- END;
-
- AllDone:
- {$I-} ChDir(OldPath);
-
- END; {save}
-
- {Restore Game}
-
- PROCEDURE Restore;
-
- PROCEDURE ListSavedFiles(VAR SomeOnDisk : Boolean);
- LABEL Done;
- TYPE strtype = String[12];
- VAR fname : strtype;
- List : ARRAY[1..30] OF strtype;
- fncnt, Spot : Integer;
- fileinfo : SearchRec;
-
- BEGIN
- fncnt := 0;
- FindFirst('*.$AV', 0, fileinfo);
- IF DosError <> 0 THEN
- BEGIN
- WriteLn(IO, 'No saved files on this disk. Please insert another disk and try again.');
- SomeOnDisk := False;
- GOTO Done;
- END;
- WHILE (DosError = 0) AND (fncnt < 31) DO
- BEGIN
- Inc(fncnt);
- fname := fileinfo.name;
- Spot := POS('.', fname);
- IF Spot <> 0 THEN fname := Copy(fname, 1, Spot-1);
- List[fncnt] := fname;
- FindNext(fileinfo);
- END;
- SomeOnDisk := True;
- Write(IO, 'Saved files on this disk:');
- FOR Spot := 1 TO fncnt DO Write(IO, ' ', List[Spot]);
- WriteLn(IO, ' ');
- WriteLn(IO, ' ');
- Done:
- END; {ListSavedFiles}
-
- LABEL AllDone, AlmostDone;
-
- VAR
- i, dot_spot : Integer;
- st : words;
- save_file_name, Answer, OldPath : s;
- save_file : Text;
- old_file_name : words;
- old_file_size : Integer;
- Dir : Direction;
- SwappedDisk, FoundSome : Boolean;
-
- BEGIN {Restore}
- OldPath := '';
- GetDir(0, OldPath); {Get current Drive and/or Directory};
- ChangeDriveDirectory; {Change only if player wants to change}
- ListSavedFiles(FoundSome);
- IF NOT FoundSome THEN
- BEGIN
- Pause;
- ListSavedFiles(FoundSome);
- END;
- IF NOT FoundSome THEN
- BEGIN
- SwappedDisk := True;
- GOTO AlmostDone;
- END;
- SwappedDisk := False;
- Write(IO, 'Name saved under (1-8 characters, CR to abort): ');
- save_file_name := GetInputString;
- IF save_file_name = '' THEN GOTO AllDone; {Exit if RETURN}
- WriteLn(IO, ' ');
- dot_spot := POS('.', save_file_name);
- IF dot_spot <> 0 THEN save_file_name := Copy(save_file_name, 1, dot_spot-1);
- {strip off . and extension}
- IF Length(save_file_name) > 8 THEN save_file_name := Copy(save_file_name, 1, 8);
- {limit name to 8 characters}
- save_file_name := save_file_name+'.$AV';
- {add .$AV extension}
- IF save_file_name = '' THEN GOTO AllDone; {CR to abort restore}
- IF Length(save_file_name) > 0
- THEN IF NOT File_Exists(save_file_name)
- THEN BEGIN
- WriteLn(IO, 'File not found, can''t restore ', save_file_name);
- Write(IO, 'Does File exists on another disk (y/n)? ');
- Answer := GetInputString;
- IF (Answer[1] = 'y') OR (Answer[1] = 'Y')
- THEN BEGIN
- WriteLn(IO, ' ');
- WriteLn(IO, 'Please insert the disk with the saved game on it now.');
- WriteLn(IO, ' ');
- Write(IO, 'Hit RETURN when ready to proceed ');
- ReadLn;
- SwappedDisk := True;
- IF NOT File_Exists(save_file_name)
- THEN BEGIN
- WriteLn(IO, 'File not found, can''t restore ', save_file_name);
- GOTO AlmostDone;
- END;
- END
- ELSE GOTO AllDone; {no saved file -- so kiss it off}
- END; {can't find file on current game disk}
-
- {restore the game}
- Assign(save_file, save_file_name);
- Reset(save_file);
- ReadLn(save_file, old_file_name);
- ReadLn(save_file, old_file_size);
- IF (old_file_name <> data_file_name)
- THEN WriteLn(IO, 'Saved from game "', old_file_name,
- '" - can''t restore')
- ELSE IF (old_file_size <> FileSize(descr_file))
- THEN WriteLn(IO, 'File changed since this game was saved - can''t restore')
- ELSE BEGIN
- ReadLn(save_file, st);
- Num_turns := Value(st);
- ReadLn(save_file, st);
- Num_saves := Value(st);
- ReadLn(save_file, st);
- num_restores := Value(st)+1;
- ReadLn(save_file, st);
- ScoreAdjustment := Value(st);
- ReadLn(save_file, st);
- Treasure_Room := Value(st);
- ReadLn(save_file, st);
- Maximum_Score := Value(st);
- ReadLn(save_file, st);
- Current_Life := Value(st);
- ReadLn(save_file, st);
- Items_Being_Carried := Value(st);
- ReadLn(save_file, st);
- Items_Being_Worn := Value(st);
- ReadLn(save_file, st);
- verbose := (st = 'verbose');
- ReadLn(save_file, st);
- Current_room := Value(st);
- FOR i := 0 TO MaxFlag DO
- BEGIN
- ReadLn(save_file, st);
- Flag[i] := (st = 'TRUE')
- END;
- FOR i := 0 TO MaxCounter DO
- BEGIN
- ReadLn(save_file, st);
- counter[i] := Value(st);
- END;
- FOR i := 0 TO MaxVariable DO
- BEGIN
- ReadLn(save_file, st);
- Variable[i] := Value(st);
- END;
- FOR i := First_Room TO MaxRoom DO
- BEGIN
- ReadLn(save_file, st);
- Room[i]^.has_seen := (st = 'has');
- ReadLn(save_file, st);
- Room[i]^.nouns_inside := Value(st);
- FOR Dir := NORTH TO Exit DO
- BEGIN
- ReadLn(save_file, st);
- Room[i]^.Path[Dir] := Value(st);
- END;
- END;
- FOR i := First_noun TO MaxNoun DO
- WITH N[i]^ DO
- BEGIN
- ReadLn(save_file, st);
- open := (st = 'open');
- ReadLn(save_file, st);
- on := (st = 'on');
- ReadLn(save_file, st);
- locked := (st = 'locked');
- ReadLn(save_file, st);
- can_shoot := (st = 'can_shoot');
- ReadLn(save_file, st);
- num_shots := Value(st);
- ReadLn(save_file, st);
- location := Value(st);
- ReadLn(save_file, st);
- nouns_inside := Value(st);
- ReadLn(save_file, position);
- END;
- FOR i := First_creature TO MaxCreature DO
- WITH M[i]^ DO
- BEGIN
- ReadLn(save_file, st);
- location := Value(st);
- ReadLn(save_file, st);
- nouns_inside := Value(st);
- ReadLn(save_file, st);
- counter := Value(st);
- ReadLn(save_file, st);
- timecounter := Value(st);
- ReadLn(save_file, st);
- groupmember := (st = 'TRUE')
- END;
- Close(save_file);
- CLRSCR;
- Previous_room := 3000; {forces "verbose" description}
- Describe_scene;
- END;
-
- AlmostDone:
-
- IF SwappedDisk THEN
- BEGIN
- WriteLn(IO, ' ');
- WriteLn(IO, 'Please re-insert the Adventure Game Disk now.');
- WriteLn(IO, ' ');
- Write(IO, 'Hit RETURN when ready to proceed ');
- ReadLn;
- END;
-
- AllDone:
- {$I-} ChDir(OldPath);
-
- END; {restore}
-