Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot save or otherwise specify filenames #1

Closed
ziz opened this issue Apr 2, 2012 · 1 comment
Closed

Cannot save or otherwise specify filenames #1

ziz opened this issue Apr 2, 2012 · 1 comment

Comments

@ziz
Copy link

ziz commented Apr 2, 2012

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.

@erkyrath
Copy link
Owner

This went in with the 0.2.1 release. When prompting, the update call contains a specialinput object, and the event that comes back has type specialresponse.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants