[Scummvm-git-logs] scummvm master -> 5d1c25c3883606e4e0cb624ef439ca7eb52746a5
OMGPizzaGuy
noreply at scummvm.org
Sat Dec 3 05:45:59 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
5d1c25c388 ULTIMA8: Update quick mover to use movement flags.
Commit: 5d1c25c3883606e4e0cb624ef439ca7eb52746a5
https://github.com/scummvm/scummvm/commit/5d1c25c3883606e4e0cb624ef439ca7eb52746a5
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2022-12-02T23:05:15-06:00
Commit Message:
ULTIMA8: Update quick mover to use movement flags.
Reduce the number of quick mover processes to only one at a time with movement flags simiilar to the player mover process. This should make it easier to reset quick movement in case of focus loss and avoid errors in case of accidentally creating too many quick mover processes
Changed paths:
engines/ultima/ultima8/misc/debugger.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/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index c81b7740930..5d445ff1d0e 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -1480,94 +1480,86 @@ bool Debugger::cmdObjectInfo(int argc, const char **argv) {
return true;
}
-bool Debugger::cmdStartQuickMoveUp(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->areCheatsEnabled()) {
- QuickAvatarMoverProcess::startMover(-64, -64, 0, 0);
- return false;
- } else {
- debugPrintf("Cheats aren't enabled\n");
+static bool _quickMoveKey(uint32 flag, const char *debugname) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ if (engine->isAvatarInStasis()) {
+ debug("Can't %s: avatarInStasis\n", debugname);
return true;
}
+ if (!engine->areCheatsEnabled()) {
+ debug("Can't %s: Cheats aren't enabled\n", debugname);
+ return true;
+ }
+
+ QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
+ if (proc) {
+ proc->setMovementFlag(flag);
+ }
+ return false;
}
-bool Debugger::cmdStartQuickMoveDown(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->areCheatsEnabled()) {
- QuickAvatarMoverProcess::startMover(+64, +64, 0, 1);
+static bool _quickMoveKeyEnd(uint32 flag) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+ if (engine->isAvatarInStasis()) {
return false;
- } else {
- debugPrintf("Cheats aren't enabled\n");
- return true;
}
+ if (!engine->areCheatsEnabled()) {
+ return false;
+ }
+
+ QuickAvatarMoverProcess *proc = QuickAvatarMoverProcess::get_instance();
+ if (proc) {
+ proc->clearMovementFlag(flag);
+ }
+ return false;
+}
+
+bool Debugger::cmdStartQuickMoveUp(int argc, const char **argv) {
+ return _quickMoveKey(QuickAvatarMoverProcess::MOVE_UP, "move up");
+}
+
+bool Debugger::cmdStartQuickMoveDown(int argc, const char **argv) {
+ return _quickMoveKey(QuickAvatarMoverProcess::MOVE_DOWN, "move down");
}
bool Debugger::cmdStartQuickMoveLeft(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->areCheatsEnabled()) {
- QuickAvatarMoverProcess::startMover(-64, +64, 0, 2);
- return false;
- } else {
- debugPrintf("Cheats aren't enabled\n");
- return true;
- }
+ return _quickMoveKey(QuickAvatarMoverProcess::MOVE_LEFT, "move left");
}
bool Debugger::cmdStartQuickMoveRight(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->areCheatsEnabled()) {
- QuickAvatarMoverProcess::startMover(+64, -64, 0, 3);
- return false;
- } else {
- debugPrintf("Cheats aren't enabled\n");
- return true;
- }
+ return _quickMoveKey(QuickAvatarMoverProcess::MOVE_RIGHT, "move right");
}
bool Debugger::cmdStartQuickMoveAscend(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->areCheatsEnabled()) {
- QuickAvatarMoverProcess::startMover(0, 0, 8, 4);
- return false;
- } else {
- debugPrintf("Cheats aren't enabled\n");
- return true;
- }
+ return _quickMoveKey(QuickAvatarMoverProcess::MOVE_ASCEND, "move ascend");
}
bool Debugger::cmdStartQuickMoveDescend(int argc, const char **argv) {
- if (Ultima8Engine::get_instance()->areCheatsEnabled()) {
- QuickAvatarMoverProcess::startMover(0, 0, -8, 5);
- return false;
- } else {
- debugPrintf("Cheats aren't enabled\n");
- return true;
- }
+ return _quickMoveKey(QuickAvatarMoverProcess::MOVE_DESCEND, "move descend");
}
bool Debugger::cmdStopQuickMoveUp(int argc, const char **argv) {
- QuickAvatarMoverProcess::terminateMover(0);
- return false;
+ return _quickMoveKeyEnd(QuickAvatarMoverProcess::MOVE_UP);
}
bool Debugger::cmdStopQuickMoveDown(int argc, const char **argv) {
- QuickAvatarMoverProcess::terminateMover(1);
- return false;
+ return _quickMoveKeyEnd(QuickAvatarMoverProcess::MOVE_DOWN);
}
bool Debugger::cmdStopQuickMoveLeft(int argc, const char **argv) {
- QuickAvatarMoverProcess::terminateMover(2);
- return false;
+ return _quickMoveKeyEnd(QuickAvatarMoverProcess::MOVE_LEFT);
}
bool Debugger::cmdStopQuickMoveRight(int argc, const char **argv) {
- QuickAvatarMoverProcess::terminateMover(3);
- return false;
+ return _quickMoveKeyEnd(QuickAvatarMoverProcess::MOVE_RIGHT);
}
bool Debugger::cmdStopQuickMoveAscend(int argc, const char **argv) {
- QuickAvatarMoverProcess::terminateMover(4);
- return false;
+ return _quickMoveKeyEnd(QuickAvatarMoverProcess::MOVE_ASCEND);
}
bool Debugger::cmdStopQuickMoveDescend(int argc, const char **argv) {
- QuickAvatarMoverProcess::terminateMover(5);
- return false;
+ return _quickMoveKeyEnd(QuickAvatarMoverProcess::MOVE_DESCEND);
}
bool Debugger::cmdToggleQuarterSpeed(int argc, const char **argv) {
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 15798d2a86f..929fb14b412 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
@@ -34,18 +34,12 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(QuickAvatarMoverProcess)
-ProcId QuickAvatarMoverProcess::_amp[6] = { 0, 0, 0, 0, 0, 0 };
+ProcId QuickAvatarMoverProcess::_amp = 0;
bool QuickAvatarMoverProcess::_clipping = false;
bool QuickAvatarMoverProcess::_quarter = false;
-QuickAvatarMoverProcess::QuickAvatarMoverProcess() : Process(1), _dx(0), _dy(0), _dz(0), _dir(0) {
-}
-
-QuickAvatarMoverProcess::QuickAvatarMoverProcess(int x, int y, int z, int dir) : Process(1),
- _dx(x), _dy(y), _dz(z), _dir(dir) {
- QuickAvatarMoverProcess::terminateMover(dir);
- assert(_dir < 6);
- _amp[_dir] = getPid();
+QuickAvatarMoverProcess::QuickAvatarMoverProcess() : Process(1), _movementFlags(0) {
+ _amp = getPid();
}
QuickAvatarMoverProcess::~QuickAvatarMoverProcess() {
@@ -57,6 +51,42 @@ void QuickAvatarMoverProcess::run() {
return;
}
+ int32 dx = 0;
+ int32 dy = 0;
+ int32 dz = 0;
+
+ if (hasMovementFlags(MOVE_UP)) {
+ dx -= 64;
+ dy -= 64;
+ }
+
+ if (hasMovementFlags(MOVE_DOWN)) {
+ dx += 64;
+ dy += 64;
+ }
+
+ if (hasMovementFlags(MOVE_LEFT)) {
+ dx -= 64;
+ dy += 64;
+ }
+
+ if (hasMovementFlags(MOVE_RIGHT)) {
+ dx += 64;
+ dy -= 64;
+ }
+
+ if (hasMovementFlags(MOVE_ASCEND)) {
+ dz += 8;
+ }
+
+ if (hasMovementFlags(MOVE_DESCEND)) {
+ dz -= 8;
+ }
+
+ if (!dx && !dy && !dz) {
+ return;
+ }
+
MainActor *avatar = getMainActor();
int32 x, y, z;
avatar->getLocation(x, y, z);
@@ -65,14 +95,14 @@ void QuickAvatarMoverProcess::run() {
CurrentMap *cm = World::get_instance()->getCurrentMap();
- int32 dxv = this->_dx;
- int32 dyv = this->_dy;
- int32 dzv = this->_dz;
+ int32 dxv = dx;
+ int32 dyv = dy;
+ int32 dzv = dz;
for (int j = 0; j < 3; j++) {
- dxv = this->_dx;
- dyv = this->_dy;
- dzv = this->_dz;
+ dxv = dx;
+ dyv = dy;
+ dzv = dz;
if (j == 1) dxv = 0;
else if (j == 2) dyv = 0;
@@ -132,48 +162,35 @@ void QuickAvatarMoverProcess::run() {
void QuickAvatarMoverProcess::terminate() {
Process::terminate();
- _amp[_dir] = 0;
+ _amp = 0;
}
-void QuickAvatarMoverProcess::terminateMover(int dir) {
- assert(dir < 6);
-
+QuickAvatarMoverProcess *QuickAvatarMoverProcess::get_instance() {
Kernel *kernel = Kernel::get_instance();
+ QuickAvatarMoverProcess *p = nullptr;
+ if (_amp) {
+ p = dynamic_cast<QuickAvatarMoverProcess *>(kernel->getProcess(_amp));
+ }
- QuickAvatarMoverProcess *p =
- dynamic_cast<QuickAvatarMoverProcess *>(kernel->getProcess(_amp[dir]));
-
- if (p && !p->is_terminated())
- p->terminate();
-}
-
-void QuickAvatarMoverProcess::startMover(int x, int y, int z, int dir) {
- Ultima8Engine *g = Ultima8Engine::get_instance();
- if (! g->isAvatarInStasis()) {
- Process *p = new QuickAvatarMoverProcess(x, y, z, dir);
+ if (!p) {
+ p = new QuickAvatarMoverProcess();
Kernel::get_instance()->addProcess(p);
- } else {
- pout << "Can't quickmove: avatarInStasis" << Std::endl;
}
+
+ return p;
}
void QuickAvatarMoverProcess::saveData(Common::WriteStream *ws) {
Process::saveData(ws);
- ws->writeUint32LE(_dir);
+ ws->writeUint32LE(_movementFlags);
// don't save more information. We plan to terminate upon load
}
bool QuickAvatarMoverProcess::loadData(Common::ReadStream *rs, uint32 version) {
if (!Process::loadData(rs, version)) return false;
- // small safety precaution
- _dir = rs->readUint32LE();
- if (_dir < 6)
- _amp[_dir] = 0;
- else
- return false;
-
+ _movementFlags = rs->readUint32LE();
terminateDeferred(); // Don't allow this process to continue
return true;
}
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 3648eb378fe..70a099c9f10 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.h
@@ -30,12 +30,12 @@ namespace Ultima8 {
class QuickAvatarMoverProcess : public Process {
public:
QuickAvatarMoverProcess();
-
- QuickAvatarMoverProcess(int x, int y, int z, int _dir);
~QuickAvatarMoverProcess() override;
ENABLE_RUNTIME_CLASSTYPE()
+ static QuickAvatarMoverProcess *get_instance();
+
void run() override;
void terminate() override;
@@ -52,15 +52,36 @@ public:
_clipping = !_clipping;
}
- static void terminateMover(int _dir);
- static void startMover(int x, int y, int z, int _dir);
+ bool hasMovementFlags(uint32 flags) const {
+ return (_movementFlags & flags) != 0;
+ }
+ void setMovementFlag(uint32 mask) {
+ _movementFlags |= mask;
+ }
+ virtual void clearMovementFlag(uint32 mask) {
+ _movementFlags &= ~mask;
+ }
+ void resetMovementFlags() {
+ _movementFlags = 0;
+ }
bool loadData(Common::ReadStream *rs, uint32 version);
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_ANY_DIRECTION = MOVE_LEFT | MOVE_RIGHT | MOVE_UP | MOVE_DOWN | MOVE_ASCEND | MOVE_DESCEND
+ };
+
protected:
- int _dx, _dy, _dz, _dir;
- static ProcId _amp[6];
+ uint32 _movementFlags;
+ static ProcId _amp;
static bool _clipping;
static bool _quarter;
};
More information about the Scummvm-git-logs
mailing list