diff options
-rw-r--r-- | saga/input.cpp | 14 | ||||
-rw-r--r-- | saga/interface.cpp | 18 | ||||
-rw-r--r-- | saga/interface.h | 5 | ||||
-rw-r--r-- | saga/rscfile.cpp | 3 | ||||
-rw-r--r-- | saga/saga.cpp | 6 | ||||
-rw-r--r-- | saga/scene.cpp | 2 | ||||
-rw-r--r-- | saga/scene.h | 1 | ||||
-rw-r--r-- | saga/script.h | 6 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 31 | ||||
-rw-r--r-- | saga/sthread.cpp | 5 |
10 files changed, 70 insertions, 21 deletions
diff --git a/saga/input.cpp b/saga/input.cpp index 1747aa7964..c2c8e39510 100644 --- a/saga/input.cpp +++ b/saga/input.cpp @@ -81,10 +81,16 @@ int SagaEngine::processInput() { break; case 27: // Esc // Skip to next scene skip target - if (!_interface->getMode() == kPanelNull) // FIXME: hack - _actor->abortAllSpeeches(); - else - _scene->skipScene(); + switch (_interface->getMode()) { + case kPanelNull: + if (_scene->isInDemo()) + _scene->skipScene(); + else + _actor->abortAllSpeeches(); + break; + default: + break; + } break; default: break; diff --git a/saga/interface.cpp b/saga/interface.cpp index ae4ba581da..abcc2593b4 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -238,7 +238,8 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { _activeVerb = I_VERB_WALKTO; _active = 0; - _panelMode = _savedMode = kPanelNull; + _panelMode = _savedMode = _lockedMode = kPanelNull; + _inMainMode = false; *_statusText = 0; _inventoryCount = 0; @@ -274,6 +275,12 @@ int Interface::setMode(int mode) { // TODO: Is this where we should hide/show the mouse cursor? _panelMode = mode; + + if (_panelMode == kPanelConverse) + _inMainMode = false; + //else if (_panelMode == kPanelInventory) + // _inMainMode = true; + draw(); return SUCCESS; @@ -355,16 +362,19 @@ int Interface::draw() { lportrait.x = xbase + _iDesc.lportrait_x; lportrait.y = ybase + _iDesc.lportrait_y; - _vm->_sprite->draw(back_buf, _defPortraits, _leftPortrait, lportrait, 256); + if (_panelMode == kPanelMain || _panelMode == kPanelConverse || + _lockedMode == kPanelMain || _lockedMode == kPanelConverse) + _vm->_sprite->draw(back_buf, _defPortraits, _leftPortrait, lportrait, 256); - if (_panelMode == kPanelConverse && _iDesc.rportrait_x >= 0) { + if (!_inMainMode && _iDesc.rportrait_x >= 0) { rportrait.x = xbase + _iDesc.rportrait_x; rportrait.y = ybase + _iDesc.rportrait_y; _vm->_sprite->draw(back_buf, _scenePortraits, _rightPortrait, rportrait, 256); } - drawInventory(); + if (_inMainMode) + drawInventory(); return SUCCESS; } diff --git a/saga/interface.h b/saga/interface.h index 82f15068d9..58a007b3ac 100644 --- a/saga/interface.h +++ b/saga/interface.h @@ -211,6 +211,9 @@ public: int getMode(void) { return _panelMode; } void rememberMode() { _savedMode = _panelMode; } void restoreMode() { _panelMode = _savedMode; } + void lockMode() { _lockedMode = _panelMode; } + void unlockMode() { _panelMode = _lockedMode; } + bool isInMainMode() { return _inMainMode; } int setStatusText(const char *new_txt); int loadScenePortraits(int res); int setLeftPortrait(int portrait); @@ -240,6 +243,8 @@ private: INTERFACE_DESC _iDesc; int _panelMode; int _savedMode; + int _lockedMode; + bool _inMainMode; INTERFACE_PANEL _cPanel; INTERFACE_PANEL _dPanel; char _statusText[STATUS_TEXT_LEN]; diff --git a/saga/rscfile.cpp b/saga/rscfile.cpp index e39ad522f5..8053f640d1 100644 --- a/saga/rscfile.cpp +++ b/saga/rscfile.cpp @@ -253,6 +253,9 @@ int RSC_LoadResource(RSCFILE_CONTEXT *rsc, uint32 res_num, byte **res_p, size_t break; } + if (!(_vm->_features & GF_WYRMKEEP)) + substnum = -1; + if (substnum != -1) { File in; diff --git a/saga/saga.cpp b/saga/saga.cpp index 7f6380a2a0..75d8956e5d 100644 --- a/saga/saga.cpp +++ b/saga/saga.cpp @@ -245,7 +245,11 @@ int SagaEngine::go() { if (msec > MAX_TIME_DELTA) { msec = MAX_TIME_DELTA; } - _actor->direct(msec); + if (_vm->_interface->getMode() == kPanelMain || + _vm->_interface->getMode() == kPanelConverse || + _vm->_interface->getMode() == kPanelNull) + _actor->direct(msec); + _events->handleEvents(msec); _script->executeThreads(msec); } diff --git a/saga/scene.cpp b/saga/scene.cpp index 1e7722ea3f..9ce05c4da8 100644 --- a/saga/scene.cpp +++ b/saga/scene.cpp @@ -1046,6 +1046,8 @@ int Scene::defaultScene(int param, SCENE_INFO *scene_info) { EVENT event; EVENT *q_event; + _inGame = true; + switch (param) { case SCENE_BEGIN: _vm->_sound->stopVoice(); diff --git a/saga/scene.h b/saga/scene.h index 8530c25613..4b33b131cc 100644 --- a/saga/scene.h +++ b/saga/scene.h @@ -234,6 +234,7 @@ class Scene { int draw(SURFACE *); int getMode(); int getFlags() { return _desc.flags; } + bool isInDemo() { return !_inGame; } void getBGMaskInfo(int &width, int &height, byte *&buffer, size_t &bufferLength); int isBGMaskPresent() { diff --git a/saga/script.h b/saga/script.h index fdb60ec185..317b43e9a3 100644 --- a/saga/script.h +++ b/saga/script.h @@ -313,14 +313,14 @@ private: int SF_takeObject(SCRIPTFUNC_PARAMS); int SF_objectIsCarried(SCRIPTFUNC_PARAMS); int sfStatusBar(SCRIPTFUNC_PARAMS); - int SF_commandMode(SCRIPTFUNC_PARAMS); + int SF_mainMode(SCRIPTFUNC_PARAMS); int sfScriptWalkTo(SCRIPTFUNC_PARAMS); int SF_doAction(SCRIPTFUNC_PARAMS); int sfSetActorFacing(SCRIPTFUNC_PARAMS); int sfStartBgdAnim(SCRIPTFUNC_PARAMS); int sfStopBgdAnim(SCRIPTFUNC_PARAMS); - int SF_freezeInterface(SCRIPTFUNC_PARAMS); - int SF_dialogMode(SCRIPTFUNC_PARAMS); + int sfLockUser(SCRIPTFUNC_PARAMS); + int SF_preDialog(SCRIPTFUNC_PARAMS); int SF_killActorThreads(SCRIPTFUNC_PARAMS); int SF_faceTowards(SCRIPTFUNC_PARAMS); int sfSetFollower(SCRIPTFUNC_PARAMS); diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index e378cc4b51..c7c49f4b74 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -52,14 +52,14 @@ void Script::setupScriptFuncList(void) { OPCODE(SF_takeObject), OPCODE(SF_objectIsCarried), OPCODE(sfStatusBar), - OPCODE(SF_commandMode), + OPCODE(SF_mainMode), OPCODE(sfScriptWalkTo), OPCODE(SF_doAction), OPCODE(sfSetActorFacing), OPCODE(sfStartBgdAnim), OPCODE(sfStopBgdAnim), - OPCODE(SF_freezeInterface), - OPCODE(SF_dialogMode), + OPCODE(sfLockUser), + OPCODE(SF_preDialog), OPCODE(SF_killActorThreads), OPCODE(SF_faceTowards), OPCODE(sfSetFollower), @@ -192,8 +192,14 @@ int Script::sfStatusBar(SCRIPTFUNC_PARAMS) { } // Script function #5 (0x05) -int Script::SF_commandMode(SCRIPTFUNC_PARAMS) { - return _vm->_interface->setMode(kPanelMain); +int Script::SF_mainMode(SCRIPTFUNC_PARAMS) { + ; // center actor + ; // show verb + _vm->_interface->activate(); + //_vm->_interface->setMode(kPanelInventory); + ; // set pointer verb + + return SUCCESS; } // Script function #6 (0x06) blocking @@ -278,7 +284,7 @@ int Script::sfStopBgdAnim(SCRIPTFUNC_PARAMS) { // continues to run. If the parameter is false, the user interface is // reenabled. // Param1: boolean -int Script::SF_freezeInterface(SCRIPTFUNC_PARAMS) { +int Script::sfLockUser(SCRIPTFUNC_PARAMS) { ScriptDataWord b_param; b_param = thread->pop(); @@ -294,8 +300,16 @@ int Script::SF_freezeInterface(SCRIPTFUNC_PARAMS) { // Script function #12 (0x0C) // Disables mouse input, etc. -int Script::SF_dialogMode(SCRIPTFUNC_PARAMS) { - return _vm->_interface->setMode(kPanelConverse); +int Script::SF_preDialog(SCRIPTFUNC_PARAMS) { + _vm->_interface->deactivate(); + ; // clear converse text + if (_vm->_interface->isInMainMode()) + _vm->_interface->setMode(kPanelConverse); + else + ; // display zero text + _vm->_interface->setMode(kPanelNull); + + debug(1, "stub: SF_preDialog()"); } // Script function #13 (0x0D) @@ -972,7 +986,6 @@ int Script::sfPlacardOff(SCRIPTFUNC_PARAMS) { PALENTRY *pal; // Fade down - _vm->_gfx->showCursor(false); _vm->_gfx->getCurrentPal(cur_pal); _vm->_gfx->palToBlackWait(back_buf, cur_pal, kNormalFadeDuration); diff --git a/saga/sthread.cpp b/saga/sthread.cpp index 3b925f16c0..028354fc77 100644 --- a/saga/sthread.cpp +++ b/saga/sthread.cpp @@ -27,6 +27,7 @@ #include "saga/gfx.h" #include "saga/actor.h" #include "saga/console.h" +#include "saga/interface.h" #include "saga/script.h" @@ -784,6 +785,10 @@ void Script::runThread(SCRIPT_THREAD *thread, int instr_limit) { break; // (DLGX): Run dialogue interface case 0x55: + if (0) { + _vm->_interface->activate(); + _vm->_interface->setMode(kPanelConverse); + } warning("dialog_end opcode: stub"); break; // (DLGO): Add a dialogue option to interface |