[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