[Scummvm-git-logs] scummvm master -> 5791d56e0fc5715d4278008ea32827b9e90116d8

bluegr noreply at scummvm.org
Mon Apr 20 01:41:37 UTC 2026


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

Summary:
5791d56e0f NANCY: Add variants of navigation functions for Nancy10+


Commit: 5791d56e0fc5715d4278008ea32827b9e90116d8
    https://github.com/scummvm/scummvm/commit/5791d56e0fc5715d4278008ea32827b9e90116d8
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-04-20T04:40:46+03:00

Commit Message:
NANCY: Add variants of navigation functions for Nancy10+

These variants are for Hot1FrSceneChange and HotMultiframeSceneChange.
HotMultiframeSceneChange has a terse mode now. Also, removed the
readExtra bytes hack for HotSingleFrameSceneChange

Changed paths:
    engines/nancy/action/arfactory.cpp
    engines/nancy/action/navigationrecords.cpp
    engines/nancy/action/navigationrecords.h


diff --git a/engines/nancy/action/arfactory.cpp b/engines/nancy/action/arfactory.cpp
index aa28ee7bf88..8380b66b9e1 100644
--- a/engines/nancy/action/arfactory.cpp
+++ b/engines/nancy/action/arfactory.cpp
@@ -89,14 +89,12 @@ ActionRecord *ActionManager::createActionRecord(uint16 type, Common::SeekableRea
 		if (g_nancy->getGameType() <= kGameTypeNancy9)
 			return new HotMultiframeSceneChange(CursorManager::kHotspot);
 		else
-			return new Hot1FrSceneChange(CursorManager::kExit);	// TODO: cursor
+			return new Hot1FrSceneChange(CursorManager::kNormal, true);
 	case 12:
 		if (g_nancy->getGameType() <= kGameTypeNancy9) {
 			return new SceneChange();
 		} else {
-			// Nancy10+. A simplified version of HotMultiframeSceneChange
-			// TODO: Handle this correctly
-			return nullptr;
+			return new HotMultiframeSceneChange(CursorManager::kNormal, true);
 		}
 	case 13:
 		if (g_nancy->getGameType() <= kGameTypeNancy9)
diff --git a/engines/nancy/action/navigationrecords.cpp b/engines/nancy/action/navigationrecords.cpp
index 820fb1d3a43..834343485bd 100644
--- a/engines/nancy/action/navigationrecords.cpp
+++ b/engines/nancy/action/navigationrecords.cpp
@@ -39,7 +39,18 @@ void SceneChange::execute() {
 }
 
 void HotMultiframeSceneChange::readData(Common::SeekableReadStream &stream) {
-	SceneChange::readData(stream);
+	if (_isTerse) {
+		_hoverCursor = (CursorManager::CursorType)stream.readUint16LE();
+		_sceneChange.sceneID = stream.readUint16LE();
+		_sceneChange.frameID = stream.readUint16LE();
+		_sceneChange.verticalOffset = 0;
+		_sceneChange.continueSceneSound = stream.readUint16LE();
+		_sceneChange.listenerFrontVector.set(0, 0, 1);
+		_sceneChange.frontVectorFrameID = _sceneChange.frameID;
+	} else {
+		SceneChange::readData(stream);
+	}
+	
 	uint16 numHotspots = stream.readUint16LE();
 
 	_hotspots.reserve(numHotspots);
@@ -77,11 +88,6 @@ void HotSingleFrameSceneChange::readData(Common::SeekableReadStream &stream) {
 	_sceneChange.continueSceneSound = kContinueSceneSound;
 	_sceneChange.listenerFrontVector.set(0, 0, 1);
 	readRect(stream, _sceneHotspot.coords);
-	if (_readExtra) {
-		uint16 unk1 = stream.readUint16LE();
-		uint16 unk2 = stream.readUint16LE();
-		debug("Read extra data for HotSingleFrameSceneChange: %u, %u", unk1, unk2);
-	}
 }
 
 void HotSingleFrameSceneChange::execute() {
@@ -100,6 +106,9 @@ void HotSingleFrameSceneChange::execute() {
 }
 
 void Hot1FrSceneChange::readData(Common::SeekableReadStream &stream) {
+	if (_dynamicCursor)
+		_hoverCursor = (CursorManager::CursorType)stream.readUint16LE();
+
 	if (!_isTerse) {
 		SceneChange::readData(stream);
 		_hotspotDesc.readData(stream);
diff --git a/engines/nancy/action/navigationrecords.h b/engines/nancy/action/navigationrecords.h
index 091a83d89db..f7e67fc3f3e 100644
--- a/engines/nancy/action/navigationrecords.h
+++ b/engines/nancy/action/navigationrecords.h
@@ -42,7 +42,7 @@ protected:
 // Changes the scene when clicked
 class HotSingleFrameSceneChange : public SceneChange {
 public:
-	HotSingleFrameSceneChange(bool readExtra = false) : _readExtra(readExtra) {
+	HotSingleFrameSceneChange() {
 		_hasHotspot = false;
 		_hoverCursor = CursorManager::kNormal;
 	}
@@ -57,7 +57,6 @@ public:
 
 protected:
 	CursorManager::CursorType _hoverCursor;
-	bool _readExtra;
 
 	bool canHaveHotspot() const override { return true; }
 	Common::String getRecordTypeName() const override { return "HotSingleFrameSceneChange"; }
@@ -68,7 +67,8 @@ protected:
 // hovering; all of them are handled in this class as well.
 class HotMultiframeSceneChange : public SceneChange {
 public:
-	HotMultiframeSceneChange(CursorManager::CursorType hoverCursor) : _hoverCursor(hoverCursor) {}
+	HotMultiframeSceneChange(CursorManager::CursorType hoverCursor, bool isTerse = false) :
+		_hoverCursor(hoverCursor), _isTerse(isTerse) {}
 	virtual ~HotMultiframeSceneChange() {}
 
 	void readData(Common::SeekableReadStream &stream) override;
@@ -77,10 +77,14 @@ public:
 	CursorManager::CursorType getHoverCursor() const override { return _hoverCursor; }
 
 	Common::Array<HotspotDescription> _hotspots;
+	bool _isTerse = false;
 
 protected:
 	bool canHaveHotspot() const override { return true; }
 	Common::String getRecordTypeName() const override {
+		if (_isTerse)
+			return "HotMultiframeSceneChangeTerse";
+
 		switch (_hoverCursor) {
 		case CursorManager::kMoveForward:
 			return "HotMultiframeForwardSceneChange";
@@ -101,7 +105,8 @@ protected:
 // hovering; all of them are handled in this class as well.
 class Hot1FrSceneChange : public SceneChange {
 public:
-	Hot1FrSceneChange(CursorManager::CursorType hoverCursor) : _hoverCursor(hoverCursor) {}
+	Hot1FrSceneChange(CursorManager::CursorType hoverCursor, bool dynamicCursor = false) :
+		_hoverCursor(hoverCursor), _dynamicCursor(dynamicCursor) {}
 	virtual ~Hot1FrSceneChange() {}
 
 	void readData(Common::SeekableReadStream &stream) override;
@@ -111,13 +116,13 @@ public:
 
 	HotspotDescription _hotspotDesc;
 	bool _isTerse = false;
+	bool _dynamicCursor = false;
 
 protected:
 	bool canHaveHotspot() const override { return true; }
 	Common::String getRecordTypeName() const override {
-		if (_isTerse) {
+		if (_isTerse)
 			return "HotSceneChangeTerse";
-		}
 
 		switch (_hoverCursor) {
 		case CursorManager::kExit:




More information about the Scummvm-git-logs mailing list