aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/text.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agi/text.h')
-rw-r--r--engines/agi/text.h217
1 files changed, 217 insertions, 0 deletions
diff --git a/engines/agi/text.h b/engines/agi/text.h
new file mode 100644
index 0000000000..f0aeab7762
--- /dev/null
+++ b/engines/agi/text.h
@@ -0,0 +1,217 @@
+/* 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 */