diff options
| author | Paul Gilbert | 2010-07-24 05:56:06 +0000 | 
|---|---|---|
| committer | Paul Gilbert | 2010-07-24 05:56:06 +0000 | 
| commit | ec460ca2cabf426a6b3591d32a68872897c00ac3 (patch) | |
| tree | c6795daeef0fd6d00000d01058042a006fd0b4bc | |
| parent | cd66b7d11b4a1f3082b62d440e1b010a40be94b5 (diff) | |
| download | scummvm-rg350-ec460ca2cabf426a6b3591d32a68872897c00ac3.tar.gz scummvm-rg350-ec460ca2cabf426a6b3591d32a68872897c00ac3.tar.bz2 scummvm-rg350-ec460ca2cabf426a6b3591d32a68872897c00ac3.zip | |
M4: Implemented lots of support code for pre-action handling
svn-id: r51235
| -rw-r--r-- | engines/m4/console.cpp | 8 | ||||
| -rw-r--r-- | engines/m4/hotspot.h | 1 | ||||
| -rw-r--r-- | engines/m4/m4_scene.cpp | 12 | ||||
| -rw-r--r-- | engines/m4/mads_logic.cpp | 6 | ||||
| -rw-r--r-- | engines/m4/mads_logic.h | 1 | ||||
| -rw-r--r-- | engines/m4/mads_menus.cpp | 2 | ||||
| -rw-r--r-- | engines/m4/mads_menus.h | 2 | ||||
| -rw-r--r-- | engines/m4/mads_scene.cpp | 45 | ||||
| -rw-r--r-- | engines/m4/mads_scene.h | 4 | ||||
| -rw-r--r-- | engines/m4/mads_views.cpp | 111 | ||||
| -rw-r--r-- | engines/m4/mads_views.h | 33 | ||||
| -rw-r--r-- | engines/m4/scene.cpp | 10 | ||||
| -rw-r--r-- | engines/m4/scene.h | 7 | 
13 files changed, 190 insertions, 52 deletions
| diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp index 19fbf6e852..71c70e3e1b 100644 --- a/engines/m4/console.cpp +++ b/engines/m4/console.cpp @@ -103,8 +103,8 @@ bool Console::cmdListHotSpots(int argc, const char **argv) {  	if (_vm->isM4()) {  		DebugPrintf("Scene parallax\n");  		_m4Vm->scene()->getSceneResources().parallax->dump(); -		DebugPrintf("Scene props\n"); -		_vm->_scene->getSceneResources().props->dump(); +		DebugPrintf("Scene dynamic hotspots\n"); +		_vm->_scene->getSceneResources().dynamicHotspots->dump();  	}  	return true;  } @@ -400,9 +400,9 @@ bool M4Console::cmdSceneInfo(int argc, const char **argv) {  	DebugPrintf("Scene resources:\n");  	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("hotspotCount: %i\n", _m4Vm->scene()->getSceneResources().hotspots->size());  	DebugPrintf("parallaxCount: %i\n", _m4Vm->scene()->getSceneResources().parallaxCount); -	DebugPrintf("propsCount: %i\n", _m4Vm->scene()->getSceneResources().propsCount); +	DebugPrintf("dynHotspotCount: %i\n", _m4Vm->scene()->getSceneResources().dynamicHotspots->size());  	DebugPrintf("frontY: %i\n", _m4Vm->scene()->getSceneResources().frontY);  	DebugPrintf("backY: %i\n", _m4Vm->scene()->getSceneResources().backY);  	DebugPrintf("frontScale: %i\n", _m4Vm->scene()->getSceneResources().frontScale); diff --git a/engines/m4/hotspot.h b/engines/m4/hotspot.h index b06865c39a..f650d5ff54 100644 --- a/engines/m4/hotspot.h +++ b/engines/m4/hotspot.h @@ -104,6 +104,7 @@ public:  	int add(HotSpot *hotspot, bool head = false);  	HotSpot *get(int index) { return _hotspots[index]; }  	HotSpot &operator[](int idx) { return *get(idx); } +	int size() const { return _hotspots.size(); }  	void remove(HotSpot *hotspot);  	void unlinkItem(HotSpot *hotspot);  	void clear(); diff --git a/engines/m4/m4_scene.cpp b/engines/m4/m4_scene.cpp index 0c984af448..475fdba653 100644 --- a/engines/m4/m4_scene.cpp +++ b/engines/m4/m4_scene.cpp @@ -45,7 +45,7 @@ M4Scene::M4Scene(M4Engine *vm): _sceneResources(), Scene(vm, &_sceneResources) {  	_sceneResources.hotspots = new HotSpotList();  	_sceneResources.parallax = new HotSpotList(); -	_sceneResources.props = new HotSpotList(); +	_sceneResources.dynamicHotspots = new HotSpotList();  	_interfaceSurface = new M4InterfaceView(vm);  } @@ -74,9 +74,9 @@ void M4Scene::loadSceneResources(int sceneNumber) {  	if (sceneS != NULL) {  		sceneS->read(_sceneResources.artBase, MAX_CHK_FILENAME_SIZE);  		sceneS->read(_sceneResources.pictureBase, MAX_CHK_FILENAME_SIZE); -		_sceneResources.hotspotCount = sceneS->readUint32LE(); +		int hotspotCount = sceneS->readUint32LE();  		_sceneResources.parallaxCount = sceneS->readUint32LE(); -		_sceneResources.propsCount = sceneS->readUint32LE(); +		int dynHotspotCount = sceneS->readUint32LE();  		_sceneResources.frontY = sceneS->readUint32LE();  		_sceneResources.backY = sceneS->readUint32LE();  		_sceneResources.frontScale = sceneS->readUint32LE(); @@ -99,11 +99,11 @@ void M4Scene::loadSceneResources(int sceneNumber) {  		// Clear current hotspot lists  		_sceneResources.hotspots->clear();  		_sceneResources.parallax->clear(); -		_sceneResources.props->clear(); +		_sceneResources.dynamicHotspots->clear(); -		_sceneResources.hotspots->loadHotSpots(sceneS, _sceneResources.hotspotCount); +		_sceneResources.hotspots->loadHotSpots(sceneS, hotspotCount);  		_sceneResources.parallax->loadHotSpots(sceneS, _sceneResources.parallaxCount); -		_sceneResources.props->loadHotSpots(sceneS, _sceneResources.propsCount); +		_sceneResources.dynamicHotspots->loadHotSpots(sceneS, dynHotspotCount);  		// Note that toss() deletes the MemoryReadStream  		_vm->res()->toss(filename); diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index e451a306ef..f3f284d1a3 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -418,8 +418,12 @@ void MadsSceneLogic::enterScene() {  	lowRoomsEntrySound();  } -void MadsSceneLogic::doAction() { +void MadsSceneLogic::doPreactions() { +	warning("Still to do preactions logic"); +} +void MadsSceneLogic::doAction() { +	warning("Still to do actions logic");  }  void MadsSceneLogic::sceneStep() { diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 98d6df6163..28120377e2 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -59,6 +59,7 @@ public:  	void setupScene();  	void enterScene(); +	void doPreactions();  	void doAction();  	void sceneStep();  }; diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index d7d9cf4150..810acb04fb 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -809,7 +809,7 @@ void RexDialogView::setFrame(int frameNumber, int depth) {  }  void RexDialogView::initVars() { -	_word_8502C = -1; +	_v8502C = -1;  	_selectedLine = -1;  	_lineIndex = 0;  	_enterFlag = false; diff --git a/engines/m4/mads_menus.h b/engines/m4/mads_menus.h index e964c5866d..a0fc6fb3bc 100644 --- a/engines/m4/mads_menus.h +++ b/engines/m4/mads_menus.h @@ -136,7 +136,7 @@ protected:  	int _dialogSelectedLine;  	Common::StringArray _saveList; -	int _word_8502C; +	int _v8502C;  	int _selectedLine;  	int _lineIndex;  	bool _enterFlag; diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index c459a2a58a..1f43f73cc0 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -195,24 +195,21 @@ void MadsScene::loadSceneHotspots(int sceneNumber) {  	int hotspotCount = hotspotStream->readUint16LE();  	delete hotspotStream; -	_sceneResources.hotspotCount = hotspotCount; -  	hotspotStream = hotSpotData.getItemStream(1);  	// Clear current hotspot lists  	_sceneResources.hotspots->clear(); - -	_sceneResources.hotspots->loadHotSpots(hotspotStream, _sceneResources.hotspotCount); +	_sceneResources.hotspots->loadHotSpots(hotspotStream, hotspotCount);  	delete hotspotStream;  }  void MadsScene::leaveScene() {  	_sceneResources.hotspots->clear(); -	_sceneResources.props->clear(); +	_sceneResources.dynamicHotspots->clear();  	delete _sceneResources.hotspots; -	delete _sceneResources.props; +	delete _sceneResources.dynamicHotspots;  	delete _walkSurface;  	if (_activeAnimation) { @@ -322,6 +319,21 @@ void MadsScene::updateState() {  //		_screenObjects.check(v, false);  	} +	// Handle starting off any selected action +	bool lookFlag = false; +	if ((_action._selectedAction != 0) && _madsVm->_player._stepEnabled && +			!_action._verbNounFlag && !_abortTimers && !_madsVm->_player._unk3) { +		// Start the action +		_action.startAction(); + +		lookFlag = (_action._action.verbId == kVerbLookAt) || (_action._action.verbId == kVerbLook); +	} +	if (lookFlag || ((_abortTimers != 0) && (_abortTimersMode == ABORTMODE_2))) +		doPreactions(); + +	checkStartWalk(); + +	// Update the player  	_madsVm->_player.update();  	// Handle refreshing the mouse position display @@ -364,6 +376,25 @@ void MadsScene::updateState() {  		freeAnimation();  } +void MadsScene::checkStartWalk() { +	if (_action._verbNounFlag && _action._walkFlag) { +		_madsVm->_player.setDest(_destPos.x, _destPos.y, _destFacing); +		_action._verbNounFlag = false; +	} +} + +void MadsScene::doPreactions() { +	if ((_screenObjects._v832EC == 0) || (_screenObjects._v832EC == 2)) { +		_abortTimersMode2 = ABORTMODE_2; +		_action.checkAction(); + +		_sceneLogic.doPreactions(); + +		if (_abortTimersMode == ABORTMODE_2) +			_abortTimers = 0; +	} +} +  /**   * Does extra work at cleaning up the animation, and then deletes it   */ @@ -999,7 +1030,7 @@ bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int  					act._flags1 = obj->vocabList[1].flags1;  					act._flags2 = obj->vocabList[1].flags2; -					act._action.hotspotId = _selectedObject; +					act._action.verbId = _selectedObject;  					act._articleNumber = act._flags2;  				}  			} diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h index 2bd38aff6f..baa6a67861 100644 --- a/engines/m4/mads_scene.h +++ b/engines/m4/mads_scene.h @@ -98,9 +98,13 @@ private:  	void clearAction();  	void appendActionVocab(int vocabId, bool capitalise);  	void setAction(); +	void checkStartWalk(); +	void doPreactions();  public:  	char _aaName[100];  	bool _showMousePos; +	Common::Point _destPos; +	int _destFacing;  public:  	MadsScene(MadsEngine *vm);  	virtual ~MadsScene(); diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index 34218cebfd..a8a8e09105 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -49,20 +49,21 @@ void MadsAction::clear() {  	_v83338 = 1;  	_actionMode = ACTMODE_NONE;  	_actionMode2 = ACTMODE2_0; -	_word_86F42 = 0; -	_word_86F4E = 0; +	_v86F42 = 0; +	_v86F4E = 0;  	_articleNumber = 0;  	_lookFlag = false; -	_word_86F4A = 0; +	_v86F4A = 0;  	_statusText[0] = '\0';  	_selectedRow = -1;  	_hotspotId = -1; -	_word_86F3A = -1; -	_word_86F4C = -1; -	_action.hotspotId = -1; +	_v86F3A = -1; +	_v86F4C = -1; +	_action.verbId = -1;  	_action.objectNameId = -1;  	_action.indirectObjectId = -1;  	_textChanged = true; +	_walkFlag = false;  }  void MadsAction::appendVocab(int vocabId, bool capitalise) { @@ -76,7 +77,7 @@ void MadsAction::appendVocab(int vocabId, bool capitalise) {  }  void MadsAction::set() { -	int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount; +	int hotspotCount = _madsVm->scene()->getSceneResources().hotspots->size();  	bool flag = false;  	strcpy(_statusText, ""); @@ -148,7 +149,7 @@ void MadsAction::set() {  						verbId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVerbID();  					} else {  						// Get the verb Id from the scene object -						verbId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId - hotspotCount].getVerbID(); +						verbId = (*_madsVm->scene()->getSceneResources().dynamicHotspots)[_hotspotId - hotspotCount].getVerbID();  					}  					if (verbId > 0) { @@ -171,7 +172,7 @@ void MadsAction::set() {  					_action.objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVocabID();  				} else {  					// Get name from temporary scene hotspot -					_action.objectNameId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId].getVocabID(); +					_action.objectNameId = (*_madsVm->scene()->getSceneResources().dynamicHotspots)[_hotspotId].getVocabID();  				}  				appendVocab(_action.objectNameId);  			} @@ -179,13 +180,13 @@ void MadsAction::set() {  		if ((_hotspotId >= 0) && (_articleNumber > 0) && !flag) {  			if (_articleNumber == -1) { -				if (_word_86F3A >= 0) { +				if (_v86F3A >= 0) {  					int articleNum = 0; -					if ((_word_86F42 == 2) || (_word_86F42 == 5)) { +					if ((_v86F42 == 2) || (_v86F42 == 5)) {  						int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId);  						articleNum = _madsVm->globals()->getObject(objectId)->article; -					} else if (_word_86F3A < hotspotCount) { +					} else if (_v86F3A < hotspotCount) {  						articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getArticle();  					} else { @@ -205,7 +206,7 @@ void MadsAction::set() {  		}  		// Append object description if necessary -		if (_word_86F3A >= 0) +		if (_v86F3A >= 0)  			appendVocab(_action.indirectObjectId);  		// Remove any trailing space character @@ -252,6 +253,86 @@ void MadsAction::refresh() {  	_textChanged = false;  } +void MadsAction::startAction() { +	_madsVm->_player.moveComplete(); + +	_v84538 = -1; +	_v8453A = 0; +	_savedFields.selectedRow = _selectedRow; +	_savedFields.articleNumber = _articleNumber; +	_savedFields.actionMode = _actionMode; +	_savedFields.actionMode2 = _actionMode2; +	_savedFields.lookFlag = _lookFlag; +	int savedHotspotId = _hotspotId; +	int savedV86F3A = _v86F3A; +	int savedV86F42 = _v86F42; + +	// Copy the action to be active +	_activeAction = _action; +	strcpy(_dialogTitle, _statusText); + +	if ((_savedFields.actionMode2 == ACTMODE2_4) && (savedV86F42 == 0)) +		_v8453A = true; + +	_verbNounFlag = false; +	int hotspotId = -1; +	HotSpotList &dynHotspots = *_madsVm->scene()->getSceneResources().dynamicHotspots; +	HotSpotList &hotspots = *_madsVm->scene()->getSceneResources().hotspots; + +	if (!_savedFields.lookFlag && (_madsVm->scene()->_screenObjects._v832EC != 1)) { +		if (_savedFields.actionMode2 == ACTMODE2_4) +			hotspotId = savedHotspotId; +		else if (savedV86F42 == 4) +			hotspotId = savedV86F3A; + +		if (hotspotId >= hotspots.size()) { +			HotSpot &hs = dynHotspots[hotspotId - hotspots.size()]; +			if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) { +				if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) { +					_verbNounFlag = true; +					_madsVm->scene()->_destPos = _customDest; +				} +			} else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) { +				_verbNounFlag = true; +				_madsVm->scene()->_destPos.x = hs.getFeetX(); +				_madsVm->scene()->_destPos.y = hs.getFeetY(); +			} +			_madsVm->scene()->_destFacing = hs.getFacing(); +		} +		hotspotId = -1; +	} + +	if (hotspotId >= 0) { +		HotSpot &hs = hotspots[hotspotId]; +		if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) { +			if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) { +				_verbNounFlag = true; +				_madsVm->scene()->_destPos = _customDest; +			} +		} else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) { +			_verbNounFlag = true; +			_madsVm->scene()->_destPos.x = hs.getFeetX(); +			_madsVm->scene()->_destPos.y = hs.getFeetY(); +		} +		_madsVm->scene()->_destFacing = hs.getFacing(); +	} +} + +void MadsAction::checkAction() { +	if (isAction(kVerbLookAt) || isAction(kVerbThrow)) +		_verbNounFlag = 0; +} + +bool MadsAction::isAction(int verbId, int objectNameId, int indirectObjectId) { +	if (_activeAction.verbId != verbId) +		return false; +	if ((objectNameId != 0) && (_activeAction.objectNameId != objectNameId)) +		return false; +	if ((indirectObjectId != 0) && (_activeAction.indirectObjectId != indirectObjectId)) +		return false; +	return true; +} +  //--------------------------------------------------------------------------  bool MadsSpriteSlot::operator==(const SpriteSlotSubset &other) const { @@ -407,8 +488,8 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) {  	// Get a list of sprite object depths for active objects  	for (int i = 0; i < startIndex; ++i) { -		if (_entries[i].spriteType >= 0) { -			DepthEntry rec(_entries[i].depth, i); +		if (_entries[i].spriteType >= SPRITE_ZERO) { +			DepthEntry rec(16 - _entries[i].depth, i);  			depthList.push_back(rec);  		}  	} diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index d29947390a..3f5615ee37 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -37,22 +37,31 @@ namespace M4 {  class MadsView;  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}; +enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_4 = 4, ACTMODE2_5 = 5};  struct ActionDetails { -	int hotspotId; +	int verbId;  	int objectNameId;  	int indirectObjectId;  }; +struct MadsActionSavedFields { +	int articleNumber; +	int actionMode; +	int actionMode2; +	bool lookFlag; +	int selectedRow; +}; +  class MadsAction {  private:  	MadsView &_owner;  	char _statusText[100]; +	char _dialogTitle[100];  	void appendVocab(int vocabId, bool capitalise = false);  public: -	ActionDetails _action; +	ActionDetails _action, _activeAction;  	int _currentAction;  	int8 _flags1, _flags2;  	MadsActionMode _actionMode; @@ -65,14 +74,19 @@ public:  	bool _verbNounFlag;  	int _statusTextIndex;  	int _hotspotId; +	MadsActionSavedFields _savedFields; +	bool _walkFlag; +	Common::Point _customDest;  	// Unknown fields -	int16 _word_86F3A; -	int16 _word_86F42; -	int16 _word_86F4E; -	int16 _word_86F4A; -	int16 _word_86F4C; +	int16 _v86F3A; +	int16 _v86F42; +	int16 _v86F4E; +	bool _v86F4A; +	int16 _v86F4C;  	int _v83338; +	int _v84538; +	bool _v8453A;  public:  	MadsAction(MadsView &owner); @@ -81,6 +95,9 @@ public:  	void set();  	const char *statusText() const { return _statusText; }  	void refresh(); +	void startAction(); +	void checkAction(); +	bool isAction(int verbId, int objectNameId = 0, int indirectObjectId = 0);  };  enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2}; diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index 08d79f0f66..361d1bad47 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -44,7 +44,7 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0,  	_screenType = VIEWID_SCENE;  	_sceneResources->hotspots = new HotSpotList(); -	_sceneResources->props = new HotSpotList(); +	_sceneResources->dynamicHotspots = new HotSpotList();  	_backgroundSurface = new M4Surface();  	_walkSurface = new M4Surface();  	_palData = NULL; @@ -123,14 +123,14 @@ void Scene::showHotSpots() {  	HotSpot *currentHotSpot;  	// hotspots (green) -	for (i = 0; i < _sceneResources->hotspotCount; i++) { +	for (i = 0; i < _sceneResources->hotspots->size(); i++) {  		currentHotSpot = _sceneResources->hotspots->get(i);  		_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->GREEN);  	} -	// props (red) -	for (i = 0; i < _sceneResources->propsCount; i++) { -		currentHotSpot = _sceneResources->props->get(i); +	// Dynamic hotspots (red) +	for (i = 0; i < _sceneResources->dynamicHotspots->size(); i++) { +		currentHotSpot = _sceneResources->dynamicHotspots->get(i);  		_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->RED);  	}  } diff --git a/engines/m4/scene.h b/engines/m4/scene.h index 76b99a7bcd..e6eaed0ab9 100644 --- a/engines/m4/scene.h +++ b/engines/m4/scene.h @@ -53,17 +53,16 @@ enum MADSVerbs {  	kVerbPull	= 10,  	kVerbClose	= 11,  	kVerbThrow	= 12, -	kVerbWalkTo	= 13 +	kVerbWalkTo	= 13, +	kVerbLookAt = 209  };  class SceneResources {  public:  	char artBase[MAX_CHK_FILENAME_SIZE];  	char pictureBase[MAX_CHK_FILENAME_SIZE]; -	int32 hotspotCount;  	HotSpotList *hotspots; -	int32 propsCount; -	HotSpotList *props; +	HotSpotList *dynamicHotspots;  	int32 frontY, backY;  	int32 frontScale, backScale;  	int16 depthTable[16]; | 
