scummvm/engines/agi/text.h
Martin Kiewitz e6466b20fa AGI: Add optional "pause, when entering commands" feature
Shows a prompt window and pauses the game (just like original AGI
did, but original AGI only did it in Hercules rendering mode).
2016-02-28 15:50:25 +01:00

218 lines
6.0 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 2
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef AGI_TEXT_H
#define AGI_TEXT_H
namespace Agi {
struct TextPos_Struct {
int16 row;
int16 column;
};
#define TEXTPOSARRAY_MAX 5
struct TextAttrib_Struct {
byte foreground;
byte background;
byte combinedForeground;
byte combinedBackground;
};
#define TEXTATTRIBARRAY_MAX 5
struct MessageState_Struct {
uint8 type;
int16 wanted_Text_Width;
TextPos_Struct wanted_TextPos;
bool dialogue_Open;
uint8 newline_Char;
bool window_Active;
TextPos_Struct textPos;
TextPos_Struct textPos_Edge;
int16 textSize_Width;
int16 textSize_Height;
uint16 printed_Height;
int16 backgroundPos_x;
int16 backgroundPos_y; // original AGI used lowerY here, we use upperY so that upscaling is easier
int16 backgroundSize_Width;
int16 backgroundSize_Height;
};
// this defines here are for calculating character-size inside the visual-screen!
#define FONT_VISUAL_WIDTH 4
#define FONT_VISUAL_HEIGHT 8
#define FONT_DISPLAY_WIDTH 8
#define FONT_DISPLAY_HEIGHT 8
#define FONT_ROW_CHARACTERS 25
#define FONT_COLUMN_CHARACTERS 40
#define FONT_BYTES_PER_CHARACTER 8
#define HEIGHT_MAX 20
#define TEXT_STRING_MAX_SIZE 40
class TextMgr {
private:
Words *_words;
GfxMgr *_gfx;
AgiEngine *_vm;
SystemUI *_systemUI;
public:
TextMgr(AgiEngine *vm, Words *words, GfxMgr *gfx);
~TextMgr();
void init(SystemUI *systemUI);
TextPos_Struct _textPos;
int16 _textPosArrayCount;
TextPos_Struct _textPosArray[TEXTPOSARRAY_MAX];
TextAttrib_Struct _textAttrib;
int16 _textAttribArrayCount;
TextAttrib_Struct _textAttribArray[TEXTATTRIBARRAY_MAX];
uint16 _window_Row_Min;
uint16 _window_Row_Max;
int16 _reset_Column;
void configureScreen(uint16 row_Min);
uint16 getWindowRowMin();
void dialogueOpen();
void dialogueClose();
void charPos_Clip(int16 &row, int16 &column);
void charPos_Set(int16 row, int16 column);
void charPos_Set(TextPos_Struct *posPtr);
void charPos_Get(int16 &row, int16 &column);
void charPos_Get(TextPos_Struct *posPtr);
void charPos_Push();
void charPos_Pop();
void charPos_SetInsideWindow(int16 windowRow, int16 windowColumn);
void charAttrib_Set(byte foreground, byte background);
byte charAttrib_GetForeground();
byte charAttrib_GetBackground();
void charAttrib_Push();
void charAttrib_Pop();
byte calculateTextBackground(byte background);
void display(int16 textNr, int16 textRow, int16 textColumn);
void displayText(const char *textPtr, bool disabledLook = false);
void displayCharacter(byte character, bool disabledLook = false);
void displayTextInsideWindow(const char *textPtr, int16 windowRow, int16 windowColumn);
MessageState_Struct _messageState;
void printAt(int16 textNr, int16 textPos_Row, int16 textPos_Column, int16 text_Width);
void print(int16 textNr);
bool messageBox(const char *textPtr);
void messageBox_KeyPress(uint16 newKey);
bool _messageBoxCancelled;
void drawMessageBox(const char *textPtr, int16 forcedHeight = 0, int16 wantedWidth = 0, bool forcedWidth = false);
void getMessageBoxInnerDisplayDimensions(int16 &x, int16 &y, int16 &width, int16 &height);
bool isMouseWithinMessageBox();
void closeWindow();
void statusRow_Set(int16 row);
int16 statusRow_Get();
void statusEnable();
void statusDisable();
bool statusEnabled();
void statusDraw();
void statusClear();
bool _statusEnabled;
int16 _statusRow;
void clearLine(int16 row, byte color);
void clearLines(int16 row_Upper, int16 row_Lower, byte color);
void clearBlock(int16 row_Upper, int16 column_Upper, int16 row_Lower, int16 column_Lower, byte color);
void clearBlockInsideWindow(int16 windowRow, int16 windowColumn, int16 width, byte color);
bool _inputEditEnabled;
byte _inputCursorChar;
bool _optionCommandPromptWindow;
bool _promptEnabled;
int16 _promptRow;
int16 _promptCursorPos;
byte _prompt[42];
byte _promptPrevious[42];
bool inputGetEditStatus();
void inputEditOn();
void inputEditOff();
void inputSetCursorChar(int16 cursorChar);
byte inputGetCursorChar();
void promptReset();
void promptEnable();
void promptDisable();
bool promptIsEnabled();
void promptRow_Set(int16 row);
int16 promptRow_Get();
void promptKeyPress(uint16 newKey);
void promptCancelLine();
void promptEchoLine();
void promptRedraw();
void promptClear(); // for AGI1
void promptRememberForAutoComplete(bool entered = false); // for auto-completion
void promptCommandWindow(bool recallLastCommand, uint16 newKey);
int16 _inputStringRow;
int16 _inputStringColumn;
bool _inputStringEntered;
int16 _inputStringMaxLen;
int16 _inputStringCursorPos;
byte _inputString[42];
bool stringWasEntered();
void stringPos_Get(int16 &row, int16 &column);
int16 stringGetMaxLen();
void stringSet(const char *text);
void stringEdit(int16 stringMaxLen);
void stringKeyPress(uint16 newKey);
void stringRememberForAutoComplete(bool entered = false); // for auto-completion
char *stringPrintf(const char *originalText);
char *stringWordWrap(const char *originalText, int16 maxWidth, int16 *calculatedWidthPtr = nullptr, int16 *calculatedHeightPtr = nullptr);
};
} // End of namespace Agi
#endif /* AGI_TEXT_H */