[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