changeset 137:443c8bd3e290

xrogue: restrict changes to the save file location. When using the -n option, disallow changing file_name or whoami via options or dialogs.
author John "Elwin" Edwards
date Sat, 02 May 2015 07:31:14 -0400
parents 1fbdefa82533
children dd137c35c3b1
files xrogue/options.c xrogue/save.c
diffstat 2 files changed, 52 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/xrogue/options.c	Wed Apr 22 16:03:00 2015 -0400
+++ b/xrogue/options.c	Sat May 02 07:31:14 2015 -0400
@@ -51,6 +51,9 @@
         put_quest(),
     get_default();
 
+int get_str_prot(char *opt, WINDOW *win);
+bool allowchange(OPTION *op);
+
 OPTION  optlist[] = {
     {"terse",   "Terse output: ",
                 (int *) &terse,         put_bool,       get_bool        },
@@ -67,11 +70,11 @@
     {"overlay", "Overlay menu: ",
                 (int *) &menu_overlay,  put_bool,       get_bool        },
     {"name",    "Name: ",
-                (int *) whoami,         put_str,        get_str         },
+                (int *) whoami,         put_str,        get_str_prot    },
     {"file",    "Save file: ",
-                (int *) file_name,      put_str,        get_str         },
+                (int *) file_name,      put_str,        get_str_prot    },
     {"score",   "Score file: ",
-                (int *) score_file,     put_str,        get_str         },
+                (int *) score_file,     put_str,        get_str_prot    },
     {"class",   "Character type: ",
                 (int *) &char_type,     put_abil,       get_abil        },
     {"quest",   "Quest item: ",
@@ -407,8 +410,10 @@
                     strucpy(start, str, (char *) sp - str);
 
                     /* Put the value into the option field */
-                    if (op->o_putfunc != put_abil) 
-                        strcpy((char *)op->o_opt, value);
+                    if (op->o_putfunc != put_abil) {
+                        if (allowchange(op))
+                            strcpy((char *)op->o_opt, value);
+                    }
 
                     else if (*op->o_opt == -1) { /* Only init ability once */
                         register int len = strlen(value);
@@ -500,3 +505,32 @@
     waddstr(win, str);
 }
 
+/* Like get_str, but disallows changes when use_savedir is set. */
+int
+get_str_prot(char *opt, WINDOW *win)
+{
+    int oy, ox;
+
+    if (use_savedir) {
+        getyx(win, oy, ox);
+        waddstr(win, opt);
+        return get_ro(win, oy, ox);
+    }
+    else {
+        return get_str(opt, win);
+    }
+}
+
+bool
+allowchange(OPTION *op)
+{
+    if (!use_savedir)
+        return TRUE;
+    if (!strcmp(op->o_name, "name"))
+        return FALSE;
+    if (!strcmp(op->o_name, "file"))
+        return FALSE;
+    if (!strcmp(op->o_name, "score"))
+        return FALSE;
+    return TRUE;
+}
--- a/xrogue/save.c	Wed Apr 22 16:03:00 2015 -0400
+++ b/xrogue/save.c	Sat May 02 07:31:14 2015 -0400
@@ -43,7 +43,10 @@
     mpos = 0;
     if (file_name[0] != '\0')
     {
-        msg("Save file (%s)? ", file_name);
+        if (use_savedir)
+            msg("Save game? ");
+        else
+            msg("Save file (%s)? ", file_name);
         do
         {
             c = wgetch(cw);
@@ -59,6 +62,11 @@
     else
         goto gotfile; /* must save to file restored from */
 
+    if (use_savedir) {
+        msg("");
+        return FALSE;
+    }
+
     do
     {
         msg("File name: ");
@@ -72,8 +80,11 @@
         strcpy(file_name, buf);
 gotfile:
 
-        if ((savef = fopen(file_name, "wb")) == NULL)
+        if ((savef = fopen(file_name, "wb")) == NULL) {
              msg(strerror(errno));
+             if (use_savedir)
+                 return FALSE;
+        }
     } while (savef == NULL);
 
     msg("");