diff options
-rw-r--r-- | saga/interface.cpp | 103 | ||||
-rw-r--r-- | saga/interface.h | 5 | ||||
-rw-r--r-- | saga/scene.cpp | 2 | ||||
-rw-r--r-- | saga/sthread.cpp | 6 |
4 files changed, 90 insertions, 26 deletions
diff --git a/saga/interface.cpp b/saga/interface.cpp index 8e941c94c4..ec4f8690bd 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -27,6 +27,7 @@ #include "saga/gfx.h" #include "saga/actor.h" #include "saga/console.h" +#include "saga/events.h" #include "saga/font.h" #include "saga/objectmap.h" #include "saga/isomap.h" @@ -264,7 +265,7 @@ void Interface::setMode(int mode) { switch (_panelMode) { case kPanelMain: if (_vm->getGameType() == GType_IHNM) - warning("FIXME: Implement IHNM differences from ExecuteInvontoryPanel"); + warning("FIXME: Implement IHNM differences from ExecuteInventoryPanel"); _mainPanel.currentButton = NULL; break; @@ -301,6 +302,8 @@ void Interface::setMode(int mode) { _vm->_render->setFlag(RF_DEMO_SUBST); _vm->_gfx->getCurrentPal(_mapSavedPal); break; + case kPanelChapterSelection: + break; } draw(); @@ -1169,6 +1172,56 @@ void Interface::handleOptionClick(const Point& mousePoint) { } } +void Interface::handleChapterSelectionUpdate(const Point& mousePoint) { + +} + +void Interface::handleChapterSelectionClick(const Point& mousePoint) { + int obj = _vm->_script->_pointerObject; + + _vm->_actor->abortSpeech(); + + if (obj) { + int script = 0; + HitZone *hitZone; + ActorData *a; + ObjectData *o; + EVENT event; + + switch (objectTypeId(obj)) { + case kGameObjectHitZone: + hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(obj)); + if (hitZone->getFlags() & kHitZoneExit) + script = hitZone->getScriptNumber(); + break; + + case kGameObjectActor: + a = _vm->_actor->getActor(obj); + script = a->scriptEntrypointNumber; + break; + + case kGameObjectObject: + o = _vm->_actor->getObj(obj); + script = o->scriptEntrypointNumber; + break; + } + + if (script > 0) { + event.type = ONESHOT_EVENT; + event.code = SCRIPT_EVENT; + event.op = EVENT_EXEC_NONBLOCKING; + event.time = 0; + event.param = _vm->_scene->getScriptModuleNumber(); + event.param2 = script; + event.param3 = kVerbIHNMUse; // Action + event.param4 = obj; // Object + event.param5 = 0; // With Object + event.param6 = obj; // Actor + + _vm->_events->queue(&event); + } + } +} void Interface::setOption(PanelButton *panelButton) { char * fileName; @@ -1210,7 +1263,8 @@ void Interface::update(const Point& mousePoint, int updateFlag) { return; } - if (_panelMode == kPanelMain) { + switch (_panelMode) { + case kPanelMain: if (updateFlag & UPDATE_MOUSEMOVE) { bool lastWasPlayfield = _lastMousePoint.y < _vm->getSceneHeight(); if (mousePoint.y < _vm->getSceneHeight()) { @@ -1235,13 +1289,11 @@ void Interface::update(const Point& mousePoint, int updateFlag) { } } } - } + break; - if (_panelMode == kPanelConverse) { + case kPanelConverse: if (updateFlag & UPDATE_MOUSEMOVE) { - handleConverseUpdate(mousePoint); - } else { if (updateFlag & UPDATE_MOUSECLICK) { handleConverseClick(mousePoint); @@ -1257,13 +1309,11 @@ void Interface::update(const Point& mousePoint, int updateFlag) { _vm->_puzzle->handleClick(mousePoint); } } - } + break; - if (_panelMode == kPanelOption) { + case kPanelOption: if (updateFlag & UPDATE_MOUSEMOVE) { - handleOptionUpdate(mousePoint); - } else { if (updateFlag & UPDATE_MOUSECLICK) { handleOptionClick(mousePoint); @@ -1279,21 +1329,19 @@ void Interface::update(const Point& mousePoint, int updateFlag) { calcOptionSaveSlider(); } } - } + break; - if (_panelMode == kPanelQuit) { + case kPanelQuit: if (updateFlag & UPDATE_MOUSEMOVE) { - handleQuitUpdate(mousePoint); - } else { if (updateFlag & UPDATE_MOUSECLICK) { handleQuitClick(mousePoint); } } - } + break; - if (_panelMode == kPanelLoad) { + case kPanelLoad: if (updateFlag & UPDATE_MOUSEMOVE) { handleLoadUpdate(mousePoint); @@ -1303,9 +1351,9 @@ void Interface::update(const Point& mousePoint, int updateFlag) { handleLoadClick(mousePoint); } } - } + break; - if (_panelMode == kPanelSave) { + case kPanelSave: if (updateFlag & UPDATE_MOUSEMOVE) { handleSaveUpdate(mousePoint); @@ -1315,20 +1363,31 @@ void Interface::update(const Point& mousePoint, int updateFlag) { handleSaveClick(mousePoint); } } - } + break; - if (_panelMode == kPanelMap) { + case kPanelMap: if (updateFlag & UPDATE_MOUSECLICK) mapPanelClean(); - } + break; - if (_panelMode == kPanelSceneSubstitute) { + case kPanelSceneSubstitute: if (updateFlag & UPDATE_MOUSECLICK) { _vm->_render->clearFlag(RF_DEMO_SUBST); _vm->_gfx->setPalette(_mapSavedPal); setMode(kPanelMain); _vm->_script->setNoPendingVerb(); } + break; + + case kPanelChapterSelection: + // TODO: panel has silent button + if (updateFlag & UPDATE_MOUSEMOVE) { + handleChapterSelectionUpdate(mousePoint); + } else { + if (updateFlag & UPDATE_MOUSECLICK) + handleChapterSelectionClick(mousePoint); + } + break; } _lastMousePoint = mousePoint; diff --git a/saga/interface.h b/saga/interface.h index b8f1945135..33dbcfb5a8 100644 --- a/saga/interface.h +++ b/saga/interface.h @@ -70,7 +70,7 @@ enum PanelModes { kPanelPlacard, kPanelMap, kPanelSceneSubstitute, - kPanelUnknown + kPanelChapterSelection // kPanelInventory }; @@ -313,6 +313,9 @@ private: void handleSaveUpdate(const Point& mousePoint); // save panel update void handleSaveClick(const Point& mousePoint); // save panel click + void handleChapterSelectionUpdate(const Point& mousePoint); + void handleChapterSelectionClick(const Point& mousePoint); + void mapPanelShow(); void mapPanelClean(); diff --git a/saga/scene.cpp b/saga/scene.cpp index a131eff7e7..a10748d5d1 100644 --- a/saga/scene.cpp +++ b/saga/scene.cpp @@ -620,7 +620,7 @@ void Scene::loadScene(LoadSceneParams *loadSceneParams) { _vm->_interface->activate(); if (loadSceneParams->chapter == 8 || loadSceneParams->chapter == -1) - _vm->_interface->setMode(kPanelUnknown); + _vm->_interface->setMode(kPanelChapterSelection); else _vm->_interface->setMode(kPanelMain); diff --git a/saga/sthread.cpp b/saga/sthread.cpp index 4dd7a7deef..4e5f912eb9 100644 --- a/saga/sthread.cpp +++ b/saga/sthread.cpp @@ -649,9 +649,11 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) { } } - if (sampleResourceId < 0 || sampleResourceId > 4000) { + if (sampleResourceId < 0 || sampleResourceId > 4000) + sampleResourceId = -1; + + if (_vm->getGameType() == GType_ITE && !sampleResourceId) sampleResourceId = -1; - } _vm->_actor->actorSpeech(actorId, strings, stringsCount, sampleResourceId, speechFlags); |