[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