[Scummvm-git-logs] scummvm master -> 5fe99875879528db4f724e115787b67431ba0e5d

mduggan mgithub at guarana.org
Sat May 1 12:54:06 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:
5301e0e886 ULTIMA8: Remove ignored parameter from FileSystem
6277257d10 ULTIMA8: Avoid Crusader NPCs spinning to same direction
343c5dfab7 ULTIMA8: Translate anim nums given to usecode
5c0fa036b9 ULTIMA8: Skip Crusader ammo check for npcs != 1
e2072dc746 ULTIMA8: Kill process 0xc when switching Crusader npc
1b15041a29 ULTIMA8: Tidy up 'all process' constant in Kernel.
be95710065 ULTIMA8: Tweaks to Crusader SuperSprite to make Thresher work right
5fe9987587 ULTIMA8: Fix a couple more Crusader pickup counts


Commit: 5301e0e886b42be77ec73add9b7c6b1d229ce40c
    https://github.com/scummvm/scummvm/commit/5301e0e886b42be77ec73add9b7c6b1d229ce40c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Remove ignored parameter from FileSystem

Changed paths:
    engines/ultima/ultima8/conf/config_file_manager.cpp
    engines/ultima/ultima8/filesys/file_system.cpp
    engines/ultima/ultima8/filesys/file_system.h


diff --git a/engines/ultima/ultima8/conf/config_file_manager.cpp b/engines/ultima/ultima8/conf/config_file_manager.cpp
index f8cd621a65..bc3feae5c2 100644
--- a/engines/ultima/ultima8/conf/config_file_manager.cpp
+++ b/engines/ultima/ultima8/conf/config_file_manager.cpp
@@ -45,7 +45,7 @@ ConfigFileManager::~ConfigFileManager() {
 }
 
 bool ConfigFileManager::readConfigFile(string fname, const istring &category) {
-	Common::SeekableReadStream *f = FileSystem::get_instance()->ReadFile(fname, true);
+	Common::SeekableReadStream *f = FileSystem::get_instance()->ReadFile(fname);
 	if (!f) return false;
 
 	ConfigFile *configFile = new ConfigFile();
diff --git a/engines/ultima/ultima8/filesys/file_system.cpp b/engines/ultima/ultima8/filesys/file_system.cpp
index a0395874c3..7522aab6ce 100644
--- a/engines/ultima/ultima8/filesys/file_system.cpp
+++ b/engines/ultima/ultima8/filesys/file_system.cpp
@@ -45,7 +45,7 @@ FileSystem::~FileSystem() {
 
 
 // Open a streaming file as readable. Streamed (0 on failure)
-Common::SeekableReadStream *FileSystem::ReadFile(const string &vfn, bool is_text) {
+Common::SeekableReadStream *FileSystem::ReadFile(const string &vfn) {
 	Common::SeekableReadStream *readStream;
 	if (!rawOpen(readStream, vfn))
 		return nullptr;
@@ -54,7 +54,7 @@ Common::SeekableReadStream *FileSystem::ReadFile(const string &vfn, bool is_text
 }
 
 // Open a streaming file as writeable. Streamed (0 on failure)
-Common::WriteStream *FileSystem::WriteFile(const string &vfn, bool is_text) {
+Common::WriteStream *FileSystem::WriteFile(const string &vfn) {
 	string filename = vfn;
 	Common::WriteStream *writeStream;
 
diff --git a/engines/ultima/ultima8/filesys/file_system.h b/engines/ultima/ultima8/filesys/file_system.h
index 992838ab6e..6033681c8a 100644
--- a/engines/ultima/ultima8/filesys/file_system.h
+++ b/engines/ultima/ultima8/filesys/file_system.h
@@ -40,15 +40,13 @@ public:
 
 	//! Open a file as readable. Streamed.
 	//! \param vfn the (virtual) filename
-	//! \param is_text open in text mode?
 	//! \return nullptr on failure
-	Common::SeekableReadStream *ReadFile(const Std::string &vfn, bool is_text = false);
+	Common::SeekableReadStream *ReadFile(const Std::string &vfn);
 
 	//! Open a file as writable. Streamed.
 	//! \param vfn the (virtual) filename
-	//! \param is_text open in text mode?
 	//! \return a new writestream, or nullptr on failure
-	Common::WriteStream *WriteFile(const Std::string &vfn, bool is_text = false);
+	Common::WriteStream *WriteFile(const Std::string &vfn);
 
 private:
 	static bool base_to_uppercase(Std::string &str, int count);


Commit: 6277257d10519661cc8c31fd02978d272b2086a0
    https://github.com/scummvm/scummvm/commit/6277257d10519661cc8c31fd02978d272b2086a0
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Avoid Crusader NPCs spinning to same direction

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


diff --git a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
index 09cab40703..5ebfe8b08e 100644
--- a/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_pathfinder_process.cpp
@@ -123,7 +123,8 @@ void CruPathfinderProcess::terminate() {
 					destdir = Direction_GetWorldDir(ty - iy, tx - ix, dirmode_8dirs);
 				}
 			}
-			turnproc = actor->turnTowardDir(destdir);
+			if (destdir != dir_current)
+				turnproc = actor->turnTowardDir(destdir);
 		}
 		if (!turnproc && _noShotAvailable) {
 			Animation::Sequence standanim = (actor->isInCombat() ? Animation::combatStandSmallWeapon : Animation::stand);


Commit: 343c5dfab777b5df0355d0d6633641ded532e2ce
    https://github.com/scummvm/scummvm/commit/343c5dfab777b5df0355d0d6633641ded532e2ce
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Translate anim nums given to usecode

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


diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 2c2fe22682..ba2823c557 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -666,7 +666,7 @@ uint16 Actor::turnTowardDir(Direction targetdir) {
 		}
 	}
 
-	if (targetdir == curdir)
+	if (targetdir == curdir || targetdir == dir_current)
 		return 0; // nothing to do.
 
 	if (combat) {
@@ -1813,7 +1813,7 @@ uint32 Actor::I_getLastAnimSet(const uint8 *args, unsigned int /*argsize*/) {
 	ARG_ACTOR_FROM_PTR(actor);
 	if (!actor) return 0;
 
-	return actor->getLastAnim();
+	return AnimDat::getActionNumberForSequence(actor->getLastAnim(), actor);
 }
 
 uint32 Actor::I_getStr(const uint8 *args, unsigned int /*argsize*/) {


Commit: 5c0fa036b9e10970be1565152a7c97351824d563
    https://github.com/scummvm/scummvm/commit/5c0fa036b9e10970be1565152a7c97351824d563
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Skip Crusader ammo check for npcs != 1

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 2cdfc5cb73..70919b4fc5 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -454,6 +454,14 @@ void CruAvatarMoverProcess::tryAttack() {
 	AudioProcess *audio = AudioProcess::get_instance();
 	const WeaponInfo *wpninfo = wpn->getShapeInfo()->_weaponInfo;
 
+	if (avatar->getObjId() != 1) {
+		// Non-avatar NPCs never need to reload or run out of energy.
+		Animation::Sequence fireanim = (avatar->isKneeling() ?
+										Animation::kneelAndFire : Animation::attack);
+		waitFor(avatar->doAnim(fireanim, avatar->getDir()));
+		return;
+	}
+
 	int shotsleft;
 	if (wpninfo->_ammoShape) {
 		shotsleft = wpn->getQuality();


Commit: e2072dc746214ac21691e2a78c8ad55a3e6177fc
    https://github.com/scummvm/scummvm/commit/e2072dc746214ac21691e2a78c8ad55a3e6177fc
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Kill process 0xc when switching Crusader npc

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 a937315b08..19a56db952 100644
--- a/engines/ultima/ultima8/world/world.cpp
+++ b/engines/ultima/ultima8/world/world.cpp
@@ -450,8 +450,10 @@ void World::setControlledNPCNum(uint16 num) {
 	}
 
 	Actor *controlled = getActor(num);
-	if (controlled && controlled->isInCombat() && num != 1) {
-		controlled->clearInCombat();
+	if (controlled && num != 1) {
+		Kernel::get_instance()->killProcesses(num, 0xc, false);
+		if (controlled->isInCombat())
+			controlled->clearInCombat();
 	}
 
 	TargetReticleProcess *t = TargetReticleProcess::get_instance();


Commit: 1b15041a29219465751da30ec4522d4f2ce795d9
    https://github.com/scummvm/scummvm/commit/1b15041a29219465751da30ec4522d4f2ce795d9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Tidy up 'all process' constant in Kernel.

Changed paths:
    engines/ultima/ultima8/kernel/kernel.cpp
    engines/ultima/ultima8/kernel/kernel.h
    engines/ultima/ultima8/world/item.cpp
    engines/ultima/ultima8/world/world.cpp


diff --git a/engines/ultima/ultima8/kernel/kernel.cpp b/engines/ultima/ultima8/kernel/kernel.cpp
index f10ffb6b96..fd42493528 100644
--- a/engines/ultima/ultima8/kernel/kernel.cpp
+++ b/engines/ultima/ultima8/kernel/kernel.cpp
@@ -35,6 +35,12 @@ const uint32 Kernel::TICKS_PER_FRAME = 2;
 const uint32 Kernel::TICKS_PER_SECOND = 60;
 const uint32 Kernel::FRAMES_PER_SECOND = Kernel::TICKS_PER_SECOND / Kernel::TICKS_PER_FRAME;
 
+// A special proc type which means "all"
+const uint16 Kernel::PROC_TYPE_ALL = 6;
+
+// The same as above, but for Crusader.
+// Used in Usecode functions to translate.
+static const uint16 CRU_PROC_TYPE_ALL = 0xc;
 
 Kernel::Kernel() : _loading(false), _tickNum(0), _paused(0),
 		_runningProcess(nullptr), _frameByFrame(false) {
@@ -249,7 +255,7 @@ uint32 Kernel::getNumProcesses(ObjId objid, uint16 processtype) {
 		if (p->is_terminated()) continue;
 
 		if ((objid == 0 || objid == p->_itemNum) &&
-		        (processtype == 6 || processtype == p->_type))
+		        (processtype == PROC_TYPE_ALL || processtype == p->_type))
 			count++;
 	}
 
@@ -264,7 +270,7 @@ Process *Kernel::findProcess(ObjId objid, uint16 processtype) {
 		if (p->is_terminated()) continue;
 
 		if ((objid == 0 || objid == p->_itemNum) &&
-		        (processtype == 6 || processtype == p->_type)) {
+		        (processtype == PROC_TYPE_ALL || processtype == p->_type)) {
 			return p;
 		}
 	}
@@ -278,7 +284,7 @@ void Kernel::killProcesses(ObjId objid, uint16 processtype, bool fail) {
 		Process *p = *it;
 
 		if (p->_itemNum != 0 && (objid == 0 || objid == p->_itemNum) &&
-		        (processtype == 6 || processtype == p->_type) &&
+		        (processtype == PROC_TYPE_ALL || processtype == p->_type) &&
 		        !(p->_flags & Process::PROC_TERMINATED) &&
 		        !(p->_flags & Process::PROC_TERM_DEFERRED)) {
 			if (fail)
@@ -373,6 +379,9 @@ uint32 Kernel::I_getNumProcesses(const uint8 *args, unsigned int /*argsize*/) {
 	ARG_OBJID(item);
 	ARG_UINT16(type);
 
+	if (GAME_IS_CRUSADER && type == CRU_PROC_TYPE_ALL)
+		type = PROC_TYPE_ALL;
+
 	return Kernel::get_instance()->getNumProcesses(item, type);
 }
 
@@ -380,6 +389,9 @@ uint32 Kernel::I_resetRef(const uint8 *args, unsigned int /*argsize*/) {
 	ARG_OBJID(item);
 	ARG_UINT16(type);
 
+	if (GAME_IS_CRUSADER && type == CRU_PROC_TYPE_ALL)
+		type = PROC_TYPE_ALL;
+
 	Kernel::get_instance()->killProcesses(item, type, true);
 	return 0;
 }
diff --git a/engines/ultima/ultima8/kernel/kernel.h b/engines/ultima/ultima8/kernel/kernel.h
index 94e6bc5f7a..82c6d0a2ae 100644
--- a/engines/ultima/ultima8/kernel/kernel.h
+++ b/engines/ultima/ultima8/kernel/kernel.h
@@ -131,6 +131,9 @@ public:
 	static const uint32 TICKS_PER_SECOND;
 	static const uint32 FRAMES_PER_SECOND;
 
+	// A special process type which means kill all the processes.
+	static const uint16 PROC_TYPE_ALL;
+
 	INTRINSIC(I_getNumProcesses);
 	INTRINSIC(I_resetRef);
 private:
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index c4b2ae5acd..4baa99aa72 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -2238,7 +2238,7 @@ void Item::receiveHitCru(uint16 other, Direction dir, int damage, uint16 type) {
 	if (damageInfo) {
 		bool wasbroken = damageInfo->applyToItem(this, damage);
 		if (wasbroken) {
-			Kernel::get_instance()->killProcesses(_objId, 0xc, true);
+			Kernel::get_instance()->killProcesses(_objId, Kernel::PROC_TYPE_ALL, true);
 		}
 	}
 
diff --git a/engines/ultima/ultima8/world/world.cpp b/engines/ultima/ultima8/world/world.cpp
index 19a56db952..3b935d26dc 100644
--- a/engines/ultima/ultima8/world/world.cpp
+++ b/engines/ultima/ultima8/world/world.cpp
@@ -451,7 +451,7 @@ void World::setControlledNPCNum(uint16 num) {
 
 	Actor *controlled = getActor(num);
 	if (controlled && num != 1) {
-		Kernel::get_instance()->killProcesses(num, 0xc, false);
+		Kernel::get_instance()->killProcesses(num, Kernel::PROC_TYPE_ALL, true);
 		if (controlled->isInCombat())
 			controlled->clearInCombat();
 	}


Commit: be95710065488776a5fd25cd829f21a3a530e247
    https://github.com/scummvm/scummvm/commit/be95710065488776a5fd25cd829f21a3a530e247
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Tweaks to Crusader SuperSprite to make Thresher work right

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


diff --git a/engines/ultima/ultima8/world/super_sprite_process.cpp b/engines/ultima/ultima8/world/super_sprite_process.cpp
index 9db9ac6b15..44e69951c5 100644
--- a/engines/ultima/ultima8/world/super_sprite_process.cpp
+++ b/engines/ultima/ultima8/world/super_sprite_process.cpp
@@ -119,7 +119,7 @@ SuperSpriteProcess::SuperSpriteProcess(int shape, int frame, int sx, int sy, int
 
 	float travel = _destpt.maxDistXYZ(_nextpt);
 	// FIXME: how to get this scaled correctly?
-	float speed = firetypedat->getCellsPerRound() * 128.0f;
+	float speed = firetypedat->getCellsPerRound() * 32.0f;
 	float rounds = travel / speed;
 	if (rounds < 1)
 		rounds = 1;
@@ -320,8 +320,9 @@ void SuperSpriteProcess::hitAndFinish() {
 	int xstep = _pt3.x - _nowpt.x;
 	int ystep = _pt3.y - _nowpt.y;
 	int zstep = _pt3.z - _nowpt.z;
-	int32 start[3] = {_nowpt.x, _nowpt.y, _nowpt.z};
-	int32 end[3] = {_pt3.x, _pt3.y, _pt3.z};
+	// We add a slight hack - our sweep test is off-by-one on Z??
+	int32 start[3] = {_nowpt.x, _nowpt.y, _nowpt.z + 1};
+	int32 end[3] = {_pt3.x, _pt3.y, _pt3.z + 1};
 	int32 dims[3] = {1, 1, 1};
 	// will never get a collision if not stepping at all..
 	bool collision = !(xstep || ystep || zstep);
@@ -434,8 +435,8 @@ void SuperSpriteProcess::advanceFrame() {
 bool SuperSpriteProcess::areaSearch() {
 	CurrentMap *map = World::get_instance()->getCurrentMap();
 
-	int32 start[3] = {_nowpt.x, _nowpt.y, _nowpt.z};
-	int32 end[3] = {_pt3.x, _pt3.y, _pt3.z};
+	int32 start[3] = {_nowpt.x, _nowpt.y, _nowpt.z + 1};
+	int32 end[3] = {_pt3.x, _pt3.y, _pt3.z + 1};
 	int32 dims[3] = {1, 1, 1};
 
 	Item *item = getItem(_itemNum);


Commit: 5fe99875879528db4f724e115787b67431ba0e5d
    https://github.com/scummvm/scummvm/commit/5fe99875879528db4f724e115787b67431ba0e5d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-01T21:53:52+09:00

Commit Message:
ULTIMA8: Fix a couple more Crusader pickup counts

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


diff --git a/engines/ultima/ultima8/world/actors/main_actor.cpp b/engines/ultima/ultima8/world/actors/main_actor.cpp
index a687ac7f0f..3ec28076e1 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.cpp
+++ b/engines/ultima/ultima8/world/actors/main_actor.cpp
@@ -292,6 +292,7 @@ int16 MainActor::addItemCru(Item *item, bool showtoast) {
 					if (q < 0x14) {
 						existing->setQuality(q + 1);
 						existing->callUsecodeEvent_combine();
+						item->setQuality(1); // Count of picked up item is always 1
 						if (showtoast)
 							pickupArea->addPickup(item, true);
 						item->destroy();
@@ -302,6 +303,7 @@ int16 MainActor::addItemCru(Item *item, bool showtoast) {
 					if (q < 10) {
 						existing->setQuality(q + 1);
 						existing->callUsecodeEvent_combine();
+						item->setQuality(1); // Count of picked up item is always 1
 						if (showtoast)
 							pickupArea->addPickup(item, true);
 						item->destroy();




More information about the Scummvm-git-logs mailing list