[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