[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