diff options
Diffstat (limited to 'engines/scumm')
-rw-r--r-- | engines/scumm/script_v0.cpp | 20 | ||||
-rw-r--r-- | engines/scumm/script_v2.cpp | 27 | ||||
-rw-r--r-- | engines/scumm/scumm.h | 13 | ||||
-rw-r--r-- | engines/scumm/verbs.cpp | 8 |
4 files changed, 47 insertions, 21 deletions
diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp index cf2b7d9a8f..46052cdf49 100644 --- a/engines/scumm/script_v0.cpp +++ b/engines/scumm/script_v0.cpp @@ -456,7 +456,7 @@ void ScummEngine_v0::drawSentenceObject(int object) { void ScummEngine_v0::drawSentenceLine() { _redrawSentenceLine = false; - if (!(_userState & 32)) + if (!(_userState & USERSTATE_IFACE_SENTENCE)) return; clearSentenceLine(); @@ -627,22 +627,32 @@ void ScummEngine_v0::o_unlockRoom() { } void ScummEngine_v0::setMode(byte mode) { - int state = 0; + int state; _currentMode = mode; switch (_currentMode) { case kModeCutscene: _redrawSentenceLine = false; - state = 7; + // Note: do not change freeze state here + state = USERSTATE_SET_IFACE | + USERSTATE_SET_CURSOR | + USERSTATE_SET_FREEZE; break; case kModeKeypad: - state = 23; + _redrawSentenceLine = false; + state = USERSTATE_SET_IFACE | + USERSTATE_SET_CURSOR | USERSTATE_CURSOR_ON | + USERSTATE_SET_FREEZE; break; case kModeNormal: case kModeNoNewKid: - state = 247; + state = USERSTATE_SET_IFACE | USERSTATE_IFACE_ALL | + USERSTATE_SET_CURSOR | USERSTATE_CURSOR_ON | + USERSTATE_SET_FREEZE; break; + default: + error("Invalid mode: %d", mode); } setUserState(state); diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp index 983bba0914..2b2bad32a7 100644 --- a/engines/scumm/script_v2.cpp +++ b/engines/scumm/script_v2.cpp @@ -993,7 +993,8 @@ void ScummEngine_v2::o2_drawSentence() { const byte *temp; int slot = getVerbSlot(VAR(VAR_SENTENCE_VERB), 0); - if (!((_userState & 32) || (_game.platform == Common::kPlatformNES && _userState & 0xe0))) + if (!((_userState & USERSTATE_IFACE_SENTENCE) || + (_game.platform == Common::kPlatformNES && (_userState & USERSTATE_IFACE_ALL)))) return; if (getResourceAddress(rtVerb, slot)) @@ -1303,7 +1304,7 @@ void ScummEngine_v2::o2_findObject() { int x = getVarOrDirectByte(PARAM_1) * V12_X_MULTIPLIER; int y = getVarOrDirectByte(PARAM_2) * V12_Y_MULTIPLIER; obj = findObject(x, y); - if (obj == 0 && (_game.platform == Common::kPlatformNES) && (_userState & 0x40)) { + if (obj == 0 && (_game.platform == Common::kPlatformNES) && (_userState & USERSTATE_IFACE_INVENTORY)) { if (_mouseOverBoxV2 >= 0 && _mouseOverBoxV2 < 4) obj = findInventory(VAR(VAR_EGO), _mouseOverBoxV2 + _inventoryOffset + 1); } @@ -1485,7 +1486,9 @@ void ScummEngine_v2::o2_cutscene() { VAR(VAR_CURSORSTATE) = 200; // Hide inventory, freeze scripts, hide cursor - setUserState(15); + setUserState(USERSTATE_SET_IFACE | + USERSTATE_SET_CURSOR | + USERSTATE_SET_FREEZE | USERSTATE_FREEZE_ON); _sentenceNum = 0; stopScript(SENTENCE_SCRIPT); @@ -1504,7 +1507,7 @@ void ScummEngine_v2::o2_endCutscene() { VAR(VAR_CURSORSTATE) = vm.cutSceneData[1]; // Reset user state to values before cutscene - setUserState(vm.cutSceneData[0] | 7); + setUserState(vm.cutSceneData[0] | USERSTATE_SET_IFACE | USERSTATE_SET_CURSOR | USERSTATE_SET_FREEZE); if ((_game.id == GID_MANIAC) && !(_game.platform == Common::kPlatformNES)) { camera._mode = (byte) vm.cutSceneData[3]; @@ -1570,24 +1573,24 @@ void ScummEngine_v2::o2_cursorCommand() { // TODO: Define the magic numbers } void ScummEngine_v2::setUserState(byte state) { - if (state & 4) { // Userface + if (state & USERSTATE_SET_IFACE) { // Userface if (_game.platform == Common::kPlatformNES) - _userState = (_userState & ~0xE0) | (state & 0xE0); + _userState = (_userState & ~USERSTATE_IFACE_ALL) | (state & USERSTATE_IFACE_ALL); else - _userState = state & (32 | 64 | 128); + _userState = state & USERSTATE_IFACE_ALL; } - if (state & 1) { // Freeze - if (state & 8) + if (state & USERSTATE_SET_FREEZE) { // Freeze + if (state & USERSTATE_FREEZE_ON) freezeScripts(0); else unfreezeScripts(); } - if (state & 2) { // Cursor Show/Hide + if (state & USERSTATE_SET_CURSOR) { // Cursor Show/Hide if (_game.platform == Common::kPlatformNES) - _userState = (_userState & ~0x10) | (state & 0x10); - if (state & 16) { + _userState = (_userState & ~USERSTATE_CURSOR_ON) | (state & USERSTATE_CURSOR_ON); + if (state & USERSTATE_CURSOR_ON) { _userPut = 1; _cursor.state = 1; } else { diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 042a3a5d47..fa04c5b616 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -303,6 +303,19 @@ struct SaveStateMetaInfos { uint32 playtime; }; +enum UserStates { + USERSTATE_SET_FREEZE = 0x01, // freeze scripts if USERSTATE_FREEZE_ON is set, unfreeze otherwise + USERSTATE_SET_CURSOR = 0x02, // shows cursor if USERSTATE_CURSOR_ON is set, hides it otherwise + USERSTATE_SET_IFACE = 0x04, // change user-interface (sentence-line, inventory, verb-area) + USERSTATE_FREEZE_ON = 0x08, // only interpreted if USERSTATE_SET_FREEZE is set + USERSTATE_CURSOR_ON = 0x10, // only interpreted if USERSTATE_SET_CURSOR is set + USERSTATE_IFACE_SENTENCE = 0x20, // only interpreted if USERSTATE_SET_IFACE is set + USERSTATE_IFACE_INVENTORY = 0x40, // only interpreted if USERSTATE_SET_IFACE is set + USERSTATE_IFACE_VERBS = 0x80 // only interpreted if USERSTATE_SET_IFACE is set +}; + +#define USERSTATE_IFACE_ALL (USERSTATE_IFACE_SENTENCE | USERSTATE_IFACE_INVENTORY | USERSTATE_IFACE_VERBS) + /** * A list of resource types. * WARNING: Do not change the order of these, as the savegame format relies diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp index 4347ad9db9..2b9d2342bc 100644 --- a/engines/scumm/verbs.cpp +++ b/engines/scumm/verbs.cpp @@ -272,7 +272,7 @@ void ScummEngine_v2::checkV2MouseOver(Common::Point pos) { int i, x, y, new_box = -1; // Don't do anything unless the inventory is active - if (!(_userState & 64)) { + if (!(_userState & USERSTATE_IFACE_INVENTORY)) { _mouseOverBoxV2 = -1; return; } @@ -368,7 +368,7 @@ void ScummEngine_v2::redrawV2Inventory() { _mouseOverBoxV2 = -1; - if (!(_userState & 64)) // Don't draw inventory unless active + if (!(_userState & USERSTATE_IFACE_INVENTORY)) // Don't draw inventory unless active return; // Clear on all invocations @@ -432,7 +432,7 @@ void ScummEngine_v2::redrawV2Inventory() { } void ScummEngine::redrawVerbs() { - if (_game.version <= 2 && !(_userState & 128)) // Don't draw verbs unless active + if (_game.version <= 2 && !(_userState & USERSTATE_IFACE_VERBS)) // Don't draw verbs unless active return; int i, verb = 0; @@ -875,7 +875,7 @@ void ScummEngine_v0::checkExecVerbs() { void ScummEngine::verbMouseOver(int verb) { // Don't do anything unless verbs are active - if (_game.version <= 2 && !(_userState & 128)) + if (_game.version <= 2 && !(_userState & USERSTATE_IFACE_VERBS)) return; if (_game.id == GID_FT) |