diff options
author | Paul Gilbert | 2014-12-30 22:50:24 -1000 |
---|---|---|
committer | Paul Gilbert | 2014-12-30 22:50:24 -1000 |
commit | 9506635bad402d58886cc9a47512871b321a10a2 (patch) | |
tree | 28e5c8ae598df25dc16770aca56b721f8225dd25 | |
parent | fb47ec9627937fe5031f20d16c175e5a12b5dfe2 (diff) | |
download | scummvm-rg350-9506635bad402d58886cc9a47512871b321a10a2.tar.gz scummvm-rg350-9506635bad402d58886cc9a47512871b321a10a2.tar.bz2 scummvm-rg350-9506635bad402d58886cc9a47512871b321a10a2.zip |
XEEN: Implemented Window functionality
-rw-r--r-- | engines/xeen/events.cpp | 5 | ||||
-rw-r--r-- | engines/xeen/events.h | 5 | ||||
-rw-r--r-- | engines/xeen/menus.cpp | 43 | ||||
-rw-r--r-- | engines/xeen/menus.h | 20 | ||||
-rw-r--r-- | engines/xeen/screen.cpp | 147 | ||||
-rw-r--r-- | engines/xeen/screen.h | 21 | ||||
-rw-r--r-- | engines/xeen/xeen.cpp | 5 | ||||
-rw-r--r-- | engines/xeen/xeen.h | 8 |
8 files changed, 197 insertions, 57 deletions
diff --git a/engines/xeen/events.cpp b/engines/xeen/events.cpp index 29dde3a031..54cc843dbb 100644 --- a/engines/xeen/events.cpp +++ b/engines/xeen/events.cpp @@ -176,4 +176,9 @@ void EventsManager::nextFrame() { _vm->_screen->update(); } +/*------------------------------------------------------------------------*/ + +GameEvent::GameEvent() { +} + } // End of namespace Xeen diff --git a/engines/xeen/events.h b/engines/xeen/events.h index 3590267b66..bf41bc9f40 100644 --- a/engines/xeen/events.h +++ b/engines/xeen/events.h @@ -79,6 +79,11 @@ public: uint32 timeElapsed(); }; +class GameEvent { +public: + GameEvent(); +}; + } // End of namespace Xeen #endif /* XEEN_EVENTS_H */ diff --git a/engines/xeen/menus.cpp b/engines/xeen/menus.cpp index 4ddb85a63d..da272b6f3d 100644 --- a/engines/xeen/menus.cpp +++ b/engines/xeen/menus.cpp @@ -43,6 +43,10 @@ void Dialog::restoreButtons() { _buttons = _savedButtons.pop(); } +void Dialog::addButton(const Common::Rect &bounds, char c, SpriteResource *sprites, bool d) { + _buttons.push_back(DialogButton(bounds, c, sprites, d)); +} + /*------------------------------------------------------------------------*/ void OptionsMenu::show(XeenEngine *vm) { @@ -77,8 +81,9 @@ void OptionsMenu::execute() { screen._windows[28].setBounds(Common::Rect(72, 25, 248, 175)); - Common::String title1, title2; - startup(title1, title2); + Common::String title1, buttonsName; + startup(title1, buttonsName); + SpriteResource buttonSprites(buttonsName); bool firstTime = true; while (!_vm->shouldQuit()) { @@ -91,10 +96,17 @@ void OptionsMenu::execute() { } for (;;) { - clearButtons(); - showTitles1(title1); showTitles2(); + + reopen: + clearButtons(); + setupButtons(&buttonSprites); + openWindow(); + + while (!_vm->shouldQuit()) { + + } } } } @@ -108,9 +120,9 @@ void OptionsMenu::showTitles1(const Common::String &title) { while (!_vm->shouldQuit() && !events.isKeyMousePressed()) { events.updateGameCounter(); - frame = frame % (_vm->getGameID() == GType_WorldOfXeen ? 5 : 10); + frame = ++frame % (_vm->getGameID() == GType_WorldOfXeen ? 5 : 10); screen.restoreBackground(); - titleSprites.draw(screen, 0); + titleSprites.draw(screen, frame); while (events.timeElapsed() == 0) events.pollEventsAndWait(); @@ -153,6 +165,20 @@ void OptionsMenu::showTitles2() { screen._windows[0].update(); } +void OptionsMenu::setupButtons(SpriteResource *buttons) { + addButton(Common::Rect(124, 87, 124 + 53, 87 + 10), 'S', buttons, true); + addButton(Common::Rect(126, 98, 126 + 47, 98 + 10), 'L', buttons, true); + addButton(Common::Rect(91, 110, 91 + 118, 110 + 10), 'C', buttons, true); + addButton(Common::Rect(85, 121, 85 + 131, 121 + 10), 'O', buttons, true); +} + +void WorldOptionsMenu::setupButtons(SpriteResource *buttons) { + addButton(Common::Rect(93, 53, 93 + 134, 53 + 20), 'S', buttons, false); + addButton(Common::Rect(93, 78, 93 + 134, 78 + 20), 'L', buttons, false); + addButton(Common::Rect(93, 103, 93 + 134, 103 + 20), 'C', buttons, false); + addButton(Common::Rect(93, 128, 93 + 134, 128 + 20), 'O', buttons, false); +} + /*------------------------------------------------------------------------*/ void CloudsOptionsMenu::startup(Common::String &title1, Common::String &title2) { @@ -289,4 +315,9 @@ void WorldOptionsMenu::setBackground() { screen.fadeIn(4); } +void WorldOptionsMenu::openWindow() { + _vm->_screen->_windows[28].open(); +} + + } // End of namespace Xeen diff --git a/engines/xeen/menus.h b/engines/xeen/menus.h index 497c193f65..774c7cfcb9 100644 --- a/engines/xeen/menus.h +++ b/engines/xeen/menus.h @@ -33,8 +33,14 @@ namespace Xeen { class DialogButton { public: Common::Rect _bounds; - int _d; - int _i; + SpriteResource *_sprites; + char _c; + bool _d; + + DialogButton(const Common::Rect &bounds, char c, SpriteResource *sprites, bool d) : + _bounds(bounds), _c(c), _sprites(sprites), _d(d) {} + + DialogButton() : _c('\0'), _sprites(nullptr), _d(false) {} }; class Dialog { @@ -53,6 +59,8 @@ public: void clearButtons(); void restoreButtons(); + + void addButton(const Common::Rect &bounds, char c, SpriteResource *sprites, bool d); }; class OptionsMenu: public Dialog { @@ -68,6 +76,10 @@ protected: virtual void showTitles1(const Common::String &title); virtual void showTitles2(); + + virtual void setupButtons(SpriteResource *buttons); + + virtual void openWindow() {} public: static void show(XeenEngine *vm); }; @@ -97,6 +109,10 @@ protected: virtual void setBackground(); virtual void showTitles2() {} + + virtual void setupButtons(SpriteResource *buttons); + + virtual void openWindow(); public: WorldOptionsMenu(XeenEngine *vm) : DarkSideOptionsMenu(vm) {} }; diff --git a/engines/xeen/screen.cpp b/engines/xeen/screen.cpp index f773ee5d42..1f8e50cd87 100644 --- a/engines/xeen/screen.cpp +++ b/engines/xeen/screen.cpp @@ -22,25 +22,76 @@ #include "common/system.h" #include "graphics/palette.h" +#include "graphics/surface.h" #include "xeen/screen.h" #include "xeen/resources.h" #include "xeen/xeen.h" namespace Xeen { -Window::Window() : _screen(nullptr), _enabled(false), _a(0), _border(0), +Window::Window() : _vm(nullptr), _enabled(false), _a(0), _border(0), _xLo(0), _xHi(0), _ycL(0), _ycH(0) { } -Window::Window(Screen *screen, const Common::Rect &bounds, int a, int border, +Window::Window(XeenEngine *vm, const Common::Rect &bounds, int a, int border, int xLo, int ycL, int xHi, int ycH): - _screen(screen), _enabled(false), _bounds(bounds), _a(a), _border(border), - _xLo(xLo), _ycL(ycL), _xHi(xHi), _ycH(ycH) { + _vm(vm), _enabled(false), _a(a), _border(border), + _xLo(xLo), _ycL(ycL), _xHi(xHi), _ycH(ycH) { + setBounds(bounds); } +void Window::setBounds(const Common::Rect &r) { + _bounds = r; + _innerBounds = r; + _innerBounds.grow(-_border); +} + +void Window::open() { + if (!_enabled) { + _vm->_screen->_windowStack.push_back(this); + open2(); + } + + if (_vm->_mode == MODE_9) { + warning("TODO: copyFileToMemory"); + } +} + +void Window::open2() { + create(_bounds.width(), _bounds.height()); + copyRectToSurface(*_vm->_screen, 0, 0, _bounds); + _dirtyRects.push(_bounds); +} + +void Window::close() { + if (_enabled) { + // Update any remaining pending changes to the screen and free + // the window's internal surface storage + update(); + free(); + + // Remove the window from the stack and flag it as now disabled + for (uint i = 0; i < _vm->_screen->_windowStack.size(); ++i) { + if (_vm->_screen->_windowStack[i] == this) + _vm->_screen->_windowStack.remove_at(i); + } + + _enabled = false; + } + + if (_vm->_mode == MODE_9) { + warning("TODO: copyFileToMemory"); + } +} + +/** + * Pushes any pending changes for the window to the screen + */ void Window::update() { - // Window updates are not specifically necessary since all drawing - // automatically gets added to the screen's dirty rect list + while (!_dirtyRects.empty()) { + Common::Rect r = _dirtyRects.pop(); + blitTo(*_vm->_screen, Common::Point(_bounds.left, _bounds.top)); + } } /*------------------------------------------------------------------------*/ @@ -56,50 +107,56 @@ Screen::Screen(XeenEngine *vm) : _vm(vm) { void Screen::setupWindows() { Window windows[40] = { - Window(this, Common::Rect(0, 0, 320, 200), 0, 0, 0, 0, 320, 200), - Window(this, Common::Rect(237, 9, 317, 74), 0, 0, 237, 12, 307, 68), - Window(this, Common::Rect(225, 1, 319, 73), 1, 8, 225, 1, 319, 73), - Window(this, Common::Rect(0, 0, 230, 149), 0, 0, 9, 8, 216, 140), - Window(this, Common::Rect(235, 148, 309, 189), 2, 8, 0, 0, 0, 0), - Window(this, Common::Rect(70, 20, 250, 183), 3, 8, 80, 38, 240, 166), - Window(this, Common::Rect(52, 149, 268, 197), 4, 8, 0, 0, 0, 0), - Window(this, Common::Rect(108, 0, 200, 200), 5, 0, 0, 0, 0, 0), - Window(this, Common::Rect(232, 9, 312, 74), 0, 0, 0, 0, 0, 0), - Window(this, Common::Rect(103, 156, 217, 186), 6, 8, 0, 0, 0, 0), - Window(this, Common::Rect(226, 0, 319, 146), 7, 8, 0, 0, 0, 0), - Window(this, Common::Rect(8, 8, 224, 140), 8, 8, 8, 8, 224, 200), - Window(this, Common::Rect(0, 143, 320, 199), 9, 8, 0, 0, 0, 0), - Window(this, Common::Rect(50, 103, 266, 139), 10, 8, 0, 0, 0, 0), - Window(this, Common::Rect(0, 7, 320, 138), 11, 8, 0, 0, 0, 0), - Window(this, Common::Rect(50, 71, 182, 129), 12, 8, 0, 0, 0, 0), - Window(this, Common::Rect(228, 106, 319, 146), 13, 8, 0, 0, 0, 0), - Window(this, Common::Rect(20, 142, 290, 199), 14, 8, 0, 0, 0, 0), - Window(this, Common::Rect(0, 20, 320, 180), 15, 8, 0, 0, 0, 0), - Window(this, Common::Rect(231, 48, 317, 141), 16, 8, 0, 0, 0, 0), - Window(this, Common::Rect(72, 37, 248, 163), 17, 8, 0, 0, 0, 0), - Window(this, Common::Rect(99, 59, 237, 141), 18, 8, 99, 59, 237, 0), - Window(this, Common::Rect(65, 23, 250, 163), 19, 8, 75, 36, 245, 141), - Window(this, Common::Rect(80, 28, 256, 148), 20, 8, 80, 28, 256, 172), - Window(this, Common::Rect(0, 0, 320, 146), 21, 8, 0, 0, 320, 148), - Window(this, Common::Rect(27, 6, 207, 142), 22, 8, 0, 0, 0, 146), - Window(this, Common::Rect(15, 15, 161, 91), 23, 8, 0, 0, 0, 0), - Window(this, Common::Rect(90, 45, 220, 157), 24, 8, 0, 0, 0, 0), - Window(this, Common::Rect(0, 0, 320, 200), 25, 8, 0, 0, 0, 0), - Window(this, Common::Rect(0, 101, 320, 146), 26, 8, 0, 101, 320, 0), - Window(this, Common::Rect(0, 0, 320, 108), 27, 8, 0, 0, 0, 45), - Window(this, Common::Rect(50, 112, 266, 148), 28, 8, 0, 0, 0, 0), - Window(this, Common::Rect(12, 11, 164, 94), 0, 0, 0, 0, 52, 0), - Window(this, Common::Rect(8, 147, 224, 192), 0, 8, 0, 0, 0, 94), - Window(this, Common::Rect(232, 74, 312, 138), 29, 8, 0, 0, 0, 0), - Window(this, Common::Rect(226, 26, 319, 146), 30, 8, 0, 0, 0, 0), - Window(this, Common::Rect(225, 74, 319, 154), 31, 8, 0, 0, 0, 0), - Window(this, Common::Rect(27, 6, 195, 142), 0, 8, 0, 0, 0, 0), - Window(this, Common::Rect(225, 140, 319, 199), 0, 8, 0, 0, 0, 0) + Window(_vm, Common::Rect(0, 0, 320, 200), 0, 0, 0, 0, 320, 200), + Window(_vm, Common::Rect(237, 9, 317, 74), 0, 0, 237, 12, 307, 68), + Window(_vm, Common::Rect(225, 1, 319, 73), 1, 8, 225, 1, 319, 73), + Window(_vm, Common::Rect(0, 0, 230, 149), 0, 0, 9, 8, 216, 140), + Window(_vm, Common::Rect(235, 148, 309, 189), 2, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(70, 20, 250, 183), 3, 8, 80, 38, 240, 166), + Window(_vm, Common::Rect(52, 149, 268, 197), 4, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(108, 0, 200, 200), 5, 0, 0, 0, 0, 0), + Window(_vm, Common::Rect(232, 9, 312, 74), 0, 0, 0, 0, 0, 0), + Window(_vm, Common::Rect(103, 156, 217, 186), 6, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(226, 0, 319, 146), 7, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(8, 8, 224, 140), 8, 8, 8, 8, 224, 200), + Window(_vm, Common::Rect(0, 143, 320, 199), 9, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(50, 103, 266, 139), 10, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(0, 7, 320, 138), 11, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(50, 71, 182, 129), 12, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(228, 106, 319, 146), 13, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(20, 142, 290, 199), 14, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(0, 20, 320, 180), 15, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(231, 48, 317, 141), 16, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(72, 37, 248, 163), 17, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(99, 59, 237, 141), 18, 8, 99, 59, 237, 0), + Window(_vm, Common::Rect(65, 23, 250, 163), 19, 8, 75, 36, 245, 141), + Window(_vm, Common::Rect(80, 28, 256, 148), 20, 8, 80, 28, 256, 172), + Window(_vm, Common::Rect(0, 0, 320, 146), 21, 8, 0, 0, 320, 148), + Window(_vm, Common::Rect(27, 6, 207, 142), 22, 8, 0, 0, 0, 146), + Window(_vm, Common::Rect(15, 15, 161, 91), 23, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(90, 45, 220, 157), 24, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(0, 0, 320, 200), 25, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(0, 101, 320, 146), 26, 8, 0, 101, 320, 0), + Window(_vm, Common::Rect(0, 0, 320, 108), 27, 8, 0, 0, 0, 45), + Window(_vm, Common::Rect(50, 112, 266, 148), 28, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(12, 11, 164, 94), 0, 0, 0, 0, 52, 0), + Window(_vm, Common::Rect(8, 147, 224, 192), 0, 8, 0, 0, 0, 94), + Window(_vm, Common::Rect(232, 74, 312, 138), 29, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(226, 26, 319, 146), 30, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(225, 74, 319, 154), 31, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(27, 6, 195, 142), 0, 8, 0, 0, 0, 0), + Window(_vm, Common::Rect(225, 140, 319, 199), 0, 8, 0, 0, 0, 0) }; _windows = Common::Array<Window>(windows, 40); } +void Screen::closeWindows() { + for (int i = (int)_windowStack.size() - 1; i >= 0; --i) + _windowStack[i]->close(); + assert(_windowStack.size() == 0); +} + void Screen::update() { // Merge the dirty rects mergeDirtyRects(); diff --git a/engines/xeen/screen.h b/engines/xeen/screen.h index 728140a695..b132e3321a 100644 --- a/engines/xeen/screen.h +++ b/engines/xeen/screen.h @@ -26,6 +26,7 @@ #include "common/scummsys.h" #include "common/system.h" #include "common/array.h" +#include "common/queue.h" #include "common/rect.h" #include "xeen/xsurface.h" @@ -39,22 +40,30 @@ namespace Xeen { class XeenEngine; class Screen; -class Window { +class Window: public XSurface { private: - Screen *_screen; + XeenEngine *_vm; Common::Rect _bounds; + Common::Rect _innerBounds; int _a; int _border; int _xLo, _xHi; int _ycL, _ycH; bool _enabled; + Common::Queue<Common::Rect> _dirtyRects; + + void open2(); public: Window(); - Window(Screen *screen, const Common::Rect &bounds, int a, int border, + Window(XeenEngine *vm, const Common::Rect &bounds, int a, int border, int xLo, int ycL, int xHi, int ycH); - void setBounds(const Common::Rect &r) { _bounds = r; } + void setBounds(const Common::Rect &r); + + void open(); + + void close(); void update(); }; @@ -86,9 +95,13 @@ public: virtual void addDirtyRect(const Common::Rect &r); public: Common::Array<Window> _windows; + + Common::Array<Window *> _windowStack; public: Screen(XeenEngine *vm); + void closeWindows(); + void update(); void loadPalette(const Common::String &name); diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp index 311e139b21..505d9bd2db 100644 --- a/engines/xeen/xeen.cpp +++ b/engines/xeen/xeen.cpp @@ -38,6 +38,7 @@ XeenEngine::XeenEngine(OSystem *syst, const XeenGameDescription *gameDesc) _events = nullptr; _screen = nullptr; _sound = nullptr; + _eventData = nullptr; } XeenEngine::~XeenEngine() { @@ -45,6 +46,7 @@ XeenEngine::~XeenEngine() { delete _events; delete _screen; delete _sound; + delete _eventData; } void XeenEngine::initialize() { @@ -61,6 +63,9 @@ void XeenEngine::initialize() { _screen = new Screen(this); _sound = new SoundManager(this); + File f("029.obj"); + _eventData = f.readStream(f.size()); + // Set graphics mode initGraphics(320, 200, false); diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h index df53b784fc..1b99a85a4b 100644 --- a/engines/xeen/xeen.h +++ b/engines/xeen/xeen.h @@ -64,6 +64,11 @@ enum XeenDebugChannels { kDebugSound = 1 << 3 }; +enum Mode { + MODE_0 = 0, + MODE_9 = 9 +}; + struct XeenGameDescription; #define XEEN_SAVEGAME_VERSION 1 @@ -110,6 +115,9 @@ public: EventsManager *_events; Screen *_screen; SoundManager *_sound; + Mode _mode; + GameEvent _gameEvent; + Common::SeekableReadStream *_eventData; public: XeenEngine(OSystem *syst, const XeenGameDescription *gameDesc); virtual ~XeenEngine(); |