aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2018-11-18 11:29:41 -0800
committerPaul Gilbert2018-12-08 19:05:59 -0800
commitada80dedc0d39d76a2cd3c3b4af6c3219738d0bf (patch)
treed94f2b0c7a4616846066794634f59a7783b19836
parent79f3d946ef23ff121f30d9e429d2c4ab985ce29c (diff)
downloadscummvm-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
-rw-r--r--engines/glk/frotz/config.cpp196
-rw-r--r--engines/glk/frotz/config.h (renamed from engines/glk/frotz/header.h)99
-rw-r--r--engines/glk/frotz/frotz.cpp34
-rw-r--r--engines/glk/frotz/frotz_types.h75
-rw-r--r--engines/glk/frotz/glk_interface.cpp2
-rw-r--r--engines/glk/frotz/header.cpp112
-rw-r--r--engines/glk/frotz/mem.h2
-rw-r--r--engines/glk/frotz/processor.cpp10
-rw-r--r--engines/glk/module.mk2
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 \