[Scummvm-git-logs] scummvm master -> 55b991acd957fba48ce08e40193cefec4e0e1ede

OMGPizzaGuy noreply at scummvm.org
Sun Jun 22 22:51:09 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:
55b991acd9 ULTIMA8: Support player relative moment in quick mover mode


Commit: 55b991acd957fba48ce08e40193cefec4e0e1ede
    https://github.com/scummvm/scummvm/commit/55b991acd957fba48ce08e40193cefec4e0e1ede
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2025-06-22T17:50:12-05:00

Commit Message:
ULTIMA8: Support player relative moment in quick mover mode

Changed paths:
    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/world/actors/quick_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
index 97647c8796d..74038d705d5 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "ultima/ultima8/world/actors/quick_avatar_mover_process.h"
+#include "ultima/ultima8/misc/direction_util.h"
 #include "ultima/ultima8/world/actors/main_actor.h"
 #include "ultima/ultima8/world/world.h"
 #include "ultima/ultima8/world/current_map.h"
@@ -51,6 +52,10 @@ void QuickAvatarMoverProcess::run() {
 		return;
 	}
 
+	MainActor *avatar = getMainActor();
+	Direction direction = avatar->getDir();
+	DirectionMode mode = GAME_IS_U8 ? dirmode_8dirs : dirmode_16dirs;
+
 	int32 dx = 0;
 	int32 dy = 0;
 	int32 dz = 0;
@@ -83,6 +88,47 @@ void QuickAvatarMoverProcess::run() {
 		dz -= 8;
 	}
 
+	// Limit speed of turning by checking
+	uint32 frameNum = Kernel::get_instance()->getFrameNum();
+	if (frameNum % 4 == 0) {
+		if (hasMovementFlags(MOVE_TURN_LEFT)) {
+			direction = Direction_OneLeft(direction, mode);
+		}
+
+		if (hasMovementFlags(MOVE_TURN_RIGHT)) {
+			direction = Direction_OneRight(direction, mode);
+		}
+	}
+
+	if (hasMovementFlags(MOVE_FORWARD)) {
+		int xoff = 32 * Direction_XFactor(direction);
+		int yoff = 32 * Direction_YFactor(direction);
+		if (dirmode_8dirs) {
+			xoff *= 2;
+			yoff *= 2;
+		}
+
+		dx += xoff;
+		dy += yoff;
+	}
+
+	if (hasMovementFlags(MOVE_BACK)) {
+		int xoff = 32 * Direction_XFactor(direction);
+		int yoff = 32 * Direction_YFactor(direction);
+		if (dirmode_8dirs) {
+			xoff *= 2;
+			yoff *= 2;
+		}
+
+		dx -= xoff;
+		dy -= yoff;
+	}
+
+	if (direction != avatar->getDir()) {
+		avatar->setDir(direction);
+		avatar->setToStartOfAnim(Animation::stand);
+	}
+
 	if (!dx && !dy && !dz) {
 		return;
 	}
@@ -91,9 +137,12 @@ void QuickAvatarMoverProcess::run() {
 		dx /= 4;
 		dy /= 4;
 		dz /= 4;
+	} else if (hasMovementFlags(MOVE_FAST)) {
+		dx *= 4;
+		dy *= 4;
+		dz *= 4;
 	}
 
-	MainActor *avatar = getMainActor();
 	Point3 pt = avatar->getLocation();
 	int32 ixd, iyd, izd;
 	avatar->getFootpadWorld(ixd, iyd, izd);
@@ -201,6 +250,18 @@ bool QuickAvatarMoverProcess::onActionDown(KeybindingAction action) {
 	case ACTION_MOVE_DESCEND:
 		setMovementFlag(MOVE_DESCEND);
 		break;
+	case ACTION_TURN_LEFT:
+		setMovementFlag(MOVE_TURN_LEFT);
+		break;
+	case ACTION_TURN_RIGHT:
+		setMovementFlag(MOVE_TURN_RIGHT);
+		break;
+	case ACTION_MOVE_FORWARD:
+		setMovementFlag(MOVE_FORWARD);
+		break;
+	case ACTION_MOVE_BACK:
+		setMovementFlag(MOVE_BACK);
+		break;
 	case ACTION_MOVE_UP:
 		setMovementFlag(MOVE_UP);
 		break;
@@ -218,6 +279,11 @@ bool QuickAvatarMoverProcess::onActionDown(KeybindingAction action) {
 		// Allow others to handle as well
 		handled = false; 
 		break;
+	case ACTION_MOVE_RUN:
+		setMovementFlag(MOVE_FAST);
+		// Allow others to handle as well
+		handled = false; 
+		break;
 	default:
 		handled = false;
 	}
@@ -237,6 +303,18 @@ bool QuickAvatarMoverProcess::onActionUp(KeybindingAction action) {
 	case ACTION_MOVE_DESCEND:
 		clearMovementFlag(MOVE_DESCEND);
 		break;
+	case ACTION_TURN_LEFT:
+		clearMovementFlag(MOVE_TURN_LEFT);
+		break;
+	case ACTION_TURN_RIGHT:
+		clearMovementFlag(MOVE_TURN_RIGHT);
+		break;
+	case ACTION_MOVE_FORWARD:
+		clearMovementFlag(MOVE_FORWARD);
+		break;
+	case ACTION_MOVE_BACK:
+		clearMovementFlag(MOVE_BACK);
+		break;
 	case ACTION_MOVE_UP:
 		clearMovementFlag(MOVE_UP);
 		break;
@@ -254,6 +332,11 @@ bool QuickAvatarMoverProcess::onActionUp(KeybindingAction action) {
 		// Allow others to handle as well
 		handled = false; 
 		break;
+	case ACTION_MOVE_RUN:
+		clearMovementFlag(MOVE_FAST);
+		// Allow others to handle as well
+		handled = false; 
+		break;
 	default:
 		handled = false;
 	}
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 d6ac02e1be6..2afcd1beccc 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h
@@ -77,13 +77,22 @@ public:
 	void saveData(Common::WriteStream *ws) override;
 
 	enum MovementFlags {
-		MOVE_LEFT = 0x01,
-		MOVE_RIGHT = 0x02,
-		MOVE_UP = 0x04,
-		MOVE_DOWN = 0x08,
-		MOVE_ASCEND = 0x10,
-		MOVE_DESCEND = 0x20,
-		MOVE_SLOW = 0x40,
+		MOVE_ASCEND = 0x0001,
+		MOVE_DESCEND = 0x0002,
+		MOVE_SLOW = 0x0004,
+		MOVE_FAST = 0x0008,
+
+		// Tank controls
+		MOVE_TURN_LEFT  = 0x0010,
+		MOVE_TURN_RIGHT = 0x0020,
+		MOVE_FORWARD    = 0x0040,
+		MOVE_BACK       = 0x0080,
+
+		// Directional controls
+		MOVE_LEFT  = 0x0100,
+		MOVE_RIGHT = 0x0200,
+		MOVE_UP    = 0x0400,
+		MOVE_DOWN  = 0x0800,
 
 		MOVE_ANY_DIRECTION = MOVE_LEFT | MOVE_RIGHT | MOVE_UP | MOVE_DOWN | MOVE_ASCEND | MOVE_DESCEND
 	};




More information about the Scummvm-git-logs mailing list