aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/quest/geas_runner.h
diff options
context:
space:
mode:
authorPaul Gilbert2019-07-20 14:58:39 -0700
committerPaul Gilbert2019-09-29 15:08:52 -0700
commit255f2b4c82867b3c113743d02cf91b91a15176bd (patch)
tree6157bd018d16aa066d22cdc53926fe4c17da0491 /engines/glk/quest/geas_runner.h
parent6d6dd2ed62b08a89b15982160ef79faef340d524 (diff)
downloadscummvm-rg350-255f2b4c82867b3c113743d02cf91b91a15176bd.tar.gz
scummvm-rg350-255f2b4c82867b3c113743d02cf91b91a15176bd.tar.bz2
scummvm-rg350-255f2b4c82867b3c113743d02cf91b91a15176bd.zip
GLK: QUEST: Initial subengine commit
Diffstat (limited to 'engines/glk/quest/geas_runner.h')
-rw-r--r--engines/glk/quest/geas_runner.h220
1 files changed, 220 insertions, 0 deletions
diff --git a/engines/glk/quest/geas_runner.h b/engines/glk/quest/geas_runner.h
new file mode 100644
index 0000000000..bc6d858d5b
--- /dev/null
+++ b/engines/glk/quest/geas_runner.h
@@ -0,0 +1,220 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GLK_QUEST_GEAS_RUNNER
+#define GLK_QUEST_GEAS_RUNNER
+
+#include "glk/quest/string.h"
+#include "common/array.h"
+#include "common/stream.h"
+
+namespace Glk {
+namespace Quest {
+
+typedef Common::Array<String> vstring;
+typedef Common::Array<vstring> v2string;
+
+enum geas_justification { JUSTIFY_LEFT, JUSTIFY_RIGHT, JUSTIFY_CENTER };
+
+struct GeasFontStyle {
+ bool is_underlined, is_italic, is_bold;
+ String color, font;
+ int size;
+ geas_justification justify;
+
+ GeasFontStyle() : is_underlined(false), is_italic(false), is_bold(false),
+ color(""), font(""), size(10), justify(JUSTIFY_LEFT) {}
+};
+
+class GeasFontStyleCompare {
+public:
+ int operator()(const GeasFontStyle &a, const GeasFontStyle &b) {
+ if (a.size != b.size) return a.size < b.size;
+ if (a.is_underlined != b.is_underlined) return a.is_underlined;
+ if (a.is_bold != b.is_bold) return a.is_bold;
+ if (a.is_italic != b.is_italic) return a.is_italic;
+ if (a.color != b.color) return a.color < b.color;
+ if (a.justify != b.justify) return a.justify < b.justify;
+ return 0;
+ }
+};
+
+Common::WriteStream &operator<< (Common::WriteStream &o, const GeasFontStyle &gfs);
+
+enum GeasResult {
+ r_success,
+ r_failure,
+ r_not_supported
+};
+
+/* Callback object used to pass information from GeasCore
+ * to the interface objects
+ */
+class GeasInterface {
+private:
+ GeasFontStyle cur_style;
+ String default_font;
+ int default_size;
+ //string fgcolor, bgcolor;
+
+public:
+ /* Takes 1 argument, a string with Quest markup
+ * Will output it to the user interface
+ * If the with_newline flag is set, it will print a newline afterwords
+ * unless the string ends in "|xn"
+ */
+ GeasResult print_formatted(String s, bool with_newline = true);
+
+ /* Takes one argument; that string is printed without interpretation
+ * Must be implemented
+ * Called by print_formatted and by Geas directly.
+ */
+ virtual GeasResult print_normal(const String &s) = 0;
+
+ virtual GeasResult print_newline() = 0;
+
+protected:
+
+ void update_style() {
+ set_style(cur_style);
+ }
+
+ /* Changes style of output text.
+ * Need not be implemented
+ * Only called by update_style()
+ */
+ virtual GeasResult set_style(const GeasFontStyle &) {
+ return r_not_supported;
+ }
+
+public:
+ virtual String absolute_name(String rel_name, String parent) const = 0;
+ virtual String get_file(const String &filename) const = 0;
+ virtual void debug_print(const String &s) {
+ warning("%s", s.c_str());
+ }
+ virtual GeasResult wait_keypress(String) {
+ return r_not_supported;
+ }
+ virtual GeasResult pause(int msec) {
+ return r_not_supported;
+ }
+ virtual GeasResult clear_screen() {
+ return r_not_supported;
+ }
+
+ //virtual GeasResult set_foreground (string) { return r_not_supported; }
+ //virtual GeasResult set_background (string) { return r_not_supported; }
+ virtual void set_foreground(String) = 0;
+ virtual void set_background(String) = 0;
+ void set_default_font_size(String s);
+ void set_default_font(String s);
+
+ /* Unsure what arguments this will take.
+ * May also add animated, persistent, close image
+ */
+ virtual GeasResult show_image(String filename, String resolution,
+ String caption, ...) {
+ return r_not_supported;
+ }
+
+ /* Again, unsure what arguments to give
+ * May add sound type
+ * If sync is true, do not return until file ends
+ * If filename is "", stop playing sounds.
+ */
+ virtual GeasResult play_sound(String filename, bool looped, bool sync) {
+ return r_not_supported;
+ }
+
+ /* Asks the user to type a free format string
+ */
+ virtual String get_string() = 0;
+
+ /* Presents a list with header 'info', and prompts the user to
+ * choose one item from 'choices'.
+ * returns the index chosen.
+ */
+ virtual uint make_choice(String info, Common::Array<String> choices) = 0;
+
+ /* Asks the user a yes/no question
+ * (If not overridden, this has an implementation that uses make_choice()
+ */
+ virtual bool choose_yes_no(String question);
+
+ /* args holds arguments sent to program.
+ * if active is true, geas should retain focus
+ * returns - 0 if disallowed
+ * - 1 if succeeded
+ * - 2 if file not found
+ * - 3 if it couldn't find a program to run it
+ * - 4 if it ran out of memory
+ */
+ virtual int shell(Common::Array<String> args, bool active) {
+ return 0;
+ }
+
+ /* say the argument using text-to-speech
+ */
+ virtual GeasResult speak(String) {
+ return r_not_supported;
+ }
+
+ virtual ~GeasInterface() {}
+
+ /* This is a notification that some object has changed, and
+ * the interpreter may want to update the inventory or room object
+ * listings.
+ */
+ virtual void update_sidebars() { }
+};
+
+
+/* Callback for passing information from the UI to the execution core
+ */
+class GeasRunner {
+protected:
+ GeasInterface *gi;
+
+public:
+ GeasRunner(GeasInterface *_gi) : gi(_gi) {}
+
+ virtual bool is_running() const = 0;
+ virtual String get_banner() = 0;
+ virtual void run_command(String) = 0;
+
+ virtual v2string get_inventory() = 0;
+ virtual v2string get_room_contents() = 0;
+ virtual vstring get_status_vars() = 0;
+ virtual Common::Array<bool> get_valid_exits() = 0;
+
+ virtual void tick_timers() = 0;
+
+ virtual ~GeasRunner() { }
+ virtual void set_game(const String &fname) = 0;
+ static GeasRunner *get_runner(GeasInterface *gi);
+};
+
+} // End of namespace Quest
+} // End of namespace Glk
+
+#endif