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 /engines | |
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
Diffstat (limited to 'engines')
-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]; |