[Scummvm-cvs-logs] scummvm master -> 0bcfbd3cbdc4910e40635846844b1d356b1ae82e

dreammaster dreammaster at scummvm.org
Sun May 15 01:25:59 CEST 2011


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:
0bcfbd3cbd M4: Replaced the trouble variable data map code with direct statements.


Commit: 0bcfbd3cbdc4910e40635846844b1d356b1ae82e
    https://github.com/scummvm/scummvm/commit/0bcfbd3cbdc4910e40635846844b1d356b1ae82e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2011-05-14T16:23:02-07:00

Commit Message:
M4: Replaced the trouble variable data map code with direct statements.

Since there aren't expected to be all that many engine variables needed, this seems a cleaner overall implementation.

Changed paths:
    engines/m4/globals.h
    engines/m4/mads_logic.cpp
    engines/m4/mads_logic.h
    engines/m4/mads_scene.h



diff --git a/engines/m4/globals.h b/engines/m4/globals.h
index a133963..a95e516 100644
--- a/engines/m4/globals.h
+++ b/engines/m4/globals.h
@@ -240,63 +240,6 @@ union DataMapEntry {
 
 typedef Common::HashMap<uint16, uint16> DataMapHash;
 
-enum DataMapType {BOOL, UINT16, INT, INT_FN};
-
-class DataMapWrapper {
-	friend class DataMap;
-private:
-	DataMapEntry _value;
-	DataMapType _type;
-public:
-	DataMapWrapper(bool *v) { _value.boolValue = v; _type = BOOL; }
-	DataMapWrapper(uint16 *v) { _value.uint16Value = v; _type = UINT16; }
-	DataMapWrapper(int16 *v) { _value.uint16Value = (uint16 *)v; _type = UINT16; }
-	DataMapWrapper(int *v) { _value.intValue = v; _type = INT; }
-	DataMapWrapper(IntFunctionPtr v) { _value.fnPtr = v; _type = INT_FN; }
-
-	uint16 getIntValue() {
-		if (_type == BOOL) return *_value.boolValue ? 0xffff : 0;
-		else if (_type == UINT16) return *_value.uint16Value;
-		else if (_type == INT) return *_value.intValue;
-		else return _value.fnPtr();
-	}
-	void setIntValue(uint16 v) {
-		if (_type == BOOL) *_value.boolValue = v != 0;
-		else if (_type == UINT16) *_value.uint16Value = v;
-		else if (_type == INT) *_value.intValue = v;
-	}
-};
-
-#define MAP_DATA(V) _madsVm->globals()->_dataMap.addMapping(new DataMapWrapper(V))
-
-class DataMap {
-private:
-	DataMapHash _data;
-	Common::Array<DataMapWrapper *> _mapList;
-public:
-	DataMap() {
-		_mapList.push_back(NULL);
-	}
-	~DataMap() {
-		for (uint i = 1; i < _mapList.size(); ++i)
-			delete _mapList[i];
-	}
-	
-	void addMapping(DataMapWrapper *v) { _mapList.push_back(v); }
-	uint16 get(uint16 index) {
-		if (index < _mapList.size()) 
-			return _mapList[index]->getIntValue();
-
-		return _data[index];
-	}
-	void set(uint16 index, uint16 v) {
-		if (index < _mapList.size()) 
-			_mapList[index]->setIntValue(v);
-		else
-			_data[index] = v;
-	}
-};
-
 class MadsGlobals : public Globals {
 private:
 	struct MessageItem {
@@ -325,7 +268,7 @@ public:
 	int previousScene;
 	int16 _nextSceneId;
 	uint16 actionNouns[3];
-	DataMap _dataMap;
+	DataMapHash _dataMap;
 	int _difficultyLevel;
 
 	void loadMadsVocab();
diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp
index 3af9f65..a28d380 100644
--- a/engines/m4/mads_logic.cpp
+++ b/engines/m4/mads_logic.cpp
@@ -169,25 +169,81 @@ const char *MadsSceneLogic::_opcodeStrings[] = {
  * This method sets up the data map with pointers to all the common game objects. This allows the script engine to
  * convert game specific offsets for various fields in the original game's data segment into a generic data index
  * that will be common across all the MADS games
- */
+
 void MadsSceneLogic::initialiseDataMap() {
 	// The unique order of these items must be maintained
-	MAP_DATA((uint16 *)&_madsVm->scene()->_abortTimersMode2);
-	MAP_DATA(&_madsVm->scene()->_abortTimers);
-	MAP_DATA(&_madsVm->_player._stepEnabled);
-	MAP_DATA(&_madsVm->scene()->_nextScene);
-	MAP_DATA(&_madsVm->scene()->_previousScene);
-	MAP_DATA(&_madsVm->_player._playerPos.x);
-	MAP_DATA(&_madsVm->_player._playerPos.y);
-	MAP_DATA(&_madsVm->_player._direction);
-	MAP_DATA(&_madsVm->_player._visible);
-	MAP_DATA(&getActiveAnimationBool);
-	MAP_DATA(&getAnimationCurrentFrame);
+}
+*/
 
+uint32 MadsSceneLogic::getDataValue(int dataId) {
+	switch (dataId) {
+	case 1: 
+		return _madsVm->scene()->_abortTimersMode2;
+	case 2:
+		return _madsVm->scene()->_abortTimers;
+	case 3:
+		return _madsVm->_player._stepEnabled ? 0xffff : 0;
+	case 4:
+		return _madsVm->scene()->_nextScene;
+	case 5:
+		return _madsVm->scene()->_previousScene;
+	case 6:
+		return _madsVm->_player._playerPos.x;
+	case 7:
+		return _madsVm->_player._playerPos.y;
+	case 8:
+		return _madsVm->_player._direction;
+	case 9:
+		return _madsVm->_player._visible ? 0xffff : 0;
+	case 10:
+		return getActiveAnimationBool();
+	case 11:
+		return getAnimationCurrentFrame();
+	default:
+		// All other data variables get stored in the hash table
+		return _madsVm->globals()->_dataMap[dataId];
+		break;
+	}
 }
 
-DataMap &MadsSceneLogic::dataMap() {
-	return _madsVm->globals()->_dataMap;
+void MadsSceneLogic::setDataValue(int dataId, uint16 dataValue) {
+	switch (dataId) {
+	case 1: 
+		_madsVm->scene()->_abortTimersMode2 = (AbortTimerMode)dataValue;
+		break;
+	case 2:
+		_madsVm->scene()->_abortTimers = dataValue;
+		break;
+	case 3:
+		_madsVm->_player._stepEnabled = dataValue != 0;
+		break;
+	case 4:
+		_madsVm->scene()->_nextScene = dataValue;
+		break;
+	case 5:
+		_madsVm->scene()->_previousScene = dataValue;
+		break;
+	case 6:
+		_madsVm->_player._playerPos.x = dataValue;
+		break;
+	case 7:
+		_madsVm->_player._playerPos.y = dataValue;
+		break;
+	case 8:
+		_madsVm->_player._direction = dataValue;
+		break;
+	case 9:
+		_madsVm->_player._visible = dataValue != 0;
+		break;
+	case 10:
+	case 11:
+		error("Tried to set read only data field %d", dataId);
+		break;
+	default:
+		// All other data variables get stored in the hash table
+		_madsVm->globals()->_dataMap[dataId] = dataValue;
+		break;
+	}
 }
 
 const char *MadsSceneLogic::formAnimName(char sepChar, int16 suffixNum) {
@@ -531,7 +587,7 @@ void MadsSceneLogic::execute(uint32 subOffset) {
 
 		case OP_DLOAD: {		// Gets data variable
 			param = getParam(scriptOffset, opcode);
-			uint16 v = dataMap().get(param);
+			uint16 v = getDataValue(param);
 			stack.push(ScriptVar(v));
 			break;
 		}
@@ -539,7 +595,7 @@ void MadsSceneLogic::execute(uint32 subOffset) {
 		case OP_DSTORE:	{		// Stores data variable
 			param = getParam(scriptOffset, opcode); 
 			ScriptVar v = stack.pop();
-			dataMap().set(param, v.isInt() ? v.get() : 0);
+			setDataValue(param, v.isInt() ? v.get() : 0);
 			break;
 		}
 		
diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h
index 861a568..016adb2 100644
--- a/engines/m4/mads_logic.h
+++ b/engines/m4/mads_logic.h
@@ -85,14 +85,14 @@ private:
 	void getSceneSpriteSet();
 	void getAnimName();
 
-	DataMap &dataMap();
+	uint32 getDataValue(int dataId);
+	void setDataValue(int dataId, uint16 dataValue);
 	void getCallParameters(int numParams, Common::Stack<ScriptVar> &stack, ScriptVar *callParams);
 public:
 	MadsSceneLogic() { _scriptsData = NULL; }
 	~MadsSceneLogic() { delete _scriptsData; }
 
 	void initialiseScripts();
-	void initialiseDataMap();
 	void selectScene(int sceneNum);
 
 	void setupScene();
diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h
index c39dbb1..12d7088 100644
--- a/engines/m4/mads_scene.h
+++ b/engines/m4/mads_scene.h
@@ -110,7 +110,6 @@ public:
 	virtual ~MadsScene();
 	void initialise() {
 		_sceneLogic.initialiseScripts();
-		_sceneLogic.initialiseDataMap();
 	}
 
 	// Methods that differ between engines






More information about the Scummvm-git-logs mailing list