aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gargoyle/detection.cpp5
-rw-r--r--engines/gargoyle/gargoyle.cpp11
-rw-r--r--engines/gargoyle/gargoyle.h13
-rw-r--r--engines/gargoyle/glk/glk.cpp (renamed from engines/gargoyle/glk.cpp)158
-rw-r--r--engines/gargoyle/glk/glk.h (renamed from engines/gargoyle/glk.h)249
-rw-r--r--engines/gargoyle/glk/glk_types.h272
-rw-r--r--engines/gargoyle/interpreter.h4
-rw-r--r--engines/gargoyle/interps/scott/scott.cpp (renamed from engines/gargoyle/scott/scott.cpp)13
-rw-r--r--engines/gargoyle/interps/scott/scott.h (renamed from engines/gargoyle/scott/scott.h)7
-rw-r--r--engines/gargoyle/module.mk4
10 files changed, 486 insertions, 250 deletions
diff --git a/engines/gargoyle/detection.cpp b/engines/gargoyle/detection.cpp
index 94fb90f3c4..f10a70bdc6 100644
--- a/engines/gargoyle/detection.cpp
+++ b/engines/gargoyle/detection.cpp
@@ -37,6 +37,7 @@ namespace Gargoyle {
struct GargoyleGameDescription {
ADGameDescription desc;
+ InterpreterType interpType;
};
uint32 GargoyleEngine::getFeatures() const {
@@ -51,6 +52,10 @@ Common::Language GargoyleEngine::getLanguage() const {
return _gameDescription->desc.language;
}
+InterpreterType GargoyleEngine::getInterpreterType() const {
+ return _gameDescription->interpType;
+}
+
} // End of namespace Gargoyle
static const PlainGameDescriptor GargoyleGames[] = {
diff --git a/engines/gargoyle/gargoyle.cpp b/engines/gargoyle/gargoyle.cpp
index 731e38d4a7..b46f2fc377 100644
--- a/engines/gargoyle/gargoyle.cpp
+++ b/engines/gargoyle/gargoyle.cpp
@@ -28,6 +28,7 @@
#include "graphics/scaler.h"
#include "graphics/thumbnail.h"
#include "gargoyle/gargoyle.h"
+#include "gargoyle/interps/scott/scott.h"
namespace Gargoyle {
@@ -36,6 +37,7 @@ GargoyleEngine::GargoyleEngine(OSystem *syst, const GargoyleGameDescription *gam
}
GargoyleEngine::~GargoyleEngine() {
+ delete _interpreter;
}
void GargoyleEngine::initialize() {
@@ -46,10 +48,19 @@ void GargoyleEngine::initialize() {
DebugMan.addDebugChannel(kDebugSound, "sound", "Sound and Music handling");
initGraphics(640, 480, false);
+
+ switch (getInterpreterType()) {
+ case INTERPRETER_SCOTT:
+ _interpreter = new Scott::Scott();
+ break;
+ default:
+ error("Unknown interpreter type");
+ }
}
Common::Error GargoyleEngine::run() {
initialize();
+ _interpreter->execute();
return Common::kNoError;
}
diff --git a/engines/gargoyle/gargoyle.h b/engines/gargoyle/gargoyle.h
index c43b5fe6c5..375d9ad0d7 100644
--- a/engines/gargoyle/gargoyle.h
+++ b/engines/gargoyle/gargoyle.h
@@ -28,13 +28,14 @@
#include "common/serializer.h"
#include "engines/advancedDetector.h"
#include "engines/engine.h"
-#include "graphics/screen.h"
-#include "gargoyle/events.h"
-#include "gargoyle/glk.h"
-#include "gargoyle/scott/scott.h"
+#include "gargoyle/interpreter.h"
namespace Gargoyle {
+enum InterpreterType {
+ INTERPRETER_SCOTT
+};
+
enum GargoyleDebugChannels {
kDebugCore = 1 << 0,
kDebugScripts = 1 << 1,
@@ -42,6 +43,7 @@ enum GargoyleDebugChannels {
kDebugSound = 1 << 3
};
+
#define GARGOYLE_SAVEGAME_VERSION 1
struct GargoyleGameDescription;
@@ -64,8 +66,6 @@ private:
private:
const GargoyleGameDescription *_gameDescription;
int _loadSaveSlot;
- Graphics::Screen _screen;
- Events _events;
Interpreter *_interpreter;
// Engine APIs
@@ -78,6 +78,7 @@ public:
uint32 getFeatures() const;
bool isDemo() const;
Common::Language getLanguage() const;
+ InterpreterType getInterpreterType() const;
};
} // End of namespace Gargoyle
diff --git a/engines/gargoyle/glk.cpp b/engines/gargoyle/glk/glk.cpp
index 4ea4ce47cd..26755a1d37 100644
--- a/engines/gargoyle/glk.cpp
+++ b/engines/gargoyle/glk/glk.cpp
@@ -20,246 +20,326 @@
*
*/
-#include "gargoyle/glk.h"
+#include "gargoyle/glk/glk.h"
namespace Gargoyle {
+Glk::Glk() : Interpreter(), _gliFirstEvent(false) {
+}
+
void Glk::glk_exit(void) {
+ // TODO
}
void Glk::glk_set_interrupt_handler(void(*func)(void)) {
+ // This library doesn't handle interrupts.
}
void Glk::glk_tick(void) {
+ // TODO
}
glui32 Glk::glk_gestalt(glui32 sel, glui32 val) {
+ // TODO
return 0;
}
glui32 Glk::glk_gestalt_ext(glui32 sel, glui32 val, glui32 *arr, glui32 arrlen) {
+ // TODO
return 0;
}
unsigned char Glk::glk_char_to_lower(unsigned char ch) {
+ // TODO
return '\0';
}
unsigned char Glk::glk_char_to_upper(unsigned char ch) {
+ // TODO
return '\0';
}
winid_t Glk::glk_window_get_root(void) {
+ // TODO
return nullptr;
}
winid_t Glk::glk_window_open(winid_t split, glui32 method, glui32 size,
glui32 wintype, glui32 rock) {
+ // TODO
return nullptr;
}
void Glk::glk_window_close(winid_t win, stream_result_t *result) {
+ // TODO
}
void Glk::glk_window_get_size(winid_t win, glui32 *widthptr, glui32 *heightptr) {
+ // TODO
}
void Glk::glk_window_set_arrangement(winid_t win, glui32 method,
glui32 size, winid_t keywin) {
+ // TODO
}
void Glk::glk_window_get_arrangement(winid_t win, glui32 *methodptr,
glui32 *sizeptr, winid_t *keywinptr) {
+ // TODO
}
winid_t Glk::glk_window_iterate(winid_t win, glui32 *rockptr) {
+ // TODO
return nullptr;
}
glui32 Glk::glk_window_get_rock(winid_t win) {
+ // TODO
return 0;
}
glui32 Glk::glk_window_get_type(winid_t win) {
+ // TODO
return 0;
}
winid_t Glk::glk_window_get_parent(winid_t win) {
+ // TODO
return nullptr;
}
winid_t Glk::glk_window_get_sibling(winid_t win) {
+ // TODO
return nullptr;
}
void Glk::glk_window_clear(winid_t win) {
+ // TODO
}
void Glk::glk_window_move_cursor(winid_t win, glui32 xpos, glui32 ypos) {
+ // TODO
}
strid_t Glk::glk_window_get_stream(winid_t win) {
+ // TODO
return nullptr;
}
void Glk::glk_window_set_echo_stream(winid_t win, strid_t str) {
+ // TODO
}
strid_t Glk::glk_window_get_echo_stream(winid_t win) {
+ // TODO
return nullptr;
}
void Glk::glk_set_window(winid_t win) {
+ // TODO
}
strid_t Glk::glk_stream_open_file(frefid_t fileref, glui32 fmode,
glui32 rock) {
+ // TODO
return nullptr;
}
strid_t Glk::glk_stream_open_memory(char *buf, glui32 buflen, glui32 fmode, glui32 rock) {
+ // TODO
return nullptr;
}
void Glk::glk_stream_close(strid_t str, stream_result_t *result) {
+ // TODO
}
strid_t Glk::glk_stream_iterate(strid_t str, glui32 *rockptr) {
+ // TODO
return nullptr;
}
glui32 Glk::glk_stream_get_rock(strid_t str) {
+ // TODO
return 0;
}
void Glk::glk_stream_set_position(strid_t str, glsi32 pos, glui32 seekmode) {
+ // TODO
}
glui32 Glk::glk_stream_get_position(strid_t str) {
+ // TODO
return 0;
}
void Glk::glk_stream_set_current(strid_t str) {
+ // TODO
}
strid_t Glk::glk_stream_get_current(void) {
+ // TODO
return nullptr;
}
void Glk::glk_put_char(unsigned char ch) {
+ // TODO
}
void Glk::glk_put_char_stream(strid_t str, unsigned char ch) {
+ // TODO
}
void Glk::glk_put_string(char *s) {
+ // TODO
}
void Glk::glk_put_string_stream(strid_t str, char *s) {
+ // TODO
}
void Glk::glk_put_buffer(char *buf, glui32 len) {
+ // TODO
}
void Glk::glk_put_buffer_stream(strid_t str, char *buf, glui32 len) {
+ // TODO
}
void Glk::glk_set_style(glui32 styl) {
+ // TODO
}
void Glk::glk_set_style_stream(strid_t str, glui32 styl) {
+ // TODO
}
glsi32 Glk::glk_get_char_stream(strid_t str) {
+ // TODO
return 0;
}
glui32 Glk::glk_get_line_stream(strid_t str, char *buf, glui32 len) {
+ // TODO
return 0;
}
glui32 Glk::glk_get_buffer_stream(strid_t str, char *buf, glui32 len) {
+ // TODO
return 0;
}
void Glk::glk_stylehint_set(glui32 wintype, glui32 styl, glui32 hint, glsi32 val) {
+ // TODO
}
void Glk::glk_stylehint_clear(glui32 wintype, glui32 styl, glui32 hint) {
+ // TODO
}
glui32 Glk::glk_style_distinguish(winid_t win, glui32 styl1, glui32 styl2) {
+ // TODO
return 0;
}
glui32 Glk::glk_style_measure(winid_t win, glui32 styl, glui32 hint, glui32 *result) {
+ // TODO
return 0;
}
frefid_t Glk::glk_fileref_create_temp(glui32 usage, glui32 rock) {
+ // TODO
return nullptr;
}
frefid_t Glk::glk_fileref_create_by_name(glui32 usage, char *name, glui32 rock) {
+ // TODO
return nullptr;
}
frefid_t Glk::glk_fileref_create_by_prompt(glui32 usage, glui32 fmode, glui32 rock) {
+ // TODO
return nullptr;
}
frefid_t Glk::glk_fileref_create_from_fileref(glui32 usage, frefid_t fref, glui32 rock) {
+ // TODO
return nullptr;
}
void Glk::glk_fileref_destroy(frefid_t fref) {
+ // TODO
}
frefid_t Glk::glk_fileref_iterate(frefid_t fref, glui32 *rockptr) {
+ // TODO
return nullptr;
}
glui32 Glk::glk_fileref_get_rock(frefid_t fref) {
+ // TODO
return 0;
}
void Glk::glk_fileref_delete_file(frefid_t fref) {
+ // TODO
}
glui32 Glk::glk_fileref_does_file_exist(frefid_t fref) {
+ // TODO
return 0;
}
void Glk::glk_select(event_t *event) {
+ if (!_gliFirstEvent) {
+ gliInputGuessFocus();
+ _gliFirstEvent = true;
+ }
+
+ gliSelect(event, false);
}
void Glk::glk_select_poll(event_t *event) {
+ if (!_gliFirstEvent) {
+ gliInputGuessFocus();
+ _gliFirstEvent = true;
+ }
+
+ gliSelect(event, true);
}
void Glk::glk_request_timer_events(glui32 millisecs) {
+ // TODO
}
void Glk::glk_request_line_event(winid_t win, char *buf, glui32 maxlen, glui32 initlen) {
+ // TODO
}
void Glk::glk_request_char_event(winid_t win) {
+ // TODO
}
void Glk::glk_request_mouse_event(winid_t win) {
+ // TODO
}
void Glk::glk_cancel_line_event(winid_t win, event_t *event) {
+ // TODO
}
void Glk::glk_cancel_char_event(winid_t win) {
+ // TODO
}
void Glk::glk_cancel_mouse_event(winid_t win) {
+ // TODO
}
#ifdef GLK_MODULE_LINE_ECHO
void Glk::glk_set_echo_line_event(winid_t win, glui32 val) {
+ // TODO
}
#endif /* GLK_MODULE_LINE_ECHO */
@@ -267,6 +347,7 @@ void Glk::glk_set_echo_line_event(winid_t win, glui32 val) {
#ifdef GLK_MODULE_LINE_TERMINATORS
void Glk::glk_set_terminators_line_event(winid_t win, glui32 *keycodes, glui32 count) {
+ // TODO
}
#endif /* GLK_MODULE_LINE_TERMINATORS */
@@ -274,62 +355,78 @@ void Glk::glk_set_terminators_line_event(winid_t win, glui32 *keycodes, glui32 c
#ifdef GLK_MODULE_UNICODE
glui32 Glk::glk_buffer_to_lower_case_uni(glui32 *buf, glui32 len, glui32 numchars) {
+ // TODO
return 0;
}
glui32 Glk::glk_buffer_to_upper_case_uni(glui32 *buf, glui32 len, glui32 numchars) {
+ // TODO
return 0;
}
glui32 Glk::glk_buffer_to_title_case_uni(glui32 *buf, glui32 len,
glui32 numchars, glui32 lowerrest) {
+ // TODO
return 0;
}
void Glk::glk_put_char_uni(glui32 ch) {
+ // TODO
}
void Glk::glk_put_string_uni(glui32 *s) {
+ // TODO
}
void Glk::glk_put_buffer_uni(glui32 *buf, glui32 len) {
+ // TODO
}
void Glk::glk_put_char_stream_uni(strid_t str, glui32 ch) {
+ // TODO
}
void Glk::glk_put_string_stream_uni(strid_t str, glui32 *s) {
+ // TODO
}
void Glk::glk_put_buffer_stream_uni(strid_t str, glui32 *buf, glui32 len) {
+ // TODO
}
glsi32 Glk::glk_get_char_stream_uni(strid_t str) {
+ // TODO
return 0;
}
glui32 Glk::glk_get_buffer_stream_uni(strid_t str, glui32 *buf, glui32 len) {
+ // TODO
return 0;
}
glui32 Glk::glk_get_line_stream_uni(strid_t str, glui32 *buf, glui32 len) {
+ // TODO
return 0;
}
strid_t Glk::glk_stream_open_file_uni(frefid_t fileref, glui32 fmode, glui32 rock) {
+ // TODO
return nullptr;
}
strid_t Glk::glk_stream_open_memory_uni(glui32 *buf, glui32 buflen,
glui32 fmode, glui32 rock) {
+ // TODO
return nullptr;
}
void Glk::glk_request_char_event_uni(winid_t win) {
+ // TODO
}
void Glk::glk_request_line_event_uni(winid_t win, glui32 *buf,
glui32 maxlen, glui32 initlen) {
+ // TODO
}
#endif /* GLK_MODULE_UNICODE */
@@ -338,6 +435,7 @@ void Glk::glk_request_line_event_uni(winid_t win, glui32 *buf,
glui32 Glk::glk_buffer_canon_decompose_uni(glui32 *buf, glui32 len,
glui32 numchars) {
+ // TODO
return 0;
}
@@ -350,30 +448,37 @@ glui32 Glk::glk_buffer_canon_normalize_uni(glui32 *buf, glui32 len, glui32 numch
#ifdef GLK_MODULE_IMAGE
glui32 Glk::glk_image_draw(winid_t win, glui32 image, glsi32 val1, glsi32 val2) {
+ // TODO
return 0;
}
glui32 Glk::glk_image_draw_scaled(winid_t win, glui32 image,
glsi32 val1, glsi32 val2, glui32 width, glui32 height) {
+ // TODO
return 0;
}
glui32 Glk::glk_image_get_info(glui32 image, glui32 *width, glui32 *height) {
+ // TODO
return 0;
}
void Glk::glk_window_flow_break(winid_t win) {
+ // TODO
}
void Glk::glk_window_erase_rect(winid_t win,
glsi32 left, glsi32 top, glui32 width, glui32 height) {
+ // TODO
}
void Glk::glk_window_fill_rect(winid_t win, glui32 color,
glsi32 left, glsi32 top, glui32 width, glui32 height) {
+ // TODO
}
void Glk::glk_window_set_background_color(winid_t win, glui32 color) {
+ // TODO
}
#endif /* GLK_MODULE_IMAGE */
@@ -381,56 +486,70 @@ void Glk::glk_window_set_background_color(winid_t win, glui32 color) {
#ifdef GLK_MODULE_SOUND
schanid_t Glk::glk_schannel_create(glui32 rock) {
+ // TODO
return nullptr;
}
void Glk::glk_schannel_destroy(schanid_t chan) {
+ // TODO
}
schanid_t Glk::glk_schannel_iterate(schanid_t chan, glui32 *rockptr) {
+ // TODO
return nullptr;
}
glui32 Glk::glk_schannel_get_rock(schanid_t chan) {
+ // TODO
return 0;
}
glui32 Glk::glk_schannel_play(schanid_t chan, glui32 snd) {
+ // TODO
return 0;
}
glui32 Glk::glk_schannel_play_ext(schanid_t chan, glui32 snd, glui32 repeats, glui32 notify) {
+ // TODO
return 0;
}
void Glk::glk_schannel_stop(schanid_t chan) {
+ // TODO
}
void Glk::glk_schannel_set_volume(schanid_t chan, glui32 vol) {
+ // TODO
}
void Glk::glk_sound_load_hint(glui32 snd, glui32 flag) {
+ // TODO
}
#ifdef GLK_MODULE_SOUND2
schanid_t Glk::glk_schannel_create_ext(glui32 rock, glui32 volume) {
+ // TODO
return nullptr;
}
glui32 Glk::glk_schannel_play_multi(schanid_t *chanarray, glui32 chancount,
glui32 *sndarray, glui32 soundcount, glui32 notify) {
+ // TODO
return 0;
}
void Glk::glk_schannel_pause(schanid_t chan) {
+ // TODO
}
void Glk::glk_schannel_unpause(schanid_t chan) {
+ // TODO
}
void Glk::glk_schannel_set_volume_ext(schanid_t chan, glui32 vol,
glui32 duration, glui32 notify) {
+ // TODO
}
#endif /* GLK_MODULE_SOUND2 */
@@ -439,15 +558,19 @@ void Glk::glk_schannel_set_volume_ext(schanid_t chan, glui32 vol,
#ifdef GLK_MODULE_HYPERLINKS
void Glk::glk_set_hyperlink(glui32 linkval) {
+ // TODO
}
void Glk::glk_set_hyperlink_stream(strid_t str, glui32 linkval) {
+ // TODO
}
void Glk::glk_request_hyperlink_event(winid_t win) {
+ // TODO
}
void Glk::glk_cancel_hyperlink_event(winid_t win) {
+ // TODO
}
#endif /* GLK_MODULE_HYPERLINKS */
@@ -455,35 +578,45 @@ void Glk::glk_cancel_hyperlink_event(winid_t win) {
#ifdef GLK_MODULE_DATETIME
void Glk::glk_current_time(glktimeval_t *time) {
+ // TODO
}
glsi32 Glk::glk_current_simple_time(glui32 factor) {
+ // TODO
return 0;
}
void Glk::glk_time_to_date_utc(glktimeval_t *time, glkdate_t *date) {
+ // TODO
}
void Glk::glk_time_to_date_local(glktimeval_t *time, glkdate_t *date) {
+ // TODO
}
void Glk::glk_simple_time_to_date_utc(glsi32 time, glui32 factor, glkdate_t *date) {
+ // TODO
}
void Glk::glk_simple_time_to_date_local(glsi32 time, glui32 factor, glkdate_t *date) {
+ // TODO
}
void Glk::glk_date_to_time_utc(glkdate_t *date, glktimeval_t *time) {
+ // TODO
}
void Glk::glk_date_to_time_local(glkdate_t *date, glktimeval_t *time) {
+ // TODO
}
glsi32 Glk::glk_date_to_simple_time_utc(glkdate_t *date, glui32 factor) {
+ // TODO
return 0;
}
glsi32 Glk::glk_date_to_simple_time_local(glkdate_t *date, glui32 factor) {
+ // TODO
return 0;
}
@@ -492,42 +625,65 @@ glsi32 Glk::glk_date_to_simple_time_local(glkdate_t *date, glui32 factor) {
/* XXX non-official Glk functions that may or may not exist */
char *garglk_fileref_get_name(frefid_t fref) {
+ // TODO
return nullptr;
}
void Glk::garglk_set_program_name(const char *name) {
+ // TODO
}
void Glk::garglk_set_program_info(const char *info) {
+ // TODO
}
void Glk::garglk_set_story_name(const char *name) {
+ // TODO
}
void Glk::garglk_set_story_title(const char *title) {
+ // TODO
}
void Glk::garglk_set_config(const char *name) {
+ // TODO
}
/* garglk_unput_string - removes the specified string from the end of the output buffer, if
* indeed it is there. */
void Glk::garglk_unput_string(char *str) {
+ // TODO
}
void Glk::garglk_unput_string_uni(glui32 *str) {
+ // TODO
}
void Glk::garglk_set_zcolors(glui32 fg, glui32 bg) {
+ // TODO
}
void Glk::garglk_set_zcolors_stream(strid_t str, glui32 fg, glui32 bg) {
+ // TODO
}
void Glk::garglk_set_reversevideo(glui32 reverse) {
+ // TODO
}
void Glk::garglk_set_reversevideo_stream(strid_t str, glui32 reverse) {
+ // TODO
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Glk::gliInputGuessFocus() {
+ // TODO
+}
+
+void Glk::gliSelect(event_t *event, bool polled) {
+ // TODO
+ event->type = evtype_Quit;
}
} // End of namespace Gargoyle
diff --git a/engines/gargoyle/glk.h b/engines/gargoyle/glk/glk.h
index 2e5637b56e..11c8cba2cf 100644
--- a/engines/gargoyle/glk.h
+++ b/engines/gargoyle/glk/glk.h
@@ -25,257 +25,28 @@
#include "graphics/managed_surface.h"
#include "gargoyle/interpreter.h"
+#include "gargoyle/glk/glk_types.h"
namespace Gargoyle {
-typedef uint32 glui32;
-typedef int32 glsi32;
-
-/**
- * These are the compile-time conditionals that reveal various Glk optional modules.
- */
-#define GLK_MODULE_LINE_ECHO
-#define GLK_MODULE_LINE_TERMINATORS
-#define GLK_MODULE_UNICODE
-#define GLK_MODULE_UNICODE_NORM
-#define GLK_MODULE_IMAGE
-#define GLK_MODULE_SOUND
-#define GLK_MODULE_SOUND2
-#define GLK_MODULE_HYPERLINKS
-#define GLK_MODULE_DATETIME
-#define GLK_MODULE_GARGLKTEXT
-
-/**
- * These types are opaque object identifiers. They're pointers to opaque
- * C structures, which are defined differently by each library.
- */
-typedef struct glk_window_struct *winid_t;
-typedef struct glk_stream_struct *strid_t;
-typedef struct glk_fileref_struct *frefid_t;
-typedef struct glk_schannel_struct *schanid_t;
-
-enum Gestalt {
- gestalt_Version = 0,
- gestalt_CharInput = 1,
- gestalt_LineInput = 2,
- gestalt_CharOutput = 3,
- gestalt_CharOutput_CannotPrint = 0,
- gestalt_CharOutput_ApproxPrint = 1,
- gestalt_CharOutput_ExactPrint = 2,
- gestalt_MouseInput = 4,
- gestalt_Timer = 5,
- gestalt_Graphics = 6,
- gestalt_DrawImage = 7,
- gestalt_Sound = 8,
- gestalt_SoundVolume = 9,
- gestalt_SoundNotify = 10,
- gestalt_Hyperlinks = 11,
- gestalt_HyperlinkInput = 12,
- gestalt_SoundMusic = 13,
- gestalt_GraphicsTransparency = 14,
- gestalt_Unicode = 15,
- gestalt_UnicodeNorm = 16,
- gestalt_LineInputEcho = 17,
- gestalt_LineTerminators = 18,
- gestalt_LineTerminatorKey = 19,
- gestalt_DateTime = 20,
- gestalt_Sound2 = 21,
- gestalt_GarglkText = 0x1100,
-};
-
-enum EvType {
- evtype_None = 0,
- evtype_Timer = 1,
- evtype_CharInput = 2,
- evtype_LineInput = 3,
- evtype_MouseInput = 4,
- evtype_Arrange = 5,
- evtype_Redraw = 6,
- evtype_SoundNotify = 7,
- evtype_Hyperlink = 8,
- evtype_VolumeNotify = 9,
-};
-
-enum Keycode {
- keycode_Unknown = 0xffffffffU,
- keycode_Left = 0xfffffffeU,
- keycode_Right = 0xfffffffdU,
- keycode_Up = 0xfffffffcU,
- keycode_Down = 0xfffffffbU,
- keycode_Return = 0xfffffffaU,
- keycode_Delete = 0xfffffff9U,
- keycode_Escape = 0xfffffff8U,
- keycode_Tab = 0xfffffff7U,
- keycode_PageUp = 0xfffffff6U,
- keycode_PageDown = 0xfffffff5U,
- keycode_Home = 0xfffffff4U,
- keycode_End = 0xfffffff3U,
- keycode_Func1 = 0xffffffefU,
- keycode_Func2 = 0xffffffeeU,
- keycode_Func3 = 0xffffffedU,
- keycode_Func4 = 0xffffffecU,
- keycode_Func5 = 0xffffffebU,
- keycode_Func6 = 0xffffffeaU,
- keycode_Func7 = 0xffffffe9U,
- keycode_Func8 = 0xffffffe8U,
- keycode_Func9 = 0xffffffe7U,
- keycode_Func10 = 0xffffffe6U,
- keycode_Func11 = 0xffffffe5U,
- keycode_Func12 = 0xffffffe4U,
-
- // non standard keycodes
- keycode_Erase = 0xffffef7fU,
- keycode_MouseWheelUp = 0xffffeffeU,
- keycode_MouseWheelDown = 0xffffefffU,
- keycode_SkipWordLeft = 0xfffff000U,
- keycode_SkipWordRight = 0xfffff001U,
-
- // The last keycode is always = 0x100000000 - keycode_MAXVAL)
- keycode_MAXVAL = 28U
-};
-
-enum Style {
- style_Normal = 0,
- style_Emphasized = 1,
- style_Preformatted = 2,
- style_Header = 3,
- style_Subheader = 4,
- style_Alert = 5,
- style_Note = 6,
- style_BlockQuote = 7,
- style_Input = 8,
- style_User1 = 9,
- style_User2 = 10,
- style_NUMSTYLES = 11,
-};
-
-enum WinType {
- wintype_AllTypes = 0,
- wintype_Pair = 1,
- wintype_Blank = 2,
- wintype_TextBuffer = 3,
- wintype_TextGrid = 4,
- wintype_Graphics = 5,
-};
-
-enum WinMethod {
- winmethod_Left = 0x00,
- winmethod_Right = 0x01,
- winmethod_Above = 0x02,
- winmethod_Below = 0x03,
- winmethod_DirMask = 0x0f,
-
- winmethod_Fixed = 0x10,
- winmethod_Proportional = 0x20,
- winmethod_DivisionMask = 0xf0,
-
- winmethod_Border = 0x000,
- winmethod_NoBorder = 0x100,
- winmethod_BorderMask = 0x100,
-};
-
-enum FileUsage {
- fileusage_Data = 0x00,
- fileusage_SavedGame = 0x01,
- fileusage_Transcript = 0x02,
- fileusage_InputRecord = 0x03,
- fileusage_TypeMask = 0x0f,
-
- fileusage_TextMode = 0x100,
- fileusage_BinaryMode = 0x000,
-};
-
-enum FileMode {
- filemode_Write = 0x01,
- filemode_Read = 0x02,
- filemode_ReadWrite = 0x03,
- filemode_WriteAppend = 0x05,
-};
-
-enum SeekMode {
- seekmode_Start = 0,
- seekmode_Current = 1,
- seekmode_End = 2,
-};
-
-enum StyleHint {
- stylehint_Indentation = 0,
- stylehint_ParaIndentation = 1,
- stylehint_Justification = 2,
- stylehint_Size = 3,
- stylehint_Weight = 4,
- stylehint_Oblique = 5,
- stylehint_Proportional = 6,
- stylehint_TextColor = 7,
- stylehint_BackColor = 8,
- stylehint_ReverseColor = 9,
- stylehint_NUMHINTS = 10,
-
- stylehint_just_LeftFlush = 0,
- stylehint_just_LeftRight = 1,
- stylehint_just_Centered = 2,
- stylehint_just_RightFlush = 3,
-};
-
-#ifdef GLK_MODULE_IMAGE
-
-enum ImageAlign {
- imagealign_InlineUp = 1,
- imagealign_InlineDown = 2,
- imagealign_InlineCenter = 3,
- imagealign_MarginLeft = 4,
- imagealign_MarginRight = 5
-};
-
-#endif /* GLK_MODULE_IMAGE */
-
-struct event_struct {
- glui32 type;
- winid_t win;
- glui32 val1, val2;
-};
-typedef event_struct *event_t;
-
-struct stream_result_struct {
- glui32 readcount;
- glui32 writecount;
-};
-typedef stream_result_struct *stream_result_t;
-
-#ifdef GLK_MODULE_DATETIME
-
-struct glktimeval_struct {
- glsi32 high_sec;
- glui32 low_sec;
- glsi32 microsec;
-};
-typedef glktimeval_struct *glktimeval_t;
-
-struct glkdate_struct {
- glsi32 year; /* full (four-digit) year */
- glsi32 month; /* 1-12, 1 is January */
- glsi32 day; /* 1-31 */
- glsi32 weekday; /* 0-6, 0 is Sunday */
- glsi32 hour; /* 0-23 */
- glsi32 minute; /* 0-59 */
- glsi32 second; /* 0-59, maybe 60 during a leap second */
- glsi32 microsec; /* 0-999999 */
-};
-typedef glkdate_struct *glkdate_t;
-
-#endif /* GLK_MODULE_DATETIME */
-
/**
* Implements the GLK interface
*/
class Glk : public Interpreter {
private:
- Graphics::ManagedSurface *_surface;
+ bool _gliFirstEvent;
+private:
+ /**
+ * Pick first window which might want input. This is called after every keystroke.
+ */
+ void gliInputGuessFocus();
+
+ void gliSelect(event_t *event, bool polled);
public:
/**
* Constructor
*/
- Glk() {}
+ Glk();
void glk_exit(void);
void glk_set_interrupt_handler(void(*func)(void));
diff --git a/engines/gargoyle/glk/glk_types.h b/engines/gargoyle/glk/glk_types.h
new file mode 100644
index 0000000000..a8227411df
--- /dev/null
+++ b/engines/gargoyle/glk/glk_types.h
@@ -0,0 +1,272 @@
+/* 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 GARGOYLE_GLK_TYPES_H
+#define GARGOYLE_GLK_TYPES_H
+
+#include "common/scummsys.h"
+
+namespace Gargoyle {
+
+typedef uint32 glui32;
+typedef int32 glsi32;
+
+/**
+ * These are the compile-time conditionals that reveal various Glk optional modules.
+ */
+#define GLK_MODULE_LINE_ECHO
+#define GLK_MODULE_LINE_TERMINATORS
+#define GLK_MODULE_UNICODE
+#define GLK_MODULE_UNICODE_NORM
+#define GLK_MODULE_IMAGE
+#define GLK_MODULE_SOUND
+#define GLK_MODULE_SOUND2
+#define GLK_MODULE_HYPERLINKS
+#define GLK_MODULE_DATETIME
+#define GLK_MODULE_GARGLKTEXT
+
+/**
+ * These types are opaque object identifiers. They're pointers to opaque
+ * C structures, which are defined differently by each library.
+ */
+typedef struct glk_window_struct *winid_t;
+typedef struct glk_stream_struct *strid_t;
+typedef struct glk_fileref_struct *frefid_t;
+typedef struct glk_schannel_struct *schanid_t;
+
+enum Gestalt {
+ gestalt_Version = 0,
+ gestalt_CharInput = 1,
+ gestalt_LineInput = 2,
+ gestalt_CharOutput = 3,
+ gestalt_CharOutput_CannotPrint = 0,
+ gestalt_CharOutput_ApproxPrint = 1,
+ gestalt_CharOutput_ExactPrint = 2,
+ gestalt_MouseInput = 4,
+ gestalt_Timer = 5,
+ gestalt_Graphics = 6,
+ gestalt_DrawImage = 7,
+ gestalt_Sound = 8,
+ gestalt_SoundVolume = 9,
+ gestalt_SoundNotify = 10,
+ gestalt_Hyperlinks = 11,
+ gestalt_HyperlinkInput = 12,
+ gestalt_SoundMusic = 13,
+ gestalt_GraphicsTransparency = 14,
+ gestalt_Unicode = 15,
+ gestalt_UnicodeNorm = 16,
+ gestalt_LineInputEcho = 17,
+ gestalt_LineTerminators = 18,
+ gestalt_LineTerminatorKey = 19,
+ gestalt_DateTime = 20,
+ gestalt_Sound2 = 21,
+ gestalt_GarglkText = 0x1100,
+};
+
+enum EvType {
+ evtype_None = 0,
+ evtype_Timer = 1,
+ evtype_CharInput = 2,
+ evtype_LineInput = 3,
+ evtype_MouseInput = 4,
+ evtype_Arrange = 5,
+ evtype_Redraw = 6,
+ evtype_SoundNotify = 7,
+ evtype_Hyperlink = 8,
+ evtype_VolumeNotify = 9,
+
+ // ScummVM custom events
+ evtype_Quit = 99
+};
+
+enum Keycode {
+ keycode_Unknown = 0xffffffffU,
+ keycode_Left = 0xfffffffeU,
+ keycode_Right = 0xfffffffdU,
+ keycode_Up = 0xfffffffcU,
+ keycode_Down = 0xfffffffbU,
+ keycode_Return = 0xfffffffaU,
+ keycode_Delete = 0xfffffff9U,
+ keycode_Escape = 0xfffffff8U,
+ keycode_Tab = 0xfffffff7U,
+ keycode_PageUp = 0xfffffff6U,
+ keycode_PageDown = 0xfffffff5U,
+ keycode_Home = 0xfffffff4U,
+ keycode_End = 0xfffffff3U,
+ keycode_Func1 = 0xffffffefU,
+ keycode_Func2 = 0xffffffeeU,
+ keycode_Func3 = 0xffffffedU,
+ keycode_Func4 = 0xffffffecU,
+ keycode_Func5 = 0xffffffebU,
+ keycode_Func6 = 0xffffffeaU,
+ keycode_Func7 = 0xffffffe9U,
+ keycode_Func8 = 0xffffffe8U,
+ keycode_Func9 = 0xffffffe7U,
+ keycode_Func10 = 0xffffffe6U,
+ keycode_Func11 = 0xffffffe5U,
+ keycode_Func12 = 0xffffffe4U,
+
+ // non standard keycodes
+ keycode_Erase = 0xffffef7fU,
+ keycode_MouseWheelUp = 0xffffeffeU,
+ keycode_MouseWheelDown = 0xffffefffU,
+ keycode_SkipWordLeft = 0xfffff000U,
+ keycode_SkipWordRight = 0xfffff001U,
+
+ // The last keycode is always = 0x100000000 - keycode_MAXVAL)
+ keycode_MAXVAL = 28U
+};
+
+enum Style {
+ style_Normal = 0,
+ style_Emphasized = 1,
+ style_Preformatted = 2,
+ style_Header = 3,
+ style_Subheader = 4,
+ style_Alert = 5,
+ style_Note = 6,
+ style_BlockQuote = 7,
+ style_Input = 8,
+ style_User1 = 9,
+ style_User2 = 10,
+ style_NUMSTYLES = 11,
+};
+
+enum WinType {
+ wintype_AllTypes = 0,
+ wintype_Pair = 1,
+ wintype_Blank = 2,
+ wintype_TextBuffer = 3,
+ wintype_TextGrid = 4,
+ wintype_Graphics = 5,
+};
+
+enum WinMethod {
+ winmethod_Left = 0x00,
+ winmethod_Right = 0x01,
+ winmethod_Above = 0x02,
+ winmethod_Below = 0x03,
+ winmethod_DirMask = 0x0f,
+
+ winmethod_Fixed = 0x10,
+ winmethod_Proportional = 0x20,
+ winmethod_DivisionMask = 0xf0,
+
+ winmethod_Border = 0x000,
+ winmethod_NoBorder = 0x100,
+ winmethod_BorderMask = 0x100,
+};
+
+enum FileUsage {
+ fileusage_Data = 0x00,
+ fileusage_SavedGame = 0x01,
+ fileusage_Transcript = 0x02,
+ fileusage_InputRecord = 0x03,
+ fileusage_TypeMask = 0x0f,
+
+ fileusage_TextMode = 0x100,
+ fileusage_BinaryMode = 0x000,
+};
+
+enum FileMode {
+ filemode_Write = 0x01,
+ filemode_Read = 0x02,
+ filemode_ReadWrite = 0x03,
+ filemode_WriteAppend = 0x05,
+};
+
+enum SeekMode {
+ seekmode_Start = 0,
+ seekmode_Current = 1,
+ seekmode_End = 2,
+};
+
+enum StyleHint {
+ stylehint_Indentation = 0,
+ stylehint_ParaIndentation = 1,
+ stylehint_Justification = 2,
+ stylehint_Size = 3,
+ stylehint_Weight = 4,
+ stylehint_Oblique = 5,
+ stylehint_Proportional = 6,
+ stylehint_TextColor = 7,
+ stylehint_BackColor = 8,
+ stylehint_ReverseColor = 9,
+ stylehint_NUMHINTS = 10,
+
+ stylehint_just_LeftFlush = 0,
+ stylehint_just_LeftRight = 1,
+ stylehint_just_Centered = 2,
+ stylehint_just_RightFlush = 3,
+};
+
+#ifdef GLK_MODULE_IMAGE
+
+enum ImageAlign {
+ imagealign_InlineUp = 1,
+ imagealign_InlineDown = 2,
+ imagealign_InlineCenter = 3,
+ imagealign_MarginLeft = 4,
+ imagealign_MarginRight = 5
+};
+
+#endif /* GLK_MODULE_IMAGE */
+
+struct event_struct {
+ glui32 type;
+ winid_t win;
+ glui32 val1, val2;
+};
+typedef event_struct event_t;
+
+struct stream_result_struct {
+ glui32 readcount;
+ glui32 writecount;
+};
+typedef stream_result_struct stream_result_t;
+
+#ifdef GLK_MODULE_DATETIME
+
+struct glktimeval_struct {
+ glsi32 high_sec;
+ glui32 low_sec;
+ glsi32 microsec;
+};
+typedef glktimeval_struct glktimeval_t;
+
+struct glkdate_struct {
+ glsi32 year; ///< full (four-digit) year */
+ glsi32 month; ///< 1-12, 1 is January
+ glsi32 day; ///< 1-31
+ glsi32 weekday; ///< 0-6, 0 is Sunday
+ glsi32 hour; ///< 0-23
+ glsi32 minute; ///< 0-59
+ glsi32 second; ///< 0-59, maybe 60 during a leap second
+ glsi32 microsec; ///< 0-999999
+};
+typedef glkdate_struct glkdate_t;
+
+#endif /* GLK_MODULE_DATETIME */
+
+} // End of namespace Gargoyle
+
+#endif
diff --git a/engines/gargoyle/interpreter.h b/engines/gargoyle/interpreter.h
index df9172d9e1..748d4179fe 100644
--- a/engines/gargoyle/interpreter.h
+++ b/engines/gargoyle/interpreter.h
@@ -23,12 +23,16 @@
#ifndef GARGOYLE_INTERPRETER_H
#define GARGOYLE_INTERPRETER_H
+#include "graphics/screen.h"
+
namespace Gargoyle {
/**
* Base class for specific interpreters
*/
class Interpreter {
+protected:
+ Graphics::Screen _screen;
public:
/**
* Constructor
diff --git a/engines/gargoyle/scott/scott.cpp b/engines/gargoyle/interps/scott/scott.cpp
index b5e537caad..b2ea5e29fb 100644
--- a/engines/gargoyle/scott/scott.cpp
+++ b/engines/gargoyle/interps/scott/scott.cpp
@@ -20,11 +20,22 @@
*
*/
-#include "gargoyle/scott/scott.h"
+#include "gargoyle/interps/scott/scott.h"
namespace Gargoyle {
namespace Scott {
+void Scott::execute() {
+ event_t ev;
+ do {
+ glk_select(&ev);
+ switch (ev.type) {
+ default:
+ /* do nothing */
+ break;
+ }
+ } while (ev.type != evtype_Quit);
+}
} // End of namespace Scott
} // End of namespace Gargoyle
diff --git a/engines/gargoyle/scott/scott.h b/engines/gargoyle/interps/scott/scott.h
index bf13cf8c53..7d87ca5809 100644
--- a/engines/gargoyle/scott/scott.h
+++ b/engines/gargoyle/interps/scott/scott.h
@@ -28,7 +28,7 @@
*/
#include "common/scummsys.h"
-#include "gargoyle/glk.h"
+#include "gargoyle/glk/glk.h"
namespace Gargoyle {
namespace Scott {
@@ -93,6 +93,11 @@ public:
* Constructor
*/
Scott() : Glk() {}
+
+ /**
+ * Execute the game
+ */
+ virtual void execute();
};
} // End of namespace Scott
diff --git a/engines/gargoyle/module.mk b/engines/gargoyle/module.mk
index 937b814453..6e11ba746f 100644
--- a/engines/gargoyle/module.mk
+++ b/engines/gargoyle/module.mk
@@ -4,9 +4,9 @@ MODULE_OBJS := \
detection.o \
events.o \
gargoyle.o \
- glk.o \
+ glk/glk.o \
interpreter.o \
- scott/scott.o
+ interps/scott/scott.o
# This module can be built as a plugin
ifeq ($(ENABLE_GARGOYLE), DYNAMIC_PLUGIN)