mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-16 06:39:17 +00:00
1795 lines
50 KiB
C++
1795 lines
50 KiB
C++
/* 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;
|
|
}
|
|
|
|
_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;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
// 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
|