[Scummvm-git-logs] scummvm master -> 167310867ff0fdeb5d3c4db313cffcb2dfdb853e

mduggan mgithub at guarana.org
Tue Jul 27 13:24:07 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:
14288d8293 ULTIMA8: Improve trigger conditions for Crusader NPC attacks
167310867f ULTIMA8: Fix Crusader robot control camera location


Commit: 14288d829315403121f8697438486a66c7afc5bc
    https://github.com/scummvm/scummvm/commit/14288d829315403121f8697438486a66c7afc5bc
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-07-27T22:10:48+09:00

Commit Message:
ULTIMA8: Improve trigger conditions for Crusader NPC attacks

There were some small differences from the original as to when attacks should
be triggered from Pace and Guard.  This should improve them to be more like
original.

Changed paths:
    engines/ultima/ultima8/world/actors/actor.cpp
    engines/ultima/ultima8/world/actors/actor.h
    engines/ultima/ultima8/world/actors/guard_process.cpp
    engines/ultima/ultima8/world/actors/pace_process.cpp


diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 541c9ed008..41641c276b 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -1071,9 +1071,7 @@ void Actor::tookHitCru() {
 		return;
 
 	if (lastanim == Animation::unknownAnim30 || lastanim == Animation::startRunLargeWeapon) {
-		Actor *controlled = getActor(World::get_instance()->getControlledNPCNum());
-		bool canseecontrolled = controlled && (getRangeIfVisible(*controlled) > 0);
-		if (canseecontrolled) {
+		if (canSeeControlledActor(true)) {
 			if (getRandom() % 4)
 				setActivity(5);
 			else
@@ -1828,15 +1826,14 @@ void Actor::setInCombatCru(int activity) {
 	AttackProcess *ap = new AttackProcess(this);
 	Kernel::get_instance()->addProcess(ap);
 
-	if (getCurrentActivityNo() == 8) {
-		// Guard process.. set some flag in ap
+	if (getLastActivityNo() == 8) {
+		// Coming from guard process.. set some flag in ap
 		ap->setField97();
 	}
 	if (activity == 0xc) {
-		ap->setTimer3();
-		// This sets fields 0x77 and 0x79 of the attack process
+		// This sets timer 3 of the attack process
 		// to some random timer value in the future
-		//ap->AttackProcess_1108_1485();
+		ap->setTimer3();
 	}
 
 	uint16 animproc = 0;
@@ -1871,6 +1868,52 @@ void Actor::clearInCombat() {
 	clearActorFlag(ACT_INCOMBAT);
 }
 
+bool Actor::canSeeControlledActor(bool forcombat) {
+	const Actor *controlled = getControlledActor();
+	if (!controlled)
+		return false;
+
+	if (!isOnScreen())
+		return false;
+
+	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)) {
+				left = false;
+		 }
+		 if (leftflag) {
+			currentdir = Direction_TurnByDelta(curdir, -4, dirmode_16dirs);
+		 } else {
+			currentdir = Direction_TurnByDelta(curdir, 4, dirmode_16dirs);
+		 }
+	}
+	*/
+
+	if (dirtocontrolled == curdir ||
+		dirtocontrolled == Direction_OneLeft(curdir, dirmode_16dirs) ||
+		dirtocontrolled == Direction_OneRight(curdir, dirmode_16dirs) ||
+		dirtocontrolled == Direction_TurnByDelta(curdir, 2, dirmode_16dirs) ||
+		dirtocontrolled == Direction_TurnByDelta(curdir, -2, dirmode_16dirs))
+	{
+		return getRangeIfVisible(*controlled) > 0;
+	}
+
+	return false;
+
+}
+
 int32 Actor::collideMove(int32 x, int32 y, int32 z, bool teleports, bool force,
 						 ObjId *hititem, uint8 *dirs) {
 	int32 result = Item::collideMove(x, y, z, teleports, force, hititem, dirs);
diff --git a/engines/ultima/ultima8/world/actors/actor.h b/engines/ultima/ultima8/world/actors/actor.h
index 477522ceb2..a658e1f3e7 100644
--- a/engines/ultima/ultima8/world/actors/actor.h
+++ b/engines/ultima/ultima8/world/actors/actor.h
@@ -298,9 +298,12 @@ public:
 
 	bool activeWeaponIsSmall() const;
 
-	// A cru-specific behavior - mostly make "ugh" noises, or explode for some robots.
+	//! A cru-specific behavior - mostly make "ugh" noises, or explode for some robots.
 	void tookHitCru();
 
+	//! Whether this NPC has the controlled actor in their sights (Crusader only)
+	bool canSeeControlledActor(bool forcombat);
+
 	//! Add the x/y/z fire offsets given the current state of the actor
 	void addFireAnimOffsets(int32 &x, int32 &y, int32 &z);
 
diff --git a/engines/ultima/ultima8/world/actors/guard_process.cpp b/engines/ultima/ultima8/world/actors/guard_process.cpp
index 7b65ac7e4d..aabbc4128f 100644
--- a/engines/ultima/ultima8/world/actors/guard_process.cpp
+++ b/engines/ultima/ultima8/world/actors/guard_process.cpp
@@ -57,21 +57,20 @@ void GuardProcess::run() {
 	if (!mainactor)
 		return;
 
-	int range = a->getRangeIfVisible(*mainactor);
-	if (!range) {
+	if (!a->canSeeControlledActor(false)) {
 		if (getRandom() % 2) {
 			DelayProcess *dp = new DelayProcess(30 * (1 + (getRandom() % 3)));
 			Kernel::get_instance()->addProcess(dp);
 			waitFor(dp);
-			return;
 		} else {
 			Animation::Sequence anim = (getRandom() % 2 ? Animation::unknownAnim30 : Animation::startRunLargeWeapon);
-			int animproc = a->doAnim(anim, dir_current);
+			uint16 animproc = a->doAnim(anim, dir_current);
 			a->doAnimAfter(Animation::stand, dir_current, animproc);
 		}
 		return;
 	}
 
+	// Saw the silencer, go to combat.
 	a->setActivity(5);
 }
 
diff --git a/engines/ultima/ultima8/world/actors/pace_process.cpp b/engines/ultima/ultima8/world/actors/pace_process.cpp
index e7324e0be2..703da41361 100644
--- a/engines/ultima/ultima8/world/actors/pace_process.cpp
+++ b/engines/ultima/ultima8/world/actors/pace_process.cpp
@@ -48,19 +48,11 @@ PaceProcess::PaceProcess(Actor *actor): _counter(0) {
 
 
 bool PaceProcess::maybeStartDefaultActivity1(Actor *actor) {
-	const Actor *mainactor = getControlledActor();
-	if (!mainactor)
-		return false;
-
 	uint16 activity = actor->getDefaultActivity(1);
 	uint16 cur_activity = actor->getCurrentActivityNo();
-
-	if (actor->isOnScreen() && activity > 0 && cur_activity != activity) {
-		int range = actor->getRangeIfVisible(*mainactor);
-		if (range > 0) {
-			actor->setActivity(activity);
-			return true;
-		}
+	if (activity != 0 && cur_activity != activity && actor->canSeeControlledActor(false)) {
+		actor->setActivity(activity);
+		return true;
 	}
 
 	return false;
@@ -89,6 +81,7 @@ void PaceProcess::run() {
 
 	Animation::Result result = a->tryAnim(Animation::walk, a->getDir());
 	if (result == Animation::SUCCESS) {
+		_counter = 0;
 		uint16 walkprocid = a->doAnim(Animation::walk, a->getDir());
 		waitFor(walkprocid);
 	} else {
@@ -97,9 +90,9 @@ void PaceProcess::run() {
 			uint32 shapeno = a->getShape();
 			if (shapeno == 0x2f5 || shapeno == 0x2f7 || shapeno != 0x2f6 ||
 				shapeno == 0x344 || shapeno == 0x597) {
-				a->setActivity(5); // attack
-			} else {
 				a->setActivity(7); // surrender
+			} else {
+				a->setActivity(5); // attack
 			}
 			return;
 		}


Commit: 167310867ff0fdeb5d3c4db313cffcb2dfdb853e
    https://github.com/scummvm/scummvm/commit/167310867ff0fdeb5d3c4db313cffcb2dfdb853e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-07-27T22:21:36+09:00

Commit Message:
ULTIMA8: Fix Crusader robot control camera location

Previously we set the camera process to follow the robot, but it should snap to
the robot's location and then use the SnapProcess to update location in chunks.

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 a175769bc9..2702aedda4 100644
--- a/engines/ultima/ultima8/world/world.cpp
+++ b/engines/ultima/ultima8/world/world.cpp
@@ -39,6 +39,7 @@
 #include "ultima/ultima8/world/get_object.h"
 #include "ultima/ultima8/world/target_reticle_process.h"
 #include "ultima/ultima8/audio/audio_process.h"
+#include "ultima/ultima8/world/snap_process.h"
 
 namespace Ultima {
 namespace Ultima8 {
@@ -508,17 +509,21 @@ void World::setAlertActiveRegret(bool active)
 void World::setControlledNPCNum(uint16 num) {
 	uint16 oldnpc = _controlledNPCNum;
 	_controlledNPCNum = num;
-	CameraProcess::SetCameraProcess(new CameraProcess(num));
 	Actor *previous = getActor(oldnpc);
 	if (previous && !previous->isDead() && previous->isInCombat()) {
 		previous->clearInCombat();
 	}
 
 	Actor *controlled = getActor(num);
-	if (controlled && num != 1) {
-		Kernel::get_instance()->killProcesses(num, Kernel::PROC_TYPE_ALL, true);
-		if (controlled->isInCombat())
-			controlled->clearInCombat();
+	if (controlled) {
+		if (num != 1) {
+			Kernel::get_instance()->killProcesses(num, Kernel::PROC_TYPE_ALL, true);
+			if (controlled->isInCombat())
+				controlled->clearInCombat();
+		}
+		int32 x, y, z;
+		controlled->getCentre(x, y, z);
+		CameraProcess::SetCameraProcess(new CameraProcess(x, y, z));
 	}
 
 	TargetReticleProcess *t = TargetReticleProcess::get_instance();




More information about the Scummvm-git-logs mailing list