[Scummvm-git-logs] scummvm master -> fee33733515f542749092b1a9d073a8d739d9656
OMGPizzaGuy
noreply at scummvm.org
Thu May 23 23:36:39 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:
fee3373351 ULTIMA8: Clean up item root containter access.
Commit: fee33733515f542749092b1a9d073a8d739d9656
https://github.com/scummvm/scummvm/commit/fee33733515f542749092b1a9d073a8d739d9656
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2024-05-23T18:36:23-05:00
Commit Message:
ULTIMA8: Clean up item root containter access.
Changed paths:
engines/ultima/ultima8/gumps/container_gump.cpp
engines/ultima/ultima8/gumps/game_map_gump.cpp
engines/ultima/ultima8/gumps/paperdoll_gump.cpp
engines/ultima/ultima8/world/actors/pathfinder.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item.h
diff --git a/engines/ultima/ultima8/gumps/container_gump.cpp b/engines/ultima/ultima8/gumps/container_gump.cpp
index f247132ddbb..37a3bfb33a9 100644
--- a/engines/ultima/ultima8/gumps/container_gump.cpp
+++ b/engines/ultima/ultima8/gumps/container_gump.cpp
@@ -273,16 +273,8 @@ void ContainerGump::GetItemLocation(int32 lerp_factor) {
}
int32 gx, gy;
- Item *topitem = it;
-
- Container *p = it->getParentAsContainer();
- if (p) {
- while (p->getParentAsContainer()) {
- p = p->getParentAsContainer();
- }
-
- topitem = p;
- }
+ Container *root = it->getRootContainer();
+ Item *topitem = root ? root : it;
Gump *gump = GetRootGump()->FindGump<GameMapGump>();
assert(gump);
diff --git a/engines/ultima/ultima8/gumps/game_map_gump.cpp b/engines/ultima/ultima8/gumps/game_map_gump.cpp
index 97c48e6cb82..a2e7a5f5bec 100644
--- a/engines/ultima/ultima8/gumps/game_map_gump.cpp
+++ b/engines/ultima/ultima8/gumps/game_map_gump.cpp
@@ -239,9 +239,12 @@ bool GameMapGump::GetLocationOfItem(uint16 itemid, int32 &gx, int32 &gy,
int32 lerp_factor) {
Item *item = getItem(itemid);
- if (!item) return false;
+ if (!item)
+ return false;
- while (item->getParentAsContainer()) item = item->getParentAsContainer();
+ Container *root = item->getRootContainer();
+ if (root)
+ item = root;
int32 ix, iy, iz;
diff --git a/engines/ultima/ultima8/gumps/paperdoll_gump.cpp b/engines/ultima/ultima8/gumps/paperdoll_gump.cpp
index 53230cc6745..b4f6af3d8fe 100644
--- a/engines/ultima/ultima8/gumps/paperdoll_gump.cpp
+++ b/engines/ultima/ultima8/gumps/paperdoll_gump.cpp
@@ -350,7 +350,8 @@ bool PaperdollGump::DraggingItem(Item *item, int mx, int my) {
_draggingArmourClass = 0;
_draggingWeight = 0;
- if (item->getTopItem()->getObjId() != _owner)
+ Container *root = item->getRootContainer();
+ if (!root || root->getObjId() != _owner)
_draggingWeight = item->getWeight();
const ShapeInfo *si = item->getShapeInfo();
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.cpp b/engines/ultima/ultima8/world/actors/pathfinder.cpp
index 32c3be1a2d9..69d4a4c5e6e 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder.cpp
@@ -152,9 +152,8 @@ void Pathfinder::setTarget(int32 x, int32 y, int32 z) {
}
void Pathfinder::setTarget(Item *item, bool hit) {
- _targetItem = item;
- while (_targetItem->getParentAsContainer())
- _targetItem = _targetItem->getParentAsContainer();
+ Container *root = item->getRootContainer();
+ _targetItem = root ? root : item;
// set target to centre of item for the cost heuristic
item->getCentre(_targetX, _targetY, _targetZ);
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 806fff12ad6..6384f0d7f78 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -130,16 +130,19 @@ Container *Item::getParentAsContainer() const {
return p;
}
-const Item *Item::getTopItem() const {
- const Container *parentItem = getParentAsContainer();
-
- if (!parentItem) return this;
-
- while (parentItem->getParentAsContainer()) {
- parentItem = parentItem->getParentAsContainer();
+Container* Item::getRootContainer() const {
+ Container *root = nullptr;
+ Container *parent = getParentAsContainer();
+ while (parent) {
+ root = parent;
+ parent = parent->getParentAsContainer();
}
+ return root;
+}
- return parentItem;
+const Item *Item::getTopItem() const {
+ Container *root = getRootContainer();
+ return root ? root : this;
}
void Item::setLocation(int32 X, int32 Y, int32 Z) {
@@ -324,11 +327,8 @@ bool Item::moveToContainer(Container *container, bool checkwghtvol) {
_flags |= FLG_CONTAINED;
// If moving to avatar, mark as OWNED
- Item *p = this;
- while (p->getParentAsContainer())
- p = p->getParentAsContainer();
- // In Avatar's inventory?
- if (p->getObjId() == 1)
+ Container *root = getRootContainer();
+ if (root && root->getObjId() == 1)
setFlagRecursively(FLG_OWNED);
// No lerping when moving to a container
@@ -2888,20 +2888,17 @@ uint32 Item::I_getContainer(const uint8 *args, unsigned int /*argsize*/) {
uint32 Item::I_getRootContainer(const uint8 *args, unsigned int /*argsize*/) {
ARG_ITEM_FROM_PTR(item);
- if (!item) return 0;
+ if (!item)
+ return 0;
- Container *_parent = item->getParentAsContainer();
+ Container *root = item->getRootContainer();
//! What do we do if item has no _parent?
//! What do we do with equipped items?
+ if (!root)
+ return 0;
- if (!_parent) return 0;
-
- while (_parent->getParentAsContainer()) {
- _parent = _parent->getParentAsContainer();
- }
-
- return _parent->getObjId();
+ return root->getObjId();
}
uint32 Item::I_getQ(const uint8 *args, unsigned int /*argsize*/) {
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index f897ce1e114..5c74faf6e39 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -61,6 +61,9 @@ public:
//! Get the Container this Item is in, if any. (NULL if not in a Container)
Container *getParentAsContainer() const;
+ //! Get the top-most Container this Item is in, if any. (NULL if not in a Container)
+ Container *getRootContainer() const;
+
//! Get the top-most Container this Item is in, or the Item itself if not
//! in a container
const Item *getTopItem() const;
More information about the Scummvm-git-logs
mailing list