[Scummvm-git-logs] scummvm master -> 345537c519a0d45abcd43bb38d5a36f37fc3760c

mduggan mgithub at guarana.org
Sun May 16 13:20:32 UTC 2021


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

Summary:
c40477ef67 ULTIMA8: Don't pause crusader turn while firing
345537c519 ULTIMA8: Improve test for Crusader slide movements


Commit: c40477ef670cc8c74589a83d87dcc81aeb03869b
    https://github.com/scummvm/scummvm/commit/c40477ef670cc8c74589a83d87dcc81aeb03869b
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-16T22:19:45+09:00

Commit Message:
ULTIMA8: Don't pause crusader turn while firing

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


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 734f2c2300..8468c4c1e3 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -38,7 +38,8 @@ DEFINE_RUNTIME_CLASSTYPE_CODE(CruAvatarMoverProcess)
 
 static const int REBEL_BASE_MAP = 40;
 
-CruAvatarMoverProcess::CruAvatarMoverProcess() : AvatarMoverProcess(), _avatarAngle(0), _SGA1Loaded(false) {
+CruAvatarMoverProcess::CruAvatarMoverProcess() : AvatarMoverProcess(),
+_avatarAngle(0), _SGA1Loaded(false), _nextFireTick(0) {
 }
 
 
@@ -473,11 +474,14 @@ void CruAvatarMoverProcess::tryAttack() {
 	if (!wpn || !wpn->getShapeInfo() || !wpn->getShapeInfo()->_weaponInfo)
 		return;
 
+	Kernel *kernel = Kernel::get_instance();
+	if (kernel->getTickNum() < _nextFireTick)
+		return;
+
 	if (!avatar->isInCombat()) {
 		avatar->setInCombat(0);
 	}
 
-	Kernel *kernel = Kernel::get_instance();
 	AudioProcess *audio = AudioProcess::get_instance();
 	const WeaponInfo *wpninfo = wpn->getShapeInfo()->_weaponInfo;
 
@@ -518,13 +522,11 @@ void CruAvatarMoverProcess::tryAttack() {
 				avatar->doAnim(Animation::reloadSmallWeapon, dir_current);
 			}
 
-			int delayproc = kernel->addProcess(new DelayProcess(15));
-			this->waitFor(delayproc);
+			_nextFireTick = kernel->getTickNum() + 15;
 		} else {
 			// no shots left
 			audio->playSFX(0x2a, 0x80, avatar->getObjId(), 1);
-			int delayproc = kernel->addProcess(new DelayProcess(20));
-			this->waitFor(delayproc);
+			_nextFireTick = kernel->getTickNum() + 20;
 		}
 	} else {
 		// Check for SGA1 reload anim (which happens every shot)
@@ -554,7 +556,7 @@ void CruAvatarMoverProcess::tryAttack() {
 			}
 
 			if (wpninfo->_shotDelay) {
-				waitFor(kernel->addProcess(new DelayProcess(wpninfo->_shotDelay)));
+				_nextFireTick = kernel->getTickNum() + wpninfo->_shotDelay;
 			} else {
 				waitFor(fireanimpid);
 			}
diff --git a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
index f892995ccf..9fab0688a7 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.h
@@ -67,6 +67,11 @@ private:
 	 */
 	bool _SGA1Loaded;
 
+	/**
+	 * Next tick the avatar can fire a weapon again.
+	 */
+	uint32 _nextFireTick;
+
 	void handleHangingMode() override;
 	void handleCombatMode() override;
 	void handleNormalMode() override;


Commit: 345537c519a0d45abcd43bb38d5a36f37fc3760c
    https://github.com/scummvm/scummvm/commit/345537c519a0d45abcd43bb38d5a36f37fc3760c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-16T22:19:45+09:00

Commit Message:
ULTIMA8: Improve test for Crusader slide movements

The previous code made it possible to accidentally jump through thin objects
like laser barriers because it was not testing that the avatar could get to the
start point of the adjusted move.  Added a sweep test to ensure the start point
is also valid.

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 8468c4c1e3..1fb689c916 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -407,6 +407,14 @@ void CruAvatarMoverProcess::step(Animation::Sequence action, Direction direction
 		Direction dir_left = Direction_TurnByDelta(direction, -4, dirmode_16dirs);
 		Point3 origpt;
 		avatar->getLocation(origpt);
+
+		int32 dims[3];
+		avatar->getFootpadWorld(dims[0], dims[1], dims[2]);
+		int32 start[3];
+		start[0] = origpt.x;
+		start[1] = origpt.y;
+		start[2] = origpt.z;
+
 		// Double the values in original to match our coordinate space
 		static const int ADJUSTMENTS[] = {0x20, 0x20, 0x40, 0x40, 0x60, 0x60,
 			0x80, 0x80, 0xA0, 0xA0};
@@ -416,11 +424,31 @@ void CruAvatarMoverProcess::step(Animation::Sequence action, Direction direction
 			int32 x = origpt.x + Direction_XFactor(testdir) * ADJUSTMENTS[i];
 			int32 y = origpt.y + Direction_YFactor(testdir) * ADJUSTMENTS[i];
 			int32 z = origpt.z;
-			// Note: we don't actually need the blocker output, just add the parameter
-			// for compilers that can't tell nullptr from 0..
-			const Item *blocker;
-			if (currentmap->isValidPosition(x, y, z, avatar->getShape(), avatar->getObjId(),
-											nullptr, nullptr, &blocker)) {
+
+			//
+			// Check if we can slide from the original point to a different
+			// start point (otherwise we might pop through walls, lasers, etc).
+			// This is like Item::collideMove, but we want to stop on any blockers
+			// and not trigger any events
+			//
+			bool startvalid = true;
+			Std::list<CurrentMap::SweepItem> collisions;
+			int32 end[3];
+			end[0] = x;
+			end[1] = y;
+			end[2] = z;
+			avatar->setLocation(origpt.x, origpt.y, origpt.z);
+			currentmap->sweepTest(start, end, dims, avatar->getShapeInfo()->_flags,
+								  avatar->getObjId(),false, &collisions);
+			for (Std::list<CurrentMap::SweepItem>::iterator it = collisions.begin();
+				 it != collisions.end(); it++) {
+				if (!it->_touching && it->_blocking) {
+					startvalid = false;
+					break;
+				}
+			}
+
+			if (startvalid) {
 				avatar->setLocation(x, y, z);
 				res = avatar->tryAnim(testaction, direction);
 				if (res == Animation::SUCCESS) {




More information about the Scummvm-git-logs mailing list