[Scummvm-cvs-logs] scummvm master -> a375cbf42b0ceb89bc01ab701b476975c94f58df

lskovlun lskovlun at sprogklog.dk
Mon Feb 29 16:34:13 CET 2016


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:
98878d69b8 SCI: Add vocab994 console command
a375cbf42b SCI3: Collect bits for managing kInfoFlagViewVisible


Commit: 98878d69b80fdf004145f356b29d1cfaff68590e
    https://github.com/scummvm/scummvm/commit/98878d69b80fdf004145f356b29d1cfaff68590e
Author: Lars Skovlund (lskovlun at sprogklog.dk)
Date: 2016-02-29T16:00:13+01:00

Commit Message:
SCI: Add vocab994 console command

This is intended for early SCI2, but should work with older SCI too,
not that we need it.

Changed paths:
    engines/sci/console.cpp
    engines/sci/console.h



diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index cbc6dfa..f271bed 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -192,6 +192,7 @@ Console::Console(SciEngine *engine) : GUI::Debugger(),
 	registerCmd("send",				WRAP_METHOD(Console, cmdSend));
 	registerCmd("go",					WRAP_METHOD(Console, cmdGo));
 	registerCmd("logkernel",          WRAP_METHOD(Console, cmdLogKernel));
+	registerCmd("vocab994",          WRAP_METHOD(Console, cmdMapVocab994));
 	// Breakpoints
 	registerCmd("bp_list",			WRAP_METHOD(Console, cmdBreakpointList));
 	registerCmd("bplist",				WRAP_METHOD(Console, cmdBreakpointList));			// alias
@@ -3923,6 +3924,56 @@ bool Console::cmdSfx01Track(int argc, const char **argv) {
 	return true;
 }
 
+bool Console::cmdMapVocab994(int argc, const char **argv) {
+	EngineState *s = _engine->_gamestate;	// for the several defines in this function
+	reg_t reg;
+
+	if (argc != 4) {
+		debugPrintf("Attempts to map a range of vocab.994 entries to a given class\n");
+		debugPrintf("Usage: %s <class addr> <first> <last>\n", argv[0]);
+		return true;
+	}
+
+	if (parse_reg_t(_engine->_gamestate, argv[1], &reg, false)) {
+		debugPrintf("Invalid address passed.\n");
+		debugPrintf("Check the \"addresses\" command on how to use addresses\n");
+		return true;
+	}
+
+	Resource *resource = _engine->_resMan->findResource(ResourceId(kResourceTypeVocab, 994), 0);
+	const Object *obj = s->_segMan->getObject(reg);
+	uint16 *data = (uint16 *) resource->data;
+	unsigned int first = atoi(argv[2]);
+	unsigned int last  = atoi(argv[3]);
+	Common::Array<bool> markers;
+
+	markers.resize(_engine->getKernel()->getSelectorNamesSize());
+	if (!obj->isClass() && getSciVersion() != SCI_VERSION_3)
+		obj = s->_segMan->getObject(obj->getSuperClassSelector());
+
+	first = MIN(first, resource->size / 2 - 2);
+	last =  MIN(last, resource->size / 2 - 2);
+
+	for (unsigned int i = first; i <= last; ++i)
+	{
+		uint16 ofs = data[i];
+
+		if (obj && ofs < obj->getVarCount()) {
+			uint16 varSelector = obj->getVarSelector(ofs);
+			debugPrintf("%d: property at index %04x of %s is %s %s\n", i, ofs,
+				    s->_segMan->derefString(obj->getNameSelector()),
+				    _engine->getKernel()->getSelectorName(varSelector).c_str(),
+				    markers[varSelector] ? "(repeat!)" : "");
+			markers[varSelector] = true;
+		}
+		else {
+			debugPrintf("%d: property at index %04x doesn't match up with %s\n", i, ofs,
+				    s->_segMan->derefString(obj->getNameSelector()));
+		}
+	}
+
+	return true;
+}
 bool Console::cmdQuit(int argc, const char **argv) {
 	if (argc != 2) {
 	}
@@ -4361,7 +4412,8 @@ int Console::printObject(reg_t pos) {
 		debugPrintf("    ");
 		if (var_container && i < var_container->getVarCount()) {
 			uint16 varSelector = var_container->getVarSelector(i);
-			debugPrintf("[%03x] %s = ", varSelector, _engine->getKernel()->getSelectorName(varSelector).c_str());
+			// Times two commented out for now for easy parsing of vocab.994
+			debugPrintf("(%04x) [%03x] %s = ", i /* *2 */, varSelector, _engine->getKernel()->getSelectorName(varSelector).c_str());
 		} else
 			debugPrintf("p#%x = ", i);
 
diff --git a/engines/sci/console.h b/engines/sci/console.h
index 7c4de02..b20f1f7 100644
--- a/engines/sci/console.h
+++ b/engines/sci/console.h
@@ -138,6 +138,7 @@ private:
 	bool cmdSend(int argc, const char **argv);
 	bool cmdGo(int argc, const char **argv);
 	bool cmdLogKernel(int argc, const char **argv);
+	bool cmdMapVocab994(int argc, const char **argv);
 	// Breakpoints
 	bool cmdBreakpointList(int argc, const char **argv);
 	bool cmdBreakpointDelete(int argc, const char **argv);


Commit: a375cbf42b0ceb89bc01ab701b476975c94f58df
    https://github.com/scummvm/scummvm/commit/a375cbf42b0ceb89bc01ab701b476975c94f58df
Author: Lars Skovlund (lskovlun at sprogklog.dk)
Date: 2016-02-29T16:00:13+01:00

Commit Message:
SCI3: Collect bits for managing kInfoFlagViewVisible

Changed paths:
    engines/sci/engine/object.cpp
    engines/sci/engine/object.h



diff --git a/engines/sci/engine/object.cpp b/engines/sci/engine/object.cpp
index 0626c08..65c85a8 100644
--- a/engines/sci/engine/object.cpp
+++ b/engines/sci/engine/object.cpp
@@ -255,6 +255,8 @@ void Object::initSelectorsSci3(const byte *buf) {
 	if (g_sci->getKernel()->getSelectorNamesSize() % 32)
 		++groups;
 
+	_mustSetViewVisible.resize(groups);
+
 	methods = properties = 0;
 
 	// Selectors are divided into groups of 32, of which the first
@@ -270,7 +272,9 @@ void Object::initSelectorsSci3(const byte *buf) {
 			// This object actually has selectors belonging to this group
 			int typeMask = READ_SCI11ENDIAN_UINT32(seeker);
 
-			for (int bit = 2; bit < 32; ++bit) {
+			_mustSetViewVisible[groupNr] = !!(typeMask & 1);
+
+			 for (int bit = 2; bit < 32; ++bit) {
 				int value = READ_SCI11ENDIAN_UINT16(seeker + bit * 2);
 				if (typeMask & (1 << bit)) { // Property
 					++properties;
@@ -281,7 +285,7 @@ void Object::initSelectorsSci3(const byte *buf) {
 				}
 
 			}
-		}
+		} else _mustSetViewVisible[groupNr] = false;
 	}
 
 	_variables.resize(properties);
diff --git a/engines/sci/engine/object.h b/engines/sci/engine/object.h
index cc9f5eb..a7be170 100644
--- a/engines/sci/engine/object.h
+++ b/engines/sci/engine/object.h
@@ -262,6 +262,8 @@ public:
 	bool initBaseObject(SegManager *segMan, reg_t addr, bool doInitSuperClass = true);
 	void syncBaseObject(const byte *ptr) { _baseObj = ptr; }
 
+	bool mustSetViewVisibleSci3(int selector) const { return _mustSetViewVisible[selector/32]; }
+
 private:
 	void initSelectorsSci3(const byte *buf);
 
@@ -278,6 +280,7 @@ private:
 	reg_t _superClassPosSci3; /**< reg_t pointing to superclass for SCI3 */
 	reg_t _speciesSelectorSci3;	/**< reg_t containing species "selector" for SCI3 */
 	reg_t _infoSelectorSci3; /**< reg_t containing info "selector" for SCI3 */
+	Common::Array<bool> _mustSetViewVisible; /** cached bit of info to make lookup fast, SCI3 only */
 };
 
 






More information about the Scummvm-git-logs mailing list