[Scummvm-git-logs] scummvm master -> 6f7b060d3f940c9dec1a33172a2c4273f86cce69

bluegr noreply at scummvm.org
Fri Oct 23 22:46:48 UTC 2026


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

Summary:
8acb13355b NANCY: NANCY17: Use the data cursors of the scene change hotspots
31d73272ba NANCY: NANCY17: Skip a movie that fails to decode
3a01db78c0 NANCY: NANCY16: Move the caret of the NDUI edit box with the arrow keys
d280df677c NANCY: Keep random movies on screen while they pause
e9639de7c3 NANCY: NANCY17: Hide the rain while its record's conditions fail
6f7b060d3f NANCY: NANCY16: Don't swallow clicks on flag hotspots with high cursors


Commit: 8acb13355b0408bd15be2949336d317a1f231bac
    https://github.com/scummvm/scummvm/commit/8acb13355b0408bd15be2949336d317a1f231bac
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-24T01:46:06+03:00

Commit Message:
NANCY: NANCY17: Use the data cursors of the scene change hotspots

The cursor of SceneChangeWithExtras, HeldItemFlags and UTurn is a
cursor of the game data, not an engine cursor type

Changed paths:
    engines/nancy/action/miscrecords.h
    engines/nancy/action/navigationrecords.h


diff --git a/engines/nancy/action/miscrecords.h b/engines/nancy/action/miscrecords.h
index f114c30b8ac..9c9d202c73a 100644
--- a/engines/nancy/action/miscrecords.h
+++ b/engines/nancy/action/miscrecords.h
@@ -762,6 +762,7 @@ public:
 	void execute() override;
 
 	CursorManager::CursorType getHoverCursor() const override { return _hoverCursor; }
+	bool cursorSetFromScript() const override { return true; }
 	bool canHaveHotspot() const override { return true; }
 
 protected:
@@ -817,6 +818,7 @@ public:
 	void execute() override;
 
 	CursorManager::CursorType getHoverCursor() const override { return _hoverCursor; }
+	bool cursorSetFromScript() const override { return true; }
 	bool canHaveHotspot() const override { return true; }
 
 protected:
diff --git a/engines/nancy/action/navigationrecords.h b/engines/nancy/action/navigationrecords.h
index f73c768fb56..7e1976a8556 100644
--- a/engines/nancy/action/navigationrecords.h
+++ b/engines/nancy/action/navigationrecords.h
@@ -304,6 +304,7 @@ public:
 	void execute() override;
 
 	CursorManager::CursorType getHoverCursor() const override { return _hoverCursor; }
+	bool cursorSetFromScript() const override { return true; }
 	bool canHaveHotspot() const override { return (_extras & kHotspots) != 0; }
 
 protected:


Commit: 31d73272ba676bf446a651c962039ea889048108
    https://github.com/scummvm/scummvm/commit/31d73272ba676bf446a651c962039ea889048108
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-24T01:46:08+03:00

Commit Message:
NANCY: NANCY17: Skip a movie that fails to decode

- LIB_BaANIM is damaged and crashed the Bink decoder in scenes 2613,
  2661 and 2663; it is a small loop nothing depends on
- Keep the known broken movies in a table, with the Nancy14 one

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


diff --git a/engines/nancy/action/secondarymovie.cpp b/engines/nancy/action/secondarymovie.cpp
index ac71d913af3..c0c9cdf223e 100644
--- a/engines/nancy/action/secondarymovie.cpp
+++ b/engines/nancy/action/secondarymovie.cpp
@@ -700,6 +700,27 @@ int PlaySecondaryMovie::rollNextSequence() {
 	return -1;
 }
 
+// Movies whose data is damaged, and fails to decode in other players too
+struct BrokenMovie {
+	GameType gameType;
+	const char *name;
+};
+
+static const BrokenMovie kBrokenMovies[] = {
+	{ kGameTypeNancy14, "OFF0007_Water_OVLANIM" },
+	{ kGameTypeNancy17, "LIB_BaANIM" }	// scenes 2613, 2661 and 2663
+};
+
+static bool isBrokenMovie(const Common::Path &videoName) {
+	for (const BrokenMovie &movie : kBrokenMovies) {
+		if (g_nancy->getGameType() == movie.gameType && videoName.baseName().equalsIgnoreCase(movie.name)) {
+			return true;
+		}
+	}
+
+	return false;
+}
+
 // Orders a frame field that may still hold a sentinel: -1 is the movie's own
 // first frame, -2 its last.
 static int32 orderSentinelFrame(uint16 frame) {
@@ -1230,8 +1251,8 @@ void PlaySecondaryMovie::execute() {
 
 	switch (_state) {
 	case kBegin:
-		// WORKAROUND: Skip playing a known broken overlay animation in Nancy14
-		if (g_nancy->getGameType() == kGameTypeNancy14 && _videoName.baseName().equalsIgnoreCase("OFF0007_Water_OVLANIM")) {
+		// WORKAROUND: Skip playing the movies that fail to decode
+		if (isBrokenMovie(_videoName)) {
 			_isDone = true;
 			return;
 		}


Commit: 3a01db78c0ce83925ae923284701f9a1d2a02b3f
    https://github.com/scummvm/scummvm/commit/3a01db78c0ce83925ae923284701f9a1d2a02b3f
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-24T01:46:11+03:00

Commit Message:
NANCY: NANCY16: Move the caret of the NDUI edit box with the arrow keys

The keymapper turns the arrow keys into movement, so the edit box
never got them; give it the arrow keys while it has focus

Changed paths:
    engines/nancy/ui/ndui/manager.cpp
    engines/nancy/ui/ndui/manager.h


diff --git a/engines/nancy/ui/ndui/manager.cpp b/engines/nancy/ui/ndui/manager.cpp
index 026f60d63b5..5c0af900fc2 100644
--- a/engines/nancy/ui/ndui/manager.cpp
+++ b/engines/nancy/ui/ndui/manager.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "common/debug.h"
+#include "common/events.h"
 #include "common/memstream.h"
 
 #include "engines/nancy/nancy.h"
@@ -274,7 +275,23 @@ InvButton *Manager::findItemButton(int16 itemID) const {
 	return nullptr;
 }
 
+// The keymapper turns the arrow keys into movement, so they never arrive as keys
+struct ArrowKey {
+	uint16 input;
+	Common::KeyCode key;
+};
+
+static const ArrowKey kArrowKeys[] = {
+	{ NancyInput::kMoveLeft, Common::KEYCODE_LEFT },
+	{ NancyInput::kMoveRight, Common::KEYCODE_RIGHT },
+	{ NancyInput::kMoveUp, Common::KEYCODE_UP },
+	{ NancyInput::kMoveDown, Common::KEYCODE_DOWN }
+};
+
 void Manager::handleInput(NancyInput &input) {
+	const uint16 heldArrowKeys = _heldArrowKeys;
+	_heldArrowKeys = input.input;
+
 	// The dialog on top gets what gets typed
 	for (int i = _panels.size() - 1; i >= 0; --i) {
 		EditBox *editBox = _panels[i]->getKeyboardFocus();
@@ -283,7 +300,16 @@ void Manager::handleInput(NancyInput &input) {
 				editBox->handleKey(key);
 			}
 
+			// The arrow keys move the caret, not the player
+			for (const ArrowKey &arrowKey : kArrowKeys) {
+				if ((input.input & arrowKey.input) && !(heldArrowKeys & arrowKey.input)) {
+					editBox->handleKey(Common::KeyState(arrowKey.key, 0, g_nancy->getEventManager()->getModifierState()));
+				}
+			}
+
 			input.otherKbdInput.clear();
+			input.input &= ~(NancyInput::kMoveUp | NancyInput::kMoveDown | NancyInput::kMoveLeft |
+				NancyInput::kMoveRight | NancyInput::kMoveFastModifier);
 			break;
 		}
 	}
diff --git a/engines/nancy/ui/ndui/manager.h b/engines/nancy/ui/ndui/manager.h
index e8059ca0a3c..3a69858a490 100644
--- a/engines/nancy/ui/ndui/manager.h
+++ b/engines/nancy/ui/ndui/manager.h
@@ -213,6 +213,7 @@ private:
 	// Nancy17 tooltips are drawn on top of every panel
 	RenderObject _tooltipWindow{kTooltipZ};
 	const Control *_hoveredControl = nullptr;
+	uint16 _heldArrowKeys = 0;	// the input of the last frame, to tell when an arrow key goes down
 	Tooltip *_hoveredTooltip = nullptr;
 	const Control *_tooltipControl = nullptr;
 	uint32 _tooltipHoverStart = 0;


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

Commit Message:
NANCY: Keep random movies on screen while they pause

A timed pause between sequences hid the movie, so characters like
Gilbert in Nancy17's scene 1880 kept disappearing and reappearing

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


diff --git a/engines/nancy/action/secondarymovie.cpp b/engines/nancy/action/secondarymovie.cpp
index c0c9cdf223e..965145b5083 100644
--- a/engines/nancy/action/secondarymovie.cpp
+++ b/engines/nancy/action/secondarymovie.cpp
@@ -537,10 +537,9 @@ int PlaySecondaryMovie::beginRandomPause(const RandomSequence &seq) {
 		pauseMs += g_nancy->_randomSource->getRandomNumber(seq.maxPauseMs - seq.minPauseMs - 1);
 	}
 
+	// The movie holds its last frame for the length of the pause
 	_randomPauseMode = kPauseTimed;
 	_randomPauseEndTime = g_system->getMillis() + (uint32)MAX<int32>(0, pauseMs);
-	setVisible(false);
-	_mask.setVisible(false);
 	_decoder.pauseVideo(true);
 	return -1;
 }


Commit: e9639de7c394b3538bda660e5f076935bde37bd9
    https://github.com/scummvm/scummvm/commit/e9639de7c394b3538bda660e5f076935bde37bd9
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-24T01:46:13+03:00

Commit Message:
NANCY: NANCY17: Hide the rain while its record's conditions fail

Scenes like 3211 and 3285 turn the rain off through a flag; its last
drops stayed on screen, frozen

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


diff --git a/engines/nancy/action/miscrecords.cpp b/engines/nancy/action/miscrecords.cpp
index f2c746c2c3b..72cb5cc5623 100644
--- a/engines/nancy/action/miscrecords.cpp
+++ b/engines/nancy/action/miscrecords.cpp
@@ -1878,6 +1878,15 @@ void Rain::execute() {
 	}
 }
 
+// The rain stops once the record's dependencies don't hold anymore, e.g. in the
+// scenes that show something up close
+void Rain::updateGraphics() {
+	if (!_isActive && _areaIndex != -1) {
+		_areaIndex = -1;
+		setVisible(false);
+	}
+}
+
 void Rain::drawDrops() {
 	static const float kDistanceCurve = 0.85f;
 	static const float kDistanceFade = 0.75f;
diff --git a/engines/nancy/action/miscrecords.h b/engines/nancy/action/miscrecords.h
index 9c9d202c73a..76c54569245 100644
--- a/engines/nancy/action/miscrecords.h
+++ b/engines/nancy/action/miscrecords.h
@@ -789,6 +789,7 @@ public:
 
 	void readData(Common::SeekableReadStream &stream) override;
 	void execute() override;
+	void updateGraphics() override;
 
 	bool isViewportRelative() const override { return true; }
 


Commit: 6f7b060d3f940c9dec1a33172a2c4273f86cce69
    https://github.com/scummvm/scummvm/commit/6f7b060d3f940c9dec1a33172a2c4273f86cce69
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-10-24T01:46:15+03:00

Commit Message:
NANCY: NANCY16: Don't swallow clicks on flag hotspots with high cursors

Ignoring clicks over cursors 36 and up belongs to Nancy10-15, where
those are puzzle cursors. From Nancy16 on, the record is handled like
a scene change and takes every click; Nancy17's cemetery exits use
such cursors, and did nothing when clicked

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


diff --git a/engines/nancy/action/datarecords.cpp b/engines/nancy/action/datarecords.cpp
index 227b62fc411..4026e1ec304 100644
--- a/engines/nancy/action/datarecords.cpp
+++ b/engines/nancy/action/datarecords.cpp
@@ -500,10 +500,11 @@ void EventFlagsMultiHS::execute() {
 
 		break;
 	case kActionTrigger:
-		// Swallow clicks if the cursor is in the puzzle-drag range
+		// Swallow clicks if the cursor is in the puzzle-drag range. From Nancy16 on
+		// the record is a scene change without a scene, which takes every click.
 		if (g_nancy->getGameType() <= kGameTypeNancy9 && (_hoverCursor == CursorManager::kCustom1 || _hoverCursor == CursorManager::kCustom2)) {
 			_state = kRun;
-		} else if (g_nancy->getGameType() >= kGameTypeNancy10 &&
+		} else if (g_nancy->getGameType() >= kGameTypeNancy10 && g_nancy->getGameType() <= kGameTypeNancy15 &&
 				(int)_hoverCursor >= (g_nancy->getGameType() >= kGameTypeNancy12 ?
 					CursorManager::kNewUseHand : CursorManager::kNewUseHand - 1)) {
 			// The puzzle-drag cursor range starts one slot earlier before Nancy12




More information about the Scummvm-git-logs mailing list