[Scummvm-git-logs] scummvm master -> 56f1386e0657678727ae3093d9c0fb412ac76186
dreammaster
paulfgilbert at gmail.com
Sat Jul 4 22:37:19 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
56f1386e06 GLK: COMPREHEND: Fix loading of extra string files
Commit: 56f1386e0657678727ae3093d9c0fb412ac76186
https://github.com/scummvm/scummvm/commit/56f1386e0657678727ae3093d9c0fb412ac76186
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-07-04T15:36:52-07:00
Commit Message:
GLK: COMPREHEND: Fix loading of extra string files
Changed paths:
engines/glk/comprehend/game_cc.cpp
engines/glk/comprehend/game_data.cpp
engines/glk/comprehend/game_data.h
engines/glk/comprehend/game_tr.cpp
engines/glk/comprehend/game_tr.h
diff --git a/engines/glk/comprehend/game_cc.cpp b/engines/glk/comprehend/game_cc.cpp
index 7545994bea..feaf6bf74b 100644
--- a/engines/glk/comprehend/game_cc.cpp
+++ b/engines/glk/comprehend/game_cc.cpp
@@ -40,7 +40,7 @@ void CrimsonCrownGame::setupDisk(uint diskNum) {
_gameDataFile = Common::String::format("cc%u.gda", diskNum);
_stringFiles.clear();
- _stringFiles.push_back(StringFile(Common::String::format("ma.ms%u", diskNum), 0x89));
+ _stringFiles.push_back(Common::String::format("ma.ms%u", diskNum).c_str());
_locationGraphicFiles.clear();
_locationGraphicFiles.push_back(Common::String::format("ra.ms%u", diskNum));
diff --git a/engines/glk/comprehend/game_data.cpp b/engines/glk/comprehend/game_data.cpp
index bea614847c..5f655ca443 100644
--- a/engines/glk/comprehend/game_data.cpp
+++ b/engines/glk/comprehend/game_data.cpp
@@ -34,6 +34,8 @@ namespace Comprehend {
static const char CHARSET[] = "..abcdefghijklmnopqrstuvwxyz .";
static const char SPECIAL_CHARSET[] = "[]\n!\"#$%&'(),-/0123456789:;?<>";
+#define STRING_FILE_COUNT 64
+
void FunctionState::clear() {
_testResult = true;
_elseResult = false;
@@ -234,7 +236,7 @@ void GameData::parse_vm(FileBuffer *fb) {
void GameData::parse_action_tables(FileBuffer *fb) {
uint8 verb, count;
- int i, j;
+ uint i, j;
_actions.clear();
_actions.resize(7);
@@ -629,30 +631,52 @@ void GameData::parse_header(FileBuffer *fb) {
8;
}
-void GameData::load_extra_string_file(StringFile *string_file) {
- FileBuffer fb(string_file->_filename);
- unsigned end;
+void GameData::load_extra_string_file(const StringFile &stringFile) {
+ FileBuffer fb(stringFile._filename);
+
+ if (stringFile._baseOffset > 0) {
+ // Explicit offset specified, so read the strings in sequentially
+ uint endOffset = stringFile._baseOffset;
+ if (!endOffset)
+ endOffset = fb.size();
- if (string_file->_endOffset)
- end = string_file->_endOffset;
- else
- end = fb.size();
+ parse_string_table(&fb, stringFile._baseOffset, endOffset, &_strings2);
+ } else {
+ // Standard strings file. Has a 4-byte header we can ignore,
+ // followed by 64 2-byte string offsets
+ fb.seek(4);
+ uint fileSize = fb.size();
+
+ // Read in the index
+ uint16 index[STRING_FILE_COUNT];
+ Common::fill(&index[0], &index[STRING_FILE_COUNT], 0);
+
+ for (int i = 0; i < STRING_FILE_COUNT; ++i) {
+ uint v = fb.readUint16LE();
+ if (v > fileSize)
+ break;
- parse_string_table(&fb, string_file->_baseOffset,
- end, &_strings2);
+ index[i] = v;
+ }
+
+ // Iterate through parsing the strings
+ for (int i = 0; i < STRING_FILE_COUNT; ++i) {
+ if (index[i]) {
+ fb.seek(index[i] + 4);
+ _strings2.push_back(parseString(&fb));
+ } else {
+ _strings2.push_back("");
+ }
+ }
+ }
}
void GameData::load_extra_string_files() {
- uint i;
-
- for (i = 0; i < _stringFiles.size(); i++) {
- // HACK - get string offsets correct
- _strings2.resize(0x40 * i);
- if (_strings2.empty())
- _strings2.push_back("");
+ _strings2.clear();
+ _strings2.reserve(STRING_FILE_COUNT * _stringFiles.size());
- load_extra_string_file(&_stringFiles[i]);
- }
+ for (uint i = 0; i < _stringFiles.size(); i++)
+ load_extra_string_file(_stringFiles[i]);
}
void GameData::loadGameData() {
diff --git a/engines/glk/comprehend/game_data.h b/engines/glk/comprehend/game_data.h
index 69c1037acd..a873f6cd54 100644
--- a/engines/glk/comprehend/game_data.h
+++ b/engines/glk/comprehend/game_data.h
@@ -304,8 +304,9 @@ struct StringFile {
uint32 _endOffset;
StringFile() : _baseOffset(0), _endOffset(0) {
- }
- StringFile(const Common::String &fname, uint32 baseOfs, uint32 endO = 0) : _filename(fname), _baseOffset(baseOfs), _endOffset(endO) {
+ }
+ StringFile(const char *fname, uint32 baseOfs = 0, uint32 endO = 0) :
+ _filename(fname), _baseOffset(baseOfs), _endOffset(endO) {
}
};
@@ -395,7 +396,7 @@ private:
}
void load_extra_string_files();
- void load_extra_string_file(StringFile *string_file);
+ void load_extra_string_file(const StringFile &stringFile);
void parse_header_le16(FileBuffer *fb, uint16 *val);
uint8 parse_vm_instruction(FileBuffer *fb, Instruction *instr);
void parse_function(FileBuffer *fb, Function *func);
@@ -442,7 +443,7 @@ public:
}
void clearGame();
- virtual void loadGame();
+ void loadGame();
};
} // namespace Comprehend
diff --git a/engines/glk/comprehend/game_tr.cpp b/engines/glk/comprehend/game_tr.cpp
index 0c11eca08b..b4e550d1f2 100644
--- a/engines/glk/comprehend/game_tr.cpp
+++ b/engines/glk/comprehend/game_tr.cpp
@@ -73,11 +73,11 @@ TransylvaniaGame::TransylvaniaGame() : ComprehendGame(),
_miceReleased(false) {
_gameDataFile = "tr.gda";
- _stringFiles.push_back(StringFile("MA.MS1", 0x88));
- _stringFiles.push_back(StringFile("MB.MS1", 0x88));
- _stringFiles.push_back(StringFile("MC.MS1", 0x88));
- _stringFiles.push_back(StringFile("MD.MS1", 0x88));
- _stringFiles.push_back(StringFile("ME.MS1", 0x88));
+ _stringFiles.push_back("MA.MS1");
+ _stringFiles.push_back("MB.MS1");
+ _stringFiles.push_back("MC.MS1");
+ _stringFiles.push_back("MD.MS1");
+ _stringFiles.push_back("ME.MS1");
_locationGraphicFiles.push_back("RA.MS1");
_locationGraphicFiles.push_back("RB.MS1");
@@ -275,14 +275,5 @@ void TransylvaniaGame::beforeGame() {
g_comprehend->setDisableSaves(false);
}
-void TransylvaniaGame::loadGame() {
- ComprehendGame::loadGame();
-
- // TODO: Figure out why the corrupt string happened, since it could
- // affect other strings
- _strings2[192] = "envelopes the sarcophagus. In a violent blast, the lid flies off "
- "and explodes in a cascade of glowing dust!";
-}
-
} // namespace Comprehend
} // namespace Glk
diff --git a/engines/glk/comprehend/game_tr.h b/engines/glk/comprehend/game_tr.h
index a91a23f592..70e4a059e5 100644
--- a/engines/glk/comprehend/game_tr.h
+++ b/engines/glk/comprehend/game_tr.h
@@ -47,7 +47,6 @@ public:
void synchronizeSave(Common::Serializer &s) override;
int roomIsSpecial(unsigned room_index, unsigned *roomDescString) override;
void handleSpecialOpcode(uint8 operand) override;
- void loadGame() override;
};
} // namespace Comprehend
More information about the Scummvm-git-logs
mailing list