/* 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 HDB_WINDOW_H #define HDB_WINDOW_H namespace HDB { enum { kDialogTextLeft = 64, kDialogTextRight = (kDialogTextLeft + kTileWidth * 9), kOpenDialogTextLeft = kDialogTextLeft, kOpenDialogTextRight = (kDialogTextRight + kTileWidth * 2), kMaxMsgQueue = 10, kWeaponX = (480 - 34), kWeaponY = 2, kInvItemSpaceX = 48, kInvItemSpaceY = 40, kInvItemPerLine = 3, kDlvItemSpaceX = 48, kDlvItemSpaceY = (kTileHeight * 2 + 16), kDlvItemPerLine = 3, kDlvItemTextY = (kScreenHeight - 30), kPanicXStop = 480 / 3, kPanicZoneFaceX = 480 - 32, kPanicZoneFaceY = 5, kNumCrazy = 37, kTextOutCenterX = ((kScreenWidth - kTileWidth * 5) / 2), kPauseY = (kScreenHeight / 2 - 64), kTryY1 = (kScreenHeight >> 2), // TRY kTryY2 = (kTryY1 + 32), // AGAIN kTryRestartY = ((kScreenHeight >> 2) * 3) // (ok) }; enum PZValue { PANICZONE_TIMER, PANICZONE_START, PANICZONE_TITLESTOP, PANICZONE_BLASTOFF, PANICZONE_COUNTDOWN, PANICZONE_END }; struct DialogInfo { char title[64]; // TITLE string int tileIndex; // this is for a character picture char string[160]; // actual text in the dialog bool active; // is it drawing or not? int x, y; // where to draw dialog int width, height; // size of the dialog itself int titleWidth; Picture *gfx; // character tile (picture) int more; // whether we want to draw the MORE icon or not int el, er, et, eb; // saves the text edges char luaMore[64]; // the name of the function to call after clicking the MORE button DialogInfo() : tileIndex(0), active(false), x(0), y(0), width(0), height(0), titleWidth(0), gfx(NULL), more(0), el(0), er(0), et(0), eb(0) { title[0] = 0; string[0] = 0; luaMore[0] = 0; } }; struct DialogChoiceInfo { char title[64]; // TITLE string char text[160]; // actual text in the dialog char func[64]; // function to call with result bool active; // is it drawing or not? int x, y; // where to draw dialog int width, height; // size of the dialog itself int textHeight; // height of everything above choices int titleWidth; int el, er, et, eb; // saves the text edges uint32 timeout; // timeout value! int selection; // which choice we've made int numChoices; // how many choices possible char choices[10][64]; // ptrs to choice text DialogChoiceInfo() : active(false), x(0), y(0), width(0), height(0), textHeight(0), titleWidth(0), el(0), er(0), et(0), eb(0), timeout(0), selection(0), numChoices(0) { title[0] = 0; text[0] = 0; func[0] = 0; for (int i = 0; i < 10; i++) choices[i][0] = 0; } }; struct MessageInfo { bool active; char title[128]; int timer; int x, y; int width, height; MessageInfo() : active(false), timer(0), x(0), y(0), width(0), height(0) { title[0] = 0; } }; struct InvWinInfo { int x, y; int width, height; int selection; bool active; InvWinInfo() : x(0), y(0), width(0), height(0), selection(0), active(false) {} }; struct DlvsInfo { int x, y; int width, height; bool active; int selected; bool animate; uint32 delay1, delay2, delay3; bool go1, go2, go3; DlvsInfo() : x(0), y(0), width(0), height(0), active(false), selected(0), animate(false), delay1(0), delay2(0), delay3(0), go1(false), go2(false), go3(false) {} }; struct PanicZone { bool active; int sequence; int timer; int x1, y1; int x2, y2; int xv, yv; // for both int numberTime; int numberTimeMaster; int numberValue; Picture *gfxPanic, *gfxZone; Picture *gfxFace[2]; Picture *gfxNumber[10]; PanicZone() : active(false), sequence(0), timer(0), x1(0), y1(0), x2(0), y2(0), xv(0), yv(0), numberTime(0), numberTimeMaster(0), numberValue(0), gfxPanic(NULL), gfxZone(NULL) { memset(&gfxFace, 0, sizeof(gfxFace)); memset(&gfxNumber, 0, sizeof(gfxNumber)); } }; struct TryAgainInfo { double y1, y2; double yv1, yv2; double yv1v, yv2v; double x1, x2; TryAgainInfo() : y1(0), y2(0), yv1(0), yv2(0), yv1v(0), yv2v(0), x1(0), x2(0) {} }; struct TOut { char text[128]; int x, y; uint32 timer; TOut() : x(0), y(0), timer(0) { text[0] = 0; } }; class Window { public: bool init(); void save(Common::OutSaveFile *out); void loadSaveFile(Common::InSaveFile *in); void restartSystem(); void setInfobarDark(int value); void closeAll(); // Pause Functions void drawPause(); void checkPause(int x, int y); // Weapon Functions void drawWeapon(); void chooseWeapon(AIType wType); // Dialog Functions void openDialog(const char *title, int tileIndex, const char *string, int more, const char *luaMore); void drawDialog(); void closeDialog(); bool checkDialogClose(int x, int y); void drawBorder(int x, int y, int width, int height, bool guyTalking); void setDialogDelay(int delay); uint32 getDialogDelay() { return _dialogDelay; } bool dialogActive() { return _dialogInfo.active; } // Dialog Choice Functions void openDialogChoice(const char *title, const char *text, const char *func, int numChoices, const char *choices[10]); void drawDialogChoice(); void closeDialogChoice(); bool checkDialogChoiceClose(int x, int y); void dialogChoiceMoveup(); void dialogChoiceMovedown(); bool dialogChoiceActive() { return _dialogChoiceInfo.active; } // MessageBar Functions void openMessageBar(const char *title, int time); void drawMessageBar(); bool checkMsgClose(int x, int y); void nextMsgQueued(); void closeMsg(); bool msgBarActive() { return _msgInfo.active; } // Inventory Functions void drawInventory(); void setInvSelect(int status) { _invWinInfo.selection = status; } int getInvSelect() { return _invWinInfo.selection; } void checkInvSelect(int x, int y); bool inventoryActive() { return _invWinInfo.active; } // Deliveries Functions void openDeliveries(bool animate); void drawDeliveries(); void setSelectedDelivery(int which); int getSelectedDelivery() { return _dlvsInfo.selected; } bool animatingDelivery() { return _dlvsInfo.animate; } void checkDlvSelect(int x, int y); // Try Again Functions void drawTryAgain(); void clearTryAgain(); // Panic Zone Functions void loadPanicZoneGfx(); void drawPanicZone(); void startPanicZone(); void stopPanicZone(); bool inPanicZone() { return _pzInfo.active; } // TextOut functions void textOut(const char *text, int x, int y, int timer); void centerTextOut(const char *text, int y, int timer); void drawTextOut(); int textOutActive() { return (_textOutList.size()); } void closeTextOut(); Tile *getGemGfx() { return _gemGfx; } PanicZone _pzInfo, _tempPzInfo; private: DialogInfo _dialogInfo; uint32 _dialogDelay; // Used for Cinematics DialogChoiceInfo _dialogChoiceInfo; MessageInfo _msgInfo; InvWinInfo _invWinInfo; Common::Array _textOutList; DlvsInfo _dlvsInfo; TryAgainInfo _tryAgainInfo; char _msgQueueStr[kMaxMsgQueue][128]; int _msgQueueWait[kMaxMsgQueue]; int _numMsgQueue; // Windows GFX Picture *_gfxTL, *_gfxTM, *_gfxTR; Picture *_gfxL, *_gfxM, *_gfxR; Picture *_gfxBL, *_gfxBM, *_gfxBR; Picture *_gfxTitleL, *_gfxTitleM, *_gfxTitleR; Picture *_gGfxTL, *_gGfxTM, *_gGfxTR; Picture *_gGfxL, *_gGfxM, *_gGfxR; Picture *_gGfxBL, *_gGfxBM, *_gGfxBR; Picture *_gGfxTitleL, *_gGfxTitleM, *_gGfxTitleR; Picture *_gfxResources, *_gfxDeliveries; Picture *_gfxIndent, *_gfxArrowTo, *_gfxHandright; Picture *_gfxTry, *_gfxAgain, *_gfxInvSelect; Tile *_gfxMonkeystone; Picture *_gfxLevelRestart, *_gfxPausePlaque; Tile *_gemGfx; Picture *_mstoneGfx; // Info Bar Picture *_gfxInfobar, *_gfxDarken; int _infobarDimmed; }; } // End of Namespace #endif // !HDB_WINDOW_H