[Scummvm-git-logs] scummvm master -> 54cafe5733bf7405761abcad844c9ddb933cf562

mduggan noreply at scummvm.org
Sat Nov 16 10:21:01 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:
54cafe5733 DGDS: Implement Willy Beamish type talking heads


Commit: 54cafe5733bf7405761abcad844c9ddb933cf562
    https://github.com/scummvm/scummvm/commit/54cafe5733bf7405761abcad844c9ddb933cf562
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2024-11-16T21:20:35+11:00

Commit Message:
DGDS: Implement Willy Beamish type talking heads

There are a few differences in the way the talking heads work in Willy Beamish
vs HoC.  This only implements the FDD version of Willy Beamish heads. The CD
version has different data to implement animated talking heads and voice
acting.

Changed paths:
    engines/dgds/dgds.cpp
    engines/dgds/dgds.h
    engines/dgds/dialog.cpp
    engines/dgds/dialog.h
    engines/dgds/game_palettes.h
    engines/dgds/globals.cpp
    engines/dgds/globals.h
    engines/dgds/scene.cpp
    engines/dgds/scene.h


diff --git a/engines/dgds/dgds.cpp b/engines/dgds/dgds.cpp
index 0714d8cb042..f483cdc1e55 100644
--- a/engines/dgds/dgds.cpp
+++ b/engines/dgds/dgds.cpp
@@ -89,7 +89,7 @@ DgdsEngine::DgdsEngine(OSystem *syst, const ADGameDescription *gameDesc)
 	_random("dgds"), _currentCursor(-1), _menuToTrigger(kMenuNone), _isLoading(true), _flipMode(false),
 	_rstFileName(nullptr), _difficulty(1), _menu(nullptr), _adsInterp(nullptr), _isDemo(false),
 	_dragonArcade(nullptr), _chinaTank(nullptr), _chinaTrain(nullptr), _skipNextFrame(false),
-	_gameId(GID_INVALID), _thisFrameMs(0) {
+	_gameId(GID_INVALID), _thisFrameMs(0), _lastGlobalFade(-1), _lastGlobalFadedPal(0) {
 
 	_platform = gameDesc->platform;
 	_gameLang = gameDesc->language;
@@ -704,8 +704,13 @@ Common::Error DgdsEngine::run() {
 
 			bool haveActiveDialog = _scene->checkDialogActive();
 
-			_scene->drawAndUpdateDialogs(&_compositionBuffer);
-			_scene->drawVisibleHeads(&_compositionBuffer);
+			if (getGameId() == GID_WILLY) {
+				_scene->drawVisibleHeads(&_compositionBuffer);
+				_scene->drawAndUpdateDialogs(&_compositionBuffer);
+			} else {
+				_scene->drawAndUpdateDialogs(&_compositionBuffer);
+				_scene->drawVisibleHeads(&_compositionBuffer);
+			}
 
 			_dumpFrame(_compositionBuffer, "comp-with-dlg");
 
@@ -717,6 +722,29 @@ Common::Error DgdsEngine::run() {
 			_justChangedScene2 = false;
 		}
 
+		// Willy Beamish dims the palette of the screen while dialogs are active
+		if (_gameId == GID_WILLY) {
+			WillyGlobals *globals = static_cast<WillyGlobals *>(_gameGlobals);
+			int16 fade = globals->getPalFade();
+			fade = CLIP(fade, (int16)0, (int16)255);
+
+			// TODO: Same constants are in globals.cpp
+			static const int FADE_STARTCOL = 0x40;
+			static const int FADE_NUMCOLS = 0xC0;
+
+			if (_scene->hasVisibleHead()) {
+				fade = 0x80;
+			} else {
+				fade = 0;
+			}
+
+			if (_lastGlobalFade != fade || _lastGlobalFadedPal != _gamePals->getCurPalNum()) {
+				_gamePals->setFade(FADE_STARTCOL, FADE_NUMCOLS, 0, fade);
+				_lastGlobalFade = fade;
+				_lastGlobalFadedPal = _gamePals->getCurPalNum();
+			}
+		}
+
 		g_system->updateScreen();
 
 		// Limit to 30 FPS
diff --git a/engines/dgds/dgds.h b/engines/dgds/dgds.h
index 2c244919340..ca9849d8803 100644
--- a/engines/dgds/dgds.h
+++ b/engines/dgds/dgds.h
@@ -179,6 +179,8 @@ private:
 	bool _flipMode;
 	bool _skipNextFrame;
 	uint32 _thisFrameMs;
+	int16 _lastGlobalFade; // Only used in Willy Beamish
+	uint _lastGlobalFadedPal;
 
 public:
 	DgdsEngine(OSystem *syst, const ADGameDescription *gameDesc);
diff --git a/engines/dgds/dialog.cpp b/engines/dgds/dialog.cpp
index e8610611e42..ff6a38f8e25 100644
--- a/engines/dgds/dialog.cpp
+++ b/engines/dgds/dialog.cpp
@@ -60,7 +60,7 @@ Dialog *Dialog::_lastDialogSelectionChangedFor = nullptr;
 
 Dialog::Dialog() : _num(0), _bgColor(0), _fontColor(0), _selectionBgCol(0), _selectonFontCol(0),
 	_fontSize(0), _flags(kDlgFlagNone), _frameType(kDlgFramePlain), _time(0), _nextDialogDlgNum(0),
-	_nextDialogFileNum(0), _fileNum(0), _unk1(0), _unk2(0)
+	_nextDialogFileNum(0), _fileNum(0), _talkDataNum(0), _talkDataHeadNum(0)
 {}
 
 
@@ -688,9 +688,9 @@ struct DialogAction *Dialog::pickAction(bool isClosing, bool isForceClose) {
 
 Common::String Dialog::dump(const Common::String &indent) const {
 	Common::String str = Common::String::format(
-			"%sDialog<num %d %s bgcol %d fcol %d selbgcol %d selfontcol %d fntsz %d flags 0x%02x frame %d delay %d next %d:%d",
+			"%sDialog<num %d %s bgcol %d fcol %d selbgcol %d selfontcol %d fntsz %d flags 0x%02x frame %d delay %d next %d:%d talkdata %d:%d",
 			indent.c_str(), _num, _rect.dump("").c_str(), _bgColor, _fontColor, _selectionBgCol, _selectonFontCol, _fontSize,
-			_flags, _frameType, _time, _nextDialogFileNum, _nextDialogDlgNum);
+			_flags, _frameType, _time, _nextDialogFileNum, _nextDialogDlgNum, _talkDataNum, _talkDataHeadNum);
 	str += indent + "state=" + (_state ? _state->dump("") : "null");
 	str += "\n";
 	str += _dumpStructList(indent, "actions", _action);
diff --git a/engines/dgds/dialog.h b/engines/dgds/dialog.h
index a8e833689f6..8f111953526 100644
--- a/engines/dgds/dialog.h
+++ b/engines/dgds/dialog.h
@@ -114,8 +114,8 @@ public:
 	uint16 _time;
 	uint16 _nextDialogFileNum; // HOC onward, always set 0 in dragon.
 	uint16 _nextDialogDlgNum;
-	uint16 _unk1; // Willy onward, always set 0 in dragon and HoC
-	uint16 _unk2; // Willy onward, always set 0 in dragon and HoC
+	uint16 _talkDataNum; // Willy onward, always set 0 in dragon and HoC
+	uint16 _talkDataHeadNum; // Willy onward, always set 0 in dragon and HoC
 	Common::Array<DialogAction> _action;
 	Common::String _str;
 
diff --git a/engines/dgds/game_palettes.h b/engines/dgds/game_palettes.h
index 8df30f898c9..505baffd197 100644
--- a/engines/dgds/game_palettes.h
+++ b/engines/dgds/game_palettes.h
@@ -59,6 +59,8 @@ public:
 
 	Common::Error syncState(Common::Serializer &s);
 
+	uint getCurPalNum() const { return _curPalNum; }
+
 private:
 	ResourceManager *_resourceMan;
 	Decompressor *_decompressor;
diff --git a/engines/dgds/globals.cpp b/engines/dgds/globals.cpp
index f4141349c01..34d2e7d6d71 100644
--- a/engines/dgds/globals.cpp
+++ b/engines/dgds/globals.cpp
@@ -22,6 +22,7 @@
 #include "dgds/globals.h"
 #include "dgds/dgds.h"
 #include "dgds/scene.h"
+#include "dgds/game_palettes.h"
 
 namespace Dgds {
 
@@ -285,23 +286,64 @@ Common::Error HocGlobals::syncState(Common::Serializer &s) {
 	return Common::kNoError;
 }
 
+static const int FADE_STARTCOL = 0x40;
+static const int FADE_NUMCOLS = 0xC0;
+
+
+class PaletteFadeGlobal : public RWI16Global {
+public:
+	PaletteFadeGlobal(uint16 num, int16 *val) : RWI16Global(num, val) {}
+	int16 set(int16 val) override {
+		val = CLIP(val, (int16)0, (int16)255);
+		int16 lastVal = get();
+		const int FADESTEP = 4;
+		if (lastVal != val) {
+			int step = (val > lastVal) ? FADESTEP : -FADESTEP;
+			int currentLevel = lastVal / FADESTEP;
+			int targetLevel = val / FADESTEP;
+			while (currentLevel != targetLevel) {
+				lastVal += step;
+				currentLevel = lastVal / FADESTEP;
+				DgdsEngine::getInstance()->getGamePals()->setFade(FADE_STARTCOL, FADE_NUMCOLS, 0, currentLevel);
+			}
+			RWI16Global::set(val);
+		}
+		return get();
+	}
+};
+
+class WillyDrawGlobal : public RWI16Global {
+public:
+	WillyDrawGlobal(uint16 num, int16 *val) : RWI16Global(num, val) {}
+	int16 set(int16 val) override {
+		int16 oldVal = get();
+		if (val != oldVal) {
+			val = CLIP(val, (int16)0, (int16)10);
+			warning("TODO: Implement set function for willy global 0x02 val %d.", val);
+			return RWI16Global::set(val);
+		}
+		return oldVal;
+	}
+};
+
+
 WillyGlobals::WillyGlobals(Clock &clock) : Globals(clock),
 	_unk2(4), _unk3(0), _unk4(0), _unk5(0), _unk74(0), _unk75(300),
-	_unk77(255), _unk78(0), _unk79(0), _unk80(0), _unk81(3), _unk82(1) {
+	_palFade(255), _unk78(0), _unk79(0), _unk80(0), _unk81(3), _unk82(1) {
 	_globals.push_back(new DetailLevelROGlobal(0x53));
 	_globals.push_back(new RWI16Global(0x52, &_unk82));
 	_globals.push_back(new RWI16Global(0x51, &_unk81));
 	_globals.push_back(new RWI16Global(0x50, &_unk80));
 	_globals.push_back(new RWI16Global(0x4F, &_unk79));
 	_globals.push_back(new RWI16Global(0x4E, &_unk78));
-	_globals.push_back(new RWI16Global(0x4D, &_unk77));
-	_globals.push_back(new RWI16Global(0x4C, &_unk77)); // TODO: Special set function 1833:665e. Same variable as 0x4D.
+	_globals.push_back(new RWI16Global(0x4D, &_palFade));
+	_globals.push_back(new PaletteFadeGlobal(0x4C, &_palFade));
 	_globals.push_back(new RWI16Global(0x4B, &_unk75));
 	_globals.push_back(new RWI16Global(0x4A, &_unk74));
 	_globals.push_back(new RWI16Global(0x05, &_unk5));
 	_globals.push_back(new RWI16Global(0x04, &_unk4));
 	_globals.push_back(new RWI16Global(0x03, &_unk3));
-	_globals.push_back(new RWI16Global(0x02, &_unk2)); // TODO: Special set function 1574:06ca
+	_globals.push_back(new WillyDrawGlobal(0x02, &_unk2));
 }
 
 Common::Error WillyGlobals::syncState(Common::Serializer &s) {
@@ -312,7 +354,7 @@ Common::Error WillyGlobals::syncState(Common::Serializer &s) {
 	s.syncAsSint16LE(_unk5);
 	s.syncAsSint16LE(_unk74);
 	s.syncAsSint16LE(_unk75);
-	s.syncAsSint16LE(_unk77);
+	s.syncAsSint16LE(_palFade);
 	s.syncAsSint16LE(_unk78);
 	s.syncAsSint16LE(_unk79);
 	s.syncAsSint16LE(_unk80);
diff --git a/engines/dgds/globals.h b/engines/dgds/globals.h
index dd088737263..dd5a3cf2d16 100644
--- a/engines/dgds/globals.h
+++ b/engines/dgds/globals.h
@@ -195,6 +195,9 @@ class WillyGlobals : public Globals {
 public:
 	WillyGlobals(Clock &clock);
 
+	void setPalFade(int16 val) { _palFade = val; }
+	int16 getPalFade() const { return _palFade; }
+
 private:
 	// Willy-specific globals
 	int16 _unk2;
@@ -203,7 +206,7 @@ private:
 	int16 _unk5;
 	int16 _unk74;
 	int16 _unk75;
-	int16 _unk77;
+	int16 _palFade;
 	int16 _unk78;
 	int16 _unk79;
 	int16 _unk80;
diff --git a/engines/dgds/scene.cpp b/engines/dgds/scene.cpp
index 96359998ed7..77f2a75fcab 100644
--- a/engines/dgds/scene.cpp
+++ b/engines/dgds/scene.cpp
@@ -100,7 +100,7 @@ Common::String SceneConditions::dump(const Common::String &indent) const {
 
 
 Common::String HotArea::dump(const Common::String &indent) const {
-	Common::String str = Common::String::format("%sHotArea<%s num %d cursor %d unk1 %d unk2 %d",
+	Common::String str = Common::String::format("%sHotArea<%s num %d cursor %d cursor2 %d interactionFlag %d",
 			indent.c_str(), _rect.dump("").c_str(), _num, _cursorNum, _otherCursorNum, _objInteractionListFlag);
 	str += _dumpStructList(indent, "enableConditions", enableConditions);
 	str += _dumpStructList(indent, "onRClickOps", onRClickOps);
@@ -462,8 +462,8 @@ bool Scene::readDialogList(Common::SeekableReadStream *s, Common::Array<Dialog>
 		}
 
 		if (isVersionOver(" 1.216")) {
-			dst._unk1 = s->readUint16LE();
-			dst._unk2 = s->readUint16LE();
+			dst._talkDataNum = s->readUint16LE();
+			dst._talkDataHeadNum = s->readUint16LE();
 		}
 
 		uint16 nbytes = s->readUint16LE();
@@ -1212,6 +1212,14 @@ bool SDSScene::readTalkData(Common::SeekableReadStream *s, TalkData &dst) {
 		h._rect.y = s->readUint16LE();
 		h._rect.width = s->readUint16LE();
 		h._rect.height = s->readUint16LE();
+		if (isVersionOver(" 1.220")) {
+			h._bmpFile = s->readString();
+			if (!h._bmpFile.empty()) {
+				DgdsEngine *engine = DgdsEngine::getInstance();
+				h._shape.reset(new Image(engine->getResourceManager(), engine->getDecompressor()));
+				h._shape->loadBitmap(h._bmpFile);
+			}
+		}
 		uint16 nsub = s->readUint16LE();
 		_checkListNotTooLong(nsub, "talk head frames");
 		h._headFrames.resize(nsub);
@@ -1219,6 +1227,9 @@ bool SDSScene::readTalkData(Common::SeekableReadStream *s, TalkData &dst) {
 			sub._frameNo = s->readUint16LE();
 			sub._xoff = s->readUint16LE();
 			sub._yoff = s->readUint16LE();
+			if (isVersionOver(" 1.221")) {
+				sub._flipFlags = s->readUint16LE();
+			}
 		}
 	}
 
@@ -1268,9 +1279,11 @@ bool SDSScene::loadTalkData(uint16 num) {
 			_talkData.front()._num = num;
 			_version = oldVer;
 
-			Image *img = new Image(resourceManager, decompressor);
-			img->loadBitmap(_talkData.front()._bmpFile);
-			_talkData.front()._shape.reset(img);
+			if (!_talkData.front()._bmpFile.empty()) {
+				Image *img = new Image(resourceManager, decompressor);
+				img->loadBitmap(_talkData.front()._bmpFile);
+				_talkData.front()._shape.reset(img);
+			}
 		}
 	}
 
@@ -1300,17 +1313,24 @@ void SDSScene::updateVisibleTalkers() {
 
 void SDSScene::drawHead(Graphics::ManagedSurface *dst, const TalkData &data, const TalkDataHead &head) {
 	uint drawtype = head._drawType ? head._drawType : 1;
-	if (!data._shape)
+	// Use specific head shape if available (eg, in Willy Beamish), if not use talk data shape
+	Common::SharedPtr<Image> img = head._shape;
+	if (!img)
+		img = data._shape;
+	if (!img)
 		return;
 	switch (drawtype) {
 	case 1:
-		drawHeadType1(dst, head, *data._shape);
+		drawHeadType1(dst, head, *img);
 		break;
 	case 2:
-		drawHeadType2(dst, head, *data._shape);
+		drawHeadType2(dst, head, *img);
 		break;
 	case 3:
-		drawHeadType3(dst, head, *data._shape);
+		if (DgdsEngine::getInstance()->getGameId() == GID_WILLY)
+			drawHeadType3Beamish(dst, data, head);
+		else
+			drawHeadType3(dst, head, *img);
 		break;
 	default:
 		error("Unsupported head draw type %d", drawtype);
@@ -1328,7 +1348,7 @@ void SDSScene::drawHeadType1(Graphics::ManagedSurface *dst, const TalkDataHead &
 	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);
+			img.drawBitmap(frame._frameNo & 0xff, x + frame._xoff, y + frame._yoff, r, *dst);
 		}
 	}
 }
@@ -1338,7 +1358,37 @@ void SDSScene::drawHeadType2(Graphics::ManagedSurface *dst, const TalkDataHead &
 		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);
+		img.drawBitmap(frame._frameNo & 0xff, r.left + frame._xoff, r.top + frame._yoff, r, *dst);
+	}
+}
+
+void SDSScene::drawHeadType3Beamish(Graphics::ManagedSurface *dst, const TalkData &data, const TalkDataHead &head) {
+	const Common::Rect r = head._rect.toCommonRect();
+
+	// Note: only really need the 1px border here but just fill the box.
+	dst->fillRect(r, 8);
+
+	Common::Rect fillRect(r);
+	fillRect.grow(-1);
+	dst->fillRect(fillRect, head._drawCol);
+
+	for (const auto &frame : head._headFrames) {
+		int frameNo = frame._frameNo & 0x7fff;
+		bool useHeadShape = frame._frameNo & 0x8000;
+
+		Common::SharedPtr<Image> img = useHeadShape ? head._shape : data._shape;
+		if (!img || !img->isLoaded() || frameNo >= img->loadedFrameCount())
+			continue;
+
+		ImageFlipMode flip = kImageFlipNone;
+		// Yes, the numerical values are revesed here (1 -> 2 and 2 -> 1).
+		// The head flip flags are reversed from the image draw flags.
+		if (frame._flipFlags & 1)
+			flip = static_cast<ImageFlipMode>(flip & kImageFlipH);
+		if (frame._flipFlags & 2)
+			flip = static_cast<ImageFlipMode>(flip & kImageFlipV);
+
+		img->drawBitmap(frameNo, r.left + frame._xoff, r.top + frame._yoff, fillRect, *dst);
 	}
 }
 
@@ -1348,8 +1398,9 @@ void SDSScene::drawHeadType3(Graphics::ManagedSurface *dst, const TalkDataHead &
 	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);
+		int frameNo = frame._frameNo;
+		if (frameNo < img.loadedFrameCount())
+			img.drawBitmap(frameNo, r.left + frame._xoff, r.top + frame._yoff, r, *dst);
 		else
 			dst->fillRect(r, 4);
 	}
@@ -1382,6 +1433,17 @@ void SDSScene::drawVisibleHeads(Graphics::ManagedSurface *dst) {
 	}
 }
 
+bool SDSScene::hasVisibleHead() const {
+	for (const auto &tds : _talkData) {
+		for (const auto &h : tds._heads) {
+			if (h._flags & kHeadFlagVisible)
+				return true;
+		}
+	}
+	return false;
+}
+
+
 void SDSScene::loadTalkDataAndSetFlags(uint16 talknum, uint16 headnum) {
 	updateVisibleTalkers();
 	if (loadTalkData(talknum)) {
@@ -1451,6 +1513,12 @@ void SDSScene::showDialog(uint16 fileNum, uint16 dlgNum) {
 			dialog.setFlag(kDlgFlagHi20);
 			dialog.setFlag(kDlgFlagVisible);
 			dialog.setFlag(kDlgFlagOpening);
+
+			// For beamish
+			if (dialog._talkDataHeadNum) {
+				loadTalkDataAndSetFlags(dialog._talkDataNum, dialog._talkDataHeadNum);
+			}
+
 			// hide time gets set the first time it's drawn.
 			if (_dlgWithFlagLo8IsClosing && dialog.hasFlag(kDlgFlagLo8)) {
 				_sceneDialogFlags = static_cast<DialogFlags>(_sceneDialogFlags | kDlgFlagLo8 | kDlgFlagVisible);
@@ -1501,6 +1569,12 @@ bool SDSScene::checkDialogActive() {
 		} else {
 			// this dialog is finished - call the ops and maybe show the next one
 			_dlgWithFlagLo8IsClosing = dlg.hasFlag(kDlgFlagLo8);
+
+			// For Willy Beamish
+			if (dlg._talkDataNum) {
+				freeTalkData(dlg._talkDataNum);
+			}
+
 			DialogAction *action = dlg.pickAction(true, clearDlgFlag);
 			if (action || dlg._action.empty()) {
 				dlg.setFlag(kDlgFlagHiFinished);
@@ -1523,6 +1597,7 @@ bool SDSScene::checkDialogActive() {
 					}
 				}
 			}
+
 			if (dlg._nextDialogDlgNum) {
 				dlg.setFlag(kDlgFlagHiFinished);
 				showDialog(dlg._nextDialogFileNum, dlg._nextDialogDlgNum);
diff --git a/engines/dgds/scene.h b/engines/dgds/scene.h
index 902f0f90351..783dd0c06e5 100644
--- a/engines/dgds/scene.h
+++ b/engines/dgds/scene.h
@@ -253,12 +253,13 @@ private:
 
 class TalkDataHeadFrame {
 public:
-	TalkDataHeadFrame() : _xoff(0), _yoff(0), _frameNo(0) {}
+	TalkDataHeadFrame() : _xoff(0), _yoff(0), _frameNo(0), _flipFlags(0) {}
 	Common::String dump(const Common::String &indent) const;
 
 	uint16 _frameNo;
 	uint16 _xoff;
 	uint16 _yoff;
+	uint16 _flipFlags;
 };
 
 enum HeadFlags {
@@ -275,7 +276,7 @@ enum HeadFlags {
 
 class TalkDataHead {
 public:
-	TalkDataHead() : _num(0), _drawType(0), _drawCol(0), _val3(0), _flags(kHeadFlagNone) {}
+	TalkDataHead() : _num(0), _drawType(0), _drawCol(0), _flags(kHeadFlagNone) {}
 	Common::String dump(const Common::String &indent) const;
 
 	uint16 _num;
@@ -283,8 +284,9 @@ public:
 	uint16 _drawCol;
 	DgdsRect _rect;
 	Common::Array<TalkDataHeadFrame> _headFrames;
-	uint16 _val3;
+	Common::String _bmpFile;
 	HeadFlags _flags;
+	Common::SharedPtr<Image> _shape;
 };
 
 class TalkData {
@@ -466,6 +468,7 @@ public:
 	void updateVisibleTalkers();
 	void loadTalkDataAndSetFlags(uint16 talknum, uint16 headnum);
 	void drawVisibleHeads(Graphics::ManagedSurface *dst);
+	bool hasVisibleHead() const;
 
 	// dragon-specific scene ops
 	void addAndShowTiredDialog();
@@ -491,6 +494,7 @@ private:
 	void drawHeadType1(Graphics::ManagedSurface *dst, const TalkDataHead &head, const Image &img);
 	void drawHeadType2(Graphics::ManagedSurface *dst, const TalkDataHead &head, const Image &img);
 	void drawHeadType3(Graphics::ManagedSurface *dst, const TalkDataHead &head, const Image &img);
+	void drawHeadType3Beamish(Graphics::ManagedSurface *dst, const TalkData &data, const TalkDataHead &head);
 
 	int _num;
 	Common::Array<SceneOp> _enterSceneOps;




More information about the Scummvm-git-logs mailing list