/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef DGDS_HEAD_H #define DGDS_HEAD_H #include "common/str.h" #include "common/types.h" #include "common/ptr.h" #include "common/array.h" #include "graphics/managed_surface.h" #include "dgds/dgds_rect.h" #include "dgds/image.h" #include "dgds/ttm.h" // Classes related to talking heads and conversations. namespace Dgds { class Image; class SoundRaw; class Dialog; class TalkDataHeadFrame { public: TalkDataHeadFrame() : _xoff(0), _yoff(0), _frameNo(0), _flipFlags(0) {} Common::String dump(const Common::String &indent) const; uint16 _frameNo; int16 _xoff; int16 _yoff; uint16 _flipFlags; }; enum HeadFlags { kHeadFlagNone = 0, kHeadFlagFinished = 1, kHeadFlag2 = 2, kHeadFlag4 = 4, kHeadFlag8 = 8, kHeadFlag10 = 0x10, kHeadFlagVisible = 0x20, kHeadFlagOpening = 0x40, kHeadFlag80 = 0x80, }; class TalkData; class TalkDataHead { public: TalkDataHead() : _num(0), _drawType(0), _drawCol(0), _flags(kHeadFlagNone) {} Common::String dump(const Common::String &indent) const; void clearHead(); void drawHead(Graphics::ManagedSurface &dst, const TalkData &data) const; void drawHeadType1(Graphics::ManagedSurface &dst, const Image &img) const; void drawHeadType2(Graphics::ManagedSurface &dst, const Image &img) const; void drawHeadType3(Graphics::ManagedSurface &dst, const Image &img) const; void drawHeadType3Beamish(Graphics::ManagedSurface &dst, const TalkData &data) const; uint16 _num; uint16 _drawType; uint16 _drawCol; DgdsRect _rect; Common::Array _headFrames; Common::String _bmpFile; HeadFlags _flags; Common::SharedPtr _shape; }; /** TDS talking head data from HOC+ */ class TalkData { public: TalkData() : _num(0), _val(0) {} Common::String dump(const Common::String &indent) const; uint16 _num; Common::SharedPtr _shape; Common::Array _heads; uint16 _val; Common::String _bmpFile; void clearVisibleHeads(); void drawAndUpdateVisibleHeads(Graphics::ManagedSurface &dst); bool hasVisibleHead() const; }; /** * A TTM interpreter with customized opcode handling for the TTM bit of * CDS files (Willy Beamish CD version conversation data) */ class CDSTTMInterpreter : public TTMInterpreter { public: CDSTTMInterpreter(DgdsEngine *vm); Graphics::ManagedSurface &getStoredAreaBuffer() { return _storedAreaBuffer; } protected: virtual void handleOperation(TTMEnviro &env, TTMSeq &seq, uint16 op, byte count, const int16 *ivals, const Common::String &sval, const Common::Array &pts) override; Graphics::ManagedSurface _storedAreaBuffer; }; class CDSTTMEnviro : public TTMEnviro { public: CDSTTMEnviro() : _cdsPlayedSound(false), _cdsFrame(-1), _cdsJumped(false), _cdsDelay(0), _cdsDidStoreArea(false), TTMEnviro() {} bool _cdsPlayedSound; int16 _cdsFrame; // The GOTO target to use in the CDS script (Willy Beamish talkie) int16 _cdsDelay; bool _cdsJumped; bool _cdsDidStoreArea; DgdsRect _storedAreaRect; }; /** CDS data from Willy Beamish CD version talkie */ class Conversation { public: Conversation() : _thisFrameMs(0), _nextExecMs(0), _runTempFrame(-1), _tempFrameNum(0), _stopScript(false), _loadState(0), _dlgNum(-1), _dlgFileNum(-1), _subNum(-1), _finished(false), _haveHeadData(false) {} ~Conversation(); void unloadData(); void runScript(); void loadData(uint16 num, uint16 num2, int16 sub, bool haveHeadData); bool isForDlg(const Dialog *dlg) const; bool isFinished() const { return _finished; } void clear(); DgdsRect _drawRect; static enum ImageFlipMode _lastHeadFrameFlipMode; static int16 _lastHeadFrameX; static int16 _lastHeadFrameY; private: Common::SharedPtr _ttmScript; Common::Array> _ttmSeqs; CDSTTMEnviro _ttmEnv; uint32 _nextExecMs; bool runScriptFrame(int16 frameNum); void checkAndRunScript(); void incrementFrame(); bool isScriptRunning(); void pumpMessages(); void runScriptExclusive(); void runScriptStep(); int16 _runTempFrame; int16 _tempFrameNum; uint32 _thisFrameMs; bool _stopScript; int16 _loadState; int16 _dlgNum; int16 _dlgFileNum; int16 _subNum; bool _finished; bool _haveHeadData; }; } // end namespace Dgds #endif // DGDS_HEAD_H