diff options
author | Paul Gilbert | 2018-11-18 11:29:41 -0800 |
---|---|---|
committer | Paul Gilbert | 2018-12-08 19:05:59 -0800 |
commit | ada80dedc0d39d76a2cd3c3b4af6c3219738d0bf (patch) | |
tree | d94f2b0c7a4616846066794634f59a7783b19836 /engines/glk | |
parent | 79f3d946ef23ff121f30d9e429d2c4ab985ce29c (diff) | |
download | scummvm-rg350-ada80dedc0d39d76a2cd3c3b4af6c3219738d0bf.tar.gz scummvm-rg350-ada80dedc0d39d76a2cd3c3b4af6c3219738d0bf.tar.bz2 scummvm-rg350-ada80dedc0d39d76a2cd3c3b4af6c3219738d0bf.zip |
GLK: FROTZ: Further merging together of configuration into a new config.cpp file
Diffstat (limited to 'engines/glk')
-rw-r--r-- | engines/glk/frotz/config.cpp | 196 | ||||
-rw-r--r-- | engines/glk/frotz/config.h (renamed from engines/glk/frotz/header.h) | 99 | ||||
-rw-r--r-- | engines/glk/frotz/frotz.cpp | 34 | ||||
-rw-r--r-- | engines/glk/frotz/frotz_types.h | 75 | ||||
-rw-r--r-- | engines/glk/frotz/glk_interface.cpp | 2 | ||||
-rw-r--r-- | engines/glk/frotz/header.cpp | 112 | ||||
-rw-r--r-- | engines/glk/frotz/mem.h | 2 | ||||
-rw-r--r-- | engines/glk/frotz/processor.cpp | 10 | ||||
-rw-r--r-- | engines/glk/module.mk | 2 |
9 files changed, 290 insertions, 242 deletions
diff --git a/engines/glk/frotz/config.cpp b/engines/glk/frotz/config.cpp new file mode 100644 index 0000000000..0461e251c5 --- /dev/null +++ b/engines/glk/frotz/config.cpp @@ -0,0 +1,196 @@ +/* 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. + * + */ + +#include "glk/frotz/config.h" +#include "common/config-manager.h" +#include "common/textconsole.h" + +namespace Glk { +namespace Frotz { + +const Header::StoryEntry Header::RECORDS[25] = { + { SHERLOCK, 21, "871214" }, + { SHERLOCK, 26, "880127" }, + { BEYOND_ZORK, 47, "870915" }, + { BEYOND_ZORK, 49, "870917" }, + { BEYOND_ZORK, 51, "870923" }, + { BEYOND_ZORK, 57, "871221" }, + { ZORK_ZERO, 296, "881019" }, + { ZORK_ZERO, 366, "890323" }, + { ZORK_ZERO, 383, "890602" }, + { ZORK_ZERO, 393, "890714" }, + { SHOGUN, 292, "890314" }, + { SHOGUN, 295, "890321" }, + { SHOGUN, 311, "890510" }, + { SHOGUN, 322, "890706" }, + { ARTHUR, 54, "890606" }, + { ARTHUR, 63, "890622" }, + { ARTHUR, 74, "890714" }, + { JOURNEY, 26, "890316" }, + { JOURNEY, 30, "890322" }, + { JOURNEY, 77, "890616" }, + { JOURNEY, 83, "890706" }, + { LURKING_HORROR, 203, "870506" }, + { LURKING_HORROR, 219, "870912" }, + { LURKING_HORROR, 221, "870918" }, + { UNKNOWN, 0, "------" } +}; + +static uint getConfigBool(const Common::String &profileName, bool defaultVal = false) { + return ConfMan.hasKey(profileName) ? ConfMan.getBool(profileName) : defaultVal; +} + +static uint getConfigInt(const Common::String &profileName, uint defaultVal, uint maxVal) { + uint val = ConfMan.hasKey(profileName) ? ConfMan.getInt(profileName) : defaultVal; + if (val > maxVal) + error("Invalid value for configuration value %s", profileName.c_str()); + + return val; +} + +Header::Header() : h_version(0), h_config(0), h_release(0), h_resident_size(0), h_start_pc(0), + h_dictionary(0), h_objects(0), h_globals(0), h_dynamic_size(0), h_flags(0), + h_abbreviations(0), h_file_size(0), h_checksum(0), + h_interpreter_version(0), h_screen_rows(0), h_screen_cols(0), h_screen_width(0), + h_screen_height(0), h_font_height(1), h_font_width(1), h_functions_offset(0), + h_strings_offset(0), h_default_background(0), h_default_foreground(0), + h_terminating_keys(0), h_line_width(0), h_standard_high(1), h_standard_low(1), + h_alphabet(0), h_extension_table(0), + hx_table_size(0), hx_mouse_x(0), hx_mouse_y(0), hx_unicode_table(0), + hx_flags(0), hx_fore_colour(0), hx_back_colour(0), _storyId(UNKNOWN) { + Common::fill(&h_serial[0], &h_serial[6], '\0'); + Common::fill(&h_user_name[0], &h_user_name[8], '\0'); + + h_interpreter_number = getConfigInt("interpreter_number", INTERP_AMIGA, INTERP_TANDY); + + + if (ConfMan.hasKey("username")) { + Common::String username = ConfMan.get("username"); + strncpy((char *)h_user_name, username.c_str(), 7); + } +} + +void Header::loadHeader(Common::SeekableReadStream &f) { + h_version = f.readByte(); + h_config = f.readByte(); + + if (h_version < V1 || h_version > V8) + error("Unknown Z-code version"); + + if (h_version == V6) + error("Cannot play Z-code version 6"); + + if (h_version == V3 && (h_config & CONFIG_BYTE_SWAPPED)) + error("Byte swapped story file"); + + h_release = f.readUint16BE(); + h_resident_size = f.readUint16BE(); + h_start_pc = f.readUint16BE(); + h_dictionary = f.readUint16BE(); + h_objects = f.readUint16BE(); + h_globals = f.readUint16BE(); + h_dynamic_size = f.readUint16BE(); + h_flags = f.readUint16BE(); + f.read(h_serial, 6); + + /* Auto-detect buggy story files that need special fixes */ + _storyId = UNKNOWN; + + for (int i = 0; RECORDS[i]._storyId != UNKNOWN; ++i) { + if (h_release == RECORDS[i]._release) { + if (!strncmp((const char *)h_serial, RECORDS[i]._serial, 6)) { + _storyId = RECORDS[i]._storyId; + break; + } + } + } + + h_abbreviations = f.readUint16BE(); + h_file_size = f.readUint16BE(); + h_checksum = f.readUint16BE(); + + f.seek(H_FUNCTIONS_OFFSET); + h_functions_offset = f.readUint16BE(); + h_strings_offset = f.readUint16BE(); + f.seek(H_TERMINATING_KEYS); + h_terminating_keys = f.readUint16BE(); + f.seek(H_ALPHABET); + h_alphabet = f.readUint16BE(); + h_extension_table = f.readUint16BE(); + + + // Zork Zero Macintosh doesn't have the graphics flag set + if (_storyId == ZORK_ZERO && h_release == 296) + h_flags |= GRAPHICS_FLAG; +} + +/*--------------------------------------------------------------------------*/ + +UserOptions::UserOptions() : _undo_slots(MAX_UNDO_SLOTS), _sound(true) { + _err_report_mode = getConfigInt("err_report_mode", ERR_REPORT_ONCE, ERR_REPORT_FATAL); + _ignore_errors = getConfigBool("ignore_errors"); + _expand_abbreviations = getConfigBool("expand_abbreviations"); + _quetzal = getConfigBool("quetzal", true); + _tandyBit = getConfigBool("tandy_bit"); + _piracy = getConfigBool("piracy"); + _script_cols = getConfigInt("wrap_script_lines", 80, 999); + _left_margin = getConfigInt("left_margin", 0, 999); + _right_margin = getConfigInt("right_margin", 0, 999); + + // Debugging flags + _attribute_assignment = getConfigBool("attribute_assignment"); + _attribute_testing = getConfigBool("attribute_testing"); + _object_locating = getConfigBool("object_locating"); + _object_movement = getConfigBool("object_movement"); +} + +#ifdef REMOVE_ME +if (ConfMan.hasKey("attribute_assignment") && ConfMan.getBool("attribute_assignment")) +_attribute_assignment = true; +if (ConfMan.hasKey("attribute_testing") && ConfMan.getBool("attribute_testing")) +_attribute_testing = true; +if (ConfMan.hasKey("object_movement") && ConfMan.getBool("object_movement")) +_object_movement = true; +if (ConfMan.hasKey("object_locating") && ConfMan.getBool("object_locating")) +_object_locating = true; +if (ConfMan.hasKey("piracy") && ConfMan.getBool("piracy")) +_piracy = true; +if (ConfMan.hasKey("random_seed")) +_random.setSeed(ConfMan.getInt("random_seed")); +if (ConfMan.hasKey("script_cols")) +_script_cols = ConfMan.getInt("script_cols"); +if (ConfMan.hasKey("tandy_bit") && ConfMan.getBool("tandy_bit")) +_user_tandy_bit = true; +if (ConfMan.hasKey("undo_slots")) +_undo_slots = ConfMan.getInt("undo_slots"); +if (ConfMan.hasKey("expand_abbreviations") && ConfMan.getBool("expand_abbreviations")) +_expand_abbreviations = true; +if (ConfMan.hasKey("err_report_mode")) { + _err_report_mode = ConfMan.getInt("err_report_mode"); + if ((_err_report_mode < ERR_REPORT_NEVER) || (_err_report_mode > ERR_REPORT_FATAL)) + _err_report_mode = ERR_DEFAULT_REPORT_MODE; +} + +#endif + +} // End of namespace Scott +} // End of namespace Glk diff --git a/engines/glk/frotz/header.h b/engines/glk/frotz/config.h index cf7ab64f4f..a210ba29a0 100644 --- a/engines/glk/frotz/header.h +++ b/engines/glk/frotz/config.h @@ -20,14 +20,66 @@ * */ -#ifndef GLK_FROTZ_HEADER -#define GLK_FROTZ_HEADER +#ifndef GLK_FROTZ_CONFIG +#define GLK_FROTZ_CONFIG #include "glk/frotz/frotz_types.h" namespace Glk { namespace Frotz { +/** + * Configuration flags + */ +enum ConfigFlag { + CONFIG_BYTE_SWAPPED = 0x01, ///< Story file is byte swapped - V3 + CONFIG_TIME = 0x02, ///< Status line displays time - V3 + CONFIG_TWODISKS = 0x04, ///< Story file occupied two disks - V3 + CONFIG_TANDY = 0x08, ///< Tandy licensed game - V3 + CONFIG_NOSTATUSLINE = 0x10, ///< Interpr can't support status lines - V3 + CONFIG_SPLITSCREEN = 0x20, ///< Interpr supports split screen mode - V3 + CONFIG_PROPORTIONAL = 0x40, ///< Interpr uses proportional font - V3 + + CONFIG_COLOUR = 0x01, ///< Interpr supports colour - V5+ + CONFIG_PICTURES = 0x02, ///< Interpr supports pictures - V6 + CONFIG_BOLDFACE = 0x04, ///< Interpr supports boldface style - V4+ + CONFIG_EMPHASIS = 0x08, ///< Interpr supports emphasis style - V4+ + CONFIG_FIXED = 0x10, ///< Interpr supports fixed width style - V4+ + CONFIG_SOUND = 0x20, ///< Interpr supports sound - V6 + CONFIG_TIMEDINPUT = 0x80, ///< Interpr supports timed input - V4+ + + SCRIPTING_FLAG = 0x0001, ///< Outputting to transscription file - V1+ + FIXED_FONT_FLAG = 0x0002, ///< Use fixed width font - V3+ + REFRESH_FLAG = 0x0004, ///< Refresh the screen - V6 + GRAPHICS_FLAG = 0x0008, ///< Game wants to use graphics - V5+ + OLD_SOUND_FLAG = 0x0010, ///< Game wants to use sound effects - V3 + UNDO_FLAG = 0x0010, ///< Game wants to use UNDO feature - V5+ + MOUSE_FLAG = 0x0020, ///< Game wants to use a mouse - V5+ + COLOUR_FLAG = 0x0040, ///< Game wants to use colours - V5+ + SOUND_FLAG = 0x0080, ///< Game wants to use sound effects - V5+ + MENU_FLAG = 0x0100 ///< Game wants to use menus - V6 +}; + +/** + * There are four error reporting modes: never report errors; + * report only the first time a given error type occurs; + * report every time an error occurs; + * or treat all errors as fatal errors, killing the interpreter. + * I strongly recommend "report once" as the default. But you can compile in a + * different default by changing the definition of ERR_DEFAULT_REPORT_MODE. + */ +enum ErrorReport { + ERR_REPORT_NEVER = 0, + ERR_REPORT_ONCE = 1, + ERR_REPORT_ALWAYS = 2, + ERR_REPORT_FATAL = 3, + + ERR_DEFAULT_REPORT_MODE = ERR_REPORT_NEVER +}; + +/** + * Enumeration of the game header byte indexes + */ enum HeaderByte { H_VERSION = 0, H_CONFIG = 1, @@ -64,6 +116,9 @@ enum HeaderByte { H_USER_NAME = 56 }; +/** + * Header extension fields + */ enum { HX_TABLE_SIZE = 0, HX_MOUSE_X = 1, @@ -75,6 +130,32 @@ enum { }; /** + * User options + */ +struct UserOptions { + bool _attribute_assignment; + bool _attribute_testing; + bool _object_locating; + bool _object_movement; + bool _expand_abbreviations; + bool _ignore_errors; + bool _piracy; + bool _quetzal; + bool _sound; + bool _tandyBit; + int _left_margin; + int _right_margin; + int _undo_slots; + int _script_cols; + int _err_report_mode; + + /** + * Constructor + */ + UserOptions(); +}; + +/** * Story file header data */ struct Header { @@ -133,19 +214,7 @@ public: /** * Constructor */ - Header() : h_version(0), h_config(0), h_release(0), h_resident_size(0), h_start_pc(0), - h_dictionary(0), h_objects(0), h_globals(0), h_dynamic_size(0), h_flags(0), - h_abbreviations(0), h_file_size(0), h_checksum(0), h_interpreter_number(0), - h_interpreter_version(0), h_screen_rows(0), h_screen_cols(0), h_screen_width(0), - h_screen_height(0), h_font_height(1), h_font_width(1), h_functions_offset(0), - h_strings_offset(0), h_default_background(0), h_default_foreground(0), - h_terminating_keys(0), h_line_width(0), h_standard_high(1), h_standard_low(1), - h_alphabet(0), h_extension_table(0), - hx_table_size(0), hx_mouse_x(0), hx_mouse_y(0), hx_unicode_table(0), - hx_flags(0), hx_fore_colour(0), hx_back_colour(0), _storyId(UNKNOWN) { - Common::fill(&h_serial[0], &h_serial[6], '\0'); - Common::fill(&h_user_name[0], &h_user_name[8], '\0'); - } + Header(); /** * Load the header diff --git a/engines/glk/frotz/frotz.cpp b/engines/glk/frotz/frotz.cpp index 344aa92b12..58287900d9 100644 --- a/engines/glk/frotz/frotz.cpp +++ b/engines/glk/frotz/frotz.cpp @@ -47,36 +47,6 @@ void Frotz::runGame(Common::SeekableReadStream *gameFile) { } void Frotz::initialize() { - if (ConfMan.hasKey("attribute_assignment") && ConfMan.getBool("attribute_assignment")) - _attribute_assignment = true; - if (ConfMan.hasKey("attribute_testing") && ConfMan.getBool("attribute_testing")) - _attribute_testing = true; - if (ConfMan.hasKey("ignore_errors") && ConfMan.getBool("ignore_errors")) - _ignore_errors = true; - if (ConfMan.hasKey("object_movement") && ConfMan.getBool("object_movement")) - _object_movement = true; - if (ConfMan.hasKey("object_locating") && ConfMan.getBool("object_locating")) - _object_locating = true; - if (ConfMan.hasKey("piracy") && ConfMan.getBool("piracy")) - _piracy = true; - if (ConfMan.hasKey("save_quetzal") && ConfMan.getBool("save_quetzal")) - _save_quetzal = true; - if (ConfMan.hasKey("random_seed")) - _random.setSeed(ConfMan.getInt("random_seed")); - if (ConfMan.hasKey("script_cols")) - _script_cols = ConfMan.getInt("script_cols"); - if (ConfMan.hasKey("tandy_bit") && ConfMan.getBool("tandy_bit")) - _user_tandy_bit = true; - if (ConfMan.hasKey("undo_slots")) - _undo_slots = ConfMan.getInt("undo_slots"); - if (ConfMan.hasKey("expand_abbreviations") && ConfMan.getBool("expand_abbreviations")) - _expand_abbreviations = true; - if (ConfMan.hasKey("err_report_mode")) { - _err_report_mode = ConfMan.getInt("err_report_mode"); - if ((_err_report_mode < ERR_REPORT_NEVER) || (_err_report_mode > ERR_REPORT_FATAL)) - _err_report_mode = ERR_DEFAULT_REPORT_MODE; - } - // Call process initialization Processor::initialize(); @@ -97,7 +67,7 @@ Common::Error Frotz::saveGameData(strid_t file) { if ((gfp = frotzopenprompt(FILE_SAVE)) == nullptr) goto finished; - if (_save_quetzal) { + if (_quetzal) { success = save_quetzal(gfp, story_fp, blorb_ofs); } else { @@ -164,7 +134,7 @@ Common::Error Frotz::loadGameData(strid_t file) { if ((gfp = frotzopenprompt(FILE_RESTORE)) == nullptr) goto finished; - if (_save_quetzal) { + if (_quetzal) { success = restore_quetzal (gfp, story_fp, blorb_ofs); } else { diff --git a/engines/glk/frotz/frotz_types.h b/engines/glk/frotz/frotz_types.h index e68f55e147..bf3067fd04 100644 --- a/engines/glk/frotz/frotz_types.h +++ b/engines/glk/frotz/frotz_types.h @@ -35,22 +35,6 @@ namespace Frotz { #define lo(v) (v & 0xff) #define hi(v) (v >> 8) -/* There are four error reporting modes: never report errors; - * report only the first time a given error type occurs; - * report every time an error occurs; - * or treat all errors as fatal errors, killing the interpreter. - * I strongly recommend "report once" as the default. But you can compile in a - * different default by changing the definition of ERR_DEFAULT_REPORT_MODE. - */ -enum ErrorReport { - ERR_REPORT_NEVER = 0, - ERR_REPORT_ONCE = 1, - ERR_REPORT_ALWAYS = 2, - ERR_REPORT_FATAL = 3, - - ERR_DEFAULT_REPORT_MODE = ERR_REPORT_NEVER -}; - /** * Character codes */ @@ -116,35 +100,6 @@ enum Version { V9 = 9 }; -enum ConfigFlag { - CONFIG_BYTE_SWAPPED = 0x01, ///< Story file is byte swapped - V3 - CONFIG_TIME = 0x02, ///< Status line displays time - V3 - CONFIG_TWODISKS = 0x04, ///< Story file occupied two disks - V3 - CONFIG_TANDY = 0x08, ///< Tandy licensed game - V3 - CONFIG_NOSTATUSLINE = 0x10, ///< Interpr can't support status lines - V3 - CONFIG_SPLITSCREEN = 0x20, ///< Interpr supports split screen mode - V3 - CONFIG_PROPORTIONAL = 0x40, ///< Interpr uses proportional font - V3 - - CONFIG_COLOUR = 0x01, ///< Interpr supports colour - V5+ - CONFIG_PICTURES = 0x02, ///< Interpr supports pictures - V6 - CONFIG_BOLDFACE = 0x04, ///< Interpr supports boldface style - V4+ - CONFIG_EMPHASIS = 0x08, ///< Interpr supports emphasis style - V4+ - CONFIG_FIXED = 0x10, ///< Interpr supports fixed width style - V4+ - CONFIG_SOUND = 0x20, ///< Interpr supports sound - V6 - CONFIG_TIMEDINPUT = 0x80, ///< Interpr supports timed input - V4+ - - SCRIPTING_FLAG = 0x0001, ///< Outputting to transscription file - V1+ - FIXED_FONT_FLAG = 0x0002, ///< Use fixed width font - V3+ - REFRESH_FLAG = 0x0004, ///< Refresh the screen - V6 - GRAPHICS_FLAG = 0x0008, ///< Game wants to use graphics - V5+ - OLD_SOUND_FLAG = 0x0010, ///< Game wants to use sound effects - V3 - UNDO_FLAG = 0x0010, ///< Game wants to use UNDO feature - V5+ - MOUSE_FLAG = 0x0020, ///< Game wants to use a mouse - V5+ - COLOUR_FLAG = 0x0040, ///< Game wants to use colours - V5+ - SOUND_FLAG = 0x0080, ///< Game wants to use sound effects - V5+ - MENU_FLAG = 0x0100 ///< Game wants to use menus - V6 -}; - enum { TRANSPARENT_FLAG = 0x0001 ///< Game wants to use transparency - V6 }; @@ -249,36 +204,6 @@ typedef byte zbyte; typedef uint zchar; typedef uint16 zword; -/** - * User options - */ -struct UserOptions { - int _attribute_assignment; - int _attribute_testing; - int _context_lines; - int _object_locating; - int _object_movement; - int _left_margin; - int _right_margin; - bool _ignore_errors; - bool _piracy; - int _undo_slots; - int _expand_abbreviations; - int _script_cols; - 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), - _user_tandy_bit(false) { - } -}; - #define MAX_NESTING 16 struct Redirect { zword _xSize; diff --git a/engines/glk/frotz/glk_interface.cpp b/engines/glk/frotz/glk_interface.cpp index 292409ff7a..477891ad70 100644 --- a/engines/glk/frotz/glk_interface.cpp +++ b/engines/glk/frotz/glk_interface.cpp @@ -110,7 +110,7 @@ void GlkInterface::initialize() { * Icky magic bit setting */ - if (h_version == V3 && _user_tandy_bit) + if (h_version == V3 && _tandyBit) h_config |= CONFIG_TANDY; if (h_version == V3 && gos_upper) diff --git a/engines/glk/frotz/header.cpp b/engines/glk/frotz/header.cpp deleted file mode 100644 index f7ebb5ec00..0000000000 --- a/engines/glk/frotz/header.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* 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. - * - */ - -#include "glk/frotz/header.h" -#include "common/textconsole.h" - -namespace Glk { -namespace Frotz { - -const Header::StoryEntry Header::RECORDS[25] = { - { SHERLOCK, 21, "871214" }, - { SHERLOCK, 26, "880127" }, - { BEYOND_ZORK, 47, "870915" }, - { BEYOND_ZORK, 49, "870917" }, - { BEYOND_ZORK, 51, "870923" }, - { BEYOND_ZORK, 57, "871221" }, - { ZORK_ZERO, 296, "881019" }, - { ZORK_ZERO, 366, "890323" }, - { ZORK_ZERO, 383, "890602" }, - { ZORK_ZERO, 393, "890714" }, - { SHOGUN, 292, "890314" }, - { SHOGUN, 295, "890321" }, - { SHOGUN, 311, "890510" }, - { SHOGUN, 322, "890706" }, - { ARTHUR, 54, "890606" }, - { ARTHUR, 63, "890622" }, - { ARTHUR, 74, "890714" }, - { JOURNEY, 26, "890316" }, - { JOURNEY, 30, "890322" }, - { JOURNEY, 77, "890616" }, - { JOURNEY, 83, "890706" }, - { LURKING_HORROR, 203, "870506" }, - { LURKING_HORROR, 219, "870912" }, - { LURKING_HORROR, 221, "870918" }, - { UNKNOWN, 0, "------" } -}; - -void Header::loadHeader(Common::SeekableReadStream &f) { - h_version = f.readByte(); - h_config = f.readByte(); - - if (h_version < V1 || h_version > V8) - error("Unknown Z-code version"); - - if (h_version == V6) - error("Cannot play Z-code version 6"); - - if (h_version == V3 && (h_config & CONFIG_BYTE_SWAPPED)) - error("Byte swapped story file"); - - h_release = f.readUint16BE(); - h_resident_size = f.readUint16BE(); - h_start_pc = f.readUint16BE(); - h_dictionary = f.readUint16BE(); - h_objects = f.readUint16BE(); - h_globals = f.readUint16BE(); - h_dynamic_size = f.readUint16BE(); - h_flags = f.readUint16BE(); - f.read(h_serial, 6); - - /* Auto-detect buggy story files that need special fixes */ - _storyId = UNKNOWN; - - for (int i = 0; RECORDS[i]._storyId != UNKNOWN; ++i) { - if (h_release == RECORDS[i]._release) { - if (!strncmp((const char *)h_serial, RECORDS[i]._serial, 6)) { - _storyId = RECORDS[i]._storyId; - break; - } - } - } - - h_abbreviations = f.readUint16BE(); - h_file_size = f.readUint16BE(); - h_checksum = f.readUint16BE(); - - f.seek(H_FUNCTIONS_OFFSET); - h_functions_offset = f.readUint16BE(); - h_strings_offset = f.readUint16BE(); - f.seek(H_TERMINATING_KEYS); - h_terminating_keys = f.readUint16BE(); - f.seek(H_ALPHABET); - h_alphabet = f.readUint16BE(); - h_extension_table = f.readUint16BE(); - - - // Zork Zero Macintosh doesn't have the graphics flag set - if (_storyId == ZORK_ZERO && h_release == 296) - h_flags |= GRAPHICS_FLAG; -} - -} // End of namespace Scott -} // End of namespace Glk diff --git a/engines/glk/frotz/mem.h b/engines/glk/frotz/mem.h index 3b1b81b21f..d973890605 100644 --- a/engines/glk/frotz/mem.h +++ b/engines/glk/frotz/mem.h @@ -24,7 +24,7 @@ #define GLK_FROTZ_MEM #include "glk/frotz/frotz_types.h" -#include "glk/frotz/header.h" +#include "glk/frotz/config.h" namespace Glk { namespace Frotz { diff --git a/engines/glk/frotz/processor.cpp b/engines/glk/frotz/processor.cpp index 343299e27c..09eb82b509 100644 --- a/engines/glk/frotz/processor.cpp +++ b/engines/glk/frotz/processor.cpp @@ -304,7 +304,7 @@ void Processor::call(zword routine, int argc, zword *args, int ct) { *--_sp = (zword)(pc >> 9); *--_sp = (zword)(pc & 0x1ff); *--_sp = (zword)(_fp - _stack - 1); - *--_sp = (zword)(argc | (ct << (_save_quetzal ? 12 : 8))); + *--_sp = (zword)(argc | (ct << (_quetzal ? 12 : 8))); _fp = _sp; _frameCount++; @@ -337,7 +337,7 @@ void Processor::call(zword routine, int argc, zword *args, int ct) { if (_sp - _stack < count) runtimeError(ERR_STK_OVF); - if (_save_quetzal) + if (_quetzal) _fp[0] |= (zword)count << 8; // Save local var count for Quetzal. value = 0; @@ -363,7 +363,7 @@ void Processor::ret(zword value) { _sp = _fp; - ct = *_sp++ >> (_save_quetzal ? 12 : 8); + ct = *_sp++ >> (_quetzal ? 12 : 8); _frameCount--; _fp = _stack + 1 + *_sp++; pc = *_sp++; @@ -496,11 +496,11 @@ void Processor::__illegal__() { } void Processor::z_catch() { - store(_save_quetzal ? _frameCount : (zword)(_fp - _stack)); + store(_quetzal ? _frameCount : (zword)(_fp - _stack)); } void Processor::z_throw() { - if (_save_quetzal) { + if (_quetzal) { if (zargs[1] > _frameCount) runtimeError(ERR_BAD_FRAME); diff --git a/engines/glk/module.mk b/engines/glk/module.mk index 10cef3220b..eedab577a7 100644 --- a/engines/glk/module.mk +++ b/engines/glk/module.mk @@ -21,10 +21,10 @@ MODULE_OBJS := \ window_pair.o \ window_text_buffer.o \ window_text_grid.o \ + frotz/config.o \ frotz/detection.o \ frotz/frotz.o \ frotz/glk_interface.o \ - frotz/header.o \ frotz/mem.o \ frotz/processor.o \ frotz/processor_buffer.o \ |