[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