[Scummvm-git-logs] scummvm master -> ad7a1590815bd8240af7fdea4121b9988597de5f
OMGPizzaGuy
noreply at scummvm.org
Mon Jul 7 02:38:06 UTC 2025
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:
ad7a159081 ULTIMA8: Implement hack mover debug tool.
Commit: ad7a1590815bd8240af7fdea4121b9988597de5f
https://github.com/scummvm/scummvm/commit/ad7a1590815bd8240af7fdea4121b9988597de5f
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2025-07-06T21:35:54-05:00
Commit Message:
ULTIMA8: Implement hack mover debug tool.
Fixes #15373
Changed paths:
engines/ultima/ultima8/debugtools.cpp
engines/ultima/ultima8/gumps/game_map_gump.cpp
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/misc/debugger.h
engines/ultima/ultima8/ultima8.cpp
engines/ultima/ultima8/ultima8.h
diff --git a/engines/ultima/ultima8/debugtools.cpp b/engines/ultima/ultima8/debugtools.cpp
index 1e661e4ea98..59814e51d83 100644
--- a/engines/ultima/ultima8/debugtools.cpp
+++ b/engines/ultima/ultima8/debugtools.cpp
@@ -403,6 +403,10 @@ void onImGuiRender() {
}
ImGui::EndMenu();
}
+ if (ImGui::MenuItem("Hack Mover", NULL, engine->isHackMoverEnabled())) {
+ bool flag = engine->isHackMoverEnabled();
+ engine->setHackMoverEnabled(!flag);
+ }
if (ImGui::MenuItem("Quick Movement", NULL, QuickAvatarMoverProcess::isEnabled())) {
bool flag = QuickAvatarMoverProcess::isEnabled();
QuickAvatarMoverProcess::setEnabled(!flag);
diff --git a/engines/ultima/ultima8/gumps/game_map_gump.cpp b/engines/ultima/ultima8/gumps/game_map_gump.cpp
index bc8e962ac41..9478a5b6f58 100644
--- a/engines/ultima/ultima8/gumps/game_map_gump.cpp
+++ b/engines/ultima/ultima8/gumps/game_map_gump.cpp
@@ -385,10 +385,15 @@ void GameMapGump::IncSortOrder(int count) {
bool GameMapGump::StartDraggingItem(Item *item, int mx, int my) {
// ParentToGump(mx, my);
- if (!item->canDrag()) return false;
+ bool hackMover = Ultima8Engine::get_instance()->isHackMoverEnabled();
+ if (!hackMover) {
+ if (!item->canDrag())
+ return false;
- MainActor *avatar = getMainActor();
- if (!avatar->canReach(item, 128)) return false; // CONSTANT!
+ MainActor *avatar = getMainActor();
+ if (!avatar->canReach(item, 128))
+ return false; // CONSTANT!
+ }
// get item offset
int32 itemx = 0;
@@ -422,19 +427,25 @@ bool GameMapGump::DraggingItem(Item *item, int mx, int my) {
return backpack->CanAddItem(item, true);
}
+ bool hackMover = Ultima8Engine::get_instance()->isHackMoverEnabled();
+ if (hackMover) {
+ Mouse::get_instance()->setMouseCursor(Mouse::MOUSE_TARGET);
+ return true;
+ }
+
bool throwing = false;
if (!avatar->canReach(item, 128, // CONSTANT!
_draggingPos.x, _draggingPos.y, _draggingPos.z)) {
// can't reach, so see if we can throw
int throwrange = item->getThrowRange();
if (throwrange && avatar->canReach(item, throwrange, _draggingPos.x,
- _draggingPos.y, _draggingPos.z)) {
+ _draggingPos.y, _draggingPos.z)) {
int speed = 64 - item->getTotalWeight() + avatar->getStr();
if (speed < 1) speed = 1;
Point3 pt = avatar->getLocation();
MissileTracker t(item, 1, pt.x, pt.y, pt.z,
- _draggingPos.x, _draggingPos.y, _draggingPos.z,
- speed, 4);
+ _draggingPos.x, _draggingPos.y, _draggingPos.z,
+ speed, 4);
if (t.isPathClear())
throwing = true;
else
@@ -479,6 +490,10 @@ void GameMapGump::DropItem(Item *item, int mx, int my) {
bool canReach = avatar->canReach(item, 128, // CONSTANT!
_draggingPos.x, _draggingPos.y, _draggingPos.z);
+ bool hackMover = Ultima8Engine::get_instance()->isHackMoverEnabled();
+ if (hackMover)
+ canReach = true;
+
if (item->getShapeInfo()->hasQuantity()) {
if (item->getQuality() > 1) {
// more than one, so see if we should ask if we should split it up
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index 153e864c192..9eac5c53401 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -89,6 +89,7 @@ Debugger::Debugger() : GUI::Debugger() {
registerCmd("Cheat::toggleInvincibility", WRAP_METHOD(Debugger, cmdInvincibility));
registerCmd("Cheat::items", WRAP_METHOD(Debugger, cmdCheatItems));
registerCmd("Cheat::equip", WRAP_METHOD(Debugger, cmdCheatEquip));
+ registerCmd("Cheat::hackMover", WRAP_METHOD(Debugger, cmdHackMover));
registerCmd("GameMapGump::toggleHighlightItems", WRAP_METHOD(Debugger, cmdHighlightItems));
registerCmd("GameMapGump::toggleFootpads", WRAP_METHOD(Debugger, cmdFootpads));
@@ -630,6 +631,26 @@ bool Debugger::cmdInvincibility(int argc, const char **argv) {
return true;
}
+bool Debugger::cmdHackMover(int argc, const char **argv) {
+ if (argc > 2) {
+ debugPrintf("Usage: %s [on|off]\n", argv[0]);
+ return true;
+ }
+
+ Ultima8Engine *g = Ultima8Engine::get_instance();
+ bool flag = !g->isHackMoverEnabled();
+ if (argc > 1) {
+ if (scumm_stricmp(argv[1], "on") == 0 || scumm_stricmp(argv[1], "true") == 0)
+ flag = true;
+ else if (scumm_stricmp(argv[1], "off") == 0 || scumm_stricmp(argv[1], "false") == 0)
+ flag = false;
+ }
+
+ g->setHackMoverEnabled(flag);
+ debugPrintf("Hack mover = %s\n", strBool(flag));
+ return false;
+}
+
bool Debugger::cmdHighlightItems(int argc, const char **argv) {
if (argc > 2) {
debugPrintf("Usage: %s [on|off]\n", argv[0]);
@@ -1369,11 +1390,6 @@ bool Debugger::cmdQuickMover(int argc, const char **argv) {
return true;
}
- if (!Ultima8Engine::get_instance()->areCheatsEnabled()) {
- debugPrintf("Cheats aren't enabled\n");
- return true;
- }
-
bool flag = !QuickAvatarMoverProcess::isEnabled();
if (argc > 1) {
if (scumm_stricmp(argv[1], "on") == 0 || scumm_stricmp(argv[1], "true") == 0)
diff --git a/engines/ultima/ultima8/misc/debugger.h b/engines/ultima/ultima8/misc/debugger.h
index 5af6e2f0c94..ab5c60d94b0 100644
--- a/engines/ultima/ultima8/misc/debugger.h
+++ b/engines/ultima/ultima8/misc/debugger.h
@@ -66,6 +66,7 @@ private:
bool cmdMaxStats(int argc, const char **argv);
bool cmdHeal(int argc, const char **argv);
bool cmdInvincibility(int argc, const char **argv);
+ bool cmdHackMover(int argc, const char **argv);
// Game Map Gump
bool cmdHighlightItems(int argc, const char **argv);
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 248b39ac7dc..308d0a1acf6 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -139,7 +139,8 @@ Ultima8Engine::Ultima8Engine(OSystem *syst, const Ultima::UltimaGameDescription
_world(nullptr), _desktopGump(nullptr), _gameMapGump(nullptr), _avatarMoverProcess(nullptr),
_frameSkip(false), _frameLimit(true), _interpolate(true), _animationRate(100),
_avatarInStasis(false), _cruStasis(false), _showEditorItems(false), _inversion(0),
- _showTouching(false), _timeOffset(0), _hasCheated(false), _cheatsEnabled(false),
+ _showTouching(false), _hackMoverEnabled(false), _timeOffset(0),
+ _hasCheated(false), _cheatsEnabled(false),
_fontOverride(false), _fontAntialiasing(false), _audioMixer(0), _inverterGump(nullptr),
_lerpFactor(256), _inBetweenFrame(false), _crusaderTeleporting(false), _moveKeyFrame(0),
_highRes(false), _priorFrameCounterTime(0) {
diff --git a/engines/ultima/ultima8/ultima8.h b/engines/ultima/ultima8/ultima8.h
index 197a8dc55e2..3f24c6d284f 100644
--- a/engines/ultima/ultima8/ultima8.h
+++ b/engines/ultima/ultima8/ultima8.h
@@ -122,6 +122,7 @@ private:
//!< nor can Avatar start more usecode
bool _showEditorItems; //!< If true, paint items with the SI_EDITOR flag
bool _showTouching; //!< If true, highlight items touching Avatar
+ bool _hackMoverEnabled; //!< If true, any item can be moved
int32 _timeOffset;
bool _hasCheated;
bool _cheatsEnabled;
@@ -250,6 +251,13 @@ public:
_showTouching = flag;
}
+ bool isHackMoverEnabled() const {
+ return _hackMoverEnabled;
+ }
+ void setHackMoverEnabled(bool flag) {
+ _hackMoverEnabled = flag;
+ }
+
bool isCrusaderTeleporting() const {
return _crusaderTeleporting;
}
More information about the Scummvm-git-logs
mailing list