[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