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

mduggan mgithub at guarana.org
Sun May 2 13:28: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:
cc7a60d320 ULTIMA: Modify Crudsader Avatar height when kneeling


Commit: cc7a60d320a6607a82528613fdf00347da689b35
    https://github.com/scummvm/scummvm/commit/cc7a60d320a6607a82528613fdf00347da689b35
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-02T22:27:24+09:00

Commit Message:
ULTIMA: Modify Crudsader Avatar height when kneeling

This matches original game behavior.

Changed paths:
    engines/ultima/ultima8/world/actors/actor.h
    engines/ultima/ultima8/world/actors/main_actor.cpp
    engines/ultima/ultima8/world/actors/main_actor.h
    engines/ultima/ultima8/world/item.h


diff --git a/engines/ultima/ultima8/world/actors/actor.h b/engines/ultima/ultima8/world/actors/actor.h
index 2d7de96497..b57d6e19d2 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -138,9 +138,13 @@ public:
 	}
 	void setActorFlag(uint32 mask) {
 		_actorFlags |= mask;
+		if (mask & ACT_KNEELING)
+			_cachedShapeInfo = nullptr;
 	}
 	void clearActorFlag(uint32 mask) {
 		_actorFlags &= ~mask;
+		if (mask & ACT_KNEELING)
+			_cachedShapeInfo = nullptr;
 	}
 
 	void setCombatTactic(int no) {
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index 3ec28076e1..4adad57a5c 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -27,6 +27,7 @@
 #include "ultima/ultima8/world/actors/teleport_to_egg_process.h"
 #include "ultima/ultima8/world/target_reticle_process.h"
 #include "ultima/ultima8/world/camera_process.h"
+#include "ultima/ultima8/graphics/shape_info.h"
 #include "ultima/ultima8/ultima8.h"
 #include "ultima/ultima8/world/actors/avatar_death_process.h"
 #include "ultima/ultima8/kernel/delay_process.h"
@@ -53,12 +54,18 @@ namespace Ultima8 {
 
 DEFINE_RUNTIME_CLASSTYPE_CODE(MainActor)
 
+ShapeInfo *MainActor::_kneelingShapeInfo = nullptr;
+
 MainActor::MainActor() : _justTeleported(false), _accumStr(0), _accumDex(0),
 	_accumInt(0), _cruBatteryType(ChemicalBattery), _keycards(0),
 	_activeInvItem(0), _shieldType(0), _shieldSpriteProc(0) {
 }
 
 MainActor::~MainActor() {
+	if (_kneelingShapeInfo) {
+		delete _kneelingShapeInfo;
+		_kneelingShapeInfo = nullptr;
+	}
 }
 
 GravityProcess *MainActor::ensureGravityProcess() {
@@ -320,6 +327,28 @@ int16 MainActor::addItemCru(Item *item, bool showtoast) {
 	return 0;
 }
 
+const ShapeInfo *MainActor::getShapeInfoFromGameInstance() const {
+	const ShapeInfo *info = Item::getShapeInfoFromGameInstance();
+
+	if (!(_actorFlags & ACT_KNEELING) || GAME_IS_U8)
+		return info;
+
+	// When kneeling in Crusader, return a modified shape with a lower height.
+	if (!_kneelingShapeInfo) {
+		_kneelingShapeInfo = new ShapeInfo();
+		// Not great coupling here, we know most fields don't need filling out..
+		_kneelingShapeInfo->_flags = info->_flags;
+		_kneelingShapeInfo->_x = info->_x;
+		_kneelingShapeInfo->_y = info->_y;
+		_kneelingShapeInfo->_weight = info->_weight;
+		_kneelingShapeInfo->_volume = info->_volume;
+		_kneelingShapeInfo->_family = info->_family;
+		_kneelingShapeInfo->_z = info->_z - 4;
+	}
+
+	return _kneelingShapeInfo;
+}
+
 void MainActor::teleport(int mapNum, int32 x, int32 y, int32 z) {
 	World *world = World::get_instance();
 
diff --git a/engines/ultima/ultima8/world/actors/main_actor.h b/engines/ultima/ultima8/world/actors/main_actor.h
index a7fbee2014..4577047c66 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.h
+++ b/engines/ultima/ultima8/world/actors/main_actor.h
@@ -47,6 +47,10 @@ public:
 	bool CanAddItem(Item *item, bool checkwghtvol = false) override;
 	bool addItem(Item *item, bool checkwghtvol = false) override;
 
+	//! Get the ShapeInfo object for this MainActor.  Overrided because it changes
+	//! when Crusader is kneeling.
+	const ShapeInfo *getShapeInfoFromGameInstance() const override;
+
 	//! Add item to avatar's inventory, but with some extra logic to do things like combine
 	//! ammo and credits, use batteries, etc.
 	int16 addItemCru(Item *item, bool showtoast);
@@ -183,6 +187,8 @@ protected:
 	uint16 _shieldSpriteProc;
 	uint16 _shieldType;
 
+	static ShapeInfo *_kneelingShapeInfo;
+
 };
 
 } // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index 42268561e1..7c116713f1 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -243,7 +243,7 @@ public:
 	inline const ShapeInfo *getShapeInfo() const;
 
 	//! Get the ShapeInfo object for this Item from the game instance.
-	const ShapeInfo *getShapeInfoFromGameInstance() const;
+	virtual const ShapeInfo *getShapeInfoFromGameInstance() const;
 
 	//! Get the Shape object for this Item. (The pointer will be cached.)
 	const Shape *getShapeObject() const;




More information about the Scummvm-git-logs mailing list