From 5b89fd7dab3dfb5b4c30f12dde00aa203657cda6 Mon Sep 17 00:00:00 2001 From: Adrian Frühwirth Date: Fri, 2 Mar 2018 19:10:57 +0100 Subject: Add PanelState, PanelStyle and PanelType enums The new _panelState tells if the panel is currently in the process of being toggled between icon-style and text-style verbs and thus animated. The new _panelStyle tells wich verb-style the panel currently uses. The new _panelType tells which mode the panel currently is in: - verbs + inventory (normal) - empty (used for dialogs) - save, load, play, quit buttons - save/load savegame Also, switchPanelType() has been renamed to togglePanelStyle() and kInputKeyToggleInventory to kInputKeyTogglePanelStyle to better match the above changes. _switchPanelFlag has been dropped in favor of using the new _panelState. TODO: Store _panelStyle in savegames. --- engines/tucker/locations.cpp | 4 +- engines/tucker/resource.cpp | 6 +- engines/tucker/tucker.cpp | 154 +++++++++++++++++++++---------------------- engines/tucker/tucker.h | 28 ++++++-- 4 files changed, 105 insertions(+), 87 deletions(-) (limited to 'engines') diff --git a/engines/tucker/locations.cpp b/engines/tucker/locations.cpp index fee989c904..dc7e43f209 100644 --- a/engines/tucker/locations.cpp +++ b/engines/tucker/locations.cpp @@ -3020,11 +3020,11 @@ void TuckerEngine::execData3PreUpdate_locationNum70() { _flagsTable[143] = 0; _updateLocation70StringLen = 0; _forceRedrawPanelItems = true; - _panelState = 1; + _panelType = kPanelTypeEmpty; setCursorState(kCursorStateDisabledHidden); } _forceRedrawPanelItems = true; - _panelState = 1; + _panelType = kPanelTypeEmpty; setCursorState(kCursorStateDisabledHidden); int pos = getPositionForLine(22, _infoBarBuf); const int yPos = (_flagsTable[143] == 0) ? 90 : 72; diff --git a/engines/tucker/resource.cpp b/engines/tucker/resource.cpp index 133d6c312c..cab26a0636 100644 --- a/engines/tucker/resource.cpp +++ b/engines/tucker/resource.cpp @@ -377,7 +377,7 @@ void TuckerEngine::loadCharSizeDta() { } void TuckerEngine::loadPanel() { - loadImage((_panelNum == 0) ? "panel1.pcx" : "panel2.pcx", _panelGfxBuf, 0); + loadImage((_panelStyle == kPanelStyleVerbs) ? "panel1.pcx" : "panel2.pcx", _panelGfxBuf, 0); } void TuckerEngine::loadBudSpr() { @@ -984,7 +984,7 @@ void TuckerEngine::loadActionsTable() { assert(found); } _forceRedrawPanelItems = true; - _panelState = 1; + _panelType = kPanelTypeEmpty; setCursorState(kCursorStateDisabledHidden); _tableInstructionsPtr = _csDataBuf + t._pos + 1; _csDataLoaded = true; @@ -1046,7 +1046,7 @@ void TuckerEngine::loadActionsTable() { _nextAction = 0; _csDataLoaded = false; _forceRedrawPanelItems = true; - _panelState = 0; + _panelType = kPanelTypeNormal; setCursorState(kCursorStateNormal); _csDataHandled = false; _actionVerbLocked = false; diff --git a/engines/tucker/tucker.cpp b/engines/tucker/tucker.cpp index b277e03cc6..7c0204aa9a 100644 --- a/engines/tucker/tucker.cpp +++ b/engines/tucker/tucker.cpp @@ -211,11 +211,11 @@ void TuckerEngine::resetVariables() { _cursorState = kCursorStateNormal; _updateCursorFlag = false; - _panelNum = 1; - _panelState = 0; + _panelStyle = kPanelStyleIcons; + _panelState = kPanelStateNormal; + _panelType = kPanelTypeNormal; _forceRedrawPanelItems = true; _redrawPanelItemsCounter = 0; - _switchPanelFlag = 0; memset(_panelObjectsOffsetTable, 0, sizeof(_panelObjectsOffsetTable)); _switchPanelCounter = 0; _conversationOptionsCount = 0; @@ -424,7 +424,7 @@ void TuckerEngine::mainLoop() { updateCharPosition(); if (_cursorState == kCursorStateNormal) { updateCursor(); - } else if (_panelState == 2) { + } else if (_panelType == kPanelTypeLoadSavePlayQuit) { handleMouseOnPanel(); } if (_mainLoopCounter2 == 0) { @@ -465,12 +465,12 @@ void TuckerEngine::mainLoop() { _mainLoopCounter1 = 0; } if (_locationHeight == 140) { - switchPanelType(); + togglePanelStyle(); redrawPanelItems(); if (_displayGameHints && _gameHintsIndex < 6) { updateGameHints(); } - if (_panelState == 0) { + if (_panelType == kPanelTypeNormal) { if (_panelLockedFlag || _pendingActionDelay > 0) { if (!_fadedPanel) { updateItemsGfxColors(0x60, 0x80); @@ -531,7 +531,7 @@ void TuckerEngine::mainLoop() { if (_locationHeight == 140) { redrawPanelOverBackground(); } - if (_panelState == 3) { + if (_panelType == kPanelTypeLoadSaveSavegame) { saveOrLoad(); } execData3PostUpdate(); @@ -643,7 +643,7 @@ void TuckerEngine::parseEvents() { _inputKeys[kInputKeyPause] = true; break; case Common::KEYCODE_F1: - _inputKeys[kInputKeyToggleInventory] = true; + _inputKeys[kInputKeyTogglePanelStyle] = true; break; case Common::KEYCODE_F2: _inputKeys[kInputKeyToggleTextSpeech] = true; @@ -697,12 +697,22 @@ void TuckerEngine::parseEvents() { break; } } + + if (_inputKeys[kInputKeyTogglePanelStyle]) { + if (_panelType == kPanelTypeNormal && _panelState == kPanelStateNormal) { + _switchPanelCounter = 1; + _panelState = kPanelStateShrinking; + } + _inputKeys[kInputKeyTogglePanelStyle] = false; + } + if (_inputKeys[kInputKeySkipSpeech]) { if (isSpeechSoundPlaying()) { stopSpeechSound(); } _inputKeys[kInputKeySkipSpeech] = false; } + _quitGame = shouldQuit(); } @@ -733,7 +743,6 @@ void TuckerEngine::setupNewLocation() { debug(2, "setupNewLocation() current %d next %d", _locationNum, _nextLocationNum); _locationNum = _nextLocationNum; loadObj(); - _switchPanelFlag = 0; _nextLocationNum = 0; _fadePaletteCounter = 0; _mainLoopCounter2 = 0; @@ -810,7 +819,7 @@ void TuckerEngine::updateMouseState() { } } if (_cursorState == kCursorStateDialog) { - if (_panelState == 1) { + if (_panelType == kPanelTypeEmpty) { setCursorStyle(kCursorTalk); } if (_mousePosY < 140) { @@ -1385,7 +1394,7 @@ void TuckerEngine::saveOrLoad() { } if (_mousePosX > 244 && _mousePosX < 310 && _mousePosY > 170 && _mousePosY < 188) { _forceRedrawPanelItems = true; - _panelState = 2; + _panelType = kPanelTypeLoadSavePlayQuit; return; } if (_mousePosX > 260 && _mousePosX < 290 && _mousePosY > 152 && _mousePosY < 168) { @@ -1395,7 +1404,7 @@ void TuckerEngine::saveOrLoad() { loadGameState(_currentSaveLoadGameState); } _forceRedrawPanelItems = true; - _panelState = 0; + _panelType = kPanelTypeNormal; setCursorState(kCursorStateNormal); return; } @@ -1417,14 +1426,14 @@ void TuckerEngine::handleMouseOnPanel() { if (_mousePosX < 96) { _saveOrLoadGamePanel = 0; _forceRedrawPanelItems = true; - _panelState = 3; + _panelType = kPanelTypeLoadSaveSavegame; } else if (_mousePosX < 158) { _saveOrLoadGamePanel = 1; _forceRedrawPanelItems = true; - _panelState = 3; + _panelType = kPanelTypeLoadSaveSavegame; } else if (_mousePosX < 218) { _forceRedrawPanelItems = true; - _panelState = 0; + _panelType = kPanelTypeNormal; setCursorState(kCursorStateNormal); } else { _quitGame = true; @@ -1432,36 +1441,25 @@ void TuckerEngine::handleMouseOnPanel() { } } -void TuckerEngine::switchPanelType() { - if (_inputKeys[kInputKeyToggleInventory]) { - _inputKeys[kInputKeyToggleInventory] = false; - if (_panelState == 0 && _switchPanelFlag == 0) { - _switchPanelFlag = 1; - _switchPanelCounter = 1; - return; - } - } - if (_switchPanelFlag == 0) { - return; - } - if (_switchPanelFlag == 1) { - if (_switchPanelCounter == 25) { - if (_panelNum == 0) { - _panelNum = 1; - } else { - _panelNum = 0; +void TuckerEngine::togglePanelStyle() { + switch (_panelState) { + case kPanelStateShrinking: + if (++_switchPanelCounter == 25) { + _panelStyle = (_panelStyle == kPanelStyleVerbs) ? kPanelStyleIcons : kPanelStyleVerbs; + loadPanel(); + _forceRedrawPanelItems = true; + _panelState = kPanelStateExpanding; } - _switchPanelFlag = 2; - loadPanel(); - _forceRedrawPanelItems = true; - } else { - ++_switchPanelCounter; - } - } else { - --_switchPanelCounter; - if (_switchPanelCounter == 0) { - _switchPanelFlag = 0; - } + break; + + case kPanelStateExpanding: + if (--_switchPanelCounter == 0) { + _panelState = kPanelStateNormal; + } + break; + + default: + break; } } @@ -1930,7 +1928,7 @@ void TuckerEngine::rememberSpeechSound() { } void TuckerEngine::redrawPanelItems() { - if (_forceRedrawPanelItems || (_redrawPanelItemsCounter != 0 && _panelState == 0)) { + if (_forceRedrawPanelItems || (_redrawPanelItemsCounter != 0 && _panelType == kPanelTypeNormal)) { _forceRedrawPanelItems = false; if (_redrawPanelItemsCounter > 0) { --_redrawPanelItemsCounter; @@ -1940,34 +1938,36 @@ void TuckerEngine::redrawPanelItems() { uint8 *dst = nullptr; int sz = 0; - switch (_panelState) { - case 0: - src = _panelGfxBuf; - dst = _itemsGfxBuf + 3200; - sz = 16000; - break; - case 1: - src = _panelGfxBuf + 16320; - dst = _itemsGfxBuf; - sz = 19200; - break; - case 2: - src = _panelGfxBuf + 16320; - dst = _itemsGfxBuf; - sz = 19200; - memcpy(dst, src, sz); - src = _panelGfxBuf + 55040; - dst = _itemsGfxBuf + 6400; - sz = 5120; - break; - case 3: - src = _panelGfxBuf + 35200; - dst = _itemsGfxBuf; - sz = 19200; - break; + switch (_panelType) { + case kPanelTypeNormal: + src = _panelGfxBuf; + dst = _itemsGfxBuf + 3200; + sz = 16000; + break; + case kPanelTypeEmpty: + src = _panelGfxBuf + 16320; + dst = _itemsGfxBuf; + sz = 19200; + break; + case kPanelTypeLoadSavePlayQuit: + src = _panelGfxBuf + 16320; + dst = _itemsGfxBuf; + sz = 19200; + memcpy(dst, src, sz); + src = _panelGfxBuf + 55040; + dst = _itemsGfxBuf + 6400; + sz = 5120; + break; + case kPanelTypeLoadSaveSavegame: + src = _panelGfxBuf + 35200; + dst = _itemsGfxBuf; + sz = 19200; + break; + default: + break; } memcpy(dst, src, sz); - if (_panelState == 0) { + if (_panelType == kPanelTypeNormal) { redrawPanelItemsHelper(); } } @@ -2161,7 +2161,7 @@ void TuckerEngine::updateCharacterAnimation() { if (_backgroundSpriteCurrentFrame > _backgroundSpriteLastFrame) { _backgroundSpriteCurrentAnimation = -1; _backgroundSpriteCurrentFrame = 0; - if (_nextAction == 0 && _panelState == 0) { + if (_nextAction == 0 && _panelType == kPanelTypeNormal) { setCursorState(kCursorStateNormal); } } @@ -2430,7 +2430,7 @@ void TuckerEngine::handleMap() { return; } _locationMaskType = 2; - _panelState = 0; + _panelType = kPanelTypeNormal; setCursorState(kCursorStateNormal); if (_selectedObject._locationObjectLocationNum == 99) { _noPositionChangeAfterMap = true; @@ -3218,7 +3218,7 @@ int TuckerEngine::executeTableInstruction() { const int code = readTableInstructionCode(&index); switch (code) { case kCode_pan: - _panelState = readTableInstructionParam(2); + _panelType = (PanelType)readTableInstructionParam(2); _forceRedrawPanelItems = true; return 0; case kCode_bua: @@ -3463,7 +3463,7 @@ void TuckerEngine::setActionVerbUnderCursor() { _actionVerb = kVerbWalk; } else if (_mousePosX > 195) { _actionVerb = kVerbLook; - } else if (_panelNum == 0) { + } else if (_panelStyle == kPanelStyleVerbs) { _actionVerb = ((_mousePosY - 150) / 17) * 3 + (_mousePosX / 67); } else { _actionVerb = kVerbWalk; @@ -3647,7 +3647,7 @@ bool TuckerEngine::testLocationMaskArea(int xBase, int yBase, int xPos, int yPos } void TuckerEngine::handleMouseClickOnInventoryObject() { - if (_panelState != 0) { + if (_panelType != kPanelTypeNormal) { return; } if (_mousePosY < 150 || _mousePosX < 212) { @@ -3668,7 +3668,7 @@ void TuckerEngine::handleMouseClickOnInventoryObject() { _actionVerb = kVerbWalk; _actionVerbLocked = false; _forceRedrawPanelItems = true; - _panelState = 2; + _panelType = kPanelTypeLoadSavePlayQuit; setCursorState(kCursorStateDialog); } break; diff --git a/engines/tucker/tucker.h b/engines/tucker/tucker.h index 0a2f0a9a4c..03046f67de 100644 --- a/engines/tucker/tucker.h +++ b/engines/tucker/tucker.h @@ -68,6 +68,24 @@ enum CursorState { kCursorStateDisabledHidden = 2 }; +enum PanelState { + kPanelStateNormal = 0, + kPanelStateShrinking = 1, + kPanelStateExpanding = 2 +}; + +enum PanelStyle { + kPanelStyleVerbs = 0, + kPanelStyleIcons = 1 +}; + +enum PanelType { + kPanelTypeNormal = 0, + kPanelTypeEmpty = 1, + kPanelTypeLoadSavePlayQuit = 2, + kPanelTypeLoadSaveSavegame = 3 +}; + enum Verb { kVerbWalk = 0, kVerbLook = 1, @@ -232,7 +250,7 @@ enum { enum InputKey { kInputKeyPause = 0, kInputKeyEscape, - kInputKeyToggleInventory, + kInputKeyTogglePanelStyle, kInputKeyToggleTextSpeech, kInputKeyHelp, kInputKeyCount, @@ -346,7 +364,7 @@ protected: void updateSfxData3_2(); void saveOrLoad(); void handleMouseOnPanel(); - void switchPanelType(); + void togglePanelStyle(); void redrawPanelOverBackground(); void drawConversationTexts(); void updateScreenScrolling(); @@ -715,11 +733,11 @@ protected: CursorState _cursorState; bool _updateCursorFlag; - int _panelNum; - int _panelState; + PanelStyle _panelStyle; + PanelState _panelState; + PanelType _panelType; bool _forceRedrawPanelItems; int _redrawPanelItemsCounter; - int _switchPanelFlag; int _panelObjectsOffsetTable[50]; int _switchPanelCounter; int _conversationOptionsCount; -- cgit v1.2.3