[Scummvm-git-logs] scummvm master -> ffee0ffdd99457f77317ac2606bf837bc2c16cd2

mduggan mgithub at guarana.org
Thu Jul 30 02:44:05 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:
15471f0dd7 ULTIMA8: Remove some last dir-as-int assumptions
c7a4fef8b4 ULTIMA8: Switch internal directions to 16 dirs
473d13d5b7 ULTIMA8: Fix combat turns by removing duplicate wrong code.
c479540be1 DEVTOOLS: ULTIMA8: Add overlay data for remorse weapons.
ffee0ffdd9 ULTIMA8: Fix surrendering and weapon overlays in Crusader


Commit: 15471f0dd7f4a705a005be78f155734a8fe69365
    https://github.com/scummvm/scummvm/commit/15471f0dd7f4a705a005be78f155734a8fe69365
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00

Commit Message:
ULTIMA8: Remove some last dir-as-int assumptions

Changed paths:
    engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
    engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
    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


diff --git a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
index 807118a5e3..00982d8716 100644
--- a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
+++ b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
@@ -49,7 +49,7 @@ const AnimWeaponOverlay *WpnOvlayDat::getAnimOverlay(uint32 action) const {
 }
 
 const WeaponOverlayFrame *WpnOvlayDat::getOverlayFrame(uint32 action, int type,
-        int direction,
+        Direction direction,
         int frame) const {
 	if (action >= _overlay.size())
 		return nullptr;
diff --git a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
index 44f39e0c6d..4fe16d4c79 100644
--- a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
+++ b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
@@ -23,6 +23,8 @@
 #ifndef ULTIMA8_GRAPHICS_WPNOVLAYDAT_H
 #define ULTIMA8_GRAPHICS_WPNOVLAYDAT_H
 
+#include "ultima/ultima8/misc/direction.h"
+
 namespace Ultima {
 namespace Ultima8 {
 
@@ -41,7 +43,7 @@ public:
 
 	const AnimWeaponOverlay *getAnimOverlay(uint32 action) const;
 	const WeaponOverlayFrame *getOverlayFrame(uint32 action, int type,
-	        int direction, int frame) const;
+	        Direction direction, int frame) const;
 
 private:
 	Std::vector<AnimWeaponOverlay *> _overlay;
diff --git a/engines/ultima/ultima8/kernel/mouse.cpp b/engines/ultima/ultima8/kernel/mouse.cpp
index 99a5aea95f..b9a7a8a569 100644
--- a/engines/ultima/ultima8/kernel/mouse.cpp
+++ b/engines/ultima/ultima8/kernel/mouse.cpp
@@ -183,8 +183,8 @@ Direction Mouse::getMouseDirectionWorld(int mx, int my) {
 	return Direction_Get(dy * 2, dx, dirmode_8dirs);
 }
 
-int Mouse::getMouseDirectionScreen(int mx, int my) {
-	return ((getMouseDirectionWorld(mx, my)) + 1) % 8;
+Direction Mouse::getMouseDirectionScreen(int mx, int my) {
+	return Direction_OneRight(getMouseDirectionWorld(mx, my), dirmode_8dirs);
 }
 
 int Mouse::getMouseFrame() {
@@ -222,7 +222,8 @@ int Mouse::getMouseFrame() {
 		}
 
 		// Calculate frame based on direction
-		int frame = getMouseDirectionScreen(_mousePos.x, _mousePos.y);
+		Direction mousedir = getMouseDirectionScreen(_mousePos.x, _mousePos.y);
+		int frame = mouseFrameForDir(mousedir);
 
 		/** length --- frame offset
 		 *    0              0
@@ -257,6 +258,20 @@ int Mouse::getMouseFrame() {
 	}
 }
 
+int Mouse::mouseFrameForDir(Direction mousedir) const {
+	switch (mousedir) {
+		case dir_north:		return 0;
+		case dir_northeast: return 1;
+		case dir_east:		return 2;
+		case dir_southeast: return 3;
+		case dir_south:		return 4;
+		case dir_southwest: return 5;
+		case dir_west:		return 6;
+		case dir_northwest: return 7;
+		default:			return 0;
+	}
+}
+
 void Mouse::setMouseCoords(int mx, int my) {
 	Rect dims;
 	RenderSurface *screen = Ultima8Engine::get_instance()->getRenderScreen();
diff --git a/engines/ultima/ultima8/kernel/mouse.h b/engines/ultima/ultima8/kernel/mouse.h
index 953f1c7ee0..d86946e731 100644
--- a/engines/ultima/ultima8/kernel/mouse.h
+++ b/engines/ultima/ultima8/kernel/mouse.h
@@ -126,6 +126,8 @@ private:
 	void startDragging(int mx, int my);
 	void moveDragging(int mx, int my);
 	void stopDragging(int mx, int my);
+	int mouseFrameForDir(Direction mousedir) const;
+
 public:
 	static Mouse *get_instance() { return _instance; }
 public:
@@ -151,7 +153,7 @@ public:
 	int getMouseLength(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);
+	Direction getMouseDirectionScreen(int mx, int my);
 
 	//! get mouse cursor direction in the world. 0 = up, 1 = up-right, 2 = right, etc...
 	Direction getMouseDirectionWorld(int mx, int my);
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index acfa18ab6c..e4c1ce8903 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -886,7 +886,7 @@ void Actor::receiveHitU8(uint16 other, Direction dir, int damage, uint16 damage_
 	if (damage >= 4 && _objId == 1 && attacker) {
 		// play blood sprite
 		int start = 0, end = 12;
-		if (dir > 2) {
+		if (dir > dir_east) {
 			start = 13;
 			end = 25;
 		}
@@ -1484,7 +1484,7 @@ uint32 Actor::I_getDir(const uint8 *args, unsigned int /*argsize*/) {
 	ARG_ACTOR_FROM_PTR(actor);
 	if (!actor) return 0;
 
-	return actor->getDir();
+	return Direction_ToUsecodeDir(actor->getDir());
 }
 
 uint32 Actor::I_getLastAnimSet(const uint8 *args, unsigned int /*argsize*/) {
diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
index c0fa2c4dc2..0d619546ae 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
@@ -89,11 +89,6 @@ bool ActorAnimProcess::init() {
 	if (_dir == dir_current)
 		_dir = actor->getDir();
 
-	if ((GAME_IS_U8 && _dir > 7) || (GAME_IS_CRUSADER && _dir > 15)) {
-		// invalid direction
-		return false;
-	}
-
 	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.)


Commit: c7a4fef8b4ba4ef5cee9cf392303613bc0ac974c
    https://github.com/scummvm/scummvm/commit/c7a4fef8b4ba4ef5cee9cf392303613bc0ac974c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00

Commit Message:
ULTIMA8: Switch internal directions to 16 dirs

Changed paths:
    engines/ultima/ultima8/kernel/kernel.cpp
    engines/ultima/ultima8/misc/direction.h
    engines/ultima/ultima8/misc/direction_util.h
    engines/ultima/ultima8/world/actors/actor.cpp
    engines/ultima/ultima8/world/actors/anim_action.cpp
    engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
    engines/ultima/ultima8/world/actors/combat_process.cpp
    engines/ultima/ultima8/world/actors/weapon_overlay.h
    engines/ultima/ultima8/world/crosshair_process.cpp


diff --git a/engines/ultima/ultima8/kernel/kernel.cpp b/engines/ultima/ultima8/kernel/kernel.cpp
index 75f5c25f21..ef95bb10e0 100644
--- a/engines/ultima/ultima8/kernel/kernel.cpp
+++ b/engines/ultima/ultima8/kernel/kernel.cpp
@@ -93,7 +93,7 @@ ProcId Kernel::addProcess(Process *proc) {
 
 #if 0
 	perr << "[Kernel] Adding process " << proc
-	     << ", pid = " << proc->_pid << Std::endl;
+	<< ", pid = " << proc->_pid << " type " << proc->GetClassType()._className << Std::endl;
 #endif
 
 //	processes.push_back(proc);
diff --git a/engines/ultima/ultima8/misc/direction.h b/engines/ultima/ultima8/misc/direction.h
index 4c60e121fa..9679f3e3f8 100644
--- a/engines/ultima/ultima8/misc/direction.h
+++ b/engines/ultima/ultima8/misc/direction.h
@@ -31,22 +31,22 @@ namespace Ultima8 {
  */
 enum Direction {
 	dir_north = 0,
-	dir_northeast = 1,
-	dir_east = 2,
-	dir_southeast = 3,
-	dir_south = 4,
-	dir_southwest = 5,
-	dir_west = 6,
-	dir_northwest = 7,
-	dir_current = 16,
-	dir_nne,
-	dir_ene,
-	dir_ese,
-	dir_sse,
-	dir_ssw,
-	dir_wsw,
-	dir_wnw,
-	dir_nnw
+	dir_nne = 1,
+	dir_northeast = 2,
+	dir_ene = 3,
+	dir_east = 4,
+	dir_ese = 5,
+	dir_southeast = 6,
+	dir_sse = 7,
+	dir_south = 8,
+	dir_ssw = 9,
+	dir_southwest = 10,
+	dir_wsw = 11,
+	dir_west = 12,
+	dir_wnw = 13,
+	dir_northwest = 14,
+	dir_nnw = 15,
+	dir_current = 16
 };
 
 enum DirectionMode {
diff --git a/engines/ultima/ultima8/misc/direction_util.h b/engines/ultima/ultima8/misc/direction_util.h
index 972fb4e8b4..dd229d12d0 100644
--- a/engines/ultima/ultima8/misc/direction_util.h
+++ b/engines/ultima/ultima8/misc/direction_util.h
@@ -37,13 +37,13 @@ namespace Ultima8 {
 inline int Direction_XFactor(Direction dir) {
 	static const int _x_fact[] = {  0, +1, +1, +1,  0, -1, -1, -1 };
 	//static const int _x_fact16[] = {  0, +1, +2, +2, +2, +2, +2, +1, 0, -1, -2, -2, -2, -2, -2, -1 };
-	return _x_fact[dir];
+	return _x_fact[(int)dir / 2];
 }
 
 inline int Direction_YFactor(Direction dir) {
 	static const int _y_fact[] = { -1, -1,  0, +1, +1, +1,  0, -1 };
 	//static const int _y_fact16[] = { -2, -2, -2, -1,  0, +1, +2, +2, +2, +2, +2, +1, 0, -1, -2, -2 };
-	return _y_fact[dir];
+	return _y_fact[(int)dir / 2];
 }
 
 /**
@@ -153,14 +153,18 @@ inline Direction Direction_Invert(Direction dir) {
 
 //! Return the direction one left (aka counter-clockwise) of the input
 inline Direction Direction_OneLeft(Direction dir, DirectionMode mode) {
-	// TODO: support 16 dirs here.
-	return static_cast<Direction>((static_cast<int>(dir) + 7) % 8);
+	if (mode == dirmode_8dirs)
+		return static_cast<Direction>((static_cast<int>(dir) + 14) % 16);
+	else
+		return static_cast<Direction>((static_cast<int>(dir) + 15) % 16);
 }
 
 //! Return the direction one right (aka clockwise) of the input
 inline Direction Direction_OneRight(Direction dir, DirectionMode mode) {
-	// TODO: support 16 dirs here.
-	return static_cast<Direction>((static_cast<int>(dir) + 1) % 8);
+	if (mode == dirmode_8dirs)
+		return static_cast<Direction>((static_cast<int>(dir) + 2) % 16);
+	else
+		return static_cast<Direction>((static_cast<int>(dir) + 1) % 16);
 }
 
 inline Direction Direction_TurnByDelta(Direction dir, int delta, DirectionMode mode) {
@@ -171,27 +175,24 @@ inline Direction Direction_TurnByDelta(Direction dir, int delta, DirectionMode m
 //! Get a turn delta (-1 for left, +1 for right) to turn the fastest
 //! way from one direction to another
 inline int Direction_GetShorterTurnDelta(Direction from, Direction to) {
-	// TODO: Support 16 dirs here.
-	if ((from - to + 8) % 8 < 4)
+	if ((from - to + 16) % 16 < 8)
 		return -1;
 	return 1;
 }
 
 inline uint32 Direction_ToUsecodeDir(Direction dir) {
-	// TODO: Will need changing when we support 16 dirs
 	if (GAME_IS_U8) {
-		return static_cast<int32>(dir);
+		return static_cast<int32>(dir / 2);
 	} else {
-		return static_cast<int32>(dir) * 2;
+		return static_cast<int32>(dir);
 	}
 }
 
 inline Direction Direction_FromUsecodeDir(uint32 dir) {
-	// TODO: Will need changing when we support 16 dirs
 	if (GAME_IS_U8) {
-		return static_cast<Direction>(dir);
+		return static_cast<Direction>(dir * 2);
 	} else {
-		return static_cast<Direction>(dir / 2);
+		return static_cast<Direction>(dir);
 	}
 }
 
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index e4c1ce8903..d30b86db6f 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -555,9 +555,10 @@ DirectionMode Actor::animDirMode(Animation::Sequence anim) const {
 }
 
 uint16 Actor::turnTowardDir(Direction targetdir) {
-	Direction curdir = _direction;
-	if (targetdir == curdir)
-		return 0;
+	bool combatRun = hasActorFlags(Actor::ACT_COMBATRUN);
+	Direction curdir = getDir();
+	bool combat = isInCombat() && !combatRun;
+	Animation::Sequence standanim = Animation::stand;
 
 	int stepDelta = Direction_GetShorterTurnDelta(curdir, targetdir);
 	Animation::Sequence turnanim;
@@ -567,14 +568,26 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
 		turnanim = Animation::lookRight;
 	}
 
-	ProcId prevpid = 0;
+	if (combat) {
+		turnanim = Animation::combatStand;
+		standanim = Animation::combatStand;
+	}
 
-	DirectionMode dirmode = animDirMode(turnanim);
+	ProcId prevpid = 0;
 
 	// Create a sequence of turn animations from
 	// our current direction to the new one
-	for (Direction dir = curdir; dir != targetdir; dir = Direction_TurnByDelta(dir, stepDelta, dirmode)) {
+	DirectionMode mode = animDirMode(turnanim);
+
+	// slight hack - avoid making 8-step turns if our target is a 16-step direction
+	// - we'll never get to the right direction that way.
+	if (static_cast<uint32>(targetdir) % 2) {
+		mode = dirmode_16dirs;
+	}
+
+	for (Direction dir = curdir; dir != targetdir; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
 		ProcId animpid = doAnim(turnanim, dir);
+
 		if (prevpid) {
 			Process *proc = Kernel::get_instance()->getProcess(animpid);
 			assert(proc);
@@ -584,7 +597,14 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
 		prevpid = animpid;
 	}
 
-	return prevpid;
+	ProcId animpid = doAnim(standanim, targetdir);
+	if (prevpid) {
+		Process *proc = Kernel::get_instance()->getProcess(animpid);
+		assert(proc);
+		proc->waitFor(prevpid);
+	}
+
+	return animpid;
 }
 
 uint16 Actor::setActivity(int activity) {
diff --git a/engines/ultima/ultima8/world/actors/anim_action.cpp b/engines/ultima/ultima8/world/actors/anim_action.cpp
index bd99b7874e..5194402d2b 100644
--- a/engines/ultima/ultima8/world/actors/anim_action.cpp
+++ b/engines/ultima/ultima8/world/actors/anim_action.cpp
@@ -68,13 +68,13 @@ void AnimAction::getAnimRange(const Actor *actor, Direction dir,
 }
 
 const AnimFrame &AnimAction::getFrame(Direction dir, unsigned int frameno) const {
-	assert((unsigned int)dir < _dirCount);
-	assert(frameno < _frames[dir].size());
-
 	uint32 diroff = static_cast<uint32>(dir);
 	// HACK for 16 dir support
-	if (_dirCount == 16)
-		diroff *= 2;
+	if (_dirCount == 8)
+		diroff /= 2;
+
+	assert(diroff < _dirCount);
+	assert(frameno < _frames[diroff].size());
 
 	return _frames[diroff][frameno];
 }
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index 9f23c18df1..a46825eac1 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -852,51 +852,9 @@ void AvatarMoverProcess::jump(Animation::Sequence action, Direction direction) {
 
 void AvatarMoverProcess::turnToDirection(Direction direction) {
 	MainActor *avatar = getMainActor();
-	bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
-	Direction curdir = avatar->getDir();
-	bool combat = avatar->isInCombat() && !combatRun;
-	Animation::Sequence standanim = Animation::stand;
-
-	int stepDelta = Direction_GetShorterTurnDelta(curdir, direction);
-	Animation::Sequence turnanim;
-	if (stepDelta == -1) {
-		turnanim = Animation::lookLeft;
-	} else {
-		turnanim = Animation::lookRight;
-	}
-
-	if (combat) {
-		turnanim = Animation::combatStand;
-		standanim = Animation::combatStand;
-	}
-
-	ProcId prevpid = 0;
-
-	// Create a sequence of turn animations from
-	// our current direction to the new one
-	DirectionMode dirmode = avatar->animDirMode(turnanim);
-
-	for (Direction dir = curdir; dir != direction; dir = Direction_TurnByDelta(dir, stepDelta, dirmode)) {
-		ProcId animpid = avatar->doAnim(turnanim, dir);
-
-		if (prevpid) {
-			Process *proc = Kernel::get_instance()->getProcess(animpid);
-			assert(proc);
-			proc->waitFor(prevpid);
-		}
-
-		prevpid = animpid;
-	}
-
-	ProcId animpid = avatar->doAnim(standanim, direction);
-
-	if (prevpid) {
-		Process *proc = Kernel::get_instance()->getProcess(animpid);
-		assert(proc);
-		proc->waitFor(prevpid);
-	}
-
-	waitFor(animpid);
+	uint16 turnpid = avatar->turnTowardDir(direction);
+	if (turnpid)
+		waitFor(turnpid);
 }
 
 bool AvatarMoverProcess::checkTurn(Direction direction, bool moving) {
@@ -907,13 +865,13 @@ bool AvatarMoverProcess::checkTurn(Direction direction, bool moving) {
 	// 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)) {
+	            combat && ABS(direction - curdir) == 8)) {
 		Animation::Sequence lastanim = avatar->getLastAnim();
 
 		if (moving &&
 		        (lastanim == Animation::walk || lastanim == Animation::run ||
 		         lastanim == Animation::combatStand) &&
-		        (ABS(direction - curdir) + 1 % 8 <= 2)) {
+		        (ABS(direction - curdir) + 2 % 16 <= 4)) {
 			// don't need to explicitly do a turn animation
 			return false;
 		}
diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index accebf3a84..fed0fad6d2 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -257,8 +257,13 @@ void CombatProcess::turnToDirection(Direction direction) {
 	bool done = false;
 
 	DirectionMode mode = a->animDirMode(turnanim);
+	// slight hack - avoid making 8-step turns if our target is a 16-step direction
+	// - we'll never get to the right direction that way.
+	if (static_cast<uint32>(direction) % 2) {
+		mode = dirmode_16dirs;
+	}
 
-	for (Direction dir = curdir; !done;	dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
+	for (Direction dir = curdir; dir != direction; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
 		ProcId animpid = a->doAnim(turnanim, dir);
 
 		if (dir == direction) done = true;
diff --git a/engines/ultima/ultima8/world/actors/weapon_overlay.h b/engines/ultima/ultima8/world/actors/weapon_overlay.h
index 411da2947d..48732e2acf 100644
--- a/engines/ultima/ultima8/world/actors/weapon_overlay.h
+++ b/engines/ultima/ultima8/world/actors/weapon_overlay.h
@@ -52,15 +52,22 @@ struct AnimWeaponOverlay {
 	//! \param frame the animation frame
 	//! \return nullptr if invalid, or pointer to a frame; don't delete it.
 	const WeaponOverlayFrame *getFrame(unsigned int type,
-	                                   unsigned int direction,
+	                                   Direction direction,
 	                                   unsigned int frame) const {
 		if (type >= _overlay.size())
 			return nullptr;
-		if (direction >= _overlay[type]._dirCount)
+
+		uint32 diroff;
+		if (_overlay[type]._dirCount == 8)
+			diroff = static_cast<uint32>(direction) / 2;
+		else
+			diroff = static_cast<uint32>(direction);
+
+		if (diroff >= _overlay[type]._dirCount)
 			return nullptr;
-		if (frame >= _overlay[type]._frames[direction].size())
+		if (frame >= _overlay[type]._frames[diroff].size())
 			return nullptr;
-		return &(_overlay[type]._frames[direction][frame]);
+		return &(_overlay[type]._frames[diroff][frame]);
 	}
 
 	Std::vector<WeaponOverlay> _overlay;
diff --git a/engines/ultima/ultima8/world/crosshair_process.cpp b/engines/ultima/ultima8/world/crosshair_process.cpp
index 3c25519cc7..f395085f0d 100644
--- a/engines/ultima/ultima8/world/crosshair_process.cpp
+++ b/engines/ultima/ultima8/world/crosshair_process.cpp
@@ -58,9 +58,9 @@ void CrosshairProcess::run() {
 		// for now just put it at 3/4 avatar height which is about right.
 		cz += az / 4;
 		// TODO: Get the fine angle of the avatar once that is implemented.
-		uint16 dir = (mainactor->getDir() + 2) % 8;
+		uint16 dir = (mainactor->getDir() + 4) % 16;
 		// Dir is 0~7, convert to 0~15/8*pi
-		float angle = (3.14 * dir / 4.0);
+		float angle = (3.14 * dir / 8.0);
 		float xoff = CROSSHAIR_DIST * cos(angle);
 		float yoff = CROSSHAIR_DIST * sin(angle);
 		cx -= static_cast<int32>(xoff);


Commit: 473d13d5b7ee396c6fb53d59a2d93b57915aae2e
    https://github.com/scummvm/scummvm/commit/473d13d5b7ee396c6fb53d59a2d93b57915aae2e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00

Commit Message:
ULTIMA8: Fix combat turns by removing duplicate wrong code.

Changed paths:
    engines/ultima/ultima8/world/actors/combat_process.cpp


diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index fed0fad6d2..ebdc499091 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -249,35 +249,10 @@ void CombatProcess::turnToDirection(Direction direction) {
 	Actor *a = getActor(_itemNum);
 	if (!a)
 		return;
-	Direction curdir = a->getDir();
-	int stepDelta = Direction_GetShorterTurnDelta(curdir, direction);
-	Animation::Sequence turnanim = Animation::combatStand;
-
-	ProcId prevpid = 0;
-	bool done = false;
-
-	DirectionMode mode = a->animDirMode(turnanim);
-	// slight hack - avoid making 8-step turns if our target is a 16-step direction
-	// - we'll never get to the right direction that way.
-	if (static_cast<uint32>(direction) % 2) {
-		mode = dirmode_16dirs;
-	}
-
-	for (Direction dir = curdir; dir != direction; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
-		ProcId animpid = a->doAnim(turnanim, dir);
-
-		if (dir == direction) done = true;
-
-		if (prevpid) {
-			Process *proc = Kernel::get_instance()->getProcess(animpid);
-			assert(proc);
-			proc->waitFor(prevpid);
-		}
-
-		prevpid = animpid;
-	}
-
-	if (prevpid) waitFor(prevpid);
+	assert(a->isInCombat());
+	uint16 waitpid = a->turnTowardDir(direction);
+	if (waitpid)
+		waitFor(waitpid);
 }
 
 bool CombatProcess::inAttackRange() const {


Commit: c479540be1e98da9a1d618a7f6e50be72249e733
    https://github.com/scummvm/scummvm/commit/c479540be1e98da9a1d618a7f6e50be72249e733
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00

Commit Message:
DEVTOOLS: ULTIMA8: Add overlay data for remorse weapons.

Changed paths:
    devtools/create_ultima/files/ultima8/remorse.ini
    devtools/create_ultima/files/ultima8/remorseweapons.ini


diff --git a/devtools/create_ultima/files/ultima8/remorse.ini b/devtools/create_ultima/files/ultima8/remorse.ini
index b2c1d09718..ab42bb783c 100644
--- a/devtools/create_ultima/files/ultima8/remorse.ini
+++ b/devtools/create_ultima/files/ultima8/remorse.ini
@@ -1,4 +1,4 @@
 [fontleads]
 6=0,3
 12=0,1
-13=-1,1
+13=-1,-1
diff --git a/devtools/create_ultima/files/ultima8/remorseweapons.ini b/devtools/create_ultima/files/ultima8/remorseweapons.ini
index 504ed1b04c..7db78ebf99 100644
--- a/devtools/create_ultima/files/ultima8/remorseweapons.ini
+++ b/devtools/create_ultima/files/ultima8/remorseweapons.ini
@@ -6,6 +6,8 @@ ammo_type=0
 damage_type=0x0B
 display_shape=3
 display_frame=2
+overlay_shape=0x01A1
+overlay=0
 
 [BA-41]
 shape=0x032F
@@ -14,6 +16,8 @@ ammo_type=1
 damage_type=0x0B
 display_shape=3
 display_frame=1
+overlay_shape=0x01A1
+overlay=0
 
 [PA-21]
 shape=0x0330
@@ -22,6 +26,8 @@ ammo_type=0
 damage_type=0x05
 display_shape=3
 display_frame=7
+overlay_shape=0x036D
+overlay=0
 
 [EM-4]
 shape=0x038C
@@ -30,6 +36,8 @@ ammo_type=0
 damage_type=0x0F
 display_shape=3
 display_frame=3
+overlay_shape=0x036F
+overlay=0
 
 [SG-A1]
 shape=0x0332
@@ -38,6 +46,8 @@ ammo_type=2
 damage_type=0x02
 display_shape=3
 display_frame=0
+overlay_shape=0x033B
+overlay=0
 
 [RP-22]
 shape=0x0333
@@ -46,6 +56,8 @@ ammo_type=3
 damage_type=0x01
 display_shape=3
 display_frame=6
+overlay_shape=0x036F
+overlay=0
 
 [RP-32]
 shape=0x0334
@@ -54,6 +66,8 @@ ammo_type=3
 damage_type=0x01
 display_shape=3
 display_frame=5
+overlay_shape=0x036F
+overlay=0
 
 [AR-7]
 shape=0x038E
@@ -62,6 +76,8 @@ ammo_type=4
 damage_type=0x0A
 display_shape=3
 display_frame=0xC
+overlay_shape=0x036E
+overlay=0
 
 [GL-303]
 shape=0x0388
@@ -70,6 +86,8 @@ ammo_type=5
 damage_type=0x03
 display_shape=3
 display_frame=8
+overlay_shape=0x036E
+overlay=0
 
 [PA-31]
 shape=0x038A
@@ -78,6 +96,8 @@ ammo_type=0
 damage_type=0x05
 display_shape=3
 display_frame=9
+overlay_shape=0x036F
+overlay=0
 
 [PL-1]
 shape=0x038D
@@ -86,6 +106,8 @@ ammo_type=0
 damage_type=0x06
 display_shape=3
 display_frame=0xA
+overlay_shape=0x036E
+overlay=0
 
 [AC-88]
 shape=0x038B
@@ -94,6 +116,8 @@ ammo_type=2
 damage_type=0x0D
 display_shape=3
 display_frame=4
+overlay_shape=0x036E
+overlay=0
 
 [UV-9]
 shape=0x0386
@@ -102,6 +126,8 @@ ammo_type=0
 damage_type=0x0E
 display_shape=3
 display_frame=0xB
+overlay_shape=0x036E
+overlay=0
 
 # Ammo
 [BA-41 CLIP]


Commit: ffee0ffdd99457f77317ac2606bf837bc2c16cd2
    https://github.com/scummvm/scummvm/commit/ffee0ffdd99457f77317ac2606bf837bc2c16cd2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:43:31+09:00

Commit Message:
ULTIMA8: Fix surrendering and weapon overlays in Crusader

Changed paths:
    engines/ultima/ultima8/graphics/anim_dat.cpp
    engines/ultima/ultima8/graphics/anim_dat.h
    engines/ultima/ultima8/world/actors/actor.cpp
    engines/ultima/ultima8/world/actors/actor.h
    engines/ultima/ultima8/world/actors/animation.h
    engines/ultima/ultima8/world/actors/animation_tracker.cpp
    engines/ultima/ultima8/world/actors/main_actor.cpp
    engines/ultima/ultima8/world/actors/surrender_process.cpp


diff --git a/engines/ultima/ultima8/graphics/anim_dat.cpp b/engines/ultima/ultima8/graphics/anim_dat.cpp
index a0f63af529..9890083fa2 100644
--- a/engines/ultima/ultima8/graphics/anim_dat.cpp
+++ b/engines/ultima/ultima8/graphics/anim_dat.cpp
@@ -58,7 +58,7 @@ const AnimAction *AnimDat::getAnim(uint32 shape, uint32 action) const {
 	return _anims[shape]->getAction(action);
 }
 
-uint32 AnimDat::getActionNumberForSequence(Animation::Sequence action) {
+uint32 AnimDat::getActionNumberForSequence(Animation::Sequence action, const Actor *actor) {
 	if (GAME_IS_U8) {
 		return static_cast<uint32>(action);
 	} else {
@@ -101,9 +101,9 @@ uint32 AnimDat::getActionNumberForSequence(Animation::Sequence action) {
 			return 46; // 47 is knee with a larger weapon
 		// 48 is nothing for avatar
 		case Animation::lookLeft:
-			return 0x3c;
+			return 0;
 		case Animation::lookRight:
-			return 0x3c;
+			return 0;
 		default:
 			return static_cast<uint32>(action);;
 		}
diff --git a/engines/ultima/ultima8/graphics/anim_dat.h b/engines/ultima/ultima8/graphics/anim_dat.h
index 3de05f95bd..460fdf7b26 100644
--- a/engines/ultima/ultima8/graphics/anim_dat.h
+++ b/engines/ultima/ultima8/graphics/anim_dat.h
@@ -31,6 +31,7 @@ namespace Ultima8 {
 
 struct AnimAction;
 class ActorAnim;
+class Actor;
 
 class AnimDat {
 public:
@@ -42,8 +43,8 @@ public:
 	const ActorAnim *getAnim(uint32 shape) const;
 	const AnimAction *getAnim(uint32 shape, uint32 action) const;
 
-	//! Return the action number for a given animation sequence
-	static uint32 getActionNumberForSequence(Animation::Sequence action);
+	//! Return the action number for a given animation sequence on the given actor
+	static uint32 getActionNumberForSequence(Animation::Sequence action, const Actor *actor);
 private:
 	Std::vector<ActorAnim *> _anims;
 };
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index d30b86db6f..277627f0b6 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -559,6 +559,7 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
 	Direction curdir = getDir();
 	bool combat = isInCombat() && !combatRun;
 	Animation::Sequence standanim = Animation::stand;
+	bool surrendered = hasActorFlags(Actor::ACT_SURRENDERED);
 
 	int stepDelta = Direction_GetShorterTurnDelta(curdir, targetdir);
 	Animation::Sequence turnanim;
@@ -571,6 +572,9 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
 	if (combat) {
 		turnanim = Animation::combatStand;
 		standanim = Animation::combatStand;
+	} else if (surrendered) {
+		turnanim = Animation::surrenderStand;
+		standanim = Animation::surrenderStand;
 	}
 
 	ProcId prevpid = 0;
@@ -579,13 +583,16 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
 	// our current direction to the new one
 	DirectionMode mode = animDirMode(turnanim);
 
-	// slight hack - avoid making 8-step turns if our target is a 16-step direction
-	// - we'll never get to the right direction that way.
-	if (static_cast<uint32>(targetdir) % 2) {
+	// slight hack - avoid making 8-step turns if we need to swap
+	// to/from a 16-step direction - we'll never get to the right
+	// direction that way.
+	if (static_cast<uint32>(targetdir) % 2 !=
+		static_cast<uint32>(curdir) % 2) {
 		mode = dirmode_16dirs;
 	}
 
-	for (Direction dir = curdir; dir != targetdir; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
+	bool done = false;
+	for (Direction dir = curdir; !done; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
 		ProcId animpid = doAnim(turnanim, dir);
 
 		if (prevpid) {
@@ -594,14 +601,18 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
 			proc->waitFor(prevpid);
 		}
 
+		done = (dir == targetdir);
 		prevpid = animpid;
 	}
 
-	ProcId animpid = doAnim(standanim, targetdir);
-	if (prevpid) {
-		Process *proc = Kernel::get_instance()->getProcess(animpid);
-		assert(proc);
-		proc->waitFor(prevpid);
+	ProcId animpid = prevpid;
+	if (turnanim != standanim) {
+		animpid = doAnim(standanim, targetdir);
+		if (prevpid) {
+			Process *proc = Kernel::get_instance()->getProcess(animpid);
+			assert(proc);
+			proc->waitFor(prevpid);
+		}
 	}
 
 	return animpid;
diff --git a/engines/ultima/ultima8/world/actors/actor.h b/engines/ultima/ultima8/world/actors/actor.h
index 3abaa4e9cc..57a13af098 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -343,6 +343,7 @@ public:
 		ACT_FIRSTSTEP      = 0x000400, // flags from npcdata byte 0x2F
 		ACT_INCOMBAT       = 0x000800,
 		ACT_DEAD           = 0x001000,
+		ACT_SURRENDERED    = 0x002000, // not the same bit as used in Crusader, but we use this because it's empty.
 		ACT_COMBATRUN      = 0x008000,
 
 		ACT_AIRWALK        = 0x010000, // flags from npcdata byte 0x30
diff --git a/engines/ultima/ultima8/world/actors/animation.h b/engines/ultima/ultima8/world/actors/animation.h
index 3e6f7169cd..d5795e5aa5 100644
--- a/engines/ultima/ultima8/world/actors/animation.h
+++ b/engines/ultima/ultima8/world/actors/animation.h
@@ -111,7 +111,8 @@ enum Sequence {
 	kneelAndFire2 = 42,
 	kneelAndFire3 = 43,
 	runWithLargeWeapon = 50,
-	surrender = 57
+	surrender = 57,
+	surrenderStand = 60
 };
 
 enum Result {
diff --git a/engines/ultima/ultima8/world/actors/animation_tracker.cpp b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
index 286459df72..d1165e565d 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(const Actor *actor, Animation::Sequence action,
 	assert(actor);
 	_actor = actor->getObjId();
 	uint32 shape = actor->getShape();
-	uint32 actionnum = AnimDat::getActionNumberForSequence(action);
+	uint32 actionnum = AnimDat::getActionNumberForSequence(action, actor);
 	_animAction = GameData::get_instance()->getMainShapes()->
 	             getAnim(shape, actionnum);
 	if (!_animAction)
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index 609ccbd1e4..c7802041a8 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -36,6 +36,7 @@
 #include "ultima/ultima8/conf/setting_manager.h"
 #include "ultima/ultima8/kernel/core_app.h"
 #include "ultima/ultima8/games/game_data.h"
+#include "ultima/ultima8/graphics/anim_dat.h"
 #include "ultima/ultima8/graphics/wpn_ovlay_dat.h"
 #include "ultima/ultima8/graphics/shape_info.h"
 #include "ultima/ultima8/gumps/cru_pickup_area_gump.h"
@@ -572,6 +573,8 @@ void MainActor::getWeaponOverlay(const WeaponOverlayFrame *&frame_, uint32 &shap
 
 	if (!isInCombat() && _lastAnim != Animation::unreadyWeapon) return;
 
+	uint32 action = AnimDat::getActionNumberForSequence(_lastAnim, this);
+
 	ObjId weaponid;
 	if (GAME_IS_U8)
 		weaponid = getEquip(ShapeInfo::SE_WEAPON);
@@ -590,7 +593,7 @@ void MainActor::getWeaponOverlay(const WeaponOverlayFrame *&frame_, uint32 &shap
 	shape_ = weaponinfo->_overlayShape;
 
 	WpnOvlayDat *wpnovlay = GameData::get_instance()->getWeaponOverlay();
-	frame_ = wpnovlay->getOverlayFrame(_lastAnim, weaponinfo->_overlayType,
+	frame_ = wpnovlay->getOverlayFrame(action, weaponinfo->_overlayType,
 	                                  _direction, _animFrame);
 
 	if (frame_ == 0) shape_ = 0;
diff --git a/engines/ultima/ultima8/world/actors/surrender_process.cpp b/engines/ultima/ultima8/world/actors/surrender_process.cpp
index 0a69bce050..c4a9d0c68e 100644
--- a/engines/ultima/ultima8/world/actors/surrender_process.cpp
+++ b/engines/ultima/ultima8/world/actors/surrender_process.cpp
@@ -78,25 +78,21 @@ void SurrenderProcess::run() {
 		return;
 	}
 
+	a->setActorFlag(Actor::ACT_SURRENDERED);
+
 	Direction curdir = a->getDir();
 	Direction direction = a->getDirToItemCentre(*main);
 
 	if (curdir != direction) {
-		Animation::Sequence turnanim;
-		Direction nextdir;
-		if (Direction_GetShorterTurnDelta(curdir, direction) == -1) {
-			nextdir = Direction_OneLeft(curdir, dirmode_8dirs);
-			turnanim = Animation::lookLeft;
-		} else {
-			nextdir = Direction_OneRight(curdir, dirmode_8dirs);
-			turnanim = Animation::lookRight;
+		uint16 animpid = a->turnTowardDir(direction);
+		if (animpid) {
+			waitFor(animpid);
+			return;
 		}
-		ProcId animpid = a->doAnim(turnanim, nextdir);
-		waitFor(animpid);
-		return;
 	}
 
 	if (_playedSound || a->getRangeIfVisible(*main) == 0)
+		// Nothing to do.
 		return;
 
 	int16 soundno = -1;




More information about the Scummvm-git-logs mailing list