[Scummvm-git-logs] scummvm master -> 9c940c7c6ad7fec08eeab257e80f68ea979716a7
OMGPizzaGuy
noreply at scummvm.org
Sat Jun 8 04:28:00 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:
9c940c7c6a ULTIMA8: Expand use of Point3, part 2
Commit: 9c940c7c6ad7fec08eeab257e80f68ea979716a7
https://github.com/scummvm/scummvm/commit/9c940c7c6ad7fec08eeab257e80f68ea979716a7
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2024-06-07T23:27:29-05:00
Commit Message:
ULTIMA8: Expand use of Point3, part 2
Changed paths:
engines/ultima/ultima8/games/start_u8_process.cpp
engines/ultima/ultima8/gumps/game_map_gump.cpp
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor_anim_process.cpp
engines/ultima/ultima8/world/actors/attack_process.cpp
engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
engines/ultima/ultima8/world/actors/cru_pathfinder_process.h
engines/ultima/ultima8/world/actors/loiter_process.cpp
engines/ultima/ultima8/world/actors/main_actor.cpp
engines/ultima/ultima8/world/actors/pathfinder.cpp
engines/ultima/ultima8/world/actors/pathfinder_process.cpp
engines/ultima/ultima8/world/actors/pathfinder_process.h
engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp
engines/ultima/ultima8/world/actors/u8_avatar_mover_process.cpp
engines/ultima/ultima8/world/camera_process.cpp
engines/ultima/ultima8/world/camera_process.h
engines/ultima/ultima8/world/damage_info.cpp
engines/ultima/ultima8/world/fireball_process.cpp
engines/ultima/ultima8/world/gravity_process.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item.h
engines/ultima/ultima8/world/item_selection_process.cpp
engines/ultima/ultima8/world/map.cpp
engines/ultima/ultima8/world/snap_process.cpp
engines/ultima/ultima8/world/super_sprite_process.cpp
engines/ultima/ultima8/world/target_reticle_process.cpp
engines/ultima/ultima8/world/world.cpp
diff --git a/engines/ultima/ultima8/games/start_u8_process.cpp b/engines/ultima/ultima8/games/start_u8_process.cpp
index c07e035a142..6de0c90c94d 100644
--- a/engines/ultima/ultima8/games/start_u8_process.cpp
+++ b/engines/ultima/ultima8/games/start_u8_process.cpp
@@ -86,7 +86,7 @@ void StartU8Process::run() {
Egg *egg = dynamic_cast<Egg *>(getObject(objid));
Point3 pt = egg->getLocation();
// Center on egg
- CameraProcess::SetCameraProcess(new CameraProcess(pt.x, pt.y, pt.z));
+ CameraProcess::SetCameraProcess(new CameraProcess(pt));
egg->hatch();
}
diff --git a/engines/ultima/ultima8/gumps/game_map_gump.cpp b/engines/ultima/ultima8/gumps/game_map_gump.cpp
index 43c7fd64b65..3912f4beb3a 100644
--- a/engines/ultima/ultima8/gumps/game_map_gump.cpp
+++ b/engines/ultima/ultima8/gumps/game_map_gump.cpp
@@ -322,7 +322,7 @@ void GameMapGump::onMouseClick(int button, int32 mx, int32 my) {
debugC(kDebugObject, "Can't move: avatarInStasis");
} else {
Actor *avatarControlled = getControlledActor();
- PathfinderProcess *pfp = new PathfinderProcess(avatarControlled, coords.x, coords.y, coords.z);
+ PathfinderProcess *pfp = new PathfinderProcess(avatarControlled, coords);
Kernel::get_instance()->killProcesses(avatarControlled->getObjId(), PathfinderProcess::PATHFINDER_PROC_TYPE, true);
Kernel::get_instance()->addProcess(pfp);
}
@@ -437,7 +437,7 @@ bool GameMapGump::DraggingItem(Item *item, int mx, int my) {
}
}
- if (!item->canExistAt(_draggingPos.x, _draggingPos.y, _draggingPos.z))
+ if (!item->canExistAt(_draggingPos))
return false;
if (throwing)
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index ac278eecf09..aa2e08d36ed 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -758,7 +758,8 @@ void Debugger::dumpCurrentMap() {
// Now render the map
s->BeginPainting();
s->SetOrigin(0, 0);
- CameraProcess::SetCameraProcess(new CameraProcess(cx + camheight * 4, cy + camheight * 4, camheight));
+ Point3 pt(cx + camheight * 4, cy + camheight * 4, camheight);
+ CameraProcess::SetCameraProcess(new CameraProcess(pt));
g->Paint(s, 256, false);
s->EndPainting();
@@ -1222,10 +1223,9 @@ bool Debugger::cmdCameraOnAvatar(int argc, const char **argv) {
}
Actor *actor = getControlledActor();
if (actor) {
- int32 x, y, z;
- actor->getCentre(x, y, z);
- if (x > 0 || y > 0)
- CameraProcess::SetCameraProcess(new CameraProcess(x, y, z));
+ Point3 pt = actor->getCentre();
+ if (pt.x > 0 || pt.y > 0)
+ CameraProcess::SetCameraProcess(new CameraProcess(pt));
}
return false;
}
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 1ec95ab803c..5803ae03fed 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -2553,7 +2553,7 @@ uint32 Actor::I_pathfindToPoint(const uint8 *args, unsigned int /*argsize*/) {
World_FromUsecodeXY(x, y);
return Kernel::get_instance()->addProcess(
- new PathfinderProcess(actor, x, y, z));
+ new PathfinderProcess(actor, Point3(x, y, z)));
}
uint32 Actor::I_areEnemiesNear(const uint8 *args, unsigned int /*argsize*/) {
@@ -2646,7 +2646,7 @@ uint32 Actor::I_createActorCru(const uint8 *args, unsigned int /*argsize*/) {
newactor->setDir(static_cast<Direction>(dir * 2));
Point3 pt = item->getLocation();
- newactor->move(pt.x, pt.y, pt.z);
+ newactor->move(pt);
newactor->setDefaultActivity(0, other->getQuality() >> 8);
newactor->setDefaultActivity(1, item->getQuality() >> 8);
diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
index 86a2edca25f..4e94fb60f72 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
@@ -425,11 +425,11 @@ void ActorAnimProcess::doSpecial() {
Actor *ghoul = Actor::createActor(0x8e, 0);
if (!ghoul) return;
ghoul->setFlag(Item::FLG_FAST_ONLY);
- if (!ghoul->canExistAt(pt.x, pt.y, pt.z, true)) {
+ if (!ghoul->canExistAt(pt, true)) {
ghoul->destroy();
return;
}
- ghoul->move(pt.x, pt.y, pt.z);
+ ghoul->move(pt);
ghoul->doAnim(Animation::standUp, dir_north);
hostile = ghoul;
}
diff --git a/engines/ultima/ultima8/world/actors/attack_process.cpp b/engines/ultima/ultima8/world/actors/attack_process.cpp
index 718812b770a..cc0121ebacd 100644
--- a/engines/ultima/ultima8/world/actors/attack_process.cpp
+++ b/engines/ultima/ultima8/world/actors/attack_process.cpp
@@ -274,7 +274,7 @@ void AttackProcess::run() {
int32 x, y, z;
a->getHomePosition(x, y, z);
ProcId pid = Kernel::get_instance()->addProcess(
- new CruPathfinderProcess(a, x, y, z, 100, 0x80, true));
+ new CruPathfinderProcess(a, Point3(x, y, z), 100, 0x80, true));
waitFor(pid);
return;
}
@@ -283,7 +283,7 @@ void AttackProcess::run() {
// Pathfind to target
Point3 pt = target->getLocation();
ProcId pid = Kernel::get_instance()->addProcess(
- new CruPathfinderProcess(a, pt.x, pt.y, pt.z, 12, 0x80, true));
+ new CruPathfinderProcess(a, pt, 12, 0x80, true));
waitFor(pid);
return;
}
@@ -296,7 +296,7 @@ void AttackProcess::run() {
int32 y = (tpt.y + apt.y) / 2;
int32 z = (tpt.z + apt.z) / 2;
ProcId pid = Kernel::get_instance()->addProcess(
- new CruPathfinderProcess(a, x, y, z, 12, 0x80, true));
+ new CruPathfinderProcess(a, Point3(x, y, z), 12, 0x80, true));
waitFor(pid);
return;
}
@@ -599,7 +599,7 @@ void AttackProcess::genericAttack() {
pt.y += rs.getRandomNumberRngSigned(-0x1ff, 0x1ff);
_field96 = true;
const ProcId pid = Kernel::get_instance()->addProcess(
- new CruPathfinderProcess(a, pt.x, pt.y, pt.z, 12, 0x80, true));
+ new CruPathfinderProcess(a, pt, 12, 0x80, true));
// add a tiny delay to avoid tight loops
Process *delayproc = new DelayProcess(2);
Kernel::get_instance()->addProcess(delayproc);
diff --git a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
index bec549f9c91..f8465b54f67 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -520,7 +520,7 @@ void CruAvatarMoverProcess::step(Animation::Sequence action, Direction direction
end[0] = x;
end[1] = y;
end[2] = z;
- avatar->setLocation(origpt.x, origpt.y, origpt.z);
+ avatar->setLocation(origpt);
currentmap->sweepTest(start, end, dims, avatar->getShapeInfo()->_flags,
avatar->getObjId(), true, &collisions);
for (Std::list<CurrentMap::SweepItem>::iterator it = collisions.begin();
@@ -536,7 +536,7 @@ void CruAvatarMoverProcess::step(Animation::Sequence action, Direction direction
res = avatar->tryAnim(testaction, direction);
if (res == Animation::SUCCESS) {
// move to starting point for real (trigger fast area updates etc)
- avatar->setLocation(origpt.x, origpt.y, origpt.z);
+ avatar->setLocation(origpt);
avatar->move(x, y, z);
break;
}
@@ -546,7 +546,7 @@ void CruAvatarMoverProcess::step(Animation::Sequence action, Direction direction
if (res != Animation::SUCCESS) {
// reset location and result (in case it's END_OFF_LAND now)
// couldn't find a better move.
- avatar->setLocation(origpt.x, origpt.y, origpt.z);
+ avatar->setLocation(origpt);
res = initialres;
}
}
diff --git a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
index f08e555ee07..13b1d1abe9d 100644
--- a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
@@ -77,8 +77,8 @@ CruPathfinderProcess::CruPathfinderProcess(Actor *actor, Item *target, int maxst
actor->doAnim(Animation::unreadyWeapon, dir_current);
}
-CruPathfinderProcess::CruPathfinderProcess(Actor *actor, int32 x, int32 y, int32 z, int maxsteps, int stopdistance, bool turnatend) :
- _target(x, y, z), _targetItem(0), _currentStep(0),
+CruPathfinderProcess::CruPathfinderProcess(Actor *actor, const Point3 &target, int maxsteps, int stopdistance, bool turnatend) :
+ _target(target), _targetItem(0), _currentStep(0),
_maxSteps(maxsteps), _stopDistance(stopdistance), _nextTurn(false), _turnAtEnd(turnatend),
_lastDir(dir_current), _nextDir(dir_current), _nextDir2(dir_current),
_directPathBlocked(false), _noShotAvailable(true), _dir16Flag(false) {
diff --git a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.h b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.h
index 068727489a3..1cf3738e22d 100644
--- a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.h
+++ b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.h
@@ -42,7 +42,7 @@ class CruPathfinderProcess : public Process {
public:
CruPathfinderProcess();
CruPathfinderProcess(Actor *actor, Item *item, int maxsteps, int stopdistance, bool turnatend);
- CruPathfinderProcess(Actor *actor, int32 x, int32 y, int32 z, int maxsteps, int stopdistance, bool turnatend);
+ CruPathfinderProcess(Actor *actor, const Point3 &target, int maxsteps, int stopdistance, bool turnatend);
~CruPathfinderProcess() override;
ENABLE_RUNTIME_CLASSTYPE()
diff --git a/engines/ultima/ultima8/world/actors/loiter_process.cpp b/engines/ultima/ultima8/world/actors/loiter_process.cpp
index 23a51ea25a6..75cb331fabe 100644
--- a/engines/ultima/ultima8/world/actors/loiter_process.cpp
+++ b/engines/ultima/ultima8/world/actors/loiter_process.cpp
@@ -79,9 +79,9 @@ void LoiterProcess::run() {
Process *pfp;
if (GAME_IS_U8)
- pfp = new PathfinderProcess(a, pt.x, pt.y, pt.z);
+ pfp = new PathfinderProcess(a, pt);
else
- pfp = new CruPathfinderProcess(a, pt.x, pt.y, pt.z, 0xc, 0x80, false);
+ pfp = new CruPathfinderProcess(a, pt, 0xc, 0x80, false);
Kernel::get_instance()->addProcess(pfp);
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index debb5c52955..0ddb0fb61f6 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -176,7 +176,7 @@ int16 MainActor::addItemCru(Item *item, bool showtoast) {
} else {
item->setQuality(winfo->_clipSize);
}
- item->setLocation(pt.x, pt.y, pt.z);
+ item->setLocation(pt);
item->moveToContainer(this);
if (!_activeWeapon)
_activeWeapon = item->getObjId();
@@ -422,7 +422,7 @@ void MainActor::teleport(int mapNum, int teleport_id) {
// Keep the camera on the avatar (the snap process will update on next move)
// We don't add a new camera process here, as that would update the fast area
// before the cachein calls above have run.
- CameraProcess::GetCameraProcess()->moveToLocation(pt.x, pt.y, pt.z);
+ CameraProcess::GetCameraProcess()->moveToLocation(pt);
}
Actor::teleport(mapNum, pt.x, pt.y, pt.z);
@@ -1032,14 +1032,14 @@ int MainActor::receiveShieldHit(int damage, uint16 damage_type) {
remembersprite = false;
// NOTE: In the game, this is put in the location of the
// hit. For now just put in centre.
- getCentre(pt.x, pt.y, pt.z);
+ pt = getCentre();
break;
case 2:
shieldsprite = 0x5a9;
shieldstartframe = 0;
shieldendframe = 6;
remembersprite = false;
- getCentre(pt.x, pt.y, pt.z);
+ pt = getCentre();
break;
default:
shieldsprite = 0x52b;
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.cpp b/engines/ultima/ultima8/world/actors/pathfinder.cpp
index 2874db37aa2..25962d4f392 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder.cpp
@@ -155,7 +155,7 @@ void Pathfinder::setTarget(Item *item, bool hit) {
_targetItem = root ? root : item;
// set target to centre of item for the cost heuristic
- item->getCentre(_target.x, _target.y, _target.z);
+ _target = item->getCentre();
_target.z = item->getZ();
if (hit) {
diff --git a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
index cf48b1cb816..1f8cfb9a626 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
@@ -78,8 +78,8 @@ PathfinderProcess::PathfinderProcess(Actor *actor, ObjId itemid, bool hit) :
actor->setActorFlag(Actor::ACT_PATHFINDING);
}
-PathfinderProcess::PathfinderProcess(Actor *actor, int32 x, int32 y, int32 z) :
- _target(x, y, z), _targetItem(0), _currentStep(0),
+PathfinderProcess::PathfinderProcess(Actor *actor, const Point3 &target) :
+ _target(target), _targetItem(0), _currentStep(0),
_hitMode(false) {
assert(actor);
_itemNum = actor->getObjId();
diff --git a/engines/ultima/ultima8/world/actors/pathfinder_process.h b/engines/ultima/ultima8/world/actors/pathfinder_process.h
index 46377c3299e..7b20af7aae8 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder_process.h
+++ b/engines/ultima/ultima8/world/actors/pathfinder_process.h
@@ -36,7 +36,7 @@ class PathfinderProcess : public Process {
public:
PathfinderProcess();
PathfinderProcess(Actor *actor, ObjId item, bool hit = false);
- PathfinderProcess(Actor *actor, int32 x, int32 y, int32 z);
+ PathfinderProcess(Actor *actor, const Point3 &target);
~PathfinderProcess() override;
ENABLE_RUNTIME_CLASSTYPE()
diff --git a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
index 9ddec105314..ed93c47dc43 100644
--- a/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/quick_avatar_mover_process.cpp
@@ -161,7 +161,8 @@ void QuickAvatarMoverProcess::run() {
if (GAME_IS_CRUSADER) {
// Keep the camera on the avatar while we're quick-moving.
- CameraProcess::SetCameraProcess(new CameraProcess(pt.x + dxv, pt.y + dyv, pt.z + dzv));
+ Point3 cpt(pt.x + dxv, pt.y + dyv, pt.z + dzv);
+ CameraProcess::SetCameraProcess(new CameraProcess(cpt));
}
// Prevent avatar from running an idle animation while moving around
diff --git a/engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp b/engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp
index 64b12f53485..3977deb8507 100644
--- a/engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp
@@ -262,11 +262,10 @@ bool RollingThunderProcess::fireDistance(Direction dir, int32 x, int32 y, int32
if (info.blocker->getObjId() == target->getObjId())
dist = MAX(abs(x - pt.x), abs(y - pt.y));
} else {
- int32 ocx, ocy, ocz;
- target->getCentre(ocx, ocy, ocz);
- ocz = target->getTargetZRelativeToAttackerZ(z);
+ Point3 oc = target->getCentre();
+ oc.z = target->getTargetZRelativeToAttackerZ(z);
const int32 start[3] = {cx, cy, cz};
- const int32 end[3] = {ocx, ocy, ocz};
+ const int32 end[3] = {oc.x, oc.y, oc.z};
const int32 dims[3] = {2, 2, 2};
Std::list<CurrentMap::SweepItem> collisions;
diff --git a/engines/ultima/ultima8/world/actors/u8_avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/u8_avatar_mover_process.cpp
index 8756f4b5ba0..6f82853fd89 100644
--- a/engines/ultima/ultima8/world/actors/u8_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/u8_avatar_mover_process.cpp
@@ -757,11 +757,10 @@ void U8AvatarMoverProcess::jump(Animation::Sequence action, Direction direction)
ObjId targetId = gameMap->TraceCoordinates(mx, my, coords);
Item *target = getItem(targetId);
- int32 ax, ay, az;
- avatar->getCentre(ax, ay, az);
+ Point3 a = avatar->getCentre();
- int32 xrange = abs(ax - coords.x);
- int32 yrange = abs(ay - coords.y);
+ int32 xrange = abs(a.x - coords.x);
+ int32 yrange = abs(a.y - coords.y);
int maxrange = avatar->getStr() * 32;
if (target && target->getShapeInfo()->is_land() &&
diff --git a/engines/ultima/ultima8/world/camera_process.cpp b/engines/ultima/ultima8/world/camera_process.cpp
index 4b716427d94..a11ea3f14c9 100644
--- a/engines/ultima/ultima8/world/camera_process.cpp
+++ b/engines/ultima/ultima8/world/camera_process.cpp
@@ -64,6 +64,10 @@ void CameraProcess::ResetCameraProcess() {
}
void CameraProcess::moveToLocation(int32 x, int32 y, int32 z) {
+ moveToLocation(Point3(x, y, z));
+}
+
+void CameraProcess::moveToLocation(const Point3 &p) {
if (_itemNum) {
Item *item = getItem(_itemNum);
if (item)
@@ -73,9 +77,7 @@ void CameraProcess::moveToLocation(int32 x, int32 y, int32 z) {
_s.x = _s.y = _s.z = _time = _elapsed = _lastFrameNum = 0;
_eqX = _eqY = _earthquake = 0;
- _e.x = x;
- _e.y = y;
- _e.z = z;
+ _e = p;
_s = GetCameraLocation();
}
@@ -129,14 +131,14 @@ CameraProcess::CameraProcess(uint16 _itemnum) :
}
// Stay over point
-CameraProcess::CameraProcess(int32 x, int32 y, int32 z) :
- _e(x, y, z), _time(0), _elapsed(0), _itemNum(0), _lastFrameNum(0) {
+CameraProcess::CameraProcess(const Point3 &p) :
+ _e(p), _time(0), _elapsed(0), _itemNum(0), _lastFrameNum(0) {
_s = GetCameraLocation();
}
// Scroll
-CameraProcess::CameraProcess(int32 x, int32 y, int32 z, int32 time) :
- _e(x, y, z), _time(time), _elapsed(0), _itemNum(0), _lastFrameNum(0) {
+CameraProcess::CameraProcess(const Point3 &p, int32 time) :
+ _e(p), _time(time), _elapsed(0), _itemNum(0), _lastFrameNum(0) {
_s = GetCameraLocation();
debug(10, "Scrolling from (%d, %d,%d) to (%d, %d, %d) in %d frames",
_s.x, _s.y, _s.z, _e.x, _e.y, _e.z, _time);
@@ -343,7 +345,8 @@ uint32 CameraProcess::I_moveTo(const uint8 *args, unsigned int argsize) {
}
World_FromUsecodeXY(x, y);
- CameraProcess::SetCameraProcess(new CameraProcess(x, y, z));
+ Point3 pt(x, y, z);
+ CameraProcess::SetCameraProcess(new CameraProcess(pt));
return 0;
}
@@ -362,7 +365,8 @@ uint32 CameraProcess::I_scrollTo(const uint8 *args, unsigned int /*argsize*/) {
ARG_NULL16(); // some uint16?
World_FromUsecodeXY(x, y);
- return CameraProcess::SetCameraProcess(new CameraProcess(x, y, z, 25));
+ Point3 pt(x, y, z);
+ return CameraProcess::SetCameraProcess(new CameraProcess(pt, 25));
}
// Camera::startQuake(word)
diff --git a/engines/ultima/ultima8/world/camera_process.h b/engines/ultima/ultima8/world/camera_process.h
index 7056142e1a5..48ab04e9a0f 100644
--- a/engines/ultima/ultima8/world/camera_process.h
+++ b/engines/ultima/ultima8/world/camera_process.h
@@ -41,9 +41,9 @@ namespace Ultima8 {
class CameraProcess : public Process {
public:
CameraProcess();
- CameraProcess(uint16 itemnum); // Follow item/Do nothing
- CameraProcess(int32 x, int32 y, int32 z); // Goto location
- CameraProcess(int32 x, int32 y, int32 z, int32 time); // Scroll to location
+ CameraProcess(uint16 itemnum); // Follow item/Do nothing
+ CameraProcess(const Point3 &p); // Goto location
+ CameraProcess(const Point3 &p, int32 time); // Scroll to location
~CameraProcess() override;
@@ -67,6 +67,7 @@ public:
* so other pending events will all happen before the fast area is updated
*/
void moveToLocation(int32 x, int32 y, int32 z);
+ void moveToLocation(const Point3 &p);
INTRINSIC(I_setCenterOn);
INTRINSIC(I_moveTo);
diff --git a/engines/ultima/ultima8/world/damage_info.cpp b/engines/ultima/ultima8/world/damage_info.cpp
index 9b095f744ae..e18c6db1e20 100644
--- a/engines/ultima/ultima8/world/damage_info.cpp
+++ b/engines/ultima/ultima8/world/damage_info.cpp
@@ -76,7 +76,7 @@ bool DamageInfo::applyToItem(Item *item, uint16 points) const {
uint16 replacementShape = getReplacementShape();
uint8 replacementFrame = getReplacementFrame();
Item *newitem = ItemFactory::createItem(replacementShape, replacementFrame, q, 0, 0, mapnum, 0, true);
- newitem->move(pt.x, pt.y, pt.z);
+ newitem->move(pt);
if (item)
item->destroy();
} else if (!explodeDestroysItem()) {
diff --git a/engines/ultima/ultima8/world/fireball_process.cpp b/engines/ultima/ultima8/world/fireball_process.cpp
index be418aed561..99c4ee7cce7 100644
--- a/engines/ultima/ultima8/world/fireball_process.cpp
+++ b/engines/ultima/ultima8/world/fireball_process.cpp
@@ -124,7 +124,7 @@ void FireballProcess::run() {
Item *tailitem = getItem(_tail[2]);
Direction movedir = Direction_GetWorldDir(_ySpeed, _xSpeed, dirmode_8dirs);
tailitem->setFrame(Direction_ToUsecodeDir(movedir));
- tailitem->move(pt1.x, pt1.y, pt1.z);
+ tailitem->move(pt1);
_tail[2] = _tail[1];
_tail[1] = _tail[0];
@@ -179,12 +179,14 @@ uint32 FireballProcess::I_TonysBalls(const uint8 *args,
warning("I_TonysBalls failed to create item (260, 4).");
return 0;
}
- if (!ball->canExistAt(x, y, z)) {
+
+ Point3 pt(x, y, z);
+ if (!ball->canExistAt(pt)) {
warning("I_TonysBalls: failed to create fireball.");
ball->destroy();
return 0;
}
- ball->move(x, y, z);
+ ball->move(pt);
MainActor *avatar = getMainActor();
diff --git a/engines/ultima/ultima8/world/gravity_process.cpp b/engines/ultima/ultima8/world/gravity_process.cpp
index 4420b7c1b4e..9b215c2f597 100644
--- a/engines/ultima/ultima8/world/gravity_process.cpp
+++ b/engines/ultima/ultima8/world/gravity_process.cpp
@@ -160,7 +160,7 @@ void GravityProcess::run() {
termFlag = false;
_zSpeed = 0;
- item->getCentre(pt.x, pt.y, pt.z);
+ pt = item->getCentre();
target = hititem->getWorldBox();
if (ABS(_xSpeed) < 16) {
if (pt.x + 16 > target._x)
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 493e541644f..dd12ae78c1c 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -151,6 +151,12 @@ void Item::setLocation(int32 X, int32 Y, int32 Z) {
_z = Z;
}
+void Item::setLocation(const Point3 &pt) {
+ _x = pt.x;
+ _y = pt.y;
+ _z = pt.z;
+}
+
void Item::move(const Point3 &pt) {
move(pt.x, pt.y, pt.z);
}
@@ -451,18 +457,20 @@ void Item::randomGumpLocation() {
_y = 0xFFFF;
}
-void Item::getCentre(int32 &X, int32 &Y, int32 &Z) const {
+Point3 Item::getCentre() const {
// constants!
+ Point3 pt(_x, _y, _z);
const ShapeInfo *shapeinfo = getShapeInfo();
if (_flags & FLG_FLIPPED) {
- X = _x - shapeinfo->_y * 16;
- Y = _y - shapeinfo->_x * 16;
+ pt.x -= shapeinfo->_y * 16;
+ pt.y -= shapeinfo->_x * 16;
} else {
- X = _x - shapeinfo->_x * 16;
- Y = _y - shapeinfo->_y * 16;
+ pt.x -= shapeinfo->_x * 16;
+ pt.y -= shapeinfo->_y * 16;
}
- Z = _z + shapeinfo->_z * 4;
+ pt.y += shapeinfo->_z * 4;
+ return pt;
}
Box Item::getWorldBox() const {
@@ -594,21 +602,19 @@ bool Item::isCompletelyOn(const Item &item2) const {
}
bool Item::isCentreOn(const Item &item2) const {
- int32 x1c, y1c, z1c;
int32 x2a, y2a, z2b;
+ Point3 pt1 = getCentre();
Point3 pt2 = item2.getLocation();
- getCentre(x1c, y1c, z1c);
-
int32 xd, yd, zd;
item2.getFootpadWorld(xd, yd, zd);
x2a = pt2.x - xd;
y2a = pt2.y - yd;
z2b = pt2.z + zd;
- if (x1c <= x2a || pt2.x <= x1c)
+ if (pt1.x <= x2a || pt2.x <= pt1.x)
return false;
- if (y1c <= y2a || pt2.y <= y1c)
+ if (pt1.y <= y2a || pt2.y <= pt1.y)
return false;
if (z2b == getZ())
return true;
@@ -678,21 +684,21 @@ bool Item::canExistAt(int32 x, int32 y, int32 z, bool needsupport) const {
return info.valid && (!needsupport || info.supported);
}
-Direction Item::getDirToItemCentre(const Item &item2) const {
- int32 xv, yv, zv;
- getCentre(xv, yv, zv);
+bool Item::canExistAt(const Point3 &pt, bool needsupport) const {
+ return canExistAt(pt.x, pt.y, pt.z, needsupport);
+}
- int32 i2x, i2y, i2z;
- item2.getCentre(i2x, i2y, i2z);
+Direction Item::getDirToItemCentre(const Item &item2) const {
+ Point3 i1 = getCentre();
+ Point3 i2 = item2.getCentre();
- return Direction_GetWorldDir(i2y - yv, i2x - xv, dirmode_8dirs);
+ return Direction_GetWorldDir(i2.y - i1.y, i2.x - i1.x, dirmode_8dirs);
}
Direction Item::getDirToItemCentre(const Point3 &pt) const {
- int32 xv, yv, zv;
- getCentre(xv, yv, zv);
+ Point3 i1 = getCentre();
- return Direction_GetWorldDir(pt.y - yv, pt.x - xv, dirmode_8dirs);
+ return Direction_GetWorldDir(pt.y - i1.y, pt.x - i1.x, dirmode_8dirs);
}
@@ -736,12 +742,13 @@ int Item::getRange(const Item &item2, bool checkz) const {
int Item::getRangeIfVisible(const Item &item2) const {
World *world = World::get_instance();
CurrentMap *map = world->getCurrentMap();
- int32 start[3];
- int32 end[3];
- int32 dims[3] = {1, 1, 1};
Std::list<CurrentMap::SweepItem> hitItems;
- getCentre(start[0], start[1], start[2]);
- item2.getCentre(end[0], end[1], end[2]);
+
+ Point3 pt1 = getCentre();
+ Point3 pt2 = item2.getCentre();
+ int32 start[3] = {pt1.x, pt1.y, pt1.z};
+ int32 end[3] = {pt2.x, pt2.y, pt2.z};
+ int32 dims[3] = {1, 1, 1};
int xdiff = abs(start[0] - end[0]);
int ydiff = abs(start[1] - end[1]);
@@ -1326,12 +1333,10 @@ uint16 Item::fireWeapon(int32 x, int32 y, int32 z, Direction dir, int firetype,
}
}
- int32 tx = -1;
- int32 ty = 0;
- int32 tz = 0;
+ Point3 t(-1, 0, 0);
if (target) {
- target->getCentre(tx, ty, tz);
- tz = target->getTargetZRelativeToAttackerZ(getZ());
+ t = target->getCentre();
+ t.z = target->getTargetZRelativeToAttackerZ(getZ());
}
// TODO: check if we need the equivalent of FUN_1130_0299 here..
@@ -1346,11 +1351,9 @@ uint16 Item::fireWeapon(int32 x, int32 y, int32 z, Direction dir, int firetype,
assert(chp);
const Item *crosshair = getItem(chp->getItemNum());
Point3 ss;
- if (tx != -1) {
+ if (t.x != -1) {
// Shoot toward the target
- ss.x = tx;
- ss.y = ty;
- ss.z = tz;
+ ss = t;
findtarget = true;
} else if (this == getControlledActor() && crosshair) {
// Shoot toward the crosshair
@@ -1454,11 +1457,10 @@ uint16 Item::fireDistance(const Item *other, Direction dir, int16 xoff, int16 yo
if (info.blocker->getObjId() == other->getObjId())
dist = MAX(abs(_x - pto.x), abs(_y - pto.y));
} else {
- int32 ocx, ocy, ocz;
- other->getCentre(ocx, ocy, ocz);
- ocz = other->getTargetZRelativeToAttackerZ(getZ());
+ Point3 oc = other->getCentre();
+ oc.z = other->getTargetZRelativeToAttackerZ(getZ());
const int32 start[3] = {cx, cy, cz};
- const int32 end[3] = {ocx, ocy, ocz};
+ const int32 end[3] = {oc.x, oc.y, oc.z};
const int32 dims[3] = {2, 2, 2};
Std::list<CurrentMap::SweepItem> collisions;
@@ -2117,8 +2119,9 @@ int32 Item::ascend(int delta) {
_iy = pti.y;
_iz = pti.z;
- if (item->canExistAt(_ix, _iy, _iz + delta)) {
- item->move(_ix, _iy, _iz + delta); // automatically un-etherealizes item
+ pti.z += delta;
+ if (item->canExistAt(pti)) {
+ item->move(pti); // automatically un-etherealizes item
} else {
// uh oh...
// CHECKME: what do we do here?
@@ -2222,8 +2225,7 @@ void Item::explode(int explosion_type, bool destroy_item, bool cause_damage) {
setFlag(FLG_BROKEN);
// TODO: original game puts them at cx/cy/cz, but that looks wrong..
- int32 cx, cy, cz;
- getCentre(cx, cy, cz);
+ Point3 c = getCentre();
static const int expshapes[] = {0x31C, 0x31F, 0x326, 0x320, 0x321, 0x324, 0x323, 0x325};
uint rnd = rs.getRandomNumber(UINT_MAX);
int spriteno;
@@ -2242,7 +2244,7 @@ void Item::explode(int explosion_type, bool destroy_item, bool cause_damage) {
break;
}
p = new SpriteProcess(spriteno, 0, 39, 1, 1, //!! constants
- _x, _y, cz);
+ _x, _y, c.z);
} else {
p = new SpriteProcess(578, 20, 34, 1, 1, //!! constants
_x, _y, _z);
diff --git a/engines/ultima/ultima8/world/item.h b/engines/ultima/ultima8/world/item.h
index a1e23928b52..4cd9fae65ba 100644
--- a/engines/ultima/ultima8/world/item.h
+++ b/engines/ultima/ultima8/world/item.h
@@ -71,6 +71,7 @@ public:
//! Set item location. This strictly sets the location, and does not
//! even update CurrentMap
void setLocation(int32 x, int32 y, int32 z); // this only sets the loc.
+ void setLocation(const Point3 &pt); // this only sets the loc.
//! Move an item. This moves an item to the new location, and updates
//! CurrentMap and fastArea if necessary.
@@ -127,7 +128,7 @@ public:
//! Get the world coordinates of the Item's centre. Undefined if the Item
//! is contained or equipped.
- void getCentre(int32 &x, int32 &y, int32 &z) const;
+ Point3 getCentre() const;
//! Get the size of this item's 3D bounding box, in world coordinates.
inline void getFootpadWorld(int32 &x, int32 &y, int32 &z) const;
@@ -299,6 +300,7 @@ public:
//! Check if this item can exist at the given coordinates
bool canExistAt(int32 x, int32 y, int32 z, bool needsupport = false) const;
+ bool canExistAt(const Point3 &pt, bool needsupport = false) const;
//! Get direction from centre to another item's centre.
//! Undefined if either item is contained or equipped.
diff --git a/engines/ultima/ultima8/world/item_selection_process.cpp b/engines/ultima/ultima8/world/item_selection_process.cpp
index 4969b2fdc53..ab52f03501e 100644
--- a/engines/ultima/ultima8/world/item_selection_process.cpp
+++ b/engines/ultima/ultima8/world/item_selection_process.cpp
@@ -63,7 +63,9 @@ bool ItemSelectionProcess::selectNextItem(bool grab) {
if (!mainactor || !currentmap)
return false;
- mainactor->getCentre(_ax, _ay, _az);
+ Point3 pt = mainactor->getCentre();
+ _ax = pt.x;
+ _ay = pt.y;
_az = mainactor->getZ();
UCList uclist(2);
@@ -91,10 +93,9 @@ bool ItemSelectionProcess::selectNextItem(bool grab) {
family == ShapeInfo::SF_CRUINVITEM ||
(info && (info->_flags & ShapeInfo::SI_CRU_SELECTABLE))) {
- int32 cx, cy, cz;
- item->getCentre(cx, cy, cz);
+ Point3 c = item->getCentre();
int32 iz = item->getZ();
- if (abs(cx - _ax) > 0x100 || abs(cy - _ay) > 0x100 ||
+ if (abs(c.x - _ax) > 0x100 || abs(c.y - _ay) > 0x100 ||
(iz - _az) >= 0x50 || (_az - iz) >= 0x18)
continue;
@@ -171,9 +172,8 @@ void ItemSelectionProcess::avatarMoved() {
// Only clear if actor has moved a little
if (item && mainactor) {
- int32 ax, ay, az;
- mainactor->getCentre(ax, ay, az);
- uint32 range = MAX(abs(ax - _ax), MAX(abs(ay - _ay), abs(az - _az)));
+ Point3 a = mainactor->getCentre();
+ uint32 range = MAX(abs(a.x - _ax), MAX(abs(a.y - _ay), abs(a.z - _az)));
if (range > 16)
clearSelection();
}
@@ -192,16 +192,15 @@ void ItemSelectionProcess::clearSelection() {
void ItemSelectionProcess::putItemSelectionOnItem(Item *item) {
assert(item);
- int32 x, y, z;
clearSelection();
- item->getCentre(x, y, z);
+ Point3 pt = item->getCentre();
_selectedItem = item->getObjId();
Item *sprite = ItemFactory::createItem(SELECTOR_SHAPE, 0, 0, Item::FLG_DISPOSABLE,
0, 0, Item::EXT_SPRITE, true);
- sprite->move(x, y, z);
+ sprite->move(pt);
setItemNum(sprite->getObjId());
}
diff --git a/engines/ultima/ultima8/world/map.cpp b/engines/ultima/ultima8/world/map.cpp
index 1ca363d8b13..f54f4047469 100644
--- a/engines/ultima/ultima8/world/map.cpp
+++ b/engines/ultima/ultima8/world/map.cpp
@@ -21,6 +21,7 @@
#include "ultima/ultima.h"
#include "ultima/ultima8/misc/debugger.h"
+#include "ultima/ultima8/misc/point3.h"
#include "ultima/ultima8/world/map.h"
#include "ultima/ultima8/world/item_factory.h"
#include "ultima/ultima8/world/container.h"
@@ -148,7 +149,7 @@ void Map::loadFixed(Common::SeekableReadStream *rs) {
if ((pt.x == 23007 && pt.y == 21343) || (pt.x == 23135 && pt.y == 21471) ||
(pt.x == 23135 && pt.y == 21343)) {
shiftCoordsToZ(pt.x, pt.y, pt.z, 40);
- (*iter)->setLocation(pt.x, pt.y, pt.z);
+ (*iter)->setLocation(pt);
}
}
}
@@ -165,7 +166,7 @@ void Map::loadFixed(Common::SeekableReadStream *rs) {
Point3 pt = (*iter)->getLocation();
if ((pt.x == 6783 || pt.x == 6655) && (pt.y == 15743 || pt.y == 15615)) {
shiftCoordsToZ(pt.x, pt.y, pt.z, 16);
- (*iter)->setLocation(pt.x, pt.y, pt.z);
+ (*iter)->setLocation(pt);
}
}
}
@@ -183,7 +184,7 @@ void Map::loadFixed(Common::SeekableReadStream *rs) {
(pt.x == 10303 && pt.y == 23487) || (pt.x == 9919 && pt.y == 23487) ||
(pt.x == 10559 && pt.y == 23487)) {
shiftCoordsToZ(pt.x, pt.y, pt.z, 48);
- (*iter)->setLocation(pt.x, pt.y, pt.z);
+ (*iter)->setLocation(pt);
}
}
}
diff --git a/engines/ultima/ultima8/world/snap_process.cpp b/engines/ultima/ultima8/world/snap_process.cpp
index 04443193a99..40145f80f69 100644
--- a/engines/ultima/ultima8/world/snap_process.cpp
+++ b/engines/ultima/ultima8/world/snap_process.cpp
@@ -55,13 +55,12 @@ void SnapProcess::run() {
if (snap_to_player && !in_stasis) {
const Actor *controlled = getControlledActor();
if (controlled) {
- int32 x, y, z;
- controlled->getCentre(x, y, z);
- if (x > 0 || y > 0) {
+ Point3 pt = controlled->getCentre();
+ if (pt.x > 0 || pt.y > 0) {
_currentSnapEgg = 0;
CameraProcess *camera = CameraProcess::GetCameraProcess();
if (camera->getItemNum() != controlled->getObjId())
- CameraProcess::SetCameraProcess(new CameraProcess(x, y, z));
+ CameraProcess::SetCameraProcess(new CameraProcess(pt));
}
}
} else {
diff --git a/engines/ultima/ultima8/world/super_sprite_process.cpp b/engines/ultima/ultima8/world/super_sprite_process.cpp
index cb72b8aed18..52eb19db9ea 100644
--- a/engines/ultima/ultima8/world/super_sprite_process.cpp
+++ b/engines/ultima/ultima8/world/super_sprite_process.cpp
@@ -184,10 +184,9 @@ void SuperSpriteProcess::run() {
} else {
const Item *target = getItem(_target);
if (target) {
- int32 cx, cy, cz;
Point3 ptt = target->getLocation();
- target->getCentre(cx, cy, cz);
- targetz = cz + 8;
+ Point3 ptc = target->getCentre();
+ targetz = ptc.z + 8;
dir8 = Direction_GetWorldDir(ptt.y - _nowpt.y, ptt.x - _nowpt.x, dirmode_8dirs);
}
}
diff --git a/engines/ultima/ultima8/world/target_reticle_process.cpp b/engines/ultima/ultima8/world/target_reticle_process.cpp
index 0426fff42c2..7dd3e23d779 100644
--- a/engines/ultima/ultima8/world/target_reticle_process.cpp
+++ b/engines/ultima/ultima8/world/target_reticle_process.cpp
@@ -131,26 +131,24 @@ void TargetReticleProcess::avatarMoved() {
}
void TargetReticleProcess::putTargetReticleOnItem(Item *item, bool only_last_frame) {
- int32 x, y, z;
-
// TODO: the game does a bunch of other maths here to pick the right location.
// This is an over-simplification and is usually too high so it's
// hacked a little lower.
- item->getCentre(x, y, z);
- z -= 8;
+ Point3 pt = item->getCentre();
+ pt.z -= 8;
Process *p;
const int first_frame = _reticleStyle * 6;
const int last_frame = first_frame + 5;
if (!only_last_frame)
- p = new SpriteProcess(0x59a, first_frame, last_frame, 1, 10, x, y, z, false);
+ p = new SpriteProcess(0x59a, first_frame, last_frame, 1, 10, pt.x, pt.y, pt.z, false);
else
- p = new SpriteProcess(0x59a, last_frame, last_frame, 1, 1000, x, y, z, false);
+ p = new SpriteProcess(0x59a, last_frame, last_frame, 1, 1000, pt.x, pt.y, pt.z, false);
_reticleSpriteProcess = Kernel::get_instance()->addProcess(p);
_lastTargetItem = item->getObjId();
item->setExtFlag(Item::EXT_TARGET);
- debug("New reticle target: %d (%d, %d, %d)", _lastTargetItem, x, y, z);
+ debug("New reticle target: %d (%d, %d, %d)", _lastTargetItem, pt.x, pt.y, pt.z);
}
void TargetReticleProcess::itemMoved(Item *item) {
@@ -160,8 +158,7 @@ void TargetReticleProcess::itemMoved(Item *item) {
return;
}
- int32 x, y, z;
- item->getCentre(x, y, z);
+ Point3 pt = item->getCentre();
Actor *mainactor = getControlledActor();
int actordir = -1;
@@ -179,7 +176,7 @@ void TargetReticleProcess::itemMoved(Item *item) {
_reticleSpriteProcess = 0;
clearSprite();
} else {
- spriteproc->move(x, y, z);
+ spriteproc->move(pt.x, pt.y, pt.z);
}
}
}
diff --git a/engines/ultima/ultima8/world/world.cpp b/engines/ultima/ultima8/world/world.cpp
index 27d855144e4..f2f23f7c4f7 100644
--- a/engines/ultima/ultima8/world/world.cpp
+++ b/engines/ultima/ultima8/world/world.cpp
@@ -558,9 +558,8 @@ void World::setControlledNPCNum(uint16 num) {
if (controlled->isInCombat())
controlled->clearInCombat();
}
- int32 x, y, z;
- controlled->getCentre(x, y, z);
- CameraProcess::SetCameraProcess(new CameraProcess(x, y, z));
+ Point3 pt = controlled->getCentre();
+ CameraProcess::SetCameraProcess(new CameraProcess(pt));
}
TargetReticleProcess *t = TargetReticleProcess::get_instance();
More information about the Scummvm-git-logs
mailing list