[Scummvm-git-logs] scummvm master -> ffee0ffdd99457f77317ac2606bf837bc2c16cd2
mduggan
mgithub at guarana.org
Thu Jul 30 02:44:05 UTC 2020
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
15471f0dd7 ULTIMA8: Remove some last dir-as-int assumptions
c7a4fef8b4 ULTIMA8: Switch internal directions to 16 dirs
473d13d5b7 ULTIMA8: Fix combat turns by removing duplicate wrong code.
c479540be1 DEVTOOLS: ULTIMA8: Add overlay data for remorse weapons.
ffee0ffdd9 ULTIMA8: Fix surrendering and weapon overlays in Crusader
Commit: 15471f0dd7f4a705a005be78f155734a8fe69365
https://github.com/scummvm/scummvm/commit/15471f0dd7f4a705a005be78f155734a8fe69365
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00
Commit Message:
ULTIMA8: Remove some last dir-as-int assumptions
Changed paths:
engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
engines/ultima/ultima8/kernel/mouse.cpp
engines/ultima/ultima8/kernel/mouse.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor_anim_process.cpp
diff --git a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
index 807118a5e3..00982d8716 100644
--- a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
+++ b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.cpp
@@ -49,7 +49,7 @@ const AnimWeaponOverlay *WpnOvlayDat::getAnimOverlay(uint32 action) const {
}
const WeaponOverlayFrame *WpnOvlayDat::getOverlayFrame(uint32 action, int type,
- int direction,
+ Direction direction,
int frame) const {
if (action >= _overlay.size())
return nullptr;
diff --git a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
index 44f39e0c6d..4fe16d4c79 100644
--- a/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
+++ b/engines/ultima/ultima8/graphics/wpn_ovlay_dat.h
@@ -23,6 +23,8 @@
#ifndef ULTIMA8_GRAPHICS_WPNOVLAYDAT_H
#define ULTIMA8_GRAPHICS_WPNOVLAYDAT_H
+#include "ultima/ultima8/misc/direction.h"
+
namespace Ultima {
namespace Ultima8 {
@@ -41,7 +43,7 @@ public:
const AnimWeaponOverlay *getAnimOverlay(uint32 action) const;
const WeaponOverlayFrame *getOverlayFrame(uint32 action, int type,
- int direction, int frame) const;
+ Direction direction, int frame) const;
private:
Std::vector<AnimWeaponOverlay *> _overlay;
diff --git a/engines/ultima/ultima8/kernel/mouse.cpp b/engines/ultima/ultima8/kernel/mouse.cpp
index 99a5aea95f..b9a7a8a569 100644
--- a/engines/ultima/ultima8/kernel/mouse.cpp
+++ b/engines/ultima/ultima8/kernel/mouse.cpp
@@ -183,8 +183,8 @@ Direction Mouse::getMouseDirectionWorld(int mx, int my) {
return Direction_Get(dy * 2, dx, dirmode_8dirs);
}
-int Mouse::getMouseDirectionScreen(int mx, int my) {
- return ((getMouseDirectionWorld(mx, my)) + 1) % 8;
+Direction Mouse::getMouseDirectionScreen(int mx, int my) {
+ return Direction_OneRight(getMouseDirectionWorld(mx, my), dirmode_8dirs);
}
int Mouse::getMouseFrame() {
@@ -222,7 +222,8 @@ int Mouse::getMouseFrame() {
}
// Calculate frame based on direction
- int frame = getMouseDirectionScreen(_mousePos.x, _mousePos.y);
+ Direction mousedir = getMouseDirectionScreen(_mousePos.x, _mousePos.y);
+ int frame = mouseFrameForDir(mousedir);
/** length --- frame offset
* 0 0
@@ -257,6 +258,20 @@ int Mouse::getMouseFrame() {
}
}
+int Mouse::mouseFrameForDir(Direction mousedir) const {
+ switch (mousedir) {
+ case dir_north: return 0;
+ case dir_northeast: return 1;
+ case dir_east: return 2;
+ case dir_southeast: return 3;
+ case dir_south: return 4;
+ case dir_southwest: return 5;
+ case dir_west: return 6;
+ case dir_northwest: return 7;
+ default: return 0;
+ }
+}
+
void Mouse::setMouseCoords(int mx, int my) {
Rect dims;
RenderSurface *screen = Ultima8Engine::get_instance()->getRenderScreen();
diff --git a/engines/ultima/ultima8/kernel/mouse.h b/engines/ultima/ultima8/kernel/mouse.h
index 953f1c7ee0..d86946e731 100644
--- a/engines/ultima/ultima8/kernel/mouse.h
+++ b/engines/ultima/ultima8/kernel/mouse.h
@@ -126,6 +126,8 @@ private:
void startDragging(int mx, int my);
void moveDragging(int mx, int my);
void stopDragging(int mx, int my);
+ int mouseFrameForDir(Direction mousedir) const;
+
public:
static Mouse *get_instance() { return _instance; }
public:
@@ -151,7 +153,7 @@ public:
int getMouseLength(int mx, int my);
//! get mouse cursor direction on the screen. 0 = up, 1 = up-right, 2 = right, etc...
- int getMouseDirectionScreen(int mx, int my);
+ Direction getMouseDirectionScreen(int mx, int my);
//! get mouse cursor direction in the world. 0 = up, 1 = up-right, 2 = right, etc...
Direction getMouseDirectionWorld(int mx, int my);
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index acfa18ab6c..e4c1ce8903 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -886,7 +886,7 @@ void Actor::receiveHitU8(uint16 other, Direction dir, int damage, uint16 damage_
if (damage >= 4 && _objId == 1 && attacker) {
// play blood sprite
int start = 0, end = 12;
- if (dir > 2) {
+ if (dir > dir_east) {
start = 13;
end = 25;
}
@@ -1484,7 +1484,7 @@ uint32 Actor::I_getDir(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
if (!actor) return 0;
- return actor->getDir();
+ return Direction_ToUsecodeDir(actor->getDir());
}
uint32 Actor::I_getLastAnimSet(const uint8 *args, unsigned int /*argsize*/) {
diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
index c0fa2c4dc2..0d619546ae 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
@@ -89,11 +89,6 @@ bool ActorAnimProcess::init() {
if (_dir == dir_current)
_dir = actor->getDir();
- if ((GAME_IS_U8 && _dir > 7) || (GAME_IS_CRUSADER && _dir > 15)) {
- // invalid direction
- return false;
- }
-
if (!actor->hasFlags(Item::FLG_FASTAREA)) {
// not in the fast area? Can't play an animation then.
// (If we do, the actor will likely fall because the floor is gone.)
Commit: c7a4fef8b4ba4ef5cee9cf392303613bc0ac974c
https://github.com/scummvm/scummvm/commit/c7a4fef8b4ba4ef5cee9cf392303613bc0ac974c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00
Commit Message:
ULTIMA8: Switch internal directions to 16 dirs
Changed paths:
engines/ultima/ultima8/kernel/kernel.cpp
engines/ultima/ultima8/misc/direction.h
engines/ultima/ultima8/misc/direction_util.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/anim_action.cpp
engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
engines/ultima/ultima8/world/actors/combat_process.cpp
engines/ultima/ultima8/world/actors/weapon_overlay.h
engines/ultima/ultima8/world/crosshair_process.cpp
diff --git a/engines/ultima/ultima8/kernel/kernel.cpp b/engines/ultima/ultima8/kernel/kernel.cpp
index 75f5c25f21..ef95bb10e0 100644
--- a/engines/ultima/ultima8/kernel/kernel.cpp
+++ b/engines/ultima/ultima8/kernel/kernel.cpp
@@ -93,7 +93,7 @@ ProcId Kernel::addProcess(Process *proc) {
#if 0
perr << "[Kernel] Adding process " << proc
- << ", pid = " << proc->_pid << Std::endl;
+ << ", pid = " << proc->_pid << " type " << proc->GetClassType()._className << Std::endl;
#endif
// processes.push_back(proc);
diff --git a/engines/ultima/ultima8/misc/direction.h b/engines/ultima/ultima8/misc/direction.h
index 4c60e121fa..9679f3e3f8 100644
--- a/engines/ultima/ultima8/misc/direction.h
+++ b/engines/ultima/ultima8/misc/direction.h
@@ -31,22 +31,22 @@ namespace Ultima8 {
*/
enum Direction {
dir_north = 0,
- dir_northeast = 1,
- dir_east = 2,
- dir_southeast = 3,
- dir_south = 4,
- dir_southwest = 5,
- dir_west = 6,
- dir_northwest = 7,
- dir_current = 16,
- dir_nne,
- dir_ene,
- dir_ese,
- dir_sse,
- dir_ssw,
- dir_wsw,
- dir_wnw,
- dir_nnw
+ dir_nne = 1,
+ dir_northeast = 2,
+ dir_ene = 3,
+ dir_east = 4,
+ dir_ese = 5,
+ dir_southeast = 6,
+ dir_sse = 7,
+ dir_south = 8,
+ dir_ssw = 9,
+ dir_southwest = 10,
+ dir_wsw = 11,
+ dir_west = 12,
+ dir_wnw = 13,
+ dir_northwest = 14,
+ dir_nnw = 15,
+ dir_current = 16
};
enum DirectionMode {
diff --git a/engines/ultima/ultima8/misc/direction_util.h b/engines/ultima/ultima8/misc/direction_util.h
index 972fb4e8b4..dd229d12d0 100644
--- a/engines/ultima/ultima8/misc/direction_util.h
+++ b/engines/ultima/ultima8/misc/direction_util.h
@@ -37,13 +37,13 @@ namespace Ultima8 {
inline int Direction_XFactor(Direction dir) {
static const int _x_fact[] = { 0, +1, +1, +1, 0, -1, -1, -1 };
//static const int _x_fact16[] = { 0, +1, +2, +2, +2, +2, +2, +1, 0, -1, -2, -2, -2, -2, -2, -1 };
- return _x_fact[dir];
+ return _x_fact[(int)dir / 2];
}
inline int Direction_YFactor(Direction dir) {
static const int _y_fact[] = { -1, -1, 0, +1, +1, +1, 0, -1 };
//static const int _y_fact16[] = { -2, -2, -2, -1, 0, +1, +2, +2, +2, +2, +2, +1, 0, -1, -2, -2 };
- return _y_fact[dir];
+ return _y_fact[(int)dir / 2];
}
/**
@@ -153,14 +153,18 @@ inline Direction Direction_Invert(Direction dir) {
//! Return the direction one left (aka counter-clockwise) of the input
inline Direction Direction_OneLeft(Direction dir, DirectionMode mode) {
- // TODO: support 16 dirs here.
- return static_cast<Direction>((static_cast<int>(dir) + 7) % 8);
+ if (mode == dirmode_8dirs)
+ return static_cast<Direction>((static_cast<int>(dir) + 14) % 16);
+ else
+ return static_cast<Direction>((static_cast<int>(dir) + 15) % 16);
}
//! Return the direction one right (aka clockwise) of the input
inline Direction Direction_OneRight(Direction dir, DirectionMode mode) {
- // TODO: support 16 dirs here.
- return static_cast<Direction>((static_cast<int>(dir) + 1) % 8);
+ if (mode == dirmode_8dirs)
+ return static_cast<Direction>((static_cast<int>(dir) + 2) % 16);
+ else
+ return static_cast<Direction>((static_cast<int>(dir) + 1) % 16);
}
inline Direction Direction_TurnByDelta(Direction dir, int delta, DirectionMode mode) {
@@ -171,27 +175,24 @@ inline Direction Direction_TurnByDelta(Direction dir, int delta, DirectionMode m
//! Get a turn delta (-1 for left, +1 for right) to turn the fastest
//! way from one direction to another
inline int Direction_GetShorterTurnDelta(Direction from, Direction to) {
- // TODO: Support 16 dirs here.
- if ((from - to + 8) % 8 < 4)
+ if ((from - to + 16) % 16 < 8)
return -1;
return 1;
}
inline uint32 Direction_ToUsecodeDir(Direction dir) {
- // TODO: Will need changing when we support 16 dirs
if (GAME_IS_U8) {
- return static_cast<int32>(dir);
+ return static_cast<int32>(dir / 2);
} else {
- return static_cast<int32>(dir) * 2;
+ return static_cast<int32>(dir);
}
}
inline Direction Direction_FromUsecodeDir(uint32 dir) {
- // TODO: Will need changing when we support 16 dirs
if (GAME_IS_U8) {
- return static_cast<Direction>(dir);
+ return static_cast<Direction>(dir * 2);
} else {
- return static_cast<Direction>(dir / 2);
+ return static_cast<Direction>(dir);
}
}
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index e4c1ce8903..d30b86db6f 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -555,9 +555,10 @@ DirectionMode Actor::animDirMode(Animation::Sequence anim) const {
}
uint16 Actor::turnTowardDir(Direction targetdir) {
- Direction curdir = _direction;
- if (targetdir == curdir)
- return 0;
+ bool combatRun = hasActorFlags(Actor::ACT_COMBATRUN);
+ Direction curdir = getDir();
+ bool combat = isInCombat() && !combatRun;
+ Animation::Sequence standanim = Animation::stand;
int stepDelta = Direction_GetShorterTurnDelta(curdir, targetdir);
Animation::Sequence turnanim;
@@ -567,14 +568,26 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
turnanim = Animation::lookRight;
}
- ProcId prevpid = 0;
+ if (combat) {
+ turnanim = Animation::combatStand;
+ standanim = Animation::combatStand;
+ }
- DirectionMode dirmode = animDirMode(turnanim);
+ ProcId prevpid = 0;
// Create a sequence of turn animations from
// our current direction to the new one
- for (Direction dir = curdir; dir != targetdir; dir = Direction_TurnByDelta(dir, stepDelta, dirmode)) {
+ DirectionMode mode = animDirMode(turnanim);
+
+ // slight hack - avoid making 8-step turns if our target is a 16-step direction
+ // - we'll never get to the right direction that way.
+ if (static_cast<uint32>(targetdir) % 2) {
+ mode = dirmode_16dirs;
+ }
+
+ for (Direction dir = curdir; dir != targetdir; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
ProcId animpid = doAnim(turnanim, dir);
+
if (prevpid) {
Process *proc = Kernel::get_instance()->getProcess(animpid);
assert(proc);
@@ -584,7 +597,14 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
prevpid = animpid;
}
- return prevpid;
+ ProcId animpid = doAnim(standanim, targetdir);
+ if (prevpid) {
+ Process *proc = Kernel::get_instance()->getProcess(animpid);
+ assert(proc);
+ proc->waitFor(prevpid);
+ }
+
+ return animpid;
}
uint16 Actor::setActivity(int activity) {
diff --git a/engines/ultima/ultima8/world/actors/anim_action.cpp b/engines/ultima/ultima8/world/actors/anim_action.cpp
index bd99b7874e..5194402d2b 100644
--- a/engines/ultima/ultima8/world/actors/anim_action.cpp
+++ b/engines/ultima/ultima8/world/actors/anim_action.cpp
@@ -68,13 +68,13 @@ void AnimAction::getAnimRange(const Actor *actor, Direction dir,
}
const AnimFrame &AnimAction::getFrame(Direction dir, unsigned int frameno) const {
- assert((unsigned int)dir < _dirCount);
- assert(frameno < _frames[dir].size());
-
uint32 diroff = static_cast<uint32>(dir);
// HACK for 16 dir support
- if (_dirCount == 16)
- diroff *= 2;
+ if (_dirCount == 8)
+ diroff /= 2;
+
+ assert(diroff < _dirCount);
+ assert(frameno < _frames[diroff].size());
return _frames[diroff][frameno];
}
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index 9f23c18df1..a46825eac1 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -852,51 +852,9 @@ void AvatarMoverProcess::jump(Animation::Sequence action, Direction direction) {
void AvatarMoverProcess::turnToDirection(Direction direction) {
MainActor *avatar = getMainActor();
- bool combatRun = avatar->hasActorFlags(Actor::ACT_COMBATRUN);
- Direction curdir = avatar->getDir();
- bool combat = avatar->isInCombat() && !combatRun;
- Animation::Sequence standanim = Animation::stand;
-
- int stepDelta = Direction_GetShorterTurnDelta(curdir, direction);
- Animation::Sequence turnanim;
- if (stepDelta == -1) {
- turnanim = Animation::lookLeft;
- } else {
- turnanim = Animation::lookRight;
- }
-
- if (combat) {
- turnanim = Animation::combatStand;
- standanim = Animation::combatStand;
- }
-
- ProcId prevpid = 0;
-
- // Create a sequence of turn animations from
- // our current direction to the new one
- DirectionMode dirmode = avatar->animDirMode(turnanim);
-
- for (Direction dir = curdir; dir != direction; dir = Direction_TurnByDelta(dir, stepDelta, dirmode)) {
- ProcId animpid = avatar->doAnim(turnanim, dir);
-
- if (prevpid) {
- Process *proc = Kernel::get_instance()->getProcess(animpid);
- assert(proc);
- proc->waitFor(prevpid);
- }
-
- prevpid = animpid;
- }
-
- ProcId animpid = avatar->doAnim(standanim, direction);
-
- if (prevpid) {
- Process *proc = Kernel::get_instance()->getProcess(animpid);
- assert(proc);
- proc->waitFor(prevpid);
- }
-
- waitFor(animpid);
+ uint16 turnpid = avatar->turnTowardDir(direction);
+ if (turnpid)
+ waitFor(turnpid);
}
bool AvatarMoverProcess::checkTurn(Direction direction, bool moving) {
@@ -907,13 +865,13 @@ bool AvatarMoverProcess::checkTurn(Direction direction, bool moving) {
// Note: don't need to turn if moving backward in combat stance
// CHECKME: currently, first turn in the right direction
if (direction != curdir && !(
- combat && ABS(direction - curdir) == 4)) {
+ combat && ABS(direction - curdir) == 8)) {
Animation::Sequence lastanim = avatar->getLastAnim();
if (moving &&
(lastanim == Animation::walk || lastanim == Animation::run ||
lastanim == Animation::combatStand) &&
- (ABS(direction - curdir) + 1 % 8 <= 2)) {
+ (ABS(direction - curdir) + 2 % 16 <= 4)) {
// don't need to explicitly do a turn animation
return false;
}
diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index accebf3a84..fed0fad6d2 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -257,8 +257,13 @@ void CombatProcess::turnToDirection(Direction direction) {
bool done = false;
DirectionMode mode = a->animDirMode(turnanim);
+ // slight hack - avoid making 8-step turns if our target is a 16-step direction
+ // - we'll never get to the right direction that way.
+ if (static_cast<uint32>(direction) % 2) {
+ mode = dirmode_16dirs;
+ }
- for (Direction dir = curdir; !done; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
+ for (Direction dir = curdir; dir != direction; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
ProcId animpid = a->doAnim(turnanim, dir);
if (dir == direction) done = true;
diff --git a/engines/ultima/ultima8/world/actors/weapon_overlay.h b/engines/ultima/ultima8/world/actors/weapon_overlay.h
index 411da2947d..48732e2acf 100644
--- a/engines/ultima/ultima8/world/actors/weapon_overlay.h
+++ b/engines/ultima/ultima8/world/actors/weapon_overlay.h
@@ -52,15 +52,22 @@ struct AnimWeaponOverlay {
//! \param frame the animation frame
//! \return nullptr if invalid, or pointer to a frame; don't delete it.
const WeaponOverlayFrame *getFrame(unsigned int type,
- unsigned int direction,
+ Direction direction,
unsigned int frame) const {
if (type >= _overlay.size())
return nullptr;
- if (direction >= _overlay[type]._dirCount)
+
+ uint32 diroff;
+ if (_overlay[type]._dirCount == 8)
+ diroff = static_cast<uint32>(direction) / 2;
+ else
+ diroff = static_cast<uint32>(direction);
+
+ if (diroff >= _overlay[type]._dirCount)
return nullptr;
- if (frame >= _overlay[type]._frames[direction].size())
+ if (frame >= _overlay[type]._frames[diroff].size())
return nullptr;
- return &(_overlay[type]._frames[direction][frame]);
+ return &(_overlay[type]._frames[diroff][frame]);
}
Std::vector<WeaponOverlay> _overlay;
diff --git a/engines/ultima/ultima8/world/crosshair_process.cpp b/engines/ultima/ultima8/world/crosshair_process.cpp
index 3c25519cc7..f395085f0d 100644
--- a/engines/ultima/ultima8/world/crosshair_process.cpp
+++ b/engines/ultima/ultima8/world/crosshair_process.cpp
@@ -58,9 +58,9 @@ void CrosshairProcess::run() {
// for now just put it at 3/4 avatar height which is about right.
cz += az / 4;
// TODO: Get the fine angle of the avatar once that is implemented.
- uint16 dir = (mainactor->getDir() + 2) % 8;
+ uint16 dir = (mainactor->getDir() + 4) % 16;
// Dir is 0~7, convert to 0~15/8*pi
- float angle = (3.14 * dir / 4.0);
+ float angle = (3.14 * dir / 8.0);
float xoff = CROSSHAIR_DIST * cos(angle);
float yoff = CROSSHAIR_DIST * sin(angle);
cx -= static_cast<int32>(xoff);
Commit: 473d13d5b7ee396c6fb53d59a2d93b57915aae2e
https://github.com/scummvm/scummvm/commit/473d13d5b7ee396c6fb53d59a2d93b57915aae2e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00
Commit Message:
ULTIMA8: Fix combat turns by removing duplicate wrong code.
Changed paths:
engines/ultima/ultima8/world/actors/combat_process.cpp
diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index fed0fad6d2..ebdc499091 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -249,35 +249,10 @@ void CombatProcess::turnToDirection(Direction direction) {
Actor *a = getActor(_itemNum);
if (!a)
return;
- Direction curdir = a->getDir();
- int stepDelta = Direction_GetShorterTurnDelta(curdir, direction);
- Animation::Sequence turnanim = Animation::combatStand;
-
- ProcId prevpid = 0;
- bool done = false;
-
- DirectionMode mode = a->animDirMode(turnanim);
- // slight hack - avoid making 8-step turns if our target is a 16-step direction
- // - we'll never get to the right direction that way.
- if (static_cast<uint32>(direction) % 2) {
- mode = dirmode_16dirs;
- }
-
- for (Direction dir = curdir; dir != direction; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
- ProcId animpid = a->doAnim(turnanim, dir);
-
- if (dir == direction) done = true;
-
- if (prevpid) {
- Process *proc = Kernel::get_instance()->getProcess(animpid);
- assert(proc);
- proc->waitFor(prevpid);
- }
-
- prevpid = animpid;
- }
-
- if (prevpid) waitFor(prevpid);
+ assert(a->isInCombat());
+ uint16 waitpid = a->turnTowardDir(direction);
+ if (waitpid)
+ waitFor(waitpid);
}
bool CombatProcess::inAttackRange() const {
Commit: c479540be1e98da9a1d618a7f6e50be72249e733
https://github.com/scummvm/scummvm/commit/c479540be1e98da9a1d618a7f6e50be72249e733
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:41:05+09:00
Commit Message:
DEVTOOLS: ULTIMA8: Add overlay data for remorse weapons.
Changed paths:
devtools/create_ultima/files/ultima8/remorse.ini
devtools/create_ultima/files/ultima8/remorseweapons.ini
diff --git a/devtools/create_ultima/files/ultima8/remorse.ini b/devtools/create_ultima/files/ultima8/remorse.ini
index b2c1d09718..ab42bb783c 100644
--- a/devtools/create_ultima/files/ultima8/remorse.ini
+++ b/devtools/create_ultima/files/ultima8/remorse.ini
@@ -1,4 +1,4 @@
[fontleads]
6=0,3
12=0,1
-13=-1,1
+13=-1,-1
diff --git a/devtools/create_ultima/files/ultima8/remorseweapons.ini b/devtools/create_ultima/files/ultima8/remorseweapons.ini
index 504ed1b04c..7db78ebf99 100644
--- a/devtools/create_ultima/files/ultima8/remorseweapons.ini
+++ b/devtools/create_ultima/files/ultima8/remorseweapons.ini
@@ -6,6 +6,8 @@ ammo_type=0
damage_type=0x0B
display_shape=3
display_frame=2
+overlay_shape=0x01A1
+overlay=0
[BA-41]
shape=0x032F
@@ -14,6 +16,8 @@ ammo_type=1
damage_type=0x0B
display_shape=3
display_frame=1
+overlay_shape=0x01A1
+overlay=0
[PA-21]
shape=0x0330
@@ -22,6 +26,8 @@ ammo_type=0
damage_type=0x05
display_shape=3
display_frame=7
+overlay_shape=0x036D
+overlay=0
[EM-4]
shape=0x038C
@@ -30,6 +36,8 @@ ammo_type=0
damage_type=0x0F
display_shape=3
display_frame=3
+overlay_shape=0x036F
+overlay=0
[SG-A1]
shape=0x0332
@@ -38,6 +46,8 @@ ammo_type=2
damage_type=0x02
display_shape=3
display_frame=0
+overlay_shape=0x033B
+overlay=0
[RP-22]
shape=0x0333
@@ -46,6 +56,8 @@ ammo_type=3
damage_type=0x01
display_shape=3
display_frame=6
+overlay_shape=0x036F
+overlay=0
[RP-32]
shape=0x0334
@@ -54,6 +66,8 @@ ammo_type=3
damage_type=0x01
display_shape=3
display_frame=5
+overlay_shape=0x036F
+overlay=0
[AR-7]
shape=0x038E
@@ -62,6 +76,8 @@ ammo_type=4
damage_type=0x0A
display_shape=3
display_frame=0xC
+overlay_shape=0x036E
+overlay=0
[GL-303]
shape=0x0388
@@ -70,6 +86,8 @@ ammo_type=5
damage_type=0x03
display_shape=3
display_frame=8
+overlay_shape=0x036E
+overlay=0
[PA-31]
shape=0x038A
@@ -78,6 +96,8 @@ ammo_type=0
damage_type=0x05
display_shape=3
display_frame=9
+overlay_shape=0x036F
+overlay=0
[PL-1]
shape=0x038D
@@ -86,6 +106,8 @@ ammo_type=0
damage_type=0x06
display_shape=3
display_frame=0xA
+overlay_shape=0x036E
+overlay=0
[AC-88]
shape=0x038B
@@ -94,6 +116,8 @@ ammo_type=2
damage_type=0x0D
display_shape=3
display_frame=4
+overlay_shape=0x036E
+overlay=0
[UV-9]
shape=0x0386
@@ -102,6 +126,8 @@ ammo_type=0
damage_type=0x0E
display_shape=3
display_frame=0xB
+overlay_shape=0x036E
+overlay=0
# Ammo
[BA-41 CLIP]
Commit: ffee0ffdd99457f77317ac2606bf837bc2c16cd2
https://github.com/scummvm/scummvm/commit/ffee0ffdd99457f77317ac2606bf837bc2c16cd2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-30T11:43:31+09:00
Commit Message:
ULTIMA8: Fix surrendering and weapon overlays in Crusader
Changed paths:
engines/ultima/ultima8/graphics/anim_dat.cpp
engines/ultima/ultima8/graphics/anim_dat.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/actor.h
engines/ultima/ultima8/world/actors/animation.h
engines/ultima/ultima8/world/actors/animation_tracker.cpp
engines/ultima/ultima8/world/actors/main_actor.cpp
engines/ultima/ultima8/world/actors/surrender_process.cpp
diff --git a/engines/ultima/ultima8/graphics/anim_dat.cpp b/engines/ultima/ultima8/graphics/anim_dat.cpp
index a0f63af529..9890083fa2 100644
--- a/engines/ultima/ultima8/graphics/anim_dat.cpp
+++ b/engines/ultima/ultima8/graphics/anim_dat.cpp
@@ -58,7 +58,7 @@ const AnimAction *AnimDat::getAnim(uint32 shape, uint32 action) const {
return _anims[shape]->getAction(action);
}
-uint32 AnimDat::getActionNumberForSequence(Animation::Sequence action) {
+uint32 AnimDat::getActionNumberForSequence(Animation::Sequence action, const Actor *actor) {
if (GAME_IS_U8) {
return static_cast<uint32>(action);
} else {
@@ -101,9 +101,9 @@ uint32 AnimDat::getActionNumberForSequence(Animation::Sequence action) {
return 46; // 47 is knee with a larger weapon
// 48 is nothing for avatar
case Animation::lookLeft:
- return 0x3c;
+ return 0;
case Animation::lookRight:
- return 0x3c;
+ return 0;
default:
return static_cast<uint32>(action);;
}
diff --git a/engines/ultima/ultima8/graphics/anim_dat.h b/engines/ultima/ultima8/graphics/anim_dat.h
index 3de05f95bd..460fdf7b26 100644
--- a/engines/ultima/ultima8/graphics/anim_dat.h
+++ b/engines/ultima/ultima8/graphics/anim_dat.h
@@ -31,6 +31,7 @@ namespace Ultima8 {
struct AnimAction;
class ActorAnim;
+class Actor;
class AnimDat {
public:
@@ -42,8 +43,8 @@ public:
const ActorAnim *getAnim(uint32 shape) const;
const AnimAction *getAnim(uint32 shape, uint32 action) const;
- //! Return the action number for a given animation sequence
- static uint32 getActionNumberForSequence(Animation::Sequence action);
+ //! Return the action number for a given animation sequence on the given actor
+ static uint32 getActionNumberForSequence(Animation::Sequence action, const Actor *actor);
private:
Std::vector<ActorAnim *> _anims;
};
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index d30b86db6f..277627f0b6 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -559,6 +559,7 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
Direction curdir = getDir();
bool combat = isInCombat() && !combatRun;
Animation::Sequence standanim = Animation::stand;
+ bool surrendered = hasActorFlags(Actor::ACT_SURRENDERED);
int stepDelta = Direction_GetShorterTurnDelta(curdir, targetdir);
Animation::Sequence turnanim;
@@ -571,6 +572,9 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
if (combat) {
turnanim = Animation::combatStand;
standanim = Animation::combatStand;
+ } else if (surrendered) {
+ turnanim = Animation::surrenderStand;
+ standanim = Animation::surrenderStand;
}
ProcId prevpid = 0;
@@ -579,13 +583,16 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
// our current direction to the new one
DirectionMode mode = animDirMode(turnanim);
- // slight hack - avoid making 8-step turns if our target is a 16-step direction
- // - we'll never get to the right direction that way.
- if (static_cast<uint32>(targetdir) % 2) {
+ // slight hack - avoid making 8-step turns if we need to swap
+ // to/from a 16-step direction - we'll never get to the right
+ // direction that way.
+ if (static_cast<uint32>(targetdir) % 2 !=
+ static_cast<uint32>(curdir) % 2) {
mode = dirmode_16dirs;
}
- for (Direction dir = curdir; dir != targetdir; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
+ bool done = false;
+ for (Direction dir = curdir; !done; dir = Direction_TurnByDelta(dir, stepDelta, mode)) {
ProcId animpid = doAnim(turnanim, dir);
if (prevpid) {
@@ -594,14 +601,18 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
proc->waitFor(prevpid);
}
+ done = (dir == targetdir);
prevpid = animpid;
}
- ProcId animpid = doAnim(standanim, targetdir);
- if (prevpid) {
- Process *proc = Kernel::get_instance()->getProcess(animpid);
- assert(proc);
- proc->waitFor(prevpid);
+ ProcId animpid = prevpid;
+ if (turnanim != standanim) {
+ animpid = doAnim(standanim, targetdir);
+ if (prevpid) {
+ Process *proc = Kernel::get_instance()->getProcess(animpid);
+ assert(proc);
+ proc->waitFor(prevpid);
+ }
}
return animpid;
diff --git a/engines/ultima/ultima8/world/actors/actor.h b/engines/ultima/ultima8/world/actors/actor.h
index 3abaa4e9cc..57a13af098 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -343,6 +343,7 @@ public:
ACT_FIRSTSTEP = 0x000400, // flags from npcdata byte 0x2F
ACT_INCOMBAT = 0x000800,
ACT_DEAD = 0x001000,
+ ACT_SURRENDERED = 0x002000, // not the same bit as used in Crusader, but we use this because it's empty.
ACT_COMBATRUN = 0x008000,
ACT_AIRWALK = 0x010000, // flags from npcdata byte 0x30
diff --git a/engines/ultima/ultima8/world/actors/animation.h b/engines/ultima/ultima8/world/actors/animation.h
index 3e6f7169cd..d5795e5aa5 100644
--- a/engines/ultima/ultima8/world/actors/animation.h
+++ b/engines/ultima/ultima8/world/actors/animation.h
@@ -111,7 +111,8 @@ enum Sequence {
kneelAndFire2 = 42,
kneelAndFire3 = 43,
runWithLargeWeapon = 50,
- surrender = 57
+ surrender = 57,
+ surrenderStand = 60
};
enum Result {
diff --git a/engines/ultima/ultima8/world/actors/animation_tracker.cpp b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
index 286459df72..d1165e565d 100644
--- a/engines/ultima/ultima8/world/actors/animation_tracker.cpp
+++ b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
@@ -64,7 +64,7 @@ bool AnimationTracker::init(const Actor *actor, Animation::Sequence action,
assert(actor);
_actor = actor->getObjId();
uint32 shape = actor->getShape();
- uint32 actionnum = AnimDat::getActionNumberForSequence(action);
+ uint32 actionnum = AnimDat::getActionNumberForSequence(action, actor);
_animAction = GameData::get_instance()->getMainShapes()->
getAnim(shape, actionnum);
if (!_animAction)
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index 609ccbd1e4..c7802041a8 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -36,6 +36,7 @@
#include "ultima/ultima8/conf/setting_manager.h"
#include "ultima/ultima8/kernel/core_app.h"
#include "ultima/ultima8/games/game_data.h"
+#include "ultima/ultima8/graphics/anim_dat.h"
#include "ultima/ultima8/graphics/wpn_ovlay_dat.h"
#include "ultima/ultima8/graphics/shape_info.h"
#include "ultima/ultima8/gumps/cru_pickup_area_gump.h"
@@ -572,6 +573,8 @@ void MainActor::getWeaponOverlay(const WeaponOverlayFrame *&frame_, uint32 &shap
if (!isInCombat() && _lastAnim != Animation::unreadyWeapon) return;
+ uint32 action = AnimDat::getActionNumberForSequence(_lastAnim, this);
+
ObjId weaponid;
if (GAME_IS_U8)
weaponid = getEquip(ShapeInfo::SE_WEAPON);
@@ -590,7 +593,7 @@ void MainActor::getWeaponOverlay(const WeaponOverlayFrame *&frame_, uint32 &shap
shape_ = weaponinfo->_overlayShape;
WpnOvlayDat *wpnovlay = GameData::get_instance()->getWeaponOverlay();
- frame_ = wpnovlay->getOverlayFrame(_lastAnim, weaponinfo->_overlayType,
+ frame_ = wpnovlay->getOverlayFrame(action, weaponinfo->_overlayType,
_direction, _animFrame);
if (frame_ == 0) shape_ = 0;
diff --git a/engines/ultima/ultima8/world/actors/surrender_process.cpp b/engines/ultima/ultima8/world/actors/surrender_process.cpp
index 0a69bce050..c4a9d0c68e 100644
--- a/engines/ultima/ultima8/world/actors/surrender_process.cpp
+++ b/engines/ultima/ultima8/world/actors/surrender_process.cpp
@@ -78,25 +78,21 @@ void SurrenderProcess::run() {
return;
}
+ a->setActorFlag(Actor::ACT_SURRENDERED);
+
Direction curdir = a->getDir();
Direction direction = a->getDirToItemCentre(*main);
if (curdir != direction) {
- Animation::Sequence turnanim;
- Direction nextdir;
- if (Direction_GetShorterTurnDelta(curdir, direction) == -1) {
- nextdir = Direction_OneLeft(curdir, dirmode_8dirs);
- turnanim = Animation::lookLeft;
- } else {
- nextdir = Direction_OneRight(curdir, dirmode_8dirs);
- turnanim = Animation::lookRight;
+ uint16 animpid = a->turnTowardDir(direction);
+ if (animpid) {
+ waitFor(animpid);
+ return;
}
- ProcId animpid = a->doAnim(turnanim, nextdir);
- waitFor(animpid);
- return;
}
if (_playedSound || a->getRangeIfVisible(*main) == 0)
+ // Nothing to do.
return;
int16 soundno = -1;
More information about the Scummvm-git-logs
mailing list