From 9fadd84b37ff4e9fa76cb2efc3464d5b958a7ed3 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 11 Nov 2018 21:33:20 -0800 Subject: [PATCH] GLK: FROTZ: Add GlkInterface initialize method --- engines/gargoyle/frotz/frotz_types.h | 5 +- engines/gargoyle/frotz/glk_interface.cpp | 135 ++++++++++++++++++++- engines/gargoyle/frotz/glk_interface.h | 7 +- engines/gargoyle/frotz/mem.h | 2 +- engines/gargoyle/frotz/processor.cpp | 3 +- engines/gargoyle/frotz/processor.h | 4 +- engines/gargoyle/frotz/processor_input.cpp | 2 - 7 files changed, 146 insertions(+), 12 deletions(-) diff --git a/engines/gargoyle/frotz/frotz_types.h b/engines/gargoyle/frotz/frotz_types.h index c4f4298a4e9..302cc43b74f 100644 --- a/engines/gargoyle/frotz/frotz_types.h +++ b/engines/gargoyle/frotz/frotz_types.h @@ -234,13 +234,14 @@ struct UserOptions { bool _save_quetzal; int _err_report_mode; bool _sound; + bool _user_tandy_bit; UserOptions() : _attribute_assignment(0), _attribute_testing(0), _context_lines(0), _object_locating(0), _object_movement(0), _left_margin(0), _right_margin(0), _ignore_errors(false), _piracy(false), _undo_slots(MAX_UNDO_SLOTS), _expand_abbreviations(0), _script_cols(80), - _save_quetzal(true), - _err_report_mode(ERR_DEFAULT_REPORT_MODE), _sound(true) { + _save_quetzal(true), _err_report_mode(ERR_DEFAULT_REPORT_MODE), _sound(true), + _user_tandy_bit(false) { } }; diff --git a/engines/gargoyle/frotz/glk_interface.cpp b/engines/gargoyle/frotz/glk_interface.cpp index e1311fbc62c..f60ecc50093 100644 --- a/engines/gargoyle/frotz/glk_interface.cpp +++ b/engines/gargoyle/frotz/glk_interface.cpp @@ -26,7 +26,7 @@ namespace Gargoyle { namespace Frotz { GlkInterface::GlkInterface(OSystem *syst, const GargoyleGameDescription *gameDesc) : - Glk(syst, gameDesc), + Glk(syst, gameDesc), UserOptions(), oldstyle(0), curstyle(0), cury(1), curx(1), fixforced(0), curr_fg(-2), curr_bg(-2), curr_font(1), prev_font(1), temp_font(0), curr_status_ht(0), mach_status_ht(0), gos_status(nullptr), gos_upper(nullptr), @@ -40,6 +40,135 @@ GlkInterface::GlkInterface(OSystem *syst, const GargoyleGameDescription *gameDes Common::fill(&statusline[0], &statusline[256], '\0'); } +void GlkInterface::initialize() { + uint width, height; + + /* + * Init glk stuff + */ + + // monor + glk_stylehint_set(wintype_AllTypes, style_Preformatted, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_Preformatted, stylehint_Weight, 0); + glk_stylehint_set(wintype_AllTypes, style_Preformatted, stylehint_Oblique, 0); + + // monob + glk_stylehint_set(wintype_AllTypes, style_Subheader, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_Subheader, stylehint_Weight, 1); + glk_stylehint_set(wintype_AllTypes, style_Subheader, stylehint_Oblique, 0); + + // monoi + glk_stylehint_set(wintype_AllTypes, style_Alert, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_Alert, stylehint_Weight, 0); + glk_stylehint_set(wintype_AllTypes, style_Alert, stylehint_Oblique, 1); + + // monoz + glk_stylehint_set(wintype_AllTypes, style_BlockQuote, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_BlockQuote, stylehint_Weight, 1); + glk_stylehint_set(wintype_AllTypes, style_BlockQuote, stylehint_Oblique, 1); + + // propr + glk_stylehint_set(wintype_TextBuffer, style_Normal, stylehint_Proportional, 1); + glk_stylehint_set(wintype_TextGrid, style_Normal, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_Normal, stylehint_Weight, 0); + glk_stylehint_set(wintype_AllTypes, style_Normal, stylehint_Oblique, 0); + + // propb + glk_stylehint_set(wintype_TextBuffer, style_Header, stylehint_Proportional, 1); + glk_stylehint_set(wintype_TextGrid, style_Header, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_Header, stylehint_Weight, 1); + glk_stylehint_set(wintype_AllTypes, style_Header, stylehint_Oblique, 0); + + // propi + glk_stylehint_set(wintype_TextBuffer, style_Emphasized, stylehint_Proportional, 1); + glk_stylehint_set(wintype_TextGrid, style_Emphasized, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_Emphasized, stylehint_Weight, 0); + glk_stylehint_set(wintype_AllTypes, style_Emphasized, stylehint_Oblique, 1); + + // propi + glk_stylehint_set(wintype_TextBuffer, style_Note, stylehint_Proportional, 1); + glk_stylehint_set(wintype_TextGrid, style_Note, stylehint_Proportional, 0); + glk_stylehint_set(wintype_AllTypes, style_Note, stylehint_Weight, 1); + glk_stylehint_set(wintype_AllTypes, style_Note, stylehint_Oblique, 1); + + gos_lower = glk_window_open(0, 0, 0, wintype_TextGrid, 0); + if (!gos_lower) + gos_lower = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + glk_window_get_size(gos_lower, &width, &height); + glk_window_close(gos_lower, NULL); + + gos_lower = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + gos_upper = glk_window_open(gos_lower, + winmethod_Above | winmethod_Fixed, + 0, + wintype_TextGrid, 0); + + gos_channel = NULL; + + glk_set_window(gos_lower); + gos_curwin = gos_lower; + + /* + * Icky magic bit setting + */ + + if (h_version == V3 && _user_tandy_bit) + h_config |= CONFIG_TANDY; + + if (h_version == V3 && gos_upper) + h_config |= CONFIG_SPLITSCREEN; + + if (h_version == V3 && !gos_upper) + h_config |= CONFIG_NOSTATUSLINE; + + if (h_version >= V4) + h_config |= CONFIG_BOLDFACE | CONFIG_EMPHASIS | + CONFIG_FIXED | CONFIG_TIMEDINPUT | CONFIG_COLOUR; + + if (h_version >= V5) + h_flags &= ~(GRAPHICS_FLAG | MOUSE_FLAG | MENU_FLAG); + + if ((h_version >= 5) && (h_flags & SOUND_FLAG)) + h_flags |= SOUND_FLAG; + + if ((h_version == 3) && (h_flags & OLD_SOUND_FLAG)) + h_flags |= OLD_SOUND_FLAG; + + if ((h_version == 6) && (_sound != 0)) + h_config |= CONFIG_SOUND; + + if (h_version >= V5 && (h_flags & UNDO_FLAG)) + if (_undo_slots == 0) + h_flags &= ~UNDO_FLAG; + + h_screen_cols = width; + h_screen_rows = height; + + h_screen_height = h_screen_rows; + h_screen_width = h_screen_cols; + + h_font_width = 1; + h_font_height = 1; + + /* Must be after screen dimensions are computed. */ + if (h_version == V6) { + h_flags &= ~GRAPHICS_FLAG; + } + + // Use the ms-dos interpreter number for v6, because that's the + // kind of graphics files we understand. Otherwise, use DEC. + h_interpreter_number = h_version == 6 ? INTERP_MSDOS : INTERP_DEC_20; + h_interpreter_version = 'F'; + + { + // Set these per spec 8.3.2. + h_default_foreground = WHITE_COLOUR; + h_default_background = BLACK_COLOUR; + if (h_flags & COLOUR_FLAG) + h_flags &= ~COLOUR_FLAG; + } +} + int GlkInterface::os_char_width(zchar z) { return 1; } @@ -118,7 +247,7 @@ void GlkInterface::gos_update_width() { glk_window_get_size(gos_upper, &width, nullptr); h_screen_cols = width; SET_BYTE(H_SCREEN_COLS, width); - if (curx > width) { + if ((uint)curx > width) { glk_window_move_cursor(gos_upper, 0, cury - 1); curx = 1; } @@ -140,7 +269,7 @@ void GlkInterface::reset_status_ht() { glui32 height; if (gos_upper) { glk_window_get_size(gos_upper, nullptr, &height); - if (mach_status_ht != height) { + if ((uint)mach_status_ht != height) { glk_window_set_arrangement( glk_window_get_parent(gos_upper), winmethod_Above | winmethod_Fixed, diff --git a/engines/gargoyle/frotz/glk_interface.h b/engines/gargoyle/frotz/glk_interface.h index ea3f60cfe88..1d30364683b 100644 --- a/engines/gargoyle/frotz/glk_interface.h +++ b/engines/gargoyle/frotz/glk_interface.h @@ -40,7 +40,7 @@ enum SoundEffect { * Implements an intermediate interface on top of the GLK layer, providing screen * and sound effect handling */ -class GlkInterface : public Glk, public virtual Mem { +class GlkInterface : public Glk, public UserOptions, public virtual Mem { public: zchar statusline[256]; int oldstyle; @@ -139,6 +139,11 @@ public: * Constructor */ GlkInterface(OSystem *syst, const GargoyleGameDescription *gameDesc); + + /** + * Initialization + */ + void initialize(); }; } // End of namespace Frotz diff --git a/engines/gargoyle/frotz/mem.h b/engines/gargoyle/frotz/mem.h index d37cdd3d99f..55cc4dc6fef 100644 --- a/engines/gargoyle/frotz/mem.h +++ b/engines/gargoyle/frotz/mem.h @@ -186,7 +186,7 @@ public: /** * Initialize */ - virtual void initialize(); + void initialize(); /** * Read a word diff --git a/engines/gargoyle/frotz/processor.cpp b/engines/gargoyle/frotz/processor.cpp index 1a31898a2ad..20fb387b746 100644 --- a/engines/gargoyle/frotz/processor.cpp +++ b/engines/gargoyle/frotz/processor.cpp @@ -132,7 +132,7 @@ Opcode Processor::ext_opcodes[64] = { }; Processor::Processor(OSystem *syst, const GargoyleGameDescription *gameDesc) : - GlkInterface(syst, gameDesc), Mem(), Errors(), UserOptions(), + GlkInterface(syst, gameDesc), Mem(), Errors(), _finished(0), _sp(nullptr), _fp(nullptr), _frameCount(0), zargc(0), _decoded(nullptr), _encoded(nullptr), _resolution(0), _randomInterval(0), _randomCtr(0), first_restart(true) { @@ -181,6 +181,7 @@ Processor::Processor(OSystem *syst, const GargoyleGameDescription *gameDesc) : void Processor::initialize() { Mem::initialize(); + GlkInterface::initialize(); if (h_version <= V4) { op0_opcodes[9] = &Processor::z_pop; diff --git a/engines/gargoyle/frotz/processor.h b/engines/gargoyle/frotz/processor.h index 074100abab8..a11fa1b9664 100644 --- a/engines/gargoyle/frotz/processor.h +++ b/engines/gargoyle/frotz/processor.h @@ -48,7 +48,7 @@ typedef void (Processor::*Opcode)(); /** * Zcode processor */ -class Processor : public virtual Mem, public Errors, public GlkInterface, public UserOptions { +class Processor : public virtual Mem, public Errors, public GlkInterface { private: Opcode op0_opcodes[16]; Opcode op1_opcodes[16]; @@ -1308,7 +1308,7 @@ public: /** * Initialization */ - virtual void initialize() override; + void initialize(); /** * Z-code interpreter main loop diff --git a/engines/gargoyle/frotz/processor_input.cpp b/engines/gargoyle/frotz/processor_input.cpp index e7f92ab6079..86a8abc13a9 100644 --- a/engines/gargoyle/frotz/processor_input.cpp +++ b/engines/gargoyle/frotz/processor_input.cpp @@ -26,8 +26,6 @@ namespace Gargoyle { namespace Frotz { // TODO: Implement method stubs -static zchar stream_read_key(zword, zword, bool) { return 0; } -static zchar stream_read_input(int, zchar *, zword, zword, bool, bool) { return 0;} static void storeb(zword, zchar) {} static void storew(zword, zword) {} static void save_undo() {}