Skip to content

Cannot save or otherwise specify filenames #1

@ziz

Description

@ziz

Since there is no method for interrogating the client as to what filename to use for a save game or similar, one cannot save or restore using remglk at this time.

I have written an embarrassingly cheap hack to allow saving - basically, add a "savename" field to the line input you're returning before the system needs a filename.

diff --git a/rgdata.c b/rgdata.c
index 499fc58..1e73ae0 100644
--- a/rgdata.c
+++ b/rgdata.c
@@ -1023,6 +1023,11 @@ data_event_t *data_event_read()
         dat = data_raw_struct_field(rawdata, "terminator");
         if (dat)
             input->terminator = data_raw_str_char(dat);
+
+        dat = data_raw_struct_field(rawdata, "savefile");
+        if (dat)
+           rgfref_set_nextsavename(data_raw_str_dup(dat), dat->count);
+
     }
     else if (data_raw_string_is(dat, "char")) {
         input->dtag = dtag_Char;
diff --git a/rgdata.h b/rgdata.h
index 9568024..8904d38 100644
--- a/rgdata.h
+++ b/rgdata.h
@@ -163,3 +163,5 @@ extern data_line_t *data_line_alloc(void);
 extern void data_line_free(data_line_t *data);
 extern void data_line_add_span(data_line_t *data, short style, glui32 *str, long len);
 extern void data_line_print(data_line_t *data, glui32 wintype);
+
+extern void rgfref_set_nextsavename(glui32 *filename, glui32 length);
diff --git a/rgfref.c b/rgfref.c
index e1bcb2a..e33694a 100644
--- a/rgfref.c
+++ b/rgfref.c
@@ -24,10 +24,23 @@ static fileref_t *gli_filereflist = NULL;

 static char workingdir[BUFLEN] = ".";
 static char lastsavename[BUFLEN] = "game.glksave";
+static char nextsavename[BUFLEN] = "game";
 static char lastscriptname[BUFLEN] = "script.txt";
 static char lastcmdname[BUFLEN] = "commands.txt";
 static char lastdataname[BUFLEN] = "file.glkdata";

+void rgfref_set_nextsavename(glui32 *filename, glui32 length)
+{
+   glui32 ptr;
+   /* Silently avoid buffer overflows */
+   if (length >= BUFLEN)
+       return;
+   for (ptr = 0; ptr < length; ptr++) {
+       nextsavename[ptr] = filename[ptr];
+   }
+   nextsavename[length] = 0;
+}
+
 fileref_t *gli_new_fileref(char *filename, glui32 usage, glui32 rock)
 {
     fileref_t *fref = (fileref_t *)malloc(sizeof(fileref_t));
@@ -246,10 +259,13 @@ frefid_t glk_fileref_create_by_prompt(glui32 usage, glui32 fmode,
         val = 0;
     }

+    strcpy(buf, nextsavename);
+    val = strlen(buf);
+
     ix = NULL; /*### fetch somehow */
     if (!ix) {
         /* The player cancelled input. */
-        return NULL;
+        /*return NULL; */
     }

     /* Trim whitespace from end and beginning. */

Example message (specifying a SAVE command, with a savefile name of 'foobar'):

{"type":"line","gen":1,"window":30,"value":"SAVE","savefile":"foobar"}

I don't recommend this at all for long-term use, but if you're impatient like me, it'll get you by until a real solution has been devised and implemented.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions