[Scummvm-git-logs] scummvm master -> 3da2ec5f7dfb74f33d9f5d7405599f3f8d4aae66

bluegr noreply at scummvm.org
Thu May 14 19:45:48 UTC 2026


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

Summary:
3904499a6e NANCY: Fix issues in Whale Sounds puzzle (soundmatchpuzzle)
393eaabca9 NANCY: Add Spanish version of Nancy Drew - Secrets Can Kill Remastered
3fe18865d1 NANCY: Handle character closeups format in Nancy10+
3da2ec5f7d NANCY: Offset character conditional responses for Nancy10+


Commit: 3904499a6e389838d374a1d27705e688fd9d6a66
    https://github.com/scummvm/scummvm/commit/3904499a6e389838d374a1d27705e688fd9d6a66
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-05-14T22:31:08+03:00

Commit Message:
NANCY: Fix issues in Whale Sounds puzzle (soundmatchpuzzle)

- The numbered buttons 1 to 5 should block input of the whale buttons
  while they are playing their sound.
- Whale buttons should be clickable after their sound has finished
  playing.
- The numbered buttons should not remain lit after a sound has finished
  playing.
- When two or more whales are correctly identified and a mistake is
  made, all whales should reset so the player must start over.

Fix #16794

Changed paths:
    engines/nancy/action/puzzle/soundmatchpuzzle.cpp
    engines/nancy/action/puzzle/soundmatchpuzzle.h


diff --git a/engines/nancy/action/puzzle/soundmatchpuzzle.cpp b/engines/nancy/action/puzzle/soundmatchpuzzle.cpp
index 46cdac167fb..cfd6a343b3a 100644
--- a/engines/nancy/action/puzzle/soundmatchpuzzle.cpp
+++ b/engines/nancy/action/puzzle/soundmatchpuzzle.cpp
@@ -39,7 +39,7 @@ void SoundMatchPuzzle::readData(Common::SeekableReadStream &stream) {
 	_feedbackSoundWrong.readNormal(stream);	// 0x021: played on incorrect whale click
 	_feedbackSoundRight.readNormal(stream); // 0x052: played on correct whale click
 
-	stream.skip(1);	// 0x083
+	_resetOnWrong = stream.readByte() != 0;
 
 	_winScene.readData(stream);	// 0x084
 	_winSound.readNormal(stream);	// 0x09d
@@ -91,9 +91,10 @@ void SoundMatchPuzzle::init() {
 		_whaleButtons[i].matched = false;
 	}
 
-	_matchedPairs  = 0;
-	_isExiting     = false;
-	_solveSubState = kIdle;
+	_matchedPairs       = 0;
+	_isExiting          = false;
+	_solveSubState      = kIdle;
+	_whaleClickEnabled  = false;
 
 	redraw();
 }
@@ -124,9 +125,9 @@ void SoundMatchPuzzle::execute() {
 			if (!g_nancy->_sound->isSoundPlaying(_soundButtons[_selectedSoundButton].sound)) {
 				g_nancy->_sound->stopSound(_soundButtons[_selectedSoundButton].sound);
 				NancySceneState.getTextbox().clear();
-				_selectedSoundButton = -1;
-				redraw();
+				_whaleClickEnabled = true;
 				_solveSubState = kIdle;
+				redraw();
 			}
 			break;
 
@@ -190,8 +191,9 @@ void SoundMatchPuzzle::handleInput(NancyInput &input) {
 	Common::Rect vpScreen = NancySceneState.getViewport().getScreenPosition();
 	Common::Point mouseVP = input.mousePos - Common::Point(vpScreen.left, vpScreen.top);
 
-	// Numbered button clicks — accepted in idle or while a sound is playing
-	if (_solveSubState == kIdle || _solveSubState == kSoundPlaying) {
+	// Numbered button clicks — accepted only when idle. While a sound
+	// is playing, these buttons are disabled
+	if (_solveSubState == kIdle) {
 		for (int i = 0; i < kNumButtons; ++i) {
 			if (_soundButtons[i].matched)
 				continue; // already matched; numbered button is inactive
@@ -206,6 +208,9 @@ void SoundMatchPuzzle::handleInput(NancyInput &input) {
 					g_nancy->_sound->stopSound(_soundButtons[_selectedSoundButton].sound);
 
 				_selectedSoundButton = i;
+				// Whales are blocked again until the new sound plays
+				// through
+				_whaleClickEnabled = false;
 
 				if (_soundButtons[i].sound.name != "NO SOUND") {
 					g_nancy->_sound->loadSound(_soundButtons[i].sound);
@@ -216,29 +221,31 @@ void SoundMatchPuzzle::handleInput(NancyInput &input) {
 				if (!_soundButtons[i].text.empty())
 					NancySceneState.getTextbox().addTextLine(_soundButtons[i].text);
 
-				redraw();
 				_solveSubState = kSoundPlaying;
+				redraw();
 			}
 			return;
 		}
 	}
 
-	// Whale button clicks — only while a numbered button is selected and its sound plays
-	if (_solveSubState == kSoundPlaying) {
+	// Whale button clicks — only after the per-button sound has fully
+	// played through, NOT while it's still playing.
+	if (_solveSubState == kIdle && _whaleClickEnabled && _selectedSoundButton >= 0) {
 		for (uint16 whaleButton = 0; whaleButton < kNumButtons; ++whaleButton) {
+			if (_whaleButtons[whaleButton].matched)
+				continue;
 			if (!_whaleButtons[whaleButton].whaleDestRect.contains(mouseVP))
 				continue;
 
 			g_nancy->_cursor->setCursorType(CursorManager::kHotspot);
 
 			if (input.input & NancyInput::kLeftMouseButtonUp) {
-				// Stop the per-button sound now that the player has made a choice
-				g_nancy->_sound->stopSound(_soundButtons[_selectedSoundButton].sound);
 				NancySceneState.getTextbox().clear();
+				_whaleClickEnabled = false;
 
 				uint16 soundButton = _soundButtonIndex[_selectedSoundButton] + 1;
 
-				if (soundButton == _whaleButtons[whaleButton].correctSound && !_whaleButtons[whaleButton].matched) {
+				if (soundButton == _whaleButtons[whaleButton].correctSound) {
 					// Correct whale - match!
 					_soundButtons[_selectedSoundButton].matched = true;
 					_whaleButtons[whaleButton].matched = true;
@@ -246,7 +253,16 @@ void SoundMatchPuzzle::handleInput(NancyInput &input) {
 					if (_feedbackSoundRight.name != "NO SOUND")
 						g_nancy->_sound->playSound(_feedbackSoundRight);
 				} else {
-					// Wrong whale
+					// Wrong whale. If the chunk's "reset on wrong"
+					// flag is set, every previously-matched pair is
+					// cleared and the player has to start over.
+					if (_resetOnWrong) {
+						for (int j = 0; j < kNumButtons; ++j) {
+							_soundButtons[j].matched = false;
+							_whaleButtons[j].matched = false;
+						}
+						_matchedPairs = 0;
+					}
 					if (_feedbackSoundWrong.name != "NO SOUND")
 						g_nancy->_sound->playSound(_feedbackSoundWrong);
 				}
@@ -270,13 +286,16 @@ void SoundMatchPuzzle::handleInput(NancyInput &input) {
 void SoundMatchPuzzle::redraw() {
 	_drawSurface.clear(_drawSurface.getTransparentColor());
 
-	for (int i = 0; i < kNumButtons; ++i) {
-		if (_soundButtons[i].matched || i == _selectedSoundButton) {
-			const Common::Rect &dest = _soundButtons[i].numDestRect;
-			_drawSurface.blitFrom(_imageLitButtons, _soundButtons[i].numSrcRect,
-			                      Common::Point(dest.left, dest.top));
-		}
+	// Numbered-button lit overlay: ONLY drawn while a sound is actually
+	// playing.
+	if (_solveSubState == kSoundPlaying && _selectedSoundButton >= 0) {
+		const SoundButtonEntry &btn = _soundButtons[_selectedSoundButton];
+		_drawSurface.blitFrom(_imageLitButtons, btn.numSrcRect,
+								Common::Point(btn.numDestRect.left, btn.numDestRect.top));
+	}
 
+	// Matched whales stay lit so the player can see their progress.
+	for (int i = 0; i < kNumButtons; ++i) {
 		if (_whaleButtons[i].matched) {
 			const Common::Rect &dest = _whaleButtons[i].whaleDestRect;
 			_drawSurface.blitFrom(_imageLitButtons, _whaleButtons[i].whaleSrcRect,
diff --git a/engines/nancy/action/puzzle/soundmatchpuzzle.h b/engines/nancy/action/puzzle/soundmatchpuzzle.h
index 81a7786f0cd..f09b61095df 100644
--- a/engines/nancy/action/puzzle/soundmatchpuzzle.h
+++ b/engines/nancy/action/puzzle/soundmatchpuzzle.h
@@ -64,6 +64,8 @@ protected:
 
 	uint16 _requiredPairs = kNumButtons;   // how many matches needed to win
 
+	bool _resetOnWrong = false;
+
 	struct SoundButtonEntry {
 		SoundDescription sound;   // whale call sound
 		Common::String text;      // onomatopoeia shown in the text box
@@ -91,6 +93,8 @@ protected:
 	int  _matchedPairs    = 0;
 	bool _isExiting       = false;
 
+	bool _whaleClickEnabled = false;
+
 	enum SolveSubState {
 		kIdle         = 0,
 		kCheckMatch   = 1,


Commit: 393eaabca9073618f4d9a7b3cd2117aee6ea9413
    https://github.com/scummvm/scummvm/commit/393eaabca9073618f4d9a7b3cd2117aee6ea9413
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-05-14T22:34:50+03:00

Commit Message:
NANCY: Add Spanish version of Nancy Drew - Secrets Can Kill Remastered

Fix #16299

Changed paths:
    engines/nancy/detection_tables.h


diff --git a/engines/nancy/detection_tables.h b/engines/nancy/detection_tables.h
index 99cc880da41..e5285668c7d 100644
--- a/engines/nancy/detection_tables.h
+++ b/engines/nancy/detection_tables.h
@@ -891,6 +891,17 @@ static const NancyGameDescription gameDescriptions[] = {
 		},
 		kGameTypeNancy1New
 	},
+	{ // MD5 by mmogas
+		{
+			"nancy1new", nullptr,
+			AD_ENTRY1s("ciftree.dat", "2f0c77c84bb5533f5bc6ec824ddf4c31", 14936536),
+			Common::ES_ESP,
+			Common::kPlatformWindows,
+			ADGF_UNSUPPORTED | ADGF_DROPPLATFORM,
+			NANCY8_GUIOPTIONS
+		},
+		kGameTypeNancy1New
+	},
 
 	// Do not delete
 	{ AD_TABLE_END_MARKER, kGameTypeNone }


Commit: 3fe18865d174284d2bf896c730b494c1a25ba898
    https://github.com/scummvm/scummvm/commit/3fe18865d174284d2bf896c730b494c1a25ba898
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-05-14T22:39:26+03:00

Commit Message:
NANCY: Handle character closeups format in Nancy10+

They're encoded in a different format than the main window, so convert
them on the fly to the main window's format

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


diff --git a/engines/nancy/ui/viewport.cpp b/engines/nancy/ui/viewport.cpp
index 4cfcf386bec..5d67681aad8 100644
--- a/engines/nancy/ui/viewport.cpp
+++ b/engines/nancy/ui/viewport.cpp
@@ -288,7 +288,16 @@ 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 == kSmallVideoFormat);
+	if (newFrame->format != _fullFrame.format && newFrame->format.bytesPerPixel == _fullFrame.format.bytesPerPixel) {
+		// Character closeups are in a different format than the main viewport
+		// in Nancy10+, so convert them before copying to the main surface.
+		Graphics::Surface *converted = newFrame->convertTo(_fullFrame.format);
+		GraphicsManager::copyToManaged(*converted, _fullFrame, g_nancy->getGameType() == kGameTypeVampire, _videoFormat == kSmallVideoFormat);
+		converted->free();
+		delete converted;
+	} else {
+		GraphicsManager::copyToManaged(*newFrame, _fullFrame, g_nancy->getGameType() == kGameTypeVampire, _videoFormat == kSmallVideoFormat);
+	}
 
 	_needsRedraw = true;
 	_currentFrame = frameNr;


Commit: 3da2ec5f7dfb74f33d9f5d7405599f3f8d4aae66
    https://github.com/scummvm/scummvm/commit/3da2ec5f7dfb74f33d9f5d7405599f3f8d4aae66
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-05-14T22:40:23+03:00

Commit Message:
NANCY: Offset character conditional responses for Nancy10+

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


diff --git a/engines/nancy/action/conversation.cpp b/engines/nancy/action/conversation.cpp
index f652260a89e..43f7829cb83 100644
--- a/engines/nancy/action/conversation.cpp
+++ b/engines/nancy/action/conversation.cpp
@@ -133,6 +133,11 @@ void ConversationSound::readTerseData(Common::SeekableReadStream &stream) {
 	_conditionalResponseCharacterID = stream.readByte();
 	_goodbyeResponseCharacterID = stream.readByte();
 
+	if (g_nancy->getGameType() >= kGameTypeNancy10) {
+		_conditionalResponseCharacterID -= 7;
+		_goodbyeResponseCharacterID -= 7;
+	}
+
 	_defaultNextScene = stream.readByte();
 
 	_sceneChange.sceneID = stream.readUint16LE();




More information about the Scummvm-git-logs mailing list