[Scummvm-git-logs] scummvm master -> efb44fc2d17e8a6ec9974050d50614c036f230c8
OMGPizzaGuy
noreply at scummvm.org
Sat Oct 21 00:30:59 UTC 2023
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:
efb44fc2d1 ULTIMA8: Replace use of rect with box for world coordinate checks.
Commit: efb44fc2d17e8a6ec9974050d50614c036f230c8
https://github.com/scummvm/scummvm/commit/efb44fc2d17e8a6ec9974050d50614c036f230c8
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2023-10-20T19:30:36-05:00
Commit Message:
ULTIMA8: Replace use of rect with box for world coordinate checks.
These rect usages may be the cause of previous issues attempting to replace Ultima8::Rect with Common::Rect.
Changed paths:
engines/ultima/ultima8/world/current_map.cpp
diff --git a/engines/ultima/ultima8/world/current_map.cpp b/engines/ultima/ultima8/world/current_map.cpp
index 29341dc7f2e..80013ad2717 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -570,7 +570,7 @@ void CurrentMap::areaSearch(UCList *itemlist, const uint8 *loopscript,
check->getFootpadWorld(xd, yd, zd);
}
- const Rect searchrange(x - xd - range, y - yd - range, x + range, y + range);
+ const Box searchrange(x + range, y + range, 0, xd + range * 2, yd + range * 2, INT_MAX_VALUE);
int minx = ((x - xd - range) / _mapChunkSize) - 1;
int maxx = ((x + range) / _mapChunkSize) + 1;
@@ -598,30 +598,24 @@ void CurrentMap::areaSearch(UCList *itemlist, const uint8 *loopscript,
if (item->hasExtFlags(Item::EXT_SPRITE))
continue;
- // check if item is in range?
- int32 ix, iy, iz;
- item->getLocation(ix, iy, iz);
-
- int32 ixd, iyd, izd;
- item->getFootpadWorld(ixd, iyd, izd);
-
- const Rect itemrect(ix - ixd, iy - iyd, ix, iy);
-
- if (!itemrect.intersects(searchrange))
- continue;
+ // check if item is in range
+ const Box ib = item->getWorldBox();
+ if (searchrange._x > ib._x - ib._xd && searchrange._x - searchrange._xd < ib._x &&
+ searchrange._y > ib._y - ib._yd && searchrange._y - searchrange._yd < ib._y) {
- // check item against loopscript
- if (item->checkLoopScript(loopscript, scriptsize)) {
- assert(itemlist->getElementSize() == 2);
- itemlist->appenduint16(item->getObjId());
- }
+ // check item against loopscript
+ if (item->checkLoopScript(loopscript, scriptsize)) {
+ assert(itemlist->getElementSize() == 2);
+ itemlist->appenduint16(item->getObjId());
+ }
- if (recurse) {
- // recurse into child-containers
- const Container *container = dynamic_cast<const Container *>(item);
- if (container)
- container->containerSearch(itemlist, loopscript,
- scriptsize, recurse);
+ if (recurse) {
+ // recurse into child-containers
+ const Container *container = dynamic_cast<const Container *>(item);
+ if (container)
+ container->containerSearch(itemlist, loopscript,
+ scriptsize, recurse);
+ }
}
}
}
@@ -643,8 +637,7 @@ void CurrentMap::surfaceSearch(UCList *itemlist, const uint8 *loopscript,
uint32 scriptsize, ObjId check,
int32 origin[3], int32 dims[3],
bool above, bool below, bool recurse) const {
- const Rect searchrange(origin[0] - dims[0], origin[1] - dims[1],
- origin[0], origin[1]);
+ const Box searchrange(origin[0], origin[1], origin[2], dims[0], dims[1], dims[2]);
int minx = ((origin[0] - dims[0]) / _mapChunkSize) - 1;
int maxx = ((origin[0]) / _mapChunkSize) + 1;
@@ -666,39 +659,33 @@ void CurrentMap::surfaceSearch(UCList *itemlist, const uint8 *loopscript,
continue;
// check if item is in range?
- int32 ix, iy, iz;
- item->getLocation(ix, iy, iz);
- int32 ixd, iyd, izd;
- item->getFootpadWorld(ixd, iyd, izd);
+ const Box ib = item->getWorldBox();
+ if (searchrange._x > ib._x - ib._xd && searchrange._x - searchrange._xd < ib._x &&
+ searchrange._y > ib._y - ib._yd && searchrange._y - searchrange._yd < ib._y) {
- const Rect itemrect(ix - ixd, iy - iyd, ix, iy);
-
- if (!itemrect.intersects(searchrange))
- continue;
+ bool ok = false;
- bool ok = false;
-
- if (above && iz == (origin[2] + dims[2])) {
- ok = true;
- // Only recursive if tops aren't same (i.e. NOT flat)
- if (recurse && (izd + iz != origin[2] + dims[2]))
- surfaceSearch(itemlist, loopscript, scriptsize, item, true, false, true);
- }
-
- if (below && origin[2] == (iz + izd)) {
- ok = true;
- // Only recursive if bottoms aren't same (i.e. NOT flat)
- if (recurse && (izd != dims[2]))
- surfaceSearch(itemlist, loopscript, scriptsize, item, false, true, true);
- }
+ if (above && ib._z == (searchrange._z + searchrange._zd)) {
+ ok = true;
+ // Only recursive if tops aren't same (i.e. NOT flat)
+ if (recurse && (ib._zd + ib._z != searchrange._z + searchrange._zd))
+ surfaceSearch(itemlist, loopscript, scriptsize, item, true, false, true);
+ }
- if (!ok)
- continue;
+ if (below && searchrange._z == (ib._z + ib._zd)) {
+ ok = true;
+ // Only recursive if bottoms aren't same (i.e. NOT flat)
+ if (recurse && (ib._z != searchrange._z))
+ surfaceSearch(itemlist, loopscript, scriptsize, item, false, true, true);
+ }
- // check item against loopscript
- if (item->checkLoopScript(loopscript, scriptsize)) {
- assert(itemlist->getElementSize() == 2);
- itemlist->appenduint16(item->getObjId());
+ if (ok) {
+ // check item against loopscript
+ if (item->checkLoopScript(loopscript, scriptsize)) {
+ assert(itemlist->getElementSize() == 2);
+ itemlist->appenduint16(item->getObjId());
+ }
+ }
}
}
}
More information about the Scummvm-git-logs
mailing list