[Scummvm-git-logs] scummvm master -> 70eb9a061cb13163603ef6220257fa548125f9a1
mduggan
mgithub at guarana.org
Fri Apr 24 07:33:23 UTC 2020
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
d1aeca8ec9 ULTIMA8: JANITORIAL: Reduce variable scope
2d4d093522 ULTIMA8: Misc cleanups for AvatarMoverProcess
e0398b15ec ULTIMA8: Refactor getActorFlags -> hasActorFlags
7c85b1838d ULTIMA8: Refactor Item getFlags -> hasFlags
70eb9a061c ULTIMA8: MButton refactors for avatar mover process
Commit: d1aeca8ec99cb5ed0b24ba4bad93b17a8e539330
https://github.com/scummvm/scummvm/commit/d1aeca8ec99cb5ed0b24ba4bad93b17a8e539330
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-24T15:35:51+09:00
Commit Message:
ULTIMA8: JANITORIAL: Reduce variable scope
Changed paths:
engines/ultima/ultima8/ultima8.cpp
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index c02bd49814..947a00d782 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -691,8 +691,7 @@ bool Ultima8Engine::LoadConsoleFont(Std::string confontini) {
}
void Ultima8Engine::enterTextMode(Gump *gump) {
- uint16 key;
- for (key = 0; key < HID_LAST; ++key) {
+ for (uint16 key = 0; key < HID_LAST; ++key) {
if (_down[key]) {
_down[key] = false;
_lastDown[key] = false;
Commit: 2d4d0935225bcbd2c7f1a8583641ac0aff8a5242
https://github.com/scummvm/scummvm/commit/2d4d0935225bcbd2c7f1a8583641ac0aff8a5242
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-24T15:35:51+09:00
Commit Message:
ULTIMA8: Misc cleanups for AvatarMoverProcess
Changed paths:
engines/ultima/ultima8/kernel/mouse.cpp
engines/ultima/ultima8/kernel/mouse.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor_anim_process.cpp
engines/ultima/ultima8/world/actors/actor_anim_process.h
engines/ultima/ultima8/world/actors/actor_bark_notify_process.cpp
engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
diff --git a/engines/ultima/ultima8/kernel/mouse.cpp b/engines/ultima/ultima8/kernel/mouse.cpp
index ff87a1136b..8052047b5a 100644
--- a/engines/ultima/ultima8/kernel/mouse.cpp
+++ b/engines/ultima/ultima8/kernel/mouse.cpp
@@ -172,7 +172,7 @@ int Mouse::getMouseLength(int mx, int my) {
}
}
-int Mouse::getMouseDirection(int mx, int my) {
+int Mouse::getMouseDirectionWorld(int mx, int my) {
Rect dims;
RenderSurface *screen = Ultima8Engine::get_instance()->getRenderScreen();
screen->GetSurfaceDims(dims);
@@ -181,7 +181,11 @@ int Mouse::getMouseDirection(int mx, int my) {
int dx = mx - dims.w / 2;
int dy = (dims.h / 2 + (dims.h * 14 / 200)) - my; //! constant
- return ((Get_direction(dy * 2, dx)) + 1) % 8;
+ return Get_direction(dy * 2, dx);
+}
+
+int Mouse::getMouseDirectionScreen(int mx, int my) {
+ return ((getMouseDirectionWorld(mx, my)) + 1) % 8;
}
int Mouse::getMouseFrame() {
@@ -219,7 +223,7 @@ int Mouse::getMouseFrame() {
}
// Calculate frame based on direction
- int frame = getMouseDirection(_mousePos.x, _mousePos.y);
+ int frame = getMouseDirectionScreen(_mousePos.x, _mousePos.y);
/** length --- frame offset
* 0 0
diff --git a/engines/ultima/ultima8/kernel/mouse.h b/engines/ultima/ultima8/kernel/mouse.h
index aa8bafcb65..c30fa37ba3 100644
--- a/engines/ultima/ultima8/kernel/mouse.h
+++ b/engines/ultima/ultima8/kernel/mouse.h
@@ -117,8 +117,11 @@ public:
//! get mouse cursor length. 0 = short, 1 = medium, 2 = long
int getMouseLength(int mx, int my);
- //! get mouse cursor direction. 0 = up, 1 = up-right, 2 = right, etc...
- int getMouseDirection(int mx, int my);
+ //! get mouse cursor direction on the screen. 0 = up, 1 = up-right, 2 = right, etc...
+ int getMouseDirectionScreen(int mx, int my);
+
+ //! get mouse cursor direction in the world. 0 = up, 1 = up-right, 2 = right, etc...
+ int getMouseDirectionWorld(int mx, int my);
//! get current mouse cursor location
void getMouseCoords(int32 &mx, int32 &my) const {
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 6de4cf479d..e3a1966bcb 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -1518,7 +1518,7 @@ uint32 Actor::I_isBusy(const uint8 *args, unsigned int /*argsize*/) {
ARG_UC_PTR(ptr);
uint16 id = UCMachine::ptrToObject(ptr);
- uint32 count = Kernel::get_instance()->getNumProcesses(id, 0x00F0);
+ uint32 count = Kernel::get_instance()->getNumProcesses(id, ActorAnimProcess::ACTOR_ANIM_PROC_TYPE);
if (count > 0)
return 1;
else
diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
index a3de20dd23..07b8fbcf8e 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
@@ -70,7 +70,7 @@ ActorAnimProcess::ActorAnimProcess(Actor *actor_, Animation::Sequence action_,
assert(actor_);
_itemNum = actor_->getObjId();
- _type = 0x00F0; // CONSTANT !
+ _type = ACTOR_ANIM_PROC_TYPE;
}
bool ActorAnimProcess::init() {
diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.h b/engines/ultima/ultima8/world/actors/actor_anim_process.h
index 1df3f70b2a..8e89141c15 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.h
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.h
@@ -44,6 +44,8 @@ public:
// p_dynamic_cast stuff
ENABLE_RUNTIME_CLASSTYPE()
+ static const uint16 ACTOR_ANIM_PROC_TYPE = 0x00F0;
+
void run() override;
void terminate() override;
diff --git a/engines/ultima/ultima8/world/actors/actor_bark_notify_process.cpp b/engines/ultima/ultima8/world/actors/actor_bark_notify_process.cpp
index 0a94afb9b0..165fc388ee 100644
--- a/engines/ultima/ultima8/world/actors/actor_bark_notify_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_bark_notify_process.cpp
@@ -26,6 +26,7 @@
#include "ultima/ultima8/kernel/delay_process.h"
#include "ultima/ultima8/world/actors/actor.h"
#include "ultima/ultima8/world/actors/animation.h"
+#include "ultima/ultima8/world/actors/actor_anim_process.h"
#include "ultima/ultima8/kernel/kernel.h"
#include "ultima/ultima8/world/get_object.h"
@@ -59,7 +60,7 @@ void ActorBarkNotifyProcess::run() {
Animation::Sequence lastanim = a->getLastAnim();
if (lastanim != Animation::stand && lastanim != Animation::talk)
doAnim = false;
- else if (Kernel::get_instance()->getNumProcesses(_itemNum, 0x00F0) > 0)
+ else if (Kernel::get_instance()->getNumProcesses(_itemNum, ActorAnimProcess::ACTOR_ANIM_PROC_TYPE) > 0)
// if busy, don't do talk animation
doAnim = false;
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index 7a0020e2d9..a0e4562fbf 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -73,7 +73,7 @@ void AvatarMoverProcess::run() {
MainActor *avatar = getMainActor();
// busy, so don't move
- if (kernel->getNumProcesses(1, 0x00F0) > 0) {
+ if (kernel->getNumProcesses(1, ActorAnimProcess::ACTOR_ANIM_PROC_TYPE) > 0) {
_idleTime = 0;
return;
}
@@ -98,14 +98,13 @@ void AvatarMoverProcess::run() {
}
void AvatarMoverProcess::handleHangingMode() {
- Ultima8Engine *guiapp = Ultima8Engine::get_instance();
- MainActor *avatar = getMainActor();
uint32 now = g_system->getMillis();
- bool stasis = guiapp->isAvatarInStasis();
+ bool stasis = Ultima8Engine::get_instance()->isAvatarInStasis();
_idleTime = 0;
- if (stasis) return;
+ if (stasis)
+ return;
bool m0clicked = false;
//bool m1clicked = false;
@@ -131,6 +130,7 @@ void AvatarMoverProcess::handleHangingMode() {
(!(_mouseButton[0]._state & MBS_HANDLED) || m0clicked)) {
_mouseButton[0]._state |= MBS_HANDLED;
_mouseButton[0]._lastDown = 0;
+ MainActor *avatar = getMainActor();
if (avatar->tryAnim(Animation::climb40, 8) == Animation::SUCCESS) {
avatar->ensureGravityProcess()->terminate();
@@ -140,21 +140,18 @@ void AvatarMoverProcess::handleHangingMode() {
}
void AvatarMoverProcess::handleCombatMode() {
- Ultima8Engine *guiapp = Ultima8Engine::get_instance();
Mouse *mouse = Mouse::get_instance();
MainActor *avatar = getMainActor();
Animation::Sequence lastanim = avatar->getLastAnim();
- Animation::Sequence nextanim = Animation::walk;
int32 direction = avatar->getDir();
uint32 now = g_system->getMillis();
- bool stasis = guiapp->isAvatarInStasis();
+ bool stasis = Ultima8Engine::get_instance()->isAvatarInStasis();
int32 mx, my;
mouse->getMouseCoords(mx, my);
unsigned int mouselength = mouse->getMouseLength(mx, my);
- // adjust to world direction
- int32 mousedir = (mouse->getMouseDirection(mx, my) + 7) % 8;
+ int32 mousedir = mouse->getMouseDirectionWorld(mx, my);
// never idle when in combat
_idleTime = 0;
@@ -207,7 +204,8 @@ void AvatarMoverProcess::handleCombatMode() {
// pout << "AvatarMover: combat block" << Std::endl;
- if (checkTurn(mousedir, false)) return;
+ if (checkTurn(mousedir, false))
+ return;
waitFor(avatar->doAnim(Animation::startBlock, mousedir));
return;
@@ -223,7 +221,8 @@ void AvatarMoverProcess::handleCombatMode() {
// double left click = attack
// pout << "AvatarMover: combat attack" << Std::endl;
- if (checkTurn(mousedir, true)) return;
+ if (checkTurn(mousedir, true))
+ return;
waitFor(avatar->doAnim(Animation::attack, mousedir));
_lastAttack = _lastFrame;
@@ -254,7 +253,8 @@ void AvatarMoverProcess::handleCombatMode() {
// double right click = kick
// pout << "AvatarMover: combat kick" << Std::endl;
- if (checkTurn(mousedir, false)) return;
+ if (checkTurn(mousedir, false))
+ return;
waitFor(avatar->doAnim(Animation::kick, mousedir));
_lastAttack = _lastFrame;
@@ -273,9 +273,11 @@ void AvatarMoverProcess::handleCombatMode() {
// if facing right direction, walk
//!! TODO: check if you can actually take this step
- if (checkTurn(mousedir, true)) return;
+ if (checkTurn(mousedir, true))
+ return;
int32 nextdir = mousedir;
+ Animation::Sequence nextanim;
if (lastanim == Animation::run) {
// want to run while in combat mode?
@@ -302,12 +304,13 @@ void AvatarMoverProcess::handleCombatMode() {
// if clicked, turn in mouse direction
if (m0clicked || m1clicked)
- if (checkTurn(mousedir, false)) return;
+ if (checkTurn(mousedir, false))
+ return;
// not doing anything in particular? stand
// TODO: make sure falling works properly.
if (lastanim != Animation::combatStand) {
- nextanim = Animation::combatStand;
+ Animation::Sequence nextanim = Animation::combatStand;
nextanim = Animation::checkWeapon(nextanim, lastanim);
waitFor(avatar->doAnim(nextanim, direction));
}
@@ -318,7 +321,6 @@ void AvatarMoverProcess::handleNormalMode() {
Mouse *mouse = Mouse::get_instance();
MainActor *avatar = getMainActor();
Animation::Sequence lastanim = avatar->getLastAnim();
- Animation::Sequence nextanim = Animation::walk;
int32 direction = avatar->getDir();
uint32 now = g_system->getMillis();
bool stasis = guiapp->isAvatarInStasis();
@@ -327,9 +329,7 @@ void AvatarMoverProcess::handleNormalMode() {
int32 mx, my;
mouse->getMouseCoords(mx, my);
unsigned int mouselength = mouse->getMouseLength(mx, my);
-
- // adjust to world direction
- int32 mousedir = (mouse->getMouseDirection(mx, my) + 7) % 8;
+ int32 mousedir = mouse->getMouseDirectionWorld(mx, my);
// Store current idle time. (Also see end of function.)
uint32 currentIdleTime = _idleTime;
@@ -344,7 +344,6 @@ void AvatarMoverProcess::handleNormalMode() {
// If Avatar has fallen down, stand up.
if (lastanim == Animation::die || lastanim == Animation::fallBackwards) {
if (!stasis) {
-// pout << "AvatarMover: standing up" << Std::endl;
waitFor(avatar->doAnim(Animation::standUp, direction));
}
return;
@@ -352,8 +351,6 @@ void AvatarMoverProcess::handleNormalMode() {
// If still in combat stance, sheathe weapon
if (!stasis && Animation::isCombatAnim(lastanim)) {
-// pout << "AvatarMover: sheathing weapon" << Std::endl;
-
ProcId anim1 = avatar->doAnim(Animation::unreadyWeapon, direction);
ProcId anim2 = avatar->doAnim(Animation::stand, direction);
Process *anim2p = Kernel::get_instance()->getProcess(anim2);
@@ -440,9 +437,10 @@ void AvatarMoverProcess::handleNormalMode() {
// We got a left mouse down.
// Note that this automatically means right was down too.
- if (checkTurn(mousedir, false)) return;
+ if (checkTurn(mousedir, false))
+ return;
- nextanim = Animation::jumpUp;
+ Animation::Sequence nextanim = Animation::jumpUp;
if (mouselength > 0) {
nextanim = Animation::jump;
}
@@ -480,9 +478,10 @@ void AvatarMoverProcess::handleNormalMode() {
// We got a left mouse down.
// Note that this automatically means right was down at the time too.
- if (checkTurn(mousedir, false)) return;
+ if (checkTurn(mousedir, false))
+ return;
- nextanim = Animation::jumpUp;
+ Animation::Sequence nextanim = Animation::jumpUp;
// check if we need to do a running jump
if (lastanim == Animation::run ||
@@ -522,7 +521,7 @@ void AvatarMoverProcess::handleNormalMode() {
// right mouse button is down long enough to act on it
// if facing right direction, walk
- nextanim = Animation::step;
+ Animation::Sequence nextanim = Animation::step;
if (mouselength == 1)
nextanim = Animation::walk;
@@ -541,10 +540,11 @@ void AvatarMoverProcess::handleNormalMode() {
}
if (m1clicked)
- if (checkTurn(mousedir, false)) return;
+ if (checkTurn(mousedir, false))
+ return;
// doing another animation?
- if (Kernel::get_instance()->getNumProcesses(1, 0x00F0))
+ if (Kernel::get_instance()->getNumProcesses(1, ActorAnimProcess::ACTOR_ANIM_PROC_TYPE))
return;
// idle
@@ -560,6 +560,7 @@ void AvatarMoverProcess::handleNormalMode() {
}
} else {
if ((getRandom() % 3000) + 150 < _idleTime) {
+ Animation::Sequence nextanim;
if (getRandom() % 5 == 0)
nextanim = _lastHeadShakeAnim;
else if (_lastHeadShakeAnim == Animation::lookLeft)
@@ -618,7 +619,8 @@ void AvatarMoverProcess::step(Animation::Sequence action, int direction,
if (action == Animation::step && res == Animation::END_OFF_LAND &&
lastanim != Animation::keepBalance && !adjusted) {
- if (checkTurn(stepdir, false)) return;
+ if (checkTurn(stepdir, false))
+ return;
waitFor(avatar->doAnim(Animation::keepBalance, stepdir));
return;
}
@@ -630,14 +632,14 @@ void AvatarMoverProcess::step(Animation::Sequence action, int direction,
bool moving = (action == Animation::run || action == Animation::walk);
- if (checkTurn(stepdir, moving)) return;
+ if (checkTurn(stepdir, moving))
+ return;
action = Animation::checkWeapon(action, lastanim);
waitFor(avatar->doAnim(action, stepdir));
}
void AvatarMoverProcess::jump(Animation::Sequence action, int direction) {
- Ultima8Engine *guiapp = Ultima8Engine::get_instance();
Mouse *mouse = Mouse::get_instance();
MainActor *avatar = getMainActor();
int32 mx, my;
@@ -661,7 +663,7 @@ void AvatarMoverProcess::jump(Animation::Sequence action, int direction) {
if (targeting) {
int32 coords[3];
- GameMapGump *gameMap = guiapp->getGameMapGump();
+ GameMapGump *gameMap = Ultima8Engine::get_instance()->getGameMapGump();
// We need the Gump's x/y for TraceCoordinates
gameMap->ScreenSpaceToGump(mx, my);
ObjId targetId = gameMap->TraceCoordinates(mx, my, coords);
@@ -670,10 +672,8 @@ void AvatarMoverProcess::jump(Animation::Sequence action, int direction) {
int32 ax, ay, az;
avatar->getCentre(ax, ay, az);
- int32 xrange = ax - coords[0];
- if (xrange < 0) xrange = -xrange;
- int32 yrange = ay - coords[1];
- if (yrange < 0) yrange = -yrange;
+ int32 xrange = abs(ax - coords[0]);
+ int32 yrange = abs(ay - coords[1]);
int maxrange = avatar->getStr() * 32;
if (target && target->getShapeInfo()->is_land() &&
Commit: e0398b15ec0efa707fa6de7d86e0cc9f170cf499
https://github.com/scummvm/scummvm/commit/e0398b15ec0efa707fa6de7d86e0cc9f170cf499
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-24T15:35:51+09:00
Commit Message:
ULTIMA8: Refactor getActorFlags -> hasActorFlags
Changed paths:
engines/ultima/ultima8/gumps/menu_gump.cpp
engines/ultima/ultima8/gumps/u8_save_gump.cpp
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/ultima8.cpp
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor.h
engines/ultima/ultima8/world/actors/actor_anim_process.cpp
engines/ultima/ultima8/world/actors/anim_action.cpp
engines/ultima/ultima8/world/actors/animation_tracker.cpp
engines/ultima/ultima8/world/actors/avatar_death_process.cpp
engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
engines/ultima/ultima8/world/actors/combat_process.cpp
engines/ultima/ultima8/world/actors/grant_peace_process.cpp
engines/ultima/ultima8/world/actors/pathfinder.cpp
engines/ultima/ultima8/world/actors/pathfinder_process.cpp
diff --git a/engines/ultima/ultima8/gumps/menu_gump.cpp b/engines/ultima/ultima8/gumps/menu_gump.cpp
index f9b478c61c..05d00b7c4c 100644
--- a/engines/ultima/ultima8/gumps/menu_gump.cpp
+++ b/engines/ultima/ultima8/gumps/menu_gump.cpp
@@ -181,7 +181,7 @@ bool MenuGump::OnKeyDown(int key, int mod) {
if (key == Common::KEYCODE_ESCAPE) {
// FIXME: this check should probably be in Game or GUIApp
MainActor *av = getMainActor();
- if (av && !(av->getActorFlags() & Actor::ACT_DEAD))
+ if (av && !av->hasActorFlags(Actor::ACT_DEAD))
Close(); // don't allow closing if dead/game over
} else if (key >= Common::KEYCODE_1 && key <= Common::KEYCODE_9) {
selectEntry(key - Common::KEYCODE_1 + 1);
diff --git a/engines/ultima/ultima8/gumps/u8_save_gump.cpp b/engines/ultima/ultima8/gumps/u8_save_gump.cpp
index a630fb930e..f5e1cc3e65 100644
--- a/engines/ultima/ultima8/gumps/u8_save_gump.cpp
+++ b/engines/ultima/ultima8/gumps/u8_save_gump.cpp
@@ -326,7 +326,7 @@ Gump *U8SaveGump::showLoadSaveGump(Gump *parent, bool save) {
// can't _save if game over
// FIXME: this check should probably be in Game or GUIApp
MainActor *av = getMainActor();
- if (!av || (av->getActorFlags() & Actor::ACT_DEAD))
+ if (!av || av->hasActorFlags(Actor::ACT_DEAD))
return nullptr;
}
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index 91ffdfa34a..df0d35c828 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -685,7 +685,7 @@ bool Debugger::cmdToggleInvincibility(int argc, const char **argv) {
}
MainActor *av = getMainActor();
- if (av->getActorFlags() & Actor::ACT_INVINCIBLE) {
+ if (av->hasActorFlags(Actor::ACT_INVINCIBLE)) {
av->clearActorFlag(Actor::ACT_INVINCIBLE);
debugPrintf("Avatar is no longer invincible.\n");
} else {
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 947a00d782..9c48069a76 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -942,7 +942,7 @@ bool Ultima8Engine::canSaveGameStateCurrently(bool isAutosave) {
// Don't allow saving when avatar is dead.
MainActor *av = getMainActor();
- if (!av || (av->getActorFlags() & Actor::ACT_DEAD))
+ if (!av || av->hasActorFlags(Actor::ACT_DEAD))
return false;
return true;
@@ -958,7 +958,7 @@ bool Ultima8Engine::saveGame(int slot, const Std::string &desc, bool ignore_moda
// Don't allow saving when avatar is dead.
// (Avatar is flagged dead by usecode when you finish the _game as well.)
MainActor *av = getMainActor();
- if (!av || (av->getActorFlags() & Actor::ACT_DEAD)) {
+ if (!av || av->hasActorFlags(Actor::ACT_DEAD)) {
pout << "Can't save: _game over." << Std::endl;
return false;
}
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index e3a1966bcb..2d641f19b3 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -625,11 +625,11 @@ void Actor::receiveHit(uint16 other, int dir, int damage, uint16 damage_type) {
Kernel::get_instance()->addProcess(sp);
}
- if (damage > 0 && !(getActorFlags() & (ACT_IMMORTAL | ACT_INVINCIBLE))) {
+ if (damage > 0 && !hasActorFlags(ACT_IMMORTAL | ACT_INVINCIBLE)) {
if (damage >= _hitPoints) {
// we're dead
- if (getActorFlags() & ACT_WITHSTANDDEATH) {
+ if (hasActorFlags(ACT_WITHSTANDDEATH)) {
// or maybe not...
setHP(getMaxHP());
@@ -909,7 +909,7 @@ int Actor::calculateAttackDamage(uint16 other, int damage, uint16 damage_type) {
// blocking?
if ((getLastAnim() == Animation::startBlock ||
getLastAnim() == Animation::stopBlock) &&
- !(getActorFlags() & ACT_STUNNED)) {
+ !hasActorFlags(ACT_STUNNED)) {
damage -= getStr() / 5;
}
@@ -917,7 +917,7 @@ int Actor::calculateAttackDamage(uint16 other, int damage, uint16 damage_type) {
if (damage_type & WeaponInfo::DMG_FIRE)
ACmod /= 2; // armour doesn't protect from fire as well
- if (getActorFlags() & ACT_STUNNED)
+ if (hasActorFlags(ACT_STUNNED))
ACmod /= 2; // stunned?
if (ACmod > 100) ACmod = 100;
@@ -936,7 +936,7 @@ int Actor::calculateAttackDamage(uint16 other, int damage, uint16 damage_type) {
if (attackdex < 0) attackdex = 0;
if (defenddex <= 0) defenddex = 1;
- if ((getActorFlags() & ACT_STUNNED) ||
+ if (hasActorFlags(ACT_STUNNED) ||
(getRandom() % (attackdex + 3) > getRandom() % defenddex)) {
hit = true;
}
@@ -1011,8 +1011,8 @@ bool Actor::areEnemiesNear() {
if (!npc) continue;
if (npc == this) continue;
- if (npc->getActorFlags() & (ACT_DEAD | ACT_FEIGNDEATH)) continue;
- if (!(npc->getActorFlags() & ACT_INCOMBAT)) continue;
+ if (npc->hasActorFlags(ACT_DEAD | ACT_FEIGNDEATH)) continue;
+ if (!npc->hasActorFlags(ACT_INCOMBAT)) continue;
// TODO: check if hostile.
// Might not be strictly necessary, though. This function is only
@@ -1377,7 +1377,7 @@ uint32 Actor::I_isImmortal(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
if (!actor) return 0;
- if (actor->getActorFlags() & ACT_IMMORTAL)
+ if (actor->hasActorFlags(ACT_IMMORTAL))
return 1;
else
return 0;
@@ -1406,7 +1406,7 @@ uint32 Actor::I_isWithstandDeath(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
if (!actor) return 0;
- if (actor->getActorFlags() & ACT_WITHSTANDDEATH)
+ if (actor->hasActorFlags(ACT_WITHSTANDDEATH))
return 1;
else
return 0;
@@ -1434,7 +1434,7 @@ uint32 Actor::I_isFeignDeath(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
if (!actor) return 0;
- if (actor->getActorFlags() & ACT_FEIGNDEATH)
+ if (actor->hasActorFlags(ACT_FEIGNDEATH))
return 1;
else
return 0;
@@ -1444,7 +1444,7 @@ uint32 Actor::I_setFeignDeath(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
if (!actor) return 0;
- if (actor->getActorFlags() & ACT_FEIGNDEATH)
+ if (actor->hasActorFlags(ACT_FEIGNDEATH))
return 0;
actor->setActorFlag(ACT_FEIGNDEATH);
@@ -1578,7 +1578,7 @@ uint32 Actor::I_getAirWalkEnabled(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
if (!actor) return 0;
- if (actor->getActorFlags() & ACT_AIRWALK)
+ if (actor->hasActorFlags(ACT_AIRWALK))
return 1;
else
return 0;
diff --git a/engines/ultima/ultima8/world/actors/actor.h b/engines/ultima/ultima8/world/actors/actor.h
index cad2884277..5110310551 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -126,8 +126,8 @@ public:
_unk0C = b;
}
- uint32 getActorFlags() const {
- return _actorFlags;
+ bool hasActorFlags(uint32 flags) const {
+ return (_actorFlags & flags) != 0;
}
void setActorFlag(uint32 mask) {
_actorFlags |= mask;
diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
index 07b8fbcf8e..328128f213 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
@@ -95,7 +95,7 @@ bool ActorAnimProcess::init() {
return false;
}
- if (actor->getActorFlags() & Actor::ACT_ANIMLOCK) {
+ if (actor->hasActorFlags(Actor::ACT_ANIMLOCK)) {
//! What do we do if actor was already animating?
//! don't do this animation or kill the previous one?
//! Or maybe wait until the previous one finishes?
@@ -509,7 +509,7 @@ void ActorAnimProcess::doHitSpecial(Item *hit) {
break;
case 0x330: { // Slayer
// if we killed somebody, thunder&lightning
- if (attacked && (attacked->getActorFlags() & Actor::ACT_DEAD)) {
+ if (attacked && attacked->hasActorFlags(Actor::ACT_DEAD)) {
// calling intrinsic...
PaletteFaderProcess::I_lightningBolt(0, 0);
int sfx;
diff --git a/engines/ultima/ultima8/world/actors/anim_action.cpp b/engines/ultima/ultima8/world/actors/anim_action.cpp
index 5da87bd5ba..df45f56a80 100644
--- a/engines/ultima/ultima8/world/actors/anim_action.cpp
+++ b/engines/ultima/ultima8/world/actors/anim_action.cpp
@@ -63,7 +63,7 @@ void AnimAction::getAnimRange(Actor *actor, int dir,
unsigned int &startframe,
unsigned int &endframe) const {
getAnimRange(actor->getLastAnim(), actor->getDir(),
- (actor->getActorFlags() & Actor::ACT_FIRSTSTEP) != 0,
+ actor->hasActorFlags(Actor::ACT_FIRSTSTEP),
dir, startframe, endframe);
}
diff --git a/engines/ultima/ultima8/world/actors/animation_tracker.cpp b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
index d2d14f0b2c..67fd0a483e 100644
--- a/engines/ultima/ultima8/world/actors/animation_tracker.cpp
+++ b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
@@ -65,7 +65,7 @@ bool AnimationTracker::init(Actor *actor_, Animation::Sequence action_,
_animAction->getAnimRange(actor_, _dir, _startFrame, _endFrame);
actor_->getLocation(_x, _y, _z);
_flipped = (actor_->getFlags() & Item::FLG_FLIPPED) != 0;
- _firstStep = (actor_->getActorFlags() & Actor::ACT_FIRSTSTEP) != 0;
+ _firstStep = actor_->hasActorFlags(Actor::ACT_FIRSTSTEP);
} else {
_animAction->getAnimRange(state_->_lastAnim, state_->_direction,
state_->_firstStep, _dir, _startFrame, _endFrame);
diff --git a/engines/ultima/ultima8/world/actors/avatar_death_process.cpp b/engines/ultima/ultima8/world/actors/avatar_death_process.cpp
index 6e5dfbcedc..863c133f59 100644
--- a/engines/ultima/ultima8/world/actors/avatar_death_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_death_process.cpp
@@ -54,7 +54,7 @@ void AvatarDeathProcess::run() {
return;
}
- if (!(av->getActorFlags() & Actor::ACT_DEAD)) {
+ if (!av->hasActorFlags(Actor::ACT_DEAD)) {
perr << "AvatarDeathProcess: MainActor not dead" << Std::endl;
// avatar not dead?
terminate();
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index a0e4562fbf..33f2ac1e57 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -90,7 +90,7 @@ void AvatarMoverProcess::run() {
return;
}
- bool combatRun = (avatar->getActorFlags() & Actor::ACT_COMBATRUN) != 0;
+ bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
if (avatar->isInCombat() && !combatRun)
handleCombatMode();
else
@@ -324,7 +324,7 @@ void AvatarMoverProcess::handleNormalMode() {
int32 direction = avatar->getDir();
uint32 now = g_system->getMillis();
bool stasis = guiapp->isAvatarInStasis();
- bool combatRun = (avatar->getActorFlags() & Actor::ACT_COMBATRUN) != 0;
+ bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
int32 mx, my;
mouse->getMouseCoords(mx, my);
@@ -652,7 +652,7 @@ void AvatarMoverProcess::jump(Animation::Sequence action, int direction) {
}
// airwalk
- if ((avatar->getActorFlags() & Actor::ACT_AIRWALK) &&
+ if (avatar->hasActorFlags(Actor::ACT_AIRWALK) &&
action == Animation::jump) {
waitFor(avatar->doAnim(Animation::airwalkJump, direction));
return;
@@ -693,7 +693,7 @@ void AvatarMoverProcess::jump(Animation::Sequence action, int direction) {
void AvatarMoverProcess::turnToDirection(int direction) {
MainActor *avatar = getMainActor();
- bool combatRun = (avatar->getActorFlags() & Actor::ACT_COMBATRUN) != 0;
+ bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
int curdir = avatar->getDir();
int stepDelta;
bool combat = avatar->isInCombat() && !combatRun;
@@ -742,7 +742,7 @@ void AvatarMoverProcess::turnToDirection(int direction) {
bool AvatarMoverProcess::checkTurn(int direction, bool moving) {
MainActor *avatar = getMainActor();
- bool combatRun = (avatar->getActorFlags() & Actor::ACT_COMBATRUN) != 0;
+ bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
int curdir = avatar->getDir();
bool combat = avatar->isInCombat() && !combatRun;
Animation::Sequence lastanim = avatar->getLastAnim();
diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index 8a4a5f77dc..03f8df820a 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -190,7 +190,7 @@ bool CombatProcess::isValidTarget(Actor *target_) {
if (target_->isDead()) return false;
// feign death only works on undead and demons
- if (target_->getActorFlags() & Actor::ACT_FEIGNDEATH) {
+ if (target_->hasActorFlags(Actor::ACT_FEIGNDEATH)) {
if ((a->getDefenseType() & WeaponInfo::DMG_UNDEAD) ||
(a->getShape() == 96)) return false; // CONSTANT!
diff --git a/engines/ultima/ultima8/world/actors/grant_peace_process.cpp b/engines/ultima/ultima8/world/actors/grant_peace_process.cpp
index f979f8874e..49f5e644ed 100644
--- a/engines/ultima/ultima8/world/actors/grant_peace_process.cpp
+++ b/engines/ultima/ultima8/world/actors/grant_peace_process.cpp
@@ -149,9 +149,9 @@ void GrantPeaceProcess::run() {
} else {
// not undead
- if (!(target->getActorFlags() & (Actor::ACT_DEAD |
- Actor::ACT_IMMORTAL |
- Actor::ACT_INVINCIBLE))) {
+ if (!target->hasActorFlags(Actor::ACT_DEAD |
+ Actor::ACT_IMMORTAL |
+ Actor::ACT_INVINCIBLE)) {
if (getRandom() % 10 == 0) {
target->receiveHit(_itemNum, 8, target->getHP(),
(WeaponInfo::DMG_MAGIC |
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.cpp b/engines/ultima/ultima8/world/actors/pathfinder.cpp
index 34712dd1ee..e5d49310d6 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder.cpp
@@ -52,7 +52,7 @@ void PathfindingState::load(const Actor *_actor) {
_actor->getLocation(_x, _y, _z);
_lastAnim = _actor->getLastAnim();
_direction = _actor->getDir();
- _firstStep = (_actor->getActorFlags() & Actor::ACT_FIRSTSTEP) != 0;
+ _firstStep = _actor->hasActorFlags(Actor::ACT_FIRSTSTEP);
_flipped = (_actor->getFlags() & Item::FLG_FLIPPED) != 0;
_combat = _actor->isInCombat();
}
diff --git a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
index f39450d527..4acc592d8a 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
@@ -171,7 +171,7 @@ void PathfinderProcess::run() {
// FIXME: this should happen before the pathfinder is actually called,
// since the running animation may move the actor, which could break
// the found _path.
- if (actor->getActorFlags() & Actor::ACT_ANIMLOCK) {
+ if (actor->hasActorFlags(Actor::ACT_ANIMLOCK)) {
perr << "PathfinderProcess: ANIMLOCK, waiting" << Std::endl;
return;
}
Commit: 7c85b1838d927c764f1d88a0bec644dd69f8123e
https://github.com/scummvm/scummvm/commit/7c85b1838d927c764f1d88a0bec644dd69f8123e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-24T15:35:51+09:00
Commit Message:
ULTIMA8: Refactor Item getFlags -> hasFlags
Changed paths:
engines/ultima/ultima8/gumps/container_gump.cpp
engines/ultima/ultima8/gumps/game_map_gump.cpp
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor_anim_process.cpp
engines/ultima/ultima8/world/actors/animation_tracker.cpp
engines/ultima/ultima8/world/actors/combat_process.cpp
engines/ultima/ultima8/world/actors/pathfinder.cpp
engines/ultima/ultima8/world/actors/pathfinder_process.cpp
engines/ultima/ultima8/world/actors/resurrection_process.cpp
engines/ultima/ultima8/world/camera_process.cpp
engines/ultima/ultima8/world/current_map.cpp
engines/ultima/ultima8/world/destroy_item_process.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item.h
diff --git a/engines/ultima/ultima8/gumps/container_gump.cpp b/engines/ultima/ultima8/gumps/container_gump.cpp
index 82bd2e3f40..4f5e1d6ff5 100644
--- a/engines/ultima/ultima8/gumps/container_gump.cpp
+++ b/engines/ultima/ultima8/gumps/container_gump.cpp
@@ -285,7 +285,7 @@ Container *ContainerGump::getTargetContainer(Item *item, int mx, int my) {
ShapeInfo *targetinfo = targetcontainer->getShapeInfo();
if ((targetcontainer->getObjId() == item->getObjId()) ||
targetinfo->is_land() ||
- (targetcontainer->getFlags() & Item::FLG_IN_NPC_LIST)) {
+ targetcontainer->hasFlags(Item::FLG_IN_NPC_LIST)) {
targetcontainer = nullptr;
}
}
diff --git a/engines/ultima/ultima8/gumps/game_map_gump.cpp b/engines/ultima/ultima8/gumps/game_map_gump.cpp
index 83fffc9851..a2dff41023 100644
--- a/engines/ultima/ultima8/gumps/game_map_gump.cpp
+++ b/engines/ultima/ultima8/gumps/game_map_gump.cpp
@@ -150,13 +150,13 @@ void GameMapGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scaled)
continue;
if (!paintEditorItems && item->getShapeInfo()->is_editor())
continue;
- if (item->getFlags() & Item::FLG_INVISIBLE) {
+ if (item->hasFlags(Item::FLG_INVISIBLE)) {
// special case: invisible avatar _is_ drawn
// HACK: unless EXT_TRANSPARENT is also set.
// (Used for hiding the avatar when drawing a full area map)
if (item->getObjId() == 1) {
- if (item->getExtFlags() & Item::EXT_TRANSPARENT)
+ if (item->hasExtFlags(Item::EXT_TRANSPARENT))
continue;
int32 x_, y_, z_;
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 2d641f19b3..44f8bab067 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -390,7 +390,7 @@ uint16 Actor::getEquip(uint32 type) const {
uint32 cet = (*iter)->getShapeInfo()->_equipType;
bool cbackpack = ((*iter)->getShape() == backpack_shape);
- if (((*iter)->getFlags() & FLG_EQUIPPED) &&
+ if ((*iter)->hasFlags(FLG_EQUIPPED) &&
(cet == type || (cbackpack && type == 7))) { // !! constant
return (*iter)->getObjId();
}
diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
index 328128f213..80fcc48e4d 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
@@ -89,7 +89,7 @@ bool ActorAnimProcess::init() {
return false;
}
- if (!(actor->getFlags() & Item::FLG_FASTAREA)) {
+ if (!actor->hasFlags(Item::FLG_FASTAREA)) {
// not in the fast area? Can't play an animation then.
// (If we do, the actor will likely fall because the floor is gone.)
return false;
@@ -162,7 +162,7 @@ void ActorAnimProcess::run() {
_firstFrame = false;
- if (!(a->getFlags() & Item::FLG_FASTAREA)) {
+ if (!a->hasFlags(Item::FLG_FASTAREA)) {
// not in the fast area? Kill the animation then.
//! TODO: Decide if this is the right move.
// Animation could do one of three things: pause, move
@@ -298,7 +298,7 @@ void ActorAnimProcess::run() {
}
// Did we just leave the fast area?
- if (!(a->getFlags() & Item::FLG_FASTAREA)) {
+ if (!a->hasFlags(Item::FLG_FASTAREA)) {
#ifdef WATCHACTOR
if (_itemNum == watchactor)
pout << "Animation ["
diff --git a/engines/ultima/ultima8/world/actors/animation_tracker.cpp b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
index 67fd0a483e..23d31500d2 100644
--- a/engines/ultima/ultima8/world/actors/animation_tracker.cpp
+++ b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
@@ -64,7 +64,7 @@ bool AnimationTracker::init(Actor *actor_, Animation::Sequence action_,
if (state_ == 0) {
_animAction->getAnimRange(actor_, _dir, _startFrame, _endFrame);
actor_->getLocation(_x, _y, _z);
- _flipped = (actor_->getFlags() & Item::FLG_FLIPPED) != 0;
+ _flipped = actor_->hasFlags(Item::FLG_FLIPPED);
_firstStep = actor_->hasActorFlags(Actor::ACT_FIRSTSTEP);
} else {
_animAction->getAnimRange(state_->_lastAnim, state_->_direction,
@@ -212,7 +212,7 @@ bool AnimationTracker::step() {
}
// determine footpad
- bool actorflipped = (a->getFlags() & Item::FLG_FLIPPED) != 0;
+ bool actorflipped = a->hasFlags(Item::FLG_FLIPPED);
int32 xd, yd, zd;
a->getFootpadWorld(xd, yd, zd);
if (actorflipped != _flipped) {
@@ -312,13 +312,13 @@ bool AnimationTracker::step() {
descentdelta = -20; // Descend
if (descentdelta) {
- if (dy == 0 && dx != 0 && !(support->getFlags() & Item::FLG_FLIPPED)) {
+ if (dy == 0 && dx != 0 && !support->hasFlags(Item::FLG_FLIPPED)) {
// Moving left or right on horizontal bridge
// descentdelta = 60*dy/dx
// 60*dy = descentdelta * dx
// dy = descentdelta * dx / 60;
ty += descentdelta * dx / 60;
- } else if (dx == 0 && dy != 0 && (support->getFlags() & Item::FLG_FLIPPED)) {
+ } else if (dx == 0 && dy != 0 && support->hasFlags(Item::FLG_FLIPPED)) {
// Moving up or down on vertical bridge
tx += descentdelta * dy / 60;
}
diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index 03f8df820a..a82404dddc 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -73,7 +73,7 @@ void CombatProcess::run() {
// They should not try to approach.
Actor *a = getActor(_itemNum);
- if (!(a->getFlags() & Item::FLG_FASTAREA))
+ if (!a->hasFlags(Item::FLG_FASTAREA))
return;
Actor *t = getActor(_target);
@@ -184,7 +184,7 @@ bool CombatProcess::isValidTarget(Actor *target_) {
if (target_ == a) return false;
// not in the fastarea
- if (!(target_->getFlags() & Item::FLG_FASTAREA)) return false;
+ if (!target_->hasFlags(Item::FLG_FASTAREA)) return false;
// dead actors don't make good targets
if (target_->isDead()) return false;
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.cpp b/engines/ultima/ultima8/world/actors/pathfinder.cpp
index e5d49310d6..f5031773f5 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder.cpp
@@ -53,7 +53,7 @@ void PathfindingState::load(const Actor *_actor) {
_lastAnim = _actor->getLastAnim();
_direction = _actor->getDir();
_firstStep = _actor->hasActorFlags(Actor::ACT_FIRSTSTEP);
- _flipped = (_actor->getFlags() & Item::FLG_FLIPPED) != 0;
+ _flipped = _actor->hasFlags(Item::FLG_FLIPPED);
_combat = _actor->isInCombat();
}
diff --git a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
index 4acc592d8a..a43cc0fd84 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
@@ -128,7 +128,7 @@ void PathfinderProcess::run() {
Actor *actor = getActor(_itemNum);
assert(actor);
// if not in the fastarea, do nothing
- if (!(actor->getFlags() & Item::FLG_FASTAREA)) return;
+ if (!actor->hasFlags(Item::FLG_FASTAREA)) return;
bool ok = true;
diff --git a/engines/ultima/ultima8/world/actors/resurrection_process.cpp b/engines/ultima/ultima8/world/actors/resurrection_process.cpp
index d7f4e66cd5..f7a1276bae 100644
--- a/engines/ultima/ultima8/world/actors/resurrection_process.cpp
+++ b/engines/ultima/ultima8/world/actors/resurrection_process.cpp
@@ -57,7 +57,7 @@ void ResurrectionProcess::run() {
return;
}
- if (a->getFlags() & Item::FLG_GUMP_OPEN) {
+ if (a->hasFlags(Item::FLG_GUMP_OPEN)) {
// first close gump in case player is still rummaging through us
a->closeGump();
}
diff --git a/engines/ultima/ultima8/world/camera_process.cpp b/engines/ultima/ultima8/world/camera_process.cpp
index f05df4a640..32a0912e21 100644
--- a/engines/ultima/ultima8/world/camera_process.cpp
+++ b/engines/ultima/ultima8/world/camera_process.cpp
@@ -163,7 +163,7 @@ void CameraProcess::ItemMoved() {
Item *item = getItem(_itemNum);
// We only update for now if lerping has been disabled
- if (item && (item->getExtFlags() & Item::EXT_LERP_NOPREV)) {
+ if (item && item->hasExtFlags(Item::EXT_LERP_NOPREV)) {
item->getLocation(_ex, _ey, _ez);
_sx = _ex;
_sy = _ey;
diff --git a/engines/ultima/ultima8/world/current_map.cpp b/engines/ultima/ultima8/world/current_map.cpp
index 48a8527a1c..4a86cff301 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -132,8 +132,7 @@ void CurrentMap::writeback() {
item->clearExtFlag(Item::EXT_INCURMAP);
// delete all _fast only and disposable _items
- if ((item->getFlags() & Item::FLG_FAST_ONLY) ||
- (item->getFlags() & Item::FLG_DISPOSABLE)) {
+ if (item->hasFlags(Item::FLG_FAST_ONLY | Item::FLG_DISPOSABLE)) {
delete item;
continue;
}
@@ -145,11 +144,11 @@ void CurrentMap::writeback() {
}
// this item isn't from the Map. (like NPCs)
- if (item->getFlags() & Item::FLG_IN_NPC_LIST)
+ if (item->hasFlags(Item::FLG_IN_NPC_LIST))
continue;
item->clearObjId();
- if (item->getExtFlags() & Item::EXT_FIXED) {
+ if (item->hasExtFlags(Item::EXT_FIXED)) {
// item came from fixed
_currentMap->_fixedItems.push_back(item);
} else {
@@ -488,7 +487,7 @@ void CurrentMap::areaSearch(UCList *itemlist, const uint8 *loopscript,
const Item *item = *iter;
- if (item->getExtFlags() & Item::EXT_SPRITE)
+ if (item->hasExtFlags(Item::EXT_SPRITE))
continue;
// check if item is in range?
@@ -499,7 +498,7 @@ void CurrentMap::areaSearch(UCList *itemlist, const uint8 *loopscript,
int32 ixd, iyd;
//!! constants
- if (item->getFlags() & Item::FLG_FLIPPED) {
+ if (item->hasFlags(Item::FLG_FLIPPED)) {
ixd = 32 * info->_y;
iyd = 32 * info->_x;
} else {
@@ -577,7 +576,7 @@ void CurrentMap::surfaceSearch(UCList *itemlist, const uint8 *loopscript,
if (item->getObjId() == check)
continue;
- if (item->getExtFlags() & Item::EXT_SPRITE)
+ if (item->hasExtFlags(Item::EXT_SPRITE))
continue;
// check if item is in range?
@@ -716,7 +715,7 @@ bool CurrentMap::isValidPosition(int32 x, int32 y, int32 z,
const Item *item = *iter;
if (item->getObjId() == item_)
continue;
- if (item->getExtFlags() & Item::EXT_SPRITE)
+ if (item->hasExtFlags(Item::EXT_SPRITE))
continue;
ShapeInfo *si = item->getShapeInfo();
@@ -840,7 +839,7 @@ bool CurrentMap::scanForValidPosition(int32 x, int32 y, int32 z, Item *item,
Item *citem = *iter;
if (citem->getObjId() == item->getObjId())
continue;
- if (citem->getExtFlags() & Item::EXT_SPRITE)
+ if (citem->hasExtFlags(Item::EXT_SPRITE))
continue;
ShapeInfo *si = citem->getShapeInfo();
@@ -1027,7 +1026,7 @@ bool CurrentMap::sweepTest(const int32 start[3], const int32 end[3],
Item *other_item = *iter;
if (other_item->getObjId() == item)
continue;
- if (other_item->getExtFlags() & Item::EXT_SPRITE)
+ if (other_item->hasExtFlags(Item::EXT_SPRITE))
continue;
uint32 othershapeflags = other_item->getShapeInfo()->_flags;
@@ -1225,7 +1224,7 @@ Item *CurrentMap::traceTopItem(int32 x, int32 y, int32 ztop, int32 zbot, ObjId i
Item *item = *iter;
if (item->getObjId() == ignore)
continue;
- if (item->getExtFlags() & Item::EXT_SPRITE)
+ if (item->hasExtFlags(Item::EXT_SPRITE))
continue;
ShapeInfo *si = item->getShapeInfo();
diff --git a/engines/ultima/ultima8/world/destroy_item_process.cpp b/engines/ultima/ultima8/world/destroy_item_process.cpp
index 5c98326dfd..8a4936ba8a 100644
--- a/engines/ultima/ultima8/world/destroy_item_process.cpp
+++ b/engines/ultima/ultima8/world/destroy_item_process.cpp
@@ -62,7 +62,7 @@ void DestroyItemProcess::run() {
// FIXME: should probably prevent player from opening gump in the
// first place...
- if (it->getFlags() & Item::FLG_GUMP_OPEN) {
+ if (it->hasFlags(Item::FLG_GUMP_OPEN)) {
// first close gump in case player is still rummaging through us
it->closeGump();
}
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index dd3209c32b..d7c91b0eda 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -600,7 +600,8 @@ uint32 Item::getTotalWeight() const {
uint32 Item::getVolume() const {
// invisible items (trap markers and such) don't take up volume
- if (getFlags() & FLG_INVISIBLE) return 0;
+ if (hasFlags(FLG_INVISIBLE))
+ return 0;
uint32 volume = getShapeInfo()->_volume;
@@ -1135,7 +1136,7 @@ uint32 Item::use() {
if (actor) {
if (actor->isDead()) {
// dead actor, so open/close the dead-body-_gump
- if (getFlags() & FLG_GUMP_OPEN) {
+ if (hasFlags(FLG_GUMP_OPEN)) {
closeGump();
} else {
openGump(12); // CONSTANT!!
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index 8562673294..3781b5bd99 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -131,11 +131,16 @@ public:
//! Get the Box this item occupies in the world. Undef if item is contained
Box getWorldBox() const;
- //! Get flags
+ //! Get all flags
inline uint16 getFlags() const {
return _flags;
}
+ //! Does this item have any of the given flags mask set
+ inline bool hasFlags(uint16 flags) const {
+ return (_flags & flags) != 0;
+ }
+
//! Set the flags set in the given mask.
void setFlag(uint32 mask) {
_flags |= mask;
@@ -160,6 +165,11 @@ public:
return _extendedFlags;
}
+ //! Does item have any of the given extended flags
+ inline bool hasExtFlags(uint32 flags) const {
+ return (_extendedFlags & flags) != 0;
+ }
+
//! Set the _extendedFlags set in the given mask.
void setExtFlag(uint32 mask) {
_extendedFlags |= mask;
Commit: 70eb9a061cb13163603ef6220257fa548125f9a1
https://github.com/scummvm/scummvm/commit/70eb9a061cb13163603ef6220257fa548125f9a1
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-24T16:22:11+09:00
Commit Message:
ULTIMA8: MButton refactors for avatar mover process
Trying to clear the way to add a keyboard shortcut for the "jump" action, since
clicking both buttons on a trackpad is not possible.
Changed paths:
engines/ultima/ultima8/kernel/mouse.cpp
engines/ultima/ultima8/kernel/mouse.h
engines/ultima/ultima8/world/actors/animation.cpp
engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
engines/ultima/ultima8/world/actors/avatar_mover_process.h
diff --git a/engines/ultima/ultima8/kernel/mouse.cpp b/engines/ultima/ultima8/kernel/mouse.cpp
index 8052047b5a..e54da775ed 100644
--- a/engines/ultima/ultima8/kernel/mouse.cpp
+++ b/engines/ultima/ultima8/kernel/mouse.cpp
@@ -43,12 +43,6 @@ Mouse::Mouse() : _flashingCursorTime(0), _mouseOverGump(0), _defaultMouse(nullpt
_dragging(DRAG_NOT), _dragging_objId(0), _draggingItem_startGump(0),
_draggingItem_lastGump(0) {
_instance = this;
-
- for (int i = 0; i < Shared::MOUSE_LAST; ++i) {
- _mouseButton[i]._downGump = 0;
- _mouseButton[i]._lastDown = 0;
- _mouseButton[i]._state = MBS_HANDLED;
- }
}
void Mouse::setup() {
@@ -68,35 +62,36 @@ bool Mouse::buttonDown(Shared::MouseButton button) {
bool handled = false;
uint32 now = g_system->getMillis();
+ MButton &mbutton = _mouseButton[button];
+
Gump *desktopGump = Ultima8Engine::get_instance()->getDesktopGump();
Gump *mousedowngump = desktopGump->OnMouseDown(button, _mousePos.x, _mousePos.y);
if (mousedowngump) {
- _mouseButton[button]._downGump = mousedowngump->getObjId();
+ mbutton._downGump = mousedowngump->getObjId();
handled = true;
} else {
- _mouseButton[button]._downGump = 0;
+ mbutton._downGump = 0;
}
- _mouseButton[button]._curDown = now;
- _mouseButton[button]._downX = _mousePos.x;
- _mouseButton[button]._downY = _mousePos.y;
- _mouseButton[button]._state |= MBS_DOWN;
- _mouseButton[button]._state &= ~MBS_HANDLED;
+ mbutton._curDown = now;
+ mbutton._downPoint = _mousePos;
+ mbutton.setState(MBS_DOWN);
+ mbutton.clearState(MBS_HANDLED);
- if (now - _mouseButton[button]._lastDown < DOUBLE_CLICK_TIMEOUT) {
+ if (_mouseButton[button].isDoubleClick()) {
if (_dragging == Mouse::DRAG_NOT) {
- Gump *gump = getGump(_mouseButton[button]._downGump);
+ Gump *gump = getGump(mbutton._downGump);
if (gump) {
int32 mx2 = _mousePos.x, my2 = _mousePos.y;
Gump *parent = gump->GetParent();
if (parent) parent->ScreenSpaceToGump(mx2, my2);
gump->OnMouseDouble(button, mx2, my2);
}
- _mouseButton[button]._state |= MBS_HANDLED;
- _mouseButton[button]._lastDown = 0;
+ mbutton.setState(MBS_HANDLED);
+ mbutton._lastDown = 0;
}
}
- _mouseButton[button]._lastDown = now;
+ mbutton._lastDown = now;
return handled;
}
@@ -105,12 +100,11 @@ bool Mouse::buttonUp(Shared::MouseButton button) {
assert(button != Shared::MOUSE_LAST);
bool handled = false;
- _mouseButton[button]._state &= ~MBS_DOWN;
+ _mouseButton[button].clearState(MBS_DOWN);
// Need to store the last down position of the mouse
// when the button is released.
- _mouseButton[button]._downX = _mousePos.x;
- _mouseButton[button]._downY = _mousePos.y;
+ _mouseButton[button]._downPoint = _mousePos;
// Always send mouse up to the gump
Gump *gump = getGump(_mouseButton[button]._downGump);
@@ -137,7 +131,7 @@ void Mouse::popAllCursors() {
}
bool Mouse::isMouseDownEvent(Shared::MouseButton button) const {
- return (_mouseButton[button]._state & MBS_DOWN);
+ return _mouseButton[button].isState(MBS_DOWN);
}
int Mouse::getMouseLength(int mx, int my) {
@@ -318,9 +312,9 @@ void Mouse::setMouseCoords(int mx, int my) {
}
if (_dragging == DRAG_NOT) {
- if (_mouseButton[Shared::BUTTON_LEFT]._state & MBS_DOWN) {
- int startx = _mouseButton[Shared::BUTTON_LEFT]._downX;
- int starty = _mouseButton[Shared::BUTTON_LEFT]._downY;
+ if (_mouseButton[Shared::BUTTON_LEFT].isState(MBS_DOWN)) {
+ int startx = _mouseButton[Shared::BUTTON_LEFT]._downPoint.x;
+ int starty = _mouseButton[Shared::BUTTON_LEFT]._downPoint.y;
if (ABS(startx - mx) > 2 ||
ABS(starty - my) > 2) {
startDragging(startx, starty);
@@ -406,7 +400,7 @@ void Mouse::startDragging(int startx, int starty) {
// pause the kernel
Kernel::get_instance()->pause();
- _mouseButton[Shared::BUTTON_LEFT]._state |= MBS_HANDLED;
+ _mouseButton[Shared::BUTTON_LEFT].setState(MBS_HANDLED);
if (_dragging == DRAG_INVALID) {
setMouseCursor(MOUSE_CROSS);
@@ -505,15 +499,13 @@ void Mouse::stopDragging(int mx, int my) {
}
void Mouse::handleDelayedEvents() {
- uint32 now = g_system->getMillis();
-
for (int button = 0; button < Shared::MOUSE_LAST; ++button) {
if (!(_mouseButton[button]._state & (MBS_HANDLED | MBS_DOWN)) &&
- now - _mouseButton[button]._lastDown > DOUBLE_CLICK_TIMEOUT) {
+ !_mouseButton[button].lastWithinDblClkTimeout()) {
Gump *gump = getGump(_mouseButton[button]._downGump);
if (gump) {
- int32 mx = _mouseButton[button]._downX;
- int32 my = _mouseButton[button]._downY;
+ int32 mx = _mouseButton[button]._downPoint.x;
+ int32 my = _mouseButton[button]._downPoint.y;
Gump *parent = gump->GetParent();
if (parent)
parent->ScreenSpaceToGump(mx, my);
@@ -522,7 +514,7 @@ void Mouse::handleDelayedEvents() {
}
_mouseButton[button]._downGump = 0;
- _mouseButton[button]._state |= MBS_HANDLED;
+ _mouseButton[button].setState(MBS_HANDLED);
}
}
}
diff --git a/engines/ultima/ultima8/kernel/mouse.h b/engines/ultima/ultima8/kernel/mouse.h
index c30fa37ba3..f32a9fe65b 100644
--- a/engines/ultima/ultima8/kernel/mouse.h
+++ b/engines/ultima/ultima8/kernel/mouse.h
@@ -23,6 +23,7 @@
#ifndef ULTIMA8_KERNEL_MOUSE_H
#define ULTIMA8_KERNEL_MOUSE_H
+#include "common/system.h"
#include "common/rect.h"
#include "common/stack.h"
#include "ultima/shared/engine/events.h"
@@ -33,18 +34,48 @@ namespace Ultima8 {
const unsigned int DOUBLE_CLICK_TIMEOUT = 200;
+enum MouseButtonState {
+ MBS_DOWN = 0x1,
+ MBS_HANDLED = 0x2, // Mousedown event handled
+ MBS_RELHANDLED = 0x4 // Mouse release event handled (only used in AvatarMover)
+};
+
struct MButton {
uint16 _downGump;
uint32 _lastDown;
uint32 _curDown;
- int _downX, _downY;
+ Common::Point _downPoint;
int _state;
-};
-enum MouseButtonState {
- MBS_DOWN = 0x1,
- MBS_HANDLED = 0x2,
- MBS_RELHANDLED = 0x4
+ MButton() : _downGump(0), _curDown(0), _lastDown(0), _state(MBS_HANDLED | MBS_RELHANDLED)
+ {
+ }
+
+ bool isState(MouseButtonState state) const {
+ return _state & state;
+ }
+ void setState(MouseButtonState state) {
+ _state |= state;
+ }
+ void clearState(MouseButtonState state) {
+ _state &= ~state;
+ }
+
+ bool curWithinDblClkTimeout() {
+ uint32 now = g_system->getMillis();
+ return now - _curDown <= DOUBLE_CLICK_TIMEOUT;
+ }
+
+ bool lastWithinDblClkTimeout() {
+ uint32 now = g_system->getMillis();
+ return now - _lastDown <= DOUBLE_CLICK_TIMEOUT;
+ }
+
+ bool isDoubleClick() {
+ return isState(MBS_DOWN) &&
+ (_curDown - _lastDown) <= DOUBLE_CLICK_TIMEOUT;
+ }
+
};
class Gump;
diff --git a/engines/ultima/ultima8/world/actors/animation.cpp b/engines/ultima/ultima8/world/actors/animation.cpp
index 96d71969e0..d8d8776d63 100644
--- a/engines/ultima/ultima8/world/actors/animation.cpp
+++ b/engines/ultima/ultima8/world/actors/animation.cpp
@@ -49,7 +49,7 @@ Sequence checkWeapon(const Sequence nextanim,
Sequence anim = nextanim;
if (isCombatAnim(nextanim) && ! isCombatAnim(lastanim)) {
anim = readyWeapon;
- } else if (! isCombatAnim(nextanim) && isCombatAnim(lastanim)) {
+ } else if (!isCombatAnim(nextanim) && isCombatAnim(lastanim)) {
anim = unreadyWeapon;
}
return anim;
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index 33f2ac1e57..7c029e95af 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -34,7 +34,6 @@
#include "ultima/ultima8/conf/setting_manager.h"
#include "ultima/ultima8/audio/music_process.h"
#include "ultima/ultima8/world/get_object.h"
-#include "common/system.h"
namespace Ultima {
namespace Ultima8 {
@@ -42,17 +41,9 @@ namespace Ultima8 {
// p_dynamic_cast stuff
DEFINE_RUNTIME_CLASSTYPE_CODE(AvatarMoverProcess, Process)
-AvatarMoverProcess::AvatarMoverProcess() : Process() {
- _lastFrame = 0;
- _lastAttack = 0;
- _idleTime = 0;
- _lastHeadShakeAnim = Animation::lookLeft;
- _mouseButton[0]._state = MBS_HANDLED | MBS_RELHANDLED;
- _mouseButton[1]._state = MBS_HANDLED | MBS_RELHANDLED;
- _mouseButton[0]._curDown = 0;
- _mouseButton[1]._curDown = 0;
- _mouseButton[0]._lastDown = 0;
- _mouseButton[1]._lastDown = 0;
+AvatarMoverProcess::AvatarMoverProcess() : Process(),
+ _lastFrame(0), _lastAttack(0), _idleTime(0),
+ _lastHeadShakeAnim(Animation::lookLeft) {
_type = 1; // CONSTANT! (type 1 = persistent)
}
@@ -98,7 +89,6 @@ void AvatarMoverProcess::run() {
}
void AvatarMoverProcess::handleHangingMode() {
- uint32 now = g_system->getMillis();
bool stasis = Ultima8Engine::get_instance()->isAvatarInStasis();
_idleTime = 0;
@@ -108,27 +98,25 @@ void AvatarMoverProcess::handleHangingMode() {
bool m0clicked = false;
//bool m1clicked = false;
- if (!(_mouseButton[0]._state & MBS_HANDLED) &&
- now - _mouseButton[0]._curDown > DOUBLE_CLICK_TIMEOUT) {
+ if (!_mouseButton[0].isState(MBS_HANDLED) &&
+ !_mouseButton[0].curWithinDblClkTimeout()) {
m0clicked = true;
- _mouseButton[0]._state |= MBS_HANDLED;
+ _mouseButton[0].setState(MBS_HANDLED);
}
- if (!(_mouseButton[1]._state & MBS_HANDLED) &&
- now - _mouseButton[1]._curDown > DOUBLE_CLICK_TIMEOUT) {
+ if (!_mouseButton[1].isState(MBS_HANDLED) &&
+ !_mouseButton[1].curWithinDblClkTimeout()) {
//m1clicked = true;
- _mouseButton[1]._state |= MBS_HANDLED;
+ _mouseButton[1].setState(MBS_HANDLED);
}
- if (!(_mouseButton[0]._state & MBS_RELHANDLED))
- _mouseButton[0]._state |= MBS_RELHANDLED;
- if (!(_mouseButton[1]._state & MBS_RELHANDLED))
- _mouseButton[1]._state |= MBS_RELHANDLED;
+ _mouseButton[0].setState(MBS_RELHANDLED);
+ _mouseButton[1].setState(MBS_RELHANDLED);
// if left mouse is down, try to climb up
- if ((_mouseButton[0]._state & MBS_DOWN) &&
- (!(_mouseButton[0]._state & MBS_HANDLED) || m0clicked)) {
- _mouseButton[0]._state |= MBS_HANDLED;
+ if (_mouseButton[0].isState(MBS_DOWN) &&
+ (!_mouseButton[0].isState(MBS_HANDLED) || m0clicked)) {
+ _mouseButton[0].setState(MBS_HANDLED);
_mouseButton[0]._lastDown = 0;
MainActor *avatar = getMainActor();
@@ -144,7 +132,6 @@ void AvatarMoverProcess::handleCombatMode() {
MainActor *avatar = getMainActor();
Animation::Sequence lastanim = avatar->getLastAnim();
int32 direction = avatar->getDir();
- uint32 now = g_system->getMillis();
bool stasis = Ultima8Engine::get_instance()->isAvatarInStasis();
int32 mx, my;
@@ -165,7 +152,7 @@ void AvatarMoverProcess::handleCombatMode() {
// if we were blocking, and no longer holding the mouse, stop
if (lastanim == Animation::startBlock &&
- !(_mouseButton[0]._state & MBS_DOWN)) {
+ !_mouseButton[0].isState(MBS_DOWN)) {
// pout << "AvatarMover: combat stop blocking" << Std::endl;
waitFor(avatar->doAnim(Animation::stopBlock, direction));
return;
@@ -178,26 +165,23 @@ void AvatarMoverProcess::handleCombatMode() {
bool m0clicked = false;
bool m1clicked = false;
- if (!(_mouseButton[0]._state & MBS_HANDLED) &&
- now - _mouseButton[0]._curDown > DOUBLE_CLICK_TIMEOUT) {
+ if (!_mouseButton[0].isState(MBS_HANDLED) &&
+ !_mouseButton[0].curWithinDblClkTimeout()) {
m0clicked = true;
- _mouseButton[0]._state |= MBS_HANDLED;
+ _mouseButton[0].setState(MBS_HANDLED);
}
- if (!(_mouseButton[1]._state & MBS_HANDLED) &&
- now - _mouseButton[1]._curDown > DOUBLE_CLICK_TIMEOUT) {
+ if (!_mouseButton[1].isState(MBS_HANDLED) &&
+ !_mouseButton[1].curWithinDblClkTimeout()) {
m1clicked = true;
- _mouseButton[1]._state |= MBS_HANDLED;
+ _mouseButton[1].setState(MBS_HANDLED);
}
- if (!(_mouseButton[0]._state & MBS_RELHANDLED))
- _mouseButton[0]._state |= MBS_RELHANDLED;
-
- if (!(_mouseButton[1]._state & MBS_RELHANDLED))
- _mouseButton[1]._state |= MBS_RELHANDLED;
+ _mouseButton[0].setState(MBS_RELHANDLED);
+ _mouseButton[1].setState(MBS_RELHANDLED);
- if ((_mouseButton[0]._state & MBS_DOWN) &&
- (_mouseButton[0]._state & MBS_HANDLED) && _mouseButton[0]._lastDown > 0) {
+ if (_mouseButton[0].isState(MBS_DOWN) &&
+ _mouseButton[0].isState(MBS_HANDLED) && _mouseButton[0]._lastDown > 0) {
// left click-and-hold = block
if (lastanim == Animation::startBlock)
return;
@@ -211,10 +195,8 @@ void AvatarMoverProcess::handleCombatMode() {
return;
}
- if ((_mouseButton[0]._state & MBS_DOWN) &&
- !(_mouseButton[0]._state & MBS_HANDLED) &&
- _mouseButton[0]._curDown - _mouseButton[0]._lastDown <= DOUBLE_CLICK_TIMEOUT) {
- _mouseButton[0]._state |= MBS_HANDLED;
+ if (!_mouseButton[0].isState(MBS_HANDLED) && _mouseButton[0].isDoubleClick()) {
+ _mouseButton[0].setState(MBS_HANDLED);
_mouseButton[0]._lastDown = 0;
if (canAttack()) {
@@ -235,10 +217,8 @@ void AvatarMoverProcess::handleCombatMode() {
return;
}
- if ((_mouseButton[1]._state & MBS_DOWN) &&
- !(_mouseButton[1]._state & MBS_HANDLED) &&
- _mouseButton[1]._curDown - _mouseButton[1]._lastDown <= DOUBLE_CLICK_TIMEOUT) {
- _mouseButton[1]._state |= MBS_HANDLED;
+ if (!_mouseButton[1].isState(MBS_HANDLED) && _mouseButton[0].isDoubleClick()) {
+ _mouseButton[1].setState(MBS_HANDLED);
_mouseButton[1]._lastDown = 0;
Gump *desktopgump = Ultima8Engine::get_instance()->getDesktopGump();
@@ -267,8 +247,8 @@ void AvatarMoverProcess::handleCombatMode() {
return;
}
- if ((_mouseButton[1]._state & MBS_DOWN) &&
- (_mouseButton[1]._state & MBS_HANDLED) && _mouseButton[1]._lastDown > 0) {
+ if (_mouseButton[1].isState(MBS_DOWN) &&
+ _mouseButton[1].isState(MBS_HANDLED) && _mouseButton[1]._lastDown > 0) {
// right mouse button is down long enough to act on it
// if facing right direction, walk
//!! TODO: check if you can actually take this step
@@ -364,24 +344,23 @@ void AvatarMoverProcess::handleNormalMode() {
bool m1clicked = false;
// check mouse state to see what needs to be done
- if (!(_mouseButton[0]._state & MBS_HANDLED) &&
- now - _mouseButton[0]._curDown > DOUBLE_CLICK_TIMEOUT) {
+ if (!_mouseButton[0].isState(MBS_HANDLED) &&
+ !_mouseButton[0].curWithinDblClkTimeout()) {
m0clicked = true;
- _mouseButton[0]._state |= MBS_HANDLED;
+ _mouseButton[0].setState(MBS_HANDLED);
}
- if (!(_mouseButton[1]._state & MBS_HANDLED) &&
- now - _mouseButton[1]._curDown > DOUBLE_CLICK_TIMEOUT) {
+ if (!_mouseButton[1].isState(MBS_HANDLED) &&
+ !_mouseButton[1].curWithinDblClkTimeout()) {
m1clicked = true;
- _mouseButton[1]._state |= MBS_HANDLED;
+ _mouseButton[1].setState(MBS_HANDLED);
}
// see if mouse was just released
- if (!(_mouseButton[0]._state & MBS_RELHANDLED))
- _mouseButton[0]._state |= MBS_RELHANDLED; // don't care about left
+ _mouseButton[0].setState(MBS_RELHANDLED); // don't care about left
- if (!(_mouseButton[1]._state & MBS_RELHANDLED)) {
- _mouseButton[1]._state |= MBS_RELHANDLED;
+ if (!_mouseButton[1].isState(MBS_RELHANDLED)) {
+ _mouseButton[1].setState(MBS_RELHANDLED);
// if we were running in combat mode, slow to a walk, draw weapon
// (even in stasis)
@@ -421,8 +400,10 @@ void AvatarMoverProcess::handleNormalMode() {
return;
// both mouse buttons down
- if (!(_mouseButton[0]._state & MBS_HANDLED) &&
- !(_mouseButton[1]._state & MBS_HANDLED)) {
+ if (!_mouseButton[0].isState(MBS_HANDLED) &&
+ !_mouseButton[1].isState(MBS_HANDLED)) {
+ // Take action if both were clicked within
+ // double-click timeout of each other.
// notice these are all unsigned.
uint32 down = _mouseButton[1]._curDown;
if (_mouseButton[0]._curDown < down) {
@@ -432,8 +413,8 @@ void AvatarMoverProcess::handleNormalMode() {
}
if (down < DOUBLE_CLICK_TIMEOUT) {
- _mouseButton[0]._state |= MBS_HANDLED;
- _mouseButton[1]._state |= MBS_HANDLED;
+ _mouseButton[0].setState(MBS_HANDLED);
+ _mouseButton[1].setState(MBS_HANDLED);
// We got a left mouse down.
// Note that this automatically means right was down too.
@@ -456,58 +437,48 @@ void AvatarMoverProcess::handleNormalMode() {
}
if (nextanim == Animation::jump) {
- jump(nextanim, direction);
- return;
- }
-
- if (nextanim != Animation::jumpUp) {
- // climbing gives str/dex
- avatar->accumulateStr(2 + nextanim - Animation::climb16);
- avatar->accumulateDex(2 * (2 + nextanim - Animation::climb16));
+ jump(Animation::jump, direction);
+ } else {
+ if (nextanim != Animation::jumpUp) {
+ // climbing gives str/dex
+ avatar->accumulateStr(2 + nextanim - Animation::climb16);
+ avatar->accumulateDex(2 * (2 + nextanim - Animation::climb16));
+ }
+ nextanim = Animation::checkWeapon(nextanim, lastanim);
+ waitFor(avatar->doAnim(nextanim, direction));
}
-
- nextanim = Animation::checkWeapon(nextanim, lastanim);
- waitFor(avatar->doAnim(nextanim, direction));
return;
}
}
- if ((!(_mouseButton[0]._state & MBS_HANDLED) || m0clicked) &&
- (_mouseButton[1]._state & MBS_DOWN)) {
- _mouseButton[0]._state |= MBS_HANDLED;
- // We got a left mouse down.
- // Note that this automatically means right was down at the time too.
+ if ((!_mouseButton[0].isState(MBS_HANDLED) || m0clicked) &&
+ _mouseButton[1].isState(MBS_DOWN)) {
+ _mouseButton[0].setState(MBS_HANDLED);
+ // We got a left mouse down while the (already handled) right was down.
if (checkTurn(mousedir, false))
return;
- Animation::Sequence nextanim = Animation::jumpUp;
-
// check if we need to do a running jump
if (lastanim == Animation::run ||
lastanim == Animation::runningJump) {
- pout << "AvatarMover: running jump" << Std::endl;
jump(Animation::runningJump, direction);
- return;
} else if (mouselength > 0) {
- pout << "AvatarMover: jump" << Std::endl;
jump(Animation::jump, direction);
- return;
+ } else {
+ Animation::Sequence nextanim = Animation::checkWeapon(Animation::jumpUp, lastanim);
+ waitFor(avatar->doAnim(nextanim, direction));
}
- nextanim = Animation::checkWeapon(nextanim, lastanim);
- waitFor(avatar->doAnim(nextanim, direction));
return;
// CHECKME: check what needs to happen when keeping left pressed
}
- if ((_mouseButton[1]._state & MBS_DOWN) &&
- !(_mouseButton[1]._state & MBS_HANDLED) &&
- _mouseButton[1]._curDown - _mouseButton[1]._lastDown <= DOUBLE_CLICK_TIMEOUT) {
+ if (!_mouseButton[1].isState(MBS_HANDLED) && _mouseButton[1].isDoubleClick()) {
Gump *desktopgump = Ultima8Engine::get_instance()->getDesktopGump();
if (desktopgump->TraceObjId(mx, my) == 1) {
// double right click on avatar = toggle combat mode
- _mouseButton[1]._state |= MBS_HANDLED;
+ _mouseButton[1].setState(MBS_HANDLED);
_mouseButton[1]._lastDown = 0;
avatar->toggleInCombat();
@@ -516,17 +487,16 @@ void AvatarMoverProcess::handleNormalMode() {
}
}
- if ((_mouseButton[1]._state & MBS_DOWN) &&
- (_mouseButton[1]._state & MBS_HANDLED)) {
+ if (_mouseButton[1].isState(MBS_DOWN) &&
+ _mouseButton[1].isState(MBS_HANDLED)) {
// right mouse button is down long enough to act on it
// if facing right direction, walk
Animation::Sequence nextanim = Animation::step;
- if (mouselength == 1)
+ if (mouselength == 1) {
nextanim = Animation::walk;
-
- if (mouselength == 2) {
+ } else if (mouselength == 2) {
if (lastanim == Animation::run
|| lastanim == Animation::runningJump
|| lastanim == Animation::walk)
@@ -642,8 +612,6 @@ void AvatarMoverProcess::step(Animation::Sequence action, int direction,
void AvatarMoverProcess::jump(Animation::Sequence action, int direction) {
Mouse *mouse = Mouse::get_instance();
MainActor *avatar = getMainActor();
- int32 mx, my;
- mouse->getMouseCoords(mx, my);
// running jump
if (action == Animation::runningJump) {
@@ -663,6 +631,8 @@ void AvatarMoverProcess::jump(Animation::Sequence action, int direction) {
if (targeting) {
int32 coords[3];
+ int32 mx, my;
+ mouse->getMouseCoords(mx, my);
GameMapGump *gameMap = Ultima8Engine::get_instance()->getGameMapGump();
// We need the Gump's x/y for TraceCoordinates
gameMap->ScreenSpaceToGump(mx, my);
@@ -700,6 +670,7 @@ void AvatarMoverProcess::turnToDirection(int direction) {
Animation::Sequence turnanim;
Animation::Sequence standanim = Animation::stand;
+ // note curdir-direction can be negative, hence + 8 % 8
if ((curdir - direction + 8) % 8 < 4) {
stepDelta = -1;
turnanim = Animation::lookLeft;
@@ -742,15 +713,15 @@ void AvatarMoverProcess::turnToDirection(int direction) {
bool AvatarMoverProcess::checkTurn(int direction, bool moving) {
MainActor *avatar = getMainActor();
- bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
int curdir = avatar->getDir();
- bool combat = avatar->isInCombat() && !combatRun;
- Animation::Sequence lastanim = avatar->getLastAnim();
+ bool combat = avatar->isInCombat() && !avatar->hasActorFlags(Actor::ACT_COMBATRUN);
// Note: don't need to turn if moving backward in combat stance
// CHECKME: currently, first turn in the right direction
if (direction != curdir && !(
combat && ABS(direction - curdir) == 4)) {
+ Animation::Sequence lastanim = avatar->getLastAnim();
+
if (moving &&
(lastanim == Animation::walk || lastanim == Animation::run ||
lastanim == Animation::combatStand) &&
@@ -796,8 +767,8 @@ void AvatarMoverProcess::OnMouseDown(int button, int32 mx, int32 my) {
_mouseButton[bid]._lastDown = _mouseButton[bid]._curDown;
_mouseButton[bid]._curDown = g_system->getMillis();
- _mouseButton[bid]._state |= MBS_DOWN;
- _mouseButton[bid]._state &= ~MBS_HANDLED;
+ _mouseButton[bid].setState(MBS_DOWN);
+ _mouseButton[bid].clearState(MBS_HANDLED);
}
void AvatarMoverProcess::OnMouseUp(int button) {
@@ -811,8 +782,8 @@ void AvatarMoverProcess::OnMouseUp(int button) {
CANT_HAPPEN_MSG("invalid MouseUp passed to AvatarMoverProcess");
}
- _mouseButton[bid]._state &= ~MBS_DOWN;
- _mouseButton[bid]._state &= ~MBS_RELHANDLED;
+ _mouseButton[bid].clearState(MBS_DOWN);
+ _mouseButton[bid].clearState(MBS_RELHANDLED);
}
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.h b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
index a03661fc06..5994b186f9 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
@@ -48,7 +48,8 @@ public:
}
bool loadData(Common::ReadStream *rs, uint32 version);
-protected:
+
+private:
void saveData(Common::WriteStream *ws) override;
void handleHangingMode();
More information about the Scummvm-git-logs
mailing list