aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
authorNicola Mettifogo2008-02-02 12:36:06 +0000
committerNicola Mettifogo2008-02-02 12:36:06 +0000
commit9f3ecd64092f5765c0b9952b10ddc223858ac7eb (patch)
tree9e4da00b8e4dde90cd29fc95e5c1f8640827f1b3 /engines/parallaction
parent33a534b76ca54b6230c851850fd431d345f383ca (diff)
downloadscummvm-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.h32
-rw-r--r--engines/parallaction/gui_br.cpp198
-rw-r--r--engines/parallaction/parallaction.h11
-rw-r--r--engines/parallaction/parallaction_br.cpp210
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() {