diff options
-rw-r--r-- | engines/glk/alan3/alan3.cpp | 3 | ||||
-rw-r--r-- | engines/glk/alan3/alan3.h | 4 | ||||
-rw-r--r-- | engines/glk/alan3/glkio.cpp | 39 | ||||
-rw-r--r-- | engines/glk/alan3/glkio.h | 20 | ||||
-rw-r--r-- | engines/glk/alan3/inter.cpp | 1 |
5 files changed, 50 insertions, 17 deletions
diff --git a/engines/glk/alan3/alan3.cpp b/engines/glk/alan3/alan3.cpp index 990874ee58..33ccf75c20 100644 --- a/engines/glk/alan3/alan3.cpp +++ b/engines/glk/alan3/alan3.cpp @@ -41,8 +41,7 @@ namespace Alan3 { Alan3 *g_vm = nullptr; -Alan3::Alan3(OSystem *syst, const GlkGameDescription &gameDesc) : GlkIO(syst, gameDesc), - vm_exited_cleanly(false), _pendingLook(false) { +Alan3::Alan3(OSystem *syst, const GlkGameDescription &gameDesc) : GlkIO(syst, gameDesc) { g_vm = this; // main diff --git a/engines/glk/alan3/alan3.h b/engines/glk/alan3/alan3.h index ffb6282ece..f1d88f857f 100644 --- a/engines/glk/alan3/alan3.h +++ b/engines/glk/alan3/alan3.h @@ -33,9 +33,7 @@ namespace Alan3 { */ class Alan3 : public GlkIO { public: - bool vm_exited_cleanly; Common::String _advName; - bool _pendingLook; private: /** * Initialization @@ -73,7 +71,7 @@ public: * Save the game. The passed write stream represents access to the UMem chunk * in the Quetzal save file that will be created */ - virtual Common::Error writeGameData(Common::WriteStream *ws) override; + virtual Common::Error writeGameData(Common::WriteStream *ws) override;; }; extern Alan3 *g_vm; diff --git a/engines/glk/alan3/glkio.cpp b/engines/glk/alan3/glkio.cpp index 15c3278916..61e9f180f1 100644 --- a/engines/glk/alan3/glkio.cpp +++ b/engines/glk/alan3/glkio.cpp @@ -62,21 +62,21 @@ void GlkIO::print(const char *fmt, ...) { va_list argp; va_start(argp, fmt); + Common::String str = Common::String::vformat(fmt, argp); + va_end(argp); + if (glkMainWin) { - char buf[1024]; /* FIXME: buf size should be foolproof */ - vsprintf(buf, fmt, argp); - glk_put_string(buf); + glk_put_string(str.c_str()); } else { // assume stdio is available in this case only - Common::String str = Common::String::vformat(fmt, argp); - warning(fmt, argp); + warning("%s", str.c_str()); } - - va_end(argp); } void GlkIO::showImage(int image, int align) { uint ecode; + if (_saveSlot != -1) + return; if ((glk_gestalt(gestalt_Graphics, 0) == 1) && (glk_gestalt(gestalt_DrawImage, wintype_TextBuffer) == 1)) { @@ -88,6 +88,9 @@ void GlkIO::showImage(int image, int align) { } void GlkIO::playSound(int sound) { + if (_saveSlot != -1) + return; + #ifdef GLK_MODULE_SOUND static schanid_t soundChannel = NULL; @@ -127,8 +130,7 @@ void GlkIO::statusLine(CONTEXT) { char line[100]; int pcol = col; - if (!statusLineOption) return; - if (glkStatusWin == NULL) + if (!statusLineOption || _saveSlot != -1 || glkStatusWin == nullptr) return; glk_set_window(glkStatusWin); @@ -171,7 +173,13 @@ bool GlkIO::readLine(CONTEXT, char *buffer, size_t maxLen) { static frefid_t commandFileRef; static strid_t commandFile; - if (readingCommands) { + if (_saveSlot != -1) { + // Return a "restore" command + forcePrint("> "); + forcePrint("restore\n"); + strcpy(buffer, "restore"); + + } else if (readingCommands) { if (glk_get_line_stream(commandFile, buffer, maxLen) == 0) { glk_stream_close(commandFile, NULL); readingCommands = FALSE; @@ -180,6 +188,7 @@ bool GlkIO::readLine(CONTEXT, char *buffer, size_t maxLen) { printf(buffer); glk_set_style(style_Normal); } + } else { glk_request_line_event(glkMainWin, buffer, maxLen, 0); @@ -214,5 +223,15 @@ bool GlkIO::readLine(CONTEXT, char *buffer, size_t maxLen) { return TRUE; } +Common::Error GlkIO::loadGame() { + if (_saveSlot != -1) { + int saveSlot = _saveSlot; + _saveSlot = -1; + return loadGameState(saveSlot); + } else { + return GlkAPI::loadGame(); + } +} + } // End of namespace Alan3 } // End of namespace Glk diff --git a/engines/glk/alan3/glkio.h b/engines/glk/alan3/glkio.h index 55c8ab6cab..fb342d1569 100644 --- a/engines/glk/alan3/glkio.h +++ b/engines/glk/alan3/glkio.h @@ -48,7 +48,17 @@ public: */ GlkIO(OSystem *syst, const GlkGameDescription &gameDesc); - void print(const char *, ...); + /** + * Print a string to the window + */ + void print(const char *fmt, ...); + + /** + * Outputs a string to the window, even during startup + */ + void forcePrint(const char *str) { + glk_put_string(str); + } void showImage(int image, int align); @@ -66,9 +76,15 @@ public: void flowBreak() { /* Make a new paragraph, i.e one empty line (one or two newlines). */ - if (glk_gestalt(gestalt_Graphics, 0) == 1) + if (_saveSlot == -1 && glk_gestalt(gestalt_Graphics, 0) == 1) glk_window_flow_break(glkMainWin); } + + /** + * If a savegame was selected to be loaded from the launcher, then load it. + * Otherwise, prompt the user for a savegame to load, and then load it + */ + Common::Error loadGame(); }; extern GlkIO *g_io; diff --git a/engines/glk/alan3/inter.cpp b/engines/glk/alan3/inter.cpp index 5ee5ea976e..3647548a41 100644 --- a/engines/glk/alan3/inter.cpp +++ b/engines/glk/alan3/inter.cpp @@ -21,6 +21,7 @@ */ #include "glk/alan3/inter.h" +#include "glk/alan3/alan3.h" #include "glk/alan3/current.h" #include "glk/alan3/exe.h" #include "glk/alan3/syserr.h" |