[Scummvm-git-logs] scummvm master -> 3e2de137d6f82aead14365e3926ae9a2cc9c48e6

Helco noreply at scummvm.org
Thu May 28 16:12:14 UTC 2026


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

Summary:
26e52627d4 ALCACHOFA: V1/V2: Fix camera transitions from menus
9b47c47dcc ALCACHOFA: V1/V2: Fix object name draw offsets
3e2de137d6 ALCACHOFA: V1/V2: Fix music repeating in inventory


Commit: 26e52627d4998bb5a01971126e88373c8fef2ae2
    https://github.com/scummvm/scummvm/commit/26e52627d4998bb5a01971126e88373c8fef2ae2
Author: Helco (hermann.noll at hotmail.com)
Date: 2026-05-28T18:11:45+02:00

Commit Message:
ALCACHOFA: V1/V2: Fix camera transitions from menus

Changed paths:
    engines/alcachofa/camera.cpp
    engines/alcachofa/camera.h


diff --git a/engines/alcachofa/camera.cpp b/engines/alcachofa/camera.cpp
index 9904ef42300..4c17e3160e3 100644
--- a/engines/alcachofa/camera.cpp
+++ b/engines/alcachofa/camera.cpp
@@ -179,7 +179,7 @@ void CameraV1::preUpdate() {
 
 void CameraV1::update() {
 	auto deltaTime = (g_engine->getMillis() - _lastUpdateTime) / 1000.0f;
-	auto newCenter = _appliedCenter;
+	auto newCenter = _usedCenter;
 
 	if (_followTarget != nullptr) {
 		// this threshold is responsible for the jitter while following
@@ -201,7 +201,7 @@ void CameraV1::update() {
 		updateLerping(newCenter, deltaTime, _lerpSpeed);
 	}
 
-	setAppliedCenter(newCenter);
+	setAppliedCenter(_usedCenter = newCenter);
 }
 
 void CameraV1::updateLerping(Vector3d &newCenter, float deltaTime, float speed) {
@@ -219,11 +219,11 @@ void CameraV1::updateLerping(Vector3d &newCenter, float deltaTime, float speed)
 
 void CameraV2::update() {
 	auto deltaTime = (g_engine->getMillis() - _lastUpdateTime) / 1000.0f;
-	auto newCenter = _appliedCenter;
+	auto newCenter = _usedCenter;
 
 	if (_followTarget != nullptr) {
 		_target = as3D(_followTarget->position());
-		auto delta = _target - _appliedCenter;
+		auto delta = _target - _usedCenter;
 		_isLerping |= MAX(fabsf(delta.x()), fabsf(delta.y())) > 35.0f;
 
 		if (_isLerping) {
@@ -238,7 +238,7 @@ void CameraV2::update() {
 	} else if (_isLerping)
 		updateLerping(newCenter, deltaTime, _lerpSpeed);
 
-	setAppliedCenter(newCenter);
+	setAppliedCenter(_usedCenter = newCenter);
 }
 
 void CameraV1::setRoomBounds(Graphic &background) {
@@ -263,7 +263,7 @@ void CameraV1::setFollow(WalkingCharacter *target) {
 	_followTarget = target;
 	_isLerping = false;
 	if (target != nullptr)
-		setAppliedCenter(as3D(target->position()));
+		setAppliedCenter(_usedCenter = as3D(target->position()));
 }
 
 void CameraV2::setFollow(WalkingCharacter *target) {
@@ -302,7 +302,7 @@ void CameraV1::onCloseMenu() {
 }
 
 void CameraV1::syncGame(Serializer &s) {
-	syncVector(s, _appliedCenter);
+	syncVector(s, _usedCenter);
 	syncMatrix(s, _mat3Dto2D);
 	syncMatrix(s, _mat2Dto3D);
 	syncFollowTarget(s, _followTarget);
@@ -310,6 +310,7 @@ void CameraV1::syncGame(Serializer &s) {
 	s.syncAsByte(_isLerping);
 	s.syncAsFloatLE(_lerpSpeed);
 	s.syncAsUint32LE(_lastUpdateTime);
+	_appliedCenter = _usedCenter;
 } 
 
 void CameraV1::lerpOrSet(Point target, int32 mode) {
@@ -321,15 +322,15 @@ void CameraV1::lerpOrSet(Point target, int32 mode) {
 	if (mode == 1) {
 		// snap to target
 		_isLerping = false;
-		_appliedCenter = _target;
+		_usedCenter = _target;
 	} else if (mode <= 0) {
 		// fixed speed, overshoot target
-		_target.x() += copysignf(100, _appliedCenter.x() - _target.x());
-		_target.y() += copysignf(100, _appliedCenter.y() - _target.y());
+		_target.x() += copysignf(100, _usedCenter.x() - _target.x());
+		_target.y() += copysignf(100, _usedCenter.y() - _target.y());
 		_lerpSpeed = 350.0f;
 	} else {
 		// dynamic speed
-		_lerpSpeed = MAX(1.0f, _target.getDistanceTo(_appliedCenter) / mode);
+		_lerpSpeed = MAX(1.0f, _target.getDistanceTo(_usedCenter) / mode);
 	}
 }
 
@@ -350,7 +351,7 @@ struct CamV1DisguiseTask final : public Task {
 
 	TaskReturn run() override {
 		if (_startTime == 0) {
-			_startPosition = _camera._appliedCenter;
+			_startPosition = _camera._usedCenter;
 			_startTime = g_engine->getMillis();
 		}
 		if (_durationMs <= 0 || g_engine->getMillis() - _startTime >= (uint32)_durationMs)
@@ -364,7 +365,7 @@ struct CamV1DisguiseTask final : public Task {
 			newPosition.y() += 100 - t;
 		else if (t >= 200)
 			newPosition.y() += t - 200;
-		_camera._appliedCenter = newPosition;
+		_camera._usedCenter = newPosition;
 		_camera.setFollow(nullptr);
 
 		return TaskReturn::yield();
@@ -414,9 +415,9 @@ void CameraV3::preUpdate() {
 void CameraV3::setRoomBounds(Graphic &background) {
 	auto bgSize = background.animation().imageSize(0);
 	/* The fallback fixes a bug where if the background image is invalid the original engine
-		* would not update the background size. This would be around 1024,768 due to
-		* previous rooms in the bug instances I found.
-		*/
+	 * would not update the background size. This would be around 1024,768 due to
+	 * previous rooms in the bug instances I found.
+	 */
 	if (bgSize == Point(0, 0))
 		bgSize = Point(1024, 768);
 
diff --git a/engines/alcachofa/camera.h b/engines/alcachofa/camera.h
index bb2aa608c9f..4c4b93d3af6 100644
--- a/engines/alcachofa/camera.h
+++ b/engines/alcachofa/camera.h
@@ -99,7 +99,11 @@ protected:
 	void updateLerping(Math::Vector3d &newCenter, float deltaTime, float speed);
 
 	WalkingCharacter *_followTarget = nullptr;
-	Math::Vector3d _target;
+	Math::Vector3d
+		_usedCenter, // in V2 the used center is not clipped (that would _appliedCenter)
+					 // in menus this variable stays in room space and is clipped to the one valid menu pos
+					 // as such it acts like the state backup in CameraV3
+		_target;
 	bool _isLerping = false;
 	float _lerpSpeed = 0.0f;
 	uint32 _lastUpdateTime = 0;


Commit: 9b47c47dcceb36dfc98054175fb6d84de9e96e56
    https://github.com/scummvm/scummvm/commit/9b47c47dcceb36dfc98054175fb6d84de9e96e56
Author: Helco (hermann.noll at hotmail.com)
Date: 2026-05-28T18:11:45+02:00

Commit Message:
ALCACHOFA: V1/V2: Fix object name draw offsets

Changed paths:
    engines/alcachofa/game-v1.cpp
    engines/alcachofa/game-v2.cpp
    engines/alcachofa/game-v3.cpp
    engines/alcachofa/game.h
    engines/alcachofa/general-objects.cpp


diff --git a/engines/alcachofa/game-v1.cpp b/engines/alcachofa/game-v1.cpp
index 4f056d77e21..4ffa1c67cf4 100644
--- a/engines/alcachofa/game-v1.cpp
+++ b/engines/alcachofa/game-v1.cpp
@@ -183,6 +183,10 @@ public:
 		return Point(g_system->getWidth() / 2, 150);
 	}
 
+	Point getObjectNameOffset() override {
+		return Point(0, -50);
+	}
+
 	const char *getMenuRoom() override {
 		return "MENU";
 	}
diff --git a/engines/alcachofa/game-v2.cpp b/engines/alcachofa/game-v2.cpp
index 3ebeed161be..47300607ded 100644
--- a/engines/alcachofa/game-v2.cpp
+++ b/engines/alcachofa/game-v2.cpp
@@ -131,6 +131,10 @@ public:
 		return Point(g_system->getWidth() / 2, g_system->getHeight() - 200);
 	}
 
+	Point getObjectNameOffset() override {
+		return Point(0, -50);
+	}
+
 	const char *getMenuRoom() override {
 		return "MENUPRINCIPAL";
 	}
diff --git a/engines/alcachofa/game-v3.cpp b/engines/alcachofa/game-v3.cpp
index 65b6bd740e8..666a2409609 100644
--- a/engines/alcachofa/game-v3.cpp
+++ b/engines/alcachofa/game-v3.cpp
@@ -236,6 +236,10 @@ public:
 		return Point(g_system->getWidth() / 2, g_system->getHeight() - 200);
 	}
 
+	Point getObjectNameOffset() override {
+		return Point(0, -35);
+	}
+
 	const char *getMenuRoom() override {
 		return "MENUPRINCIPAL";
 	}
diff --git a/engines/alcachofa/game.h b/engines/alcachofa/game.h
index c91ef61f8ac..41489eb72a3 100644
--- a/engines/alcachofa/game.h
+++ b/engines/alcachofa/game.h
@@ -64,6 +64,7 @@ public:
 	virtual const char *getObjectFileName() = 0;
 	virtual char getTextFileKey() = 0;
 	virtual Common::Point getSubtitlePos() = 0;
+	virtual Common::Point getObjectNameOffset() = 0;
 	virtual const char *getMenuRoom() = 0;
 	virtual const char *getInitScriptName() = 0;
 	virtual int32 getKernelTaskArgCount(int32 kernelTaskI); // only necessary for V1
diff --git a/engines/alcachofa/general-objects.cpp b/engines/alcachofa/general-objects.cpp
index 7b09803d9dc..7b7dc7b48a2 100644
--- a/engines/alcachofa/general-objects.cpp
+++ b/engines/alcachofa/general-objects.cpp
@@ -279,7 +279,7 @@ void ShapeObject::onHoverUpdate() {
 	g_engine->drawQueue().add<TextDrawRequest>(
 		g_engine->globalUI().generalFont(),
 		g_engine->world().getLocalizedName(name()),
-		g_engine->input().mousePos2D() - Point(0, 35),
+		g_engine->input().mousePos2D() + g_engine->game().getObjectNameOffset(),
 		-1, true, kWhite, -kForegroundOrderCount);
 }
 


Commit: 3e2de137d6f82aead14365e3926ae9a2cc9c48e6
    https://github.com/scummvm/scummvm/commit/3e2de137d6f82aead14365e3926ae9a2cc9c48e6
Author: Helco (hermann.noll at hotmail.com)
Date: 2026-05-28T18:11:45+02:00

Commit Message:
ALCACHOFA: V1/V2: Fix music repeating in inventory

Changed paths:
    engines/alcachofa/game-v1.cpp
    engines/alcachofa/game-v2.cpp
    engines/alcachofa/player.cpp
    engines/alcachofa/player.h


diff --git a/engines/alcachofa/game-v1.cpp b/engines/alcachofa/game-v1.cpp
index 4ffa1c67cf4..67d0d4d8b5d 100644
--- a/engines/alcachofa/game-v1.cpp
+++ b/engines/alcachofa/game-v1.cpp
@@ -385,7 +385,7 @@ public:
 	}
 
 	String getMusicPath(int32 trackId) override {
-		const Room *room = g_engine->player().currentRoom();
+		const Room *room = g_engine->player().lastGameRoom();
 		const int diskId = room != nullptr && room->mapIndex() == 1 ? 2 : 1;
 		return String::format("disk%d/track%02d", diskId, trackId);
 	}
diff --git a/engines/alcachofa/game-v2.cpp b/engines/alcachofa/game-v2.cpp
index 47300607ded..0eb55d68fcf 100644
--- a/engines/alcachofa/game-v2.cpp
+++ b/engines/alcachofa/game-v2.cpp
@@ -278,7 +278,7 @@ public:
 	}
 
 	String getMusicPath(int32 trackId) override {
-		const Room *room = g_engine->player().currentRoom();
+		const Room *room = g_engine->player().lastGameRoom();
 		const char *dirName = room != nullptr && room->mapIndex() == 1 ? "Music_Cleopatra" : "Music";
 		return String::format("%s/Track%02d", dirName, trackId);
 	}
diff --git a/engines/alcachofa/player.cpp b/engines/alcachofa/player.cpp
index 0c77c33c2fd..a1dd96fe410 100644
--- a/engines/alcachofa/player.cpp
+++ b/engines/alcachofa/player.cpp
@@ -359,6 +359,19 @@ bool Player::isAllowedToOpenMenu() {
 		   !_isInTemporaryRoom; // we cannot reliably store this state across multiple room changes
 }
 
+Room *Player::lastGameRoom() const {
+	// save from in-game menu
+	if (g_engine->menu().isOpen() && g_engine->menu().previousRoom() != nullptr)
+		return g_engine->menu().previousRoom();
+
+	// save from ScummVM while in inventory
+	if (currentRoom() == &g_engine->world().inventory() && _roomBeforeInventory != nullptr)
+		return _roomBeforeInventory;
+
+	// save from ScumnmVM global menu or autosave in normal gameplay
+	return currentRoom(); // this *could* still return nullptr but only at the very start of the engine	
+}
+
 void Player::syncGame(Serializer &s) {
 	auto characterKind = activeCharacterKind();
 	syncEnum(s, characterKind);
@@ -378,11 +391,8 @@ void Player::syncGame(Serializer &s) {
 
 	String roomName;
 	if (s.isSaving()) {
-		bool isInInventory = currentRoom() == &g_engine->world().inventory();
-		roomName =
-			g_engine->menu().isOpen() ? g_engine->menu().previousRoom()->name() // save from in-game menu
-			: isInInventory && _roomBeforeInventory != nullptr ? _roomBeforeInventory->name() // save from ScummVM while in inventory
-			: currentRoom()->name(); // save from ScumnmVM global menu or autosave in normal gameplay
+		// only call lastGameRoom if we are saving, a load-on-start might not have a current room yet
+		roomName = lastGameRoom()->name();
 	}
 	s.syncString(roomName);
 	if (s.isLoading()) {
diff --git a/engines/alcachofa/player.h b/engines/alcachofa/player.h
index 094f9b33cbd..ea38313a56e 100644
--- a/engines/alcachofa/player.h
+++ b/engines/alcachofa/player.h
@@ -56,6 +56,7 @@ public:
 	void stopLastDialogCharacters();
 	void setActiveCharacter(MainCharacterKind kind);
 	bool isAllowedToOpenMenu();
+	Room *lastGameRoom() const; // used for saves and music chapter
 	void syncGame(Common::Serializer &s);
 
 private:




More information about the Scummvm-git-logs mailing list