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

mduggan mgithub at guarana.org
Fri Sep 10 13:07:32 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:
bc8eab27fc ULTIMA8: Fix Crusader targeting slightly


Commit: bc8eab27fc45fe89118458fcbc807741d8fbf8bc
    https://github.com/scummvm/scummvm/commit/bc8eab27fc45fe89118458fcbc807741d8fbf8bc
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-09-10T22:07:12+09:00

Commit Message:
ULTIMA8: Fix Crusader targeting slightly

There were two differences to the original which caused occasional targeting
mishaps:
1.  The reticle and actual shots were using different starting positions for
the shot (Avatar centre vs Avatar corner)
2. Z difference was not being taken into account when finding the "best" target

This fixes both problems.

Changed paths:
    engines/ultima/ultima8/world/current_map.cpp
    engines/ultima/ultima8/world/current_map.h
    engines/ultima/ultima8/world/item.cpp
    engines/ultima/ultima8/world/target_reticle_process.cpp


diff --git a/engines/ultima/ultima8/world/current_map.cpp b/engines/ultima/ultima8/world/current_map.cpp
index 46c27da22c..d4a4b7452b 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -335,7 +335,7 @@ void CurrentMap::removeTargetItem(const Item *item) {
 }
 
 
-Item *CurrentMap::findBestTargetItem(int32 x, int32 y, Direction dir, DirectionMode dirmode) {
+Item *CurrentMap::findBestTargetItem(int32 x, int32 y, int32 z, Direction dir, DirectionMode dirmode) {
 	// "best" means:
 	// Shape info SI_OCCL
 	// isNPC
@@ -377,7 +377,8 @@ Item *CurrentMap::findBestTargetItem(int32 x, int32 y, Direction dir, DirectionM
 
 		int xdiff = abs(x - ix);
 		int ydiff = abs(y - iy);
-		int dist = MAX(xdiff, ydiff);
+		int zdiff = abs(z - iz);
+		int dist = MAX(MAX(xdiff, ydiff), zdiff);
 
 		if (dist < bestdist) {
 			bestitem = item;
diff --git a/engines/ultima/ultima8/world/current_map.h b/engines/ultima/ultima8/world/current_map.h
index 6bb11dd23b..b56496c1b1 100644
--- a/engines/ultima/ultima8/world/current_map.h
+++ b/engines/ultima/ultima8/world/current_map.h
@@ -75,8 +75,8 @@ public:
 	void addTargetItem(const Item *item);
 	//! Remove an item from the list of possible targets (in Crusader)
 	void removeTargetItem(const Item *item);
-	//! Find the best target item in the given direction
-	Item *findBestTargetItem(int32 x, int32 y, Direction dir, DirectionMode dirmode);
+	//! Find the best target item in the given direction from the given start point.
+	Item *findBestTargetItem(int32 x, int32 y, int32 z, Direction dir, DirectionMode dirmode);
 
 	//! Update the fast area for the cameras position
 	void updateFastArea(int32 from_x, int32 from_y, int32 from_z, int32 to_x, int32 to_y, int32 to_z);
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index ecb51e9bf2..fa732abec5 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -1280,7 +1280,7 @@ uint16 Item::fireWeapon(int32 x, int32 y, int32 z, Direction dir, int firetype,
 		if (this != getControlledActor()) {
 			target = getControlledActor();
 		} else {
-			target = currentmap->findBestTargetItem(ix, iy, dir, dirmode);
+			target = currentmap->findBestTargetItem(ix, iy, iz - z, dir, dirmode);
 		}
 	}
 
diff --git a/engines/ultima/ultima8/world/target_reticle_process.cpp b/engines/ultima/ultima8/world/target_reticle_process.cpp
index 35b1bfd8c6..10306f4633 100644
--- a/engines/ultima/ultima8/world/target_reticle_process.cpp
+++ b/engines/ultima/ultima8/world/target_reticle_process.cpp
@@ -103,9 +103,9 @@ bool TargetReticleProcess::findTargetItem() {
 	Direction dir = mainactor->getDir();
 
 	int32 x, y, z;
-	mainactor->getCentre(x, y, z);
+	mainactor->getLocation(x, y, z);
 
-	Item *item = currentmap->findBestTargetItem(x, y, dir, dirmode_16dirs);
+	Item *item = currentmap->findBestTargetItem(x, y, z, dir, dirmode_16dirs);
 
 	if (item && item->getObjId() != _lastTargetItem) {
 		Item *lastItem = getItem(_lastTargetItem);




More information about the Scummvm-git-logs mailing list