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

mduggan mgithub at guarana.org
Fri Jul 16 12:44:58 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:
eb3b79e927 ULTIMA8: Clear No Regret subtitles as needed
db26443022 ULTIMA8: Add support for IFF subtitles from No Regret.


Commit: eb3b79e927b309aa5cf01c4e44a9f14588eca6e1
    https://github.com/scummvm/scummvm/commit/eb3b79e927b309aa5cf01c4e44a9f14588eca6e1
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-07-16T21:44:49+09:00

Commit Message:
ULTIMA8: Clear No Regret subtitles as needed

This fixes a leftover subtitle at the end of the intro movie.

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 556745be6d..9da911e661 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.cpp
+++ b/engines/ultima/ultima8/gumps/movie_gump.cpp
@@ -164,8 +164,9 @@ void MovieGump::run() {
 				TextWidget *subtitle = dynamic_cast<TextWidget *>(getGump(_subtitleWidget));
 				if (subtitle)
 					subtitle->Close();
-				// Create a new TextWidget
-				TextWidget *widget = new TextWidget(0, 0, _subtitles[f], true, 4, 640, 10);
+				// Create a new TextWidget. No Regret uses font 3
+				int subtitle_font = GAME_IS_REMORSE ? 4 : 3;
+				TextWidget *widget = new TextWidget(0, 0, _subtitles[f], true, subtitle_font, 640, 10);
 				widget->InitGump(this);
 				widget->setRelativePosition(BOTTOM_CENTER, 0, -10);
 				// Subtitles should be white.
@@ -268,15 +269,18 @@ void MovieGump::loadSubtitles(Common::SeekableReadStream *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 ")) {
+			if (frameno != 0) {
+				// two @frame directives in a row means that the last
+				// subtitle should be turned *off* at the first frame
+				_subtitles[frameno] = "";
+			}
 			frameno = atoi(line.c_str() + 7);
-			subtitles += '\n';
 		} else {
 			_subtitles[frameno] = line;
-			subtitles += line;
+			frameno = 0;
 		}
 	}
 }


Commit: db2644302243c084c71ca4895edb0da8530ed5f8
    https://github.com/scummvm/scummvm/commit/db2644302243c084c71ca4895edb0da8530ed5f8
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-07-16T21:44:49+09:00

Commit Message:
ULTIMA8: Add support for IFF subtitles from No Regret.

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 9da911e661..89f4916eed 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.cpp
+++ b/engines/ultima/ultima8/gumps/movie_gump.cpp
@@ -31,6 +31,7 @@
 #include "ultima/ultima8/graphics/fade_to_modal_process.h"
 #include "ultima/ultima8/ultima8.h"
 #include "ultima/ultima8/games/game_data.h"
+#include "ultima/ultima8/games/game.h"
 #include "ultima/ultima8/kernel/mouse.h"
 #include "ultima/ultima8/kernel/kernel.h"
 #include "ultima/ultima8/usecode/uc_machine.h"
@@ -285,8 +286,53 @@ void MovieGump::loadTXTSubs(Common::SeekableReadStream *rs) {
 	}
 }
 
+// Some fourCCs used in IFF files
+static const uint32 IFF_MAGIC   = 0x464F524D;  // 'FORM'
+static const uint32 IFF_LANG    = 0x4C414E47;  // 'LANG'
+static const uint32 IFF_LANG_FR = 0x4652454E;  // 'FREN'
+static const uint32 IFF_LANG_EN = 0x454E474C;  // 'ENGL'
+static const uint32 IFF_LANG_DE = 0x4745524D;  // 'GERM'
+
 void MovieGump::loadIFFSubs(Common::SeekableReadStream *rs) {
-	warning("TODO: load IFF subtitle data");
+	uint32 magic = rs->readUint32BE();
+	if (magic != IFF_MAGIC) {
+		warning("Error loading IFF file, invalid magic.");
+		return;
+	}
+
+	rs->skip(2);
+	uint16 totalsize = rs->readUint16BE();
+	if (totalsize != rs->size() - rs->pos()) {
+		warning("Error loading IFF file: size invalid.");
+		return;
+	}
+
+	uint32 lang_magic = rs->readUint32BE();
+	if (lang_magic != IFF_LANG) {
+		warning("Error loading IFF file: invalid magic.");
+		return;
+	}
+
+	const Common::Language lang = Ultima8Engine::get_instance()->getLanguage();
+	while (rs->pos() < rs->size()) {
+		uint32 lang_code = rs->readUint32BE();
+		uint32 lang_len = rs->readUint32BE();
+		uint32 lang_end = rs->pos() + lang_len;
+		if ((lang == Common::FR_FRA && lang_code == IFF_LANG_FR)
+			|| (lang == Common::DE_DEU && lang_code == IFF_LANG_DE)
+			|| (lang == Common::EN_ANY && lang_code == IFF_LANG_EN)) {
+			while (rs->pos() < lang_end) {
+				// Take care of the mix of LE and BE.
+				uint16 frameoff = rs->readUint16LE();
+				rs->skip(1); // what's this?
+				uint32 slen = rs->readUint16BE();
+				const Common::String line = rs->readString('\0', slen);
+				_subtitles[frameoff] = line;
+			}
+		} else {
+			rs->skip(lang_len);
+		}
+	}
 }
 
 bool MovieGump::loadData(Common::ReadStream *rs) {




More information about the Scummvm-git-logs mailing list