/* 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. * */ #include "common/config-manager.h" #include "common/random.h" #include "graphics/thumbnail.h" #include "hdb/hdb.h" #include "hdb/ai.h" #include "hdb/gfx.h" #include "hdb/input.h" #include "hdb/lua-script.h" #include "hdb/sound.h" #include "hdb/menu.h" #include "hdb/map.h" #include "hdb/mpc.h" namespace HDB { Menu::Menu() { if (g_hdb->isPPC()) { _menuX = 18 * 8; _menuY = 16; _menuItemWidth = 88; _menuItemHeight = 40; _mResumeY = 48 * 4; _mQuitY = 48 * 3; _mOptionsY = 48 * 2; _mLoadY = 48 * 1; _mControlsY = 160; _menuExitXLeft = 60; _menuExitY = (g_hdb->_screenHeight - 80); _menuExitYTop = 48; _menuVortSaveY = 220; _menuVortSaveX = 76; _mRocketX = 0; _mRocketY = 10; _mRocketYBottom = 21 * 8; _mRocketEXHX = 0; _mRocketEXHX2 = 0; _mTitleY = 27 * 8; _oohOhhX = 88; _oohOhhY = 128; _newGameX = 20; _newGameX2 = _newGameX + 50; _modePuzzleY = 70; _modeActionY = 160; _optionsX = 2 * 8; _optionsY = 6 * 8; _vortSaveX = 80; _vortSaveTextX = _vortSaveX + 40; _vortSaveY = 220; _saveSlotX = 8; _saveSlotY = 68; _quitX = 0; _quitY = 0; _quitNoX1 = (146 - 16); _quitNoX2 = (211 - 16); _quitNoY1 = (287); _quitNoY2 = (312); _quitYesX1 = (65 - 16); _quitYesX2 = (130 - 16); _quitYesY1 = (287); _quitYesY2 = (312); _controlX = 0; _controlY = 0; _controlUpX = 0; _controlUpY = 0; _controlDownX = 0; _controlDownY = 0; _controlLeftX = 0; _controlLeftY = 0; _controlRightX = 0; _controlRightY = 0; _controlUseX = 0; _controlUseY = 0; _controlWidth = 0; _controlHeight = 0; _assignX = 0; _assignY = 0; _backoutX = 0; _backoutY = 0; _warpX = 0; _warpY = 4; } else { _menuX = 48 * 8; _menuY = 80; _menuItemWidth = 88; _menuItemHeight = 40; _mResumeY = 48 * 4; _mQuitY = 48 * 3; _mOptionsY = 48 * 2; _mLoadY = 48 * 1; _mControlsY = 270; _menuExitXLeft = 60; _menuExitY = (g_hdb->_screenHeight - 80); _menuExitYTop = 48; _menuVortSaveY = 220; _menuVortSaveX = 76; _mRocketX = 18 * 8; _mRocketY = 48; _mRocketYBottom = 28 * 8; _mRocketEXHX = 6 * 8 - 4; _mRocketEXHX2 = 11 * 8 - 4; _mTitleY = 34 * 8; _oohOhhX = 256; _oohOhhY = 224; _newGameX = 220; _newGameX2 = _newGameX + 50; _modePuzzleY = 130; _modeActionY = 220; _optionsX = 26 * 8; _optionsY = 10 * 8; _vortSaveX = (200 - 44); _vortSaveTextX = _vortSaveX + 40; _vortSaveY = 72; _saveSlotX = 200; _saveSlotY = 80; _quitX = 0; _quitY = 0; _quitYesX1 = (30 * 8 + _quitX); _quitYesX2 = (38 * 8 + 4 + _quitX); _quitYesY1 = (50 * 8 + _quitY); _quitYesY2 = (53 * 8 + 4 + _quitY); _quitNoX1 = (41 * 8 + _quitX); _quitNoX2 = (49 * 8 + 4 + _quitX); _quitNoY1 = (50 * 8 + _quitY); _quitNoY2 = (53 * 8 + 4 + _quitY); _controlX = 60; _controlY = 40; _controlUpX = (276 + _controlX); _controlUpY = (114 + _controlY); _controlDownX = (276 + _controlX); _controlDownY = (129 + _controlY); _controlLeftX = (396 + _controlX); _controlLeftY = (114 + _controlY); _controlRightX = (396 + _controlX); _controlRightY = (129 + _controlY); _controlUseX = (330 + _controlX); _controlUseY = (209 + _controlY); _controlWidth = 32; _controlHeight = 16; _assignX = (_controlX + 20 * 8); _assignY = (_controlY + 150); _backoutX = 0; _backoutY = g_hdb->_screenHeight - 32; _warpBackoutX = _backoutX; _warpBackoutY = _backoutY; _warpX = 214; _warpY = 160; } _starWarp = 0; _rocketEx = 0; _titleActive = false; _menuActive = false; _optionsActive = false; _gamefilesActive = false; _newgameActive = false; _warpActive = false; _optionsScrolling = false; _optionsScrollX = _menuX; _rocketX = _mRocketX; _sayHDB = false; _menuKey = 0; _nextScreen = 0; _nebulaY = 0; // Used as a flag _fStars[0].y = 0; // Used as a flag _keyAssignUp = Common::KEYCODE_UP; _keyAssignDown = Common::KEYCODE_DOWN; _keyAssignLeft = Common::KEYCODE_LEFT; _keyAssignRight = Common::KEYCODE_RIGHT; _keyAssignUse = Common::KEYCODE_RETURN; _gCheckEmpty = NULL; _gCheckOff = NULL; _gCheckOn = NULL; _gCheckLeft = NULL; _gCheckRight = NULL; _contArrowUp = NULL; _contArrowDown = NULL; _contArrowLeft = NULL; _contArrowRight = NULL; _contAssign = NULL; _warpPlaque = NULL; _hdbLogoScreen = NULL; _titleScreen = NULL; _oohOohGfx = NULL; _newGfx = NULL; _loadGfx = NULL; _optionsGfx = NULL; _quitGfx = NULL; _resumeGfx = NULL; _slotGfx = NULL; _rocketMain = NULL; _rocketSecond = NULL; _rocketEx1 = NULL; _rocketEx2 = NULL; _titleLogo = NULL; _hdbLogoScreen = NULL; for (int i = 0; i < kNebulaCount; i++) _nebulaGfx[i] = NULL; _sliderLeft = NULL; _sliderMid = NULL; _sliderRight = NULL; _sliderKnob = NULL; _modePuzzleGfx = NULL; _modeActionGfx = NULL; _modeLoadGfx = NULL; _modeSaveGfx = NULL; _menuBackoutGfx = NULL; _menuBackspaceGfx = NULL; _controlButtonGfx = NULL; _controlsGfx = NULL; _screenshots1gfx = NULL; _screenshots1agfx = NULL; _screenshots2gfx = NULL; _demoPlaqueGfx = NULL; _vortexian[0] = _vortexian[1] = _vortexian[2] = NULL; _star[0] = _star[1] = _star[2] = NULL; // secret stars _starRedGfx[0] = _starRedGfx[1] = NULL; _starGreenGfx[0] = _starGreenGfx[1] = NULL; _starBlueGfx[0] = _starBlueGfx[1] = NULL; _versionGfx = NULL; _warpGfx = NULL; _warpBackoutX = 0; _warpBackoutY = 0; _titleCycle = 0; _titleDelay = 0; _resumeSong = SONG_NONE; _rocketY = 0; _rocketYVel = 0; _nebulaX = 0; _nebulaYVel = 0; _nebulaWhich = 0; _quitScreen = nullptr; _quitTimer = 0; _handangoGfx = nullptr; _clickDelay = 0; _saveSlot = 0; _quitActive = 0; _optionsXV = 0; _oBannerY = 0; _introSong = SONG_NONE; _titleSong = SONG_NONE; } Menu::~Menu() { freeMenu(); delete _gCheckEmpty; delete _gCheckOff; delete _gCheckOn; delete _gCheckLeft; delete _gCheckRight; delete _contArrowUp; delete _contArrowDown; delete _contArrowLeft; delete _contArrowRight; delete _contAssign; delete _warpPlaque; delete _hdbLogoScreen; } bool Menu::init() { if (g_hdb->isPPC()) { if (g_hdb->isDemo()) { _hdbLogoScreen = g_hdb->_gfx->loadPic(DEMOTITLESCREEN); if (g_hdb->isHandango()) _handangoGfx = g_hdb->_gfx->loadPic(PIC_HANDANGO); } else _hdbLogoScreen = g_hdb->_gfx->loadPic(TITLESCREEN); } else { _gCheckEmpty = g_hdb->_gfx->loadPic(G_CHECK_EMPTY); _gCheckOff = g_hdb->_gfx->loadPic(G_CHECK_OFF); _gCheckOn = g_hdb->_gfx->loadPic(G_CHECK_ON); _gCheckLeft = g_hdb->_gfx->loadPic(G_CHECK_LEFT); _gCheckRight = g_hdb->_gfx->loadPic(G_CHECK_RIGHT); _contArrowUp = g_hdb->_gfx->loadPic(CTRL_ARROWUP); _contArrowDown = g_hdb->_gfx->loadPic(CTRL_ARROWDN); _contArrowLeft = g_hdb->_gfx->loadPic(CTRL_ARROWLEFT); _contArrowRight = g_hdb->_gfx->loadPic(CTRL_ARROWRIGHT); _contAssign = g_hdb->_gfx->loadPic(CTRL_ASSIGN); _warpPlaque = g_hdb->_gfx->loadPic(WARP_PLAQUE); _hdbLogoScreen = g_hdb->_gfx->loadPic(TITLESCREEN); } return true; } void Menu::readConfig() { bool needFlush = false; if (ConfMan.hasKey(CONFIG_MSTONE7)) { g_hdb->setStarsMonkeystone7(ConfMan.getInt(CONFIG_MSTONE7)); } else { ConfMan.setInt(CONFIG_MSTONE7, STARS_MONKEYSTONE_7_FAKE); needFlush = true; } if (ConfMan.hasKey(CONFIG_MSTONE14)) { g_hdb->setStarsMonkeystone14(ConfMan.getInt(CONFIG_MSTONE14)); } else { ConfMan.setInt(CONFIG_MSTONE14, STARS_MONKEYSTONE_14_FAKE); needFlush = true; } if (ConfMan.hasKey(CONFIG_MSTONE21)) { g_hdb->setStarsMonkeystone21(ConfMan.getInt(CONFIG_MSTONE21)); } else { ConfMan.setInt(CONFIG_MSTONE21, STARS_MONKEYSTONE_21_FAKE); needFlush = true; } if (ConfMan.hasKey(CONFIG_KEY_UP)) { _keyAssignUp = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_UP); g_hdb->_input->assignKey(0, _keyAssignUp); } else { ConfMan.setInt(CONFIG_KEY_UP, _keyAssignUp); needFlush = true; } if (ConfMan.hasKey(CONFIG_KEY_DOWN)) { _keyAssignDown = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_DOWN); g_hdb->_input->assignKey(1, _keyAssignDown); } else { ConfMan.setInt(CONFIG_KEY_DOWN, _keyAssignDown); needFlush = true; } if (ConfMan.hasKey(CONFIG_KEY_LEFT)) { _keyAssignLeft = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_LEFT); g_hdb->_input->assignKey(2, _keyAssignLeft); } else { ConfMan.setInt(CONFIG_KEY_LEFT, _keyAssignLeft); needFlush = true; } if (ConfMan.hasKey(CONFIG_KEY_RIGHT)) { _keyAssignRight = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_RIGHT); g_hdb->_input->assignKey(3, _keyAssignRight); } else { ConfMan.setInt(CONFIG_KEY_RIGHT, _keyAssignRight); needFlush = true; } if (ConfMan.hasKey(CONFIG_KEY_USE)) { _keyAssignUse = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_USE); g_hdb->_input->assignKey(4, _keyAssignUse); } else { ConfMan.setInt(CONFIG_KEY_USE, _keyAssignUse); needFlush = true; } if (ConfMan.hasKey(CONFIG_CHEAT)) { g_hdb->setCheatingOn(); debug("Cheating enabled"); } if (needFlush) ConfMan.flushToDisk(); } void Menu::writeConfig() { int value; value = g_hdb->getStarsMonkeystone7(); ConfMan.setInt(CONFIG_MSTONE7, value); value = g_hdb->getStarsMonkeystone14(); ConfMan.setInt(CONFIG_MSTONE14, value); value = g_hdb->getStarsMonkeystone21(); ConfMan.setInt(CONFIG_MSTONE21, value); ConfMan.setInt(CONFIG_KEY_UP, _keyAssignUp); ConfMan.setInt(CONFIG_KEY_DOWN, _keyAssignDown); ConfMan.setInt(CONFIG_KEY_LEFT, _keyAssignLeft); ConfMan.setInt(CONFIG_KEY_RIGHT, _keyAssignRight); ConfMan.setInt(CONFIG_KEY_USE, _keyAssignUse); if (g_hdb->getCheatingOn()) ConfMan.set(CONFIG_CHEAT, "1"); ConfMan.flushToDisk(); } static const char nebulaNames[kNebulaCount][32] = { BACKSCROLL_PLANET1, BACKSCROLL_PLANET2, BACKSCROLL_PLANET3, BACKSCROLL_PLANET4, BACKSCROLL_PLANET5, BACKSCROLL_GALAXY1, BACKSCROLL_GALAXY2 }; void Menu::startMenu() { // stuff that gets loaded-in at Title Screen if (!_titleLogo) { _titleLogo = g_hdb->_gfx->loadPic(TITLELOGO); for (int i = 0; i < kNebulaCount; i++) _nebulaGfx[i] = g_hdb->_gfx->loadPic(nebulaNames[i]); _rocketMain = g_hdb->_gfx->loadPic(MENU_ROCKETSHIP1); _rocketSecond = g_hdb->_gfx->loadPic(MENU_ROCKETSHIP2); _rocketEx1 = g_hdb->_gfx->loadPic(MENU_EXHAUST1); _rocketEx2 = g_hdb->_gfx->loadPic(MENU_EXHAUST2); } // // menu-only stuff // _newGfx = g_hdb->_gfx->loadPic(MENU_NEWGAME); _loadGfx = g_hdb->_gfx->loadPic(MENU_LOADGAME); _optionsGfx = g_hdb->_gfx->loadPic(MENU_OPTIONS); _quitGfx = g_hdb->_gfx->loadPic(MENU_QUIT); _resumeGfx = g_hdb->_gfx->loadPic(MENU_RESUME); _slotGfx = g_hdb->_gfx->loadPic(GAMEFILE_SLOT); _menuBackspaceGfx = g_hdb->_gfx->loadPic(MENU_BACKSPACE); _menuBackoutGfx = g_hdb->_gfx->loadPic(MENU_BACK); if (g_hdb->isPPC()) { _warpBackoutX = (g_hdb->_screenWidth - _menuBackoutGfx->_width); _warpBackoutY = (g_hdb->_screenHeight - _menuBackoutGfx->_height); } _controlButtonGfx = g_hdb->_gfx->loadPic(MENU_CONTROLS); _controlsGfx = g_hdb->_gfx->loadPic(PIC_CONTROLSSCREEN); if (g_hdb->isDemo()) { if (!g_hdb->isPPC()) { _screenshots1gfx = g_hdb->_gfx->loadPic(PIC_DEMOSCREEN); _screenshots1agfx = g_hdb->_gfx->loadPic(PIC_DEMOSCREEN2); _screenshots2gfx = g_hdb->_gfx->loadPic(PIC_DEMO_BUY); _demoPlaqueGfx = g_hdb->_gfx->loadPic(PIC_DEMO); } else { _screenshots1agfx = g_hdb->_gfx->loadPic("pic_demoscreenshots"); _screenshots1gfx = g_hdb->_gfx->loadPic("pic_demoscreenshots2"); _screenshots2gfx = NULL; _demoPlaqueGfx = NULL; } } _vortexian[0] = g_hdb->_gfx->loadTile(GROUP_ENT_VORTEXIAN_STANDDOWN"01"); _vortexian[1] = g_hdb->_gfx->loadTile(GROUP_ENT_VORTEXIAN_STANDDOWN"02"); _vortexian[2] = g_hdb->_gfx->loadTile(GROUP_ENT_VORTEXIAN_STANDDOWN"03"); _modeLoadGfx = g_hdb->_gfx->loadPic(MENU_LOAD); _modeSaveGfx = g_hdb->_gfx->loadPic(MENU_SAVE); _modePuzzleGfx = g_hdb->_gfx->loadPic(MODE_PUZZLE); _modeActionGfx = g_hdb->_gfx->loadPic(MODE_ACTION); _sliderLeft = g_hdb->_gfx->loadPic(MENU_SLIDER_LEFT); _sliderMid = g_hdb->_gfx->loadPic(MENU_SLIDER_MID); _sliderRight = g_hdb->_gfx->loadPic(MENU_SLIDER_RIGHT); _sliderKnob = g_hdb->_gfx->loadPic(MENU_SLIDER_KNOB); _starRedGfx[0] = g_hdb->_gfx->loadPic(SECRETSTAR_RED1); _starRedGfx[1] = g_hdb->_gfx->loadPic(SECRETSTAR_RED2); _starGreenGfx[0] = g_hdb->_gfx->loadPic(SECRETSTAR_GREEN1); _starGreenGfx[1] = g_hdb->_gfx->loadPic(SECRETSTAR_GREEN2); _starBlueGfx[0] = g_hdb->_gfx->loadPic(SECRETSTAR_BLUE1); _starBlueGfx[1] = g_hdb->_gfx->loadPic(SECRETSTAR_BLUE2); // setup menu falling stars _star[0] = g_hdb->_gfx->loadPic(STAR_1); _star[1] = g_hdb->_gfx->loadPic(STAR_2); _star[2] = g_hdb->_gfx->loadPic(STAR_3); _versionGfx = g_hdb->_gfx->loadPic(MENU_VERSION_NUMBER); _warpGfx = g_hdb->_gfx->loadPic(MENU_WARP); // if we're popping back into menu, don't init this if (!_fStars[0].y) { for (int i = 0; i < kMaxStars; i++) { _fStars[i].y = -30; _fStars[i].x = g_hdb->_rnd->getRandomNumber(g_hdb->_screenWidth - 1); _fStars[i].speed = g_hdb->_rnd->getRandomNumber(4) + 1; _fStars[i].anim = g_hdb->_rnd->getRandomNumber(2); _fStars[i].delay = 5; } } _quitScreen = NULL; // did we skip the intro? if (!_nebulaY) { g_hdb->_gfx->setup3DStars(); // setup the star info _nebulaWhich = g_hdb->_rnd->getRandomNumber(kNebulaCount - 1); _nebulaX = g_hdb->_rnd->getRandomNumber(g_hdb->_screenWidth - 1) + 10; _nebulaY = -20; _nebulaYVel = g_hdb->_rnd->getRandomNumber(9) + 2; } _optionsScrollX = _menuX; _oBannerY = -48; _rocketY = _mRocketY; _rocketX = _mRocketX; _menuActive = true; _clickDelay = 30; fillSavegameSlots(); // did we already say "HYPERSPACE DELIVERY BOY!" ?? // if not, this is a great time to check for Copy Protection! if (_sayHDB == false) { g_hdb->_sound->playSound(SND_HDB); _sayHDB = true; } } void Menu::changeToMenu() { if (!g_hdb->_sound->songPlaying(_titleSong)) { g_hdb->_sound->stopMusic(); g_hdb->_sound->startMusic(_titleSong); } } void Menu::drawMenu() { // DEC the counter... if (_clickDelay) _clickDelay--; // sound.UpdateMusic(); // fading in/out g_hdb->_gfx->turnOffFade(); // heh //------------------------------------------------------------------- // Draw the MAIN MENU //------------------------------------------------------------------- if (_menuActive) { drawRocketAndSelections(); if (!g_hdb->isPPC()) { // draw version # _versionGfx->drawMasked(g_hdb->_screenWidth - 6 * 8, g_hdb->_screenHeight - 8); if (g_hdb->isDemo()) { _demoPlaqueGfx->drawMasked(g_hdb->_screenWidth / 2 - _demoPlaqueGfx->_width / 2, 2); } } // // see if the Options/GameFiles menu has scrolled off // if (_optionsScrolling) { _optionsScrollX += _optionsXV; _rocketX += -_optionsXV; _oBannerY += _optionsXV / 3; _optionsXV += 3; if (_optionsScrollX > g_hdb->_screenWidth + 10) { switch (_nextScreen) { case 0: _optionsActive = true; break; case 1: _gamefilesActive = 1; break; case 2: _newgameActive = true; break; default: break; } _oBannerY = 0; _optionsScrolling = false; _menuActive = false; } } // Draw the Secret Stars! (tm) if (g_hdb->getStarsMonkeystone7() == STARS_MONKEYSTONE_7 || g_hdb->getStarsMonkeystone14() == STARS_MONKEYSTONE_14 || g_hdb->getStarsMonkeystone21() == STARS_MONKEYSTONE_21) { static int anim = 0, angler = 0, angleb = 90, angleg = 180; static uint32 anim_time; if (g_hdb->getStarsMonkeystone7() == STARS_MONKEYSTONE_7) _starRedGfx[anim]->drawMasked( kStarRedX + (int)(5 * g_hdb->_gfx->getCos(angler)), kStarRedY + (int)(5 * g_hdb->_gfx->getSin(angler)) ); if (g_hdb->getStarsMonkeystone14() == STARS_MONKEYSTONE_14) _starGreenGfx[anim]->drawMasked( kStarGreenX + (int)(5 * g_hdb->_gfx->getCos(angleg)), kStarGreenY + (int)(5 * g_hdb->_gfx->getSin(angleg)) ); if (g_hdb->getStarsMonkeystone21() == STARS_MONKEYSTONE_21) _starBlueGfx[anim]->drawMasked( kStarBlueX + (int)(5 * g_hdb->_gfx->getCos(angleb)), kStarBlueY + (int)(5 * g_hdb->_gfx->getSin(angleb)) ); angler += 10; if (angler > 359) angler = 0; angleg += 10; if (angleg > 359) angleg = 0; angleb += 10; if (angleb > 359) angleb = 0; if (anim_time < g_hdb->getTimeSlice()) { anim_time = g_hdb->getTimeSlice() + 500; anim = 1 - anim; } } //#ifndef HDB_DEMO // // Draw WARP // if (g_hdb->getCheatingOn() && _warpGfx) _warpGfx->drawMasked(0, g_hdb->_screenHeight - _warpGfx->_height); //#endif } else if (_newgameActive) { //------------------------------------------------------------------- // Draw the NEWGAME menu //------------------------------------------------------------------- g_hdb->_gfx->draw3DStars(); // // see if the Options menu has scrolled back on // if (_optionsScrolling) { _optionsScrollX += _optionsXV; _rocketX += -_optionsXV; _oBannerY += _optionsXV / 3; _optionsXV -= 3; if (_optionsScrollX < _menuX) { _optionsScrollX = _menuX; _rocketX = _mRocketX; _oBannerY = -48; _optionsScrolling = false; _newgameActive = false; _menuActive = true; } drawRocketAndSelections(); } else { drawNebula(); _newGfx->drawMasked(centerPic(_newGfx), _oBannerY); _modePuzzleGfx->drawMasked(_newGameX, _modePuzzleY); _modePuzzleGfx->drawMasked(_newGameX, _modeActionY); g_hdb->_gfx->setCursor(_newGameX2, _modePuzzleY - 10); g_hdb->_gfx->drawText("PUZZLE MODE"); g_hdb->_gfx->setCursor(_newGameX2, _modePuzzleY + 10); g_hdb->_gfx->drawText("In this mode, the focus"); g_hdb->_gfx->setCursor(_newGameX2, _modePuzzleY + 22); g_hdb->_gfx->drawText("is on solving puzzles and"); g_hdb->_gfx->setCursor(_newGameX2, _modePuzzleY + 34); g_hdb->_gfx->drawText("avoiding enemies."); g_hdb->_gfx->setCursor(_newGameX2, _modeActionY - 10); g_hdb->_gfx->drawText("ACTION MODE"); g_hdb->_gfx->setCursor(_newGameX2, _modeActionY + 10); g_hdb->_gfx->drawText("In this mode, the focus"); g_hdb->_gfx->setCursor(_newGameX2, _modeActionY + 22); g_hdb->_gfx->drawText("is on solving puzzles and"); g_hdb->_gfx->setCursor(_newGameX2, _modeActionY + 34); g_hdb->_gfx->drawText("attacking enemies!"); // title logo _titleLogo->drawMasked(centerPic(_titleLogo), _rocketY + _mTitleY); _menuBackoutGfx->drawMasked(_backoutX, g_hdb->_menu->_backoutY); } } else if (_optionsActive) { //------------------------------------------------------------------- // Draw the OPTIONS menu //------------------------------------------------------------------- g_hdb->_gfx->draw3DStars(); // // see if the Options menu has scrolled back on // if (_optionsScrolling) { _optionsScrollX += _optionsXV; _rocketX += -_optionsXV; _oBannerY += _optionsXV / 3; _optionsXV -= 3; if (_optionsScrollX < _menuX) { _optionsScrollX = _menuX; _rocketX = _mRocketX; _oBannerY = -48; _optionsScrolling = false; _optionsActive = false; _menuActive = true; } drawRocketAndSelections(); } else if (_optionsActive == 1) { // // Options menu content // drawNebula(); _optionsGfx->drawMasked(centerPic(_optionsGfx), _oBannerY); g_hdb->_gfx->setCursor(_optionsX + kOptionSPC, _optionsY); if (!g_hdb->_sound->getMusicVolume()) g_hdb->_gfx->drawText("Music OFF"); else g_hdb->_gfx->drawText("Music Volume"); drawSlider(_optionsX, _optionsY + 20, g_hdb->_sound->getMusicVolume()); g_hdb->_gfx->setCursor(_optionsX + kOptionSPC, _optionsY + kOptionLineSPC * 2); if (!g_hdb->_sound->getSFXVolume()) g_hdb->_gfx->drawText("Sound Effects OFF"); else g_hdb->_gfx->drawText("Sound Effects Volume"); drawSlider(_optionsX, _optionsY + kOptionLineSPC * 2 + 20, g_hdb->_sound->getSFXVolume()); if (!g_hdb->isPPC()) { // Voices ON or OFF drawToggle(_optionsX, _optionsY + kOptionLineSPC * 4 + 20, g_hdb->_sound->getVoiceStatus()); if (!g_hdb->isVoiceless()) { g_hdb->_gfx->setCursor(_optionsX + kOptionSPC + 24, _optionsY + kOptionLineSPC * 4 + 24); if (!g_hdb->_sound->getVoiceStatus()) g_hdb->_gfx->drawText("Voice Dialogue OFF"); else g_hdb->_gfx->drawText("Voice Dialogue ON"); } } // title logo _titleLogo->drawMasked(centerPic(_titleLogo), _rocketY + _mTitleY); _menuBackoutGfx->drawMasked(_backoutX, g_hdb->_menu->_backoutY); // Ignore Controls Screen Button //_controlButtonGfx->drawMasked(centerPic(_controlButtonGfx), _mControlsY); } else if (_optionsActive == 2) { // // Draw CONTROLS screen // // Ignore Controls Assignment //controlsDraw(); return; } } else if (_gamefilesActive) { //------------------------------------------------------------------- // DRAW GAMEFILES MENU //------------------------------------------------------------------- g_hdb->_gfx->draw3DStars(); // // see if the Options menu has scrolled back on // if (_optionsScrolling) { _optionsScrollX += _optionsXV; _rocketX += -_optionsXV; _oBannerY += _optionsXV / 3; _optionsXV -= 3; if (_optionsScrollX < _menuX) { _optionsScrollX = _menuX; _rocketX = _mRocketX; _oBannerY = -48; _optionsScrolling = false; _gamefilesActive = false; _menuActive = true; } drawRocketAndSelections(); } else { static int anim = 0; static uint32 anim_time = 0; drawNebula(); _titleLogo->drawMasked(centerPic(_titleLogo), _rocketY + _mTitleY); // CHOOSE SLOT screen _modeLoadGfx->drawMasked(centerPic(_modeLoadGfx), _oBannerY); _menuBackoutGfx->drawMasked(_backoutX, g_hdb->_menu->_backoutY); if (!g_hdb->isPPC()) { if (_saveGames[kAutoSaveSlot].seconds) _vortexian[anim]->drawMasked(_vortSaveX, _vortSaveY); } if (g_hdb->isPPC()) { g_hdb->_gfx->setCursor(_vortSaveTextX, _vortSaveY); g_hdb->_gfx->drawText("Last Vortexian"); g_hdb->_gfx->setCursor(_vortSaveTextX, _vortSaveY + 12); g_hdb->_gfx->drawText("Saved Game"); } if (anim_time < g_hdb->getTimeSlice()) { anim_time = g_hdb->getTimeSlice() + 50; anim++; if (anim > 2) anim = 0; } for (int i = 0; i < kNumSaveSlots; i++) { int seconds = _saveGames[i].seconds; _slotGfx->drawMasked(_saveSlotX - 8, i * 32 + (_saveSlotY - 4)); if (seconds || _saveGames[i].mapName[0]) { g_hdb->_gfx->setTextEdges(0, g_hdb->_screenWidth + 60, 0, g_hdb->_screenHeight); g_hdb->_gfx->setCursor(_saveSlotX, i * 32 + _saveSlotY); g_hdb->_gfx->drawText(_saveGames[i].mapName); g_hdb->_gfx->setCursor(_saveSlotX + 180, i * 32 + _saveSlotY); Common::String buff = Common::String::format("%02d:%02d", seconds / 3600, (seconds / 60) % 60); g_hdb->_gfx->drawText(buff.c_str()); } } } } else if (_warpActive) { //------------------------------------------------------------------- // DRAW WARP MENU //------------------------------------------------------------------- g_hdb->_gfx->draw3DStars(); drawNebula(); drawWarpScreen(); // title logo _titleLogo->drawMasked(centerPic(_titleLogo), _rocketY + _mTitleY); _menuBackoutGfx->drawMasked(_warpBackoutX, g_hdb->_menu->_warpBackoutY); Common::String textString; for (int i = 0; i < 10; i++) { textString = Common::String::format("Map %2d", i); g_hdb->_gfx->setCursor(_warpX + 4, i * 16 + _warpY); g_hdb->_gfx->drawText(textString.c_str()); } for (int i = 0; i < 10; i++) { textString = Common::String::format("Map %d", i + 10); g_hdb->_gfx->setCursor(_warpX + 80, i * 16 + _warpY); g_hdb->_gfx->drawText(textString.c_str()); } for (int i = 0; i < 10; i++) { textString = Common::String::format("Map %d", i + 20); g_hdb->_gfx->setCursor(_warpX + 160, i * 16 + _warpY); g_hdb->_gfx->drawText(textString.c_str()); } if (_warpActive > 1) { g_hdb->_gfx->setCursor(_warpX + 60, _warpY + 164); textString = Common::String::format("Warping to MAP%d", _warpActive - 2); g_hdb->_gfx->centerPrint(textString.c_str()); } } else if (_quitActive) { //------------------------------------------------------------------- // DRAW QUIT SCREEN //------------------------------------------------------------------- g_hdb->_gfx->draw3DStars(); drawNebula(); if (_quitActive == 3 || !g_hdb->isDemo()) { if (!_quitScreen) _quitScreen = g_hdb->_gfx->loadPic(PIC_QUITSCREEN); _quitScreen->drawMasked(_quitX, _quitY); } else if (_quitActive == 1) { _screenshots1agfx->drawMasked(_quitX, _quitY); } else if (_quitActive == 2) { // XXXX _screenshots1gfx->drawMasked(_quitX, _quitY); if (!g_hdb->isPPC()) _screenshots2gfx->drawMasked(_quitX, g_hdb->_screenHeight - _screenshots2gfx->_height); } } } void Menu::freeMenu() { // title sequence stuff if (_titleScreen) delete _titleScreen; _titleScreen = NULL; if (_oohOohGfx) delete _oohOohGfx; _oohOohGfx = NULL; if (_newGfx) delete _newGfx; _newGfx = NULL; if (_loadGfx) delete _loadGfx; _loadGfx = NULL; if (_optionsGfx) delete _optionsGfx; _optionsGfx = NULL; if (_quitGfx) delete _quitGfx; _quitGfx = NULL; if (_resumeGfx) delete _resumeGfx; _resumeGfx = NULL; if (_slotGfx) delete _slotGfx; _slotGfx = NULL; if (_rocketMain) delete _rocketMain; _rocketMain = NULL; if (_rocketSecond) delete _rocketSecond; _rocketSecond = NULL; if (_rocketEx1) delete _rocketEx1; _rocketEx1 = NULL; if (_rocketEx2) delete _rocketEx2; _rocketEx2 = NULL; if (_titleLogo) delete _titleLogo; _titleLogo = NULL; if (_hdbLogoScreen) delete _hdbLogoScreen; _hdbLogoScreen = NULL; if (_screenshots1gfx) delete _screenshots1gfx; _screenshots1gfx = NULL; if (_screenshots1agfx) delete _screenshots1agfx; _screenshots1agfx = NULL; if (_screenshots2gfx) delete _screenshots2gfx; _screenshots2gfx = NULL; if (_demoPlaqueGfx) delete _demoPlaqueGfx; _demoPlaqueGfx = NULL; if (g_hdb->isPPC() && g_hdb->isHandango()) { if (_handangoGfx) delete _handangoGfx; _handangoGfx = NULL; } if (_nebulaGfx[0]) { for (int i = 0; i < kNebulaCount; i++) { delete _nebulaGfx[i]; _nebulaGfx[i] = NULL; } } if (_sliderLeft) delete _sliderLeft; _sliderLeft = NULL; if (_sliderMid) delete _sliderMid; _sliderMid = NULL; if (_sliderRight) delete _sliderRight; _sliderRight = NULL; if (_sliderKnob) delete _sliderKnob; _sliderKnob = NULL; if (_modePuzzleGfx) delete _modePuzzleGfx; _modePuzzleGfx = NULL; if (_modeActionGfx) delete _modeActionGfx; _modeActionGfx = NULL; if (_modeLoadGfx) delete _modeLoadGfx; _modeLoadGfx = NULL; if (_modeSaveGfx) delete _modeSaveGfx; _modeSaveGfx = NULL; if (_menuBackoutGfx) delete _menuBackoutGfx; _menuBackoutGfx = NULL; if (_menuBackspaceGfx) delete _menuBackspaceGfx; _menuBackspaceGfx = NULL; if (_controlButtonGfx) delete _controlButtonGfx; _controlButtonGfx = NULL; if (_controlsGfx) delete _controlsGfx; _controlsGfx = NULL; if (_vortexian[0]) { delete _vortexian[0]; delete _vortexian[1]; delete _vortexian[2]; _vortexian[0] = _vortexian[1] = _vortexian[2] = NULL; } if (_star[0]) { delete _star[0]; delete _star[1]; delete _star[2]; _star[0] = _star[1] = _star[2] = NULL; } // secret stars if (_starRedGfx[0]) { delete _starRedGfx[0]; delete _starRedGfx[1]; delete _starGreenGfx[0]; delete _starGreenGfx[1]; delete _starBlueGfx[0]; delete _starBlueGfx[1]; _starRedGfx[0] = _starRedGfx[1] = NULL; _starGreenGfx[0] = _starGreenGfx[1] = NULL; _starBlueGfx[0] = _starBlueGfx[1] = NULL; } if (_versionGfx) delete _versionGfx; _versionGfx = NULL; if (_warpGfx) delete _warpGfx; _warpGfx = NULL; } bool Menu::startTitle() { readConfig(); _titleScreen = g_hdb->_gfx->loadPic(MONKEYLOGOSCREEN); if (!_titleScreen) return false; _oohOohGfx = g_hdb->_gfx->loadPic(MONKEYLOGO_OOHOOH); _rocketMain = g_hdb->_gfx->loadPic(MENU_ROCKETSHIP1); _rocketSecond = g_hdb->_gfx->loadPic(MENU_ROCKETSHIP2); _rocketEx1 = g_hdb->_gfx->loadPic(MENU_EXHAUST1); _rocketEx2 = g_hdb->_gfx->loadPic(MENU_EXHAUST2); _titleLogo = g_hdb->_gfx->loadPic(TITLELOGO); for (int i = 0; i < kNebulaCount; i++) _nebulaGfx[i] = g_hdb->_gfx->loadPic(nebulaNames[i]); _titleCycle = 1; // 1 = Waiting for OOH OOH _titleDelay = g_system->getMillis() + 1000 * TITLE_DELAY1; g_hdb->_sound->stopMusic(); _introSong = SONG_TITLE; _titleSong = SONG_MENU; g_hdb->_sound->startMusic(_introSong); return _titleActive = true; } void Menu::drawTitle() { static uint32 time; //sound.UpdateMusic(); if (!_titleActive) return; //------------------------------------------------------------------- // draw special gfx //------------------------------------------------------------------- switch (_titleCycle) { case 1: case 3: // draw entire screen _titleScreen->draw(0, 0); break; case 2: // draw entire screen & ooh ooh _titleScreen->draw(0, 0); _oohOohGfx->draw(_oohOhhX, _oohOhhY); break; case 4: // fadeout monkeystone logo _titleScreen->draw(0, 0); break; case 20: // fadein Handango title screen case 21: // wait case 22: // fadeout Handango title screen case 23: _handangoGfx->draw(0, 0); break; case 5: // fadein HDB title screen case 6: // wait case 7: // fadeout HDB title screen _hdbLogoScreen->draw(0, 0); break; // draw the rocket & exhaust until it stops case 8: g_hdb->_gfx->draw3DStars(); // draw nebula _nebulaGfx[_nebulaWhich]->draw(_nebulaX, _nebulaY); _nebulaY += _nebulaYVel; if (_nebulaY > g_hdb->_screenHeight + (g_hdb->_screenHeight / 2)) { _nebulaWhich = g_hdb->_rnd->getRandomNumber(kNebulaCount - 1); _nebulaX = g_hdb->_rnd->getRandomNumber(g_hdb->_screenWidth - 1) + 10; _nebulaY = -11 * 8; _nebulaYVel = g_hdb->_rnd->getRandomNumber(3) + 1; if (_nebulaWhich > 4) // galaxy? _nebulaYVel = 1; } // draw rocket _rocketMain->drawMasked(_mRocketX, _rocketY); _rocketSecond->drawMasked(_mRocketX + 40, _rocketY + _mRocketYBottom); // exhaust if (_rocketEx < 5) { _rocketEx1->drawMasked(_mRocketX + _mRocketEXHX, _rocketY + _mRocketYBottom); if (!g_hdb->isPPC()) _rocketEx2->drawMasked(_mRocketX + _mRocketEXHX2, _rocketY + _mRocketYBottom); } else if (_rocketEx >= 5 && _rocketEx < 10) { _rocketEx2->drawMasked(_mRocketX + _mRocketEXHX, _rocketY + _mRocketYBottom); if (!g_hdb->isPPC()) _rocketEx1->drawMasked(_mRocketX + _mRocketEXHX2, _rocketY + _mRocketYBottom); } else { _rocketEx = 0; _rocketEx1->drawMasked(_mRocketX + _mRocketEXHX, _rocketY + _mRocketYBottom); if (!g_hdb->isPPC()) _rocketEx2->drawMasked(_mRocketX + _mRocketEXHX2, _rocketY + _mRocketYBottom); } _rocketEx++; // title logo _titleLogo->drawMasked(centerPic(_titleLogo), _rocketY + _mTitleY); break; default: break; } // timer countdown... if (_titleDelay > g_system->getMillis()) return; //------------------------------------------------------------------- // change title state... //------------------------------------------------------------------- switch (_titleCycle) { //------------------------------------------------------------------- // MONKEYSTONE LOGO //------------------------------------------------------------------- // time to OOH OOH case 1: _titleDelay = (uint32)(g_system->getMillis() + 1000 * TITLE_DELAY2); g_hdb->_sound->playSound(SND_MONKEY_OOHOOH); _titleCycle++; break; // delay after OOH OOH case 2: _titleDelay = g_system->getMillis() + 1000 * TITLE_DELAY3; _titleCycle++; break; // done with delay; set up the fadeout... case 3: time = g_hdb->getTimeSliceDelta(); g_hdb->_gfx->setFade(false, false, kScreenFade / time); // FADEOUT _titleCycle++; g_hdb->_sound->stopMusic(); break; // wait for fadeout, then start music case 4: if (g_hdb->_gfx->isFadeActive()) break; g_hdb->_gfx->setFade(true, false, kScreenFade / time); // FADEIN g_hdb->_sound->startMusic(_titleSong); if (!g_hdb->isHandango()) _titleCycle++; else _titleCycle = 20; break; //------------------------------------------------------------------- // HANDANGO LOGO //------------------------------------------------------------------- case 20: // fadein handango screen if (g_hdb->_gfx->isFadeActive()) break; _titleDelay = g_system->getMillis() + 750; _titleCycle++; break; case 21: // wait g_hdb->_gfx->setFade(false, false, kScreenFade / time); // FADEOUT _titleCycle++; break; case 22: // fadeout handango screen if (g_hdb->_gfx->isFadeActive()) break; _titleCycle++; break; case 23: // fadein HDB title screen if (g_hdb->_gfx->isFadeActive()) break; g_hdb->_gfx->setFade(true, false, kScreenFade / time); // FADEIN _titleCycle = 5; break; //------------------------------------------------------------------- // HDB TITLE SCREEN //------------------------------------------------------------------- // wait for fadein to stop case 5: if (g_hdb->_gfx->isFadeActive()) break; _titleDelay = g_system->getMillis() + 5000; _titleCycle++; break; // set fadeout to stars case 6: g_hdb->_gfx->setFade(false, false, kScreenFade / time); // FADEOUT _titleCycle++; break; // get rocket ready case 7: if (g_hdb->_gfx->isFadeActive()) break; g_hdb->_gfx->turnOffFade(); g_hdb->_gfx->fillScreen(0); { _titleCycle++; _rocketY = g_hdb->_screenHeight; // ycoord _rocketYVel = -1; // yspeed _rocketEx = 0; // exhaust toggle g_hdb->_gfx->setup3DStars(); // setup the star info _nebulaWhich = g_hdb->_rnd->getRandomNumber(kNebulaCount - 1); _nebulaX = g_hdb->_rnd->getRandomNumber(g_hdb->_screenWidth - 1) + 10; _nebulaY = -11 * 8; _nebulaYVel = g_hdb->_rnd->getRandomNumber(9) + 2; if (_nebulaWhich > 4) // galaxy? _nebulaYVel = 1; } break; // move rocket up the screen! case 8: _titleDelay = 1; _rocketY += _rocketYVel; if (_rocketY < _mRocketY) { _rocketY = _mRocketY; _titleCycle = 12; _titleDelay = 1; } break; // shut down title....start up menu! case 12: _titleActive = false; g_hdb->changeGameState(); break; default: break; } } void Menu::fillSavegameSlots() { Common::String saveGameFile; for (int i = 0; i < kNumSaveSlots; i++) { saveGameFile = g_hdb->genSaveFileName(i, false); Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(saveGameFile); if (!in) { _saveGames[i].seconds = 0; _saveGames[i].saveID[0] = 0; _saveGames[i].mapName[0] = 0; } else { Graphics::skipThumbnail(*in); Common::strlcpy(_saveGames[i].saveID, saveGameFile.c_str(), sizeof(_saveGames[0].saveID)); _saveGames[i].seconds = in->readUint32LE(); in->read(_saveGames[i].mapName, 32); delete in; } _saveGames[i].fileSlot = i + 1; } } void Menu::processInput(int x, int y) { // do not enter if clicking too fast if (_clickDelay) return; _clickDelay = 3; //------------------------------------------------------------------- // MAIN MENU INPUT //------------------------------------------------------------------- if (_menuActive) { int resume = getMenuKey(); // quit game? if (x >= _menuX && x < _menuX + _menuItemWidth && y >= _menuY + _mQuitY && y < _menuY + _mQuitY + _menuItemHeight) { g_hdb->_sound->playSound(SND_BYE); _quitTimer = g_hdb->getTimeSlice() + 1000; _quitActive = 1; _menuActive = false; return; } else if (x >= _menuX && x < _menuX + _menuItemWidth && y >= _menuY && y < _menuY + _menuItemHeight) { // new game? _optionsScrolling = true; _optionsXV = 5; g_hdb->_sound->playSound(SND_MENU_ACCEPT); g_hdb->_sound->freeSound(SND_HDB); _nextScreen = 2; } else if (x >= _menuX && x < _menuX + _menuItemWidth && y >= _menuY + _mLoadY && y < _menuY + _mLoadY + _menuItemHeight) { // game files? _optionsScrolling = true; _optionsXV = 5; g_hdb->_sound->playSound(SND_MENU_ACCEPT); _nextScreen = 1; } else if (x >= _menuX && x < _menuX + _menuItemWidth && y >= _menuY + _mOptionsY && y < _menuY + _mOptionsY + _menuItemHeight) { // options? SoundType temp; temp = g_hdb->_sound->whatSongIsPlaying(); if (temp != SONG_NONE) _resumeSong = temp; _optionsScrolling = true; _optionsXV = 5; _nextScreen = 0; g_hdb->_sound->playSound(SND_MENU_ACCEPT); } else if (((x >= _menuX && x < _menuX + _menuItemWidth && y >= _menuY + _mResumeY && y < _menuY + _mResumeY + _menuItemHeight) || resume) && (true == g_hdb->_map->isLoaded() || _saveGames[5].seconds)) { // resume game? ( must be playing already or have an autosave ) g_hdb->_sound->playSound(SND_POP); freeMenu(); // if we're on the secret level, RESUME will load the autosave... if (g_hdb->_map->isLoaded() && scumm_strnicmp(g_hdb->currentMapName(), "map30", 5)) g_hdb->setGameState(GAME_PLAY); else { if (g_hdb->loadGameState(kAutoSaveSlot).getCode() == Common::kNoError) { g_hdb->setGameState(GAME_PLAY); } } } else if (g_hdb->getStarsMonkeystone7() == STARS_MONKEYSTONE_7 || g_hdb->getStarsMonkeystone14() == STARS_MONKEYSTONE_14 || g_hdb->getStarsMonkeystone21() == STARS_MONKEYSTONE_21) { // Secret Stars! (tm) if (x >= kStarRedX && x <= kStarRedX + _starRedGfx[0]->_width && y >= kStarRedY && y <= kStarRedY + _starRedGfx[0]->_height && g_hdb->getStarsMonkeystone7() == STARS_MONKEYSTONE_7) { _optionsActive = false; g_hdb->setGameState(GAME_PLAY); if (scumm_strnicmp(g_hdb->currentMapName(), "map30", 5)) // don't save if we're already on 30! g_hdb->saveGameState(kAutoSaveSlot, "FIXME"); // Add here date/level name // TODO _starWarp = 0; g_hdb->_sound->playSound(SND_MONKEYSTONE_SECRET_STAR); g_hdb->startMap("MAP30"); } else if (x >= kStarGreenX && x <= kStarGreenX + _starGreenGfx[0]->_width && y >= kStarGreenY && y <= kStarGreenY + _starGreenGfx[0]->_height && g_hdb->getStarsMonkeystone14() == STARS_MONKEYSTONE_14) { _optionsActive = false; g_hdb->setGameState(GAME_PLAY); if (scumm_strnicmp(g_hdb->currentMapName(), "map30", 5)) // don't save if we're already on 30! g_hdb->saveGameState(kAutoSaveSlot, "FIXME"); // Add here date/level name // TODO _starWarp = 1; g_hdb->_sound->playSound(SND_MONKEYSTONE_SECRET_STAR); g_hdb->startMap("MAP30"); } else if (x >= kStarBlueX && x <= kStarBlueX + _starBlueGfx[0]->_width && y >= kStarBlueY && y <= kStarBlueY + _starBlueGfx[0]->_height && g_hdb->getStarsMonkeystone21() == STARS_MONKEYSTONE_21) { _optionsActive = false; g_hdb->setGameState(GAME_PLAY); if (scumm_strnicmp(g_hdb->currentMapName(), "map30", 5)) // don't save if we're already on 30! g_hdb->saveGameState(kAutoSaveSlot, "FIXME"); // Add here date/level name // TODO _starWarp = 2; g_hdb->_sound->playSound(SND_MONKEYSTONE_SECRET_STAR); g_hdb->startMap("MAP30"); } } // secret warp menu? (click on nebula!) int open; if (!g_hdb->getCheatingOn()) open = (x >= _nebulaX && x < _nebulaX + 16 && y >= _nebulaY && y < _nebulaY + 16); else open = (y > g_hdb->_menu->_menuExitY && x < _menuExitXLeft); if (open) { g_hdb->_sound->playSound(SND_MONKEYSTONE_SECRET_STAR); _menuActive = false; _warpActive = true; _clickDelay = 30; } } else if (_newgameActive) { //------------------------------------------------------------------- // NEWGAME INPUT //------------------------------------------------------------------- int xit = getMenuKey(); if (y >= g_hdb->_menu->_menuExitY || y < _menuExitYTop || xit) { _optionsScrolling = true; _optionsXV = -5; g_hdb->_sound->playSound(SND_MENU_BACKOUT); } // PUZZLE MODE area if (y >= _modePuzzleY - 10 && y <= _modeActionY - 10) { g_hdb->setActionMode(0); g_hdb->_sound->playSound(SND_MENU_ACCEPT); _newgameActive = false; g_hdb->changeGameState(); // that's it! the Game Loop takes over from here... } else if (y >= _modeActionY - 10 && y <= g_hdb->_menu->_menuExitY) { // ACTION MODE area g_hdb->setActionMode(1); g_hdb->_sound->playSound(SND_MENU_ACCEPT); _newgameActive = false; g_hdb->changeGameState(); } } else if (_optionsActive) { //------------------------------------------------------------------- // OPTIONS INPUT //------------------------------------------------------------------- int xit = getMenuKey(); // // Controls screen // if (_optionsActive == 2) { controlsInput(x, y); return; } int offset; // Slider 1 if (x >= 0 && x <= _optionsX + 200 && y >= _optionsY + 20 && y <= _optionsY + 36) { int oldVol = g_hdb->_sound->getMusicVolume(); if (x < _optionsX) { if (oldVol) { g_hdb->_sound->stopMusic(); g_hdb->_sound->setMusicVolume(0); g_hdb->_sound->playSound(SND_GUI_INPUT); } } else { offset = ((x - _optionsX) * 256) / 200; g_hdb->_sound->setMusicVolume(offset); if (!oldVol) g_hdb->_sound->startMusic(_resumeSong); } } else if (x >= 0 && x <= _optionsX + 200 && y >= _optionsY + kOptionLineSPC * 2 + 20 && y <= _optionsY + kOptionLineSPC * 2 + 36) { // Slider 2 if (x >= _optionsX) offset = ((x - _optionsX) * 256) / 200; else offset = 0; g_hdb->_sound->setSFXVolume(offset); g_hdb->_sound->playSound(SND_MENU_SLIDER); } else if (x >= _optionsX && x <= _optionsX + 200 && y >= _optionsY + kOptionLineSPC * 4 + 24 && y <= _optionsY + kOptionLineSPC * 4 + 40) { // Voices ON/OFF if (!g_hdb->isVoiceless()) { bool value = g_hdb->_sound->getVoiceStatus(); value ^= true; g_hdb->_sound->setVoiceStatus(value); g_hdb->_sound->playSound(SND_GUI_INPUT); } } else if (y >= g_hdb->_menu->_menuExitY || y < _menuExitYTop || xit) { g_hdb->_sound->playSound(SND_MENU_BACKOUT); _optionsScrolling = true; _optionsXV = -5; } else if (x >= (g_hdb->_screenWidth / 2 - _controlButtonGfx->_width / 2) && x < (g_hdb->_screenWidth / 2 + _controlButtonGfx->_width / 2) && y >= _mControlsY && y < _mControlsY + _controlButtonGfx->_height) { // CONTROLS BUTTON! // Ignore Controls Button //_optionsActive = 2; //_clickDelay = 20; //g_hdb->_sound->playSound(SND_POP); } } else if (_gamefilesActive) { //------------------------------------------------------------------- // GAMEFILES INPUT //------------------------------------------------------------------- int xit = getMenuKey(); if (y >= g_hdb->_menu->_menuExitY + 15 || y < _menuExitYTop || xit) { _optionsScrolling = true; _optionsXV = -5; g_hdb->_sound->playSound(SND_MENU_BACKOUT); } // Vortexian Load only exists on PocketPC! if (g_hdb->isPPC()) { // 5 Slots screen // Vortexian autosave LOAD? if (y > _vortSaveY && (y < _vortSaveY + 32) && (x >= _vortSaveX) && (x < _vortSaveX + 96) && _saveGames[kAutoSaveSlot].seconds) { g_hdb->_sound->playSound(SND_VORTEX_SAVE); if (g_hdb->loadGameState(kAutoSaveSlot).getCode() == Common::kNoError) { _gamefilesActive = false; freeMenu(); g_hdb->setGameState(GAME_PLAY); return; } } } int i = 0; for (; i < kNumSaveSlots; i++) if (y >= (i * 32 + _saveSlotY - 4) && y <= (i * 32 + _saveSlotY + 24)) break; if (i >= kNumSaveSlots) return; _saveSlot = i; // LOAD GAME! // clicked on empty slot? if (!_saveGames[i].seconds && !_saveGames[i].mapName[0]) { g_hdb->_sound->playSound(SND_MENU_BACKOUT); return; } g_hdb->_sound->playSound(SND_MENU_ACCEPT); if (g_hdb->loadGameState(_saveSlot).getCode() == Common::kNoError) { _gamefilesActive = false; freeMenu(); g_hdb->setGameState(GAME_PLAY); // if we're at the very start of the level, re-init the level if (!_saveGames[i].seconds) { g_hdb->_lua->callFunction("level_loaded", 0); // call "level_loaded" Lua function, if it exists if (!g_hdb->_ai->cinematicsActive()) g_hdb->_gfx->turnOffFade(); } } } else if (_warpActive) { //------------------------------------------------------------------- // WARP INPUT //------------------------------------------------------------------- int xit = getMenuKey(); if ((y >= g_hdb->_menu->_menuExitY && x < _menuExitXLeft) || xit) { _menuActive = true; _warpActive = false; g_hdb->_sound->playSound(SND_MENU_BACKOUT); _clickDelay = 10; } else if (y >= _warpY && y < _warpY + 160) { int map; if (x > _warpX + 160) map = 20; else if (x > _warpX + 80) map = 10; else map = 0; map += (y - _warpY) / 16; _warpActive = map + 2; g_hdb->paint(); if (g_hdb->getDebug()) g_hdb->_gfx->updateVideo(); _warpActive = 0; Common::String mapString = Common::String::format("MAP%02d", map); if (g_hdb->isDemo()) { mapString += "_DEMO"; } freeMenu(); g_hdb->setGameState(GAME_PLAY); g_hdb->_sound->stopMusic(); g_hdb->_ai->clearPersistent(); g_hdb->resetTimer(); g_hdb->_sound->playSound(SND_POP); g_hdb->startMap(mapString.c_str()); } } else if (_quitActive) { //------------------------------------------------------------------- // QUIT INPUT //------------------------------------------------------------------- int xit = getMenuKey(); if (!g_hdb->isDemo()) { if ((x >= _quitNoX1 && x <= _quitNoX2 && y > _quitNoY1 && y < _quitNoY2 && _quitTimer < g_hdb->getTimeSlice()) || xit) { g_hdb->_sound->playSound(SND_MENU_BACKOUT); delete _quitScreen; _quitScreen = NULL; _menuActive = true; _quitActive = 0; } else if (_quitTimer < g_hdb->getTimeSlice()) { if (x >= _quitYesX1 && x <= _quitYesX2 && y > _quitYesY1 && y < _quitYesY2) { writeConfig(); g_hdb->quitGame(); } } } else { if ((_quitActive == 1 || _quitActive == 2) && _quitTimer < g_hdb->getTimeSlice()) { _quitActive++; _quitTimer = g_hdb->getTimeSlice() + 1000; } else { if (_quitActive == 3 && (x >= _quitNoX1 && x <= _quitNoX2 && y > _quitNoY1 && y < _quitNoY2 && _quitTimer < g_hdb->getTimeSlice())) { g_hdb->_sound->playSound(SND_MENU_BACKOUT); delete _quitScreen; _quitScreen = NULL; _menuActive = true; _quitActive = 0; } else if (_quitActive == 3 && _quitTimer < g_hdb->getTimeSlice()){ writeConfig(); g_hdb->quitGame(); } } } } } void Menu::controlsInput(int x, int y) { } void Menu::controlsDraw() { } void Menu::drawNebula() { // draw nebula _nebulaGfx[_nebulaWhich]->draw(_nebulaX, _nebulaY); _nebulaY += _nebulaYVel; if (_nebulaY > g_hdb->_screenHeight + (g_hdb->_screenHeight / 2)) { _nebulaWhich = g_hdb->_rnd->getRandomNumber(kNebulaCount - 1); _nebulaX = g_hdb->_rnd->getRandomNumber(g_hdb->_screenWidth - 1) + 10; _nebulaY = -11 * 8; _nebulaYVel = g_hdb->_rnd->getRandomNumber(3) + 1; if (_nebulaWhich > 4) // galaxy? _nebulaYVel = 1; } // // draw the falling stars // for (int i = 0; i < kMaxStars; i++) { _fStars[i].y += _fStars[i].speed; if (_fStars[i].y > g_hdb->_screenHeight) { _fStars[i].y = (g_hdb->_rnd->getRandomNumber(29) + 30) * -1; _fStars[i].speed = g_hdb->_rnd->getRandomNumber(4) + 1; } if (_fStars[i].delay-- < 1) { _fStars[i].delay = 5; _fStars[i].anim = (_fStars[i].anim + 1) % 3; } _star[_fStars[i].anim]->drawMasked(_fStars[i].x, _fStars[i].y); } } void Menu::drawRocketAndSelections() { g_hdb->_gfx->draw3DStars(); drawNebula(); // top-down/up scrolling stuff switch (_nextScreen) { case 0: _optionsGfx->drawMasked(centerPic(_optionsGfx), _oBannerY); break; case 1: _modeLoadGfx->drawMasked(centerPic(_modeLoadGfx), _oBannerY); break; case 2: _newGfx->drawMasked(centerPic(_newGfx), _oBannerY); break; default: break; } // menu items _newGfx->drawMasked(_optionsScrollX, _menuY); _modeLoadGfx->drawMasked(_optionsScrollX, _menuY + _mLoadY); _optionsGfx->drawMasked(_optionsScrollX, _menuY + _mOptionsY); _quitGfx->drawMasked(_optionsScrollX, _menuY + _mQuitY); if (g_hdb->_map->isLoaded() || _saveGames[5].seconds) _resumeGfx->drawMasked(_optionsScrollX, _menuY + _mResumeY); // draw rocket _rocketMain->drawMasked(_rocketX, _rocketY); _rocketSecond->drawMasked(_rocketX + 40, _rocketY + _mRocketYBottom); // exhaust if (_rocketEx < 5) { _rocketEx1->drawMasked(_mRocketX + _mRocketEXHX, _rocketY + _mRocketYBottom); if (!g_hdb->isPPC()) { _rocketEx2->drawMasked(_mRocketX + _mRocketEXHX2, _rocketY + _mRocketYBottom); } } else if (_rocketEx >= 5 && _rocketEx < 10) { _rocketEx2->drawMasked(_mRocketX + _mRocketEXHX, _rocketY + _mRocketYBottom); if (!g_hdb->isPPC()) { _rocketEx1->drawMasked(_mRocketX + _mRocketEXHX2, _rocketY + _mRocketYBottom); } } else { _rocketEx = 0; _rocketEx1->drawMasked(_mRocketX + _mRocketEXHX, _rocketY + _mRocketYBottom); if (!g_hdb->isPPC()) { _rocketEx2->drawMasked(_mRocketX + _mRocketEXHX2, _rocketY + _mRocketYBottom); } } _rocketEx++; // title logo _titleLogo->drawMasked(centerPic(_titleLogo), _rocketY + _mTitleY); } void Menu::drawSlider(int x, int y, int offset) { int x1 = x; _sliderLeft->drawMasked(x, y); x += _sliderLeft->_width; for (int i = 0; i < 12; i++) { _sliderMid->draw(x, y); x += _sliderMid->_width; } _sliderRight->drawMasked(x, y); _sliderKnob->drawMasked(x1 + (offset * 200) / 256, y + 2); } void Menu::drawToggle(int x, int y, bool flag) { int x1 = x; _gCheckLeft->drawMasked(x, y); x += _gCheckLeft->_width; for (int i = 0; i < 12; i++) { _gCheckEmpty->draw(x, y); x += _gCheckEmpty->_width; } _gCheckRight->drawMasked(x, y); if (!flag) _gCheckOff->drawMasked(x1 + _sliderLeft->_width, y); else _gCheckOn->drawMasked(x1 + _sliderLeft->_width, y); } void Menu::drawWarpScreen() { if (g_hdb->isPPC()) { g_hdb->_gfx->setCursor(0, _warpY + 176); g_hdb->_gfx->centerPrint("MONKEYSTONE WARP ZONE!"); } else _warpPlaque->drawMasked(centerPic(_warpPlaque), 64); } } // End of Namespace