[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