aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/menu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/parallaction/menu.cpp')
-rw-r--r--engines/parallaction/menu.cpp427
1 files changed, 427 insertions, 0 deletions
diff --git a/engines/parallaction/menu.cpp b/engines/parallaction/menu.cpp
new file mode 100644
index 0000000000..d4a910e809
--- /dev/null
+++ b/engines/parallaction/menu.cpp
@@ -0,0 +1,427 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2006 The ScummVM project
+ *
+ * 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 "parallaction/menu.h"
+#include "parallaction/disk.h"
+#include "parallaction/music.h"
+#include "parallaction/inventory.h"
+#include "parallaction/graphics.h"
+#include "parallaction/parallaction.h"
+
+
+namespace Parallaction {
+
+const char *introMsg1[] = {
+ "INSERISCI IL CODICE",
+ "ENTREZ CODE",
+ "ENTER CODE",
+ "GIB DEN KODE EIN"
+};
+
+const char *introMsg2[] = {
+ "CODICE ERRATO",
+ "CODE ERRONE",
+ "WRONG CODE",
+ "GIB DEN KODE EIN"
+};
+
+const char *introMsg3[] = {
+ "PRESS LEFT MOUSE BUTTON",
+ "TO SEE INTRO",
+ "PRESS RIGHT MOUSE BUTTON",
+ "TO START"
+};
+
+const char *newGameMsg[] = {
+ "NUOVO GIOCO",
+ "NEUF JEU",
+ "NEW GAME",
+ "NEUES SPIEL"
+};
+
+const char *loadGameMsg[] = {
+ "GIOCO SALVATO",
+ "JEU SAUVE'",
+ "SAVED GAME",
+ "SPIEL GESPEICHERT"
+};
+
+
+#define BLOCK_WIDTH 16
+#define BLOCK_HEIGHT 24
+
+#define BLOCK_X 112
+#define BLOCK_Y 130
+
+#define BLOCK_SELECTION_X (BLOCK_X-1)
+#define BLOCK_SELECTION_Y (BLOCK_Y-1)
+
+#define BLOCK_X_OFFSET (BLOCK_WIDTH+1)
+#define BLOCK_Y_OFFSET 9
+
+// destination slots for code blocks
+//
+#define SLOT_X 61
+#define SLOT_Y 64
+#define SLOT_WIDTH (BLOCK_WIDTH+2)
+
+
+static uint16 _dinoKey[] = { 5, 3, 6, 1, 4, 7 }; //
+static uint16 _donnaKey[] = { 0, 2, 8, 5, 5, 1 };
+static uint16 _doughKey[] = { 1, 7 ,7, 2, 2, 6 };
+
+
+Menu::Menu(Parallaction *engine) {
+ _engine = engine;
+}
+
+Menu::~Menu() {
+ //
+}
+
+
+void Menu::start() {
+
+ openArchive("disk1");
+ _vm->_graphics->_proportionalFont = false;
+
+ _vm->_graphics->loadExternalCnv("slidecnv", &Graphics::_font);
+
+ _vm->_graphics->Graphics::loadBackground("intro.slide", Graphics::kBitBack);
+ _vm->_graphics->palUnk0(_palette);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront);
+
+ g_system->delayMillis(2000);
+
+ _vm->_graphics->loadBackground("minintro.slide", Graphics::kBitBack);
+ _vm->_graphics->palUnk0(_palette);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront);
+
+ g_system->delayMillis(2000);
+
+ _vm->_graphics->loadBackground("lingua.slide", Graphics::kBitBack);
+ _vm->_graphics->palUnk0(_palette);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront);
+
+ _vm->_graphics->displayString(60, 30, "SELECT LANGUAGE");
+
+ _vm->_graphics->copyScreen(Graphics::kBitFront, Graphics::kBitBack);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBit2);
+ _language = chooseLanguage();
+
+ switch (_language) {
+ case 0:
+ strcpy(_engine->_languageDir, "it/");
+ break;
+
+ case 1:
+ strcpy(_engine->_languageDir, "fr/");
+ break;
+
+ case 2:
+ strcpy(_engine->_languageDir, "en/");
+ break;
+
+ case 3:
+ strcpy(_engine->_languageDir, "ge/");
+ break;
+ }
+
+ _vm->_graphics->loadBackground("restore.slide", Graphics::kBitBack);
+ _vm->_graphics->palUnk0(_palette);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront);
+
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBit2);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBit3);
+
+ if (selectGame() == 0) {
+ newGame();
+ }
+
+ closeArchive();
+
+ return;
+}
+
+void Menu::newGame() {
+// printf("newGame()\n");
+
+ const char **v14 = introMsg3;
+
+ _vm->_graphics->loadBackground("test.dyn", Graphics::kBitBack);
+ _vm->_graphics->palUnk0(_palette);
+ _vm->_graphics->swapBuffers();
+
+ uint16 _ax = (SCREEN_WIDTH - _vm->_graphics->getStringWidth(v14[0])) / 2;
+ _vm->_graphics->displayString(_ax, 50, v14[0]);
+
+ _ax = (SCREEN_WIDTH - _vm->_graphics->getStringWidth(v14[1])) / 2;
+ _vm->_graphics->displayString(_ax, 70, v14[1]);
+
+ _ax = (SCREEN_WIDTH - _vm->_graphics->getStringWidth(v14[2])) / 2;
+ _vm->_graphics->displayString(_ax, 100, v14[2]);
+
+ _ax = (SCREEN_WIDTH - _vm->_graphics->getStringWidth(v14[3])) / 2;
+ _vm->_graphics->displayString(_ax, 120, v14[3]);
+
+ _vm->_graphics->copyScreen(Graphics::kBitFront, Graphics::kBitBack);
+
+
+ _mouseButtons = kMouseNone;
+
+ for (; _mouseButtons != kMouseLeftUp; ) {
+ _vm->updateInput();
+ if (_mouseButtons == kMouseRightUp) break;
+ }
+
+ if (_mouseButtons != kMouseRightUp) return; // show intro
+
+ _vm->_graphics->freeCnv(&Graphics::_font);
+ closeArchive();
+
+ selectCharacter();
+
+ char *v4 = strchr(_location, '.') + 1;
+ strcpy(_engine->_characterName, v4);
+
+ return; // start game
+}
+
+uint16 Menu::chooseLanguage() {
+
+ _engine->changeCursor(kCursorArrow);
+
+ do {
+ _engine->updateInput();
+ _vm->_graphics->swapBuffers();
+
+ uint16 _di = _mousePos._x;
+ uint16 v2 = _mousePos._y;
+
+ if (_mouseButtons == kMouseLeftUp) {
+ for (uint16 _si = 0; _si < 4; _si++) {
+
+ if (80 + _si*49 >= _di) continue;
+ if (110 - _si*25 >= v2) continue;
+
+ if (128 + _si*49 <= _di) continue;
+ if (180 - _si*25 <= v2) continue;
+
+ beep();
+ return _si;
+ }
+ }
+
+ _engine->waitTime( 1 );
+
+ } while (true);
+
+ // never reached !!!
+ return 0;
+}
+
+
+
+uint16 Menu::selectGame() {
+// printf("selectGame()\n");
+
+ uint16 _si = 0;
+ uint16 _di = 3;
+
+ _engine->updateInput();
+ while (_mouseButtons != kMouseLeftUp) {
+
+ _engine->updateInput();
+ _vm->_graphics->swapBuffers();
+ _engine->waitTime( 1 );
+
+ _si = 0;
+ if (_mousePos._x > 160)
+ _si = 1;
+
+ if (_si == _di) continue;
+
+ _di = _si;
+ _vm->_graphics->copyScreen(Graphics::kBit3, Graphics::kBitFront);
+
+ if (_si != 0) {
+ // load a game
+ _vm->_graphics->displayString(60, 30, loadGameMsg[_language]);
+ } else {
+ // new game
+ _vm->_graphics->displayString(60, 30, newGameMsg[_language]);
+ }
+
+ _vm->_graphics->copyScreen(Graphics::kBitFront, Graphics::kBit2);
+ _vm->_graphics->copyScreen(Graphics::kBitFront, Graphics::kBitBack);
+
+ }
+
+ if (_si == 0) return 0; // new game
+
+ // load game
+ _vm->_graphics->freeCnv(&Graphics::_font);
+
+ strcpy(_location, "fogne");
+ strcpy(_engine->_characterName, "dough");
+
+// loadGame();
+ closeArchive();
+
+ return 1; // load game
+}
+
+
+//
+// character selection and protection
+//
+void Menu::selectCharacter() {
+
+ uint16 _di = 0;
+ bool askPassword = true;
+
+ uint16 _donna_points = 0;
+ uint16 _dino_points = 0;
+ uint16 _dough_points = 0;
+
+
+ StaticCnv v14;
+
+ v14._data0 = (byte*)memAlloc(33);
+ v14._data2 = v14._data0;
+ v14._width = BLOCK_WIDTH;
+ v14._height = BLOCK_HEIGHT;
+
+ _engine->changeCursor(kCursorArrow);
+ stopMusic();
+ _vm->_graphics->_proportionalFont = false;
+
+ _vm->_graphics->loadExternalCnv("slidecnv", &Graphics::_font);
+ openArchive("disk1");
+
+ _vm->_graphics->loadBackground("password.slide", Graphics::kBitBack);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBit2);
+ _vm->_graphics->palUnk0(_palette);
+
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBitFront);
+ _vm->_graphics->copyScreen(Graphics::kBitBack, Graphics::kBit3);
+
+ while (askPassword == true) {
+
+ askPassword = false;
+ _di = 0;
+ _vm->_graphics->displayString(60, 30, introMsg1[_language]);
+ _vm->_graphics->copyScreen(Graphics::kBitFront, Graphics::kBit2);
+ _vm->_graphics->copyScreen(Graphics::kBitFront, Graphics::kBitBack);
+ _mouseButtons = kMouseNone;
+
+ while (_di < 6) {
+ do {
+ _engine->updateInput();
+ //job_eraseMouse();
+ //job_drawMouse();
+ _vm->_graphics->swapBuffers();
+ _engine->waitTime(1);
+
+ } while (_mouseButtons != kMouseLeftUp);
+
+
+ _mouseButtons = kMouseNone;
+ uint16 x = _mousePos._x;
+ uint16 y = _mousePos._y;
+
+ uint16 _si = 0;
+
+ while (_si < 9) {
+
+ if ((_si * BLOCK_X_OFFSET + BLOCK_SELECTION_X < x) &&
+ ((_si + 1) * BLOCK_X_OFFSET + BLOCK_SELECTION_X > x) &&
+ (BLOCK_SELECTION_Y - _si * BLOCK_Y_OFFSET < y) &&
+ (BLOCK_SELECTION_Y + BLOCK_HEIGHT - _si * BLOCK_Y_OFFSET > y)) {
+
+ _vm->_graphics->backupCnvBackground(&v14, _si * BLOCK_X_OFFSET + BLOCK_X, BLOCK_Y - _si * BLOCK_Y_OFFSET);
+
+ _vm->_graphics->flatBlitCnv(&v14, _di * SLOT_WIDTH + SLOT_X, SLOT_Y, Graphics::kBitBack, 0);
+ _vm->_graphics->flatBlitCnv(&v14, _di * SLOT_WIDTH + SLOT_X, SLOT_Y, Graphics::kBitFront, 0);
+ _vm->_graphics->flatBlitCnv(&v14, _di * SLOT_WIDTH + SLOT_X, SLOT_Y, Graphics::kBit2, 0);
+
+ beep();
+
+ if (_dinoKey[_di] == _si) {
+ _dino_points++; // dino
+ } else
+ if (_donnaKey[_di] == _si) {
+ _donna_points++; // donna
+ } else
+ if (_doughKey[_di] == _si) {
+ _dough_points++; // dough
+ } else
+ askPassword = true;
+
+ _di++;
+ }
+
+ _si++;
+
+ }
+ }
+
+ if (askPassword == false) continue;
+
+ _vm->_graphics->copyScreen(Graphics::kBit3, Graphics::kBitFront);
+ _vm->_graphics->displayString(60, 30, introMsg1[_language]);
+
+ g_system->delayMillis(2000);
+
+ _vm->_graphics->copyScreen(Graphics::kBit3, Graphics::kBitFront);
+ }
+
+
+ strcpy(_location, "test");
+ if (_dino_points > _donna_points && _dino_points > _dough_points) {
+ strcat(_location, ".dino");
+ } else {
+ if (_donna_points > _dino_points && _donna_points > _dough_points) {
+ strcat(_location, ".donna");
+ } else {
+ strcat(_location, ".dough");
+ }
+ }
+
+ byte palette[PALETTE_SIZE];
+ _vm->_graphics->getBlackPalette(palette);
+ _vm->_graphics->setPalette(palette);
+
+ _engineFlags |= kEngineChangeLocation;
+ closeArchive();
+
+ memFree(v14._data0);
+ _vm->_graphics->freeCnv(&Graphics::_font);
+
+ refreshInventory(_vm->_characterName);
+
+ return;
+
+}
+
+
+} // namespace Parallaction