diff options
author | Nicola Mettifogo | 2008-02-02 12:36:06 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2008-02-02 12:36:06 +0000 |
commit | 9f3ecd64092f5765c0b9952b10ddc223858ac7eb (patch) | |
tree | 9e4da00b8e4dde90cd29fc95e5c1f8640827f1b3 /engines/parallaction | |
parent | 33a534b76ca54b6230c851850fd431d345f383ca (diff) | |
download | scummvm-rg350-9f3ecd64092f5765c0b9952b10ddc223858ac7eb.tar.gz scummvm-rg350-9f3ecd64092f5765c0b9952b10ddc223858ac7eb.tar.bz2 scummvm-rg350-9f3ecd64092f5765c0b9952b10ddc223858ac7eb.zip |
Cleanup of BRA menu code.
svn-id: r30739
Diffstat (limited to 'engines/parallaction')
-rw-r--r-- | engines/parallaction/graphics.h | 32 | ||||
-rw-r--r-- | engines/parallaction/gui_br.cpp | 198 | ||||
-rw-r--r-- | engines/parallaction/parallaction.h | 11 | ||||
-rw-r--r-- | engines/parallaction/parallaction_br.cpp | 210 |
4 files changed, 238 insertions, 213 deletions
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h index 5543831702..27598c2415 100644 --- a/engines/parallaction/graphics.h +++ b/engines/parallaction/graphics.h @@ -110,8 +110,40 @@ public: r.setWidth(_surf->w); r.setHeight(_surf->h); } +}; + +/* + this adapter can handle Surfaces containing multiple frames, + provided all these frames are the same width and height +*/ +struct SurfaceToMultiFrames : public Frames { + + uint _num; + uint _width, _height; + Graphics::Surface *_surf; + SurfaceToMultiFrames(uint num, uint w, uint h, Graphics::Surface *surf) : _num(num), _width(w), _height(h), _surf(surf) { + + } + + ~SurfaceToMultiFrames() { + delete _surf; + } + uint16 getNum() { + return _num; + } + byte* getData(uint16 index) { + assert(index < _num); + return (byte*)_surf->getBasePtr(0, _height * index); + } + void getRect(uint16 index, Common::Rect &r) { + assert(index < _num); + r.left = 0; + r.top = 0; + r.setWidth(_width); + r.setHeight(_height); + } }; struct MaskBuffer { diff --git a/engines/parallaction/gui_br.cpp b/engines/parallaction/gui_br.cpp new file mode 100644 index 0000000000..b3487548c7 --- /dev/null +++ b/engines/parallaction/gui_br.cpp @@ -0,0 +1,198 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "common/system.h" + +#include "parallaction/parallaction.h" + +namespace Parallaction { + +enum MenuOptions { + kMenuPart0 = 0, + kMenuPart1 = 1, + kMenuPart2 = 2, + kMenuPart3 = 3, + kMenuPart4 = 4, + kMenuLoadGame = 5, + kMenuQuit = 6 +}; + + +void Parallaction_br::guiStart() { + guiSplash("dyna"); + guiSplash("core"); + + // TODO: load progress value from special save game + _progress = 3; + + int option = guiShowMenu(); + switch (option) { + case kMenuQuit: + _engineFlags |= kEngineQuit; + break; + + case kMenuLoadGame: + warning("loadgame not yet implemented"); + break; + + default: + _part = option; + _disk->selectArchive(_partNames[_part]); + startPart(); + } + +} + +void Parallaction_br::guiSplash(const char *name) { + + _gfx->clearScreen(); + _gfx->setBackground(kBackgroundSlide, name, 0, 0); + _gfx->_backgroundInfo.x = (_screenWidth - _gfx->_backgroundInfo.width) >> 1; + _gfx->_backgroundInfo.y = (_screenHeight - _gfx->_backgroundInfo.height) >> 1; + _gfx->updateScreen(); + _system->delayMillis(600); + + Palette blackPal; + Palette pal(_gfx->_backgroundInfo.palette); + for (uint i = 0; i < 64; i++) { + pal.fadeTo(blackPal, 1); + _gfx->setPalette(pal); + _gfx->updateScreen(); + _system->delayMillis(20); + } + +} + +#define MENUITEMS_X 250 +#define MENUITEMS_Y 200 + +#define MENUITEM_WIDTH 190 +#define MENUITEM_HEIGHT 18 + +Frames* Parallaction_br::guiRenderMenuItem(const char *text) { + // this builds a surface containing two copies of the text. + // one is in normal color, the other is inverted. + // the two 'frames' are used to display selected/unselected menu items + + Graphics::Surface *surf = new Graphics::Surface; + surf->create(MENUITEM_WIDTH, MENUITEM_HEIGHT*2, 1); + + // build first frame to be displayed when item is not selected + _menuFont->setColor(0); + _menuFont->drawString((byte*)surf->getBasePtr(5, 2), MENUITEM_WIDTH, text); + + // build second frame to be displayed when item is selected + _menuFont->drawString((byte*)surf->getBasePtr(5, 2 + MENUITEM_HEIGHT), MENUITEM_WIDTH, text); + byte *s = (byte*)surf->getBasePtr(0, MENUITEM_HEIGHT); + for (int i = 0; i < surf->w * MENUITEM_HEIGHT; i++) { + *s++ ^= 0xD; + } + + // wrap the surface into the suitable Frames adapter + return new SurfaceToMultiFrames(2, MENUITEM_WIDTH, MENUITEM_HEIGHT, surf); +} + + +int Parallaction_br::guiShowMenu() { + // TODO: filter menu entries according to progress in game + + #define NUM_MENULINES 7 + Frames *_lines[NUM_MENULINES]; + + const char *menuStrings[NUM_MENULINES] = { + "SEE INTRO", + "NEW GAME", + "SAVED GAME", + "EXIT TO DOS", + "PART 2", + "PART 3", + "PART 4" + }; + + MenuOptions options[NUM_MENULINES] = { + kMenuPart0, + kMenuPart1, + kMenuLoadGame, + kMenuQuit, + kMenuPart2, + kMenuPart3, + kMenuPart4 + }; + + _gfx->clearScreen(); + _gfx->setBackground(kBackgroundSlide, "tbra", 0, 0); + _gfx->_backgroundInfo.x = 20; + _gfx->_backgroundInfo.y = 50; + + int availItems = 4 + _progress; + + // TODO: keep track of and destroy menu item frames/surfaces + + int i; + for (i = 0; i < availItems; i++) { + _lines[i] = guiRenderMenuItem(menuStrings[i]); + uint id = _gfx->setItem(_lines[i], MENUITEMS_X, MENUITEMS_Y + MENUITEM_HEIGHT * i, 0xFF); + _gfx->setItemFrame(id, 0); + } + + int selectedItem = -1; + + setMousePointer(0); + + while (true) { + + if ((_mouseButtons == kMouseLeftUp) && selectedItem >= 0) + break; + + readInput(); + + if ((_mousePos.x > MENUITEMS_X) && (_mousePos.x < (MENUITEMS_X+MENUITEM_WIDTH)) && (_mousePos.y > MENUITEMS_Y)) { + selectedItem = (_mousePos.y - MENUITEMS_Y) / MENUITEM_HEIGHT; + + if (!(selectedItem < availItems)) + selectedItem = -1; + } else + selectedItem = -1; + + for (int i = 0; i < availItems; i++) { + _gfx->setItemFrame(i, selectedItem == i ? 1 : 0); + } + + _gfx->updateScreen(); + _system->delayMillis(20); + } + + _system->showMouse(false); + _gfx->hideDialogueStuff(); + + for (i = 0; i < availItems; i++) { + delete _lines[i]; + } + + return options[selectedItem]; +} + +} // namespace Parallaction + diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index f68aa5a3bb..447eaffb35 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -906,13 +906,12 @@ private: Frames *_mouseArrow; - int showMenu(); - void renderMenuItem(Graphics::Surface &surf, const char *text); - void invertMenuItem(Graphics::Surface &surf); - Frames* renderMenuItem(const char *text); + static const char *_partNames[]; - - void splash(const char *name); + void guiStart(); + int guiShowMenu(); + void guiSplash(const char *name); + Frames* guiRenderMenuItem(const char *text); static const Callable _dosCallables[6]; diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 123a0f968e..f8ba6e7e07 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -31,17 +31,8 @@ namespace Parallaction { -enum MenuOptions { - kMenuPart0 = 0, - kMenuPart1 = 1, - kMenuPart2 = 2, - kMenuPart3 = 3, - kMenuPart4 = 4, - kMenuLoadGame = 5, - kMenuQuit = 6 -}; -const char *partNames[] = { +const char *Parallaction_br::_partNames[] = { "PART0", "PART1", "PART2", @@ -104,33 +95,12 @@ void Parallaction_br::callFunction(uint index, void* parm) { } int Parallaction_br::go() { - splash("dyna"); - splash("core"); - - // TODO: load progress value from special save game - _progress = 3; while ((_engineFlags & kEngineQuit) == 0) { -// initCharacter(); - - int option = showMenu(); - switch (option) { - case kMenuQuit: - _engineFlags |= kEngineQuit; - break; - - case kMenuLoadGame: - warning("loadgame not yet implemented"); - break; - - default: - _part = option; - _disk->selectArchive(partNames[_part]); - startPart(); - break; - } + guiStart(); +// initCharacter(); runGame(); @@ -143,180 +113,6 @@ int Parallaction_br::go() { return 0; } -void Parallaction_br::splash(const char *name) { - - _gfx->clearScreen(); - _gfx->setBackground(kBackgroundSlide, name, 0, 0); - _gfx->_backgroundInfo.x = (_screenWidth - _gfx->_backgroundInfo.width) >> 1; - _gfx->_backgroundInfo.y = (_screenHeight - _gfx->_backgroundInfo.height) >> 1; - _gfx->updateScreen(); - _system->delayMillis(600); - - Palette blackPal; - Palette pal(_gfx->_backgroundInfo.palette); - for (uint i = 0; i < 64; i++) { - pal.fadeTo(blackPal, 1); - _gfx->setPalette(pal); - _gfx->updateScreen(); - _system->delayMillis(20); - } - -} - -#define MENUITEMS_X 250 -#define MENUITEMS_Y 200 - -#define MENUITEM_WIDTH 190 -#define MENUITEM_HEIGHT 18 - -void Parallaction_br::renderMenuItem(Graphics::Surface &surf, const char *text) { - surf.create(MENUITEM_WIDTH, MENUITEM_HEIGHT, 1); - _menuFont->setColor(0); - _menuFont->drawString((byte*)surf.getBasePtr(5, 2), MENUITEM_WIDTH, text); -} - -void Parallaction_br::invertMenuItem(Graphics::Surface &surf) { - for (int i = 0; i < surf.w * surf.h; i++) - ((byte*)surf.pixels)[i] ^= 0xD; -} - -/* - this adapter can handle Surfaces containing multiple frames, - provided all these frames are the same width and height -*/ -struct SurfaceToMultiFrames : public Frames { - - uint _num; - uint _width, _height; - Graphics::Surface *_surf; - - SurfaceToMultiFrames(uint num, uint w, uint h, Graphics::Surface *surf) : _num(num), _width(w), _height(h), _surf(surf) { - - } - - ~SurfaceToMultiFrames() { - delete _surf; - } - - uint16 getNum() { - return _num; - } - byte* getData(uint16 index) { - assert(index < _num); - return (byte*)_surf->getBasePtr(0, _height * index); - } - void getRect(uint16 index, Common::Rect &r) { - assert(index < _num); - r.left = 0; - r.top = 0; - r.setWidth(_width); - r.setHeight(_height); - } - -}; - -Frames* Parallaction_br::renderMenuItem(const char *text) { - // this builds a surface containing two copies of the text. - // one is in normal color, the other is inverted. - // the two 'frames' are used to display selected/unselected menu items - - Graphics::Surface *surf = new Graphics::Surface; - surf->create(MENUITEM_WIDTH, MENUITEM_HEIGHT*2, 1); - - // build first frame to be displayed when item is not selected - _menuFont->setColor(0); - _menuFont->drawString((byte*)surf->getBasePtr(5, 2), MENUITEM_WIDTH, text); - - // build second frame to be displayed when item is selected - _menuFont->drawString((byte*)surf->getBasePtr(5, 2 + MENUITEM_HEIGHT), MENUITEM_WIDTH, text); - byte *s = (byte*)surf->getBasePtr(0, MENUITEM_HEIGHT); - for (int i = 0; i < surf->w * MENUITEM_HEIGHT; i++) { - *s++ ^= 0xD; - } - - // wrap the surface into the suitable Frames adapter - return new SurfaceToMultiFrames(2, MENUITEM_WIDTH, MENUITEM_HEIGHT, surf); -} - - -int Parallaction_br::showMenu() { - // TODO: filter menu entries according to progress in game - - #define NUM_MENULINES 7 - Frames *_lines[NUM_MENULINES]; - - const char *menuStrings[NUM_MENULINES] = { - "SEE INTRO", - "NEW GAME", - "SAVED GAME", - "EXIT TO DOS", - "PART 2", - "PART 3", - "PART 4" - }; - - MenuOptions options[NUM_MENULINES] = { - kMenuPart0, - kMenuPart1, - kMenuLoadGame, - kMenuQuit, - kMenuPart2, - kMenuPart3, - kMenuPart4 - }; - - _gfx->clearScreen(); - _gfx->setBackground(kBackgroundSlide, "tbra", 0, 0); - _gfx->_backgroundInfo.x = 20; - _gfx->_backgroundInfo.y = 50; - - int availItems = 4 + _progress; - - // TODO: keep track of and destroy menu item frames/surfaces - - int i; - for (i = 0; i < availItems; i++) { - _lines[i] = renderMenuItem(menuStrings[i]); - uint id = _gfx->setItem(_lines[i], MENUITEMS_X, MENUITEMS_Y + MENUITEM_HEIGHT * i, 0xFF); - _gfx->setItemFrame(id, 0); - } - - int selectedItem = -1; - - setMousePointer(0); - - while (true) { - - if ((_mouseButtons == kMouseLeftUp) && selectedItem >= 0) - break; - - readInput(); - - if ((_mousePos.x > MENUITEMS_X) && (_mousePos.x < (MENUITEMS_X+MENUITEM_WIDTH)) && (_mousePos.y > MENUITEMS_Y)) { - selectedItem = (_mousePos.y - MENUITEMS_Y) / MENUITEM_HEIGHT; - - if (!(selectedItem < availItems)) - selectedItem = -1; - } else - selectedItem = -1; - - for (int i = 0; i < availItems; i++) { - _gfx->setItemFrame(i, selectedItem == i ? 1 : 0); - } - - _gfx->updateScreen(); - _system->delayMillis(20); - } - - _system->showMouse(false); - _gfx->hideDialogueStuff(); - - for (i = 0; i < availItems; i++) { - delete _lines[i]; - } - - return options[selectedItem]; -} void Parallaction_br::initFonts() { |