[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