[Scummvm-git-logs] scummvm master -> 546a4d1bf560fee42475fc028d73ef792a8b30e2

mduggan mgithub at guarana.org
Wed Jul 15 02:44:58 UTC 2020


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

Summary:
26a94e2bdc ULTIMA8: Add intrinsic for playing in-game Crusader avis
a49e070314 ULTIMA8: Add intrinics for showing/hiding status gumps in Crusader
546a4d1bf5 ULTIMA8: Add new Crusader intrinsics to table


Commit: 26a94e2bdcd090fbbcd18041cd2f94164dec7988
    https://github.com/scummvm/scummvm/commit/26a94e2bdcd090fbbcd18041cd2f94164dec7988
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-15T11:38:37+09:00

Commit Message:
ULTIMA8: Add intrinsic for playing in-game Crusader avis

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 4c0c306fe5..5f55deb2a6 100644
--- a/engines/ultima/ultima8/graphics/avi_player.cpp
+++ b/engines/ultima/ultima8/graphics/avi_player.cpp
@@ -33,9 +33,9 @@
 namespace Ultima {
 namespace Ultima8 {
 
-AVIPlayer::AVIPlayer(Common::SeekableReadStream *rs, int width, int height)
+AVIPlayer::AVIPlayer(Common::SeekableReadStream *rs, int width, int height, const byte *overridePal)
 	: MoviePlayer(), _playing(false), _width(width), _height(height),
-	  _doubleSize(false) {
+	  _doubleSize(false), _overridePal(overridePal) {
 	_decoder = new Video::AVIDecoder();
 	_decoder->loadStream(rs);
 	uint32 vidWidth = _decoder->getWidth();
@@ -77,7 +77,12 @@ void AVIPlayer::paint(RenderSurface *surf, int /*lerp*/) {
 			return;
 		}
 		if (frame->format.bytesPerPixel == 1) {
-			const byte *pal = _decoder->getPalette();
+			const byte *pal;
+			if (_overridePal)
+				pal = _overridePal;
+			else
+				pal = _decoder->getPalette();
+
 			_currentFrame.loadSurface8Bit(frame, pal);
 		} else {
 			_currentFrame.loadSurface(frame);
diff --git a/engines/ultima/ultima8/graphics/avi_player.h b/engines/ultima/ultima8/graphics/avi_player.h
index f490730bca..0c73d864e8 100644
--- a/engines/ultima/ultima8/graphics/avi_player.h
+++ b/engines/ultima/ultima8/graphics/avi_player.h
@@ -36,7 +36,7 @@ namespace Ultima8 {
 
 class AVIPlayer : public MoviePlayer {
 public:
-	AVIPlayer(Common::SeekableReadStream *rs, int width, int height);
+	AVIPlayer(Common::SeekableReadStream *rs, int width, int height, const byte *overridePal);
 	~AVIPlayer();
 
 	void run() override;
@@ -44,7 +44,7 @@ public:
 
 	void start() override;
 	void stop() override;
-	bool isPlaying() const override{
+	bool isPlaying() const override {
 		return _playing;
 	}
 
@@ -60,6 +60,7 @@ private:
 	uint32 _xoff;
 	uint32 _yoff;
 	bool _doubleSize;
+	const byte *_overridePal;
 
 };
 
diff --git a/engines/ultima/ultima8/gumps/movie_gump.cpp b/engines/ultima/ultima8/gumps/movie_gump.cpp
index c18c63b9ee..314552fb89 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.cpp
+++ b/engines/ultima/ultima8/gumps/movie_gump.cpp
@@ -26,9 +26,14 @@
 #include "ultima/ultima8/filesys/raw_archive.h"
 #include "ultima/ultima8/graphics/avi_player.h"
 #include "ultima/ultima8/graphics/skf_player.h"
+#include "ultima/ultima8/graphics/palette_manager.h"
 #include "ultima/ultima8/graphics/fade_to_modal_process.h"
 #include "ultima/ultima8/ultima8.h"
 #include "ultima/ultima8/kernel/kernel.h"
+#include "ultima/ultima8/usecode/intrinsics.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/desktop_gump.h"
 #include "ultima/ultima8/gumps/gump_notify_process.h"
 
@@ -39,17 +44,18 @@ namespace Ultima8 {
 
 DEFINE_RUNTIME_CLASSTYPE_CODE(MovieGump)
 
-MovieGump::MovieGump() : ModalGump(), _player(0) {
+MovieGump::MovieGump() : ModalGump(), _player(nullptr) {
 
 }
 
 MovieGump::MovieGump(int width, int height, Common::SeekableReadStream *rs,
-                     bool introMusicHack, uint32 flags, int32 layer)
+                     bool introMusicHack, const byte *overridePal,
+					 uint32 flags, int32 layer)
 		: ModalGump(50, 50, width, height, 0, flags, layer) {
 	uint32 stream_id = rs->readUint32BE();
 	rs->seek(-4, SEEK_CUR);
 	if (stream_id == 0x52494646) {// 'RIFF' - crusader AVIs
-		_player = new AVIPlayer(rs, width, height);
+		_player = new AVIPlayer(rs, width, height, overridePal);
 	} else {
 		_player = new SKFPlayer(rs, width, height, introMusicHack);
 	}
@@ -115,7 +121,7 @@ ProcId MovieGump::U8MovieViewer(Common::SeekableReadStream *rs, bool fade, bool
 	}
 	else
 	{
-		gump->InitGump(0);
+		gump->InitGump(nullptr);
 		gump->setRelativePosition(CENTER);
 		gump->CreateNotifier();
 		return gump->GetNotifyProcess()->getPid();
@@ -130,5 +136,60 @@ void MovieGump::saveData(Common::WriteStream *ws) {
 
 }
 
+static Std::string _fixCrusaderMovieName(const Std::string &s) {
+	/*
+	 HACK! The game comes with movies MVA01.AVI etc, but the usecode mentions both
+	 MVA01 and MVA1.  We do a translation here.	 These are the strings we need to fix:
+	 008E: 0D	push string	"mva1"
+	 036D: 0D	push string	"mva3a"
+	 04E3: 0D	push string	"mva4"
+	 0656: 0D	push string	"mva5a"
+	 07BD: 0D	push string	"mva6"
+	 0944: 0D	push string	"mva7"
+	 0A68: 0D	push string	"mva8"
+	 0B52: 0D	push string	"mva9"
+	*/
+	if (s.size() == 4)
+		return Std::string::format("mva0%c", s[3]);
+	else if (s.equals("mva3a"))
+		return "mva03a";
+	else if (s.equals("mva5a"))
+		return "mva05a";
+
+	return s;
+}
+
+uint32 MovieGump::I_playMovieOverlay(const uint8 *args,
+        unsigned int /*argsize*/) {
+	ARG_ITEM_FROM_PTR(item);
+	ARG_STRING(name);
+	ARG_UINT16(x);
+	ARG_UINT16(y);
+
+	PaletteManager *palman = PaletteManager::get_instance();
+
+	if (item && palman) {
+		if (name.hasPrefix("mva")) {
+			name = _fixCrusaderMovieName(name);
+		}
+
+		const Palette *pal = palman->getPalette(PaletteManager::Pal_Game);
+		assert(pal);
+
+		const Std::string filename = Std::string::format("@game/flics/%s.avi", name.c_str());
+		FileSystem *filesys = FileSystem::get_instance();
+		Common::SeekableReadStream *rs = filesys->ReadFile(filename);
+		if (!rs) {
+			warning("couldn't create gump for unknown movie %s", name.c_str());
+			return 0;
+		}
+		Gump *gump = new MovieGump(x, y, rs, false, pal->_palette);
+		gump->InitGump(nullptr, true);
+		gump->setRelativePosition(CENTER);
+	}
+
+	return 0;
+}
+
 } // End of namespace Ultima8
 } // End of namespace Ultima
diff --git a/engines/ultima/ultima8/gumps/movie_gump.h b/engines/ultima/ultima8/gumps/movie_gump.h
index 3130162bc0..c1fa2b39ec 100644
--- a/engines/ultima/ultima8/gumps/movie_gump.h
+++ b/engines/ultima/ultima8/gumps/movie_gump.h
@@ -24,6 +24,7 @@
 #define ULTIMA8_GUMPS_MOVIEGUMP_H
 
 #include "ultima/ultima8/gumps/modal_gump.h"
+#include "ultima/ultima8/usecode/intrinsics.h"
 #include "ultima/ultima8/misc/p_dynamic_cast.h"
 
 namespace Ultima {
@@ -37,7 +38,8 @@ public:
 	ENABLE_RUNTIME_CLASSTYPE()
 
 	MovieGump();
-	MovieGump(int width, int height, Common::SeekableReadStream *rs, bool introMusicHack = false,
+	MovieGump(int width, int height, Common::SeekableReadStream *rs,
+			  bool introMusicHack = false, const byte *overridePal = nullptr,
 	          uint32 flags = 0, int32 layer = LAYER_MODAL);
 	~MovieGump() override;
 
@@ -57,6 +59,8 @@ public:
 	bool loadData(Common::ReadStream *rs);
 	void saveData(Common::WriteStream *ws) override;
 
+	INTRINSIC(I_playMovieOverlay);
+
 protected:
 	MoviePlayer *_player;
 };


Commit: a49e070314aef2f54543eed3d395603f046da749
    https://github.com/scummvm/scummvm/commit/a49e070314aef2f54543eed3d395603f046da749
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-15T11:38:37+09:00

Commit Message:
ULTIMA8: Add intrinics for showing/hiding status gumps in Crusader

Changed paths:
    engines/ultima/ultima8/gumps/cru_status_gump.cpp
    engines/ultima/ultima8/gumps/cru_status_gump.h


diff --git a/engines/ultima/ultima8/gumps/cru_status_gump.cpp b/engines/ultima/ultima8/gumps/cru_status_gump.cpp
index 399746ba26..c14f8ae85e 100644
--- a/engines/ultima/ultima8/gumps/cru_status_gump.cpp
+++ b/engines/ultima/ultima8/gumps/cru_status_gump.cpp
@@ -47,12 +47,11 @@ static const int PX_GAP = 17;			//! gap (x) between boxes in status bar
 
 static const int FRAME_GUMP_SHAPE = 1;
 
-CruStatusGump::CruStatusGump() : Gump() {
-
-}
+CruStatusGump *CruStatusGump::_instance = nullptr;
 
-CruStatusGump::CruStatusGump(int x, int y, uint32 flags, int32 layer)
-	: Gump(0, 0, 5, 5, 0, flags, layer) {
+CruStatusGump::CruStatusGump() : Gump() {
+	assert(!_instance);
+	_instance = this;
 }
 
 CruStatusGump::~CruStatusGump() {
@@ -107,5 +106,25 @@ bool CruStatusGump::loadData(Common::ReadStream *rs, uint32 version) {
 	return Gump::loadData(rs, version);
 }
 
+uint32 CruStatusGump::I_hideStatusGump(const uint8 * /*args*/,
+unsigned int /*argsize*/) {
+	CruStatusGump *instance = get_instance();
+	if (instance) {
+		instance->Close();
+		_instance = nullptr;
+	}
+	return 0;
+}
+
+uint32 CruStatusGump::I_showStatusGump(const uint8 * /*args*/,
+	unsigned int /*argsize*/) {
+	CruStatusGump *instance = get_instance();
+	if (!instance) {
+		instance = new CruStatusGump();
+		instance->InitGump(nullptr, false);
+	}
+	return 0;
+}
+
 } // End of namespace Ultima8
 } // End of namespace Ultima
diff --git a/engines/ultima/ultima8/gumps/cru_status_gump.h b/engines/ultima/ultima8/gumps/cru_status_gump.h
index 5abaa36c41..02bde8049f 100644
--- a/engines/ultima/ultima8/gumps/cru_status_gump.h
+++ b/engines/ultima/ultima8/gumps/cru_status_gump.h
@@ -24,6 +24,7 @@
 #define ULTIMA8_GUMPS_CRUSTATUSGUMP_H
 
 #include "ultima/ultima8/gumps/gump.h"
+#include "ultima/ultima8/usecode/intrinsics.h"
 #include "ultima/ultima8/misc/p_dynamic_cast.h"
 
 namespace Ultima {
@@ -38,8 +39,6 @@ public:
 	ENABLE_RUNTIME_CLASSTYPE()
 
 	CruStatusGump();
-	CruStatusGump(int x, int y, uint32 flags = 0,
-	              int32 layer = LAYER_NORMAL);
 	~CruStatusGump() override;
 
 	// Init the gump, call after construction
@@ -50,6 +49,16 @@ public:
 
 	bool loadData(Common::ReadStream *rs, uint32 version);
 	void saveData(Common::WriteStream *ws) override;
+
+	static CruStatusGump *get_instance() {
+		return _instance;
+	}
+
+	INTRINSIC(I_hideStatusGump);
+	INTRINSIC(I_showStatusGump);
+
+private:
+	static CruStatusGump *_instance;
 };
 
 } // End of namespace Ultima8


Commit: 546a4d1bf560fee42475fc028d73ef792a8b30e2
    https://github.com/scummvm/scummvm/commit/546a4d1bf560fee42475fc028d73ef792a8b30e2
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-07-15T11:38:37+09:00

Commit Message:
ULTIMA8: Add new Crusader intrinsics to table

Changed paths:
    engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
    engines/ultima/ultima8/ultima8.cpp
    engines/ultima/ultima8/usecode/remorse_intrinsics.h


diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index 6479316dbf..1fc06333db 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -165,9 +165,9 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
 	"int16 Actor::I_getLastAnimSet(4 bytes)", // part of same coff set 01D, 05A, 0B9, 0D7, 0E4, 124
 	"byte Item::I_legalCreateAtPoint(Item *, int16 shape, int16 frame, Point *)", // see PEPSIEW::use
 	"void Item::I_getPoint(Item *, Point *)",
-	"void I_mouseSomethingOffMaybe05D(void)", // Probably hides gumps at the bottom, among other things.
-	"int16 I_playFlicsomething(uint32, char *, int16 a, int16 b)", // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
-	"void I_mouseSomethingResume05F(void)",  // Probably shows gumps at the bottom, among other things.
+	"void StatusGump::I_hideStatusGump(void)", // Probably hides gumps at the bottom, among other things.
+	"int16 MovieGump::I_playMovieOverlay(uint32, char *, int16 a, int16 b)", // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
+	"void StatusGump::I_showStatusGump(void)",  // Probably shows gumps at the bottom, among other things.
 	// 0060
 	"void Actor::I_setDead(4 bytes)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
 	"void Actor::I_create(8 bytes)",
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 15b98b3a98..2db991d892 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -61,6 +61,8 @@
 #include "ultima/ultima8/gumps/minimap_gump.h"
 #include "ultima/ultima8/gumps/quit_gump.h"
 #include "ultima/ultima8/gumps/menu_gump.h"
+#include "ultima/ultima8/gumps/cru_status_gump.h"
+#include "ultima/ultima8/gumps/movie_gump.h"
 
 // For gump positioning... perhaps shouldn't do it this way....
 #include "ultima/ultima8/gumps/bark_gump.h"
@@ -110,15 +112,14 @@
 #include "ultima/ultima8/world/destroy_item_process.h"
 #include "ultima/ultima8/world/actors/ambush_process.h"
 #include "ultima/ultima8/world/actors/pathfinder.h"
-#include "ultima/ultima8/gumps/movie_gump.h"
-#include "ultima/ultima8/gumps/shape_viewer_gump.h"
 #include "ultima/ultima8/audio/audio_mixer.h"
-#include "ultima/ultima8/graphics/xform_blend.h"
 #include "ultima/ultima8/audio/u8_music_process.h"
 #include "ultima/ultima8/audio/remorse_music_process.h"
 #include "ultima/ultima8/audio/audio_process.h"
-#include "ultima/ultima8/misc/util.h"
 #include "ultima/ultima8/audio/midi_player.h"
+#include "ultima/ultima8/gumps/shape_viewer_gump.h"
+#include "ultima/ultima8/graphics/xform_blend.h"
+#include "ultima/ultima8/misc/util.h"
 #include "ultima/ultima8/meta_engine.h"
 
 namespace Ultima {
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 46227fd701..f94f700a97 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -133,9 +133,9 @@ Intrinsic RemorseIntrinsics[] = {
 	Actor::I_getLastAnimSet, // void Intrinsic05A(4 bytes)
 	Item::I_legalCreateAtPoint, // probably. see PEPSIEW::use
 	Item::I_getPoint, // void Intrinsic05C(8 bytes)
-	0, // void Intrinsic05D(void)
-	0, // int16 Intrinsic05E(uint32, char *, int16 a, int16 b)  // Play video (as texture? parameters like (150, 250, "MVA11A") and other mvas)
-	0, // void Intrinsic05F(void)
+	CruStatusGump::I_hideStatusGump, // void Intrinsic05D(void)
+	MovieGump::I_playMovieOverlay, // int16 Intrinsic05E(uint32, char *, int16 a, int16 b)
+	CruStatusGump::I_showStatusGump, // void Intrinsic05F(void)
 	// 0x060
 	Actor::I_setDead, // void Intrinsic060(4 bytes)
 	Actor::I_createActor, // void Intrinsic061(8 bytes)




More information about the Scummvm-git-logs mailing list