Initial commit
This commit is contained in:
160
engines/dgds/dialog.h
Normal file
160
engines/dgds/dialog.h
Normal file
@@ -0,0 +1,160 @@
|
||||
/* 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
|
||||
Reference in New Issue
Block a user