[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