[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