diff options
| -rw-r--r-- | engines/m4/console.cpp | 26 | ||||
| -rw-r--r-- | engines/m4/hotspot.h | 4 | ||||
| -rw-r--r-- | engines/m4/m4_scene.cpp | 17 | ||||
| -rw-r--r-- | engines/m4/m4_scene.h | 6 | ||||
| -rw-r--r-- | engines/m4/mads_scene.cpp | 78 | ||||
| -rw-r--r-- | engines/m4/mads_scene.h | 18 | ||||
| -rw-r--r-- | engines/m4/mads_views.h | 1 | ||||
| -rw-r--r-- | engines/m4/scene.cpp | 18 | ||||
| -rw-r--r-- | engines/m4/scene.h | 5 | ||||
| -rw-r--r-- | engines/m4/staticres.cpp | 2 | ||||
| -rw-r--r-- | engines/m4/staticres.h | 2 | 
11 files changed, 129 insertions, 48 deletions
| diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp index 8476b3ff53..49685c934f 100644 --- a/engines/m4/console.cpp +++ b/engines/m4/console.cpp @@ -103,7 +103,7 @@ bool Console::cmdListHotSpots(int argc, const char **argv) {  	_vm->_scene->getSceneResources().hotspots->dump();  	if (_vm->isM4()) {  		DebugPrintf("Scene parallax\n"); -		_vm->_scene->getSceneResources().parallax->dump(); +		_m4Vm->scene()->getSceneResources().parallax->dump();  		DebugPrintf("Scene props\n");  		_vm->_scene->getSceneResources().props->dump();  	} @@ -395,23 +395,23 @@ M4Console::M4Console(M4Engine *vm): Console(vm) {  }  bool M4Console::cmdSceneInfo(int argc, const char **argv) { -	DebugPrintf("Current scene is: %i\n", _vm->_scene->getCurrentScene()); +	DebugPrintf("Current scene is: %i\n", _m4Vm->scene()->getCurrentScene());  	DebugPrintf("Scene resources:\n"); -	DebugPrintf("artBase: %s\n", _vm->_scene->getSceneResources().artBase); -	DebugPrintf("pictureBase: %s\n", _vm->_scene->getSceneResources().pictureBase); -	DebugPrintf("hotspotCount: %i\n", _vm->_scene->getSceneResources().hotspotCount); -	DebugPrintf("parallaxCount: %i\n", _vm->_scene->getSceneResources().parallaxCount); -	DebugPrintf("propsCount: %i\n", _vm->_scene->getSceneResources().propsCount); -	DebugPrintf("frontY: %i\n", _vm->_scene->getSceneResources().frontY); -	DebugPrintf("backY: %i\n", _vm->_scene->getSceneResources().backY); -	DebugPrintf("frontScale: %i\n", _vm->_scene->getSceneResources().frontScale); -	DebugPrintf("backScale: %i\n", _vm->_scene->getSceneResources().backScale); +	DebugPrintf("artBase: %s\n", _m4Vm->scene()->getSceneResources().artBase); +	DebugPrintf("pictureBase: %s\n", _m4Vm->scene()->getSceneResources().pictureBase); +	DebugPrintf("hotspotCount: %i\n", _m4Vm->scene()->getSceneResources().hotspotCount); +	DebugPrintf("parallaxCount: %i\n", _m4Vm->scene()->getSceneResources().parallaxCount); +	DebugPrintf("propsCount: %i\n", _m4Vm->scene()->getSceneResources().propsCount); +	DebugPrintf("frontY: %i\n", _m4Vm->scene()->getSceneResources().frontY); +	DebugPrintf("backY: %i\n", _m4Vm->scene()->getSceneResources().backY); +	DebugPrintf("frontScale: %i\n", _m4Vm->scene()->getSceneResources().frontScale); +	DebugPrintf("backScale: %i\n", _m4Vm->scene()->getSceneResources().backScale);  	DebugPrintf("depthTable: ");  	for (uint i = 0; i < 16; i++) -		DebugPrintf("%i ", _vm->_scene->getSceneResources().depthTable[i]); +		DebugPrintf("%i ", _m4Vm->scene()->getSceneResources().depthTable[i]);  	DebugPrintf("\n"); -	DebugPrintf("railNodeCount: %i\n", _vm->_scene->getSceneResources().railNodeCount); +	DebugPrintf("railNodeCount: %i\n", _m4Vm->scene()->getSceneResources().railNodeCount);  	return true;  } diff --git a/engines/m4/hotspot.h b/engines/m4/hotspot.h index bd1bc480a7..5bb4f5888a 100644 --- a/engines/m4/hotspot.h +++ b/engines/m4/hotspot.h @@ -59,6 +59,7 @@ public:  	void setRect(int x1, int y1, int x2, int y2);  	void setFeet(int x, int y);  	void setFacing(uint8 facing) { _facing = facing; } +	void setArticle(int8 v) { _articleNumber = v; }  	char *getVocab() const { return _vocab; }  	int32 getVocabID() { return _vocabID; }  	char *getVerb() const { return _verb; } @@ -70,6 +71,7 @@ public:  	uint8 getFacing() const { return _facing; }  	int getFeetX() { return _feetX; }  	int getFeetY() { return _feetY; } +	int8 getArticle() const { return _articleNumber; }  	Common::Rect getRect() const;  	int32 area() const { return (_rect.width() - 1) * (_rect.height() - 1); } @@ -85,6 +87,8 @@ private:  	// Unused in Orion Burger, used in MADS games  	uint8 _syntax;  	int32 _vocabID, _verbID; +	int8 _articleNumber; +  	//TODO: check if this is actually needed by the game  	int16 _hash;  }; diff --git a/engines/m4/m4_scene.cpp b/engines/m4/m4_scene.cpp index 90f288c31a..fcbf2b0dd7 100644 --- a/engines/m4/m4_scene.cpp +++ b/engines/m4/m4_scene.cpp @@ -41,8 +41,10 @@ namespace M4 {  M4Scene::M4Scene(M4Engine *vm): _sceneResources(), Scene(vm, &_sceneResources) {  	_vm = vm;  	_sceneSprites = NULL; -	_interfaceSurface = new M4InterfaceView(vm);  	_inverseColourTable = NULL; + +	_sceneResources.parallax = new HotSpotList(); +	_interfaceSurface = new M4InterfaceView(vm);  }  M4Scene::~M4Scene() { @@ -195,6 +197,9 @@ void M4Scene::show() {  }  void M4Scene::leaveScene() { +	_sceneResources.parallax->clear(); + +	delete _sceneResources.parallax;  	delete[] _inverseColourTable;  	Scene::leaveScene(); @@ -308,4 +313,14 @@ void M4Scene::nextCommonCursor() {  	_vm->_mouse->setCursorNum(cursorIndex);  } +void M4Scene::showHotSpots() { +	Scene::showHotSpots(); + +	// parallax (yellow) +	for (int i = 0; i < _sceneResources.parallaxCount; i++) { +		HotSpot *currentHotSpot = _sceneResources.parallax->get(i); +		_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->YELLOW); +	} +} +  } // End of namespace M4 diff --git a/engines/m4/m4_scene.h b/engines/m4/m4_scene.h index 14eea3dfac..846c1a2ff8 100644 --- a/engines/m4/m4_scene.h +++ b/engines/m4/m4_scene.h @@ -42,6 +42,9 @@ public:  	int32 frontScale, backScale;  	int16 depthTable[16];  	int32 railNodeCount;	// # of rails + +	int32 parallaxCount; +	HotSpotList *parallax;  };  class M4Scene : public Scene { @@ -70,12 +73,13 @@ public:  	virtual void leftClick(int x, int y);  	virtual void rightClick(int x, int y);  	virtual void setAction(int action, int objectId = -1); -	virtual void setStatusText(const char *text);  	virtual void update(); +	virtual void showHotSpots();  	byte *getInverseColourTable() const { return _inverseColourTable; }  	M4InterfaceView *getInterface() { return (M4InterfaceView *)_interfaceSurface; };  	M4SceneResources &getSceneResources() { return _sceneResources; }; +	void setStatusText(const char *text);  };  } // End of namespace M4 diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index 338bc8fb4f..194aaa1317 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -43,7 +43,6 @@ namespace M4 {  MadsScene::MadsScene(MadsEngine *vm): _sceneResources(), Scene(vm, &_sceneResources) {  	_vm = vm; -	strcpy(_statusText, "");  	_interfaceSurface = new MadsInterfaceView(vm);  	_spriteSlotsStart = 0;  	for (int i = 0; i < 3; ++i) @@ -94,6 +93,8 @@ void MadsScene::loadSceneTemporary() {  		return;  	loadSceneHotspots(_currentScene); + +	_action.clear();  }  void MadsScene::loadScene(int sceneNumber) { @@ -149,11 +150,9 @@ void MadsScene::loadSceneHotspots(int sceneNumber) {  void MadsScene::leaveScene() {  	_sceneResources.hotspots->clear(); -	_sceneResources.parallax->clear();  	_sceneResources.props->clear();  	delete _sceneResources.hotspots; -	delete _sceneResources.parallax;  	delete _sceneResources.props;  	// Delete the sprites @@ -263,10 +262,6 @@ void MadsScene::setAction(int action, int objectId) {  	setStatusText(statusText);  } -void MadsScene::setStatusText(const char *text) { -	strcpy(_statusText, text); -} -  /**   * Draws all the elements of the scene   */ @@ -316,8 +311,11 @@ void MadsScene::update() {  	// Draw all the various elements  	drawElements(); +	_action.set(); +	const char *sStatusText = _action.statusText(); +  	// Handle display of any status text -	if (_statusText[0]) { +	if (sStatusText[0]) {  		// Text colors are inverted in Dragonsphere  		if (_vm->getGameType() == GType_DragonSphere)  			_vm->_font->setColors(_vm->_palette->BLACK, _vm->_palette->WHITE, _vm->_palette->BLACK); @@ -325,7 +323,7 @@ void MadsScene::update() {  			_vm->_font->setColors(_vm->_palette->WHITE, _vm->_palette->BLACK, _vm->_palette->BLACK);  		_vm->_font->setFont(FONT_MAIN_MADS); -		_vm->_font->writeString(this, _statusText, (width() - _vm->_font->getWidth(_statusText)) / 2, 142, 0); +		_vm->_font->writeString(this, sStatusText, (width() - _vm->_font->getWidth(sStatusText)) / 2, 142, 0);  	}  	//***DEBUG*** @@ -476,16 +474,22 @@ MadsAction::MadsAction() {  void MadsAction::clear() {  	_actionMode = ACTMODE_NONE; +	_actionMode2 = ACTMODE2_0; +	_word_86F42 = 0; +	_word_86F4E = 0;  	_articleNumber = 0;  	_lookFlag = false; +	_word_86F4A = 0;  	_statusText[0] = '\0';  	_selectedRow = -1;  	_currentHotspot = -1; +	_word_86F3A = -1; +	_word_86F4C = -1;  	//word_86F3A/word_86F4C  	_currentAction = kVerbNone;  	_objectNameId = -1;  	_objectDescId = -1; -	//word_83334 +	_word_83334 = -1;  }  void MadsAction::appendVocab(int vocabId, bool capitalise) { @@ -499,6 +503,7 @@ void MadsAction::appendVocab(int vocabId, bool capitalise) {  }  void MadsAction::set() { +	int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount;  	bool flag = false;  	_currentAction = -1;  	_objectNameId = -1; @@ -562,14 +567,13 @@ void MadsAction::set() {  			if (_currentHotspot >= 0) {  				if (_selectedRow < 0) {  					int verbId; -					int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount;  					if (_currentHotspot < hotspotCount) {  						// Get the verb Id from the hotspot  						verbId = (*_madsVm->scene()->getSceneResources().hotspots)[_currentHotspot].getVerbID();  					} else {  						// Get the verb Id from the scene object -						verbId = 0;//Scene_object[_currentHotspot - _hotspotCount].verbId; +						verbId = (*_madsVm->scene()->getSceneResources().props)[_currentHotspot - hotspotCount].getVerbID();  					}  					if (verbId > 0) { @@ -583,12 +587,58 @@ void MadsAction::set() {  					}  				} -				//loc_21CE2 +				if ((_actionMode2 == ACTMODE2_2) || (_actionMode2 == ACTMODE2_5)) { +					// Get name from given inventory object +					int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_currentHotspot); +					_objectNameId = _madsVm->globals()->getObject(objectId)->descId; +				} else if (_currentHotspot < hotspotCount) { +					// Get name from scene hotspot +					_objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_currentHotspot].getVocabID(); +				} else { +					// Get name from temporary scene hotspot +					_objectNameId = (*_madsVm->scene()->getSceneResources().props)[_currentHotspot].getVocabID(); +				} +			} +		} + +		if ((_currentHotspot >= 0) && (_articleNumber > 0) && !flag) { +			if (_articleNumber == -1) { +				if (_word_86F3A >= 0) { +					int articleNum = 0; + +					if ((_word_86F42 == 2) || (_word_86F42 == 5)) { +						int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_currentHotspot); +						articleNum = _madsVm->globals()->getObject(objectId)->article; +					} else if (_word_86F3A < hotspotCount) { +						articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_currentHotspot].getArticle(); +					} else { + +					} +				} + +			} else if ((_articleNumber == kVerbLook) || (_vm->getGameType() != GType_RexNebular) || +				(strcmp(_madsVm->globals()->getVocab(_objectDescId), fenceStr) != 0)) { +				// Write out the article +				strcat(_statusText, englishMADSArticleList[_articleNumber]); +			} else { +				// Special case for a 'fence' entry in Rex Nebular +				strcat(_statusText, overStr);  			} + +			strcat(_statusText, " ");  		} + +		// Append object description if necessary +		if (_word_86F3A >= 0) +			appendVocab(_objectDescId); + +		// Remove any trailing space character +		int statusLen = strlen(_statusText); +		if ((statusLen > 0) && (_statusText[statusLen - 1] == ' ')) +			_statusText[statusLen - 1] = '\0';  	} -	//word_83334 = -1; +	_word_83334 = -1;  }  /*--------------------------------------------------------------------------*/ diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 82ac4f28ba..2f8fcf990b 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -124,26 +124,38 @@ public:  };  enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6}; +enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_5 = 5};  class MadsAction {  private:  	char _statusText[100]; + +	void appendVocab(int vocabId, bool capitalise = false); +public:  	int _currentHotspot;  	int _objectNameId;  	int _objectDescId;  	int _currentAction;  	int8 _flags1, _flags2;  	MadsActionMode _actionMode; +	MAdsActionMode2 _actionMode2;  	int _articleNumber;  	bool _lookFlag;  	int _selectedRow; +	// Unknown fields +	int16 _word_86F3A; +	int16 _word_86F42; +	int16 _word_86F4E; +	int16 _word_86F4A; +	int16 _word_83334; +	int16 _word_86F4C; -	void appendVocab(int vocabId, bool capitalise = false);  public:  	MadsAction();  	void clear();  	void set(); +	const char *statusText() const { return _statusText; }  };  typedef Common::Array<SpriteAsset *> SpriteAssetArray; @@ -155,7 +167,7 @@ class MadsScene : public Scene {  private:  	MadsEngine *_vm;  	MadsSceneResources _sceneResources; -	char _statusText[100]; +	MadsAction _action;  	MadsSceneLogic _sceneLogic;  	SpriteAsset *_playerSprites; @@ -187,7 +199,6 @@ public:  	virtual void leftClick(int x, int y);  	virtual void rightClick(int x, int y);  	virtual void setAction(int action, int objectId = -1); -	virtual void setStatusText(const char *text);  	virtual void update();  	int loadSceneSpriteSet(const char *setName); @@ -196,6 +207,7 @@ public:  	MadsInterfaceView *getInterface() { return (MadsInterfaceView *)_interfaceSurface; };  	MadsSceneResources &getSceneResources() { return _sceneResources; }; +	void setStatusText(const char *text) {};//***DEPRECATED***  };  } // End of namespace M4 diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index fa6247d4a9..8a936c1759 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -77,6 +77,7 @@ public:  	virtual void setSelectedObject(int objectNumber);  	virtual void addObjectToInventory(int objectNumber);  	int getSelectedObject() { return _selectedObject; } +	int getInventoryObject(int objectIndex) { return _inventoryList[objectIndex]; }  	void onRefresh(RectList *rects, M4Surface *destSurface);  	bool onEvent(M4EventType eventType, int32 param1, int x, int y, bool &captureEvents); diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index fb4145c123..e9480ff9a6 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -44,7 +44,6 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0,  	_screenType = VIEWID_SCENE;  	_sceneResources->hotspots = new HotSpotList(); -	_sceneResources->parallax = new HotSpotList();  	_sceneResources->props = new HotSpotList();  	_backgroundSurface = new M4Surface();  	_walkSurface = new M4Surface(); @@ -124,22 +123,17 @@ void Scene::showSprites() {  void Scene::showHotSpots() {  	int i = 0;  	HotSpot *currentHotSpot; +  	// hotspots (green)  	for (i = 0; i < _sceneResources->hotspotCount; i++) {  		currentHotSpot = _sceneResources->hotspots->get(i);  		_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->GREEN);  	} -	if (_vm->isM4()) { -		// parallax (yellow) -		for (i = 0; i < _sceneResources->parallaxCount; i++) { -			currentHotSpot = _sceneResources->parallax->get(i); -			_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->YELLOW); -		} -		// props (red) -		for (i = 0; i < _sceneResources->propsCount; i++) { -			currentHotSpot = _sceneResources->props->get(i); -			_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->RED); -		} + +	// props (red) +	for (i = 0; i < _sceneResources->propsCount; i++) { +		currentHotSpot = _sceneResources->props->get(i); +		_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->RED);  	}  } diff --git a/engines/m4/scene.h b/engines/m4/scene.h index 67acfc6654..d232c16974 100644 --- a/engines/m4/scene.h +++ b/engines/m4/scene.h @@ -64,8 +64,6 @@ public:  	char pictureBase[MAX_CHK_FILENAME_SIZE];  	int32 hotspotCount;  	HotSpotList *hotspots; -	int32 parallaxCount; -	HotSpotList *parallax;  	int32 propsCount;  	HotSpotList *props;  	int32 frontY, backY; @@ -103,13 +101,12 @@ public:  	virtual void leftClick(int x, int y) = 0;  	virtual void rightClick(int x, int y) = 0;  	virtual void setAction(int action, int objectId = -1) = 0; -	virtual void setStatusText(const char *text) = 0;  	virtual void update() = 0; +	virtual void showHotSpots();  	// TODO: perhaps move playIntro() someplace else?  	void playIntro();  	void showSprites(); -	void showHotSpots();  	void showCodes();  	int getCurrentScene() { return _currentScene; }  	M4Surface *getBackgroundSurface() const { return _backgroundSurface; } diff --git a/engines/m4/staticres.cpp b/engines/m4/staticres.cpp index f8f25b7455..fbcd78de3f 100644 --- a/engines/m4/staticres.cpp +++ b/engines/m4/staticres.cpp @@ -42,6 +42,8 @@ const char *lookAroundStr = "Look around";  const char *toStr = "to ";  const char *useStr = "Use ";  const char *walkToStr = "Walk to "; +const char *fenceStr = "fence"; +const char *overStr = "over";  VerbInit verbList[10] = {  	{kVerbLook, 2, 0}, diff --git a/engines/m4/staticres.h b/engines/m4/staticres.h index 059fa80e68..2680965304 100644 --- a/engines/m4/staticres.h +++ b/engines/m4/staticres.h @@ -40,6 +40,8 @@ extern const char *lookAroundStr;  extern const char *toStr;  extern const char *useStr;  extern const char *walkToStr; +extern const char *fenceStr; +extern const char *overStr;  struct VerbInit {  	int verb; | 
