early-roguelike/urogue/save.c
John "Elwin" Edwards fc0b18d304 UltraRogue: restrict changing name and save file.
When the -n option is in use, player name and save file location cannot
be changed.  The score file is also restricted.
2017-02-12 20:16:57 -05:00

173 lines
3.2 KiB
C

/*
save.c - save and restore routines
UltraRogue: The Ultimate Adventure in the Dungeons of Doom
Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
All rights reserved.
Based on "Advanced Rogue"
Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
All rights reserved.
Based on "Rogue: Exploring the Dungeons of Doom"
Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
All rights reserved.
See the file LICENSE.TXT for full copyright and licensing information.
*/
#define _ALL_SOURCE /* need to remove need for this AIXism */
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include "rogue.h"
int save_savedir_game(void);
int
save_game(void)
{
FILE *savefd;
char buf[2 * LINELEN];
char oldfile[2*LINELEN];
if (use_savedir)
return save_savedir_game();
/* get file name */
strcpy(oldfile,file_name);
do
{
mpos = 0;
if (oldfile[0] != '\0')
msg("Save file [%s]: ", file_name);
else
msg("Save file as: ");
mpos = 0;
buf[0] = '\0';
if (get_string(buf, cw) == QUIT)
{
msg("");
return(FALSE);
}
if ( (buf[0] == 0) && (oldfile[0] != 0) )
strcpy(file_name, oldfile);
else if (buf[0] != 0)
strcpy(file_name, buf);
else
{
msg("");
return(FALSE);
}
wclear(hw);
wmove(hw, LINES - 1, 0);
wrefresh(hw);
if ((savefd = fopen(file_name, "w")) == NULL)
msg(strerror(errno)); /* fake perror() */
}
while (savefd == NULL);
/* write out [compressed?] file */
save_file(savefd);
return(TRUE);
}
/*
* save_savedir_game()
* Simplified save function for when system savefiles are used.
*/
int
save_savedir_game(void)
{
FILE *savef;
char c;
mpos = 0;
msg("Save game? ");
c = readcharw(cw);
if (c == 'y' || c == 'Y')
{
if ((savef = fopen(file_name, "w")) == NULL)
{
msg(strerror(errno));
return(FALSE);
}
msg("");
save_file(savef);
return(TRUE);
}
else
{
msg("");
return(FALSE);
}
}
int
restore(char *file)
{
FILE *infd;
char *sp;
if (strcmp(file, "-r") == 0)
file = file_name;
if ((infd = fopen(file, "r")) == NULL)
{
if (use_savedir && errno == ENOENT)
return TRUE;
perror(file);
return(FALSE);
}
if ( restore_file(infd) == FALSE )
return(FALSE);
/*
* we do not close the file so that we will have a hold of the inode
* for as long as possible
*/
if (remove(file) < 0)
{
printf("Cannot unlink file\n");
return(FALSE);
}
if ((sp = getenv("OPTIONS")) != NULL)
parse_opts(sp);
strcpy(file_name, file);
clearok(cw, TRUE);
touchwin(cw);
noecho();
nonl();
while(playing)
{
do_daemons(BEFORE);
do_fuses(BEFORE);
command(); /* Command execution */
if (after)
do_after_effects();
}
fatal("");
return(FALSE);
}