[Scummvm-git-logs] scummvm master -> 3e63de4aeca0c037340fbaee61c0f2be86de44e0
fracturehill
noreply at scummvm.org
Thu Apr 6 15:28:03 UTC 2023
This automated email contains information about 9 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
01880a1e55 NANCY: Correct Second Chance autosave screenshot
fcd1220b2f NANCY: Fix viewport movement after pausing
7fbb26312b NANCY: Quit to launcher on win/lose game
29d1819b97 NANCY: Keep curtains visible in The Vampire Diaries
732181653f NANCY: Correct inventory box size
802d66782b NANCY: Implement inventory box ornaments
846bee430b NANCY: Correctly handle calling the GMM in all states
4b3b81eb52 NANCY: Change where states are entered and exited
3e63de4aec NANCY: Implement UI button time delay
Commit: 01880a1e55bf61f6cc0b4228f4b93c93cd615cfa
https://github.com/scummvm/scummvm/commit/01880a1e55bf61f6cc0b4228f4b93c93cd615cfa
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:11+03:00
Commit Message:
NANCY: Correct Second Chance autosave screenshot
Changed paths:
engines/nancy/metaengine.cpp
diff --git a/engines/nancy/metaengine.cpp b/engines/nancy/metaengine.cpp
index be5d9abfd68..bef49f39ff8 100644
--- a/engines/nancy/metaengine.cpp
+++ b/engines/nancy/metaengine.cpp
@@ -22,6 +22,7 @@
#include "engines/advancedDetector.h"
#include "engines/nancy/nancy.h"
+#include "engines/nancy/graphics.h"
#include "engines/nancy/input.h"
#include "engines/nancy/dialogs.h"
@@ -38,6 +39,8 @@ public:
Common::KeymapArray initKeymaps(const char *target) const override;
+ void getSavegameThumbnail(Graphics::Surface &thumb) override;
+
void registerDefaultSettings(const Common::String &target) const override;
GUI::OptionsContainerWidget *buildEngineOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const override;
};
@@ -68,6 +71,13 @@ Common::Error NancyMetaEngine::createInstance(OSystem *syst, Engine **engine, co
int NancyMetaEngine::getMaximumSaveSlot() const { return 8; }
+void NancyMetaEngine::getSavegameThumbnail(Graphics::Surface &thumb) {
+ // Second Chance autosaves trigger when a scene changes, but before
+ // it is drawn, so we need to refresh the screen before we take a screenshot
+ Nancy::g_nancy->_graphicsManager->draw();
+ AdvancedMetaEngine::getSavegameThumbnail(thumb);
+}
+
void NancyMetaEngine::registerDefaultSettings(const Common::String &target) const {
ConfMan.setInt("music_volume", 54 * 255 / 100, target);
ConfMan.setInt("speech_volume", 54 * 255 / 100, target);
Commit: fcd1220b2ffcb2aa180a61c0a365ac28dcef4d8f
https://github.com/scummvm/scummvm/commit/fcd1220b2ffcb2aa180a61c0a365ac28dcef4d8f
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:13+03:00
Commit Message:
NANCY: Fix viewport movement after pausing
Viewport movement no longer stops after pausing the game or going to
a different state.
Changed paths:
engines/nancy/ui/viewport.cpp
diff --git a/engines/nancy/ui/viewport.cpp b/engines/nancy/ui/viewport.cpp
index eab86e89482..7dcbf55fa14 100644
--- a/engines/nancy/ui/viewport.cpp
+++ b/engines/nancy/ui/viewport.cpp
@@ -47,7 +47,7 @@ void Viewport::init() {
}
void Viewport::handleInput(NancyInput &input) {
- Time playTime = g_nancy->getTotalPlayTime();
+ Time systemTime = g_system->getMillis();
byte direction = 0;
// Make cursor sticky when scrolling the viewport
@@ -150,7 +150,7 @@ void Viewport::handleInput(NancyInput &input) {
const Nancy::State::Scene::SceneSummary &summary = NancySceneState.getSceneSummary();
Time movementDelta = NancySceneState.getMovementTimeDelta(direction & kMoveFast);
- if (playTime > _nextMovementTime) {
+ if (systemTime > _nextMovementTime) {
if (direction & kLeft) {
setNextFrame();
}
@@ -167,7 +167,7 @@ void Viewport::handleInput(NancyInput &input) {
scrollDown(summary.verticalScrollDelta);
}
- _nextMovementTime = playTime + movementDelta;
+ _nextMovementTime = systemTime + movementDelta;
}
}
Commit: 7fbb26312b662b809d814686cc970ae250db7ef4
https://github.com/scummvm/scummvm/commit/7fbb26312b662b809d814686cc970ae250db7ef4
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:14+03:00
Commit Message:
NANCY: Quit to launcher on win/lose game
Going to the GMM when winning/losing the game leads to unintended
behavior, which this commit fixes by quitting to the launcher instead.
Changed paths:
engines/nancy/action/recordtypes.cpp
engines/nancy/state/credits.cpp
diff --git a/engines/nancy/action/recordtypes.cpp b/engines/nancy/action/recordtypes.cpp
index e2d4ed5f09c..a004477b1ce 100644
--- a/engines/nancy/action/recordtypes.cpp
+++ b/engines/nancy/action/recordtypes.cpp
@@ -28,6 +28,8 @@
#include "engines/nancy/state/scene.h"
+#include "common/events.h"
+
namespace Nancy {
namespace Action {
@@ -380,8 +382,14 @@ void LoseGame::readData(Common::SeekableReadStream &stream) {
void LoseGame::execute() {
g_nancy->_sound->stopAndUnloadSpecificSounds();
- g_nancy->setState(NancyState::kMainMenu);
- NancySceneState.resetStateToInit();
+
+ // We're not using original menus yet, so just quit the game and go back to the launcher
+ // g_nancy->setState(NancyState::kMainMenu);
+
+ Common::Event ev;
+ ev.type = Common::EVENT_RETURN_TO_LAUNCHER;
+ g_system->getEventManager()->pushEvent(ev);
+
_isDone = true;
}
@@ -411,7 +419,6 @@ void WinGame::execute() {
g_nancy->_sound->stopAndUnloadSpecificSounds();
g_nancy->setState(NancyState::kCredits, NancyState::kMainMenu);
- NancySceneState.resetStateToInit();
_isDone = true;
}
diff --git a/engines/nancy/state/credits.cpp b/engines/nancy/state/credits.cpp
index df0b9ba7593..5d006c933e6 100644
--- a/engines/nancy/state/credits.cpp
+++ b/engines/nancy/state/credits.cpp
@@ -29,6 +29,8 @@
#include "engines/nancy/state/credits.h"
+#include "common/events.h"
+
namespace Common {
DECLARE_SINGLETON(Nancy::State::Credits);
}
@@ -80,7 +82,14 @@ void Credits::run() {
g_nancy->_sound->stopSound(_creditsData->sound);
g_nancy->setMouseEnabled(true);
_fullTextSurface.free();
- g_nancy->setState(NancyState::kMainMenu);
+
+ // We don't yet support the original menus, so we close the game and go back to the launcher
+ // g_nancy->setState(NancyState::kMainMenu);
+
+ Common::Event ev;
+ ev.type = Common::EVENT_RETURN_TO_LAUNCHER;
+ g_system->getEventManager()->pushEvent(ev);
+
return;
}
Commit: 29d1819b97875baf456e4bd27cccf1c6679e12b8
https://github.com/scummvm/scummvm/commit/29d1819b97875baf456e4bd27cccf1c6679e12b8
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:14+03:00
Commit Message:
NANCY: Keep curtains visible in The Vampire Diaries
Changed paths:
engines/nancy/ui/inventorybox.cpp
diff --git a/engines/nancy/ui/inventorybox.cpp b/engines/nancy/ui/inventorybox.cpp
index dd34a67957c..299bb2c4a82 100644
--- a/engines/nancy/ui/inventorybox.cpp
+++ b/engines/nancy/ui/inventorybox.cpp
@@ -246,7 +246,11 @@ void InventoryBox::Curtains::setAnimationFrame(uint frame) {
Common::Point destPoint;
if (frame > (uint)(g_nancy->getStaticData().numCurtainAnimationFrames - 1)) {
- setVisible(false);
+ // TVD keeps the last frame visible
+ if (g_nancy->getGameType() > kGameTypeVampire) {
+ setVisible(false);
+ }
+
return;
} else {
setVisible(true);
Commit: 732181653f841704077b55133ea9350ce1d68587
https://github.com/scummvm/scummvm/commit/732181653f841704077b55133ea9350ce1d68587
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:14+03:00
Commit Message:
NANCY: Correct inventory box size
Corrected the inventory box size so it doesn't overlap the frame in
The Vampire Diaries.
Changed paths:
engines/nancy/enginedata.cpp
engines/nancy/enginedata.h
engines/nancy/ui/inventorybox.cpp
diff --git a/engines/nancy/enginedata.cpp b/engines/nancy/enginedata.cpp
index 16017771fcb..1c9ed0643a1 100644
--- a/engines/nancy/enginedata.cpp
+++ b/engines/nancy/enginedata.cpp
@@ -58,8 +58,7 @@ BSUM::BSUM(Common::SeekableReadStream *chunkStream) {
s.skip(0x10, kGameTypeVampire, kGameTypeNancy1);
s.skip(0x20, kGameTypeNancy2, kGameTypeNancy3);
readRect(*chunkStream, textboxScreenPosition);
-
- s.skip(0x10);
+ readRect(*chunkStream, inventoryBoxScreenPosition);
readRect(*chunkStream, menuButtonSrc);
readRect(*chunkStream, helpButtonSrc);
readRect(*chunkStream, menuButtonDest);
@@ -111,13 +110,17 @@ INV::INV(Common::SeekableReadStream *chunkStream) {
readRectArray(s, curtainAnimationSrcs, numFrames * 2);
- readRect(s, inventoryScreenPosition);
+ readRect(s, curtainsScreenPosition);
s.syncAsUint16LE(curtainsFrameTime);
readFilename(s, inventoryBoxIconsImageName);
readFilename(s, inventoryCursorsImageName);
- s.skip(0x18);
+ s.skip(0x4); // inventory box icons surface w/h
+ s.skip(0x4); // inventory cursors surface w/h
+
+ s.skip(0x10); // unknown rect, same size as a hotspot
+
byte itemName[20];
uint itemNameLength = g_nancy->getGameType() == kGameTypeVampire ? 15 : 20;
diff --git a/engines/nancy/enginedata.h b/engines/nancy/enginedata.h
index 9d1705f172b..3cbf1724993 100644
--- a/engines/nancy/enginedata.h
+++ b/engines/nancy/enginedata.h
@@ -41,6 +41,7 @@ struct BSUM {
// UI
Common::Rect mapButtonHotspot;
Common::Rect textboxScreenPosition;
+ Common::Rect inventoryBoxScreenPosition;
Common::Rect menuButtonSrc;
Common::Rect helpButtonSrc;
Common::Rect menuButtonDest;
@@ -76,7 +77,7 @@ struct INV {
uint16 scrollbarMaxScroll;
Common::Array<Common::Rect> curtainAnimationSrcs;
- Common::Rect inventoryScreenPosition;
+ Common::Rect curtainsScreenPosition;
uint16 curtainsFrameTime;
Common::String inventoryBoxIconsImageName;
diff --git a/engines/nancy/ui/inventorybox.cpp b/engines/nancy/ui/inventorybox.cpp
index 299bb2c4a82..ec358b5e1fa 100644
--- a/engines/nancy/ui/inventorybox.cpp
+++ b/engines/nancy/ui/inventorybox.cpp
@@ -49,7 +49,7 @@ InventoryBox::~InventoryBox() {
void InventoryBox::init() {
_order.clear();
- moveTo(g_nancy->_inventoryData->inventoryScreenPosition);
+ moveTo(g_nancy->_bootSummary->inventoryBoxScreenPosition);
g_nancy->_resource->loadImage(g_nancy->_inventoryData->inventoryBoxIconsImageName, _iconsSurface);
_fullInventorySurface.create(_screenPosition.width(), _screenPosition.height() * ((g_nancy->getStaticData().numItems / 4) + 1), g_nancy->_graphicsManager->getScreenPixelFormat());
@@ -192,7 +192,7 @@ void InventoryBox::onScrollbarMove() {
}
void InventoryBox::Curtains::init() {
- moveTo(g_nancy->_inventoryData->inventoryScreenPosition);
+ moveTo(g_nancy->_inventoryData->curtainsScreenPosition);
Common::Rect bounds = _screenPosition;
bounds.moveTo(0, 0);
_drawSurface.create(bounds.width(), bounds.height(), g_nancy->_graphicsManager->getInputPixelFormat());
Commit: 802d66782bb64315c4ff7a6b01a3c664cfe25ccb
https://github.com/scummvm/scummvm/commit/802d66782bb64315c4ff7a6b01a3c664cfe25ccb
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:15+03:00
Commit Message:
NANCY: Implement inventory box ornaments
Changed paths:
engines/nancy/enginedata.cpp
engines/nancy/enginedata.h
engines/nancy/state/scene.cpp
engines/nancy/state/scene.h
engines/nancy/ui/inventorybox.h
engines/nancy/ui/ornaments.cpp
engines/nancy/ui/ornaments.h
engines/nancy/ui/textbox.cpp
diff --git a/engines/nancy/enginedata.cpp b/engines/nancy/enginedata.cpp
index 1c9ed0643a1..d3903c2a796 100644
--- a/engines/nancy/enginedata.cpp
+++ b/engines/nancy/enginedata.cpp
@@ -104,7 +104,8 @@ INV::INV(Common::SeekableReadStream *chunkStream) {
s.syncAsUint16LE(scrollbarDefaultPos.y);
s.syncAsUint16LE(scrollbarMaxScroll);
- s.skip(0xC0);
+ readRectArray(s, ornamentSrcs, 6, kGameTypeVampire, kGameTypeNancy1);
+ readRectArray(s, ornamentDests, 6, kGameTypeVampire, kGameTypeNancy1);
uint numFrames = g_nancy->getStaticData().numCurtainAnimationFrames;
diff --git a/engines/nancy/enginedata.h b/engines/nancy/enginedata.h
index 3cbf1724993..11aa163ae2b 100644
--- a/engines/nancy/enginedata.h
+++ b/engines/nancy/enginedata.h
@@ -76,6 +76,9 @@ struct INV {
Common::Point scrollbarDefaultPos;
uint16 scrollbarMaxScroll;
+ Common::Array<Common::Rect> ornamentSrcs;
+ Common::Array<Common::Rect> ornamentDests;
+
Common::Array<Common::Rect> curtainAnimationSrcs;
Common::Rect curtainsScreenPosition;
uint16 curtainsFrameTime;
diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index b1858ea07a6..8d316dc7afa 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -108,6 +108,7 @@ Scene::Scene() :
_helpButton(nullptr),
_viewportOrnaments(nullptr),
_textboxOrnaments(nullptr),
+ _inventoryBoxOrnaments(nullptr),
_clock(nullptr),
_actionManager(),
_difficulty(0),
@@ -119,6 +120,7 @@ Scene::~Scene() {
delete _menuButton;
delete _viewportOrnaments;
delete _textboxOrnaments;
+ delete _inventoryBoxOrnaments;
delete _clock;
delete _lightning;
}
@@ -363,6 +365,11 @@ void Scene::registerGraphics() {
_textboxOrnaments->setVisible(true);
}
+ if (_inventoryBoxOrnaments) {
+ _inventoryBoxOrnaments->registerGraphics();
+ _inventoryBoxOrnaments->setVisible(true);
+ }
+
if (_clock) {
_clock->registerGraphics();
}
@@ -748,6 +755,9 @@ void Scene::initStaticData() {
_textboxOrnaments = new UI::TextboxOrnaments(9);
_textboxOrnaments->init();
+ _inventoryBoxOrnaments = new UI::InventoryBoxOrnaments(9);
+ _inventoryBoxOrnaments->init();
+
_clock = new UI::Clock();
_clock->init();
}
diff --git a/engines/nancy/state/scene.h b/engines/nancy/state/scene.h
index 6c7f8cba052..ee60c2add70 100644
--- a/engines/nancy/state/scene.h
+++ b/engines/nancy/state/scene.h
@@ -59,6 +59,7 @@ namespace UI {
class Button;
class ViewportOrnaments;
class TextboxOrnaments;
+class InventoryBoxOrnaments;
class Clock;
}
@@ -253,6 +254,7 @@ private:
UI::ViewportOrnaments *_viewportOrnaments;
UI::TextboxOrnaments *_textboxOrnaments;
+ UI::InventoryBoxOrnaments *_inventoryBoxOrnaments;
UI::Clock *_clock;
// Data
diff --git a/engines/nancy/ui/inventorybox.h b/engines/nancy/ui/inventorybox.h
index 23431cef382..5b8b4d71615 100644
--- a/engines/nancy/ui/inventorybox.h
+++ b/engines/nancy/ui/inventorybox.h
@@ -70,7 +70,7 @@ private:
class Curtains : public RenderObject {
public:
Curtains() :
- RenderObject(9),
+ RenderObject(10),
_soundTriggered(false),
_areOpen(false),
_curFrame(0) {}
diff --git a/engines/nancy/ui/ornaments.cpp b/engines/nancy/ui/ornaments.cpp
index fd832338b0a..78b7df9b995 100644
--- a/engines/nancy/ui/ornaments.cpp
+++ b/engines/nancy/ui/ornaments.cpp
@@ -71,7 +71,7 @@ void ViewportOrnaments::init() {
}
void TextboxOrnaments::init() {
- _screenPosition = g_nancy->_bootSummary->textboxScreenPosition;
+ moveTo(g_nancy->_bootSummary->textboxScreenPosition);
Common::Rect textboxBounds = _screenPosition;
textboxBounds.moveTo(0, 0);
@@ -95,5 +95,28 @@ void TextboxOrnaments::init() {
RenderObject::init();
}
+void InventoryBoxOrnaments::init() {
+ moveTo(g_nancy->_bootSummary->inventoryBoxScreenPosition);
+ Common::Rect invBoxBounds = _screenPosition;
+ invBoxBounds.moveTo(0, 0);
+
+ Graphics::ManagedSurface &object0 = g_nancy->_graphicsManager->_object0;
+
+ _drawSurface.create(invBoxBounds.width(), invBoxBounds.height(), g_nancy->_graphicsManager->getInputPixelFormat());
+
+ uint8 palette[256 * 3];
+ object0.grabPalette(palette, 0, 256);
+ _drawSurface.setPalette(palette, 0, 256);
+
+ _drawSurface.clear(g_nancy->_graphicsManager->getTransColor());
+ setTransparent(true);
+
+ for (uint i = 0; i < 6; ++i) {
+ _drawSurface.blitFrom(object0, g_nancy->_inventoryData->ornamentSrcs[i],
+ Common::Point( g_nancy->_inventoryData->ornamentDests[i].left - _screenPosition.left,
+ g_nancy->_inventoryData->ornamentDests[i].top - _screenPosition.top));
+ }
+}
+
} // End of namespace UI
} // End of namespace Nancy
diff --git a/engines/nancy/ui/ornaments.h b/engines/nancy/ui/ornaments.h
index 225193dbf18..8ed2a890c4e 100644
--- a/engines/nancy/ui/ornaments.h
+++ b/engines/nancy/ui/ornaments.h
@@ -43,7 +43,15 @@ public:
void init() override;
};
-} // End of namespace Nancy
+class InventoryBoxOrnaments : public Nancy::RenderObject {
+public:
+ InventoryBoxOrnaments(uint16 zOrder) : RenderObject(zOrder) {}
+ virtual ~InventoryBoxOrnaments() {}
+
+ void init() override;
+};
+
+} // End of namespace UI
} // End of namespace Nancy
diff --git a/engines/nancy/ui/textbox.cpp b/engines/nancy/ui/textbox.cpp
index c7aecca6b17..183e5154947 100644
--- a/engines/nancy/ui/textbox.cpp
+++ b/engines/nancy/ui/textbox.cpp
@@ -67,8 +67,8 @@ void Textbox::init() {
RenderObject::init();
- // zOrder bumped by 1 to avoid overlap with the inventory box curtains in The Vampire Diaries
- _scrollbar = new Scrollbar( 10,
+ // zOrder bumped by 2 to avoid overlap with the inventory box curtains in The Vampire Diaries
+ _scrollbar = new Scrollbar( 11,
tbox->scrollbarSrcBounds,
tbox->scrollbarDefaultPos,
tbox->scrollbarMaxScroll - tbox->scrollbarDefaultPos.y);
Commit: 846bee430b3c0351f0f8b461a7b2b20af2201107
https://github.com/scummvm/scummvm/commit/846bee430b3c0351f0f8b461a7b2b20af2201107
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:17+03:00
Commit Message:
NANCY: Correctly handle calling the GMM in all states
All game states now correctly handle calling the GMM, pausing and
unpausing sound and video as needed.
Changed paths:
engines/nancy/nancy.cpp
engines/nancy/nancy.h
engines/nancy/state/credits.cpp
engines/nancy/state/credits.h
engines/nancy/state/help.cpp
engines/nancy/state/help.h
engines/nancy/state/logo.cpp
engines/nancy/state/logo.h
engines/nancy/state/mainmenu.cpp
engines/nancy/state/mainmenu.h
engines/nancy/state/map.cpp
engines/nancy/state/map.h
engines/nancy/state/scene.cpp
engines/nancy/state/scene.h
engines/nancy/state/state.h
diff --git a/engines/nancy/nancy.cpp b/engines/nancy/nancy.cpp
index b516e812b73..7e76e249bb2 100644
--- a/engines/nancy/nancy.cpp
+++ b/engines/nancy/nancy.cpp
@@ -229,29 +229,25 @@ void NancyEngine::setState(NancyState::NancyState state, NancyState::NancyState
_gameFlow.curState = state;
+ bool shouldDestroyLastState = false;
+
State::State *s = getStateObject(_gameFlow.prevState);
if (s) {
- s->onStateExit();
+ shouldDestroyLastState = s->onStateExit(_gameFlow.curState);
}
s = getStateObject(_gameFlow.curState);
if (s) {
- s->onStateEnter();
+ s->onStateEnter(_gameFlow.prevState);
}
-}
-void NancyEngine::setToPreviousState() {
- State::State *s = getStateObject(_gameFlow.curState);
- if (s) {
- s->onStateExit();
- }
-
- s = getStateObject(_gameFlow.prevState);
- if (s) {
- s->onStateEnter();
+ if (shouldDestroyLastState) {
+ destroyState(_gameFlow.prevState);
}
+}
- SWAP<NancyState::NancyState>(_gameFlow.curState, _gameFlow.prevState);
+void NancyEngine::setToPreviousState() {
+ setState(_gameFlow.prevState);
}
void NancyEngine::setMouseEnabled(bool enabled) {
@@ -308,9 +304,9 @@ Common::Error NancyEngine::run() {
void NancyEngine::pauseEngineIntern(bool pause) {
State::State *s = getStateObject(_gameFlow.curState);
if (pause) {
- s->onStateExit();
+ s->onStateExit(NancyState::kPause);
} else {
- s->onStateEnter();
+ s->onStateEnter(NancyState::kPause);
}
}
@@ -412,6 +408,43 @@ State::State *NancyEngine::getStateObject(NancyState::NancyState state) const {
}
}
+void NancyEngine::destroyState(NancyState::NancyState state) const {
+ switch (state) {
+ case NancyState::kLogo:
+ if (State::Logo::hasInstance()) {
+ State::Logo::instance().destroy();
+ }
+ break;
+ case NancyState::kCredits:
+ if (State::Credits::hasInstance()) {
+ State::Credits::instance().destroy();
+ }
+ break;
+ case NancyState::kMap:
+ if (State::Map::hasInstance()) {
+ State::Map::instance().destroy();
+ }
+ break;
+ case NancyState::kHelp:
+ if (State::Help::hasInstance()) {
+ State::Help::instance().destroy();
+ }
+ break;
+ case NancyState::kScene:
+ if (State::Scene::hasInstance()) {
+ State::Scene::instance().destroy();
+ }
+ break;
+ case NancyState::kMainMenu:
+ if (State::MainMenu::hasInstance()) {
+ State::MainMenu::instance().destroy();
+ }
+ break;
+ default:
+ break;
+ }
+}
+
void NancyEngine::preloadCals(const IFF &boot) {
const byte *buf;
uint size;
diff --git a/engines/nancy/nancy.h b/engines/nancy/nancy.h
index 4c803f11651..9903185a71b 100644
--- a/engines/nancy/nancy.h
+++ b/engines/nancy/nancy.h
@@ -138,6 +138,7 @@ private:
void bootGameEngine();
State::State *getStateObject(NancyState::NancyState state) const;
+ void destroyState(NancyState::NancyState state) const;
void preloadCals(const IFF &boot);
diff --git a/engines/nancy/state/credits.cpp b/engines/nancy/state/credits.cpp
index 5d006c933e6..d8b38fd4c76 100644
--- a/engines/nancy/state/credits.cpp
+++ b/engines/nancy/state/credits.cpp
@@ -49,6 +49,24 @@ void Credits::process() {
}
}
+void Credits::onStateEnter(const NancyState::NancyState prevState) {
+ // Handle returning from the GMM
+ if (prevState == NancyState::kPause) {
+ g_nancy->_sound->pauseSound(_creditsData->sound, false);
+ }
+}
+
+bool Credits::onStateExit(const NancyState::NancyState nextState) {
+ // Handle the GMM being called
+ if (nextState == NancyState::kPause) {
+ g_nancy->_sound->pauseSound(_creditsData->sound, true);
+
+ return false;
+ } else {
+ return true;
+ }
+}
+
void Credits::init() {
_creditsData = g_nancy->_creditsData;
assert(_creditsData);
diff --git a/engines/nancy/state/credits.h b/engines/nancy/state/credits.h
index 6d53f6b3c03..cf1bbcc056f 100644
--- a/engines/nancy/state/credits.h
+++ b/engines/nancy/state/credits.h
@@ -42,7 +42,8 @@ public:
// State API
void process() override;
- void onStateExit() override { destroy(); };
+ void onStateEnter(const NancyState::NancyState prevState) override;
+ bool onStateExit(const NancyState::NancyState nextState) override;
protected:
void init();
diff --git a/engines/nancy/state/help.cpp b/engines/nancy/state/help.cpp
index 4f53beec761..9c049667314 100644
--- a/engines/nancy/state/help.cpp
+++ b/engines/nancy/state/help.cpp
@@ -62,6 +62,23 @@ void Help::process() {
}
}
+void Help::onStateEnter(const NancyState::NancyState prevState) {
+ if (prevState == NancyState::kPause) {
+ g_nancy->_sound->pauseSound("MSND", false);
+ }
+}
+
+bool Help::onStateExit(const NancyState::NancyState nextState) {
+ // Handle the GMM being called
+ if (nextState == NancyState::kPause) {
+ g_nancy->_sound->pauseSound("MSND", true);
+
+ return false;
+ } else {
+ return true;
+ }
+}
+
void Help::init() {
HELP *helpData = g_nancy->_helpData;
assert(helpData);
diff --git a/engines/nancy/state/help.h b/engines/nancy/state/help.h
index eee60eed6aa..9ee5632e72e 100644
--- a/engines/nancy/state/help.h
+++ b/engines/nancy/state/help.h
@@ -46,7 +46,8 @@ public:
// State API
void process() override;
- void onStateExit() override { destroy(); };
+ void onStateEnter(const NancyState::NancyState prevState) override;
+ bool onStateExit(const NancyState::NancyState nextState) override;
private:
void init();
diff --git a/engines/nancy/state/logo.cpp b/engines/nancy/state/logo.cpp
index ddbdc9323a0..44369f045bb 100644
--- a/engines/nancy/state/logo.cpp
+++ b/engines/nancy/state/logo.cpp
@@ -54,8 +54,30 @@ void Logo::process() {
}
}
-void Logo::onStateExit() {
- destroy();
+void Logo::onStateEnter(const NancyState::NancyState prevState) {
+ // Handle returning from the GMM
+ if (prevState == NancyState::kPause) {
+ if (_state == kPlayIntroVideo) {
+ _tvdVideoDecoder.pauseVideo(false);
+ } else if (_state == kRun) {
+ g_nancy->_sound->pauseSound("MSND", false);
+ }
+ }
+}
+
+bool Logo::onStateExit(const NancyState::NancyState nextState) {
+ // Handle the GMM being called
+ if (nextState == NancyState::kPause) {
+ if (_state == kPlayIntroVideo) {
+ _tvdVideoDecoder.pauseVideo(true);
+ } else if (_state == kRun) {
+ g_nancy->_sound->pauseSound("MSND", true);
+ }
+
+ return false;
+ } else {
+ return true;
+ }
}
void Logo::init() {
diff --git a/engines/nancy/state/logo.h b/engines/nancy/state/logo.h
index af1d0549bd6..9e6d3a36b4a 100644
--- a/engines/nancy/state/logo.h
+++ b/engines/nancy/state/logo.h
@@ -39,7 +39,8 @@ public:
// State API
void process() override;
- void onStateExit() override;
+ void onStateEnter(const NancyState::NancyState prevState) override;
+ bool onStateExit(const NancyState::NancyState nextState) override;
private:
void init();
diff --git a/engines/nancy/state/mainmenu.cpp b/engines/nancy/state/mainmenu.cpp
index 3f05ab59461..e4bfb015923 100644
--- a/engines/nancy/state/mainmenu.cpp
+++ b/engines/nancy/state/mainmenu.cpp
@@ -49,8 +49,8 @@ void MainMenu::process() {
}
}
-void MainMenu::onStateExit() {
- destroy();
+bool MainMenu::onStateExit(const NancyState::NancyState nextState) {
+ return true;
}
void MainMenu::init() {
diff --git a/engines/nancy/state/mainmenu.h b/engines/nancy/state/mainmenu.h
index 384785bdf41..753cb73f417 100644
--- a/engines/nancy/state/mainmenu.h
+++ b/engines/nancy/state/mainmenu.h
@@ -38,7 +38,7 @@ public:
// State API
void process() override;
- void onStateExit() override;
+ bool onStateExit(const NancyState::NancyState nextState) override;
private:
void init();
diff --git a/engines/nancy/state/map.cpp b/engines/nancy/state/map.cpp
index de8c8034f3d..c6a855d8422 100644
--- a/engines/nancy/state/map.cpp
+++ b/engines/nancy/state/map.cpp
@@ -75,10 +75,30 @@ void Map::process() {
}
}
-void Map::onStateExit() {
- g_nancy->_graphicsManager->clearObjects();
- _viewport.unloadVideo();
- _state = kLoad;
+void Map::onStateEnter(const NancyState::NancyState prevState) {
+ // Unpause sound and video when coming back from the GMM
+ if (prevState == NancyState::kPause) {
+ g_nancy->_sound->pauseSound(getSound(), false);
+ if (_viewport._decoder.getFrameCount() > 1) {
+ _viewport._decoder.pauseVideo(false);
+ }
+ }
+}
+
+bool Map::onStateExit(const NancyState::NancyState nextState) {
+ // Only pause when going to the GMM
+ if (nextState == NancyState::kPause) {
+ g_nancy->_sound->pauseSound(getSound(), true);
+ if (_viewport._decoder.getFrameCount() > 1) {
+ _viewport._decoder.pauseVideo(true);
+ }
+ } else {
+ g_nancy->_graphicsManager->clearObjects();
+ _viewport.unloadVideo();
+ _state = kLoad;
+ }
+
+ return false;
}
const SoundDescription &Map::getSound() {
@@ -93,6 +113,13 @@ void Map::load() {
_background._drawSurface.blitFrom(*screen);
_background.moveTo(_background._drawSurface.getBounds());
_background.setVisible(true);
+
+ // The clock may become invisible after the map is opened, resulting in the left half appearing still open
+ // This is a slightly hacky solution but it works
+ if (g_nancy->getGameType() == kGameTypeVampire) {
+ Common::Rect r(52, 100);
+ _background._drawSurface.blitFrom(NancySceneState.getFrame()._drawSurface, r, r);
+ }
}
void Map::registerGraphics() {
@@ -225,16 +252,18 @@ void TVDMap::load() {
_state = kRun;
}
-void TVDMap::onStateExit() {
- if (_pickedLocationID != -1) {
- NancySceneState.changeScene(_mapData->locations[_pickedLocationID].scenes[NancySceneState.getPlayerTOD() == kPlayerDay ? 0 : 1]);
+bool TVDMap::onStateExit(const NancyState::NancyState nextState) {
+ if (nextState != NancyState::kPause) {
+ if (_pickedLocationID != -1) {
+ NancySceneState.changeScene(_mapData->locations[_pickedLocationID].scenes[NancySceneState.getPlayerTOD() == kPlayerDay ? 0 : 1]);
- g_nancy->_sound->playSound("BUOK");
- } else {
- g_nancy->_sound->stopSound(getSound());
+ g_nancy->_sound->playSound("BUOK");
+ } else {
+ g_nancy->_sound->stopSound(getSound());
+ }
}
- Map::onStateExit();
+ return Map::onStateExit(nextState);
}
void TVDMap::run() {
@@ -421,17 +450,19 @@ void Nancy1Map::registerGraphics() {
_button->registerGraphics();
}
-void Nancy1Map::onStateExit() {
- if (_pickedLocationID != -1) {
- NancySceneState.changeScene(_mapData->locations[_pickedLocationID].scenes[_mapID]);
+bool Nancy1Map::onStateExit(const NancyState::NancyState nextState) {
+ if (nextState != NancyState::kPause) {
+ if (_pickedLocationID != -1) {
+ NancySceneState.changeScene(_mapData->locations[_pickedLocationID].scenes[_mapID]);
- g_nancy->_sound->playSound("BUOK");
- }
+ g_nancy->_sound->playSound("BUOK");
+ }
- g_nancy->_sound->stopSound(getSound());
- g_nancy->_sound->playSound("GLOB");
+ g_nancy->_sound->stopSound(getSound());
+ g_nancy->_sound->playSound("GLOB");
+ }
- Map::onStateExit();
+ return Map::onStateExit(nextState);
}
} // End of namespace State
diff --git a/engines/nancy/state/map.h b/engines/nancy/state/map.h
index 63207a25f3d..1917e695927 100644
--- a/engines/nancy/state/map.h
+++ b/engines/nancy/state/map.h
@@ -49,7 +49,8 @@ public:
virtual ~Map() = default;
void process() override;
- void onStateExit() override;
+ void onStateEnter(const NancyState::NancyState prevState) override;
+ bool onStateExit(const NancyState::NancyState nextState) override;
const SoundDescription &getSound();
@@ -66,8 +67,8 @@ protected:
void playVideo() { _decoder.start(); }
void unloadVideo() { _decoder.close(); }
- private:
AVFDecoder _decoder;
+ private:
};
virtual void init() = 0;
@@ -119,7 +120,7 @@ private:
void run() override;
void registerGraphics() override;
- void onStateExit() override;
+ bool onStateExit(const NancyState::NancyState nextState) override;
MapGlobe _globe;
UI::ViewportOrnaments _ornaments;
@@ -136,7 +137,7 @@ private:
void run() override;
void registerGraphics() override;
- void onStateExit() override;
+ bool onStateExit(const NancyState::NancyState next) override;
UI::Button *_button;
};
diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index 8d316dc7afa..0a18eea9c6e 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -153,7 +153,7 @@ void Scene::process() {
}
}
-void Scene::onStateEnter() {
+void Scene::onStateEnter(const NancyState::NancyState prevState) {
if (_state != kInit) {
registerGraphics();
_actionManager.onPause(false);
@@ -174,11 +174,18 @@ void Scene::onStateEnter() {
}
}
-void Scene::onStateExit() {
+bool Scene::onStateExit(const NancyState::NancyState nextState) {
_timers.pushedPlayTime = g_nancy->getTotalPlayTime();
_actionManager.onPause(true);
pauseSceneSpecificSounds();
_gameStateRequested = NancyState::kNone;
+
+ // Re-register the clock so the open/close animation can continue playing inside Map
+ if (nextState == NancyState::kMap && g_nancy->getGameType() == kGameTypeVampire) {
+ _clock->registerGraphics();
+ }
+
+ return false;
}
void Scene::changeScene(uint16 id, uint16 frame, uint16 verticalOffset, byte continueSceneSound, int8 paletteID) {
diff --git a/engines/nancy/state/scene.h b/engines/nancy/state/scene.h
index ee60c2add70..be9ae172955 100644
--- a/engines/nancy/state/scene.h
+++ b/engines/nancy/state/scene.h
@@ -120,8 +120,8 @@ public:
// State API
void process() override;
- void onStateEnter() override;
- void onStateExit() override;
+ void onStateEnter(const NancyState::NancyState prevState) override;
+ bool onStateExit(const NancyState::NancyState nextState) override;
void changeScene(uint16 id, uint16 frame, uint16 verticalOffset, byte continueSceneSound, int8 paletteID = -1);
void changeScene(const SceneChangeDescription &sceneDescription);
diff --git a/engines/nancy/state/state.h b/engines/nancy/state/state.h
index 4db418aa74f..08095ea1657 100644
--- a/engines/nancy/state/state.h
+++ b/engines/nancy/state/state.h
@@ -22,6 +22,9 @@
#ifndef NANCY_STATE_STATE_H
#define NANCY_STATE_STATE_H
+#include "engines/nancy/commontypes.h"
+#include "common/singleton.h"
+
namespace Nancy {
namespace State {
@@ -32,8 +35,10 @@ public:
virtual ~State() {};
virtual void process() = 0;
- virtual void onStateEnter() {}
- virtual void onStateExit() {}
+ virtual void onStateEnter(const NancyState::NancyState prevState) {}
+
+ // Return true when the state needs to be destroyed
+ virtual bool onStateExit(const NancyState::NancyState nextState) { return false; }
};
} // End of namespace State
Commit: 4b3b81eb520f8a88cb05263f8b63126f50bb0d4a
https://github.com/scummvm/scummvm/commit/4b3b81eb520f8a88cb05263f8b63126f50bb0d4a
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:17+03:00
Commit Message:
NANCY: Change where states are entered and exited
Moved the calls to onStateEnter() and onStateExit() inside the main game
loop.
Changed paths:
engines/nancy/nancy.cpp
engines/nancy/nancy.h
diff --git a/engines/nancy/nancy.cpp b/engines/nancy/nancy.cpp
index 7e76e249bb2..760e50eba11 100644
--- a/engines/nancy/nancy.cpp
+++ b/engines/nancy/nancy.cpp
@@ -219,8 +219,6 @@ void NancyEngine::setState(NancyState::NancyState state, NancyState::NancyState
break;
}
- _graphicsManager->clearObjects();
-
if (overridePrevious != NancyState::kNone) {
_gameFlow.prevState = overridePrevious;
} else {
@@ -228,22 +226,7 @@ void NancyEngine::setState(NancyState::NancyState state, NancyState::NancyState
}
_gameFlow.curState = state;
-
- bool shouldDestroyLastState = false;
-
- State::State *s = getStateObject(_gameFlow.prevState);
- if (s) {
- shouldDestroyLastState = s->onStateExit(_gameFlow.curState);
- }
-
- s = getStateObject(_gameFlow.curState);
- if (s) {
- s->onStateEnter(_gameFlow.prevState);
- }
-
- if (shouldDestroyLastState) {
- destroyState(_gameFlow.prevState);
- }
+ _gameFlow.changingState = true;
}
void NancyEngine::setToPreviousState() {
@@ -274,12 +257,34 @@ Common::Error NancyEngine::run() {
_cursorManager->setCursorType(CursorManager::kNormalArrow);
_input->processEvents();
- State::State *s = getStateObject(_gameFlow.curState);
+ State::State *s;
+
+ if (_gameFlow.changingState) {
+ s = getStateObject(_gameFlow.curState);
+ if (s) {
+ s->onStateEnter(_gameFlow.curState);
+ }
+
+ _gameFlow.changingState = false;
+ }
+
+ s = getStateObject(_gameFlow.curState);
if (s) {
s->process();
}
-
+
_graphicsManager->draw();
+
+ if (_gameFlow.changingState) {
+ _graphicsManager->clearObjects();
+
+ s = getStateObject(_gameFlow.prevState);
+ if (s) {
+ if(s->onStateExit(_gameFlow.prevState)) {
+ destroyState(_gameFlow.prevState);
+ }
+ }
+ }
_system->updateScreen();
_system->delayMillis(16);
diff --git a/engines/nancy/nancy.h b/engines/nancy/nancy.h
index 9903185a71b..9c4f3b0b513 100644
--- a/engines/nancy/nancy.h
+++ b/engines/nancy/nancy.h
@@ -133,6 +133,7 @@ private:
struct GameFlow {
NancyState::NancyState curState = NancyState::kNone;
NancyState::NancyState prevState = NancyState::kNone;
+ bool changingState = true;
};
void bootGameEngine();
Commit: 3e63de4aeca0c037340fbaee61c0f2be86de44e0
https://github.com/scummvm/scummvm/commit/3e63de4aeca0c037340fbaee61c0f2be86de44e0
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-04-06T18:17:17+03:00
Commit Message:
NANCY: Implement UI button time delay
Added a time delay to the Menu and Help buttons as defined in the
boot summary. Also made the Help screen button use the same
time delay, instead of waiting for the sound.
Changed paths:
engines/nancy/enginedata.cpp
engines/nancy/enginedata.h
engines/nancy/state/help.cpp
engines/nancy/state/help.h
engines/nancy/state/scene.cpp
engines/nancy/state/scene.h
engines/nancy/ui/button.cpp
diff --git a/engines/nancy/enginedata.cpp b/engines/nancy/enginedata.cpp
index d3903c2a796..61cbdb806e8 100644
--- a/engines/nancy/enginedata.cpp
+++ b/engines/nancy/enginedata.cpp
@@ -73,8 +73,7 @@ BSUM::BSUM(Common::SeekableReadStream *chunkStream) {
s.skip(0x1A, kGameTypeVampire, kGameTypeVampire);
s.skip(0x1C, kGameTypeNancy1);
s.syncAsSint16LE(playerTimeMinuteLength);
-
- s.skip(2);
+ s.syncAsUint16LE(buttonPressTimeDelay);
s.syncAsByte(overrideMovementTimeDeltas);
s.syncAsSint16LE(slowMovementTimeDelta);
s.syncAsSint16LE(fastMovementTimeDelta);
diff --git a/engines/nancy/enginedata.h b/engines/nancy/enginedata.h
index 11aa163ae2b..5227adb8513 100644
--- a/engines/nancy/enginedata.h
+++ b/engines/nancy/enginedata.h
@@ -51,6 +51,7 @@ struct BSUM {
uint16 verticalEdgesSize;
uint16 playerTimeMinuteLength;
+ uint16 buttonPressTimeDelay;
byte overrideMovementTimeDeltas;
uint16 slowMovementTimeDelta;
uint16 fastMovementTimeDelta;
diff --git a/engines/nancy/state/help.cpp b/engines/nancy/state/help.cpp
index 9c049667314..1a4204877d5 100644
--- a/engines/nancy/state/help.cpp
+++ b/engines/nancy/state/help.cpp
@@ -56,8 +56,8 @@ void Help::process() {
case kRun:
run();
break;
- case kWaitForSound:
- waitForSound();
+ case kWait:
+ wait();
break;
}
}
@@ -111,13 +111,13 @@ void Help::run() {
if (_button->_isClicked) {
_button->_isClicked = false;
g_nancy->_sound->playSound("BUOK");
- _state = kWaitForSound;
+ _buttonPressActivationTime = g_system->getMillis() + g_nancy->_bootSummary->buttonPressTimeDelay;
+ _state = kWait;
}
}
-void Help::waitForSound() {
- if (!g_nancy->_sound->isSoundPlaying("BUOK")) {
- g_nancy->_sound->stopSound("BUOK");
+void Help::wait() {
+ if (g_system->getMillis() > _buttonPressActivationTime) {
g_nancy->setToPreviousState();
}
}
diff --git a/engines/nancy/state/help.h b/engines/nancy/state/help.h
index 9ee5632e72e..bd4e3aa4fd0 100644
--- a/engines/nancy/state/help.h
+++ b/engines/nancy/state/help.h
@@ -40,7 +40,7 @@ namespace State {
class Help : public State, public Common::Singleton<Help> {
public:
- enum State { kInit, kBegin, kRun, kWaitForSound };
+ enum State { kInit, kBegin, kRun, kWait };
Help();
virtual ~Help();
@@ -53,11 +53,12 @@ private:
void init();
void begin();
void run();
- void waitForSound();
+ void wait();
State _state;
UI::FullScreenImage _image;
UI::Button *_button;
+ Time _buttonPressActivationTime;
};
#define NancyHelpState Nancy::State::Help::instance()
diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index 0a18eea9c6e..0ab67a713b5 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -717,9 +717,14 @@ void Scene::handleInput() {
_menuButton->handleInput(input);
if (_menuButton->_isClicked) {
- _menuButton->_isClicked = false;
- g_nancy->_sound->playSound("BUOK");
- requestStateChange(NancyState::kMainMenu);
+ if (_buttonPressActivationTime == 0) {
+ g_nancy->_sound->playSound("BUOK");
+ _buttonPressActivationTime = g_system->getMillis() + g_nancy->_bootSummary->buttonPressTimeDelay;
+ } else if (g_system->getMillis() > _buttonPressActivationTime) {
+ _menuButton->_isClicked = false;
+ requestStateChange(NancyState::kMainMenu);
+ _buttonPressActivationTime = 0;
+ }
}
}
@@ -727,9 +732,14 @@ void Scene::handleInput() {
_helpButton->handleInput(input);
if (_helpButton->_isClicked) {
- _helpButton->_isClicked = false;
- g_nancy->_sound->playSound("BUOK");
- requestStateChange(NancyState::kHelp);
+ if (_buttonPressActivationTime == 0) {
+ g_nancy->_sound->playSound("BUOK");
+ _buttonPressActivationTime = g_system->getMillis() + g_nancy->_bootSummary->buttonPressTimeDelay;
+ } else if (g_system->getMillis() > _buttonPressActivationTime) {
+ _helpButton->_isClicked = false;
+ requestStateChange(NancyState::kHelp);
+ _buttonPressActivationTime = 0;
+ }
}
}
}
diff --git a/engines/nancy/state/scene.h b/engines/nancy/state/scene.h
index be9ae172955..208447fa22e 100644
--- a/engines/nancy/state/scene.h
+++ b/engines/nancy/state/scene.h
@@ -251,6 +251,7 @@ private:
UI::Button *_menuButton;
UI::Button *_helpButton;
+ Time _buttonPressActivationTime;
UI::ViewportOrnaments *_viewportOrnaments;
UI::TextboxOrnaments *_textboxOrnaments;
diff --git a/engines/nancy/ui/button.cpp b/engines/nancy/ui/button.cpp
index 06d7903d849..c83d613a8e8 100644
--- a/engines/nancy/ui/button.cpp
+++ b/engines/nancy/ui/button.cpp
@@ -41,7 +41,7 @@ Button::Button(uint16 zOrder, Graphics::ManagedSurface &surface, const Common::R
}
void Button::handleInput(NancyInput &input) {
- if (!_isClicked && _screenPosition.contains(input.mousePos)) {
+ if (_screenPosition.contains(input.mousePos)) {
g_nancy->_cursorManager->setCursorType(CursorManager::kHotspotArrow);
if (input.input & NancyInput::kLeftMouseButtonUp) {
More information about the Scummvm-git-logs
mailing list