aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/interface.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/interface.h')
-rw-r--r--engines/saga/interface.h466
1 files changed, 466 insertions, 0 deletions
diff --git a/engines/saga/interface.h b/engines/saga/interface.h
new file mode 100644
index 0000000000..bee3fd4a2a
--- /dev/null
+++ b/engines/saga/interface.h
@@ -0,0 +1,466 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2004-2006 The ScummVM project
+ *
+ * The ReInherit Engine is (C)2000-2003 by Daniel Balsom.
+ *
+ * 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+// Game interface module private header file
+
+#ifndef SAGA_INTERFACE_H__
+#define SAGA_INTERFACE_H__
+
+#include "common/savefile.h"
+
+#include "saga/sprite.h"
+#include "saga/script.h"
+
+namespace Saga {
+
+enum InterfaceUpdateFlags {
+ UPDATE_MOUSEMOVE = 1,
+ UPDATE_LEFTBUTTONCLICK = 2,
+ UPDATE_RIGHTBUTTONCLICK = 4,
+ UPDATE_MOUSECLICK = UPDATE_LEFTBUTTONCLICK | UPDATE_RIGHTBUTTONCLICK,
+ UPDATE_WHEELUP = 8,
+ UPDATE_WHEELDOWN = 16
+};
+
+#define CONVERSE_MAX_TEXTS 64
+#define CONVERSE_MAX_WORK_STRING 128
+
+#define ITE_INVENTORY_SIZE 24
+
+#define VERB_STRLIMIT 32
+
+#define STATUS_TEXT_LEN 128
+#define STATUS_TEXT_INPUT_MAX 256
+
+// Converse-specific stuff
+
+enum PanelModes {
+ kPanelNull,
+ kPanelMain,
+ kPanelOption,
+ kPanelSave, //ex- kPanelTextBox,
+ kPanelQuit,
+ kPanelError,
+ kPanelLoad,
+ kPanelConverse,
+ kPanelProtect,
+ kPanelPlacard,
+ kPanelMap,
+ kPanelSceneSubstitute,
+ kPanelChapterSelection,
+ kPanelCutaway,
+ kPanelVideo,
+ kPanelBoss
+// kPanelInventory
+};
+
+enum FadeModes {
+ kNoFade = 0,
+ kFadeIn,
+ kFadeOut
+};
+
+struct InterfacePanel {
+ int x;
+ int y;
+ byte *image;
+ size_t imageLength;
+ int imageWidth;
+ int imageHeight;
+
+ PanelButton *currentButton;
+ int buttonsCount;
+ PanelButton *buttons;
+ SpriteList sprites;
+
+ InterfacePanel() {
+ x = y = 0;
+ image = NULL;
+ imageLength = 0;
+ imageWidth = imageHeight = 0;
+ currentButton = NULL;
+ buttonsCount = 0;
+ buttons = NULL;
+ }
+
+ PanelButton *getButton(int index) {
+ if ((index >= 0) && (index < buttonsCount)) {
+ return &buttons[index];
+ }
+ return NULL;
+ }
+
+ void getRect(Rect &rect) {
+ rect.left = x;
+ rect.top = y;
+ rect.setWidth(imageWidth);
+ rect.setHeight(imageHeight);
+ }
+
+ void calcPanelButtonRect(const PanelButton* panelButton, Rect &rect) {
+ rect.left = x + panelButton->xOffset;
+ rect.right = rect.left + panelButton->width;
+ rect.top = y + panelButton->yOffset;
+ rect.bottom = rect.top + panelButton->height;
+ }
+
+ PanelButton *hitTest(const Point& mousePoint, int buttonType) {
+ PanelButton *panelButton;
+ Rect rect;
+ int i;
+ for (i = 0; i < buttonsCount; i++) {
+ panelButton = &buttons[i];
+ if (panelButton != NULL) {
+ if ((panelButton->type & buttonType) > 0) {
+ calcPanelButtonRect(panelButton, rect);
+ if (rect.contains(mousePoint)) {
+ return panelButton;
+ }
+ }
+ }
+ }
+ return NULL;
+ }
+
+ void zeroAllButtonState() {
+ int i;
+ for (i = 0; i < buttonsCount; i++) {
+ buttons[i].state = 0;
+ }
+ }
+
+
+};
+
+struct Converse {
+ char *text;
+ int stringNum;
+ int textNum;
+ int replyId;
+ int replyFlags;
+ int replyBit;
+};
+
+
+enum StatusTextInputState {
+ kStatusTextInputFirstRun,
+ kStatusTextInputEntered,
+ kStatusTextInputAborted
+};
+
+class Interface {
+public:
+ Interface(SagaEngine *vm);
+ ~Interface(void);
+
+ int activate();
+ int deactivate();
+ void setSaveReminderState(int state) {
+ _saveReminderState = state;
+ draw();
+ }
+ int getSaveReminderState() {
+ return _saveReminderState;
+ }
+ bool isActive() { return _active; }
+ void setMode(int mode);
+ int getMode(void) const { return _panelMode; }
+ void setFadeMode(int fadeMode) {
+ _fadeMode = fadeMode;
+ draw();
+ }
+ int getFadeMode() const {
+ return _fadeMode;
+ }
+ void rememberMode();
+ void restoreMode();
+ bool isInMainMode() { return _inMainMode; }
+ void setStatusText(const char *text, int statusColor = -1);
+ void loadScenePortraits(int resourceId);
+ void setLeftPortrait(int portrait) {
+ _leftPortrait = portrait;
+ draw();
+ }
+ void setRightPortrait(int portrait) {
+ _rightPortrait = portrait;
+ draw();
+ }
+ void setPortraitBgColor(int red, int green, int blue) {
+ _portraitBgColor.red = red;
+ _portraitBgColor.green = green;
+ _portraitBgColor.blue = blue;
+ }
+
+ void draw();
+ void drawOption();
+ void drawQuit();
+ void drawLoad();
+ void drawSave();
+ void drawProtect();
+ void update(const Point& mousePoint, int updateFlag);
+ void drawStatusBar();
+ void setVerbState(int verb, int state);
+
+ bool processAscii(uint16 ascii, bool synthetic = false);
+ void processKeyUp(uint16 ascii);
+
+ void keyBoss();
+ void keyBossExit();
+
+ void disableAbortSpeeches(bool d) { _disableAbortSpeeches = d; }
+
+ bool _textInput;
+
+ bool _statusTextInput;
+ StatusTextInputState _statusTextInputState;
+ char _statusTextInputString[STATUS_TEXT_INPUT_MAX];
+ void enterStatusString() {
+ _statusTextInput = true;
+ _statusTextInputPos = 0;
+ _statusTextInputString[0] = 0;
+ setStatusText(_statusTextInputString);
+ }
+
+private:
+ static void textInputRepeatCallback(void *refCon);
+
+ void drawInventory(Surface *backBuffer);
+ void updateInventory(int pos);
+ void inventoryChangePos(int chg);
+ void inventorySetPos(int key);
+
+public:
+ void refreshInventory() {
+ updateInventory(_inventoryCount);
+ draw();
+ }
+ void addToInventory(int objectId);
+ void removeFromInventory(int objectId);
+ void clearInventory();
+ int inventoryItemPosition(int objectId);
+ int getInventoryContentByPanelButton(PanelButton * panelButton) {
+ int cell = _inventoryStart + panelButton->id;
+ if (cell >= _inventoryCount) {
+ return 0;
+ }
+ return _inventory[cell];
+ }
+
+ PanelButton *inventoryHitTest(const Point& mousePoint) {
+ return _mainPanel.hitTest(mousePoint, kPanelButtonInventory);
+ }
+ PanelButton *verbHitTest(const Point& mousePoint){
+ return _mainPanel.hitTest(mousePoint, kPanelButtonVerb);
+ }
+ void saveState(Common::OutSaveFile *out);
+ void loadState(Common::InSaveFile *in);
+
+ void mapPanelDrawCrossHair();
+
+ int32 getProtectHash() { return _protectHash; }
+
+private:
+ void handleMainUpdate(const Point& mousePoint); // main panel update
+ void handleMainClick(const Point& mousePoint); // main panel click
+
+ PanelButton *converseHitTest(const Point& mousePoint) {
+ return _conversePanel.hitTest(mousePoint, kPanelAllButtons);
+ }
+ void handleConverseUpdate(const Point& mousePoint); // converse panel update
+ void handleConverseClick(const Point& mousePoint); // converse panel click
+
+ PanelButton *optionHitTest(const Point& mousePoint) {
+ return _optionPanel.hitTest(mousePoint, kPanelButtonOptionSaveFiles | kPanelButtonOption | kPanelButtonOptionSlider);
+ }
+ void handleOptionUpdate(const Point& mousePoint); // option panel update
+ void handleOptionClick(const Point& mousePoint); // option panel click
+
+ PanelButton *quitHitTest(const Point& mousePoint) {
+ return _quitPanel.hitTest(mousePoint, kPanelAllButtons);
+ }
+ void handleQuitUpdate(const Point& mousePoint); // quit panel update
+ void handleQuitClick(const Point& mousePoint); // quit panel click
+
+ PanelButton *loadHitTest(const Point& mousePoint) {
+ return _loadPanel.hitTest(mousePoint, kPanelAllButtons);
+ }
+ void handleLoadUpdate(const Point& mousePoint); // load panel update
+ void handleLoadClick(const Point& mousePoint); // load panel click
+
+ PanelButton *saveHitTest(const Point& mousePoint) {
+ return _savePanel.hitTest(mousePoint, kPanelAllButtons);
+ }
+ void handleSaveUpdate(const Point& mousePoint); // save panel update
+ void handleSaveClick(const Point& mousePoint); // save panel click
+
+ void handleChapterSelectionUpdate(const Point& mousePoint);
+ void handleChapterSelectionClick(const Point& mousePoint);
+
+ void mapPanelShow();
+ void mapPanelClean();
+
+ void lockMode() { _lockedMode = _panelMode; }
+ void unlockMode() { _panelMode = _lockedMode; }
+
+ void setOption(PanelButton *panelButton);
+ void setQuit(PanelButton *panelButton);
+ void setLoad(PanelButton *panelButton);
+ void setSave(PanelButton *panelButton);
+
+ void drawTextInput(Surface *ds, InterfacePanel *panel, PanelButton *panelButton);
+ void drawPanelText(Surface *ds, InterfacePanel *panel, PanelButton *panelButton);
+ void drawPanelButtonText(Surface *ds, InterfacePanel *panel, PanelButton *panelButton);
+ enum ButtonKind {
+ kButton,
+ kSlider,
+ kEdit
+ };
+ void drawButtonBox(Surface *ds, const Rect &rect, ButtonKind kind, bool down);
+ void drawPanelButtonArrow(Surface *ds, InterfacePanel *panel, PanelButton *panelButton);
+ void drawVerbPanelText(Surface *ds, PanelButton *panelButton, KnownColor textKnownColor, KnownColor textShadowKnownColor);
+ void drawVerbPanel(Surface *backBuffer, PanelButton* panelButton);
+ void calcOptionSaveSlider();
+ bool processTextInput(uint16 ascii);
+ void processStatusTextInput(uint16 ascii);
+ void textInputStartRepeat(uint16 ascii);
+ void textInputRepeat(void);
+
+public:
+ void converseInit(void);
+ void converseClear(void);
+ bool converseAddText(const char *text, int replyId, byte replyFlags, int replyBit);
+ void converseDisplayText();
+ void converseSetTextLines(int row);
+ void converseChangePos(int chg);
+ void converseSetPos(int key);
+
+private:
+ void converseDisplayTextLines(Surface *ds);
+ PanelButton *getPanelButtonByVerbType(int verb) {
+ if ((verb < 0) || (verb >= kVerbTypeIdsMax)) {
+ error("Interface::getPanelButtonByVerbType wrong verb");
+ }
+ return _verbTypeToPanelButton[verb];
+ }
+
+ void validateOptionButtons() {
+ if (!_vm->isSaveListFull() && (_optionSaveFileTitleNumber == 0) && (_optionPanel.currentButton != NULL)) {
+ if (_optionPanel.currentButton->id == kTextLoad) {
+ _optionPanel.currentButton = NULL;
+ }
+ }
+ }
+ void validateSaveButtons() {
+ if ((_textInputStringLength == 0) && (_savePanel.currentButton != NULL)) {
+ if (_savePanel.currentButton->id == kTextSave) {
+ _savePanel.currentButton = NULL;
+ }
+ }
+ }
+
+public:
+ SpriteList _defPortraits;
+
+private:
+ SagaEngine *_vm;
+
+ ResourceContext *_interfaceContext;
+ InterfacePanel _mainPanel;
+ PanelButton *_inventoryUpButton;
+ PanelButton *_inventoryDownButton;
+ InterfacePanel _conversePanel;
+ PanelButton *_converseUpButton;
+ PanelButton *_converseDownButton;
+ SpriteList _scenePortraits;
+ PanelButton *_verbTypeToPanelButton[kVerbTypeIdsMax];
+ InterfacePanel _optionPanel;
+ PanelButton * _optionSaveFileSlider;
+ PanelButton * _optionSaveFilePanel;
+ InterfacePanel _quitPanel;
+ InterfacePanel _loadPanel;
+ InterfacePanel _savePanel;
+ PanelButton * _saveEdit;
+ InterfacePanel _protectPanel;
+ PanelButton * _protectEdit;
+
+ bool _disableAbortSpeeches;
+
+ int _saveReminderState;
+ bool _active;
+ int _fadeMode;
+ int _panelMode;
+ int _savedMode;
+ int _lockedMode;
+ int _bossMode;
+ bool _inMainMode;
+ char _statusText[STATUS_TEXT_LEN];
+ int _statusOnceColor;
+ int _leftPortrait;
+ int _rightPortrait;
+ PalEntry _portraitBgColor;
+
+ Point _lastMousePoint;
+
+ uint16 *_inventory;
+ int _inventorySize;
+ int _inventoryStart;
+ int _inventoryEnd;
+ int _inventoryPos;
+ int _inventoryBox;
+ int _inventoryCount;
+
+ char _converseWorkString[CONVERSE_MAX_WORK_STRING];
+ Converse _converseText[CONVERSE_MAX_TEXTS];
+ int _converseTextCount;
+ int _converseStrCount;
+ int _converseStartPos;
+ int _converseEndPos;
+ int _conversePos;
+
+ uint _optionSaveFileTop;
+ uint _optionSaveFileTitleNumber;
+ int16 _optionSaveFileMouseOff;
+ Rect _optionSaveRectTop;
+ Rect _optionSaveRectSlider;
+ Rect _optionSaveRectBottom;
+
+ char _textInputString[SAVE_TITLE_SIZE];
+ uint _textInputStringLength;
+ uint _textInputPos;
+ uint _textInputMaxWidth;
+
+ uint _statusTextInputPos;
+
+ int _textInputRepeatPhase;
+ uint16 _textInputRepeatChar;
+
+ PalEntry _mapSavedPal[PAL_ENTRIES];
+ bool _mapPanelCrossHairState;
+
+ int32 _protectHash;
+};
+
+} // End of namespace Saga
+
+#endif /* INTERFACE_H__ */