[Scummvm-git-logs] scummvm master -> 2dea1e4730dd02e9a222d1a946b2fb9a432d3142

fracturehill noreply at scummvm.org
Sun Mar 26 08:45:10 UTC 2023


This automated email contains information about 22 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
eb56374dd9 NANCY: Do not pause map music when switching back to map
c1fe024206 NANCY: Remove unused debug shortcut keymaps
7b572e378c NANCY: Make sure menu sound is loaded on startup
8665aa3b4f NANCY: Remove nonsense comment
160910cb0d NANCY: Correctly add item back to inventory after use
2aee2d301f DEVTOOLS: create_nancy fixes
6be1e25ef8 NANCY: Implement RemoveInventoryNoHS action record
2bdb15c4dd NANCY: Change base class of HotMultiframeMultisceneChange
a3f7a13a70 NANCY: Fix certain flag checks in primary video
79d3d248cf NANCY: Do not unload persistent sounds
438fc14ee3 NANCY: Add support for start and end frame in primary video
5127a513fc NANCY: Set correct event flag trigger for TVD map
5b9b6b5ba3 NANCY: Implement lightning in TVD endgame
5097e10b56 NANCY: Correct viewport scrolling hotspots activation
3157da3f28 NANCY: Fix thunder sound playing in every scene
1ee352bfc8 NANCY: Add support for empty videos in secondary movie
13b2e82b6c NANCY: Disable mouse input while cursor is invisible
c246c5cdd9 NANCY: Correct scaled blitting
87fcd3c93d NANCY: Add support for small format secondary video
75607c519c NANCY: Correctly advance primary video with no valid responses
6c28de7698 NANCY: Make second chance always active
2dea1e4730 NANCY: Improve engine settings


Commit: eb56374dd9a44adb678e437c098d57090856fbc8
    https://github.com/scummvm/scummvm/commit/eb56374dd9a44adb678e437c098d57090856fbc8
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:56+03:00

Commit Message:
NANCY: Do not pause map music when switching back to map

Changed paths:
    engines/nancy/state/scene.cpp


diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index 424abc05a56..957a625fef7 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -211,8 +211,7 @@ void Scene::popScene() {
 }
 
 void Scene::pauseSceneSpecificSounds() {
-	if (g_nancy->getGameType() == kGameTypeVampire && Nancy::State::Map::hasInstance()) {
-		// Don't stop the map sound in certain scenes
+	if (g_nancy->getGameType() == kGameTypeVampire && Nancy::State::Map::hasInstance() && g_nancy->getState() != NancyState::kMap) {
 		uint currentScene = _sceneState.currentScene.sceneID;
 		if (currentScene == 0 || (currentScene >= 15 && currentScene <= 27)) {
 			g_nancy->_sound->pauseSound(NancyMapState.getSound(), true);
@@ -226,7 +225,6 @@ void Scene::pauseSceneSpecificSounds() {
 
 void Scene::unpauseSceneSpecificSounds() {
 	if (g_nancy->getGameType() == kGameTypeVampire && Nancy::State::Map::hasInstance()) {
-		// Don't stop the map sound in certain scenes
 		uint currentScene = _sceneState.currentScene.sceneID;
 		if (currentScene == 0 || (currentScene >= 15 && currentScene <= 27)) {
 			g_nancy->_sound->pauseSound(NancyMapState.getSound(), false);


Commit: c1fe024206b0e2aa7ee5036cf9559ae1b2c856df
    https://github.com/scummvm/scummvm/commit/c1fe024206b0e2aa7ee5036cf9559ae1b2c856df
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:56+03:00

Commit Message:
NANCY: Remove unused debug shortcut keymaps

Changed paths:
    engines/nancy/input.cpp
    engines/nancy/input.h


diff --git a/engines/nancy/input.cpp b/engines/nancy/input.cpp
index 092f3d32ff9..86b119c8b45 100644
--- a/engines/nancy/input.cpp
+++ b/engines/nancy/input.cpp
@@ -151,7 +151,6 @@ void InputManager::initKeymaps(Common::KeymapArray &keymaps) {
 	using namespace Nancy;
 
 	Keymap *mainKeymap = new Keymap(Keymap::kKeymapTypeGame, "nancy-main", "Nancy Drew");
-	Keymap *debugKeymap = new Keymap(Keymap::kKeymapTypeGame, "nancy-debug", "Nancy Drew - Debug/Cheat Shortcuts");
 	Action *act;
 
 	act = new Action(kStandardActionLeftClick, _("Left Click Interact"));
@@ -198,51 +197,7 @@ void InputManager::initKeymaps(Common::KeymapArray &keymaps) {
 	act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
 	mainKeymap->addAction(act);
 
-	// Debug shortcuts
-
-	act = new Action("FASTC", _("Toggle fast conversation mode"));
-	act->setCustomEngineActionEvent(kNancyActionFastConvoToggle);
-	act->addDefaultInputMapping("C+S+TAB+f");
-	debugKeymap->addAction(act);
-
-	act = new Action("ENDC", _("Toggle end conversation mode"));
-	act->setCustomEngineActionEvent(kNancyActionEndConvoToggle);
-	act->addDefaultInputMapping("C+S+TAB+e");
-	debugKeymap->addAction(act);
-
-	act = new Action("MMENU", _("Go to main menu"));
-	act->setCustomEngineActionEvent(kNancyActionRequestMainMenu);
-	act->addDefaultInputMapping("C+S+TAB+F2");
-	debugKeymap->addAction(act);
-
-	act = new Action("LDSV", _("Go to save/load menu"));
-	act->setCustomEngineActionEvent(kNancyActionRequestSaveLoad);
-	act->addDefaultInputMapping("C+S+TAB+F3");
-	debugKeymap->addAction(act);
-
-	act = new Action("RLDSV", _("Reload last save"));
-	act->setCustomEngineActionEvent(kNancyActionReloadSave);
-	act->addDefaultInputMapping("C+S+TAB+F4");
-	debugKeymap->addAction(act);
-
-	act = new Action("SETUP", _("Go to setup menu"));
-	act->setCustomEngineActionEvent(kNancyActionRequestSetupMenu);
-	act->addDefaultInputMapping("C+S+TAB+F6");
-	debugKeymap->addAction(act);
-
-	act = new Action("CRED", _("Show credits"));
-	act->setCustomEngineActionEvent(kNancyActionRequestCredits);
-	act->addDefaultInputMapping("C+S+TAB+F7");
-	debugKeymap->addAction(act);
-
-	act = new Action("MAP", _("Go to map screen"));
-	act->setCustomEngineActionEvent(kNancyActionRequestMap);
-	act->addDefaultInputMapping("C+S+TAB+F8");
-	act->addDefaultInputMapping("C+S+TAB+m");
-	debugKeymap->addAction(act);
-
 	keymaps.push_back(mainKeymap);
-	keymaps.push_back(debugKeymap);
 }
 
 } // End of namespace Nancy
diff --git a/engines/nancy/input.h b/engines/nancy/input.h
index 229d8d39065..fbf090eee4b 100644
--- a/engines/nancy/input.h
+++ b/engines/nancy/input.h
@@ -75,15 +75,7 @@ enum NancyAction {
 	kNancyActionMoveRight,
 	kNancyActionMoveFast,
 	kNancyActionLeftClick,
-	kNancyActionRightClick,
-	kNancyActionFastConvoToggle,
-	kNancyActionEndConvoToggle,
-	kNancyActionReloadSave,
-	kNancyActionRequestMainMenu,
-	kNancyActionRequestSaveLoad,
-	kNancyActionRequestSetupMenu,
-	kNancyActionRequestCredits,
-	kNancyActionRequestMap
+	kNancyActionRightClick
 };
 
 public:


Commit: 7b572e378c986a80b2095c8cdd808bc522eb1ddd
    https://github.com/scummvm/scummvm/commit/7b572e378c986a80b2095c8cdd808bc522eb1ddd
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:56+03:00

Commit Message:
NANCY: Make sure menu sound is loaded on startup

Changed paths:
    engines/nancy/sound.cpp


diff --git a/engines/nancy/sound.cpp b/engines/nancy/sound.cpp
index f835ba7a174..0af85e6e6fc 100644
--- a/engines/nancy/sound.cpp
+++ b/engines/nancy/sound.cpp
@@ -268,12 +268,12 @@ void SoundManager::loadCommonSounds() {
 		}
 	}
 
-	// Menu sound is special since it's stored differently and can be
-	// unloaded and loaded again
+	// Menu sound is stored differently
 	chunk = g_nancy->getBootChunkStream("MSND"); // channel 28
 	if (chunk) {
 		SoundDescription &desc = _commonSounds.getOrCreateVal("MSND");
 		desc.read(*chunk, SoundDescription::kMenu);
+		g_nancy->_sound->loadSound(desc);
 	}
 }
 


Commit: 8665aa3b4f03aa92beeada58fdbbc1d9f38954d9
    https://github.com/scummvm/scummvm/commit/8665aa3b4f03aa92beeada58fdbbc1d9f38954d9
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:57+03:00

Commit Message:
NANCY: Remove nonsense comment

Changed paths:
    engines/nancy/sound.cpp


diff --git a/engines/nancy/sound.cpp b/engines/nancy/sound.cpp
index 0af85e6e6fc..9a567bd664c 100644
--- a/engines/nancy/sound.cpp
+++ b/engines/nancy/sound.cpp
@@ -404,7 +404,6 @@ void SoundManager::stopSound(const Common::String &chunkName) {
 	stopSound(_commonSounds[chunkName]);
 }
 
-// Returns whether the exception was skipped
 void SoundManager::stopAllSounds() {
 	for (uint i = 0; i < 31; ++i) {
 		stopSound(i);


Commit: 160910cb0dfbcd4c184aa64cb44903b229783e11
    https://github.com/scummvm/scummvm/commit/160910cb0dfbcd4c184aa64cb44903b229783e11
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:58+03:00

Commit Message:
NANCY: Correctly add item back to inventory after use

Fixed an issue where a used item would be visibly added to the
inventory, but not to the underlying flag array.

Changed paths:
    engines/nancy/action/actionmanager.cpp
    engines/nancy/ui/inventorybox.h


diff --git a/engines/nancy/action/actionmanager.cpp b/engines/nancy/action/actionmanager.cpp
index 9b01acbb611..faa2703f0ad 100644
--- a/engines/nancy/action/actionmanager.cpp
+++ b/engines/nancy/action/actionmanager.cpp
@@ -78,7 +78,7 @@ void ActionManager::handleInput(NancyInput &input) {
 					// Re-add the object to the inventory unless it's marked as a one-time use
 					if (rec->_itemRequired == heldItem && rec->_itemRequired != -1) {
 						if (NancySceneState.getInventoryBox().getItemDescription(heldItem).keepItem == kInvItemKeepAlways) {
-							NancySceneState.getInventoryBox().addItem(heldItem);
+							NancySceneState.addItemToInventory(heldItem);
 						}
 
 						NancySceneState.setHeldItem(-1);
diff --git a/engines/nancy/ui/inventorybox.h b/engines/nancy/ui/inventorybox.h
index 60f9484fc17..1511b657fe2 100644
--- a/engines/nancy/ui/inventorybox.h
+++ b/engines/nancy/ui/inventorybox.h
@@ -57,15 +57,15 @@ public:
 	void registerGraphics() override;
 	void handleInput(NancyInput &input);
 
-	// To be called from Scene
-	void addItem(int16 itemID);
-	void removeItem(int16 itemID);
-
 	ItemDescription getItemDescription(uint id) const { return _itemDescriptions[id]; }
 
 	void onScrollbarMove();
 
 private:
+	// These are private since they should only be called from Scene
+	void addItem(int16 itemID);
+	void removeItem(int16 itemID);
+
 	void onReorder();
 	void setHotspots(uint pageNr);
 


Commit: 2aee2d301ff5096b10ac40df747211dd6ddaea0a
    https://github.com/scummvm/scummvm/commit/2aee2d301ff5096b10ac40df747211dd6ddaea0a
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:58+03:00

Commit Message:
DEVTOOLS: create_nancy fixes

Fixed a conditional dialogue with a wrong item condition and added
a missing comma.

Changed paths:
    devtools/create_nancy/tvd_data.h


diff --git a/devtools/create_nancy/tvd_data.h b/devtools/create_nancy/tvd_data.h
index cb931d88f04..05809bf3e5d 100644
--- a/devtools/create_nancy/tvd_data.h
+++ b/devtools/create_nancy/tvd_data.h
@@ -72,7 +72,7 @@ const Common::Array<Common::Array<ConditionalDialogue>> _tvdConditionalDialogue
         { { 0x4A, kTrue }, { 0x52, kFalse }, { 0x11, kFalse } },
         { { 0x3, kFalse } } },
     {   10, 750, "FIC_10",
-        { { 0x21, kTrue }, { 0xE, kTrue } },
+        { { 0x21, kTrue }, { 0xE, kFalse } },
         { { 0x9, kTrue } } },
     {   9, 749, "FIC_11",
         { { 0x21, kTrue }, { 0x5D, kFalse } },
@@ -434,7 +434,7 @@ const Common::Array<Common::Array<const char *>> _tvdConditionalDialogueTexts =
     "<c1>W<c0>ould you know how I could get an owl feather?<h><n>",
     "<c1>H<c0>ow could I get Mr. Richards to lend me his new dagger?<h><n>",
     // 70
-    "<c1>D<c0>o you know where I could find a black candle, Aunt Judith?<h><n>"
+    "<c1>D<c0>o you know where I could find a black candle, Aunt Judith?<h><n>",
     "<c1>D<c0>o you remember the old ghost story about Adelaide Chambers, Aunt Judith? A book in the library says she was buried with gold. Do you think it's true?<h><n>",
     "<c1>I<c0> want to buy something from the art gallery, Aunt Judith. Can you help me?<h><n>",
     "<c1>D<c0>o you know anything about runes, Aunt Judith? Bonnie said one of her's is missing and I'd like to get her another one.<h><n>",


Commit: 6be1e25ef86914d9437f0c863052f4815b103c19
    https://github.com/scummvm/scummvm/commit/6be1e25ef86914d9437f0c863052f4815b103c19
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:59+03:00

Commit Message:
NANCY: Implement RemoveInventoryNoHS action record

Changed paths:
    engines/nancy/action/recordtypes.cpp
    engines/nancy/action/recordtypes.h


diff --git a/engines/nancy/action/recordtypes.cpp b/engines/nancy/action/recordtypes.cpp
index 7729a7ad36c..ce9f0673ea9 100644
--- a/engines/nancy/action/recordtypes.cpp
+++ b/engines/nancy/action/recordtypes.cpp
@@ -426,7 +426,15 @@ void AddInventoryNoHS::execute() {
 }
 
 void RemoveInventoryNoHS::readData(Common::SeekableReadStream &stream) {
-	stream.skip(2);
+	_itemID = stream.readUint16LE();
+}
+
+void RemoveInventoryNoHS::execute() {
+	if (NancySceneState.hasItem(_itemID) == kInvHolding) {
+		NancySceneState.removeItemFromInventory(_itemID, false);
+	}
+
+	_isDone = true;
 }
 
 void DifficultyLevel::readData(Common::SeekableReadStream &stream) {
diff --git a/engines/nancy/action/recordtypes.h b/engines/nancy/action/recordtypes.h
index 33fa05e23c0..9fa58fe8655 100644
--- a/engines/nancy/action/recordtypes.h
+++ b/engines/nancy/action/recordtypes.h
@@ -291,9 +291,12 @@ protected:
 	Common::String getRecordTypeName() const override { return "AddInventoryNoHS"; }
 };
 
-class RemoveInventoryNoHS : public Unimplemented {
+class RemoveInventoryNoHS : public ActionRecord {
 public:
 	void readData(Common::SeekableReadStream &stream) override;
+	void execute() override;
+
+	uint _itemID;
 
 protected:
 	Common::String getRecordTypeName() const override { return "RemoveInventoryNoHS"; }


Commit: 2bdb15c4dde057373faa9e589b2445f550a26318
    https://github.com/scummvm/scummvm/commit/2bdb15c4dde057373faa9e589b2445f550a26318
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:59+03:00

Commit Message:
NANCY: Change base class of HotMultiframeMultisceneChange

Changed paths:
    engines/nancy/action/recordtypes.h


diff --git a/engines/nancy/action/recordtypes.h b/engines/nancy/action/recordtypes.h
index 9fa58fe8655..bd158ccd7d9 100644
--- a/engines/nancy/action/recordtypes.h
+++ b/engines/nancy/action/recordtypes.h
@@ -76,7 +76,7 @@ protected:
 	Common::String getRecordTypeName() const override { return "Hot1FrExitSceneChange"; }
 };
 
-class HotMultiframeMultisceneChange : public Unimplemented {
+class HotMultiframeMultisceneChange : public ActionRecord {
 public:
 	void readData(Common::SeekableReadStream &stream) override;
 	void execute() override;


Commit: a3f7a13a70ab1bb1ebd2fbe7f4e9e3e7291b2c82
    https://github.com/scummvm/scummvm/commit/a3f7a13a70ab1bb1ebd2fbe7f4e9e3e7291b2c82
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:43:59+03:00

Commit Message:
NANCY: Fix certain flag checks in primary video

Fixed an issue where if an inventory/event flag gets changed in the same
scene as a primary video, that primary video wouldn't be affected
by the changes and could serve incorrect responses. This fixes
scene 750 in The Vampire Diaries.

Changed paths:
    engines/nancy/action/primaryvideo.cpp


diff --git a/engines/nancy/action/primaryvideo.cpp b/engines/nancy/action/primaryvideo.cpp
index 21954b95d20..df2dff94338 100644
--- a/engines/nancy/action/primaryvideo.cpp
+++ b/engines/nancy/action/primaryvideo.cpp
@@ -283,8 +283,11 @@ void PlayPrimaryVideoChan0::execute() {
 
 		_state = kRun;
 		NancySceneState.setActivePrimaryVideo(this);
+
+		// Do not fall through to give the execution one loop for event flag changes
+		// This fixes TVD scene 750
+		break;
 	}
-		// fall through
 	case kRun:
 		if (!_hasDrawnTextbox) {
 			_hasDrawnTextbox = true;


Commit: 79d3d248cf7494454ff7d0355511955c15b152f8
    https://github.com/scummvm/scummvm/commit/79d3d248cf7494454ff7d0355511955c15b152f8
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:00+03:00

Commit Message:
NANCY: Do not unload persistent sounds

Persistent sounds no longer get unloaded when calling stopSound().

Changed paths:
    engines/nancy/sound.cpp
    engines/nancy/sound.h


diff --git a/engines/nancy/sound.cpp b/engines/nancy/sound.cpp
index 9a567bd664c..ea70d503183 100644
--- a/engines/nancy/sound.cpp
+++ b/engines/nancy/sound.cpp
@@ -265,6 +265,7 @@ void SoundManager::loadCommonSounds() {
 			SoundDescription &desc = _commonSounds.getOrCreateVal(s);
 			desc.read(*chunk, SoundDescription::kNormal);
 			g_nancy->_sound->loadSound(desc);
+			_channels[desc.channelID].isPersistent = true;
 		}
 	}
 
@@ -274,6 +275,7 @@ void SoundManager::loadCommonSounds() {
 		SoundDescription &desc = _commonSounds.getOrCreateVal("MSND");
 		desc.read(*chunk, SoundDescription::kMenu);
 		g_nancy->_sound->loadSound(desc);
+		_channels[desc.channelID].isPersistent = true;
 	}
 }
 
@@ -389,9 +391,13 @@ void SoundManager::stopSound(uint16 channelID) {
 	if (isSoundPlaying(channelID)) {
 		_mixer->stopHandle(chan.handle);
 	}
-	chan.name = Common::String();
-	delete chan.stream;
-	chan.stream = nullptr;
+
+	// Persistent sounds only stop playing but do not get unloaded
+	if (!chan.isPersistent) {
+		chan.name = Common::String();
+		delete chan.stream;
+		chan.stream = nullptr;
+	}
 }
 
 void SoundManager::stopSound(const SoundDescription &description) {
diff --git a/engines/nancy/sound.h b/engines/nancy/sound.h
index 9f9f3f9eca2..5242210c941 100644
--- a/engines/nancy/sound.h
+++ b/engines/nancy/sound.h
@@ -84,6 +84,7 @@ protected:
 		bool isPanning = false;
 		Audio::SeekableAudioStream *stream = nullptr;
 		Audio::SoundHandle handle;
+		bool isPersistent = false;
 	};
 
 	void initSoundChannels();


Commit: 438fc14ee391f1746a83b0b47a16cd002d5677e1
    https://github.com/scummvm/scummvm/commit/438fc14ee391f1746a83b0b47a16cd002d5677e1
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:00+03:00

Commit Message:
NANCY: Add support for start and end frame in primary video

This fixes a couple of primary videos in The Vampire Diaries.

Changed paths:
    engines/nancy/action/primaryvideo.cpp
    engines/nancy/action/primaryvideo.h


diff --git a/engines/nancy/action/primaryvideo.cpp b/engines/nancy/action/primaryvideo.cpp
index df2dff94338..b11c5422f00 100644
--- a/engines/nancy/action/primaryvideo.cpp
+++ b/engines/nancy/action/primaryvideo.cpp
@@ -127,6 +127,8 @@ void PlayPrimaryVideoChan0::init() {
 		error("Couldn't load video file %s", _videoName.c_str());
 	}
 
+	_decoder.seekToFrame(_startFrame);
+
 	if (!_paletteName.empty()) {
 		GraphicsManager::loadSurfacePalette(_drawSurface, _paletteName);
 		setTransparent(true);
@@ -146,6 +148,10 @@ void PlayPrimaryVideoChan0::updateGraphics() {
 		_decoder.start();
 	}
 
+	if (_decoder.getCurFrame() == _endFrame) {
+		_decoder.pauseVideo(true);
+	}
+
 	if (_decoder.needsUpdate()) {
 		GraphicsManager::copyToManaged(*_decoder.decodeNextFrame(), _drawSurface, _videoFormat == 1);
 
@@ -175,8 +181,11 @@ void PlayPrimaryVideoChan0::readData(Common::SeekableReadStream &stream) {
 
 	ser.skip(2);
 	ser.syncAsUint16LE(_videoFormat);
-	ser.skip(0x13, kGameTypeVampire, kGameTypeVampire);
-	ser.skip(0xF, kGameTypeNancy1);
+	ser.skip(3); // Quality
+	ser.skip(4, kGameTypeVampire, kGameTypeVampire); // paletteStart, paletteSize
+	ser.syncAsUint16LE(_startFrame);
+	ser.syncAsUint16LE(_endFrame);
+	ser.skip(8);
 
 	ser.skip(0x10); // Bounds
 	readRect(stream, _screenPosition);
@@ -193,10 +202,8 @@ void PlayPrimaryVideoChan0::readData(Common::SeekableReadStream &stream) {
 	ser.syncAsByte(_goodbyeResponseCharacterID);
 	ser.syncAsByte(_defaultNextScene);
 	ser.syncAsByte(_popNextScene);
-	_sceneChange.readData(stream);
-
-	ser.skip(0x35, kGameTypeVampire, kGameTypeVampire);
-	ser.skip(0x32, kGameTypeNancy1);
+	_sceneChange.readData(stream, ser.getVersion() == kGameTypeVampire);
+	ser.skip(0x32);
 
 	uint16 numResponses = 0;
 	ser.syncAsUint16LE(numResponses);
@@ -316,7 +323,7 @@ void PlayPrimaryVideoChan0::execute() {
 			}
 		}
 
-		if (!g_nancy->_sound->isSoundPlaying(_sound) && _decoder.endOfVideo()) {
+		if (!g_nancy->_sound->isSoundPlaying(_sound) && (_decoder.endOfVideo() || _decoder.getCurFrame() == _endFrame)) {
 			g_nancy->_sound->stopSound(_sound);
 
 			if (_responses.size() == 0) {
diff --git a/engines/nancy/action/primaryvideo.h b/engines/nancy/action/primaryvideo.h
index 501556bd792..2e7d7054c1e 100644
--- a/engines/nancy/action/primaryvideo.h
+++ b/engines/nancy/action/primaryvideo.h
@@ -102,6 +102,9 @@ public:
 	SoundDescription _sound;
 	SoundDescription _responseGenericSound;
 
+	uint16 _startFrame = 0;
+	int16 _endFrame = 0;
+
 	byte _conditionalResponseCharacterID = 0;
 	byte _goodbyeResponseCharacterID = 0;
 	byte _defaultNextScene = kDefaultNextSceneEnabled;


Commit: 5127a513fc36ba156c6dc9b594e05cdbd4cd92e1
    https://github.com/scummvm/scummvm/commit/5127a513fc36ba156c6dc9b594e05cdbd4cd92e1
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:00+03:00

Commit Message:
NANCY: Set correct event flag trigger for TVD map

Changed paths:
    engines/nancy/state/map.cpp


diff --git a/engines/nancy/state/map.cpp b/engines/nancy/state/map.cpp
index c6bfea97a55..519ed3d73f8 100644
--- a/engines/nancy/state/map.cpp
+++ b/engines/nancy/state/map.cpp
@@ -251,7 +251,7 @@ void TVDMap::load() {
 	Map::load();
 
 	// Determine which version of the map will be shown
-	if (NancySceneState.getEventFlag(52, kEvOccurred)) {
+	if (NancySceneState.getEventFlag(82, kEvOccurred)) {
 		_mapID = 3;										// Storm
 		//
 	} else {


Commit: 5b9b6b5ba316b8bc26e6ed52e24468069e73fa31
    https://github.com/scummvm/scummvm/commit/5b9b6b5ba316b8bc26e6ed52e24468069e73fa31
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:01+03:00

Commit Message:
NANCY: Implement lightning in TVD endgame

Decoupled lightning from the LightningOn action record and
implemented the logic for it to be activated during the endgame
section of The Vampire Diaries.

Changed paths:
  A engines/nancy/misc/lightning.cpp
  A engines/nancy/misc/lightning.h
  R engines/nancy/action/lightning.cpp
  R engines/nancy/action/lightning.h
    engines/nancy/action/arfactory.cpp
    engines/nancy/action/recordtypes.cpp
    engines/nancy/action/recordtypes.h
    engines/nancy/module.mk
    engines/nancy/state/scene.cpp
    engines/nancy/state/scene.h


diff --git a/engines/nancy/action/arfactory.cpp b/engines/nancy/action/arfactory.cpp
index 10cd067a177..d99e77c5578 100644
--- a/engines/nancy/action/arfactory.cpp
+++ b/engines/nancy/action/arfactory.cpp
@@ -30,7 +30,6 @@
 #include "engines/nancy/action/sliderpuzzle.h"
 #include "engines/nancy/action/passwordpuzzle.h"
 #include "engines/nancy/action/leverpuzzle.h"
-#include "engines/nancy/action/lightning.h"
 
 #include "engines/nancy/state/scene.h"
 
diff --git a/engines/nancy/action/recordtypes.cpp b/engines/nancy/action/recordtypes.cpp
index ce9f0673ea9..e278696510f 100644
--- a/engines/nancy/action/recordtypes.cpp
+++ b/engines/nancy/action/recordtypes.cpp
@@ -199,6 +199,18 @@ void PaletteNextScene::execute() {
 	_isDone = true;
 }
 
+void LightningOn::readData(Common::SeekableReadStream &stream) {
+	_distance = stream.readSint16LE();
+	_pulseTime = stream.readUint16LE();
+	_rgbPercent = stream.readSint16LE();
+	stream.skip(4);
+}
+
+void LightningOn::execute() {
+	NancySceneState.beginLightning(_distance, _pulseTime, _rgbPercent);
+	_isDone = true;
+}
+
 void MapCall::readData(Common::SeekableReadStream &stream) {
 	stream.skip(1);
 }
diff --git a/engines/nancy/action/recordtypes.h b/engines/nancy/action/recordtypes.h
index bd158ccd7d9..5d371711015 100644
--- a/engines/nancy/action/recordtypes.h
+++ b/engines/nancy/action/recordtypes.h
@@ -117,6 +117,19 @@ protected:
 	Common::String getRecordTypeName() const override { return "PaletteNextScene"; }
 };
 
+class LightningOn : public ActionRecord {
+public:
+	void readData(Common::SeekableReadStream &stream) override;
+	void execute() override;
+
+	int16 _distance;
+	uint16 _pulseTime;
+	int16 _rgbPercent;
+
+protected:
+	Common::String getRecordTypeName() const override { return "LightningOn"; }
+};
+
 class MapCall : public ActionRecord {
 public:
 	void readData(Common::SeekableReadStream &stream) override;
diff --git a/engines/nancy/action/lightning.cpp b/engines/nancy/misc/lightning.cpp
similarity index 79%
rename from engines/nancy/action/lightning.cpp
rename to engines/nancy/misc/lightning.cpp
index 7026702ddd4..c7a7b547b08 100644
--- a/engines/nancy/action/lightning.cpp
+++ b/engines/nancy/misc/lightning.cpp
@@ -23,15 +23,15 @@
 #include "engines/nancy/sound.h"
 #include "engines/nancy/nancy.h"
 
-#include "engines/nancy/state/scene.h"
+#include "engines/nancy/misc/lightning.h"
 
-#include "engines/nancy/action/lightning.h"
+#include "engines/nancy/state/scene.h"
 
 #include "common/stream.h"
 #include "common/random.h"
 
 namespace Nancy {
-namespace Action {
+namespace Misc {
 
 void editPalette(byte *colors, uint percent) {
 	float alpha = (float) percent / 100;
@@ -42,17 +42,7 @@ void editPalette(byte *colors, uint percent) {
 	}
 }
 
-LightningOn::~LightningOn() {
-	for (byte *palette : _viewportObjOriginalPalettes) {
-		delete[] palette;
-	}
-}
-
-void LightningOn::readData(Common::SeekableReadStream &stream) {
-	int16 distance = stream.readSint16LE();
-	uint16 pulseTime = stream.readUint16LE();
-	int16 rgbPercent = stream.readSint16LE();
-
+void Lightning::beginLightning(int16 distance, uint16 pulseTime, int16 rgbPercent) {
 	int16 midpoint;
 	float delta;
 
@@ -81,11 +71,38 @@ void LightningOn::readData(Common::SeekableReadStream &stream) {
 	_minSoundStartDelay = MAX<int16>(250, midpoint - delta);
 	_maxSoundStartDelay = midpoint + delta; // No minimum value, probably a bug
 
-	stream.skip(0x4); // paletteStart, paletteSize
+	_state = kBegin;
+}
+
+void Lightning::endLightning() {
+	_state = kNotRunning;
+
+	_viewportObjs.clear();
+	_viewportObjOriginalPalettes.clear();
 }
 
-void LightningOn::execute() {
-	if (_state == kBegin) {
+void Lightning::run() {
+	switch (_state) {
+	case kNotRunning: {
+		// Check if the endgame has started
+		if (NancySceneState.getEventFlag(82)) {
+			uint16 sceneID = NancySceneState.getSceneInfo().sceneID;
+
+			// Check if we're inside an appropriate scene
+			if ((sceneID < 152) ||
+				(sceneID > 177 && sceneID < 230) ||
+				(sceneID > 230 && sceneID < 233) ||
+				(sceneID > 235 && sceneID < 318) ||
+				(sceneID > 326 && sceneID < 334) ||
+				(sceneID > 341 && sceneID < 1726) ||
+				(sceneID > 1731)) {
+				
+				beginLightning(2, 22, 65);
+			}
+		}
+	}
+		// fall through
+	case kBegin:
 		g_nancy->_graphicsManager->grabViewportObjects(_viewportObjs);
 
 		for (RenderObject *obj : _viewportObjs) {
@@ -97,22 +114,20 @@ void LightningOn::execute() {
 			obj->grabPalette(_viewportObjOriginalPalettes.back());
 		}
 
-		_state = kRun;
-	}
-
-	switch (_lightningState) {
+		_state = kStartPulse;
+		// fall through
 	case kStartPulse:
 		_nextStateTime = g_nancy->getTotalPlayTime() + g_nancy->_randomSource->getRandomNumberRngSigned(_minPulseLength, _maxPulseLength);
 		handleThunder();
 		handlePulse(true);
-		_lightningState = kPulse;
+		_state = kPulse;
 		break;
 	case kPulse:
 		if (g_nancy->getTotalPlayTime() > _nextStateTime) {
 
 			_nextStateTime = g_nancy->getTotalPlayTime() + g_nancy->_randomSource->getRandomNumberRngSigned(_minInterPulseDelay, _maxInterPulseDelay);
 
-			_lightningState = kThunder;
+			_state = kThunder;
 
 			if (!g_nancy->_sound->isSoundPlaying("TH1")) {
 				_nextSoundToPlay = 0;
@@ -131,7 +146,7 @@ void LightningOn::execute() {
 		break;
 	case kThunder:
 		if (g_nancy->getTotalPlayTime() > _nextStateTime) {
-			_lightningState = kStartPulse;
+			_state = kStartPulse;
 		}
 
 		handleThunder();
@@ -139,7 +154,7 @@ void LightningOn::execute() {
 	}
 }
 
-void LightningOn::handlePulse(bool on) {
+void Lightning::handlePulse(bool on) {
 	for (uint i = 0; i < _viewportObjs.size(); ++i) {
 		RenderObject *obj = _viewportObjs[i];
 
@@ -159,17 +174,19 @@ void LightningOn::handlePulse(bool on) {
 	}
 }
 
-void LightningOn::handleThunder() {
+void Lightning::handleThunder() {
 	if (_nextSoundToPlay == 0) {
 		if (g_nancy->getTotalPlayTime() > _nextSoundTime0) {
 			g_nancy->_sound->playSound("TH1");
+			_nextSoundToPlay = -1;
 		}
 	} else if (_nextSoundToPlay == 1) {
 		if (g_nancy->getTotalPlayTime() > _nextSoundTime1) {
 			g_nancy->_sound->playSound("TH2");
+			_nextSoundToPlay = -1;
 		}
 	}
 }
 
 } // End of namespace Action
-} // End of namespace Nancy
+} // End of namespace Misc
diff --git a/engines/nancy/action/lightning.h b/engines/nancy/misc/lightning.h
similarity index 74%
rename from engines/nancy/action/lightning.h
rename to engines/nancy/misc/lightning.h
index e5869c9f3c0..c30fe5fe506 100644
--- a/engines/nancy/action/lightning.h
+++ b/engines/nancy/misc/lightning.h
@@ -22,25 +22,31 @@
 #ifndef NANCY_ACTION_LIGHTNING_H
 #define NANCY_ACTION_LIGHTNING_H
 
-#include "engines/nancy/action/actionrecord.h"
+#include "engines/nancy/commontypes.h"
 
 namespace Nancy {
-namespace Action {
 
-class LightningOn : public ActionRecord {
-public:
-	enum LightningState { kStartPulse, kPulse, kThunder };
+class RenderObject;
+
+namespace Misc {
 
-	LightningOn() = default;
-	virtual ~LightningOn();
+// Special class that handles The Vampire Diaries' lightning screen effect.
+// Activated by the LightningOn action record as well as at the endgame section
+class Lightning {
+public:
+	enum LightningState { kBegin, kStartPulse, kPulse, kThunder, kNotRunning };
 
-	void readData(Common::SeekableReadStream &stream) override;
-	void execute() override;
+	void beginLightning(int16 distance, uint16 pulseTime, int16 rgbPercent);
+	void endLightning();
+	
+	void run();
 
+private:
 	void handlePulse(bool on);
 	void handleThunder();
 
-	LightningState _lightningState = kStartPulse;
+	bool _isRunning = false;
+	LightningState _state = kNotRunning;
 
 	int16 _minRGBPercent = 0;
 	int16 _maxRGBPercent = 0;
@@ -62,12 +68,9 @@ public:
 
 	Common::Array<RenderObject *> _viewportObjs;
 	Common::Array<byte *> _viewportObjOriginalPalettes;
-
-protected:
-	Common::String getRecordTypeName() const override { return "LightningOn"; }
 };
 
-} // End of namespace Action
+} // End of namespace Misc
 } // End of namespace Nancy
 
 #endif // NANCY_ACTION_LIGHTNING_H
diff --git a/engines/nancy/module.mk b/engines/nancy/module.mk
index cbe76bfc3fe..18c98f5ee70 100644
--- a/engines/nancy/module.mk
+++ b/engines/nancy/module.mk
@@ -5,7 +5,6 @@ MODULE_OBJS = \
   action/actionrecord.o \
   action/arfactory.o \
   action/leverpuzzle.o \
-  action/lightning.o \
   action/orderingpuzzle.o \
   action/passwordpuzzle.o \
   action/primaryvideo.o \
@@ -31,6 +30,7 @@ MODULE_OBJS = \
   state/mainmenu.o \
   state/map.o \
   state/scene.o \
+  misc/lightning.o \
   commontypes.o \
   console.o \
   cursor.o \
diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index 957a625fef7..fb9b6fcb248 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -37,6 +37,8 @@
 #include "engines/nancy/ui/ornaments.h"
 #include "engines/nancy/ui/clock.h"
 
+#include "engines/nancy/misc/lightning.h"
+
 namespace Common {
 DECLARE_SINGLETON(Nancy::State::Scene);
 }
@@ -109,7 +111,8 @@ Scene::Scene() :
 		_clock(nullptr),
 		_actionManager(),
 		_difficulty(0),
-		_activePrimaryVideo(nullptr) {}
+		_activePrimaryVideo(nullptr),
+		_lightning(nullptr) {}
 
 Scene::~Scene()  {
 	delete _helpButton;
@@ -117,6 +120,7 @@ Scene::~Scene()  {
 	delete _viewportOrnaments;
 	delete _textboxOrnaments;
 	delete _clock;
+	delete _lightning;
 }
 
 void Scene::process() {
@@ -516,6 +520,10 @@ void Scene::init() {
 		_state = kLoad;
 	}
 
+	if (g_nancy->getGameType() == kGameTypeVampire) {
+		_lightning = new Misc::Lightning();
+	}
+
 	registerGraphics();
 	g_nancy->_graphicsManager->redrawAll();
 }
@@ -528,6 +536,12 @@ Action::PlayPrimaryVideoChan0 *Scene::getActivePrimaryVideo() {
 	return _activePrimaryVideo;
 }
 
+void Scene::beginLightning(int16 distance, uint16 pulseTime, int16 rgbPercent) {
+	if (_lightning) {
+		_lightning->beginLightning(distance, pulseTime, rgbPercent);
+	}
+}
+
 void Scene::load() {
 	clearSceneData();
 
@@ -630,6 +644,10 @@ void Scene::run() {
 	handleInput();
 
 	_actionManager.processActionRecords();
+
+	if (_lightning) {
+		_lightning->run();
+	}
 }
 
 void Scene::handleInput() {
@@ -782,6 +800,10 @@ void Scene::clearSceneData() {
 
 	clearLogicConditions();
 	_actionManager.clearActionRecords();
+
+	if (_lightning) {
+		_lightning->endLightning();
+	}
 }
 
 } // End of namespace State
diff --git a/engines/nancy/state/scene.h b/engines/nancy/state/scene.h
index 3efcacc1c4e..6c7f8cba052 100644
--- a/engines/nancy/state/scene.h
+++ b/engines/nancy/state/scene.h
@@ -51,6 +51,10 @@ class SliderPuzzle;
 class PlayPrimaryVideoChan0;
 }
 
+namespace Misc {
+class Lightning;
+}
+
 namespace UI {
 class Button;
 class ViewportOrnaments;
@@ -179,6 +183,9 @@ public:
 	void setActivePrimaryVideo(Action::PlayPrimaryVideoChan0 *activeVideo);
 	Action::PlayPrimaryVideoChan0 *getActivePrimaryVideo();
 
+	// The Vampire Diaries only;
+	void beginLightning(int16 distance, uint16 pulseTime, int16 rgbPercent);
+
 private:
 	void init();
 	void load();
@@ -259,6 +266,8 @@ private:
 	int16 _lastHintID;
 	NancyState::NancyState _gameStateRequested;
 
+	Misc::Lightning *_lightning;
+
 	Common::Rect _mapHotspot;
 
 	Action::ActionManager _actionManager;


Commit: 5097e10b56b724b2cd77620b8888f3591a435b26
    https://github.com/scummvm/scummvm/commit/5097e10b56b724b2cd77620b8888f3591a435b26
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:02+03:00

Commit Message:
NANCY: Correct viewport scrolling hotspots activation

Fixed an issue where the top edge of the viewport would still be active
even in scenes where no vertical scrolling is possible.

Changed paths:
    engines/nancy/ui/viewport.cpp


diff --git a/engines/nancy/ui/viewport.cpp b/engines/nancy/ui/viewport.cpp
index 6cd7ae2a442..5742a27de17 100644
--- a/engines/nancy/ui/viewport.cpp
+++ b/engines/nancy/ui/viewport.cpp
@@ -251,14 +251,18 @@ void Viewport::setVerticalScroll(uint scroll) {
 	_drawSurface.create(_fullFrame, sourceBounds);
 	_needsRedraw = true;
 
-	if (scroll == getMaxScroll()) {
-		disableEdges(kDown);
-		enableEdges(kUp);
-	} else if (scroll == 0) {
-		disableEdges(kUp);
-		enableEdges(kDown);
+	if (getMaxScroll() > 0) {
+		if (scroll == getMaxScroll()) {
+			disableEdges(kDown);
+			enableEdges(kUp);
+		} else if (scroll == 0) {
+			disableEdges(kUp);
+			enableEdges(kDown);
+		} else {
+			enableEdges(kUp | kDown);
+		}
 	} else {
-		enableEdges(kUp | kDown);
+		disableEdges(kUp | kDown);
 	}
 }
 


Commit: 3157da3f288152c888a9d22db7d9aa1d8a508e52
    https://github.com/scummvm/scummvm/commit/3157da3f288152c888a9d22db7d9aa1d8a508e52
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:03+03:00

Commit Message:
NANCY: Fix thunder sound playing in every scene

Changed paths:
    engines/nancy/misc/lightning.cpp


diff --git a/engines/nancy/misc/lightning.cpp b/engines/nancy/misc/lightning.cpp
index c7a7b547b08..5e916a96377 100644
--- a/engines/nancy/misc/lightning.cpp
+++ b/engines/nancy/misc/lightning.cpp
@@ -100,8 +100,9 @@ void Lightning::run() {
 				beginLightning(2, 22, 65);
 			}
 		}
+
+		break;
 	}
-		// fall through
 	case kBegin:
 		g_nancy->_graphicsManager->grabViewportObjects(_viewportObjs);
 


Commit: 1ee352bfc83b56cbfc8ec0041447206329736f33
    https://github.com/scummvm/scummvm/commit/1ee352bfc83b56cbfc8ec0041447206329736f33
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:04+03:00

Commit Message:
NANCY: Add support for empty videos in secondary movie

Changed paths:
    engines/nancy/action/secondarymovie.cpp


diff --git a/engines/nancy/action/secondarymovie.cpp b/engines/nancy/action/secondarymovie.cpp
index f75e93b14fa..a6aa532a647 100644
--- a/engines/nancy/action/secondarymovie.cpp
+++ b/engines/nancy/action/secondarymovie.cpp
@@ -93,14 +93,21 @@ void PlaySecondaryMovie::init() {
 	if (!_decoder.loadFile(_videoName + ".avf")) {
 		error("Couldn't load video file %s", _videoName.c_str());
 	}
+
 	_drawSurface.create(_decoder.getWidth(), _decoder.getHeight(), g_nancy->_graphicsManager->getInputPixelFormat());
+	
 	if (_paletteName.size()) {
 		GraphicsManager::loadSurfacePalette(_fullFrame, _paletteName);
+		GraphicsManager::loadSurfacePalette(_drawSurface, _paletteName);
 	}
 
 	if (g_nancy->getGameType() == kGameTypeVampire) {
 		setTransparent(true);
 		_fullFrame.setTransparentColor(_drawSurface.getTransparentColor());
+		
+		// TVD uses empty video files during the endgame ceremony
+		// This makes sure the screen doesn't go black while the sound is playing
+		_drawSurface.clear(_drawSurface.getTransparentColor());
 	}
 
 	_screenPosition = _drawSurface.getBounds();


Commit: 13b2e82b6ce76434d9697aedf4190e2aa874e13a
    https://github.com/scummvm/scummvm/commit/13b2e82b6ce76434d9697aedf4190e2aa874e13a
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:05+03:00

Commit Message:
NANCY: Disable mouse input while cursor is invisible

Changed paths:
    engines/nancy/cursor.h
    engines/nancy/state/credits.cpp
    engines/nancy/state/mainmenu.cpp
    engines/nancy/state/map.cpp
    engines/nancy/state/scene.cpp


diff --git a/engines/nancy/cursor.h b/engines/nancy/cursor.h
index 5af9fcc9329..397b7a205bc 100644
--- a/engines/nancy/cursor.h
+++ b/engines/nancy/cursor.h
@@ -31,6 +31,8 @@ namespace Nancy {
 class NancyEngine;
 
 class CursorManager {
+	friend class NancyEngine;
+
 public:
 	enum CursorType { kNormal = 0, kHotspot = 1, kMove = 2, kExit = 3, kNormalArrow, kHotspotArrow };
 
@@ -45,13 +47,14 @@ public:
 	void setCursor(CursorType type, int16 itemID);
 	void setCursorType(CursorType type);
 	void setCursorItemID(int16 itemID);
-	void showCursor(bool shouldShow);
 
 	const Common::Point &getCurrentCursorHotspot() { return _cursors[_curCursorID].hotspot;}
 	const Common::Rect &getPrimaryVideoInactiveZone() { return _primaryVideoInactiveZone; }
 	const Common::Point &getPrimaryVideoInitialPos() { return _primaryVideoInitialPos; }
 
 private:
+	void showCursor(bool shouldShow);
+
 	struct Cursor {
 		Common::Rect bounds;
 		Common::Point hotspot;
diff --git a/engines/nancy/state/credits.cpp b/engines/nancy/state/credits.cpp
index e5fbaf0d41e..175bc2450b2 100644
--- a/engines/nancy/state/credits.cpp
+++ b/engines/nancy/state/credits.cpp
@@ -80,7 +80,7 @@ void Credits::init() {
 	_background.registerGraphics();
 	_text.registerGraphics();
 
-	g_nancy->_cursorManager->showCursor(false);
+	g_nancy->setMouseEnabled(false);
 
 	_state = kRun;
 }
@@ -91,7 +91,7 @@ void Credits::run() {
 	if (input.input & NancyInput::kLeftMouseButtonDown) {
 		_state = kInit;
 		g_nancy->_sound->stopSound(_sound);
-		g_nancy->_cursorManager->showCursor(true);
+		g_nancy->setMouseEnabled(true);
 		_fullTextSurface.free();
 		g_nancy->setState(NancyState::kMainMenu);
 		return;
diff --git a/engines/nancy/state/mainmenu.cpp b/engines/nancy/state/mainmenu.cpp
index 7b7e41e972c..101afcf57d0 100644
--- a/engines/nancy/state/mainmenu.cpp
+++ b/engines/nancy/state/mainmenu.cpp
@@ -64,7 +64,7 @@ void MainMenu::init() {
 	_background.registerGraphics();
 
 	g_nancy->_cursorManager->setCursorType(CursorManager::kNormalArrow);
-	g_nancy->_cursorManager->showCursor(true);
+	g_nancy->setMouseEnabled(true);
 
 	if (!g_nancy->_sound->isSoundPlaying("MSND")) {
 		g_nancy->_sound->playSound("MSND");
diff --git a/engines/nancy/state/map.cpp b/engines/nancy/state/map.cpp
index 519ed3d73f8..36e1f7c6379 100644
--- a/engines/nancy/state/map.cpp
+++ b/engines/nancy/state/map.cpp
@@ -387,7 +387,7 @@ void TVDMap::MapGlobe::onTrigger() {
 		_owner->_viewport.setVisible(true);
 		_owner->_viewport.playVideo();
 		g_system->warpMouse(_owner->_cursorPosition.x, _owner->_cursorPosition.y);
-		g_nancy->_cursorManager->showCursor(true);
+		g_nancy->setMouseEnabled(true);
 	} else {
 		_owner->_state = kExit;
 		_nextFrameTime = 0;
diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index fb9b6fcb248..75a484dee5b 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -677,7 +677,7 @@ void Scene::handleInput() {
 					requestStateChange(NancyState::kMap);
 
 					if (g_nancy->getGameType() == kGameTypeVampire) {
-						g_nancy->_cursorManager->showCursor(false);
+						g_nancy->setMouseEnabled(false);
 					}
 				}
 
@@ -766,7 +766,7 @@ void Scene::initStaticData() {
 		_helpButton = new UI::Button(5, g_nancy->_graphicsManager->_object0, helpSrc, helpDest);
 		_menuButton->init();
 		_helpButton->init();
-		g_nancy->_cursorManager->showCursor(true);
+		g_nancy->setMouseEnabled(true);
 	}
 
 	if (g_nancy->getGameType() == kGameTypeNancy1) {


Commit: c246c5cdd9d6da3c09558df66dcfa785610d3756
    https://github.com/scummvm/scummvm/commit/c246c5cdd9d6da3c09558df66dcfa785610d3756
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:05+03:00

Commit Message:
NANCY: Correct scaled blitting

Fixed an issue where some objects would be rendered at the wrong
scale when overlapped with a transparent object (e.g. the clock
in The Vampire Diaries).

Changed paths:
    engines/nancy/renderobject.cpp
    engines/nancy/ui/clock.cpp


diff --git a/engines/nancy/renderobject.cpp b/engines/nancy/renderobject.cpp
index 1c63014e2bd..bb9b2ce48f4 100644
--- a/engines/nancy/renderobject.cpp
+++ b/engines/nancy/renderobject.cpp
@@ -134,8 +134,8 @@ Common::Rect RenderObject::convertToLocal(const Common::Rect &screen) const {
 	if (_drawSurface.w != _screenPosition.width() || _drawSurface.h != _screenPosition.height()) {
 		Common::Rect srcBounds = _drawSurface.getBounds();
 
-		float scaleX = (float)_screenPosition.width() / srcBounds.width();
-		float scaleY = (float)_screenPosition.height() / srcBounds.height();
+		float scaleX = (float)srcBounds.width() / _screenPosition.width();
+		float scaleY = (float)srcBounds.height() / _screenPosition.height();
 
 		ret.left = (ret.left - srcBounds.left) * scaleX;
 		ret.right = (ret.right - srcBounds.left) * scaleX;
diff --git a/engines/nancy/ui/clock.cpp b/engines/nancy/ui/clock.cpp
index e0c0d31ddd4..c64531d1640 100644
--- a/engines/nancy/ui/clock.cpp
+++ b/engines/nancy/ui/clock.cpp
@@ -161,7 +161,7 @@ void Clock::ClockGlobe::init() {
 
 void Clock::ClockGlobe::updateGraphics() {
 	AnimatedButton::updateGraphics();
-	if (_isOpen && !isPlaying() && g_nancy->getTotalPlayTime() > _closeTime) {
+	if (_isOpen && !isPlaying() && g_nancy->getTotalPlayTime() > _closeTime && _isVisible) {
 		setOpen(false);
 		_owner->_gargoyleEyes.setVisible(false);
 		g_nancy->_sound->playSound("GLOB");


Commit: 87fcd3c93d40b76ca75a8cf24a4197b39d3f2278
    https://github.com/scummvm/scummvm/commit/87fcd3c93d40b76ca75a8cf24a4197b39d3f2278
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:06+03:00

Commit Message:
NANCY: Add support for small format secondary video

Secondary videos with a small video format now get displayed properly.
Added constants for small and large video formats.

Changed paths:
    engines/nancy/action/primaryvideo.cpp
    engines/nancy/action/primaryvideo.h
    engines/nancy/action/secondaryvideo.cpp
    engines/nancy/action/secondaryvideo.h
    engines/nancy/commontypes.h
    engines/nancy/state/scene.cpp
    engines/nancy/ui/viewport.cpp
    engines/nancy/ui/viewport.h


diff --git a/engines/nancy/action/primaryvideo.cpp b/engines/nancy/action/primaryvideo.cpp
index b11c5422f00..4aab0e3c96f 100644
--- a/engines/nancy/action/primaryvideo.cpp
+++ b/engines/nancy/action/primaryvideo.cpp
@@ -153,7 +153,7 @@ void PlayPrimaryVideoChan0::updateGraphics() {
 	}
 
 	if (_decoder.needsUpdate()) {
-		GraphicsManager::copyToManaged(*_decoder.decodeNextFrame(), _drawSurface, _videoFormat == 1);
+		GraphicsManager::copyToManaged(*_decoder.decodeNextFrame(), _drawSurface, _videoFormat == kSmallVideoFormat);
 
 		_needsRedraw = true;
 	}
diff --git a/engines/nancy/action/primaryvideo.h b/engines/nancy/action/primaryvideo.h
index 2e7d7054c1e..80839f99606 100644
--- a/engines/nancy/action/primaryvideo.h
+++ b/engines/nancy/action/primaryvideo.h
@@ -96,7 +96,7 @@ public:
 
 	Common::String _videoName;
 	Common::String _paletteName;
-	uint _videoFormat = 2;
+	uint _videoFormat = kLargeVideoFormat;
 	Common::String _text;
 
 	SoundDescription _sound;
diff --git a/engines/nancy/action/secondaryvideo.cpp b/engines/nancy/action/secondaryvideo.cpp
index b0daf1a7b2d..5d788259a8a 100644
--- a/engines/nancy/action/secondaryvideo.cpp
+++ b/engines/nancy/action/secondaryvideo.cpp
@@ -103,7 +103,7 @@ void PlaySecondaryVideo::updateGraphics() {
 
 		if (_decoder.isPlaying()) {
 			if (_decoder.needsUpdate()) {
-				GraphicsManager::copyToManaged(*_decoder.decodeNextFrame(), _fullFrame, _paletteFilename.size() > 0);
+				GraphicsManager::copyToManaged(*_decoder.decodeNextFrame(), _fullFrame, _paletteFilename.size(), _videoFormat == kSmallVideoFormat);
 				_needsRedraw = true;
 			}
 
@@ -165,7 +165,10 @@ void PlaySecondaryVideo::readData(Common::SeekableReadStream &stream) {
 	readFilename(stream, _paletteFilename);
 	ser.skip(10); // video overlay bitmap filename
 
-	ser.skip(12, kGameTypeVampire, kGameTypeVampire);
+	ser.skip(2, kGameTypeVampire, kGameTypeVampire);
+	ser.syncAsUint16LE(_videoFormat, kGameTypeVampire, kGameTypeVampire);
+	ser.skip(8, kGameTypeVampire, kGameTypeVampire);
+
 	ser.syncAsUint16LE(_videoHotspots, kGameTypeVampire, kGameTypeVampire);
 
 	ser.syncAsUint16LE(_loopFirstFrame);
diff --git a/engines/nancy/action/secondaryvideo.h b/engines/nancy/action/secondaryvideo.h
index 9054f8684bf..7bf8279c463 100644
--- a/engines/nancy/action/secondaryvideo.h
+++ b/engines/nancy/action/secondaryvideo.h
@@ -55,6 +55,7 @@ public:
 	// Common::String _bitmapOverlayFilename
 
 	// TVD only
+	uint16 _videoFormat = kLargeVideoFormat;
 	uint16 _videoHotspots = kVideoHotspots;
 
 	uint16 _loopFirstFrame = 0; // 0x1E
diff --git a/engines/nancy/commontypes.h b/engines/nancy/commontypes.h
index 9c181137b26..3b72b9dafd4 100644
--- a/engines/nancy/commontypes.h
+++ b/engines/nancy/commontypes.h
@@ -76,9 +76,13 @@ static const byte kAbsoluteClockBump 	= 1;
 static const byte kRelativeClockBump 	= 2;
 
 // Time of day
-static const byte kPlayerDay		= 0;
-static const byte kPlayerNight		= 1;
-static const byte kPlayerDuskDawn	= 2;
+static const byte kPlayerDay			= 0;
+static const byte kPlayerNight			= 1;
+static const byte kPlayerDuskDawn		= 2;
+
+// Video
+static const byte kSmallVideoFormat		= 1;
+static const byte kLargeVideoFormat		= 2;
 
 enum MovementDirection : byte { kUp = 1, kDown = 2, kLeft = 4, kRight = 8, kMoveFast = 16 };
 
diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index 75a484dee5b..a60f3aa8df1 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -595,18 +595,18 @@ void Scene::load() {
 		_viewport.disableEdges(kLeft | kRight);
 	}
 
-	if (_sceneState.summary.videoFormat == 1) {
+	if (_sceneState.summary.videoFormat == kSmallVideoFormat) {
 		// TODO
-	} else if (_sceneState.summary.videoFormat == 2) {
+	} else if (_sceneState.summary.videoFormat == kLargeVideoFormat) {
 		// always start from the bottom
 		_sceneState.currentScene.verticalOffset = _viewport.getMaxScroll();
 	} else {
 		error("Unrecognized Scene summary chunk video file format");
 	}
 
-	if (_sceneState.summary.videoFormat == 1) {
+	if (_sceneState.summary.videoFormat == kSmallVideoFormat) {
 		// TODO
-	} else if (_sceneState.summary.videoFormat == 2) {
+	} else if (_sceneState.summary.videoFormat == kLargeVideoFormat) {
 		if (_viewport.getMaxScroll() == 0) {
 			_viewport.disableEdges(kUp | kDown);
 		}
diff --git a/engines/nancy/ui/viewport.cpp b/engines/nancy/ui/viewport.cpp
index 5742a27de17..8256d1acac1 100644
--- a/engines/nancy/ui/viewport.cpp
+++ b/engines/nancy/ui/viewport.cpp
@@ -213,7 +213,7 @@ void Viewport::setFrame(uint frameNr) {
 
 	// Format 1 uses quarter-size images, while format 2 uses full-size ones
 	// Videos in TVD are always upside-down
-	GraphicsManager::copyToManaged(*newFrame, _fullFrame, g_nancy->getGameType() == kGameTypeVampire, _videoFormat == 1);
+	GraphicsManager::copyToManaged(*newFrame, _fullFrame, g_nancy->getGameType() == kGameTypeVampire, _videoFormat == kSmallVideoFormat);
 
 	_needsRedraw = true;
 	_currentFrame = frameNr;
diff --git a/engines/nancy/ui/viewport.h b/engines/nancy/ui/viewport.h
index feabc7ad882..137050c1646 100644
--- a/engines/nancy/ui/viewport.h
+++ b/engines/nancy/ui/viewport.h
@@ -49,7 +49,7 @@ public:
 		_movementLastFrame(0),
 		_edgesMask(0),
 		_currentFrame(0),
-		_videoFormat(0),
+		_videoFormat(kLargeVideoFormat),
 		_stickyCursorPos(-1, -1),
 		_panningType(kPanNone) {}
 


Commit: 75607c519c0b2d6bdded9407b6d21d1f67ad7b1a
    https://github.com/scummvm/scummvm/commit/75607c519c0b2d6bdded9407b6d21d1f67ad7b1a
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:06+03:00

Commit Message:
NANCY: Correctly advance primary video with no valid responses

Changed the check for responses available in primary videos so it takes
into account disabled responses. This fixes the dialogue with Mikhail
at the end of The Vampire Diaries.

Changed paths:
    engines/nancy/action/primaryvideo.cpp


diff --git a/engines/nancy/action/primaryvideo.cpp b/engines/nancy/action/primaryvideo.cpp
index 4aab0e3c96f..16cd896e302 100644
--- a/engines/nancy/action/primaryvideo.cpp
+++ b/engines/nancy/action/primaryvideo.cpp
@@ -326,7 +326,15 @@ void PlayPrimaryVideoChan0::execute() {
 		if (!g_nancy->_sound->isSoundPlaying(_sound) && (_decoder.endOfVideo() || _decoder.getCurFrame() == _endFrame)) {
 			g_nancy->_sound->stopSound(_sound);
 
-			if (_responses.size() == 0) {
+			bool hasResponses = false;
+			for (auto &res : _responses) {
+				if (res.isOnScreen) {
+					hasResponses = true;
+					break;
+				}
+			}
+
+			if (!hasResponses) {
 				// NPC has finished talking with no responses available, auto-advance to next scene
 				_state = kActionTrigger;
 			} else {


Commit: 6c28de769872ddcd32c83b9b9e042a20b45581e7
    https://github.com/scummvm/scummvm/commit/6c28de769872ddcd32c83b9b9e042a20b45581e7
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:06+03:00

Commit Message:
NANCY: Make second chance always active

The Second Chance autosave functionality is now always active
alongside ScummVM's regular autosave feature.

Changed paths:
    engines/nancy/action/recordtypes.cpp
    engines/nancy/nancy.cpp
    engines/nancy/nancy.h


diff --git a/engines/nancy/action/recordtypes.cpp b/engines/nancy/action/recordtypes.cpp
index e278696510f..e2d4ed5f09c 100644
--- a/engines/nancy/action/recordtypes.cpp
+++ b/engines/nancy/action/recordtypes.cpp
@@ -19,8 +19,6 @@
  *
  */
 
-#include "common/config-manager.h"
-
 #include "engines/nancy/nancy.h"
 #include "engines/nancy/sound.h"
 #include "engines/nancy/resource.h"
@@ -300,15 +298,7 @@ void SaveContinueGame::readData(Common::SeekableReadStream &stream) {
 }
 
 void SaveContinueGame::execute() {
-	if (ConfMan.getBool("second_chance")) {
-		if (_state == kBegin) {
-			// Slight hack, skip first call to let the graphics render once and provide the correct thumbnail
-			_state = kRun;
-			return;
-		}
-
-		g_nancy->saveGameState(g_nancy->getAutosaveSlot(), "Second Chance", true);
-	}
+	g_nancy->secondChance();
 	_isDone = true;
 }
 
diff --git a/engines/nancy/nancy.cpp b/engines/nancy/nancy.cpp
index 8faf56fbbb6..8a0371fd9a4 100644
--- a/engines/nancy/nancy.cpp
+++ b/engines/nancy/nancy.cpp
@@ -127,6 +127,22 @@ bool NancyEngine::canSaveAutosaveCurrently() {
 	}
 }
 
+void NancyEngine::secondChance() {
+	SaveStateList saves = getMetaEngine()->listSaves(_targetName.c_str());
+	Common::String name = "SECOND CHANCE";
+
+	// Overwrite an existing second chance if possible
+	for (auto &save : saves) {
+		if (save.getDescription() == name) {
+			saveGameState(save.getSaveSlot(), name, true);
+			return;
+		}
+	}
+
+	// If no second chance slot exists, create a new one
+	saveGameState(saves.size(), name, true);
+}
+
 bool NancyEngine::hasFeature(EngineFeature f) const {
 	return  (f == kSupportsReturnToLauncher) ||
 			(f == kSupportsLoadingDuringRuntime) ||
diff --git a/engines/nancy/nancy.h b/engines/nancy/nancy.h
index f2c869f4def..e122bd5f88c 100644
--- a/engines/nancy/nancy.h
+++ b/engines/nancy/nancy.h
@@ -85,6 +85,8 @@ public:
 	bool canSaveGameStateCurrently() override;
 	bool canSaveAutosaveCurrently() override;
 
+	void secondChance();
+
 	const char *getCopyrightString() const;
 	uint32 getGameFlags() const;
 	const char *getGameId() const;


Commit: 2dea1e4730dd02e9a222d1a946b2fb9a432d3142
    https://github.com/scummvm/scummvm/commit/2dea1e4730dd02e9a222d1a946b2fb9a432d3142
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2023-03-26T11:44:07+03:00

Commit Message:
NANCY: Improve engine settings

Removed the unused checkboxes for second chance and original
menus from the engine settings dialog. Added the default values
for the character speech and player speech to NancyMetaEngine
so they're both checked when adding a new game.

Changed paths:
    engines/nancy/dialogs.cpp
    engines/nancy/dialogs.h
    engines/nancy/metaengine.cpp
    engines/nancy/nancy.cpp


diff --git a/engines/nancy/dialogs.cpp b/engines/nancy/dialogs.cpp
index e7ced7f3ab6..1ccf35c74f6 100644
--- a/engines/nancy/dialogs.cpp
+++ b/engines/nancy/dialogs.cpp
@@ -39,27 +39,18 @@ NancyOptionsWidget::NancyOptionsWidget(GuiObject *boss, const Common::String &na
 		OptionsContainerWidget(boss, name, "NancyOptionsDialog", false, domain) {
 	_playerSpeechCheckbox = new GUI::CheckboxWidget(widgetsBoss(), "NancyOptionsDialog.PlayerSpeech", _("Player Speech"), _("Enable player speech. Only works if speech is enabled in the Audio settings."));
 	_characterSpeechCheckbox = new GUI::CheckboxWidget(widgetsBoss(), "NancyOptionsDialog.CharacterSpeech", _("Character Speech"), _("Enable NPC speech. Only works if speech is enabled in the Audio settings."));
-	_originalMenusCheckbox = new GUI::CheckboxWidget(widgetsBoss(), "NancyOptionsDialog.OriginalMenus", _("Use original menus"), _("Use the original engine's main, save/load, and setup menus. ScummVM's Global Main Menu can still be accessed through its keymap."));
-
-	// I18N: Second Chance is the name of the original engine's autosave system
-	_secondChanceCheckbox = new GUI::CheckboxWidget(widgetsBoss(), "NancyOptionsDialog.SecondChance", _("Enable Second Chance"), _("Enable the Second Chance feature, which automatically saves at specific scenes. Enabling this disables timed autosaves."));
-
+	
 	new GUI::StaticTextWidget(widgetsBoss(), "NancyOptionsDialog.SpeechSettingsLabel", _("Speech Options"));
-	new GUI::StaticTextWidget(widgetsBoss(), "NancyOptionsDialog.EngineSettingsLabel", _("Engine Options"));
 }
 
 void NancyOptionsWidget::load() {
 	_playerSpeechCheckbox->setState(ConfMan.getBool("player_speech", _domain));
 	_characterSpeechCheckbox->setState(ConfMan.getBool("character_speech", _domain));
-	_originalMenusCheckbox->setState(ConfMan.getBool("original_menus", _domain));
-	_secondChanceCheckbox->setState(ConfMan.getBool("second_chance", _domain));
 }
 
 bool NancyOptionsWidget::save() {
 	ConfMan.setBool("player_speech", _playerSpeechCheckbox->getState(), _domain);
 	ConfMan.setBool("character_speech", _characterSpeechCheckbox->getState(), _domain);
-	ConfMan.setBool("original_menus", _originalMenusCheckbox->getState(), _domain);
-	ConfMan.setBool("second_chance", _secondChanceCheckbox->getState(), _domain);
 
 	return true;
 }
@@ -71,10 +62,6 @@ void NancyOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::Str
 			.addWidget("SpeechSettingsLabel", "OptionsLabel")
 			.addWidget("PlayerSpeech", "Checkbox")
 			.addWidget("CharacterSpeech", "Checkbox")
-			.addSpace(16)
-			.addWidget("EngineSettingsLabel", "OptionsLabel")
-			.addWidget("OriginalMenus", "Checkbox")
-			.addWidget("SecondChance", "Checkbox")
 		.closeLayout()
 	.closeDialog();
 }
diff --git a/engines/nancy/dialogs.h b/engines/nancy/dialogs.h
index e989ced50a9..82a5fef81b8 100644
--- a/engines/nancy/dialogs.h
+++ b/engines/nancy/dialogs.h
@@ -41,8 +41,6 @@ private:
 
 	GUI::CheckboxWidget *_playerSpeechCheckbox;
 	GUI::CheckboxWidget *_characterSpeechCheckbox;
-	GUI::CheckboxWidget *_originalMenusCheckbox;
-	GUI::CheckboxWidget *_secondChanceCheckbox;
 };
 
 } // End of namespace Nancy
diff --git a/engines/nancy/metaengine.cpp b/engines/nancy/metaengine.cpp
index 36d48cc1f06..be5d9abfd68 100644
--- a/engines/nancy/metaengine.cpp
+++ b/engines/nancy/metaengine.cpp
@@ -73,6 +73,9 @@ void NancyMetaEngine::registerDefaultSettings(const Common::String &target) cons
 	ConfMan.setInt("speech_volume", 54 * 255 / 100, target);
 	ConfMan.setInt("sfx_volume", 51 * 255 / 100, target);
 	ConfMan.setBool("subtitles", true, target);
+	
+	ConfMan.setBool("player_speech", true, target);
+	ConfMan.setBool("character_speech", true, target);
 }
 
 GUI::OptionsContainerWidget *NancyMetaEngine::buildEngineOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const {
diff --git a/engines/nancy/nancy.cpp b/engines/nancy/nancy.cpp
index 8a0371fd9a4..dc29684f3b3 100644
--- a/engines/nancy/nancy.cpp
+++ b/engines/nancy/nancy.cpp
@@ -312,12 +312,6 @@ void NancyEngine::bootGameEngine() {
 	SearchMan.addSubDirectoryMatching(gameDataDir, "art");
 	SearchMan.addSubDirectoryMatching(gameDataDir, "font");
 
-	// Register default settings
-	ConfMan.registerDefault("player_speech", true);
-	ConfMan.registerDefault("character_speech", true);
-	ConfMan.registerDefault("original_menus", false);
-	ConfMan.registerDefault("second_chance", false);
-
 	// Load archive if running a compressed variant
 	if (isCompressed()) {
 		Common::Archive *cabinet = Common::makeInstallShieldArchive("data");




More information about the Scummvm-git-logs mailing list