[Scummvm-git-logs] scummvm master -> 72e8f4de0b8c1800338fb863508140e79e81d69b

mduggan mgithub at guarana.org
Sun Apr 4 11:33:55 UTC 2021


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

Summary:
e5bb414dbe ULTIMA8: Crusader: Avoid trying to kneel for robots
3487362c1c ULTIMA8: Fix deubg output of process
fa43ad36c7 ULTIMA8: Only add heal process in Ultima8
e0e6964c68 ULTIMA8: Avoid multiple LoiterProcesses for same npc
816dfdf354 ULTIMA8: Avoid multiple or invalid pace processes
5b5f134be7 ULTIMA8: Avoid selecting broken items
72e8f4de0b ULTIMA8: Add Crusader subtitle support


Commit: e5bb414dbe702eabac855e660fdca666ed31a1a5
    https://github.com/scummvm/scummvm/commit/e5bb414dbe702eabac855e660fdca666ed31a1a5
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-04T20:33:38+09:00

Commit Message:
ULTIMA8: Crusader: Avoid trying to kneel for robots

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 b5e57ed9dc..ba4a23172b 100644
--- a/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
+++ b/engines/ultima/ultima8/world/actors/cru_avatar_mover_process.cpp
@@ -157,7 +157,7 @@ void CruAvatarMoverProcess::handleCombatMode() {
 	} else if (hasMovementFlags(MOVE_BACK)) {
 		Animation::Sequence nextanim;
 		if (hasMovementFlags(MOVE_JUMP)) {
-			if (!avatar->isKneeling()) {
+			if (!avatar->isKneeling() && avatar->hasAnim(Animation::kneelStartCru)) {
 				nextanim = Animation::kneelStartCru;
 				avatar->setActorFlag(Actor::ACT_KNEELING);
 			} else {


Commit: 3487362c1c78c950e4f2734ce4d30cbb62a252da
    https://github.com/scummvm/scummvm/commit/3487362c1c78c950e4f2734ce4d30cbb62a252da
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-04T20:33:38+09:00

Commit Message:
ULTIMA8: Fix deubg output of process

Changed paths:
    engines/ultima/ultima8/kernel/process.cpp


diff --git a/engines/ultima/ultima8/kernel/process.cpp b/engines/ultima/ultima8/kernel/process.cpp
index 1ea67cd8a5..8f67e69b53 100644
--- a/engines/ultima/ultima8/kernel/process.cpp
+++ b/engines/ultima/ultima8/kernel/process.cpp
@@ -117,7 +117,7 @@ void Process::dumpInfo() const {
 		info += ", notify: ";
 		for (Std::vector<ProcId>::const_iterator i = _waiting.begin(); i != _waiting.end(); ++i) {
 			if (i != _waiting.begin()) info += ", ";
-			info += *i;
+			info += Common::String::format("%d", *i);
 		}
 	}
 


Commit: fa43ad36c71995ffe9c8ae8be9a90b7ac3b3751b
    https://github.com/scummvm/scummvm/commit/fa43ad36c71995ffe9c8ae8be9a90b7ac3b3751b
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-04T20:33:38+09:00

Commit Message:
ULTIMA8: Only add heal process in Ultima8

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


diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index e52b3000a3..494bc526dd 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -1100,7 +1100,8 @@ bool Ultima8Engine::newGame(int saveSlot) {
 		_avatarMoverProcess = new CruAvatarMoverProcess();
 	_kernel->addProcess(_avatarMoverProcess);
 
-	_kernel->addProcess(new HealProcess());
+	if (GAME_IS_U8)
+		_kernel->addProcess(new HealProcess());
 
 	_kernel->addProcess(new SchedulerProcess());
 


Commit: e0e6964c68d066fc05cbc7d9f3a7dd4d2d3b0cb2
    https://github.com/scummvm/scummvm/commit/e0e6964c68d066fc05cbc7d9f3a7dd4d2d3b0cb2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-04T20:33:38+09:00

Commit Message:
ULTIMA8: Avoid multiple LoiterProcesses for same npc

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


diff --git a/engines/ultima/ultima8/world/actors/loiter_process.cpp b/engines/ultima/ultima8/world/actors/loiter_process.cpp
index 416bd1d7b2..d2ead9d50b 100644
--- a/engines/ultima/ultima8/world/actors/loiter_process.cpp
+++ b/engines/ultima/ultima8/world/actors/loiter_process.cpp
@@ -44,6 +44,11 @@ LoiterProcess::LoiterProcess(Actor *actor, int32 c) : _count(c) {
 		_type = 0x205; // CONSTANT!
 	else
 		_type = 599;
+
+	// Only loiter with one process at a time.
+	Process *previous = Kernel::get_instance()->findProcess(_itemNum, _type);
+	if (previous)
+		previous->terminate();
 }
 
 void LoiterProcess::run() {
@@ -103,6 +108,11 @@ void LoiterProcess::run() {
 	}
 }
 
+void LoiterProcess::dumpInfo() const {
+	Process::dumpInfo();
+	pout << "Frames left: " << _count;
+}
+
 void LoiterProcess::saveData(Common::WriteStream *ws) {
 	Process::saveData(ws);
 
diff --git a/engines/ultima/ultima8/world/actors/loiter_process.h b/engines/ultima/ultima8/world/actors/loiter_process.h
index 696a144dd5..3d179e89e9 100644
--- a/engines/ultima/ultima8/world/actors/loiter_process.h
+++ b/engines/ultima/ultima8/world/actors/loiter_process.h
@@ -42,6 +42,7 @@ public:
 	bool loadData(Common::ReadStream *rs, uint32 version);
 	void saveData(Common::WriteStream *ws) override;
 
+	void dumpInfo() const override;
 protected:
 	int32 _count;
 };


Commit: 816dfdf3540bdf1de2d47bc82da0a87a1223bb66
    https://github.com/scummvm/scummvm/commit/816dfdf3540bdf1de2d47bc82da0a87a1223bb66
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-04T20:33:38+09:00

Commit Message:
ULTIMA8: Avoid multiple or invalid pace processes

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


diff --git a/engines/ultima/ultima8/world/actors/pace_process.cpp b/engines/ultima/ultima8/world/actors/pace_process.cpp
index 7708d088aa..e7324e0be2 100644
--- a/engines/ultima/ultima8/world/actors/pace_process.cpp
+++ b/engines/ultima/ultima8/world/actors/pace_process.cpp
@@ -39,11 +39,16 @@ PaceProcess::PaceProcess(Actor *actor): _counter(0) {
 	assert(actor);
 	_itemNum = actor->getObjId();
 	_type = 0x255;
+
+	// Only pace with one process at a time.
+	Process *previous = Kernel::get_instance()->findProcess(_itemNum, _type);
+	if (previous)
+		previous->terminate();
 }
 
 
 bool PaceProcess::maybeStartDefaultActivity1(Actor *actor) {
-	const Actor *mainactor = getMainActor();
+	const Actor *mainactor = getControlledActor();
 	if (!mainactor)
 		return false;
 
@@ -72,6 +77,9 @@ void PaceProcess::run() {
 		return;
 	}
 
+	if (!a->hasFlags(Item::FLG_FASTAREA))
+		return;
+
 	if (maybeStartDefaultActivity1(a))
 		return;
 


Commit: 5b5f134be72deb4de62743f1cdde3b7508917a25
    https://github.com/scummvm/scummvm/commit/5b5f134be72deb4de62743f1cdde3b7508917a25
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-04T20:33:38+09:00

Commit Message:
ULTIMA8: Avoid selecting broken items

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 d6a2a2e603..3252004122 100644
--- a/engines/ultima/ultima8/world/current_map.cpp
+++ b/engines/ultima/ultima8/world/current_map.cpp
@@ -357,6 +357,10 @@ Item *CurrentMap::findBestTargetItem(int32 x, int32 y, Direction dir, DirectionM
 			_targets[i] = 0;
 			continue;
 		}
+
+		if (item->hasFlags(Item::FLG_BROKEN))
+			continue;
+
 		const ShapeInfo *si = item->getShapeInfo();
 		bool isoccl = si->_flags & ShapeInfo::SI_OCCL;
 


Commit: 72e8f4de0b8c1800338fb863508140e79e81d69b
    https://github.com/scummvm/scummvm/commit/72e8f4de0b8c1800338fb863508140e79e81d69b
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-04-04T20:33:38+09:00

Commit Message:
ULTIMA8: Add Crusader subtitle support

Changed paths:
    engines/ultima/ultima8/graphics/avi_player.cpp
    engines/ultima/ultima8/graphics/avi_player.h
    engines/ultima/ultima8/gumps/movie_gump.cpp
    engines/ultima/ultima8/gumps/movie_gump.h


diff --git a/engines/ultima/ultima8/graphics/avi_player.cpp b/engines/ultima/ultima8/graphics/avi_player.cpp
index 8469dad12f..6f94478c01 100644
--- a/engines/ultima/ultima8/graphics/avi_player.cpp
+++ b/engines/ultima/ultima8/graphics/avi_player.cpp
@@ -124,5 +124,9 @@ void AVIPlayer::run() {
 	}
 }
 
+int AVIPlayer::getFrameNo() const {
+	return _decoder->getCurFrame();
+}
+
 } // End of namespace Ultima8
 } // End of namespace Ultima
diff --git a/engines/ultima/ultima8/graphics/avi_player.h b/engines/ultima/ultima8/graphics/avi_player.h
index 4d5e663947..5c68b38c96 100644
--- a/engines/ultima/ultima8/graphics/avi_player.h
+++ b/engines/ultima/ultima8/graphics/avi_player.h
@@ -53,6 +53,8 @@ public:
 		return _playing;
 	}
 
+	int getFrameNo() const;
+
 private:
 
 	bool _playing;
diff --git a/engines/ultima/ultima8/gumps/movie_gump.cpp b/engines/ultima/ultima8/gumps/movie_gump.cpp
index 78cabc8c3a..dae84a38dc 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.cpp
+++ b/engines/ultima/ultima8/gumps/movie_gump.cpp
@@ -33,6 +33,7 @@
 #include "ultima/ultima8/world/get_object.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"
 
 #include "ultima/ultima8/filesys/file_system.h"
 
@@ -48,7 +49,7 @@ MovieGump::MovieGump() : ModalGump(), _player(nullptr) {
 MovieGump::MovieGump(int width, int height, Common::SeekableReadStream *rs,
                      bool introMusicHack, bool noScale, const byte *overridePal,
 					 uint32 flags, int32 layer)
-		: ModalGump(50, 50, width, height, 0, flags, layer) {
+		: ModalGump(50, 50, width, height, 0, flags, layer), _subtitleWidget(0) {
 	uint32 stream_id = rs->readUint32BE();
 	rs->seek(-4, SEEK_CUR);
 	if (stream_id == 0x52494646) {// 'RIFF' - crusader AVIs
@@ -93,6 +94,24 @@ void MovieGump::run() {
 	ModalGump::run();
 
 	_player->run();
+
+	AVIPlayer *aviplayer = dynamic_cast<AVIPlayer *>(_player);
+	if (aviplayer) {
+		const int frameno = aviplayer->getFrameNo();
+		if (_subtitles.contains(frameno)) {
+			TextWidget *subtitle = dynamic_cast<TextWidget *>(getGump(_subtitleWidget));
+			if (subtitle)
+				subtitle->Close();
+			// Create a new TextWidget
+			TextWidget *widget = new TextWidget(0, 0, _subtitles[frameno], true, 4, 640, 10);
+			widget->InitGump(this);
+			widget->setRelativePosition(BOTTOM_CENTER, 0, -10);
+			// Subtitles should be white.
+			widget->setBlendColour(0xffffffff);
+			_subtitleWidget = widget->getObjId();
+		}
+	}
+
 	if (!_player->isPlaying()) {
 		Close();
 	}
@@ -137,6 +156,36 @@ ProcId MovieGump::U8MovieViewer(Common::SeekableReadStream *rs, bool fade, bool
 	}
 }
 
+void MovieGump::loadSubtitles(Common::SeekableReadStream *rs) {
+	const uint32 id = rs->readUint32BE();
+	rs->seek(0);
+
+	if (id == 0x464F524D) { // 'FORM'
+		loadIFFSubs(rs);
+	} else {
+		loadTXTSubs(rs);
+	}
+}
+
+void MovieGump::loadTXTSubs(Common::SeekableReadStream *rs) {
+	int frameno = 0;
+	Common::String subtitles;
+	while (!rs->eos()) {
+		Common::String line = rs->readLine();
+		if (line.hasPrefix("@frame ")) {
+			frameno = atoi(line.c_str() + 7);
+			subtitles += '\n';
+		} else {
+			_subtitles[frameno] = line;
+			subtitles += line;
+		}
+	}
+}
+
+void MovieGump::loadIFFSubs(Common::SeekableReadStream *rs) {
+	warning("TODO: load IFF subtitle data");
+}
+
 bool MovieGump::loadData(Common::ReadStream *rs) {
 	return false;
 }
@@ -168,22 +217,36 @@ static Std::string _fixCrusaderMovieName(const Std::string &s) {
 	return s;
 }
 
-static Common::SeekableReadStream *_tryLoadCruMovie(const Std::string &filename) {
-	const Std::string path = Std::string::format("flics/%s.avi", filename.c_str());
+static Common::SeekableReadStream *_tryLoadCruMovieFile(const Std::string &filename, const char *extn) {
+	const Std::string path = Std::string::format("flics/%s.%s", filename.c_str(), extn);
 	FileSystem *filesys = FileSystem::get_instance();
 	Common::SeekableReadStream *rs = filesys->ReadFile(path);
 	if (!rs) {
 		// Try with a "0" in the name
-		const Std::string adjustedfn = Std::string::format("flics/0%s.avi", filename.c_str());
+		const Std::string adjustedfn = Std::string::format("flics/0%s.%s", filename.c_str(), extn);
 		rs = filesys->ReadFile(adjustedfn);
-		if (!rs) {
-			warning("movie %s not found", filename.c_str());
-			return 0;
-		}
+		if (!rs)
+			return nullptr;
 	}
 	return rs;
 }
 
+static Common::SeekableReadStream *_tryLoadCruAVI(const Std::string &filename) {
+	Common::SeekableReadStream *rs = _tryLoadCruMovieFile(filename, "avi");
+	if (!rs)
+		warning("movie %s not found", filename.c_str());
+	return rs;
+}
+
+// Convenience function that tries to open both TXT (No Remorse)
+// and IFF (No Regret) subtitle formats.
+static Common::SeekableReadStream *_tryLoadCruSubtitle(const Std::string &filename) {
+	Common::SeekableReadStream *txtfile = _tryLoadCruMovieFile(filename, "txt");
+	if (txtfile)
+		return txtfile;
+	return _tryLoadCruMovieFile(filename, "iff");
+}
+
 uint32 MovieGump::I_playMovieOverlay(const uint8 *args,
         unsigned int /*argsize*/) {
 	ARG_ITEM_FROM_PTR(item);
@@ -201,11 +264,12 @@ uint32 MovieGump::I_playMovieOverlay(const uint8 *args,
 		const Palette *pal = palman->getPalette(PaletteManager::Pal_Game);
 		assert(pal);
 
-		Common::SeekableReadStream *rs = _tryLoadCruMovie(name);
+		Common::SeekableReadStream *rs = _tryLoadCruAVI(name);
 		if (rs) {
-			Gump *gump = new MovieGump(x, y, rs, false, false, pal->_palette);
+			MovieGump *gump = new MovieGump(x, y, rs, false, false, pal->_palette);
 			gump->InitGump(nullptr, true);
 			gump->setRelativePosition(CENTER);
+			gump->loadSubtitles(_tryLoadCruSubtitle(name));
 		}
 	}
 
@@ -219,11 +283,12 @@ uint32 MovieGump::I_playMovieCutscene(const uint8 *args, unsigned int /*argsize*
 	ARG_UINT16(y);
 
 	if (item) {
-		Common::SeekableReadStream *rs = _tryLoadCruMovie(name);
+		Common::SeekableReadStream *rs = _tryLoadCruAVI(name);
 		if (rs) {
-			Gump *gump = new MovieGump(x * 3, y * 3, rs, false, false);
+			MovieGump *gump = new MovieGump(x * 3, y * 3, rs, false, false);
 			gump->InitGump(nullptr, true);
 			gump->setRelativePosition(CENTER);
+			gump->loadSubtitles(_tryLoadCruSubtitle(name));
 		}
 	}
 
@@ -239,11 +304,12 @@ uint32 MovieGump::I_playMovieCutsceneAlt(const uint8 *args, unsigned int /*argsi
 	warning("MovieGump::I_playMovieCutsceneAlt: TODO: This intrinsic should pause and fade the background to grey");
 
 	if (item) {
-		Common::SeekableReadStream *rs = _tryLoadCruMovie(name);
+		Common::SeekableReadStream *rs = _tryLoadCruAVI(name);
 		if (rs) {
-			Gump *gump = new MovieGump(x * 3, y * 3, rs, false, false);
+			MovieGump *gump = new MovieGump(x * 3, y * 3, rs, false, false);
 			gump->InitGump(nullptr, true);
 			gump->setRelativePosition(CENTER);
+			gump->loadSubtitles(_tryLoadCruSubtitle(name));
 		}
 	}
 
@@ -256,11 +322,12 @@ uint32 MovieGump::I_playMovieCutsceneRegret(const uint8 *args, unsigned int /*ar
 
 	warning("MovieGump::I_playMovieCutsceneRegret: TODO: use fade argument %d", fade);
 
-	Common::SeekableReadStream *rs = _tryLoadCruMovie(name);
+	Common::SeekableReadStream *rs = _tryLoadCruAVI(name);
 	if (rs) {
-		Gump *gump = new MovieGump(640, 480, rs, false, false);
+		MovieGump *gump = new MovieGump(640, 480, rs, false, false);
 		gump->InitGump(nullptr, true);
 		gump->setRelativePosition(CENTER);
+		gump->loadSubtitles(_tryLoadCruSubtitle(name));
 	}
 
 	return 0;
diff --git a/engines/ultima/ultima8/gumps/movie_gump.h b/engines/ultima/ultima8/gumps/movie_gump.h
index 3ea99e0275..34399ee48a 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.h
+++ b/engines/ultima/ultima8/gumps/movie_gump.h
@@ -67,6 +67,19 @@ public:
 
 protected:
 	MoviePlayer *_player;
+
+	// Load subtitles with format detection
+	void loadSubtitles(Common::SeekableReadStream *rs);
+
+	// Load subtitles from a txt file (No Remorse format)
+	void loadTXTSubs(Common::SeekableReadStream *rs);
+
+	// Load subtitles from a iff file (No Regret format)
+	void loadIFFSubs(Common::SeekableReadStream *rs);
+
+	Common::HashMap<int, Common::String> _subtitles;
+	uint16 _subtitleWidget;
+
 };
 
 } // End of namespace Ultima8




More information about the Scummvm-git-logs mailing list