mirror of
https://github.com/scummvm/scummvm.git
synced 2025-04-02 10:52:32 -04:00
160 lines
4.7 KiB
C++
160 lines
4.7 KiB
C++
/* 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 <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#ifndef DGDS_DIALOG_H
|
|
#define DGDS_DIALOG_H
|
|
|
|
#include "common/stream.h"
|
|
#include "common/array.h"
|
|
#include "common/error.h"
|
|
#include "common/serializer.h"
|
|
|
|
#include "dgds/dgds_rect.h"
|
|
|
|
namespace Graphics {
|
|
class ManagedSurface;
|
|
}
|
|
|
|
namespace Dgds {
|
|
|
|
class DgdsFont;
|
|
class SceneOp;
|
|
|
|
enum DialogFlags {
|
|
kDlgFlagNone = 0,
|
|
kDlgFlagFlatBg = 1,
|
|
kDlgFlagLeftJust = 2,
|
|
kDlgFlagLo4 = 4,
|
|
kDlgFlagLo8 = 8,
|
|
kDlgFlagLo80 = 0x80,
|
|
kDlgFlagHiFinished = 0x10000,
|
|
kDlgFlagHi2 = 0x20000,
|
|
kDlgFlagHi4 = 0x40000,
|
|
kDlgFlagRedrawSelectedActionChanged = 0x80000,
|
|
kDlgFlagHi10 = 0x100000,
|
|
kDlgFlagHi20 = 0x200000,
|
|
kDlgFlagHi40 = 0x400000,
|
|
kDlgFlagVisible = 0x800000,
|
|
kDlgFlagOpening = 0x1000000,
|
|
};
|
|
|
|
enum DialogFrameType {
|
|
kDlgFramePlain = 1,
|
|
kDlgFrameBorder = 2,
|
|
kDlgFrameThought = 3,
|
|
kDlgFrameRounded = 4
|
|
};
|
|
|
|
enum DialogDrawStage {
|
|
kDlgDrawStageForeground = 0,
|
|
kDlgDrawStageBackground = 1,
|
|
kDlgDrawFindSelectionPointXY = 2,
|
|
kDlgDrawFindSelectionTxtOffset = 3,
|
|
};
|
|
|
|
struct DialogAction {
|
|
int16 num;
|
|
// The game initializes str offsets to pointers, but let's be a bit nicer.
|
|
uint16 strStart; /// The start of the clickable text for this action
|
|
uint16 strEnd; /// End of clickable text for this action
|
|
//byte unk[8]; /* Not initialized in loader */
|
|
Common::Array<SceneOp> sceneOpList; /// ops to run when this is selected
|
|
|
|
Common::String dump(const Common::String &indent) const;
|
|
};
|
|
|
|
class DialogState {
|
|
public:
|
|
DialogState() : _hideTime(0), _lastMouseX(0), _lastMouseY(0), _charWidth(0),
|
|
_charHeight(0), _strMouseLoc(0), _selectedAction(nullptr) {}
|
|
uint _hideTime;
|
|
DgdsRect _loc;
|
|
int _lastMouseX;
|
|
int _lastMouseY;
|
|
uint16 _charWidth;
|
|
uint16 _charHeight;
|
|
int _strMouseLoc;
|
|
struct DialogAction *_selectedAction;
|
|
|
|
Common::String dump(const Common::String &indent) const;
|
|
Common::Error syncState(Common::Serializer &s);
|
|
};
|
|
|
|
class Dialog {
|
|
public:
|
|
Dialog();
|
|
uint16 _num;
|
|
uint16 _fileNum; // HOC onward
|
|
DgdsRect _rect;
|
|
uint16 _bgColor;
|
|
uint16 _fontColor;
|
|
uint16 _selectionBgCol;
|
|
uint16 _selectonFontCol;
|
|
uint16 _fontSize;
|
|
DialogFlags _flags;
|
|
DialogFrameType _frameType;
|
|
uint16 _time;
|
|
uint16 _nextDialogFileNum; // HOC onward, always set 0 in dragon.
|
|
uint16 _nextDialogDlgNum;
|
|
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;
|
|
|
|
Common::SharedPtr<DialogState> _state;
|
|
|
|
void draw(Graphics::ManagedSurface *dst, DialogDrawStage stage);
|
|
void setFlag(DialogFlags flg);
|
|
void clearFlag(DialogFlags flg);
|
|
void flipFlag(DialogFlags flg);
|
|
bool hasFlag(DialogFlags flg) const;
|
|
void updateSelectedAction(int delta);
|
|
struct DialogAction *pickAction(bool isClosing, bool isForceClose);
|
|
Common::String dump(const Common::String &indent) const;
|
|
void clear();
|
|
|
|
Common::Error syncState(Common::Serializer &s);
|
|
|
|
private:
|
|
void drawType1(Graphics::ManagedSurface *dst, DialogDrawStage stage);
|
|
void drawType2(Graphics::ManagedSurface *dst, DialogDrawStage stage);
|
|
void drawType3(Graphics::ManagedSurface *dst, DialogDrawStage stage);
|
|
void drawType4(Graphics::ManagedSurface *dst, DialogDrawStage stage);
|
|
|
|
void drawType2BackgroundDragon(Graphics::ManagedSurface *dst, const Common::String &title);
|
|
void drawType2BackgroundChina(Graphics::ManagedSurface *dst, const Common::String &title);
|
|
void drawType2BackgroundBeamish(Graphics::ManagedSurface *dst, const Common::String &title);
|
|
|
|
void drawFindSelectionXY();
|
|
void drawFindSelectionTxtOffset();
|
|
void drawForeground(Graphics::ManagedSurface *dst, uint16 fontcol, const Common::String &txt);
|
|
|
|
const DgdsFont *getDlgTextFont() const;
|
|
|
|
static int _lastSelectedDialogItemNum;
|
|
static Dialog *_lastDialogSelectionChangedFor;
|
|
};
|
|
|
|
|
|
|
|
} // end namespace Dgds
|
|
|
|
#endif // DGDS_DIALOG_H
|