[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