[Scummvm-git-logs] scummvm branch-2-3 -> 98444ff234c2327a56765cda2169b3d87f1d8567
mduggan
mgithub at guarana.org
Fri Sep 10 13:07:57 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:
98444ff234 ULTIMA8: Fix Crusader targeting slightly
Commit: 98444ff234c2327a56765cda2169b3d87f1d8567
https://github.com/scummvm/scummvm/commit/98444ff234c2327a56765cda2169b3d87f1d8567
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-09-10T22:07:51+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