[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