[Scummvm-git-logs] scummvm master -> 3efe479c17dbff2bd441a3fcfd9b2679beeb79ce

OMGPizzaGuy noreply at scummvm.org
Fri May 17 02:57:43 UTC 2024


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:
3efe479c17 ULTIMA8: Add owner to missle tracker.


Commit: 3efe479c17dbff2bd441a3fcfd9b2679beeb79ce
    https://github.com/scummvm/scummvm/commit/3efe479c17dbff2bd441a3fcfd9b2679beeb79ce
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2024-05-16T21:57:22-05:00

Commit Message:
ULTIMA8: Add owner to missle tracker.
The owner is ignored in the tracker's sweep test, which allows the player to throw an item behind them. The item still could be caught on the player as hurl does not take the owner, but testing could not easily reproduce that blocking. Fixes #14850

Changed paths:
    engines/ultima/ultima8/gumps/game_map_gump.cpp
    engines/ultima/ultima8/world/item.cpp
    engines/ultima/ultima8/world/missile_tracker.cpp
    engines/ultima/ultima8/world/missile_tracker.h


diff --git a/engines/ultima/ultima8/gumps/game_map_gump.cpp b/engines/ultima/ultima8/gumps/game_map_gump.cpp
index eb54a023e42..97c48e6cb82 100644
--- a/engines/ultima/ultima8/gumps/game_map_gump.cpp
+++ b/engines/ultima/ultima8/gumps/game_map_gump.cpp
@@ -24,6 +24,7 @@
 #include "ultima/ultima8/gumps/gump_notify_process.h"
 #include "ultima/ultima8/gumps/slider_gump.h"
 #include "ultima/ultima8/kernel/kernel.h"
+#include "ultima/ultima8/misc/direction_util.h"
 #include "ultima/ultima8/world/world.h"
 #include "ultima/ultima8/world/current_map.h"
 #include "ultima/ultima8/world/actors/main_actor.h"
@@ -434,7 +435,7 @@ bool GameMapGump::DraggingItem(Item *item, int mx, int my) {
 			if (speed < 1) speed = 1;
 			int32 ax, ay, az;
 			avatar->getLocation(ax, ay, az);
-			MissileTracker t(item, ax, ay, az,
+			MissileTracker t(item, 1, ax, ay, az,
 			                 _draggingPos[0], _draggingPos[1], _draggingPos[2],
 			                 speed, 4);
 			if (t.isPathClear())
@@ -566,17 +567,14 @@ void GameMapGump::DropItem(Item *item, int mx, int my) {
 		Common::RandomSource &rs = Ultima8Engine::get_instance()->getRandomSource();
 		tx += rs.getRandomNumberRngSigned(-inaccuracy, inaccuracy);
 		ty += rs.getRandomNumberRngSigned(-inaccuracy, inaccuracy);
-		MissileTracker t(item, tx, ty, _draggingPos[2],
+		MissileTracker t(item, 1, tx, ty, _draggingPos[2],
 		                 speed, 4);
 		t.launchItem();
 
-		// FIXME: When doing this animation, sometimes items will
-		//        get stuck on the avatar. Why?
-#if 0
-		avatar->doAnim(Animation::stand,
-		               Get_WorldDirection(_draggingPos[1] - ay,
-		                                  _draggingPos[0] - ax));
-#endif
+		Direction dir = Direction_GetWorldDir(_draggingPos[1] - ay,
+											  _draggingPos[0] - ax,
+											   dirmode_8dirs);
+		avatar->doAnim(Animation::stand, dir);
 	} else {
 		debugC(kDebugObject, "Dropping item at (%d, %d, %d)",
 			   _draggingPos[0], _draggingPos[1], _draggingPos[2]);
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index b9ecec0598b..df242141c5a 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -3812,7 +3812,7 @@ uint32 Item::I_shoot(const uint8 *args, unsigned int /*argsize*/) {
 	ARG_UINT16(gravity); // either 2 (fish) or 1 (death disk, dart)
 	if (!item) return 0;
 
-	MissileTracker tracker(item, point.getX(), point.getY(), point.getZ(),
+	MissileTracker tracker(item, 0, point.getX(), point.getY(), point.getZ(),
 	                       speed, gravity);
 	tracker.launchItem();
 
diff --git a/engines/ultima/ultima8/world/missile_tracker.cpp b/engines/ultima/ultima8/world/missile_tracker.cpp
index 8bdae4bd3d5..3c9739406aa 100644
--- a/engines/ultima/ultima8/world/missile_tracker.cpp
+++ b/engines/ultima/ultima8/world/missile_tracker.cpp
@@ -32,18 +32,20 @@
 namespace Ultima {
 namespace Ultima8 {
 
-MissileTracker::MissileTracker(const Item *item, int32 sx, int32 sy, int32 sz,
+MissileTracker::MissileTracker(const Item *item, ObjId owner,
+							   int32 sx, int32 sy, int32 sz,
 							   int32 tx, int32 ty, int32 tz,
 							   int32 speed, int32 gravity) :
-		_destX(tx), _destY(ty), _destZ(tz), _gravity(gravity) {
+		_owner(owner), _destX(tx), _destY(ty), _destZ(tz), _gravity(gravity) {
 	_objId = item->getObjId();
 
 	init(sx, sy, sz, speed);
 }
 
-MissileTracker::MissileTracker(const Item *item, int32 tx, int32 ty, int32 tz,
+MissileTracker::MissileTracker(const Item *item, ObjId owner,
+							   int32 tx, int32 ty, int32 tz,
 							   int32 speed, int32 gravity) :
-		  _destX(tx), _destY(ty), _destZ(tz), _gravity(gravity)  {
+		_owner(owner), _destX(tx), _destY(ty), _destZ(tz), _gravity(gravity)  {
 	assert(item->getParent() == 0);
 
 	_objId = item->getObjId();
@@ -153,7 +155,7 @@ bool MissileTracker::isPathClear() const {
 
 		int32 hit = 0x4000;
 		for (it = collisions.begin(); it != collisions.end(); it++) {
-			if (it->_blocking && !it->_touching) {
+			if (it->_blocking && !it->_touching && it->_item != _owner) {
 				hit = it->_hitTime;
 				break;
 			}
diff --git a/engines/ultima/ultima8/world/missile_tracker.h b/engines/ultima/ultima8/world/missile_tracker.h
index 457ea7877e4..6898ae3064b 100644
--- a/engines/ultima/ultima8/world/missile_tracker.h
+++ b/engines/ultima/ultima8/world/missile_tracker.h
@@ -29,10 +29,10 @@ class Item;
 
 class MissileTracker {
 public:
-	MissileTracker(const Item *item, int32 sx, int32 sy, int32 sz,
+	MissileTracker(const Item *item, ObjId owner, int32 sx, int32 sy, int32 sz,
 	               int32 tx, int32 ty, int32 tz,
 	               int32 speed, int32 gravity);
-	MissileTracker(const Item *item, int32 tx, int32 ty, int32 tz,
+	MissileTracker(const Item *item, ObjId owner, int32 tx, int32 ty, int32 tz,
 	               int32 speed, int32 gravity);
 	~MissileTracker();
 
@@ -44,7 +44,7 @@ protected:
 	void init(int32 sx, int32 sy, int32 sz, int32 speed);
 
 private:
-	ObjId _objId;
+	ObjId _objId, _owner;
 	int32 _destX, _destY, _destZ;
 	int32 _speedX, _speedY, _speedZ;
 	int32 _gravity;




More information about the Scummvm-git-logs mailing list