[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