Add -n option and system savedir functionality

This commit is contained in:
John "Elwin" Edwards 2009-10-14 01:32:13 +00:00
parent 4662bbf65b
commit 265ac56d38
5 changed files with 65 additions and 22 deletions

View file

@ -39,7 +39,7 @@ MISC = Makefile $(MISC_C) LICENSE.TXT $(PROGRAM).sln $(PROGRAM).vcproj $(DOCS)\
CC = gcc
ROPTS =
COPTS = -O3
CFLAGS= $(COPTS) $(ROPTS) -DSCOREFILE=\"rogue36.scr\"
CFLAGS= $(COPTS) $(ROPTS) -DSCOREFILE=\"/usr/local/games/roguelike/rogue3.scr\" -DSAVEDIR=\"/usr/local/games/roguelike/rogue3save/\"
LIBS = -lcurses
RM = rm -f
LD = $(CC)

View file

@ -20,6 +20,7 @@
int playing = TRUE, running = FALSE, wizard = FALSE;
int notify = TRUE, fight_flush = FALSE, terse = FALSE, door_stop = FALSE;
int jump = FALSE, slow_invent = FALSE, firstmove = FALSE, askme = FALSE;
int use_savedir = FALSE;
int amulet = FALSE;
int in_shell = FALSE;
struct linked_list *lvl_obj = NULL, *mlist = NULL;

View file

@ -38,12 +38,6 @@ char **envp;
open_score();
/*
* Drop setuid/setgid after opening the scoreboard file.
*/
md_normaluser();
/*
* check for print-score option
*/
@ -64,20 +58,40 @@ char **envp;
argc--;
}
/*
* get home and options from environment
*/
/* Are we using the system savefile directory? */
#ifdef SAVEDIR
if (argc >= 3 && !strcmp(argv[1], "-n"))
{
strncpy(whoami, argv[2], 79);
whoami[79] = '\0';
use_savedir = TRUE;
/* look for savefile at SAVEDIR/UIDplayername.r3sav */
if (snprintf(file_name, 80, "%s%d%.10s.r3sav", SAVEDIR, md_getuid(), whoami) >= 80)
{
/* this shouldn't happen */
strcpy(file_name, "rogue3.save");
use_savedir = FALSE;
}
}
#endif
if (use_savedir == FALSE)
{
md_normaluser();
/* because we don't need to create a file in the common savedir,
* and the scorefile is already open */
strcpy(home, md_gethomedir());
if (strlen(home) > PATH_MAX - strlen("rogue.save") - 1)
if (strlen(home) > PATH_MAX - strlen("rogue3.save") - 1)
*home = 0;
strcpy(file_name, home);
strcat(file_name, "rogue.save");
strcat(file_name, "rogue3.save");
}
if ((env = getenv("ROGUEOPTS")) != NULL)
parse_opts(env);
if (env == NULL || whoami[0] == '\0')
if (!use_savedir && (env == NULL || whoami[0] == '\0'))
strucpy(whoami, md_getusername(), strlen(md_getusername()));
if (env == NULL || fruit[0] == '\0')
strcpy(fruit, "slime-mold");
@ -90,10 +104,28 @@ char **envp;
exit(1);
}
if (argc == 2)
/* now start the game */
if (use_savedir)
{
/* Try to restore from file_name which we just set up. */
if (!restore(file_name, envp))
exit(1);
/* If restore() returns true, the system savefile doesn't exist.
So we'll start a new game. */
}
else if (argc == 2)
if (!restore(argv[1], envp)) /* Note: restore will never return */
exit(1);
/* If we reach this point, either
* 1. A system savefile was specified and doesn't exist.
* 2. No savefile was specified.
* Either way, start a new game.
*/
if (!use_savedir)
md_normaluser();
time(&now);
lowtime = (int) now;

View file

@ -492,6 +492,7 @@ extern int take; /* Thing the rogue is taking */
extern int terse; /* True if we should be int */
extern struct magic_item things[NUMTHINGS]; /* Chances for each type of item */
extern int total; /* Total dynamic memory bytes */
extern int use_savedir; /* True if using system savedir */
extern char * w_names[MAXWEAPONS]; /* Names of the various weapons */
extern char wand_mons[27];
extern int waswizard; /* Was a wizard sometime */

View file

@ -142,10 +142,19 @@ restore(char *file, char **envp)
file = file_name;
if ((inf = fopen(file, "r")) == NULL)
{
if (use_savedir && errno == ENOENT)
{
/* We're using the system savefile and it doesn't exist.
* This isn't a fatal error, we'll just start a new game. */
return TRUE;
}
else
{
perror(file);
return FALSE;
}
}
fflush(stdout);
encread(buf, 80, inf);