[Scummvm-git-logs] scummvm master -> 86a409ef07826354230ea3bc6c3bfe514dbbc903

bluegr noreply at scummvm.org
Fri Jun 20 23:17:14 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:
86a409ef07 ULTIMA8: Replace quick mover keys with a toggle to override normal directional movement


Commit: 86a409ef07826354230ea3bc6c3bfe514dbbc903
    https://github.com/scummvm/scummvm/commit/86a409ef07826354230ea3bc6c3bfe514dbbc903
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2025-06-21T02:17:11+03:00

Commit Message:
ULTIMA8: Replace quick mover keys with a toggle to override normal directional movement

Changed paths:
    engines/ultima/ultima8/metaengine.cpp
    engines/ultima/ultima8/metaengine.h
    engines/ultima/ultima8/misc/debugger.cpp
    engines/ultima/ultima8/misc/debugger.h
    engines/ultima/ultima8/ultima8.cpp
    engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
    engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h


diff --git a/engines/ultima/ultima8/metaengine.cpp b/engines/ultima/ultima8/metaengine.cpp
index 12a7a7e3d55..8b03fda4dc6 100644
--- a/engines/ultima/ultima8/metaengine.cpp
+++ b/engines/ultima/ultima8/metaengine.cpp
@@ -104,12 +104,8 @@ static const KeybindingRecord CRUSADER_KEYS[] = {
 
 static const KeybindingRecord CHEAT_KEYS[] = {
 	{ ACTION_CLIPPING, "CLIPPING", _s("Toggle Clipping"), "M+INSERT", nullptr },
-	{ ACTION_QUICK_MOVE_ASCEND, "ASCEND", _s("Ascend"), "M+HOME", nullptr },
-	{ ACTION_QUICK_MOVE_DESCEND, "DESCEND", _s("Descend"), "M+END", nullptr },
-	{ ACTION_QUICK_MOVE_UP, "MOVE_UP", _s("Move Up"), "M+UP", nullptr },
-	{ ACTION_QUICK_MOVE_DOWN, "MOVE_DOWN", _s("Move Down"), "M+DOWN", nullptr },
-	{ ACTION_QUICK_MOVE_LEFT, "MOVE_LEFT", _s("Move Left"), "M+LEFT", nullptr },
-	{ ACTION_QUICK_MOVE_RIGHT, "MOVE_RIGHT", _s("Move Right"), "M+RIGHT", nullptr },
+	{ ACTION_MOVE_ASCEND, "ASCEND", _s("Ascend"), "M+HOME", nullptr },
+	{ ACTION_MOVE_DESCEND, "DESCEND", _s("Descend"), "M+END", nullptr },
 
 	{ ACTION_NONE, nullptr, nullptr, nullptr, nullptr }
 };
diff --git a/engines/ultima/ultima8/metaengine.h b/engines/ultima/ultima8/metaengine.h
index 33ffcae7e90..a827d413d31 100644
--- a/engines/ultima/ultima8/metaengine.h
+++ b/engines/ultima/ultima8/metaengine.h
@@ -43,10 +43,8 @@ enum KeybindingAction {
 	ACTION_STEP_BACK, ACTION_ROLL_LEFT, ACTION_ROLL_RIGHT, ACTION_TOGGLE_CROUCH,
 	ACTION_CAMERA_AVATAR,
 
-	ACTION_CLIPPING, ACTION_DEC_SORT_ORDER,
-	ACTION_INC_SORT_ORDER, ACTION_QUICK_MOVE_ASCEND, ACTION_QUICK_MOVE_DESCEND,
-	ACTION_QUICK_MOVE_UP, ACTION_QUICK_MOVE_DOWN, ACTION_QUICK_MOVE_LEFT,
-	ACTION_QUICK_MOVE_RIGHT,
+	ACTION_CLIPPING, ACTION_DEC_SORT_ORDER, ACTION_INC_SORT_ORDER, 
+	ACTION_MOVE_ASCEND, ACTION_MOVE_DESCEND,
 
 	ACTION_TOGGLE_PAINT, ACTION_FRAME_BY_FRAME,
 	ACTION_ADVANCE_FRAME, ACTION_TOGGLE_STASIS, ACTION_SHAPE_VIEWER,
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index b091f900d1d..153e864c192 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -129,7 +129,7 @@ Debugger::Debugger() : GUI::Debugger() {
 	registerCmd("ObjectManager::objectTypes", WRAP_METHOD(Debugger, cmdObjectTypes));
 	registerCmd("ObjectManager::objectInfo", WRAP_METHOD(Debugger, cmdObjectInfo));
 
-	registerCmd("QuickAvatarMoverProcess::toggleQuarterSpeed", WRAP_METHOD(Debugger, cmdQuarterSpeed));
+	registerCmd("QuickAvatarMoverProcess::toggle", WRAP_METHOD(Debugger, cmdQuickMover));
 	registerCmd("QuickAvatarMoverProcess::toggleClipping", WRAP_METHOD(Debugger, cmdClipping));
 
 	registerCmd("UCMachine::getGlobal", WRAP_METHOD(Debugger, cmdGetGlobal));
@@ -1363,13 +1363,18 @@ bool Debugger::cmdObjectInfo(int argc, const char **argv) {
 	return true;
 }
 
-bool Debugger::cmdQuarterSpeed(int argc, const char **argv) {
+bool Debugger::cmdQuickMover(int argc, const char **argv) {
 	if (argc > 2) {
 		debugPrintf("Usage: %s [on|off]\n", argv[0]);
 		return true;
 	}
 
-	bool flag = !QuickAvatarMoverProcess::isQuarterSpeed();
+	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)
 			flag = true;
@@ -1377,7 +1382,8 @@ bool Debugger::cmdQuarterSpeed(int argc, const char **argv) {
 			flag = false;
 	}
 
-	QuickAvatarMoverProcess::setQuarterSpeed(flag);
+	QuickAvatarMoverProcess::setEnabled(flag);
+	debugPrintf("QuickAvatarMoverProcess::_enabled = %s\n", strBool(flag));
 	return false;
 }
 
diff --git a/engines/ultima/ultima8/misc/debugger.h b/engines/ultima/ultima8/misc/debugger.h
index 40c22377018..5af6e2f0c94 100644
--- a/engines/ultima/ultima8/misc/debugger.h
+++ b/engines/ultima/ultima8/misc/debugger.h
@@ -111,7 +111,7 @@ private:
 	bool cmdObjectInfo(int argc, const char **argv);
 
 	// Quick Avatar Mover Process
-	bool cmdQuarterSpeed(int argc, const char **argv);
+	bool cmdQuickMover(int argc, const char **argv);
 	bool cmdClipping(int argc, const char **argv);
 
 	// UCMachine
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index bf62c439b01..497d8ecce4e 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -898,6 +898,13 @@ void Ultima8Engine::handleDelayedEvents() {
 }
 
 void Ultima8Engine::handleActionDown(KeybindingAction action) {
+	if (!isAvatarInStasis() && QuickAvatarMoverProcess::isEnabled()) {
+		QuickAvatarMoverProcess *moverProcess = QuickAvatarMoverProcess::get_instance();
+		if (moverProcess && moverProcess->onActionDown(action)) {
+			return;
+		}
+	}
+
 	if (!isAvatarInStasis()) {
 		if (_avatarMoverProcess && _avatarMoverProcess->onActionDown(action)) {
 			moveKeyEvent();
@@ -1121,60 +1128,19 @@ void Ultima8Engine::handleActionDown(KeybindingAction action) {
 			QuickAvatarMoverProcess::toggleClipping();
 		}
 		break;
-	case ACTION_QUICK_MOVE_ASCEND:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->setMovementFlag(QuickAvatarMoverProcess::MOVE_ASCEND);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_DESCEND:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->setMovementFlag(QuickAvatarMoverProcess::MOVE_DESCEND);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_UP:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->setMovementFlag(QuickAvatarMoverProcess::MOVE_UP);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_DOWN:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->setMovementFlag(QuickAvatarMoverProcess::MOVE_DOWN);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_LEFT:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->setMovementFlag(QuickAvatarMoverProcess::MOVE_LEFT);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_RIGHT:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->setMovementFlag(QuickAvatarMoverProcess::MOVE_RIGHT);
-			}
-		}
-		break;
 	default:
 		break;
 	}
 }
 
 void Ultima8Engine::handleActionUp(KeybindingAction action) {
+	if (QuickAvatarMoverProcess::isEnabled()) {
+		QuickAvatarMoverProcess *moverProcess = QuickAvatarMoverProcess::get_instance();
+		if (moverProcess && moverProcess->onActionUp(action)) {
+			return;
+		}
+	}
+
 	if (_avatarMoverProcess && _avatarMoverProcess->onActionUp(action)) {
 		moveKeyEvent();
 		return;
@@ -1184,54 +1150,6 @@ void Ultima8Engine::handleActionUp(KeybindingAction action) {
 	case ACTION_HIGHLIGHT_ITEMS:
 		GameMapGump::Set_highlightItems(false);
 		break;
-	case ACTION_QUICK_MOVE_ASCEND:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->clearMovementFlag(QuickAvatarMoverProcess::MOVE_ASCEND);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_DESCEND:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->clearMovementFlag(QuickAvatarMoverProcess::MOVE_DESCEND);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_UP:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->clearMovementFlag(QuickAvatarMoverProcess::MOVE_UP);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_DOWN:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->clearMovementFlag(QuickAvatarMoverProcess::MOVE_DOWN);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_LEFT:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->clearMovementFlag(QuickAvatarMoverProcess::MOVE_LEFT);
-			}
-		}
-		break;
-	case ACTION_QUICK_MOVE_RIGHT:
-		if (!isAvatarInStasis() && areCheatsEnabled()) {
-			QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
-			if (proc) {
-				proc->clearMovementFlag(QuickAvatarMoverProcess::MOVE_RIGHT);
-			}
-		}
-		break;
 	default:
 		break;
 	}
diff --git a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
index ed93c47dc43..97647c8796d 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
@@ -35,8 +35,8 @@ namespace Ultima8 {
 DEFINE_RUNTIME_CLASSTYPE_CODE(QuickAvatarMoverProcess)
 
 ProcId QuickAvatarMoverProcess::_amp = 0;
+bool QuickAvatarMoverProcess::_enabled = false;
 bool QuickAvatarMoverProcess::_clipping = false;
-bool QuickAvatarMoverProcess::_quarter = false;
 
 QuickAvatarMoverProcess::QuickAvatarMoverProcess() : Process(1), _movementFlags(0) {
 	_amp = getPid();
@@ -46,7 +46,7 @@ QuickAvatarMoverProcess::~QuickAvatarMoverProcess() {
 }
 
 void QuickAvatarMoverProcess::run() {
-	if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
+	if (!isEnabled()) {
 		terminate();
 		return;
 	}
@@ -87,13 +87,18 @@ void QuickAvatarMoverProcess::run() {
 		return;
 	}
 
+	if (hasMovementFlags(MOVE_SLOW)) {
+		dx /= 4;
+		dy /= 4;
+		dz /= 4;
+	}
+
 	MainActor *avatar = getMainActor();
 	Point3 pt = avatar->getLocation();
 	int32 ixd, iyd, izd;
 	avatar->getFootpadWorld(ixd, iyd, izd);
 
 	CurrentMap *cm = World::get_instance()->getCurrentMap();
-
 	int32 dxv = dx;
 	int32 dyv = dy;
 	int32 dzv = dz;
@@ -109,12 +114,6 @@ void QuickAvatarMoverProcess::run() {
 			else if (j == 2)
 				dyv = 0;
 
-			if (_quarter) {
-				dxv /= 4;
-				dyv /= 4;
-				dzv /= 4;
-			}
-
 			bool ok = false;
 
 			while (dxv || dyv || dzv) {
@@ -189,6 +188,79 @@ QuickAvatarMoverProcess *QuickAvatarMoverProcess::get_instance() {
 	return p;
 }
 
+bool QuickAvatarMoverProcess::onActionDown(KeybindingAction action) {
+	if (!isEnabled()) {
+		return false;
+	}
+
+	bool handled = true;
+	switch (action) {
+	case ACTION_MOVE_ASCEND:
+		setMovementFlag(MOVE_ASCEND);
+		break;
+	case ACTION_MOVE_DESCEND:
+		setMovementFlag(MOVE_DESCEND);
+		break;
+	case ACTION_MOVE_UP:
+		setMovementFlag(MOVE_UP);
+		break;
+	case ACTION_MOVE_DOWN:
+		setMovementFlag(MOVE_DOWN);
+		break;
+	case ACTION_MOVE_LEFT:
+		setMovementFlag(MOVE_LEFT);
+		break;
+	case ACTION_MOVE_RIGHT:
+		setMovementFlag(MOVE_RIGHT);
+		break;
+	case ACTION_MOVE_STEP:
+		setMovementFlag(MOVE_SLOW);
+		// Allow others to handle as well
+		handled = false; 
+		break;
+	default:
+		handled = false;
+	}
+	return handled;
+}
+
+bool QuickAvatarMoverProcess::onActionUp(KeybindingAction action) {
+	if (!isEnabled()) {
+		return false;
+	}
+
+	bool handled = true;
+	switch (action) {
+	case ACTION_MOVE_ASCEND:
+		clearMovementFlag(MOVE_ASCEND);
+		break;
+	case ACTION_MOVE_DESCEND:
+		clearMovementFlag(MOVE_DESCEND);
+		break;
+	case ACTION_MOVE_UP:
+		clearMovementFlag(MOVE_UP);
+		break;
+	case ACTION_MOVE_DOWN:
+		clearMovementFlag(MOVE_DOWN);
+		break;
+	case ACTION_MOVE_LEFT:
+		clearMovementFlag(MOVE_LEFT);
+		break;
+	case ACTION_MOVE_RIGHT:
+		clearMovementFlag(MOVE_RIGHT);
+		break;
+	case ACTION_MOVE_STEP:
+		clearMovementFlag(MOVE_SLOW);
+		// Allow others to handle as well
+		handled = false; 
+		break;
+	default:
+		handled = false;
+	}
+	return handled;
+}
+
+
 void QuickAvatarMoverProcess::saveData(Common::WriteStream *ws) {
 	Process::saveData(ws);
 
diff --git a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h
index 723bea6b448..d6ac02e1be6 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h
@@ -22,6 +22,7 @@
 #ifndef WORLD_ACTORS_QUICKAVATARMOVERPROCESS_H
 #define WORLD_ACTORS_QUICKAVATARMOVERPROCESS_H
 
+#include "ultima/ultima8/metaengine.h"
 #include "ultima/ultima8/kernel/process.h"
 
 namespace Ultima {
@@ -39,15 +40,15 @@ public:
 	void run() override;
 	void terminate() override;
 
-	static bool isQuarterSpeed() {
-		return _quarter;
+	static bool isEnabled() {
+		return _enabled;
+	}
+	static void setEnabled(bool value) {
+		_enabled = value;
 	}
 	static bool isClipping() {
 		return _clipping;
 	}
-	static void setQuarterSpeed(bool q) {
-		_quarter = q;
-	}
 	static void setClipping(bool value) {
 		_clipping = value;
 	}
@@ -68,6 +69,10 @@ public:
 		_movementFlags = 0;
 	}
 
+	// Return true if handled, false if not.
+	bool onActionDown(KeybindingAction action);
+	bool onActionUp(KeybindingAction action);
+
 	bool loadData(Common::ReadStream *rs, uint32 version);
 	void saveData(Common::WriteStream *ws) override;
 
@@ -78,6 +83,7 @@ public:
 		MOVE_DOWN = 0x08,
 		MOVE_ASCEND = 0x10,
 		MOVE_DESCEND = 0x20,
+		MOVE_SLOW = 0x40,
 
 		MOVE_ANY_DIRECTION = MOVE_LEFT | MOVE_RIGHT | MOVE_UP | MOVE_DOWN | MOVE_ASCEND | MOVE_DESCEND
 	};
@@ -85,8 +91,8 @@ public:
 protected:
 	uint32 _movementFlags;
 	static ProcId _amp;
+	static bool _enabled;
 	static bool _clipping;
-	static bool _quarter;
 };
 
 } // End of namespace Ultima8




More information about the Scummvm-git-logs mailing list