[Scummvm-git-logs] scummvm master -> f27a567e91e4390d17b879900cb2904b6406dc20

mduggan mgithub at guarana.org
Thu Apr 22 12:43:16 UTC 2021


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
0a5de3dce7 ULTIMA8: Disable certain Crusader commands during robot control
18c699ed2a ULTIMA8: Remove stale gravity pid from avatar to avoid getting stuck
15117a32e4 ULTIMA8: Avoid invalid directions in Crusader
716f15806b ULTIMA8: Avoid null pointer in Crusader when controlled robot dies
72864946d2 ULTIMA8: Test retreating in Crusader to reproduce original game behavior
96592c56f9 ULTIMA8: Fix saving of alert flag
dcfe41a6a5 ULTIMA8: Crusader: Controlled NPC is never a best target.
f27a567e91 ULTIMA8: Tiny Crusader snap adjustment to be more accurate to original


Commit: 0a5de3dce7b8879780082981d1d50dbd47172091
    https://github.com/scummvm/scummvm/commit/0a5de3dce7b8879780082981d1d50dbd47172091
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:37:22+09:00

Commit Message:
ULTIMA8: Disable certain Crusader commands during robot control

Changed paths:
    engines/ultima/ultima8/misc/debugger.cpp


diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index de16dfab9d..10e69d849c 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -1019,11 +1019,22 @@ bool Debugger::cmdUseBackpack(int argc, const char **argv) {
 	return false;
 }
 
+static bool _isAvatarControlled() {
+	World *world = World::get_instance();
+	return (world && world->getControlledNPCNum() == 1);
+}
+
 bool Debugger::cmdNextInventory(int argc, const char **argv) {
 	if (Ultima8Engine::get_instance()->isAvatarInStasis()) {
 		debugPrintf("Can't use inventory: avatarInStasis\n");
 		return false;
 	}
+
+	// Only if controlling avatar.
+	if (!_isAvatarControlled()) {
+		return false;
+	}
+
 	MainActor *av = getMainActor();
 	av->nextInvItem();
 	return false;
@@ -1034,6 +1045,12 @@ bool Debugger::cmdNextWeapon(int argc, const char **argv) {
 		debugPrintf("Can't change weapon: avatarInStasis\n");
 		return false;
 	}
+
+	// Only if controlling avatar.
+	if (!_isAvatarControlled()) {
+		return false;
+	}
+
 	MainActor *av = getMainActor();
 	av->nextWeapon();
 	return false;
@@ -1044,6 +1061,12 @@ bool Debugger::cmdUseInventoryItem(int argc, const char **argv) {
 		debugPrintf("Can't use active inventory item: avatarInStasis\n");
 		return false;
 	}
+
+	// Only if controlling avatar.
+	if (!_isAvatarControlled()) {
+		return false;
+	}
+
 	MainActor *av = getMainActor();
 	ObjId activeitemid = av->getActiveInvItem();
 	if (activeitemid) {
@@ -1060,6 +1083,12 @@ bool Debugger::cmdUseMedikit(int argc, const char **argv) {
 		debugPrintf("Can't use medikit: avatarInStasis\n");
 		return false;
 	}
+
+	// Only if controlling avatar.
+	if (!_isAvatarControlled()) {
+		return false;
+	}
+
 	MainActor *av = getMainActor();
 	av->useInventoryItem(0x351);
 	return false;
@@ -1070,6 +1099,12 @@ bool Debugger::cmdDetonateBomb(int argc, const char **argv) {
 		debugPrintf("Can't detonate bomb: avatarInStasis\n");
 		return false;
 	}
+
+	// Only if controlling avatar.
+	if (!_isAvatarControlled()) {
+		return false;
+	}
+
 	MainActor *av = getMainActor();
 	av->detonateBomb();
 	return false;
@@ -1437,6 +1472,11 @@ bool Debugger::cmdStartSelection(int argc, const char **argv) {
 		return false;
 	}
 
+	// Only if controlling avatar.
+	if (!_isAvatarControlled()) {
+		return false;
+	}
+
 	ItemSelectionProcess *proc = ItemSelectionProcess::get_instance();
 	if (proc)
 		proc->selectNextItem();
@@ -1449,6 +1489,11 @@ bool Debugger::cmdUseSelection(int argc, const char **argv) {
 		return false;
 	}
 
+	// Only if controlling avatar.
+	if (!_isAvatarControlled()) {
+		return false;
+	}
+
 	ItemSelectionProcess *proc = ItemSelectionProcess::get_instance();
 	if (proc)
 		proc->useSelectedItem();


Commit: 18c699ed2a042f0fda95bc9e28e56e3444ce9783
    https://github.com/scummvm/scummvm/commit/18c699ed2a042f0fda95bc9e28e56e3444ce9783
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:37:22+09:00

Commit Message:
ULTIMA8: Remove stale gravity pid from avatar to avoid getting stuck

This has happened to me during testing. I'm not sure how it got into this state
but this simple workaround will help avoid getting stuck.

Changed paths:
    engines/ultima/ultima8/world/actors/avatar_mover_process.cpp


diff --git a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
index 1505a1292a..dbd554a3b6 100644
--- a/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/avatar_mover_process.cpp
@@ -56,8 +56,14 @@ void AvatarMoverProcess::run() {
 
 	// falling, so don't move
 	if (avatar->getGravityPID() != 0) {
-		_idleTime = 0;
-		return;
+		Process *proc = Kernel::get_instance()->getProcess(avatar->getGravityPID());
+		if (!proc || !proc->is_active()) {
+			warning("FIXME: Removing stale gravity pid %d from Avatar.", avatar->getGravityPID());
+			avatar->setGravityPID(0);
+		} else {
+			_idleTime = 0;
+			return;
+		}
 	}
 
 	// not in fast area, don't move (can happen for some death sequences


Commit: 15117a32e47a4cd305ca2d535499289547a70723
    https://github.com/scummvm/scummvm/commit/15117a32e47a4cd305ca2d535499289547a70723
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:37:22+09:00

Commit Message:
ULTIMA8: Avoid invalid directions in Crusader

Changed paths:
    engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp


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 d6d11eaa5c..25152a6248 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -150,6 +150,10 @@ void CruAvatarMoverProcess::handleCombatMode() {
 				mainactor->toggleInCombat();
 		}
 
+		// Ensure the dir we are about to use is valid
+		if (avatar->animDirMode(nextanim) == dirmode_8dirs)
+			direction = static_cast<Direction>(direction - (static_cast<uint32>(direction) % 2));
+
 		// don't check weapon here, Avatar can go straight from drawn-weapon to
 		// walking forward.
 		step(nextanim, direction);


Commit: 716f15806bf798af6b37c8ec87d6a8ddd6d352d7
    https://github.com/scummvm/scummvm/commit/716f15806bf798af6b37c8ec87d6a8ddd6d352d7
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:37:22+09:00

Commit Message:
ULTIMA8: Avoid null pointer in Crusader when controlled robot dies

Changed paths:
    engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp


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 25152a6248..5697ecdeef 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -425,6 +425,9 @@ void CruAvatarMoverProcess::step(Animation::Sequence action, Direction direction
 
 void CruAvatarMoverProcess::tryAttack() {
 	Actor *avatar = getControlledActor();
+	if (!avatar)
+		return;
+
 	Direction dir = avatar->getDir();
 	if (!avatar->isInCombat()) {
 		avatar->setInCombat(0);


Commit: 72864946d26ee1072819a1c0a33670f71908d17e
    https://github.com/scummvm/scummvm/commit/72864946d26ee1072819a1c0a33670f71908d17e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:37:22+09:00

Commit Message:
ULTIMA8: Test retreating in Crusader to reproduce original game behavior

Changed paths:
    engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp


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 5697ecdeef..a1ac5b9d3f 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -171,7 +171,7 @@ void CruAvatarMoverProcess::handleCombatMode() {
 		} else {
 			nextanim = Animation::retreat;
 		}
-		waitFor(avatar->doAnim(nextanim, direction));
+		step(nextanim, direction);
 		return;
 	} else if (hasMovementFlags(MOVE_STEP)) {
 		if (avatar->isKneeling()) {


Commit: 96592c56f9adee4f0fabb8aaff1f293bc06c5c45
    https://github.com/scummvm/scummvm/commit/96592c56f9adee4f0fabb8aaff1f293bc06c5c45
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:37:22+09:00

Commit Message:
ULTIMA8: Fix saving of alert flag

Changed paths:
    engines/ultima/ultima8/world/world.cpp


diff --git a/engines/ultima/ultima8/world/world.cpp b/engines/ultima/ultima8/world/world.cpp
index d72777de48..a937315b08 100644
--- a/engines/ultima/ultima8/world/world.cpp
+++ b/engines/ultima/ultima8/world/world.cpp
@@ -338,7 +338,7 @@ void World::save(Common::WriteStream *ws) {
 	ws->writeUint16LE(_currentMap->_eggHatcher);
 
 	if (GAME_IS_CRUSADER) {
-		ws->writeByte(_alertActive ? 0 : 1);
+		ws->writeByte(_alertActive ? 1 : 0);
 		ws->writeByte(_difficulty);
 	}
 


Commit: dcfe41a6a56f5d9d0314f488da37d79dff881adb
    https://github.com/scummvm/scummvm/commit/dcfe41a6a56f5d9d0314f488da37d79dff881adb
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:37:22+09:00

Commit Message:
ULTIMA8: Crusader: Controlled NPC is never a best target.

Changed paths:
    engines/ultima/ultima8/world/current_map.cpp


diff --git a/engines/ultima/ultima8/world/current_map.cpp b/engines/ultima/ultima8/world/current_map.cpp
index ebe7ca3a61..9d03e6f08b 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -345,9 +345,10 @@ Item *CurrentMap::findBestTargetItem(int32 x, int32 y, Direction dir, DirectionM
 	bool bestisoccl = false;
 	Item *bestitem = nullptr;
 	int bestdist = 0xffff;
+	const uint16 controllednpc = World::get_instance()->getControlledNPCNum();
 
 	for (int i = 0; i < MAP_NUM_TARGET_ITEMS; i++) {
-		if (_targets[i] == 0)
+		if (_targets[i] == 0 || _targets[i] == controllednpc)
 			continue;
 		Item *item = getItem(_targets[i]);
 		// FIXME: this should probably always be non-null,


Commit: f27a567e91e4390d17b879900cb2904b6406dc20
    https://github.com/scummvm/scummvm/commit/f27a567e91e4390d17b879900cb2904b6406dc20
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-22T21:39:18+09:00

Commit Message:
ULTIMA8: Tiny Crusader snap adjustment to be more accurate to original

Changed paths:
    engines/ultima/ultima8/world/snap_process.cpp


diff --git a/engines/ultima/ultima8/world/snap_process.cpp b/engines/ultima/ultima8/world/snap_process.cpp
index 95444bf827..acdd1bfc16 100644
--- a/engines/ultima/ultima8/world/snap_process.cpp
+++ b/engines/ultima/ultima8/world/snap_process.cpp
@@ -77,7 +77,7 @@ void SnapProcess::updateCurrentEgg() {
 		Rect r;
 		egg->getLocation(x, y, z);
 		getSnapEggRange(egg, r);
-		if (r.intersects(arect) && (az < z + 0x30 && az > z - 0x30)) {
+		if (r.intersects(arect) && (az <= z + 0x30 && az >= z - 0x30)) {
 			_currentSnapEgg = *iter;
 			_currentSnapEggRange = r;
 			CameraProcess::SetCameraProcess(new CameraProcess(_currentSnapEgg));




More information about the Scummvm-git-logs mailing list