[Scummvm-git-logs] scummvm master -> 14da53647ca2b10be4cb4c8cfcfa5407c848fbf4

dreammaster paulfgilbert at gmail.com
Sat Dec 12 19:04:39 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
4665c65d84 GLK: COMPREHEND: Implement CALL_FUNC2 opcode
14da53647c GLK: COMPREHEND: Add further string loading


Commit: 4665c65d849d5f32cc3189ad9c701cd73dc29ede
    https://github.com/scummvm/scummvm/commit/4665c65d849d5f32cc3189ad9c701cd73dc29ede
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-12-12T11:04:17-08:00

Commit Message:
GLK: COMPREHEND: Implement CALL_FUNC2 opcode

Changed paths:
    engines/glk/comprehend/debugger_dumper.cpp
    engines/glk/comprehend/game_data.h
    engines/glk/comprehend/game_opcodes.cpp


diff --git a/engines/glk/comprehend/debugger_dumper.cpp b/engines/glk/comprehend/debugger_dumper.cpp
index 4f9eef88d5..96d3942bf2 100644
--- a/engines/glk/comprehend/debugger_dumper.cpp
+++ b/engines/glk/comprehend/debugger_dumper.cpp
@@ -88,6 +88,7 @@ DebuggerDumper::DebuggerDumper() : _game(nullptr) {
 	_opcodes[OPCODE_REMOVE_OBJECT] = "remove_object";
 	_opcodes[OPCODE_SET_FLAG] = "set_flag";
 	_opcodes[OPCODE_CALL_FUNC] = "call_func";
+	_opcodes[OPCODE_CALL_FUNC2] = "call_func2";
 	_opcodes[OPCODE_TURN_TICK] = "turn_tick";
 	_opcodes[OPCODE_CLEAR_FLAG] = "clear_flag";
 	_opcodes[OPCODE_INVENTORY_ROOM] = "inventory_room";
diff --git a/engines/glk/comprehend/game_data.h b/engines/glk/comprehend/game_data.h
index 098e508346..8b9fe3725e 100644
--- a/engines/glk/comprehend/game_data.h
+++ b/engines/glk/comprehend/game_data.h
@@ -102,6 +102,7 @@ enum ScriptOpcode {
 	OPCODE_REMOVE_OBJECT,
 	OPCODE_SET_FLAG,
 	OPCODE_CALL_FUNC,
+	OPCODE_CALL_FUNC2,
 	OPCODE_TURN_TICK,
 	OPCODE_CLEAR_FLAG,
 	OPCODE_INVENTORY_ROOM,
diff --git a/engines/glk/comprehend/game_opcodes.cpp b/engines/glk/comprehend/game_opcodes.cpp
index abffa35812..0c5400f1e0 100644
--- a/engines/glk/comprehend/game_opcodes.cpp
+++ b/engines/glk/comprehend/game_opcodes.cpp
@@ -45,6 +45,9 @@ void ComprehendGameOpcodes::execute_opcode(const Instruction *instr, const Sente
 	byte opcode = getOpcode(instr);
 	switch (_opcodeMap[opcode]) {
 	case OPCODE_CALL_FUNC:
+	case OPCODE_CALL_FUNC2:
+		// Note: CALL_FUNC2 in the original did some extra backing of data which is
+		// redundant in the ScummVM version, so it can be handled the same as CALL_FUNC.
 		index = instr->_operand[0];
 		if (instr->_operand[1] == 0x81)
 			index += 256;
@@ -707,6 +710,7 @@ ComprehendGameV2::ComprehendGameV2() {
 	_opcodeMap[0x90] = OPCODE_WAIT_KEY;
 	_opcodeMap[0x92] = OPCODE_CALL_FUNC;
 	_opcodeMap[0x95] = OPCODE_CLEAR_WORD;
+	_opcodeMap[0x96] = OPCODE_CALL_FUNC2;
 	_opcodeMap[0x98] = OPCODE_TURN_TICK;
 	_opcodeMap[0x99] = OPCODE_SET_FLAG;
 	_opcodeMap[0x9a] = OPCODE_SET_WORD;


Commit: 14da53647ca2b10be4cb4c8cfcfa5407c848fbf4
    https://github.com/scummvm/scummvm/commit/14da53647ca2b10be4cb4c8cfcfa5407c848fbf4
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-12-12T11:04:17-08:00

Commit Message:
GLK: COMPREHEND: Add further string loading

Changed paths:
    engines/glk/comprehend/game_tm.cpp


diff --git a/engines/glk/comprehend/game_tm.cpp b/engines/glk/comprehend/game_tm.cpp
index eb84d2cfe7..c0d9b7f61a 100644
--- a/engines/glk/comprehend/game_tm.cpp
+++ b/engines/glk/comprehend/game_tm.cpp
@@ -55,6 +55,9 @@ void TalismanGame::loadStrings() {
 	int bankOffsets[BANKS_COUNT];
 	int stringOffsets[STRINGS_PER_BANK + 1];
 
+	_strings.clear();
+	_strings2.clear();
+
 	Common::File f;
 	if (!f.open("novel.exe"))
 		error("novel.exe is a required file");
@@ -63,26 +66,37 @@ void TalismanGame::loadStrings() {
 	if (md5 != "0e7f002971acdb055f439020363512ce")
 		error("Unrecognised novel.exe encountered");
 
-	f.seek(STRINGS_SEGMENT1);
-	for (int bank = 0; bank < BANKS_COUNT; ++bank)
-		bankOffsets[bank] = f.readUint16LE();
-
-	// Iterate through the banks loading the strings
-	for (int bank = 0; bank < BANKS_COUNT; ++bank) {
-		if (!bankOffsets[bank])
-			continue;
-
-		f.seek(STRINGS_SEGMENT1 + bankOffsets[bank]);
-		for (int strNum = 0; strNum <= STRINGS_PER_BANK; ++strNum)
-			stringOffsets[strNum] = f.readUint16LE();
-
-		for (int strNum = 0; strNum < STRINGS_PER_BANK; ++strNum) {
-			int size = stringOffsets[strNum + 1] - stringOffsets[strNum];
-			assert(size > 0);
-
-			f.seek(STRINGS_SEGMENT1 + bankOffsets[bank] + stringOffsets[strNum]);
-			FileBuffer fb(&f, size);
-			_strings.push_back(parseString(&fb));
+	const int STRING_SEGMENTS[2] = { STRINGS_SEGMENT1, STRINGS_SEGMENT2 };
+
+	// TODO: Figure out use of string segment 2
+	for (int strings = 0; strings < 1; ++strings) {
+		f.seek(STRING_SEGMENTS[strings]);
+		for (int bank = 0; bank < BANKS_COUNT; ++bank)
+			bankOffsets[bank] = f.readUint16LE();
+
+		// Iterate through the banks loading the strings
+		for (int bank = 0; bank < BANKS_COUNT; ++bank) {
+			if (!bankOffsets[bank])
+				continue;
+
+			f.seek(STRING_SEGMENTS[strings] + bankOffsets[bank]);
+			for (int strNum = 0; strNum <= STRINGS_PER_BANK; ++strNum)
+				stringOffsets[strNum] = f.readUint16LE();
+
+			for (int strNum = 0; strNum < STRINGS_PER_BANK; ++strNum) {
+				int size = stringOffsets[strNum + 1] - stringOffsets[strNum];
+				if (size < 0)
+					size = 0xfff;
+
+				f.seek(STRING_SEGMENTS[strings] + bankOffsets[bank] + stringOffsets[strNum]);
+				FileBuffer fb(&f, size);
+				Common::String str = parseString(&fb);
+
+				if (bank < 8)
+					_strings.push_back(str);
+				else
+					_strings2.push_back(str);
+			}
 		}
 	}
 }




More information about the Scummvm-git-logs mailing list