[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