[Scummvm-git-logs] scummvm master -> c6777a499f23247b91469ea86b361dd8a655f4e0

bluegr noreply at scummvm.org
Wed Oct 14 23:17:40 UTC 2026


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

Summary:
76b3817abe NANCY: NANCY16: Add a cheat to win the cooking puzzle
973f28b620 NANCY: NANCY15: Add a cheat to win the escape grid puzzle
9fe4892ec6 NANCY: NANCY16: Add a cheat to win the fox and geese game
2aea96fddf NANCY: NANCY16: Add cheats to the snowmobile rides
df63840c16 NANCY: Fix the scene sounds and music on scene changes
1e49ab9fb1 NANCY: NANCY13: Keep the scene sounds playing on movie scene changes
c6777a499f NANCY: NANCY14: Wait for a free channel to start concatenated sounds


Commit: 76b3817abed3a5168b40df51a7aaabc741b4fd45
    https://github.com/scummvm/scummvm/commit/76b3817abed3a5168b40df51a7aaabc741b4fd45
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-15T01:12:31+03:00

Commit Message:
NANCY: NANCY16: Add a cheat to win the cooking puzzle

Ctrl+Shift+W serves every order that is left, as plates with just the
required ingredients, and ends the meal as won

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


diff --git a/engines/nancy/action/puzzle/cookingpuzzle.cpp b/engines/nancy/action/puzzle/cookingpuzzle.cpp
index 0d670b6d349..2e495bbc964 100644
--- a/engines/nancy/action/puzzle/cookingpuzzle.cpp
+++ b/engines/nancy/action/puzzle/cookingpuzzle.cpp
@@ -575,6 +575,41 @@ bool CookingPuzzle::servePlate(Plate &plate) {
 	return success;
 }
 
+void CookingPuzzle::addRequiredIngredientFlags(const Order &order, Common::Array<FlagDescription> &flags) {
+	for (const Order &required : order.required) {
+		for (const IngredientFlag &flag : order.flags) {
+			if (flag.ingredient == required.food) {
+				flags.push_back(flag.flag);
+			}
+		}
+
+		addRequiredIngredientFlags(required, flags);
+	}
+}
+
+void CookingPuzzle::serveAllPlates() {
+	for (Plate &plate : _plates) {
+		Common::Array<FlagDescription> flags;
+		for (const Order &order : plate.orders) {
+			addRequiredIngredientFlags(order, flags);
+		}
+
+		for (const FlagDescription &flag : flags) {
+			NancySceneState.setEventFlag(flag);
+		}
+
+		for (Food *food : plate.foods) {
+			deleteFood(food);
+		}
+	}
+
+	_plates.clear();
+	_openPlate = -1;
+
+	releaseHeldFood(true);
+	startEnding(_solveScene, _allServedSound);
+}
+
 bool CookingPuzzle::clickPlates(const Common::Point &pos) {
 	if (_openPlate == -1) {
 		for (uint i = 0; i < _plates.size(); ++i) {
@@ -1035,6 +1070,15 @@ void CookingPuzzle::handleInput(NancyInput &input) {
 		return;
 	}
 
+	// Cheat: Ctrl+Shift+W serves every order that is left, and ends the meal as won
+	for (const Common::KeyState &key : input.otherKbdInput) {
+		if ((key.flags & Common::KBD_CTRL) && (key.flags & Common::KBD_SHIFT) && key.keycode == Common::KEYCODE_w) {
+			debug("Cooking cheat: all orders served");
+			serveAllPlates();
+			return;
+		}
+	}
+
 	Common::Rect viewportBounds = NancySceneState.getViewport().getBounds();
 	Common::Rect mouseRect = NancySceneState.getViewport().convertScreenToViewport(
 		Common::Rect(input.mousePos.x, input.mousePos.y, input.mousePos.x + 1, input.mousePos.y + 1));
diff --git a/engines/nancy/action/puzzle/cookingpuzzle.h b/engines/nancy/action/puzzle/cookingpuzzle.h
index c24f9f581f2..2a08c5bf2fa 100644
--- a/engines/nancy/action/puzzle/cookingpuzzle.h
+++ b/engines/nancy/action/puzzle/cookingpuzzle.h
@@ -156,6 +156,11 @@ protected:
 	bool clickGarbage(const Common::Point &pos);
 	bool putOnPlate(Plate &plate);
 	bool servePlate(Plate &plate);
+
+	// Cheat: serves every order that is left, the way plates with just what they need
+	// would have been served
+	void serveAllPlates();
+	static void addRequiredIngredientFlags(const Order &order, Common::Array<FlagDescription> &flags);
 	bool foodMatches(const Food *food, const Order &order, Common::Array<FlagDescription> &flags,
 		bool checkDoneness, bool &allWellDone) const;
 


Commit: 973f28b6206d9e121a7d466c9573fe62093edc9c
    https://github.com/scummvm/scummvm/commit/973f28b6206d9e121a7d466c9573fe62093edc9c
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-15T01:12:33+03:00

Commit Message:
NANCY: NANCY15: Add a cheat to win the escape grid puzzle

Ctrl+Shift+W wins the puzzle, as if the player had reached the goal
(Nancy15's escape grid and Nancy16's ice floes)

Changed paths:
    engines/nancy/action/puzzle/escapegridpuzzle.cpp


diff --git a/engines/nancy/action/puzzle/escapegridpuzzle.cpp b/engines/nancy/action/puzzle/escapegridpuzzle.cpp
index 906f5e29085..c02b6df21d4 100644
--- a/engines/nancy/action/puzzle/escapegridpuzzle.cpp
+++ b/engines/nancy/action/puzzle/escapegridpuzzle.cpp
@@ -1238,6 +1238,15 @@ void EscapeGridPuzzle::handleInput(NancyInput &input) {
 		return;
 	}
 
+	// Cheat: Ctrl+Shift+W wins the puzzle, as if the player had reached the goal
+	for (const Common::KeyState &key : input.otherKbdInput) {
+		if ((key.flags & Common::KBD_CTRL) && (key.flags & Common::KBD_SHIFT) && key.keycode == Common::KEYCODE_w) {
+			debug("Escape grid cheat: puzzle won");
+			endPuzzle(0);
+			return;
+		}
+	}
+
 	const bool click = (input.input & NancyInput::kLeftMouseButtonUp) != 0;
 	const bool playerToMove = _actors[_turn].isPlayer && !_moveIssued && !_slidingPhase && !actorsAnimating();
 


Commit: 9fe4892ec611fa58ccb2331008ca377d48f50930
    https://github.com/scummvm/scummvm/commit/9fe4892ec611fa58ccb2331008ca377d48f50930
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-15T01:12:35+03:00

Commit Message:
NANCY: NANCY16: Add a cheat to win the fox and geese game

Ctrl+Shift+W traps the fox where it stands, and wins the game

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


diff --git a/engines/nancy/action/puzzle/foxgeesepuzzle.cpp b/engines/nancy/action/puzzle/foxgeesepuzzle.cpp
index 90afd90034c..4baf5127a74 100644
--- a/engines/nancy/action/puzzle/foxgeesepuzzle.cpp
+++ b/engines/nancy/action/puzzle/foxgeesepuzzle.cpp
@@ -332,7 +332,7 @@ bool FoxGeesePuzzle::findMoveNearCenter(const Common::Array<Common::Point> &move
 	return true;
 }
 
-void FoxGeesePuzzle::startFoxTurn() {
+void FoxGeesePuzzle::findFox() {
 	for (int y = 0; y < kBoardSize; ++y) {
 		for (int x = 0; x < kBoardSize; ++x) {
 			if (_pieces[y][x] == kFox) {
@@ -340,20 +340,28 @@ void FoxGeesePuzzle::startFoxTurn() {
 			}
 		}
 	}
+}
 
-	Common::Point to, over;
-	if (!findFoxMove(to, over)) {
-		// The fox is trapped; the ending may depend on where
-		for (const WinEnding &win : _winEndings) {
-			for (const Common::Point &pos : win.foxPositions) {
-				if (pos == _foxFrom) {
-					startEnding(win.ending);
-					return;
-				}
+// The fox is trapped; the ending may depend on where
+void FoxGeesePuzzle::startWinEnding() {
+	for (const WinEnding &win : _winEndings) {
+		for (const Common::Point &pos : win.foxPositions) {
+			if (pos == _foxFrom) {
+				startEnding(win.ending);
+				return;
 			}
 		}
+	}
+
+	startEnding(_defaultWinEnding);
+}
+
+void FoxGeesePuzzle::startFoxTurn() {
+	findFox();
 
-		startEnding(_defaultWinEnding);
+	Common::Point to, over;
+	if (!findFoxMove(to, over)) {
+		startWinEnding();
 		return;
 	}
 
@@ -529,6 +537,16 @@ void FoxGeesePuzzle::handleInput(NancyInput &input) {
 		return;
 	}
 
+	// Cheat: Ctrl+Shift+W traps the fox where it stands, and wins the game
+	for (const Common::KeyState &key : input.otherKbdInput) {
+		if ((key.flags & Common::KBD_CTRL) && (key.flags & Common::KBD_SHIFT) && key.keycode == Common::KEYCODE_w) {
+			debug("Fox and geese cheat: game won");
+			findFox();
+			startWinEnding();
+			return;
+		}
+	}
+
 	Common::Rect viewportBounds = NancySceneState.getViewport().getBounds();
 	if (!NancySceneState.getViewport().convertViewportToScreen(viewportBounds).contains(input.mousePos)) {
 		return;
diff --git a/engines/nancy/action/puzzle/foxgeesepuzzle.h b/engines/nancy/action/puzzle/foxgeesepuzzle.h
index 31be96590b5..d647dd7ee6b 100644
--- a/engines/nancy/action/puzzle/foxgeesepuzzle.h
+++ b/engines/nancy/action/puzzle/foxgeesepuzzle.h
@@ -90,6 +90,8 @@ protected:
 	bool findMoveNearCenter(const Common::Array<Common::Point> &moves, Common::Point &to) const;
 
 	void startFoxTurn();
+	void findFox();
+	void startWinEnding();
 	void finishFoxMove();
 	void placeGoose(const Common::Point &mousePos);
 	void startEnding(const Ending &ending);


Commit: 2aea96fddf81b672c315451827ec3665f5f5189a
    https://github.com/scummvm/scummvm/commit/2aea96fddf81b672c315451827ec3665f5f5189a
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-15T01:12:37+03:00

Commit Message:
NANCY: NANCY16: Add cheats to the snowmobile rides

Ctrl+Shift+H undoes the damage of the obstacles hit so far, and
Ctrl+Shift+W wins the chase

Changed paths:
    engines/nancy/action/puzzle/snowmobilepuzzle.cpp


diff --git a/engines/nancy/action/puzzle/snowmobilepuzzle.cpp b/engines/nancy/action/puzzle/snowmobilepuzzle.cpp
index 1cc02a94f24..f5807dfc10f 100644
--- a/engines/nancy/action/puzzle/snowmobilepuzzle.cpp
+++ b/engines/nancy/action/puzzle/snowmobilepuzzle.cpp
@@ -992,6 +992,22 @@ void SnowmobilePuzzle::handleInput(NancyInput &input) {
 
 	_inputFlags = input.input;
 
+	// Cheat: Ctrl+Shift+H repairs the snowmobile, undoing the damage of the obstacles hit so far
+	for (const Common::KeyState &key : input.otherKbdInput) {
+		if ((key.flags & Common::KBD_CTRL) && (key.flags & Common::KBD_SHIFT) && key.keycode == Common::KEYCODE_h) {
+			_car.damage = 0;
+			debug("Snowmobile cheat: damage repaired");
+		}
+
+		// Cheat: Ctrl+Shift+W wins the chase, as if every stage of it was done
+		if (_variant == kChase && (key.flags & Common::KBD_CTRL) && (key.flags & Common::KBD_SHIFT) &&
+				key.keycode == Common::KEYCODE_w) {
+			changeScene(_winScene);
+			NancySceneState.setEventFlag(_winFlag, g_nancy->_true);
+			debug("Snowmobile cheat: chase won");
+		}
+	}
+
 	// The arrow keys take over the steering until the mouse is moved again
 	if (_inputFlags & (NancyInput::kMoveUp | NancyInput::kMoveDown | NancyInput::kMoveLeft | NancyInput::kMoveRight)) {
 		_isMouseSteering = false;


Commit: df63840c16b624afb139a7b397c9cbf539e597a5
    https://github.com/scummvm/scummvm/commit/df63840c16b624afb139a7b397c9cbf539e597a5
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-15T01:12:38+03:00

Commit Message:
NANCY: Fix the scene sounds and music on scene changes

>From Nancy16 on, scene changes no longer stop the sounds, as only
loading a game does (a movie that changed the scene cut off Nancy's
closing monologue in Nancy16 scenes 6514-6532). In Nancy13-18, a new
track of the area's music starts after any scene change once the
previous one has ended, and in Nancy17-18 also when a scene starts in
a stream of its own.

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


diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index 0a8669f7274..22fc2d2f5b8 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -197,19 +197,24 @@ void Scene::process() {
 		// fall through
 	case kStartSound:
 		_state = kRun;
-		if (_sceneState.currentScene.continueSceneSound == kLoadSceneSound) {
+		// From Nancy16 on, scene changes have no say about the sounds: they keep playing
+		// into the new scene (e.g. Nancy's closing monologue, Nancy16 scenes 6514-6532).
+		// Only loading a game stops them.
+		if (_sceneState.currentScene.continueSceneSound == kLoadSceneSound && g_nancy->getGameType() <= kGameTypeNancy15) {
 			g_nancy->_sound->stopAndUnloadSceneSpecificSounds();
 
-			if (g_nancy->getGameType() <= kGameTypeNancy15) {
+			if (g_nancy->getGameType() <= kGameTypeNancy12) {
 				g_nancy->_sound->loadSound(_sceneState.summary.sound);
 				g_nancy->_sound->playSound(_sceneState.summary.sound);
 			}
 		}
 
-		// Nancy16 scenes name the music mix of their area. A track of it, picked at
-		// random, starts whenever a scene finds its music channel silent, so the
-		// tracks follow one another with no regard to scene changes.
-		if (g_nancy->getGameType() == kGameTypeNancy16 && !g_nancy->_sound->isSoundPlaying(_sceneState.summary.sound)) {
+		// From Nancy13 on, the sound of a scene can name the music mix of its area (its
+		// environment, from Nancy17 on). A track of it, picked at random, starts whenever
+		// a scene finds the channel of its sound silent, so the tracks follow one another
+		// with no regard to scene changes.
+		if (g_nancy->getGameType() >= kGameTypeNancy13 && g_nancy->getGameType() <= kGameTypeNancy18 &&
+				!g_nancy->_sound->isSoundPlaying(_sceneState.summary.sound)) {
 			g_nancy->_sound->loadSound(_sceneState.summary.sound, nullptr, true);
 			g_nancy->_sound->playSound(_sceneState.summary.sound);
 		}
diff --git a/engines/nancy/state/scenestream.cpp b/engines/nancy/state/scenestream.cpp
index e6a834b44cc..e2c77d69c78 100644
--- a/engines/nancy/state/scenestream.cpp
+++ b/engines/nancy/state/scenestream.cpp
@@ -23,6 +23,7 @@
 #include "engines/nancy/iff.h"
 #include "engines/nancy/input.h"
 #include "engines/nancy/resource.h"
+#include "engines/nancy/sound.h"
 #include "engines/nancy/util.h"
 
 #include "engines/nancy/action/actionrecord.h"
@@ -241,8 +242,10 @@ bool SceneStream::loadScene() {
 	}
 
 	Common::Path videoFile;
+	SoundDescription sound;
 	summaryChunk->skip(0x32);	// Description
 	readFilename(*summaryChunk, videoFile);
+	sound.readTerse(*summaryChunk);
 	delete summaryChunk;
 
 	beginScene();
@@ -264,6 +267,14 @@ bool SceneStream::loadScene() {
 	}
 
 	delete sceneIFF;
+
+	// Like the main scene, the scene of a stream starts the music of the area it names
+	// when the channel of its sound is silent
+	if (!sound.name.empty() && !g_nancy->_sound->isSoundPlaying(sound)) {
+		g_nancy->_sound->loadSound(sound, nullptr, true);
+		g_nancy->_sound->playSound(sound);
+	}
+
 	return true;
 }
 


Commit: 1e49ab9fb16efbe79991ac9f668d54c4bc503bab
    https://github.com/scummvm/scummvm/commit/1e49ab9fb16efbe79991ac9f668d54c4bc503bab
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-15T02:11:13+03:00

Commit Message:
NANCY: NANCY13: Keep the scene sounds playing on movie scene changes

Movies in Nancy13 and up change the scene without stopping its sounds
(e.g. Nancy's intro monologue in Nancy14 scenes 0 -> 6401)

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


diff --git a/engines/nancy/action/secondarymovie.cpp b/engines/nancy/action/secondarymovie.cpp
index 4871cf5a9ea..ac71d913af3 100644
--- a/engines/nancy/action/secondarymovie.cpp
+++ b/engines/nancy/action/secondarymovie.cpp
@@ -730,6 +730,9 @@ void PlaySecondaryMovie::readDataNancy13(Common::Serializer &ser, Common::Seekab
 	ser.syncAsSint16LE(_sceneChange.sceneID);
 	ser.syncAsUint16LE(_sceneChange.frameID);
 
+	// The scene sounds keep playing
+	_sceneChange.continueSceneSound = kContinueSceneSound;
+
 	_playDirection = orderSentinelFrame(_lastFrame) < orderSentinelFrame(_firstFrame) ?
 		kPlayMovieReverse : kPlayMovieForward;
 
@@ -812,6 +815,9 @@ void PlaySecondaryMovie::readDataNancy14(Common::Serializer &ser, Common::Seekab
 	ser.syncAsSint16LE(_sceneChange.sceneID);
 	ser.syncAsUint16LE(_sceneChange.frameID);
 
+	// The scene sounds keep playing (e.g. Nancy's monologue in Nancy14 scenes 0 -> 6401)
+	_sceneChange.continueSceneSound = kContinueSceneSound;
+
 	// Nancy17 marks "no scene change" with a different value
 	if (g_nancy->getGameType() >= kGameTypeNancy17 && _sceneChange.sceneID == kNoSceneNancy17) {
 		_sceneChange.sceneID = kNoScene;


Commit: c6777a499f23247b91469ea86b361dd8a655f4e0
    https://github.com/scummvm/scummvm/commit/c6777a499f23247b91469ea86b361dd8a655f4e0
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-15T02:13:38+03:00

Commit Message:
NANCY: NANCY14: Wait for a free channel to start concatenated sounds

A line still playing on the channel, even one left by the previous
scene, now finishes first (e.g. Nancy14 scene 6401)

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


diff --git a/engines/nancy/action/soundrecords.cpp b/engines/nancy/action/soundrecords.cpp
index c3851587b56..bd151116b60 100644
--- a/engines/nancy/action/soundrecords.cpp
+++ b/engines/nancy/action/soundrecords.cpp
@@ -728,6 +728,12 @@ void ConcatMultiSound::execute() {
 		}
 
 		if (!_soundStarted) {
+			// Wait for the channel to fall silent, even when the sound playing on it
+			// belongs to another record (e.g. Nancy14 scenes 0 -> 6401)
+			if (g_nancy->_sound->isSoundPlaying(_sound.channelID)) {
+				break;
+			}
+
 			startCurrentSound();
 			_soundStarted = true;
 		} else {




More information about the Scummvm-git-logs mailing list