[Scummvm-git-logs] scummvm master -> ddc26b2ded6b054d5bac0c6c3e670da5d6e63e51
mduggan
noreply at scummvm.org
Sun Jan 2 10:45:55 UTC 2022
This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
4b5d85d215 ULTIMA8: Rename ATTACK_PROCESS_TYPE to ATTACK_PROC_TYPE
0f6897c0b1 ULTIMA8: Add Crusader short jump on tab key
04327d03f4 ULTIMA8: Remove some unused varaiable warnings
5892b8c05d ULTIMA8: Intrinsic calling convention cleanups
cf859e68f9 ULTIMA: Fix some unused variable warnings
ddc26b2ded ULTIMA8: Clean up lookleft/lookright animations
Commit: 4b5d85d2150eb977dcefffda36305c876555e76a
https://github.com/scummvm/scummvm/commit/4b5d85d2150eb977dcefffda36305c876555e76a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-02T19:26:46+09:00
Commit Message:
ULTIMA8: Rename ATTACK_PROCESS_TYPE to ATTACK_PROC_TYPE
For consistency with other proc type constant names.
Changed paths:
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/attack_process.cpp
engines/ultima/ultima8/world/actors/attack_process.h
engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 53a5a10a2be..1cb14931c88 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -793,7 +793,7 @@ uint16 Actor::setActivityCru(int activity) {
0x255, // PaceProcess
0x257, // LoiterProcess
// 0x258, // Stand Process (we don't have a process for this)
- AttackProcess::ATTACK_PROCESS_TYPE,
+ AttackProcess::ATTACK_PROC_TYPE,
0x25e, // GuardProcess
0x25f // SurrenderProcess
};
@@ -1047,7 +1047,7 @@ void Actor::receiveHitCru(uint16 other, Direction dir, int damage, uint16 damage
if (!(getRandom() % 3)) {
// Randomly stun the NPC for these damage types.
// CHECK ME: is this time accurate?
- Process *attack = kernel->findProcess(_objId, AttackProcess::ATTACK_PROCESS_TYPE);
+ Process *attack = kernel->findProcess(_objId, AttackProcess::ATTACK_PROC_TYPE);
uint stun = ((getRandom() % 10) + 8) * 60;
if (attack && stun) {
Process *delay = new DelayProcess(stun);
@@ -1775,7 +1775,7 @@ CombatProcess *Actor::getCombatProcess() const {
}
AttackProcess *Actor::getAttackProcess() const {
- Process *p = Kernel::get_instance()->findProcess(_objId, AttackProcess::ATTACK_PROCESS_TYPE);
+ Process *p = Kernel::get_instance()->findProcess(_objId, AttackProcess::ATTACK_PROC_TYPE);
if (!p)
return nullptr;
AttackProcess *ap = dynamic_cast<AttackProcess *>(p);
diff --git a/engines/ultima/ultima8/world/actors/attack_process.cpp b/engines/ultima/ultima8/world/actors/attack_process.cpp
index f707663c302..5fbad9bfd3d 100644
--- a/engines/ultima/ultima8/world/actors/attack_process.cpp
+++ b/engines/ultima/ultima8/world/actors/attack_process.cpp
@@ -74,7 +74,7 @@ static const int16 REG_SFX_15[] = { 0x1E7, 0x1E8, 0x1E9, 0x1EA, 0x1ED };
// read from the data array.
static const int MAGIC_DATA_OFF = 33000;
-const uint16 AttackProcess::ATTACK_PROCESS_TYPE = 0x259;
+const uint16 AttackProcess::ATTACK_PROC_TYPE = 0x259;
int16 AttackProcess::_lastAttackSound = -1;
int16 AttackProcess::_lastLastAttackSound = -1;
@@ -168,7 +168,7 @@ _soundTimestamp(0), _soundDelayTicks(480), _fireTimestamp(0) {
}
}
- _type = ATTACK_PROCESS_TYPE;
+ _type = ATTACK_PROC_TYPE;
setTacticNo(actor->getCombatTactic());
actor->setToStartOfAnim(Animation::stand);
diff --git a/engines/ultima/ultima8/world/actors/attack_process.h b/engines/ultima/ultima8/world/actors/attack_process.h
index 5407d810fa2..d223c42fc29 100644
--- a/engines/ultima/ultima8/world/actors/attack_process.h
+++ b/engines/ultima/ultima8/world/actors/attack_process.h
@@ -84,7 +84,7 @@ public:
bool loadData(Common::ReadStream *rs, uint32 version);
void saveData(Common::WriteStream *ws) override;
- static const uint16 ATTACK_PROCESS_TYPE;
+ static const uint16 ATTACK_PROC_TYPE;
private:
/** Set the current tactic in use from the combat.dat file. If 0,
* will use the genericAttack function. */
diff --git a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
index 6bb05bb1223..b298cae7fe0 100644
--- a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
@@ -250,7 +250,7 @@ Direction CruPathfinderProcess::nextDirFromPoint(struct Point3 &npcpt) {
bool is_controlled = World::get_instance()->getControlledNPCNum() == _itemNum;
if (npc->isInCombat() && !is_controlled) {
AttackProcess *attackproc = dynamic_cast<AttackProcess *>
- (Kernel::get_instance()->findProcess(_itemNum, AttackProcess::ATTACK_PROCESS_TYPE));
+ (Kernel::get_instance()->findProcess(_itemNum, AttackProcess::ATTACK_PROC_TYPE));
if (attackproc) {
const Actor *target = getActor(attackproc->getTarget());
if (target && npc->isOnScreen() && npc->fireDistance(target, dirtotarget, 0, 0, 0)) {
Commit: 0f6897c0b1bc8eee03a97216434fbf5d44ec83a3
https://github.com/scummvm/scummvm/commit/0f6897c0b1bc8eee03a97216434fbf5d44ec83a3
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-02T19:45:10+09:00
Commit Message:
ULTIMA8: Add Crusader short jump on tab key
This is a single-key jump. Because tab was previously used to highlight things
for debugging this also changes the default key for that.
Changed paths:
engines/ultima/ultima8/meta_engine.cpp
engines/ultima/ultima8/meta_engine.h
engines/ultima/ultima8/misc/debugger.cpp
engines/ultima/ultima8/misc/debugger.h
engines/ultima/ultima8/world/actors/avatar_mover_process.h
engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
diff --git a/engines/ultima/ultima8/meta_engine.cpp b/engines/ultima/ultima8/meta_engine.cpp
index 05d82170985..e3d05b81209 100644
--- a/engines/ultima/ultima8/meta_engine.cpp
+++ b/engines/ultima/ultima8/meta_engine.cpp
@@ -45,8 +45,8 @@ static const KeybindingRecord COMMON_KEYS[] = {
{ ACTION_LOAD, "LOAD", "Load Game", "GUIApp::loadGame", nullptr, "F7", nullptr },
{ ACTION_COMBAT, "COMBAT", "Combat", "MainActor::toggleCombat", nullptr, "c", "JOY_X" },
{ ACTION_MENU, "MENU", "Game Menu", "MenuGump::showMenu", nullptr, "ESCAPE", "JOY_Y" },
- { ACTION_HIGHLIGHT_ITEMS, "HIGHLIGHT_ITEMS", "Show Highlight Items", "GameMapGump::startHighlightItems", "GameMapGump::stopHighlightItems", "TAB", nullptr },
- { ACTION_TOGGLE_TOUCHING, "TOUCHING", "Show Touching Items", "GUIApp::toggleShowTouchingItems", nullptr, "h", nullptr },
+ { ACTION_HIGHLIGHT_ITEMS, "HIGHLIGHT_ITEMS", "Show Highlight Items", "GameMapGump::startHighlightItems", "GameMapGump::stopHighlightItems", "h", nullptr },
+ { ACTION_TOGGLE_TOUCHING, "TOUCHING", "Show Touching Items", "GUIApp::toggleShowTouchingItems", nullptr, "C+h", nullptr },
{ ACTION_TURN_LEFT, "TURN_LEFT", "Turn Left", "AvatarMoverProcess::startTurnLeft", "AvatarMoverProcess::stopTurnLeft", "LEFT", "KP4" },
{ ACTION_TURN_RIGHT, "TURN_RIGHT", "Turn Right", "AvatarMoverProcess::startTurnRight", "AvatarMoverProcess::stopTurnRight", "RIGHT", "KP6" },
{ ACTION_MOVE_FORWARD, "MOVE_FORWARD", "Move Forward", "AvatarMoverProcess::startMoveForward", "AvatarMoverProcess::stopMoveForward", "UP", "KP8" },
@@ -89,6 +89,7 @@ static const KeybindingRecord CRUSADER_KEYS[] = {
{ ACTION_ATTACK, "ATTACK", "Attack", "AvatarMoverProcess::startAttack", "AvatarMoverProcess::stopAttack", "SPACE", "KP0" },
{ ACTION_CAMERA_AVATAR, "CAMERA_AVATAR", "Focus Camera on Silencer", "CameraProcess::moveToAvatar", nullptr, "z", nullptr },
{ ACTION_JUMP, "JUMP", "Jump / Roll / Crouch", "AvatarMoverProcess::startJump", "AvatarMoverProcess::stopJump", "LCTRL", nullptr },
+ { ACTION_SHORT_JUMP, "SHORT_JUMP", "Short Jump", "AvatarMoverProcess::shortJump", nullptr, "TAB", nullptr },
// TODO: MOVE_STEP should also be mapped to KP_DIVIDE?? Actually original key was advance, slightly different
{ ACTION_MOVE_STEP, "MOVE_STEP", "Side Step / Advance / Retreat", "AvatarMoverProcess::startMoveStep", "AvatarMoverProcess::stopMoveStep", "LALT", "JOY_RIGHT_SHOULDER" },
{ ACTION_NONE, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }
diff --git a/engines/ultima/ultima8/meta_engine.h b/engines/ultima/ultima8/meta_engine.h
index 24d049d6c6f..5b6c5e00314 100644
--- a/engines/ultima/ultima8/meta_engine.h
+++ b/engines/ultima/ultima8/meta_engine.h
@@ -35,10 +35,11 @@ enum KeybindingAction {
ACTION_USE_INVENTORY, ACTION_USE_MEDIKIT, ACTION_USE_ENERGYCUBE,
ACTION_SELECT_ITEMS, ACTION_DETONATE_BOMB, ACTION_DROP_WEAPON,
ACTION_USE_SELECTION, ACTION_GRAB_ITEMS, ACTION_MENU, ACTION_CLOSE_GUMPS,
- ACTION_HIGHLIGHT_ITEMS, ACTION_TOGGLE_TOUCHING, ACTION_JUMP, ACTION_TURN_LEFT,
- ACTION_TURN_RIGHT, ACTION_MOVE_FORWARD, ACTION_MOVE_BACK, ACTION_MOVE_UP,
- ACTION_MOVE_DOWN, ACTION_MOVE_LEFT, ACTION_MOVE_RIGHT, ACTION_MOVE_RUN,
- ACTION_MOVE_STEP, ACTION_ATTACK, ACTION_CAMERA_AVATAR,
+ ACTION_HIGHLIGHT_ITEMS, ACTION_TOGGLE_TOUCHING, ACTION_JUMP,
+ ACTION_SHORT_JUMP, ACTION_TURN_LEFT, ACTION_TURN_RIGHT, ACTION_MOVE_FORWARD,
+ ACTION_MOVE_BACK, ACTION_MOVE_UP, ACTION_MOVE_DOWN, ACTION_MOVE_LEFT,
+ ACTION_MOVE_RIGHT, ACTION_MOVE_RUN, ACTION_MOVE_STEP, ACTION_ATTACK,
+ ACTION_CAMERA_AVATAR,
ACTION_CLIPPING, ACTION_DEC_SORT_ORDER,
ACTION_INC_SORT_ORDER, ACTION_QUICK_MOVE_ASCEND, ACTION_QUICK_MOVE_DESCEND,
diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index 5eca7d1e712..b9d8cf2df48 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -89,6 +89,7 @@ Debugger::Debugger() : Shared::Debugger() {
registerCmd("AvatarMoverProcess::startJump", WRAP_METHOD(Debugger, cmdStartJump));
registerCmd("AvatarMoverProcess::stopJump", WRAP_METHOD(Debugger, cmdStopJump));
+ registerCmd("AvatarMoverProcess::shortJump", WRAP_METHOD(Debugger, cmdShortJump));
registerCmd("AvatarMoverProcess::startTurnLeft", WRAP_METHOD(Debugger, cmdStartTurnLeft));
registerCmd("AvatarMoverProcess::startTurnRight", WRAP_METHOD(Debugger, cmdStartTurnRight));
registerCmd("AvatarMoverProcess::startMoveForward", WRAP_METHOD(Debugger, cmdStartMoveForward));
@@ -1263,6 +1264,17 @@ bool Debugger::cmdStopJump(int argc, const char **argv) {
return false;
}
+bool Debugger::cmdShortJump(int argc, const char **argv) {
+ Ultima8Engine *engine = Ultima8Engine::get_instance();
+
+ AvatarMoverProcess *proc = engine->getAvatarMoverProcess();
+ if (proc) {
+ proc->setMovementFlag(AvatarMoverProcess::MOVE_SHORT_JUMP);
+ }
+ return false;
+}
+
+
bool Debugger::cmdStartTurnLeft(int argc, const char **argv) {
Ultima8Engine *engine = Ultima8Engine::get_instance();
engine->moveKeyEvent();
diff --git a/engines/ultima/ultima8/misc/debugger.h b/engines/ultima/ultima8/misc/debugger.h
index ef78ee94ede..b2d541c4b1d 100644
--- a/engines/ultima/ultima8/misc/debugger.h
+++ b/engines/ultima/ultima8/misc/debugger.h
@@ -149,6 +149,7 @@ private:
// Avatar mover
bool cmdStartJump(int argc, const char **argv);
bool cmdStopJump(int argc, const char **argv);
+ bool cmdShortJump(int argc, const char **argv);
bool cmdStartTurnLeft(int argc, const char **argv);
bool cmdStartTurnRight(int argc, const char **argv);
bool cmdStartMoveForward(int argc, const char **argv);
diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.h b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
index 7f7f61dda12..bc880fc84ee 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.h
@@ -86,6 +86,8 @@ public:
MOVE_PENDING_TURN_LEFT = 0x2000,
MOVE_PENDING_TURN_RIGHT = 0x4000,
+ MOVE_SHORT_JUMP = 0x8000, // Crusader only
+
MOVE_ANY_DIRECTION = MOVE_MOUSE_DIRECTION | MOVE_FORWARD | MOVE_BACK | MOVE_LEFT | MOVE_RIGHT | MOVE_UP | MOVE_DOWN
};
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 d19d2d3785f..11964df0bf1 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -160,7 +160,11 @@ void CruAvatarMoverProcess::handleCombatMode() {
if (stasis)
return;
- if (hasMovementFlags(MOVE_FORWARD)) {
+ if (hasMovementFlags(MOVE_SHORT_JUMP)) {
+ clearMovementFlag(MOVE_SHORT_JUMP);
+ avatar->doAnim(Animation::jumpForward, direction);
+ return;
+ } else if (hasMovementFlags(MOVE_FORWARD)) {
Animation::Sequence nextanim;
if (hasMovementFlags(MOVE_STEP)) {
nextanim = avatar->isKneeling() ?
@@ -320,6 +324,12 @@ void CruAvatarMoverProcess::handleNormalMode() {
mainactor->toggleInCombat();
}
+ if (hasMovementFlags(MOVE_SHORT_JUMP)) {
+ clearMovementFlag(MOVE_SHORT_JUMP);
+ avatar->doAnim(Animation::jumpForward, direction);
+ return;
+ }
+
if (!hasMovementFlags(MOVE_ANY_DIRECTION) && lastanim == Animation::run) {
// if we were running, slow to a walk before stopping
// (even in stasis)
Commit: 04327d03f4e3329631f15550dd0430fbe946b51e
https://github.com/scummvm/scummvm/commit/04327d03f4e3329631f15550dd0430fbe946b51e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-02T19:45:31+09:00
Commit Message:
ULTIMA8: Remove some unused varaiable warnings
Changed paths:
engines/ultima/ultima8/ultima8.cpp
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 45a44773a0f..87718408982 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -94,6 +94,8 @@
#include "ultima/ultima8/gumps/shape_viewer_gump.h"
#include "ultima/ultima8/meta_engine.h"
+//#define PAINT_TIMING 1
+
namespace Ultima {
namespace Ultima8 {
@@ -597,24 +599,28 @@ bool Ultima8Engine::runGame() {
// Paint the _screen
void Ultima8Engine::paint() {
+#ifdef PAINT_TIMING
static long prev = 0;
static long t = 0;
static long tdiff = 0;
static long tpaint = 0;
long now = g_system->getMillis();
- if (!_screen) // need to worry if the graphics system has been started. Need nicer way.
- return;
-
if (prev != 0)
tdiff += now - prev;
prev = now;
++t;
+#endif
+
+ if (!_screen) // need to worry if the graphics system has been started. Need nicer way.
+ return;
// Begin _painting
_screen->BeginPainting();
+#ifdef PAINT_TIMING
tpaint -= g_system->getMillis();
+#endif
Rect r;
_screen->GetSurfaceDims(r);
@@ -627,8 +633,14 @@ void Ultima8Engine::paint() {
#endif
_desktopGump->Paint(_screen, _lerpFactor, false);
+#ifdef PAINT_TIMING
tpaint += g_system->getMillis();
+ if (t % 150 == 0) { // every ~5 seconds
+ debug("Ultima8Engine: Paint average %.03f millis", (float)tpaint / t);
+ }
+#endif
+
// Draw the mouse
_mouse->paint();
Commit: 5892b8c05d62c7da9f9a7f7c75bbbf5d333f00c6
https://github.com/scummvm/scummvm/commit/5892b8c05d62c7da9f9a7f7c75bbbf5d333f00c6
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-02T19:45:31+09:00
Commit Message:
ULTIMA8: Intrinsic calling convention cleanups
Previously x/y values were being divided and multiplied to get the right values
in Crusader with no explanation why. Add a small wrapper function to make it
explicit what is happening.
Also replace unused intrinsic variables with ARG_NULL to avoid unused variable
warnings in some newer gcc versions.
Changed paths:
A engines/ultima/ultima8/world/coord_utils.h
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/main_actor.cpp
engines/ultima/ultima8/world/camera_process.cpp
engines/ultima/ultima8/world/current_map.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/map.cpp
engines/ultima/ultima8/world/sprite_process.cpp
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 1cb14931c88..a2d00ec5b16 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -48,6 +48,7 @@
#include "ultima/ultima8/world/bobo_boomer_process.h"
#include "ultima/ultima8/world/world.h"
#include "ultima/ultima8/world/current_map.h"
+#include "ultima/ultima8/world/coord_utils.h"
#include "ultima/ultima8/world/sprite_process.h"
#include "ultima/ultima8/world/target_reticle_process.h"
#include "ultima/ultima8/world/item_selection_process.h"
@@ -2121,10 +2122,7 @@ uint32 Actor::I_teleport(const uint8 *args, unsigned int /*argsize*/) {
ARG_UINT16(newmap);
if (!actor) return 0;
- if (GAME_IS_CRUSADER) {
- newx *= 2;
- newy *= 2;
- }
+ World_FromUsecodeXY(newx, newy);
actor->teleport(newmap, newx, newy, newz);
return 0;
@@ -2134,8 +2132,8 @@ uint32 Actor::I_doAnim(const uint8 *args, unsigned int /*argsize*/) {
ARG_ACTOR_FROM_PTR(actor);
ARG_UINT16(anim);
ARG_UINT16(dir); // seems to be 0-8
- ARG_UINT16(unk1); // this is almost always 10000 in U8.Maybe speed-related?
- ARG_UINT16(unk2); // appears to be 0 or 1. Some flag?
+ ARG_NULL16(); // uint16? almost always 10000 in U8. Seems to be "priority" or something?
+ ARG_NULL16(); // uint16? appears to be 0 or 1. Some flag?
if (!actor) return 0;
@@ -2548,10 +2546,7 @@ uint32 Actor::I_pathfindToPoint(const uint8 *args, unsigned int /*argsize*/) {
ARG_NULL16(); // unknown. Only one instance of this in U8, values are 5,1.
if (!actor) return 0;
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
return Kernel::get_instance()->addProcess(
new PathfinderProcess(actor, x, y, z));
diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index 4e35363c059..596abbcb189 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -819,7 +819,7 @@ uint32 MainActor::I_teleportToEgg(const uint8 *args, unsigned int argsize) {
}
ARG_UINT16(teleport_id);
- ARG_UINT16(put_in_stasis); // 0/1
+ ARG_NULL16(); // TODO: put_in_stasis, 0/1
return Kernel::get_instance()->addProcess(
new TeleportToEggProcess(mapnum, teleport_id));
diff --git a/engines/ultima/ultima8/world/camera_process.cpp b/engines/ultima/ultima8/world/camera_process.cpp
index fab4e54c872..03aa5914312 100644
--- a/engines/ultima/ultima8/world/camera_process.cpp
+++ b/engines/ultima/ultima8/world/camera_process.cpp
@@ -22,6 +22,7 @@
#include "ultima/ultima8/world/camera_process.h"
#include "ultima/ultima8/world/world.h"
#include "ultima/ultima8/world/current_map.h"
+#include "ultima/ultima8/world/coord_utils.h"
#include "ultima/ultima8/world/actors/actor.h"
#include "ultima/ultima8/kernel/kernel.h"
#include "ultima/ultima8/ultima8.h"
@@ -337,13 +338,10 @@ uint32 CameraProcess::I_moveTo(const uint8 *args, unsigned int argsize) {
ARG_UINT16(y);
ARG_UINT8(z);
if (argsize > 6) {
- ARG_SINT16(unk);
+ ARG_NULL16(); // sint16? what is this?
}
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
CameraProcess::SetCameraProcess(new CameraProcess(x, y, z));
return 0;
}
@@ -360,13 +358,9 @@ uint32 CameraProcess::I_scrollTo(const uint8 *args, unsigned int /*argsize*/) {
ARG_UINT16(x);
ARG_UINT16(y);
ARG_UINT8(z);
- ARG_SINT16(unk);
-
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ ARG_NULL16(); // some uint16?
+ World_FromUsecodeXY(x, y);
return CameraProcess::SetCameraProcess(new CameraProcess(x, y, z, 25));
}
@@ -387,14 +381,14 @@ uint32 CameraProcess::I_getCameraX(const uint8 *args, unsigned int argsize) {
int32 x, y, z;
assert(GAME_IS_CRUSADER);
GetCameraLocation(x, y, z);
- return x / 2;
+ return World_ToUsecodeCoord(x);
}
uint32 CameraProcess::I_getCameraY(const uint8 *args, unsigned int argsize) {
int32 x, y, z;
assert(GAME_IS_CRUSADER);
GetCameraLocation(x, y, z);
- return y / 2;
+ return World_ToUsecodeCoord(y);
}
uint32 CameraProcess::I_getCameraZ(const uint8 *args, unsigned int argsize) {
diff --git a/engines/ultima/ultima8/world/coord_utils.h b/engines/ultima/ultima8/world/coord_utils.h
new file mode 100644
index 00000000000..31b55158ea5
--- /dev/null
+++ b/engines/ultima/ultima8/world/coord_utils.h
@@ -0,0 +1,77 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef ULTIMA8_WORLD_COORDUTILS_H
+#define ULTIMA8_WORLD_COORDUTILS_H
+
+#include "ultima/ultima8/ultima8.h"
+
+namespace Ultima {
+namespace Ultima8 {
+
+/**
+ * Convert from c++ code coordinates to usecode coordinates
+ */
+template<typename T>
+static inline void World_ToUsecodeXY(T &x, T &y) {
+ if (GAME_IS_CRUSADER) {
+ x /= 2;
+ y /= 2;
+ }
+}
+
+/**
+ * Convert from usecode coordinates to c++ code coordinates
+ */
+template<typename T>
+static inline void World_FromUsecodeXY(T &x, T &y) {
+ if (GAME_IS_CRUSADER) {
+ x *= 2;
+ y *= 2;
+ }
+}
+
+/**
+ * Convert a single x or y value from c++ coordinate to usecode coordinate
+ */
+template<typename T>
+static inline T World_ToUsecodeCoord(T v) {
+ if (GAME_IS_CRUSADER)
+ return v / 2;
+ else
+ return v;
+}
+
+/**
+ * Convert a single x or y value from usecode coordinate to c++ code coordinate
+ */
+template<typename T>
+static inline T World_FromUsecodeCoord(T v) {
+ if (GAME_IS_CRUSADER)
+ return v * 2;
+ else
+ return v;
+}
+
+}
+}
+
+#endif // ULTIMA8_WORLD_COORDUTILS_H
diff --git a/engines/ultima/ultima8/world/current_map.cpp b/engines/ultima/ultima8/world/current_map.cpp
index 3a90dd0edc8..54053cbe0f4 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -25,6 +25,7 @@
#include "ultima/ultima8/world/actors/actor.h"
#include "ultima/ultima8/world/world.h"
#include "ultima/ultima8/world/world_point.h"
+#include "ultima/ultima8/world/coord_utils.h"
#include "ultima/ultima8/usecode/uc_list.h"
#include "ultima/ultima8/usecode/uc_machine.h"
#include "ultima/ultima8/world/teleport_egg.h"
@@ -1354,15 +1355,12 @@ uint32 CurrentMap::I_canExistAt(const uint8 *args, unsigned int argsize) {
ARG_UINT8(z);
if (argsize > 8) {
//!! TODO: figure these out
- ARG_UINT16(unk1); // is either 1 or 4
- ARG_UINT16(unk2); // looks like it could be an objid
- ARG_UINT16(unk3); // always zero
+ ARG_NULL16(); // is either 1 or 4. moves?
+ ARG_NULL16(); // some objid?
+ ARG_NULL16(); // always zero
}
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
//
// TODO: The crusader version of this function actually checks by
@@ -1380,8 +1378,8 @@ uint32 CurrentMap::I_canExistAt(const uint8 *args, unsigned int argsize) {
}
uint32 CurrentMap::I_canExistAtPoint(const uint8 *args, unsigned int /*argsize*/) {
- ARG_UINT16(unk1);
- ARG_UINT16(unk2);
+ ARG_NULL16(); // unknown
+ ARG_NULL16(); // unknown
ARG_UINT16(shape);
ARG_WORLDPOINT(pt);
@@ -1392,10 +1390,7 @@ uint32 CurrentMap::I_canExistAtPoint(const uint8 *args, unsigned int /*argsize*/
int32 y = pt.getY();
int32 z = pt.getZ();
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
const CurrentMap *cm = World::get_instance()->getCurrentMap();
bool valid = cm->isValidPosition(x, y, z, shape, 0, 0, 0);
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 965911e4004..2ba3cad0cb0 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -34,6 +34,7 @@
#include "ultima/ultima8/graphics/shape_frame.h"
#include "ultima/ultima8/world/item_factory.h"
#include "ultima/ultima8/world/current_map.h"
+#include "ultima/ultima8/world/coord_utils.h"
#include "ultima/ultima8/world/fire_type.h"
#include "ultima/ultima8/misc/direction_util.h"
#include "ultima/ultima8/gumps/bark_gump.h"
@@ -2637,8 +2638,8 @@ bool Item::loadData(Common::ReadStream *rs, uint32 version) {
}
-uint32 Item::I_touch(const uint8 *args, unsigned int /*argsize*/) {
- ARG_NULL32(); // ARG_ITEM_FROM_PTR(item);
+uint32 Item::I_touch(const uint8 */*args*/, unsigned int /*argsize*/) {
+ //ARG_NULL32(); // ARG_ITEM_FROM_PTR(item);
// Guess: this is used to make sure an item is painted in the original.
// Our renderer is different, making this intrinsic unnecessary.
@@ -2652,10 +2653,7 @@ uint32 Item::I_getX(const uint8 *args, unsigned int /*argsize*/) {
int32 x, y, z;
item->getLocationAbsolute(x, y, z);
- if (GAME_IS_CRUSADER)
- return x / 2;
- else
- return x;
+ return World_ToUsecodeCoord(x);
}
uint32 Item::I_getY(const uint8 *args, unsigned int /*argsize*/) {
@@ -2664,10 +2662,7 @@ uint32 Item::I_getY(const uint8 *args, unsigned int /*argsize*/) {
int32 x, y, z;
item->getLocationAbsolute(x, y, z);
- if (GAME_IS_CRUSADER)
- return y / 2;
- else
- return y;
+ return World_ToUsecodeCoord(y);
}
uint32 Item::I_getZ(const uint8 *args, unsigned int /*argsize*/) {
@@ -2686,16 +2681,10 @@ uint32 Item::I_getCX(const uint8 *args, unsigned int /*argsize*/) {
int32 x, y, z;
item->getLocationAbsolute(x, y, z);
- int mul = 16;
- if (GAME_IS_CRUSADER) {
- x /= 2;
- mul /= 2;
- }
-
if (item->_flags & FLG_FLIPPED)
- return x - item->getShapeInfo()->_y * mul;
+ return World_ToUsecodeCoord(x - item->getShapeInfo()->_y * 16);
else
- return x - item->getShapeInfo()->_x * mul;
+ return World_ToUsecodeCoord(x - item->getShapeInfo()->_x * 16);
}
uint32 Item::I_getCY(const uint8 *args, unsigned int /*argsize*/) {
@@ -2705,16 +2694,10 @@ uint32 Item::I_getCY(const uint8 *args, unsigned int /*argsize*/) {
int32 x, y, z;
item->getLocationAbsolute(x, y, z);
- int mul = 16;
- if (GAME_IS_CRUSADER) {
- y /= 2;
- mul /= 2;
- }
-
if (item->_flags & FLG_FLIPPED)
- return y - item->getShapeInfo()->_x * mul;
+ return World_ToUsecodeCoord(y - item->getShapeInfo()->_x * 16);
else
- return y - item->getShapeInfo()->_y * mul;
+ return World_ToUsecodeCoord(y - item->getShapeInfo()->_y * 16);
}
uint32 Item::I_getCZ(const uint8 *args, unsigned int /*argsize*/) {
@@ -2735,10 +2718,7 @@ uint32 Item::I_getPoint(const uint8 *args, unsigned int /*argsize*/) {
int32 x, y, z;
item->getLocationAbsolute(x, y, z);
- if (GAME_IS_CRUSADER) {
- x /= 2;
- y /= 2;
- }
+ World_ToUsecodeXY(x, y);
WorldPoint point;
point.setX(x);
@@ -3154,10 +3134,7 @@ uint32 Item::I_legalCreateAtPoint(const uint8 *args, unsigned int /*argsize*/) {
int32 y = point.getY();
int32 z = point.getZ();
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
// check if item can exist
CurrentMap *cm = World::get_instance()->getCurrentMap();
@@ -3190,10 +3167,7 @@ uint32 Item::I_legalCreateAtCoords(const uint8 *args, unsigned int /*argsize*/)
ARG_UINT16(y);
ARG_UINT8(z);
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
// check if item can exist
CurrentMap *cm = World::get_instance()->getCurrentMap();
@@ -3224,7 +3198,7 @@ uint32 Item::I_legalCreateInCont(const uint8 *args, unsigned int /*argsize*/) {
ARG_UINT16(shape);
ARG_UINT16(frame);
ARG_CONTAINER_FROM_ID(container);
- ARG_UINT16(unknown); // ?
+ ARG_NULL16(); // unknown
uint8 buf[2];
buf[0] = 0;
@@ -3465,9 +3439,8 @@ uint32 Item::I_popToCoords(const uint8 *args, unsigned int /*argsize*/) {
return 0; // top item was invalid
}
+ World_FromUsecodeXY(x, y);
if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
// HACK!! DEATHFL::ordinal20 has a hack to add 1 to z for the death
// animation (falling into acid), but then our animation tracker
// detects a fall and stops animating. Fight hacks with hacks..
@@ -3583,10 +3556,7 @@ uint32 Item::I_move(const uint8 *args, unsigned int /*argsize*/) {
return 0;
//! What should this do to ethereal items?
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
#if 0
perr << "Moving item: " << item->getShape() << "," << item->getFrame() << " to (" << x << "," << y << "," << z << ")" << Std::endl;
@@ -3600,16 +3570,13 @@ uint32 Item::I_legalMoveToPoint(const uint8 *args, unsigned int argsize) {
ARG_ITEM_FROM_PTR(item);
ARG_WORLDPOINT(point);
ARG_UINT16(move_if_blocked); // 0/1
- ARG_UINT16(unknown2); // always 0
+ ARG_NULL16(); // always 0
int32 x = point.getX();
int32 y = point.getY();
int32 z = point.getZ();
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
if (!item)
return 0;
@@ -3646,7 +3613,7 @@ uint32 Item::I_legalMoveToPoint(const uint8 *args, unsigned int argsize) {
uint32 Item::I_legalMoveToContainer(const uint8 *args, unsigned int /*argsize*/) {
ARG_ITEM_FROM_PTR(item);
ARG_CONTAINER_FROM_PTR(container);
- ARG_UINT16(unknown); // always 0
+ ARG_NULL16(); // always 0
if (!item || !container) return 0; // shouldn't happen?
// try to move item to container checking weight and volume
@@ -3700,10 +3667,7 @@ uint32 Item::I_getDirToCoords(const uint8 *args, unsigned int /*argsize*/) {
ARG_UINT16(y);
if (!item) return 0;
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
int32 ix, iy, iz;
item->getLocationAbsolute(ix, iy, iz);
@@ -3717,10 +3681,7 @@ uint32 Item::I_getDirFromCoords(const uint8 *args, unsigned int /*argsize*/) {
ARG_UINT16(y);
if (!item) return 0;
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
int32 ix, iy, iz;
item->getLocationAbsolute(ix, iy, iz);
@@ -4054,7 +4015,9 @@ uint32 Item::I_fireWeapon(const uint8 *args, unsigned int /*argsize*/) {
if (!item) return 0;
- return item->fireWeapon(x * 2, y * 2, z, Direction_FromUsecodeDir(dir), firetype, findtarget != 0);
+ World_FromUsecodeXY(x, y);
+
+ return item->fireWeapon(x, y, z, Direction_FromUsecodeDir(dir), firetype, findtarget != 0);
}
uint32 Item::I_fireDistance(const uint8 *args, unsigned int /*argsize*/) {
@@ -4069,7 +4032,8 @@ uint32 Item::I_fireDistance(const uint8 *args, unsigned int /*argsize*/) {
if (!item || !otheritem) return 0;
- return item->fireDistance(otheritem, Direction_FromUsecodeDir(dir), xoff * 2, yoff * 2, zoff);
+ World_FromUsecodeXY(xoff, yoff);
+ return item->fireDistance(otheritem, Direction_FromUsecodeDir(dir), xoff, yoff, zoff);
}
} // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/world/map.cpp b/engines/ultima/ultima8/world/map.cpp
index a4fe4d7627d..8b93e9c7ad2 100644
--- a/engines/ultima/ultima8/world/map.cpp
+++ b/engines/ultima/ultima8/world/map.cpp
@@ -23,6 +23,7 @@
#include "ultima/ultima8/world/map.h"
#include "ultima/ultima8/world/item_factory.h"
#include "ultima/ultima8/world/container.h"
+#include "ultima/ultima8/world/coord_utils.h"
#include "ultima/ultima8/kernel/object_manager.h"
#include "ultima/ultima8/ultima8.h"
#include "ultima/ultima8/games/game_data.h"
@@ -219,10 +220,7 @@ void Map::loadFixedFormatObjects(Std::list<Item *> &itemlist,
int32 y = static_cast<int32>(rs->readUint16LE());
int32 z = static_cast<int32>(rs->readByte());
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
uint32 shape = rs->readUint16LE();
uint32 frame = rs->readByte();
diff --git a/engines/ultima/ultima8/world/sprite_process.cpp b/engines/ultima/ultima8/world/sprite_process.cpp
index 9a5b568125c..2819aa688b9 100644
--- a/engines/ultima/ultima8/world/sprite_process.cpp
+++ b/engines/ultima/ultima8/world/sprite_process.cpp
@@ -20,6 +20,7 @@
*/
#include "ultima/ultima8/world/sprite_process.h"
+#include "ultima/ultima8/world/coord_utils.h"
#include "ultima/ultima8/world/item_factory.h"
#include "ultima/ultima8/world/item.h"
#include "ultima/ultima8/kernel/kernel.h"
@@ -105,7 +106,7 @@ uint32 SpriteProcess::I_createSprite(const uint8 *args, unsigned int argsize) {
ARG_SINT16(lastFrame);
if (argsize == 18) {
- ARG_SINT16(unknown);
+ ARG_NULL16(); // unknown
ARG_SINT16(repeats_count);
repeats = repeats_count;
}
@@ -115,10 +116,7 @@ uint32 SpriteProcess::I_createSprite(const uint8 *args, unsigned int argsize) {
ARG_UINT16(y);
ARG_UINT8(z);
- if (GAME_IS_CRUSADER) {
- x *= 2;
- y *= 2;
- }
+ World_FromUsecodeXY(x, y);
Process *p = new SpriteProcess(shape, frame, lastFrame, repeats, delay, x, y, z);
return Kernel::get_instance()->addProcess(p);
Commit: cf859e68f9d499faf7d24dc5d6f24010acce59e6
https://github.com/scummvm/scummvm/commit/cf859e68f9d499faf7d24dc5d6f24010acce59e6
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-02T19:45:31+09:00
Commit Message:
ULTIMA: Fix some unused variable warnings
Changed paths:
engines/ultima/nuvie/views/container_widget.cpp
engines/ultima/nuvie/views/doll_widget.cpp
engines/ultima/nuvie/views/inventory_widget.cpp
engines/ultima/ultima4/map/maploader.cpp
diff --git a/engines/ultima/nuvie/views/container_widget.cpp b/engines/ultima/nuvie/views/container_widget.cpp
index 74eaf73974c..15e0518729a 100644
--- a/engines/ultima/nuvie/views/container_widget.cpp
+++ b/engines/ultima/nuvie/views/container_widget.cpp
@@ -257,10 +257,10 @@ Obj *ContainerWidget::get_obj_at_location(int x, int y) {
}
// change container, ready/unready object, activate arrows
-GUI_status ContainerWidget::MouseUp(int x, int y, Shared::MouseButton button) {
+GUI_status ContainerWidget::MouseUp(int /*x*/, int /*y*/, Shared::MouseButton button) {
if (button == USE_BUTTON) {
- x -= area.left;
- y -= area.top;
+ //x -= area.left;
+ //y -= area.top;
if (selected_obj) {
// only act now if objects can't be used with DoubleClick
@@ -421,12 +421,12 @@ bool ContainerWidget::drag_accept_drop(int x, int y, int message, void *data) {
return false;
}
-void ContainerWidget::drag_perform_drop(int x, int y, int message, void *data) {
+void ContainerWidget::drag_perform_drop(int /*x*/, int /*y*/, int message, void *data) {
DEBUG(0, LEVEL_DEBUGGING, "ContainerWidget::drag_perform_drop()\n");
Obj *obj;
- x -= area.left;
- y -= area.top;
+ //x -= area.left;
+ //y -= area.top;
if (message == GUI_DRAG_OBJ) {
DEBUG(0, LEVEL_DEBUGGING, "Drop into inventory.\n");
diff --git a/engines/ultima/nuvie/views/doll_widget.cpp b/engines/ultima/nuvie/views/doll_widget.cpp
index 2ffafc7dd4b..bff68a5f00d 100644
--- a/engines/ultima/nuvie/views/doll_widget.cpp
+++ b/engines/ultima/nuvie/views/doll_widget.cpp
@@ -476,12 +476,12 @@ bool DollWidget::drag_accept_drop(int x, int y, int message, void *data) {
return false;
}
-void DollWidget::drag_perform_drop(int x, int y, int message, void *data) {
+void DollWidget::drag_perform_drop(int /*x*/, int /*y*/, int message, void *data) {
DEBUG(0, LEVEL_DEBUGGING, "DollWidget::drag_perform_drop()\n");
Obj *obj;
- x -= area.left;
- y -= area.top;
+ //x -= area.left;
+ //y -= area.top;
if (message == GUI_DRAG_OBJ) {
DEBUG(0, LEVEL_DEBUGGING, "Ready item.\n");
diff --git a/engines/ultima/nuvie/views/inventory_widget.cpp b/engines/ultima/nuvie/views/inventory_widget.cpp
index a132bacdc06..39916b1ca9a 100644
--- a/engines/ultima/nuvie/views/inventory_widget.cpp
+++ b/engines/ultima/nuvie/views/inventory_widget.cpp
@@ -562,12 +562,12 @@ bool InventoryWidget::drag_accept_drop(int x, int y, int message, void *data) {
return false;
}
-void InventoryWidget::drag_perform_drop(int x, int y, int message, void *data) {
+void InventoryWidget::drag_perform_drop(int /*x*/, int /*y*/, int message, void *data) {
DEBUG(0, LEVEL_DEBUGGING, "InventoryWidget::drag_perform_drop()\n");
Obj *obj;
- x -= area.left;
- y -= area.top;
+ //x -= area.left;
+ //y -= area.top;
if (message == GUI_DRAG_OBJ) {
DEBUG(0, LEVEL_DEBUGGING, "Drop into inventory.\n");
diff --git a/engines/ultima/ultima4/map/maploader.cpp b/engines/ultima/ultima4/map/maploader.cpp
index 3883cc978b3..9de39ee56fb 100644
--- a/engines/ultima/ultima4/map/maploader.cpp
+++ b/engines/ultima/ultima4/map/maploader.cpp
@@ -117,6 +117,8 @@ bool MapLoader::loadData(Map *map, Common::SeekableReadStream &f) {
}
}
+ debug(10, "MapLoader::loadData translation took %d ms", total);
+
return true;
}
Commit: ddc26b2ded6b054d5bac0c6c3e670da5d6e63e51
https://github.com/scummvm/scummvm/commit/ddc26b2ded6b054d5bac0c6c3e670da5d6e63e51
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2022-01-02T19:45:31+09:00
Commit Message:
ULTIMA8: Clean up lookleft/lookright animations
Having finally worked out what these animation numbers are, a lot of code makes
more sense. Refactored the absolute anim number code at the same time.
Changed paths:
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/animation.cpp
engines/ultima/ultima8/world/actors/animation.h
engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
engines/ultima/ultima8/world/actors/guard_process.cpp
engines/ultima/ultima8/world/gravity_process.cpp
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index a2d00ec5b16..45738302eb4 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -943,13 +943,15 @@ void Actor::receiveHitCru(uint16 other, Direction dir, int damage, uint16 damage
if (isBusy()) {
ActorAnimProcess *proc = dynamic_cast<ActorAnimProcess *>(Kernel::get_instance()->findProcess(_objId, ActorAnimProcess::ACTOR_ANIM_PROC_TYPE));
Animation::Sequence action = proc->getAction();
- if (action == Animation::teleportIn || action == Animation::teleportOut || action == Animation::teleportInReplacement || action == Animation::teleportOutReplacement)
+ if (action == Animation::teleportIn || action == Animation::teleportOut ||
+ action == Animation::absAnim(Animation::teleportIn) ||
+ action == Animation::absAnim(Animation::teleportOut))
return;
currentanim = proc->getPid();
}
- ProcId teleout = doAnimAfter(Animation::teleportOutReplacement, dir_current, currentanim);
- doAnimAfter(Animation::teleportInReplacement, dir_current, teleout);
+ ProcId teleout = doAnimAfter(Animation::absAnim(Animation::teleportOut), dir_current, currentanim);
+ doAnimAfter(Animation::absAnim(Animation::teleportIn), dir_current, teleout);
int newval = MAX(0, static_cast<int>(world->getVargasShield()) - damage);
world->setVargasShield(static_cast<uint32>(newval));
return;
@@ -1070,7 +1072,7 @@ void Actor::tookHitCru() {
if (!audio)
return;
- if (lastanim == Animation::unknownAnim30 || lastanim == Animation::startRunLargeWeapon) {
+ if (lastanim == Animation::lookLeftCru || lastanim == Animation::lookRightCru) {
if (canSeeControlledActor(true)) {
if (getRandom() % 4)
setActivity(5);
@@ -1879,27 +1881,26 @@ bool Actor::canSeeControlledActor(bool forcombat) {
Direction dirtocontrolled = getDirToItemCentre(*controlled);
Direction curdir = getDir();
- /* TODO: There are extra checks in here in the original
if (forcombat) {
- Animation::Sequence lastanim = getLastAnim();
- ((lastanim == Animation::unknownAnim30 || lastanim == Animation::startRunLargeWeapon) && currentAnimFrame > 1)) {
- bool left;
- if (lastanim == Animation::unknownAnim30) {
- left = false;
- if (((currentdir != 8) && (currentdir != 10)) && (currentdir != 0xc))
- left = true;
- } else {
- left = true;
- if (((currentdir != 8) && (currentdir != 10)) && (currentdir != 0xc)) {
+ Animation::Sequence lastanim = getLastAnim();
+ if ((lastanim == Animation::lookLeftCru || lastanim == Animation::lookRightCru) && _animFrame > 1) {
+ bool left;
+ if (lastanim == Animation::lookLeftCru) {
left = false;
- }
- if (leftflag) {
- currentdir = Direction_TurnByDelta(curdir, -4, dirmode_16dirs);
- } else {
- currentdir = Direction_TurnByDelta(curdir, 4, dirmode_16dirs);
- }
- }
- */
+ if (((curdir != 8) && (curdir != 10)) && (curdir != 0xc))
+ left = true;
+ } else {
+ left = true;
+ if (((curdir != 8) && (curdir != 10)) && (curdir != 0xc))
+ left = false;
+ }
+ if (left) {
+ curdir = Direction_TurnByDelta(curdir, -4, dirmode_16dirs);
+ } else {
+ curdir = Direction_TurnByDelta(curdir, 4, dirmode_16dirs);
+ }
+ }
+ }
if (dirtocontrolled == curdir ||
dirtocontrolled == Direction_OneLeft(curdir, dirmode_16dirs) ||
diff --git a/engines/ultima/ultima8/world/actors/animation.cpp b/engines/ultima/ultima8/world/actors/animation.cpp
index ed918e732e1..02fc7ecde47 100644
--- a/engines/ultima/ultima8/world/actors/animation.cpp
+++ b/engines/ultima/ultima8/world/actors/animation.cpp
@@ -86,7 +86,6 @@ bool isCombatAnimCru(const Sequence anim) {
case slideLeft:
case slideRight:
case startRun:
- case startRunLargeWeapon:
case run:
case stopRunningAndDrawSmallWeapon:
return true;
diff --git a/engines/ultima/ultima8/world/actors/animation.h b/engines/ultima/ultima8/world/actors/animation.h
index 2f23cd99e25..710d02b2028 100644
--- a/engines/ultima/ultima8/world/actors/animation.h
+++ b/engines/ultima/ultima8/world/actors/animation.h
@@ -117,12 +117,12 @@ enum Sequence {
kneelAndFire = 26,
slideLeft = 28,
slideRight = 29,
- unknownAnim30 = 30,
- startRunLargeWeapon = 31,
+ lookLeftCru = 30,
+ lookRightCru = 31,
teleportIn = 32,
teleportOut = 33,
startRunSmallWeapon = 34,
- startRunLargeWeapon2 = 35,
+ startRunLargeWeapon = 35,
advanceSmallWeapon = 36,
combatStandLargeWeapon = 37,
startRun = 38,
@@ -152,11 +152,17 @@ enum Sequence {
combatRollRight = 62,
finishFiring = 63,
- crusaderAbsoluteAnimFlag = 0x1000, //!< Bit mask magic to say we want an exact number, don't do mapping from U8 animation numbers
- teleportInReplacement = crusaderAbsoluteAnimFlag | teleportIn, //!< See notes in Actor::receiveHitCru
- teleportOutReplacement = crusaderAbsoluteAnimFlag | teleportOut //!< See notes in Actor::receiveHitCru
+ /// A flag to say we want an exact number, don't do mapping from U8 animation
+ /// numbers. This is a bit of a hack because for most code we want to do
+ /// translations from U8 nums, but sometimes we have exact animation numbers
+ /// provided by usecode or from some translated code.
+ crusaderAbsoluteAnimFlag = 0x1000,
};
+static inline Animation::Sequence absAnim(Animation::Sequence seq) {
+ return static_cast<Animation::Sequence>(seq | crusaderAbsoluteAnimFlag);
+}
+
enum Result {
FAILURE = 0,
SUCCESS = 1,
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 11964df0bf1..254e4050c4c 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -137,8 +137,9 @@ static bool _isAnimRunningJumping(Animation::Sequence anim) {
}
static bool _isAnimStartRunning(Animation::Sequence anim) {
- return (anim == Animation::startRun || anim == Animation::startRunSmallWeapon ||
- anim == Animation::startRunLargeWeapon);
+ return (anim == Animation::startRun || anim == Animation::startRunSmallWeapon /*||
+ // don't test this as it overlaps with kneel :(
+ anim == Animation::startRunLargeWeapon*/);
}
void CruAvatarMoverProcess::handleCombatMode() {
diff --git a/engines/ultima/ultima8/world/actors/guard_process.cpp b/engines/ultima/ultima8/world/actors/guard_process.cpp
index 3d14c114060..cbd7ccd037a 100644
--- a/engines/ultima/ultima8/world/actors/guard_process.cpp
+++ b/engines/ultima/ultima8/world/actors/guard_process.cpp
@@ -62,7 +62,7 @@ void GuardProcess::run() {
Kernel::get_instance()->addProcess(dp);
waitFor(dp);
} else {
- Animation::Sequence anim = (getRandom() % 2 ? Animation::unknownAnim30 : Animation::startRunLargeWeapon);
+ Animation::Sequence anim = Animation::absAnim(getRandom() % 2 ? Animation::lookLeftCru : Animation::lookRightCru);
uint16 animproc = a->doAnim(anim, dir_current);
a->doAnimAfter(Animation::stand, dir_current, animproc);
}
diff --git a/engines/ultima/ultima8/world/gravity_process.cpp b/engines/ultima/ultima8/world/gravity_process.cpp
index d4b12ff5f1e..79ec576575d 100644
--- a/engines/ultima/ultima8/world/gravity_process.cpp
+++ b/engines/ultima/ultima8/world/gravity_process.cpp
@@ -352,8 +352,8 @@ void GravityProcess::actorFallStoppedCru(Actor *actor, int height) {
lastanim != Animation::kneelCombatRollRight &&
lastanim != Animation::run &&
lastanim != Animation::jumpForward &&
- lastanim != Animation::unknownAnim30 &&
- lastanim != Animation::brightKneelAndFireLargeWeapon)) {
+ lastanim != Animation::combatRunSmallWeapon &&
+ lastanim != Animation::combatRunLargeWeapon)) {
// play land animation, overriding other animations
kernel->killProcesses(_itemNum, ActorAnimProcess::ACTOR_ANIM_PROC_TYPE, false); // CONSTANT!
ProcId lpid = actor->doAnim(Animation::jumpLanding, dir_current);
More information about the Scummvm-git-logs
mailing list