changeset 64:a98834ce7e04

arogue5: add the savedir feature.
author elwin
date Fri, 10 Aug 2012 05:16:08 +0000
parents 0ed67132cf10
children 7aff18a8d508
files arogue5/mach_dep.h arogue5/main.c arogue5/rogue.c arogue5/rogue.h arogue5/save.c
diffstat 5 files changed, 40 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/arogue5/mach_dep.h	Thu Aug 09 22:58:48 2012 +0000
+++ b/arogue5/mach_dep.h	Fri Aug 10 05:16:08 2012 +0000
@@ -25,7 +25,8 @@
 /*
  * where scorefile should live
  */
-#define SCOREFILE	"/bnr/contrib/lib/rogue/scorefile"
+#define SCOREFILE	"/var/local/games/roguelike/arogue5.scr"
+#define SAVEDIR		"/var/local/games/roguelike/arogue5save/"
 
 /*
  * Variables for checking to make sure the system isn't too loaded
--- a/arogue5/main.c	Thu Aug 09 22:58:48 2012 +0000
+++ b/arogue5/main.c	Fri Aug 10 05:16:08 2012 +0000
@@ -57,10 +57,29 @@
 
     strncpy(home,md_gethomedir(),LINELEN);
 
+#ifdef SAVEDIR
+    if (argc >= 3 && !strcmp(argv[1], "-n")) {
+        use_savedir = TRUE;
+        strncpy(whoami, argv[2], LINELEN);
+        whoami[LINELEN - 1] = '\0';
+        if (snprintf(file_name, LINELEN, "%s%d-%.10s.ar5sav", SAVEDIR, 
+                     md_getuid(), whoami) >= LINELEN)
+        {
+            /* The name is too long */
+            use_savedir = FALSE;
+        }
+    }
+#endif
     /* Get default save file */
-    strcpy(file_name, home);
-    strcat(file_name, "arogue58.sav");
+    if (!use_savedir) {
+        strcpy(file_name, home);
+        strcat(file_name, "arogue58.sav");
+    }
 
+#ifdef SCOREFILE
+    strncpy(score_file, SCOREFILE, LINELEN);
+    score_file[LINELEN - 1] = '\0';
+#else
     /* Get default score file */
     strcpy(score_file, roguedir);
 
@@ -68,6 +87,7 @@
         strcat(score_file,"/");
 
     strcat(score_file, "arogue58.scr");
+#endif
 
     if ((env = getenv("ROGUEOPTS")) != NULL)
 	parse_opts(env);
@@ -139,7 +159,15 @@
 	exit(1);
     }
 #endif
-    if (argc == 2)
+    if (use_savedir)
+    {
+        /* Try to restore from file_name first. */
+        if (!restore(file_name, envp))
+            exit(1);
+        /* If restore() returns true, there is no such saved game.
+           So start a new one. */
+    }
+    else if (argc == 2)
 	if (!restore(argv[1], envp)) /* Note: restore will never return */
 	    exit(1);
     lowtime = (int) time(&now);
--- a/arogue5/rogue.c	Thu Aug 09 22:58:48 2012 +0000
+++ b/arogue5/rogue.c	Fri Aug 10 05:16:08 2012 +0000
@@ -114,6 +114,7 @@
 bool askme = FALSE;
 bool in_shell = FALSE; 
 bool daytime = TRUE;
+bool use_savedir = FALSE;
 coord delta;				/* Change indicated to get_dir() */
 LEVTYPE levtype;			/* type of level i'm on */
 
--- a/arogue5/rogue.h	Thu Aug 09 22:58:48 2012 +0000
+++ b/arogue5/rogue.h	Fri Aug 10 05:16:08 2012 +0000
@@ -1096,6 +1096,7 @@
 extern bool m_know[];			/* Does he know what a MM does */
 extern bool in_shell;			/* True if executing a shell */
 extern bool daytime;			/* Indicates whether it is daytime */
+extern bool use_savedir;		/* True if using systemwide save area */
 extern coord oldpos;			/* Position before last look() call */
 extern coord delta;			/* Change indicated to get_dir() */
 extern coord grid[];			/* used for random pos generation */
--- a/arogue5/save.c	Thu Aug 09 22:58:48 2012 +0000
+++ b/arogue5/save.c	Fri Aug 10 05:16:08 2012 +0000
@@ -152,6 +152,11 @@
 
     if ((inf = open(file, O_RDONLY)) < 0)
     {
+        if (use_savedir && errno == ENOENT)
+        {
+            /* No such game in SAVEDIR */
+            return TRUE;
+        }
 	perror(file);
 	return FALSE;
     }