# HG changeset patch # User edwarj4 # Date 1256953912 0 # Node ID 63b9fd7d70cea3108fdd65e90d3f6a7b765579de # Parent 9535a08ddc3924f3b95e58863b571c4db6c3e380 rogue4: add -n option and system savedir diff -r 9535a08ddc39 -r 63b9fd7d70ce rogue4/Makefile --- a/rogue4/Makefile Sat Oct 24 16:52:52 2009 +0000 +++ b/rogue4/Makefile Sat Oct 31 01:51:52 2009 +0000 @@ -26,13 +26,14 @@ 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 -r 9535a08ddc39 -r 63b9fd7d70ce rogue4/extern.c --- a/rogue4/extern.c Sat Oct 24 16:52:52 2009 +0000 +++ b/rogue4/extern.c Sat Oct 31 01:51:52 2009 +0000 @@ -32,6 +32,7 @@ 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 -r 9535a08ddc39 -r 63b9fd7d70ce rogue4/extern.h --- a/rogue4/extern.h Sat Oct 24 16:52:52 2009 +0000 +++ b/rogue4/extern.h Sat Oct 31 01:51:52 2009 +0000 @@ -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 -r 9535a08ddc39 -r 63b9fd7d70ce rogue4/mach_dep.c --- a/rogue4/mach_dep.c Sat Oct 24 16:52:52 2009 +0000 +++ b/rogue4/mach_dep.c Sat Oct 31 01:51:52 2009 +0000 @@ -77,7 +77,9 @@ #else fd = -1; #endif - md_normaluser(); + if (!use_savedir) + md_normaluser(); + return; } /* diff -r 9535a08ddc39 -r 63b9fd7d70ce rogue4/main.c --- a/rogue4/main.c Sat Oct 24 16:52:52 2009 +0000 +++ b/rogue4/main.c Sat Oct 31 01:51:52 2009 +0000 @@ -71,16 +71,36 @@ } #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 @@ 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 -r 9535a08ddc39 -r 63b9fd7d70ce rogue4/save.c --- a/rogue4/save.c Sat Oct 24 16:52:52 2009 +0000 +++ b/rogue4/save.c Sat Oct 31 01:51:52 2009 +0000 @@ -197,6 +197,12 @@ 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; }