[Scummvm-git-logs] scummvm master -> 1441135cc5daaa2256fb7031216e4ae440efa60c

mduggan mgithub at guarana.org
Sun Sep 5 06:23:13 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
1441135cc5 ULTIMA8: Always turn in Crusader when arrow keys are tapped


Commit: 1441135cc5daaa2256fb7031216e4ae440efa60c
    https://github.com/scummvm/scummvm/commit/1441135cc5daaa2256fb7031216e4ae440efa60c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-09-05T15:22:23+09:00

Commit Message:
ULTIMA8: Always turn in Crusader when arrow keys are tapped

In the original game, while walking or running even a very brief tap on the
arrow key will always result in a turn.  Now we do that too by remembering a
tap happened.

Changed paths:
    engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
    engines/ultima/ultima8/world/actors/avatar_mover_process.h
    engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
    engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h


diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index 4143a2d381..7111fe27ae 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -165,11 +165,11 @@ void AvatarMoverProcess::getMovementFlagAxes(int &x, int &y) {
 }
 
 Direction AvatarMoverProcess::getTurnDirForTurnFlags(Direction direction, DirectionMode dirmode) {
-	if (hasMovementFlags(MOVE_TURN_LEFT)) {
+	if (hasMovementFlags(MOVE_TURN_LEFT | MOVE_PENDING_TURN_LEFT)) {
 		direction = Direction_OneLeft(direction, dirmode);
 	}
 
-	if (hasMovementFlags(MOVE_TURN_RIGHT)) {
+	if (hasMovementFlags(MOVE_TURN_RIGHT | MOVE_PENDING_TURN_RIGHT)) {
 		direction = Direction_OneRight(direction, dirmode);
 	}
 	return direction;
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.h b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
index 995250299e..995c739332 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
@@ -54,7 +54,7 @@ public:
 	void setMovementFlag(uint32 mask) {
 		_movementFlags |= mask;
 	}
-	void clearMovementFlag(uint32 mask) {
+	virtual void clearMovementFlag(uint32 mask) {
 		_movementFlags &= ~mask;
 	}
 
@@ -81,6 +81,9 @@ public:
 
 		// Firing weapon (Crusader only)
 		MOVE_ATTACKING = 0x1000,
+		// Pending turn (Crusader only)
+		MOVE_PENDING_TURN_LEFT  = 0x2000,
+		MOVE_PENDING_TURN_RIGHT = 0x4000,
 
 		MOVE_ANY_DIRECTION = MOVE_MOUSE_DIRECTION | MOVE_FORWARD | MOVE_BACK | MOVE_LEFT | MOVE_RIGHT | MOVE_UP | MOVE_DOWN
 	};
diff --git a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
index b883080496..4359c9064f 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -91,9 +91,10 @@ void CruAvatarMoverProcess::run() {
 		_avatarAngle = -1;
 		// Check for a turn request while running or walking.  This only happens
 		// once per arrow keydown, so clear the flag.
-		if (avatar->isBusy() && _isAnimRunningWalking(avatar->getLastAnim())
+		if (_isAnimRunningWalking(avatar->getLastAnim())
 			&& hasMovementFlags(MOVE_FORWARD)
-			&& (hasMovementFlags(MOVE_TURN_LEFT) || hasMovementFlags(MOVE_TURN_RIGHT))) {
+			&& (hasMovementFlags(MOVE_TURN_LEFT) || hasMovementFlags(MOVE_TURN_RIGHT) ||
+				hasMovementFlags(MOVE_PENDING_TURN_LEFT) || hasMovementFlags(MOVE_PENDING_TURN_RIGHT))) {
 			Kernel *kernel = Kernel::get_instance();
 			// Stop the current animation and turn now.
 			kernel->killProcesses(avatar->getObjId(), ActorAnimProcess::ACTOR_ANIM_PROC_TYPE, true);
@@ -102,16 +103,29 @@ void CruAvatarMoverProcess::run() {
 			Animation::Sequence anim = hasMovementFlags(MOVE_RUN) ? Animation::run : Animation::walk;
 			DirectionMode dirmode = avatar->animDirMode(anim);
 			Direction dir = getTurnDirForTurnFlags(curdir, dirmode);
-			clearMovementFlag(MOVE_TURN_LEFT | MOVE_TURN_RIGHT);
+			clearMovementFlag(MOVE_TURN_LEFT | MOVE_TURN_RIGHT |
+							  MOVE_PENDING_TURN_LEFT | MOVE_PENDING_TURN_RIGHT);
 			step(anim, dir);
 			return;
 		}
 	}
 
+	// Pending turns shouldn't stick around.
+	clearMovementFlag(MOVE_PENDING_TURN_LEFT | MOVE_PENDING_TURN_RIGHT);
+
 	// Now do the regular process
 	AvatarMoverProcess::run();
 }
 
+void CruAvatarMoverProcess::clearMovementFlag(uint32 mask) {
+	// Set a pending turn if we haven't already cleared the turn
+	if ((mask & MOVE_TURN_LEFT) && hasMovementFlags(MOVE_TURN_LEFT))
+		setMovementFlag(MOVE_PENDING_TURN_LEFT);
+	else if ((mask & MOVE_TURN_RIGHT) && hasMovementFlags(MOVE_TURN_RIGHT))
+		setMovementFlag(MOVE_PENDING_TURN_RIGHT);
+
+	AvatarMoverProcess::clearMovementFlag(mask);
+}
 
 void CruAvatarMoverProcess::handleHangingMode() {
 	// No hanging in crusader, this shouldn't happen?
diff --git a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
index 1df6579db5..239d1776f4 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
@@ -50,6 +50,8 @@ public:
 		return static_cast<double>(_avatarAngle) / 100.0;
 	}
 
+	void clearMovementFlag(uint32 mask) override;
+
 private:
 	/** Try readying or firing weapon. */
 	void tryAttack();




More information about the Scummvm-git-logs mailing list