[Scummvm-cvs-logs] SF.net SVN: scummvm:[45651] scummvm/trunk/engines/m4

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Wed Nov 4 09:38:33 CET 2009


Revision: 45651
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45651&view=rev
Author:   dreammaster
Date:     2009-11-04 08:38:32 +0000 (Wed, 04 Nov 2009)

Log Message:
-----------
Added support for loading the game's object list

Modified Paths:
--------------
    scummvm/trunk/engines/m4/console.cpp
    scummvm/trunk/engines/m4/console.h
    scummvm/trunk/engines/m4/globals.cpp
    scummvm/trunk/engines/m4/globals.h
    scummvm/trunk/engines/m4/m4.cpp

Modified: scummvm/trunk/engines/m4/console.cpp
===================================================================
--- scummvm/trunk/engines/m4/console.cpp	2009-11-04 08:05:12 UTC (rev 45650)
+++ scummvm/trunk/engines/m4/console.cpp	2009-11-04 08:38:32 UTC (rev 45651)
@@ -47,11 +47,26 @@
 	DCmd_Register("textview",		WRAP_METHOD(Console, cmdShowTextview));
 	DCmd_Register("animview",		WRAP_METHOD(Console, cmdShowAnimview));
 	DCmd_Register("anim",			WRAP_METHOD(Console, cmdPlayAnimation));
+	DCmd_Register("object",			WRAP_METHOD(Console, cmdObject));
 }
 
 Console::~Console() {
 }
 
+static int strToInt(const char *s) {
+	if (!*s)
+		// No string at all
+		return 0;
+	else if (toupper(s[strlen(s) - 1]) != 'H')
+		// Standard decimal string
+		return atoi(s);
+
+	// Hexadecimal string
+	uint tmp;
+	sscanf(s, "%xh", &tmp);
+	return (int)tmp;
+}
+
 bool Console::cmdLoadScene(int argc, const char **argv) {
 	if (argc != 2) {
 		DebugPrintf("Usage: %s <scene number>\n", argv[0]);
@@ -284,4 +299,49 @@
 	return true;
 }
 
+bool Console::cmdObject(int argc, const char **argv) {
+	if (_vm->isM4()) {
+		DebugPrintf("Command not implemented for M4 games\n");
+	} else if (argc == 1) {
+		DebugPrintf("Usage: object ['list' | '#objnum']\n");
+	} else if (!strcmp(argv[1], "list")) {
+		// List of objects
+		for (uint objStart = 0; objStart < _vm->_globals->getObjectsSize(); objStart += 5) {
+			DebugPrintf("%2d - ", objStart);
+			for (uint objId = objStart; objId < MIN(_vm->_globals->getObjectsSize(), objStart + 5); ++objId) {
+				if (objId != objStart) DebugPrintf(", ");
+				uint16 descId = _vm->_globals->getObject(objId)->descId - 1;
+				DebugPrintf("%s", _vm->_globals->getVocab(descId));
+			}
+
+			DebugPrintf("\n");
+		}
+
+		DebugPrintf("\n");
+	} else {
+		// Print the details of a specific object
+		int id = strToInt(argv[1]);
+
+		if ((id < 0) || (id >= (int)_vm->_globals->getObjectsSize()))
+			DebugPrintf("Invalid object specified\n");
+		else {
+			const MadsObject *obj = _vm->_globals->getObject(id);
+
+			DebugPrintf("Object #%d (%s) room=%d vocabs=%d", id, _vm->_globals->getVocab(obj->descId - 1),
+				obj->roomNumber, obj->vocabCount);
+			if (obj->vocabCount > 0) {
+				DebugPrintf(" - ");
+				for (int i = 0; i < obj->vocabCount; ++i) {
+					if (i != 0) DebugPrintf(", ");
+					DebugPrintf("%s (%d)/%d", _vm->_globals->getVocab(obj->vocabList[i].vocabId - 1),
+						obj->vocabList[i].vocabId, obj->vocabList[i].unk);
+				}
+			}
+			DebugPrintf("\n");
+		}
+	}
+
+	return true;
+}
+
 } // End of namespace M4

Modified: scummvm/trunk/engines/m4/console.h
===================================================================
--- scummvm/trunk/engines/m4/console.h	2009-11-04 08:05:12 UTC (rev 45650)
+++ scummvm/trunk/engines/m4/console.h	2009-11-04 08:38:32 UTC (rev 45651)
@@ -53,6 +53,7 @@
 	bool cmdShowTextview(int argc, const char **argv);
 	bool cmdShowAnimview(int argc, const char **argv);
 	bool cmdPlayAnimation(int argc, const char **argv);
+	bool cmdObject(int argc, const char **argv);
 
 private:
 	M4Engine *_vm;

Modified: scummvm/trunk/engines/m4/globals.cpp
===================================================================
--- scummvm/trunk/engines/m4/globals.cpp	2009-11-04 08:05:12 UTC (rev 45650)
+++ scummvm/trunk/engines/m4/globals.cpp	2009-11-04 08:38:32 UTC (rev 45651)
@@ -359,7 +359,17 @@
 	_vm->res()->toss("messages.dat");
 }
 
-char* Globals::loadMessage(uint index) {
+void Globals::loadMadsObjects() {
+	Common::SeekableReadStream *objList = _vm->res()->get("objects.dat");
+	int numObjects = objList->readUint16LE();
+
+	for (int i = 0; i < numObjects; ++i)
+		_madsObjects.push_back(MadsObjectArray::value_type(new MadsObject(objList)));
+
+	_vm->res()->toss("objects.dat");
+}
+
+const char *Globals::loadMessage(uint index) {
 	if (index > _madsMessages.size() - 1) {
 		warning("Invalid message index: %i", index);
 		return NULL;
@@ -451,5 +461,23 @@
 	return false;
 }
 
+/*--------------------------------------------------------------------------*/
 
+MadsObject::MadsObject(Common::SeekableReadStream *stream) {
+	// Get the next data block
+	uint8 obj[0x30];
+	stream->read(obj, 0x30);
+
+	// Extract object data fields
+	descId = READ_LE_UINT16(&obj[0]);
+	roomNumber = READ_LE_UINT16(&obj[2]);
+	vocabCount = obj[5];
+	assert(vocabCount <= 3);
+
+	for (int i = 0; i < vocabCount; ++i) {
+		vocabList[i].unk = READ_LE_UINT16(&obj[6 + i * 4]);
+		vocabList[i].vocabId = READ_LE_UINT16(&obj[8 + i * 4]);
+	}
+}
+
 } // End of namespace M4

Modified: scummvm/trunk/engines/m4/globals.h
===================================================================
--- scummvm/trunk/engines/m4/globals.h	2009-11-04 08:05:12 UTC (rev 45650)
+++ scummvm/trunk/engines/m4/globals.h	2009-11-04 08:38:32 UTC (rev 45651)
@@ -30,6 +30,9 @@
 #include "common/rect.h"
 #include "common/scummsys.h"
 
+#include "common/file.h"
+#include "common/ptr.h"
+
 namespace M4 {
 
 class M4Engine;
@@ -146,6 +149,27 @@
 
 #define TOTAL_NUM_VARIABLES 256
 
+#define PLAYER_INVENTORY 2
+
+struct VocabEntry {
+	uint16 unk;
+	uint16 vocabId;
+};
+
+class MadsObject {
+public:
+	MadsObject() {};
+	MadsObject(Common::SeekableReadStream *stream);
+	bool isInInventory() const { return roomNumber == PLAYER_INVENTORY; };
+
+	uint16 descId;
+	uint16 roomNumber;
+	uint8 vocabCount;
+	VocabEntry vocabList[3];
+};
+
+typedef Common::Array<Common::SharedPtr<MadsObject> > MadsObjectArray;
+
 class Globals {
 private:
 	struct MessageItem {
@@ -159,6 +183,7 @@
 	Common::Array<char* > _madsVocab;
 	Common::Array<char* > _madsQuotes;
 	Common::Array<MessageItem* > _madsMessages;
+	MadsObjectArray _madsObjects;
 public:
 	Globals(M4Engine *vm);
 	~Globals();
@@ -169,15 +194,19 @@
 
 	void loadMadsVocab();
 	uint32 getVocabSize() { return _madsVocab.size(); }
-	char* getVocab(uint32 index) { return _madsVocab[index]; }
+	const char *getVocab(uint32 index) { return _madsVocab[index]; }
 
 	void loadMadsQuotes();
 	uint32 getQuotesSize() { return _madsQuotes.size(); }
-	char* getQuote(uint32 index) { return _madsQuotes[index]; }
+	const char *getQuote(uint32 index) { return _madsQuotes[index]; }
 
 	void loadMadsMessagesInfo();
 	uint32 getMessagesSize() { return _madsMessages.size(); }
-	char* loadMessage(uint index);
+	const char *loadMessage(uint index);
+
+	void loadMadsObjects();
+	uint32 getObjectsSize() { return _madsObjects.size(); }
+	const MadsObject *getObject(uint32 index) { return _madsObjects[index].get(); }
 };
 
 #define PLAYER_FIELD_LENGTH 40

Modified: scummvm/trunk/engines/m4/m4.cpp
===================================================================
--- scummvm/trunk/engines/m4/m4.cpp	2009-11-04 08:05:12 UTC (rev 45650)
+++ scummvm/trunk/engines/m4/m4.cpp	2009-11-04 08:38:32 UTC (rev 45651)
@@ -282,8 +282,8 @@
 	_globals->loadMadsVocab();			// vocab.dat
 	_globals->loadMadsQuotes();			// quotes.dat
 	_globals->loadMadsMessagesInfo();	// messages.dat
-	// TODO: objects.dat
-	// TODO: hoganus.dat (what is it used for?)
+	_globals->loadMadsObjects();
+	
 
 	// Test code to dump all messages to the console
 	//for (int i = 0; i < _globals->getMessagesSize(); i++)


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list