[Scummvm-git-logs] scummvm master -> 24b77f1e994bee3fe60ff8833d50e527c059d388

somaen einarjohants at gmail.com
Sun Feb 7 21:52:59 UTC 2021


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:
24b77f1e99 TINSEL: Implement Noir game-chunk loading.


Commit: 24b77f1e994bee3fe60ff8833d50e527c059d388
    https://github.com/scummvm/scummvm/commit/24b77f1e994bee3fe60ff8833d50e527c059d388
Author: Einar Johan Trøan Sømåen (somaen at scummvm.org)
Date: 2021-02-07T22:52:51+01:00

Commit Message:
TINSEL: Implement Noir game-chunk loading.

Changed paths:
    engines/tinsel/scn.h
    engines/tinsel/tinsel.cpp


diff --git a/engines/tinsel/scn.h b/engines/tinsel/scn.h
index 12253d70b2..b452be4c09 100644
--- a/engines/tinsel/scn.h
+++ b/engines/tinsel/scn.h
@@ -73,6 +73,9 @@ namespace Tinsel {
 // This single chunk is common to all Tinsel versions
 #define	CHUNK_MBSTRING			0x33340022L
 
+// Used in Discworld Noir
+#define CHUNK_GAME	        	0x33340031L
+
 // This is a base, subsequent numbers may also get used
 #define CHUNK_GRAB_NAME			0x33340100L
 
diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp
index 53d2eb7110..440b1ae7c3 100644
--- a/engines/tinsel/tinsel.cpp
+++ b/engines/tinsel/tinsel.cpp
@@ -24,6 +24,7 @@
 #include "common/endian.h"
 #include "common/error.h"
 #include "common/events.h"
+#include "common/memstream.h"
 #include "common/keyboard.h"
 #include "common/fs.h"
 #include "common/config-manager.h"
@@ -718,66 +719,113 @@ void CuttingScene(bool bCutting) {
 		WrapScene();
 }
 
-/**
- * LoadBasicChunks
- */
-void LoadBasicChunks() {
-	byte *cptr;
+struct GameChunk {
+	int numActors;
+	int numGlobals;
 	int numObjects;
+	int numProcesses;
+	int numPolygons;
+	int cdPlayHandle;
+};
 
-	if (TinselV3) {
-		error("TODO: Implement LoadBasicChunks for Noir");
-	}
+GameChunk loadGameChunkV3() {
+	byte *cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_GAME);
+	Common::MemoryReadStream stream(cptr, 36);
+	stream.readUint32LE(); // Size of Game Chunk
+	stream.readUint32LE();
+	stream.readUint32LE();
+
+	GameChunk chunk;
+	chunk.numActors = stream.readUint32LE();
+	chunk.numGlobals =  stream.readUint32LE();
+	chunk.numPolygons = stream.readUint32LE();
+	chunk.numProcesses = stream.readUint32LE();
+	chunk.cdPlayHandle = stream.readUint32LE();
+	chunk.numObjects = stream.readUint32LE();
+	return chunk;
+}
 
-	// Allocate RAM for savescene data
-	InitializeSaveScenes();
+GameChunk createGameChunkV2() {
+	byte *cptr = nullptr;
+	GameChunk chunk;
 
 	// CHUNK_TOTAL_ACTORS seems to be missing in the released version, hard coding a value
 	// TODO: Would be nice to just change 511 to MAX_SAVED_ALIVES
 	cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_TOTAL_ACTORS);
-	_vm->_actor->RegisterActors((cptr != NULL) ? READ_32(cptr) : 511);
+	chunk.numActors = (cptr != NULL) ? READ_32(cptr) : 511;
 
 	// CHUNK_TOTAL_GLOBALS seems to be missing in some versions.
 	// So if it is missing, set a reasonably high value for the number of globals.
 	cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_TOTAL_GLOBALS);
-	RegisterGlobals((cptr != NULL) ? READ_32(cptr) : 512);
+	chunk.numGlobals = (cptr != NULL) ? READ_32(cptr) : 512;
 
 	cptr = FindChunk(INV_OBJ_SCNHANDLE, CHUNK_TOTAL_OBJECTS);
-	numObjects = (cptr != NULL) ? READ_32(cptr) : 0;
+	chunk.numObjects = (cptr != NULL) ? READ_32(cptr) : 0;
+
+	cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_TOTAL_POLY);
+	if (cptr != NULL)
+		chunk.numPolygons = *cptr;
+
+	if (TinselV2) {
+		cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_NUM_PROCESSES);
+		assert(cptr && (*cptr < 100));
+		chunk.numProcesses = *cptr;
+
+		// CdPlay() stuff
+		cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_CDPLAY_HANDLE);
+		assert(cptr);
+		chunk.cdPlayHandle = READ_32(cptr);
+		assert(chunk.cdPlayHandle < 512);
+	}
+	return chunk;
+}
+
+GameChunk loadGameChunk() {
+	if (TinselV3) {
+		return loadGameChunkV3();
+	} else {
+		return createGameChunkV2();
+	}
+}
+
+/**
+ * LoadBasicChunks
+ */
+void LoadBasicChunks() {
+	byte *cptr;
+	GameChunk game = loadGameChunk();
+
+	// Allocate RAM for savescene data
+	InitializeSaveScenes();
+
+	_vm->_actor->RegisterActors(game.numActors);
+
+	RegisterGlobals(game.numGlobals);
 
 	cptr = FindChunk(INV_OBJ_SCNHANDLE, CHUNK_OBJECTS);
 
 	// Convert to native endianness
 	INV_OBJECT *io = (INV_OBJECT *)cptr;
-	for (int i = 0; i < numObjects; i++, io++) {
+	for (int i = 0; i < game.numObjects; i++, io++) {
 		io->id        = FROM_32(io->id);
 		io->hIconFilm = FROM_32(io->hIconFilm);
 		io->hScript   = FROM_32(io->hScript);
 		io->attribute = FROM_32(io->attribute);
 	}
 
-	_vm->_dialogs->RegisterIcons(cptr, numObjects);
+	_vm->_dialogs->RegisterIcons(cptr, game.numObjects);
 
-	cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_TOTAL_POLY);
 	// Max polygons are 0 in DW1 Mac (both in the demo and the full version)
-	if (cptr != NULL && *cptr != 0)
-		MaxPolygons(*cptr);
+	if (game.numPolygons != 0)
+		MaxPolygons(game.numPolygons);
 
 	if (TinselV2) {
 		// Global processes
-		cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_NUM_PROCESSES);
-		assert(cptr && (*cptr < 100));
-		int num = *cptr;
 		cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_PROCESSES);
-		assert(!num || cptr);
-		GlobalProcesses(num, cptr);
+		assert(!game.numProcesses || cptr);
+		GlobalProcesses(game.numProcesses, cptr);
 
-		// CdPlay() stuff
-		cptr = FindChunk(MASTER_SCNHANDLE, CHUNK_CDPLAY_HANDLE);
-		assert(cptr);
-		uint32 playHandle = READ_32(cptr);
-		assert(playHandle < 512);
-		_vm->_handle->SetCdPlayHandle(playHandle);
+		_vm->_handle->SetCdPlayHandle(game.cdPlayHandle);
 	}
 }
 




More information about the Scummvm-git-logs mailing list