[Scummvm-git-logs] scummvm master -> bfeac18bc7440aad633070632da28bf29c4f871c
mduggan
noreply at scummvm.org
Sun Jul 14 01:40:27 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
bfeac18bc7 DGDS: Implement more of HoC talking heads
Commit: bfeac18bc7440aad633070632da28bf29c4f871c
https://github.com/scummvm/scummvm/commit/bfeac18bc7440aad633070632da28bf29c4f871c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2024-07-14T11:40:15+10:00
Commit Message:
DGDS: Implement more of HoC talking heads
Changed paths:
engines/dgds/dgds.cpp
engines/dgds/image.h
engines/dgds/scene.cpp
engines/dgds/scene.h
engines/dgds/ttm.cpp
diff --git a/engines/dgds/dgds.cpp b/engines/dgds/dgds.cpp
index c12b2bc6a7d..436c509fa27 100644
--- a/engines/dgds/dgds.cpp
+++ b/engines/dgds/dgds.cpp
@@ -247,7 +247,7 @@ void DgdsEngine::setShowClock(bool val) {
}
bool DgdsEngine::isInvButtonVisible() const {
- return (_gdsScene->getCursorList().size() >= 2 && _icons->loadedFrameCount() >= 2 &&
+ return (_gdsScene->getCursorList().size() >= 2 && _icons && _icons->loadedFrameCount() >= 2 &&
!_scene->getHotAreas().empty() && _scene->getHotAreas().front()._num == 0);
}
diff --git a/engines/dgds/image.h b/engines/dgds/image.h
index 51930192103..1ad92c80a57 100644
--- a/engines/dgds/image.h
+++ b/engines/dgds/image.h
@@ -66,6 +66,7 @@ public:
int16 height(uint frameno) const;
int loadedFrameCount() const { return _frames.size(); }
+ bool isLoaded() const { return !_frames.empty(); }
const Common::String &getFilename() const { return _filename; }
diff --git a/engines/dgds/scene.cpp b/engines/dgds/scene.cpp
index 3ac81f33cb9..e5065bbfcc3 100644
--- a/engines/dgds/scene.cpp
+++ b/engines/dgds/scene.cpp
@@ -676,10 +676,10 @@ bool Scene::runSceneOp(const SceneOp &op) {
CursorMan.showMouse(false);
break;
case kSceneOpLoadTalkDataAndSetFlags: // args: tdsnum to load, headnum
- engine->getScene()->loadTalkDataAndSomething(op._args[0], op._args[1]);
+ engine->getScene()->loadTalkDataAndSetFlags(op._args[0], op._args[1]);
break;
case kSceneOpDrawVisibleTalkHeads: // args: none
- engine->getScene()->drawVisibleTalkers();
+ engine->getScene()->updateVisibleTalkers();
break;
case kSceneOpLoadTalkData: // args: tds num to load
engine->getScene()->loadTalkData(op._args[0]);
@@ -1181,7 +1181,7 @@ void SDSScene::freeTalkData(uint16 num) {
}
}
-void SDSScene::drawVisibleTalkers() {
+void SDSScene::updateVisibleTalkers() {
for (auto &data : _talkData) {
for (auto &head : data._heads) {
if (head._flags & kHeadFlagVisible)
@@ -1190,6 +1190,7 @@ void SDSScene::drawVisibleTalkers() {
}
}
+
void SDSScene::drawHead(Graphics::ManagedSurface *dst, const TalkData &data, const TalkDataHead &head) {
uint drawtype = head._drawType ? head._drawType : 1;
switch (drawtype) {
@@ -1208,24 +1209,72 @@ void SDSScene::drawHead(Graphics::ManagedSurface *dst, const TalkData &data, con
}
void SDSScene::drawHeadType1(Graphics::ManagedSurface *dst, const TalkDataHead &head, const Image &img) {
-
+ Common::Rect r = head._rect.toCommonRect();
+ dst->fillRect(r, head._drawCol);
+ r.grow(-1);
+ dst->fillRect(r, head._drawCol == 0 ? 15 : 0);
+ r.left += 2;
+ r.top += 2;
+ const int x = head._rect.x;
+ const int y = head._rect.y;
+ if (img.isLoaded()) {
+ for (const auto &frame : head._headFrames) {
+ img.drawBitmap(frame._frameNo, x + frame._xoff, y + frame._yoff, r, *dst);
+ }
+ }
}
void SDSScene::drawHeadType2(Graphics::ManagedSurface *dst, const TalkDataHead &head, const Image &img) {
-
+ if (!img.isLoaded())
+ return;
+ const Common::Rect r = head._rect.toCommonRect();
+ for (const auto &frame : head._headFrames) {
+ img.drawBitmap(frame._frameNo, r.left + frame._xoff, r.top + frame._yoff, r, *dst);
+ }
}
void SDSScene::drawHeadType3(Graphics::ManagedSurface *dst, const TalkDataHead &head, const Image &img) {
-
+ Common::Rect r = head._rect.toCommonRect();
+ dst->fillRect(r, 0);
+ if (!img.isLoaded())
+ return;
+ for (const auto &frame : head._headFrames) {
+ if (frame._frameNo < img.loadedFrameCount())
+ img.drawBitmap(frame._frameNo, r.left + frame._xoff, r.top + frame._yoff, r, *dst);
+ else
+ dst->fillRect(r, 4);
+ }
}
void SDSScene::updateHead(TalkDataHead &head) {
warning("TODO: Update head");
head._flags = static_cast<HeadFlags>(head._flags & ~(kHeadFlag1 | kHeadFlag8 | kHeadFlag10 | kHeadFlagVisible));
+
+ /* This seems to just be a "needs redraw" flag, but we always redraw
+ for (auto tds : _talkData) {
+ for (auto h : tds._heads) {
+ if ((h._flags & kHeadFlagVisible) && !(h._flags & (kHeadFlag8 | kHeadFlag10 | kHeadFlag80))) {
+ if (h._rect.toCommonRect().intersects(head._rect.toCommonRect())) {
+ h._flags = static_cast<HeadFlags>(h._flags | kHeadFlag4);
+ }
+ }
+ }
+ }
+ */
+}
+
+void SDSScene::drawVisibleHeads(Graphics::ManagedSurface *dst) {
+ for (auto tds : _talkData) {
+ for (auto h : tds._heads) {
+ if ((h._flags & kHeadFlagVisible) && !(h._flags & kHeadFlag40)) {
+ drawHead(dst, tds, h);
+ }
+ }
+ }
}
-void SDSScene::loadTalkDataAndSomething(uint16 talknum, uint16 headnum) {
- drawVisibleTalkers();
+void SDSScene::loadTalkDataAndSetFlags(uint16 talknum, uint16 headnum) {
+ updateVisibleTalkers();
if (loadTalkData(talknum)) {
for (auto &data : _talkData) {
if (data._num != talknum)
diff --git a/engines/dgds/scene.h b/engines/dgds/scene.h
index 3ce0d88f5e6..8baa31cf47f 100644
--- a/engines/dgds/scene.h
+++ b/engines/dgds/scene.h
@@ -254,6 +254,8 @@ enum HeadFlags {
kHeadFlag8 = 8,
kHeadFlag10 = 0x10,
kHeadFlagVisible = 0x20,
+ kHeadFlag40 = 0x40,
+ kHeadFlag80 = 0x80,
};
class TalkDataHead {
@@ -444,8 +446,9 @@ public:
void freeDialogData(uint16 num);
bool loadTalkData(uint16 num);
void freeTalkData(uint16 num);
- void drawVisibleTalkers();
- void loadTalkDataAndSomething(uint16 talknum, uint16 headnum);
+ void updateVisibleTalkers();
+ void loadTalkDataAndSetFlags(uint16 talknum, uint16 headnum);
+ void drawVisibleHeads(Graphics::ManagedSurface *dst);
// dragon-specific scene ops
void addAndShowTiredDialog();
diff --git a/engines/dgds/ttm.cpp b/engines/dgds/ttm.cpp
index ae2372a8812..fd959cd3aa7 100644
--- a/engines/dgds/ttm.cpp
+++ b/engines/dgds/ttm.cpp
@@ -806,7 +806,7 @@ void TTMInterpreter::handleOperation(TTMEnviro &env, TTMSeq &seq, uint16 op, byt
break;
case 0xb010: {
const Image *img = env._scriptShapes[seq._currentBmpId].get();
- if (img && img->loadedFrameCount()) {
+ if (img && img->isLoaded()) {
bool finished = doOpCreditsScroll(env._scriptShapes[seq._currentBmpId].get(), ivals[0], env._creditScrollYOffset,
ivals[2], env._creditScrollMeasure, seq._drawWin);
env._creditScrollYOffset += ivals[1];
More information about the Scummvm-git-logs
mailing list