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

mduggan mgithub at guarana.org
Mon May 31 11:52:51 UTC 2021


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

Summary:
58ab4d42a0 ULTIMA8: Still play Cruader cutscene on invalid object
d4e5b427dc ULTIMA8: JANITORIAL: Comments
f49f2dfde7 ULTIMA8: Add BoboBoomer and RollingThunder processes from No Regret
e749fb56c8 ULTIMA8: Wire up one No Regret intrinsic (isSfxPlayingForObject)


Commit: 58ab4d42a0bac0fed0ebbe792b41345b1412247c
    https://github.com/scummvm/scummvm/commit/58ab4d42a0bac0fed0ebbe792b41345b1412247c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-31T20:44:23+09:00

Commit Message:
ULTIMA8: Still play Cruader cutscene on invalid object

In Mission 5, one cutscene passes an invalid object.

Changed paths:
    engines/ultima/ultima8/gumps/movie_gump.cpp


diff --git a/engines/ultima/ultima8/gumps/movie_gump.cpp b/engines/ultima/ultima8/gumps/movie_gump.cpp
index 5476890132..9a1fa841dc 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.cpp
+++ b/engines/ultima/ultima8/gumps/movie_gump.cpp
@@ -31,6 +31,7 @@
 #include "ultima/ultima8/kernel/kernel.h"
 #include "ultima/ultima8/usecode/uc_machine.h"
 #include "ultima/ultima8/world/get_object.h"
+#include "ultima/ultima8/world/item.h"
 #include "ultima/ultima8/gumps/gump_notify_process.h"
 #include "ultima/ultima8/gumps/cru_status_gump.h"
 #include "ultima/ultima8/gumps/widgets/text_widget.h"
@@ -300,7 +301,7 @@ uint32 MovieGump::I_playMovieCutscene(const uint8 *args, unsigned int /*argsize*
 }
 
 uint32 MovieGump::I_playMovieCutsceneAlt(const uint8 *args, unsigned int /*argsize*/) {
-	ARG_ITEM_FROM_PTR(item);
+	ARG_ITEM_FROM_PTR(item); // TODO: Unused? Center on this first?
 	ARG_STRING(name);
 	ARG_UINT16(x);
 	ARG_UINT16(y);
@@ -310,11 +311,10 @@ uint32 MovieGump::I_playMovieCutsceneAlt(const uint8 *args, unsigned int /*argsi
 	if (!y)
 		y = 480;
 
-	warning("MovieGump::I_playMovieCutsceneAlt: TODO: This intrinsic should pause and fade the background to grey");
+	warning("MovieGump::I_playMovieCutsceneAlt: TODO: This intrinsic should pause and fade the background to grey (%s, %d)",
+			name.c_str(), item ? item->getObjId() : 0);
 
-	if (item) {
-		CruMovieViewer(name, x * 3, y * 3, nullptr, nullptr);
-	}
+	CruMovieViewer(name, x * 3, y * 3, nullptr, nullptr);
 
 	return 0;
 }


Commit: d4e5b427dc588cf8aafe438686cdded6c952597a
    https://github.com/scummvm/scummvm/commit/d4e5b427dc588cf8aafe438686cdded6c952597a
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-31T20:44:23+09:00

Commit Message:
ULTIMA8: JANITORIAL: Comments

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


diff --git a/engines/ultima/ultima8/world/actors/main_actor.h b/engines/ultima/ultima8/world/actors/main_actor.h
index fa94d1f5fe..83aaeeb1a1 100644
--- a/engines/ultima/ultima8/world/actors/main_actor.h
+++ b/engines/ultima/ultima8/world/actors/main_actor.h
@@ -134,16 +134,16 @@ public:
 		return _activeInvItem;
 	}
 
-	//!< Swap to the next active weapon (in Crusader)
+	//! Swap to the next active weapon (Crusader)
 	void nextWeapon();
 
-	//!< Swap to the next inventory item (in Crusader)
+	//! Swap to the next inventory item (Crusader)
 	void nextInvItem();
 
 	//! Check if we can absorb a hit with the shield. Returns the modified damage value.
 	int receiveShieldHit(int damage, uint16 damage_type) override;
 
-	//! Detonate used bomb
+	//! Detonate used bomb (Crusader)
 	void detonateBomb();
 
 	bool loadData(Common::ReadStream *rs, uint32 version);


Commit: f49f2dfde7761da2c0b3b15e414962635821a2f9
    https://github.com/scummvm/scummvm/commit/f49f2dfde7761da2c0b3b15e414962635821a2f9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-31T20:51:46+09:00

Commit Message:
ULTIMA8: Add BoboBoomer and RollingThunder processes from No Regret

Also add the customizations to the tookHit function that exist in No Regret -
particularly, different SFX that get played depending on the NPC shape.

RollingThunder is just a stub process for now - needs implementing.

Changed paths:
  A engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp
  A engines/ultima/ultima8/world/actors/rolling_thunder_process.h
  A engines/ultima/ultima8/world/bobo_boomer_process.cpp
  A engines/ultima/ultima8/world/bobo_boomer_process.h
    engines/ultima/module.mk
    engines/ultima/ultima8/ultima8.cpp
    engines/ultima/ultima8/world/actors/actor.cpp


diff --git a/engines/ultima/module.mk b/engines/ultima/module.mk
index 4624525905..b5f517824e 100644
--- a/engines/ultima/module.mk
+++ b/engines/ultima/module.mk
@@ -511,6 +511,7 @@ MODULE_OBJS := \
 	ultima8/usecode/uc_stack.o \
 	ultima8/usecode/usecode.o \
 	ultima8/usecode/usecode_flex.o \
+	ultima8/world/bobo_boomer_process.o \
 	ultima8/world/camera_process.o \
 	ultima8/world/container.o \
 	ultima8/world/create_item_process.o \
@@ -571,6 +572,7 @@ MODULE_OBJS := \
 	ultima8/world/actors/pathfinder_process.o \
 	ultima8/world/actors/quick_avatar_mover_process.o \
 	ultima8/world/actors/resurrection_process.o \
+	ultima8/world/actors/rolling_thunder_process.o \
 	ultima8/world/actors/scheduler_process.o \
 	ultima8/world/actors/surrender_process.o \
 	ultima8/world/actors/targeted_anim_process.o \
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 15a16a2a89..ba97fdc86d 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -83,6 +83,8 @@
 #include "ultima/ultima8/world/actors/attack_process.h"
 #include "ultima/ultima8/world/actors/auto_firer_process.h"
 #include "ultima/ultima8/world/actors/pace_process.h"
+#include "ultima/ultima8/world/actors/rolling_thunder_process.h"
+#include "ultima/ultima8/world/bobo_boomer_process.h"
 #include "ultima/ultima8/world/super_sprite_process.h"
 #include "ultima/ultima8/world/destroy_item_process.h"
 #include "ultima/ultima8/world/actors/ambush_process.h"
@@ -303,6 +305,10 @@ bool Ultima8Engine::startup() {
 		ProcessLoader<AttackProcess>::load);
 	_kernel->addProcessLoader("AutoFirerProcess",
 		ProcessLoader<AutoFirerProcess>::load);
+	_kernel->addProcessLoader("BoboBoomerProcess",
+		ProcessLoader<BoboBoomerProcess>::load);
+	_kernel->addProcessLoader("RollingThunderProcess",
+		ProcessLoader<RollingThunderProcess>::load);
 
 	_objectManager = new ObjectManager();
 	_mouse = new Mouse();
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 48f38eab8e..3981f3f4a7 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -45,6 +45,8 @@
 #include "ultima/ultima8/world/actors/attack_process.h"
 #include "ultima/ultima8/world/actors/pace_process.h"
 #include "ultima/ultima8/world/actors/surrender_process.h"
+#include "ultima/ultima8/world/actors/rolling_thunder_process.h"
+#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/sprite_process.h"
@@ -797,8 +799,8 @@ uint16 Actor::setActivityCru(int activity) {
 		return 0;
 	case 0xd:
 		// Only in No Regret
-		perr << "Actor::setActivityCru: TODO: RollingThunderProcess (" << activity << ")";
-		return doAnim(Animation::stand, dir_current);
+		setActorFlag(ACT_INCOMBAT);
+		return Kernel::get_instance()->addProcess(new RollingThunderProcess(this));
 	case 0x70:
 		return setActivity(getDefaultActivity(0));
 	case 0x71:
@@ -1026,8 +1028,15 @@ void Actor::receiveHitCru(uint16 other, Direction dir, int damage, uint16 damage
 	}
 }
 
+#define RAND_ELEM(array) (array[getRandom() % ARRAYSIZE(array)])
+
 void Actor::tookHitCru() {
+	AudioProcess *audio = AudioProcess::get_instance();
 	Animation::Sequence lastanim = getLastAnim();
+	bool isfemale = hasExtFlags(EXT_FEMALE);
+	if (!audio)
+		return;
+
 	if (lastanim == Animation::unknownAnim30 || lastanim == Animation::startRunLargeWeapon) {
 		Actor *controlled = getActor(World::get_instance()->getControlledNPCNum());
 		bool canseecontrolled = controlled && (getRangeIfVisible(*controlled) > 0);
@@ -1037,45 +1046,97 @@ void Actor::tookHitCru() {
 			else
 				setActivity(10);
 		}
-	} else {
+	} else if (GAME_IS_REMORSE) {
 		uint32 shape = getShape();
-		if (shape != 0x576) { // 0x576 = flaming guy
-			if (shape < 0x577) {
-				if (shape == 0x385 || shape == 0x4e6) {
-				   explode(2, 0);
-				   clearFlag(FLG_IN_NPC_LIST);
-				   clearFlag(FLG_GUMP_OPEN);
-			   }
-			   return;
-		   }
-		   if (shape != 0x596) {
-			   return;
-		   }
-		}
+		if (shape == 0x385 || shape == 0x4e6) {
+			explode(2, 0);
+			clearFlag(FLG_IN_NPC_LIST | FLG_GUMP_OPEN);
+		} else if (shape == 0x576 || shape == 0x596) {
+			bool violence = true; // Game::I_isViolenceEnabled
+			if (!violence)
+				return;
 
-		bool violence = true; // Game::I_isViolenceEnabled
-		if (!violence)
-			return;
+			static const uint16 FEMALE_SFX[] = {0xb, 0xa};
+			static const uint16 MALE_SFX[] = {0x65, 0x66, 0x67};
+			int nsounds = isfemale ? ARRAYSIZE(FEMALE_SFX) : ARRAYSIZE(MALE_SFX);
+			const uint16 *sounds = isfemale ? FEMALE_SFX : MALE_SFX;
 
-		static const uint16 FEMALE_SCREAMS[] = {0xb, 0xa};
-		static const uint16 MALE_SCREAMS[] = {0x65, 0x66, 0x67};
-		int nsounds;
-		const uint16 *sounds;
-		if (hasExtFlags(EXT_FEMALE)) {
-			nsounds = ARRAYSIZE(FEMALE_SCREAMS);
-			sounds = FEMALE_SCREAMS;
-		} else {
-			nsounds = ARRAYSIZE(MALE_SCREAMS);
-			sounds = MALE_SCREAMS;
+			for (int i = 0; i < nsounds; i++) {
+				if (audio->isSFXPlayingForObject(sounds[i], _objId))
+					return;
+			}
+
+			audio->playSFX(sounds[getRandom() % nsounds], 0x80, _objId, 1);
 		}
-		AudioProcess *audio = AudioProcess::get_instance();
-		if (!audio)
-			return;
-		for (int i = 0; i < nsounds; i++) {
-			if (audio->isSFXPlayingForObject(sounds[i], _objId))
+	} else if (GAME_IS_REGRET) {
+		switch (getShape()) {
+		case 0x596: {
+			static const uint16 FEMALE_SFX[] = {0x212, 0x211};
+			static const uint16 MALE_SFX[] = {0x213, 0x214};
+			int sfxno = isfemale ? RAND_ELEM(FEMALE_SFX) : RAND_ELEM(MALE_SFX);
+			audio->playSFX(sfxno, 0x80, _objId, 1);
+			break;
+		}
+		case 0x576: {
+			static const uint16 FEMALE_SFX[] = {0x3D, 0x77, 0x210};
+			static const uint16 MALE_SFX[] = {0x24F, 0x250, 0x201, 0x200};
+			bool violence = true; // Game::I_isViolenceEnabled
+			if (!violence)
 				return;
+
+			int nsounds = isfemale ? ARRAYSIZE(FEMALE_SFX) : ARRAYSIZE(MALE_SFX);
+			const uint16 *sounds = isfemale ? FEMALE_SFX : MALE_SFX;
+
+			for (int i = 0; i < nsounds; i++) {
+				if (audio->isSFXPlayingForObject(sounds[i], _objId))
+					return;
+			}
+
+			audio->playSFX(sounds[getRandom() % nsounds], 0x80, _objId, 1);
+			return;
+		}
+		case 0x385:
+		case 0x4e6: {
+			explode(2, false);
+			clearFlag(FLG_GUMP_OPEN | FLG_IN_NPC_LIST);
+			break;
+		}
+		case 0x5d6: {
+			static const uint16 MALE_SFX[] = {0x21B, 0x21A, 0x21C};
+			static const uint16 FEMALE_SFX[] = {0x21D, 0x215};
+			int sfxno = isfemale ? RAND_ELEM(FEMALE_SFX) : RAND_ELEM(MALE_SFX);
+			audio->playSFX(sfxno, 0x80, _objId, 1);
+			break;
+		}
+		case 0x62d: {
+			static const uint16 MALE_SFX[] = {0x217, 0x218};
+			static const uint16 FEMALE_SFX[] = {0x219, 0x216};
+			int sfxno = isfemale ? RAND_ELEM(FEMALE_SFX) : RAND_ELEM(MALE_SFX);
+			audio->playSFX(sfxno, 0x80, _objId, 1);
+			break;
+		}
+		case 0x656:
+		case 0x278: {
+			static const uint16 MALE_SFX[] = {0x20B, 0x20C, 0x20D};
+			static const uint16 FEMALE_SFX[] = {0x20E, 0x20F};
+			int sfxno = isfemale ? RAND_ELEM(FEMALE_SFX) : RAND_ELEM(MALE_SFX);
+			audio->playSFX(sfxno, 0x80, _objId, 1);
+			break;
+		}
+		case 0x5b1: {
+			Process *proc = new BoboBoomerProcess(this);
+			Kernel::get_instance()->addProcess(proc);
+			break;
+		}
+		case 0x58f:
+		case 0x59c: {
+			static const uint16 SOUNDS[] = {0xD9, 0xDA};
+			audio->playSFX(RAND_ELEM(SOUNDS), 0x80, _objId, 1);
+			break;
+		}
+		default:
+			break;
 		}
-		audio->playSFX(sounds[getRandom() % nsounds], 0x80, _objId, 1);
 	}
 }
 
diff --git a/engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp b/engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp
new file mode 100644
index 0000000000..c1d7c467bb
--- /dev/null
+++ b/engines/ultima/ultima8/world/actors/rolling_thunder_process.cpp
@@ -0,0 +1,74 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "ultima/ultima8/world/actors/rolling_thunder_process.h"
+#include "ultima/ultima8/world/actors/actor.h"
+#include "ultima/ultima8/kernel/kernel.h"
+#include "ultima/ultima8/kernel/delay_process.h"
+#include "ultima/ultima8/world/get_object.h"
+
+namespace Ultima {
+namespace Ultima8 {
+
+DEFINE_RUNTIME_CLASSTYPE_CODE(RollingThunderProcess)
+
+RollingThunderProcess::RollingThunderProcess() : Process() {
+}
+
+RollingThunderProcess::RollingThunderProcess(Actor *actor) {
+	assert(actor);
+	_itemNum = actor->getObjId();
+
+	_type = 0x263; // CONSTANT!
+}
+
+void RollingThunderProcess::run() {
+	Actor *actor = getActor(_itemNum);
+
+	if (!actor) {
+		// gone! maybe dead..
+		terminate();
+		return;
+	}
+
+	if (actor->isBusy()) {
+		Process *wait = new DelayProcess(60);
+		Kernel::get_instance()->addProcess(wait);
+		waitFor(wait);
+		return;
+	}
+
+	warning("TODO: Implement rolling thunder");
+	terminate();
+}
+
+void RollingThunderProcess::saveData(Common::WriteStream *ws) {
+	Process::saveData(ws);
+}
+
+bool RollingThunderProcess::loadData(Common::ReadStream *rs, uint32 version) {
+	if (!Process::loadData(rs, version)) return false;
+	return true;
+}
+
+} // End of namespace Ultima8
+} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/world/actors/rolling_thunder_process.h b/engines/ultima/ultima8/world/actors/rolling_thunder_process.h
new file mode 100644
index 0000000000..59f45ba071
--- /dev/null
+++ b/engines/ultima/ultima8/world/actors/rolling_thunder_process.h
@@ -0,0 +1,54 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef WORLD_ACTORS_ROLLINGTHUNDERPROCESS_H
+#define WORLD_ACTORS_ROLLINGTHUNDERPROCESS_H
+
+#include "ultima/ultima8/kernel/process.h"
+
+namespace Ultima {
+namespace Ultima8 {
+
+class Actor;
+
+/**
+ * A process to roll out, shoot at the player, and roll back.
+ * Only used in No Regret.
+ */
+class RollingThunderProcess : public Process {
+public:
+	RollingThunderProcess();
+	RollingThunderProcess(Actor *actor);
+
+	ENABLE_RUNTIME_CLASSTYPE()
+
+	void run() override;
+
+	bool loadData(Common::ReadStream *rs, uint32 version);
+	void saveData(Common::WriteStream *ws) override;
+
+};
+
+} // End of namespace Ultima8
+} // End of namespace Ultima
+
+#endif
diff --git a/engines/ultima/ultima8/world/bobo_boomer_process.cpp b/engines/ultima/ultima8/world/bobo_boomer_process.cpp
new file mode 100644
index 0000000000..f39867bcd2
--- /dev/null
+++ b/engines/ultima/ultima8/world/bobo_boomer_process.cpp
@@ -0,0 +1,94 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "ultima/ultima8/world/bobo_boomer_process.h"
+#include "ultima/ultima8/games/game_data.h"
+#include "ultima/ultima8/kernel/kernel.h"
+#include "ultima/ultima8/kernel/delay_process.h"
+#include "ultima/ultima8/world/item.h"
+#include "ultima/ultima8/world/fire_type.h"
+
+namespace Ultima {
+namespace Ultima8 {
+
+DEFINE_RUNTIME_CLASSTYPE_CODE(BoboBoomerProcess)
+
+BoboBoomerProcess::BoboBoomerProcess() : Process(),
+_counter(0), _x(0), _y(0), _z(0)
+{}
+
+BoboBoomerProcess::BoboBoomerProcess(const Item *item) : Process(), _counter(0)
+{
+	assert(item);
+	item->getLocation(_x, _y, _z);
+	_type = 0x264;
+}
+
+void BoboBoomerProcess::run() {
+	const FireType *firetype = GameData::get_instance()->getFireType(4);
+	assert(firetype);
+
+	int32 randx = static_cast<int32>(getRandom() % 15) - 7;
+	int32 randy = static_cast<int32>(getRandom() % 15) - 7;
+	Point3 pt(_x + randx * 32, _y + randy * 32, _z);
+	firetype->makeBulletSplashShapeAndPlaySound(pt.x, pt.y, pt.z);
+
+	if (firetype->getRange() > 0) {
+		uint16 damage = firetype->getRandomDamage();
+		firetype->applySplashDamageAround(pt, damage, 1, nullptr, nullptr);
+	}
+
+	_counter++;
+	if (_counter > 9) {
+		terminate();
+		return;
+	}
+
+	int sleep = (getRandom() % 15) + 5;
+	Process *wait = new DelayProcess(sleep);
+	Kernel::get_instance()->addProcess(wait);
+	waitFor(wait);
+}
+
+
+void BoboBoomerProcess::saveData(Common::WriteStream *ws) {
+	Process::saveData(ws);
+
+	ws->writeSint32LE(_counter);
+	ws->writeSint32LE(_x);
+	ws->writeSint32LE(_y);
+	ws->writeSint32LE(_z);
+}
+
+bool BoboBoomerProcess::loadData(Common::ReadStream *rs, uint32 version) {
+	if (!Process::loadData(rs, version)) return false;
+
+	_counter = rs->readSint32LE();
+	_x = rs->readSint32LE();
+	_y = rs->readSint32LE();
+	_z = rs->readSint32LE();
+
+	return true;
+}
+
+} // End of namespace Ultima8
+} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/world/bobo_boomer_process.h b/engines/ultima/ultima8/world/bobo_boomer_process.h
new file mode 100644
index 0000000000..07a9aded5d
--- /dev/null
+++ b/engines/ultima/ultima8/world/bobo_boomer_process.h
@@ -0,0 +1,60 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef ULTIMA8_WORLD_BOBOBOOMERPROCESS_H
+#define ULTIMA8_WORLD_BOBOBOOMERPROCESS_H
+
+#include "ultima/ultima8/kernel/process.h"
+#include "ultima/ultima8/misc/classtype.h"
+
+namespace Ultima {
+namespace Ultima8 {
+
+class Item;
+
+/**
+ * A process to make a bunch of explosions. bo-bo-boom!
+ * Only used in No Regret.
+ */
+class BoboBoomerProcess : public Process {
+public:
+	BoboBoomerProcess();
+	BoboBoomerProcess(const Item *item);
+
+	ENABLE_RUNTIME_CLASSTYPE()
+
+	void run() override;
+
+	bool loadData(Common::ReadStream *rs, uint32 version);
+	void saveData(Common::WriteStream *ws) override;
+
+private:
+	int32 _counter;
+	int32 _x;
+	int32 _y;
+	int32 _z;
+};
+
+} // End of namespace Ultima8
+} // End of namespace Ultima
+
+#endif


Commit: e749fb56c85f1d2b01d3f92e79c7b4028b2e37f2
    https://github.com/scummvm/scummvm/commit/e749fb56c85f1d2b01d3f92e79c7b4028b2e37f2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-31T20:52:06+09:00

Commit Message:
ULTIMA8: Wire up one No Regret intrinsic (isSfxPlayingForObject)

Changed paths:
    engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
    engines/ultima/ultima8/usecode/regret_intrinsics.h


diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
index 6837b10113..4138a27c81 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_regret.h
@@ -96,9 +96,9 @@ const char* const ConvertUsecodeRegret::_intrinsics[] = {
 	"Actor::destroyContents(void)",
 	"AudioProcess::I_setVolumeForItemSFX(uint16,uint16,byte)",
 	"Item::getDirToItem(uint16)",
-	"Intrinsic0035()",
+	"AudioProcess::I_isSfxPlayingForObject(Item *,uint sfxno)",
 	"Item::I_getRangeIfVisible()",
-	"udioProcess::I_playSFXCru()",
+	"AudioProcess::I_playSFXCru()",
 	"Item::andStatus(void)",
 	"Kernel::resetRef(uint16,ProcessType)",
 	"Item::touch(void)",
diff --git a/engines/ultima/ultima8/usecode/regret_intrinsics.h b/engines/ultima/ultima8/usecode/regret_intrinsics.h
index d3018fcf64..edb4cd5f6f 100644
--- a/engines/ultima/ultima8/usecode/regret_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/regret_intrinsics.h
@@ -87,7 +87,7 @@ Intrinsic RegretIntrinsics[] = {
 	Actor::I_destroyContents, // Intrinsic032()
 	0, // Intrinsic033() Item::I_SetVolumeForItemSFX
 	Item::I_getDirToItem, // Intrinsic034()
-	0, // Intrinsic035()
+	AudioProcess::I_isSFXPlayingForObject, // Intrinsic035()
 	Item::I_getRangeIfVisible, // Intrinsic036()
 	AudioProcess::I_playSFXCru, // Intrinsic037() TODO: Not exactly the same.
 	Item::I_andStatus, // Intrinsic038()




More information about the Scummvm-git-logs mailing list