diff --git a/rogue4/Makefile b/rogue4/Makefile index 3e6c728..a6cd35d 100644 --- a/rogue4/Makefile +++ b/rogue4/Makefile @@ -26,13 +26,14 @@ CFILES= vers.c extern.c armor.c chase.c command.c daemon.c daemons.c \ MISC= Makefile LICENSE.TXT rogue.6 rogue.me CC = gcc -CFLAGS= -O3 +CFLAGS= -O3 -DSAVEDIR=\"/usr/local/games/roguelike/rogue4save/\" CRLIB = -lcurses RM = rm -f TAR = tar SCOREFILE= -SF=-DSCOREFILE=\"rogue52.scr\" -DLOCKFILE=\"rogue52.lck\" +SF=-DSCOREFILE=\"/usr/local/games/roguelike/rogue4.scr\" \ + -DLOCKFILE=\"/usr/local/games/roguelike/rogue4.lck\" NAMELIST= NL= #MACHDEP= -DMAXLOAD=40 -DLOADAV -DCHECKTIME=4 diff --git a/rogue4/extern.c b/rogue4/extern.c index 138891b..de00c11 100644 --- a/rogue4/extern.c +++ b/rogue4/extern.c @@ -32,6 +32,7 @@ bool running = FALSE; /* True if player is running */ bool save_msg = TRUE; /* Remember last msg */ bool slow_invent = FALSE; /* Inventory one line at a time */ bool terse = FALSE; /* True if we should be short */ +bool use_savedir = FALSE; /* True if using system savefile area */ #ifdef WIZARD bool wizard = FALSE; /* True if allows wizard commands */ #endif diff --git a/rogue4/extern.h b/rogue4/extern.h index d559647..1ebbbe0 100644 --- a/rogue4/extern.h +++ b/rogue4/extern.h @@ -28,7 +28,7 @@ extern bool after, amulet, askme, door_stop, fight_flush, firstmove, in_shell, jump, noscore, p_know[], passgo, playing, r_know[], running, s_know[], save_msg, - slow_invent, terse, wizard, ws_know[]; + slow_invent, terse, use_savedir, wizard, ws_know[]; extern const char *p_colors[], *r_stones[], *w_names[], diff --git a/rogue4/mach_dep.c b/rogue4/mach_dep.c index cf1d7b9..7333bc3 100644 --- a/rogue4/mach_dep.c +++ b/rogue4/mach_dep.c @@ -77,7 +77,9 @@ open_score() #else fd = -1; #endif - md_normaluser(); + if (!use_savedir) + md_normaluser(); + return; } /* diff --git a/rogue4/main.c b/rogue4/main.c index ab72a3a..17e3978 100644 --- a/rogue4/main.c +++ b/rogue4/main.c @@ -71,16 +71,36 @@ char **envp; } #endif +#ifdef SAVEDIR + if (argc >= 3 && !strcmp(argv[1], "-n")) + { + strncpy(whoami, argv[2], MAXSTR - 1); + whoami[MAXSTR - 1] = '\0'; /* insurance */ + use_savedir = TRUE; + /* look for savefile at SAVEDIR/UIDplayername.r4sav */ + if (snprintf(file_name, MAXSTR, "%s%d%.10s.r4sav", SAVEDIR, md_getuid(), + whoami) >= MAXSTR) + { + /* Name is too long- this shouldn't happen */ + strcpy(file_name, "rogue4.save"); + use_savedir = FALSE; + } + } +#endif + /* * get home and options from environment */ strncpy(home, md_gethomedir(), PATH_MAX); - strcpy(file_name, home); - strcat(file_name, "rogue52.sav"); + if (!use_savedir) + { + strcpy(file_name, home); + strcat(file_name, "/rogue4.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(md_getuid()), strlen(md_getusername(md_getuid()))); if (env == NULL || fruit[0] == '\0') strcpy(fruit, "slime-mold"); @@ -96,12 +116,27 @@ char **envp; exit(0); } init_check(); /* check for legal startup */ - if (argc == 2) + + 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 */ { endwin(); exit(1); } + } + + if (!use_savedir) + md_normaluser(); + lowtime = (int) time(NULL); #ifdef WIZARD diff --git a/rogue4/save.c b/rogue4/save.c index 93d2d25..b223fc9 100644 --- a/rogue4/save.c +++ b/rogue4/save.c @@ -197,6 +197,12 @@ char **envp; if ((inf = open(file, 0)) < 0) { + if (use_savedir && errno == ENOENT) + { + /* We're using a system savefile which doesn't exist. + This isn't a fatal error, it means start a new game. */ + return TRUE; + } perror(file); return FALSE; }