scummvm/engines/pegasus/menu.cpp

210 lines
6.2 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/events.h"
#include "common/textconsole.h"
#include "pegasus/console.h"
#include "pegasus/pegasus.h"
namespace Pegasus {
enum {
kInterfaceOverviewButton = 0,
kStartButton = 1,
kRestoreButton = 2,
kDifficultyButton = 3,
kCreditsButton = 4,
kQuitButton = 5
};
enum {
kDemoStartButton = 0,
kDemoCreditsButton = 1,
kDemoQuitButton = 2
};
void PegasusEngine::runMainMenu() {
_sound->playSound("Sounds/Main Menu.aiff", true);
// Note down how long since the last click
uint32 lastClickTime = _system->getMillis();
int buttonSelected = 0;
drawMenu(buttonSelected);
while (!shouldQuit() && _system->getMillis() - lastClickTime < 60 * 1000) {
Common::Event event;
// Ignore events for now
while (_eventMan->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_KEYDOWN:
switch (event.kbd.keycode) {
case Common::KEYCODE_UP:
if (buttonSelected > 0) {
buttonSelected--;
drawMenu(buttonSelected);
}
break;
case Common::KEYCODE_DOWN:
if ((isDemo() && buttonSelected < 2) || (!isDemo() && buttonSelected < 5)) {
buttonSelected++;
drawMenu(buttonSelected);
}
break;
case Common::KEYCODE_LEFT:
case Common::KEYCODE_RIGHT:
if (buttonSelected == kDifficultyButton) {
_adventureMode = !_adventureMode;
drawMenu(buttonSelected);
}
break;
case Common::KEYCODE_RETURN:
if (buttonSelected != kDifficultyButton) {
drawMenuButtonSelected(buttonSelected);
setGameMode(buttonSelected);
if (_gameMode != kMainMenuMode) {
_sound->stopSound();
return;
}
drawMenu(buttonSelected);
}
break;
case Common::KEYCODE_d:
if (event.kbd.flags & Common::KBD_CTRL) {
_console->attach();
_console->onFrame();
}
break;
default:
break;
}
// Update our last press time too
lastClickTime = _system->getMillis();
break;
default:
break;
}
}
//_system->updateScreen();
_system->delayMillis(10);
}
if (shouldQuit())
return;
// Too slow! Go back and show the intro again.
_sound->stopSound();
_video->playMovie(_introDirectory + "/LilMovie.movie");
_gameMode = kIntroMode;
}
void PegasusEngine::drawMenu(int buttonSelected) {
if (isDemo()) {
_gfx->drawPict("Images/Demo/DemoMenu.pict", 0, 0, false);
} else {
_gfx->drawPict("Images/Main Menu/MainMenu.mac", 0, 0, false);
if (!_adventureMode)
_gfx->drawPict("Images/Main Menu/BtnWlk.pict", 320, 340, false);
}
drawMenuButtonHighlighted(buttonSelected);
}
// FIXME: Most of these coordinates can use tweaking
static const int kMainMenuButtonX = 152;
static const char s_mainMenuButtonSuffix[] = { 'L', 'S', 'S', 'L', 'S', 'S' };
static const int s_mainMenuButtonY[] = { 202, 252, 292, 337, 382, 422 };
static const char s_demoMainMenuButtonSuffix[] = { 'S', 'S', 'L' }; // SSL!
static const int s_demoMainMenuButtonX[] = { 38, 38, 28 };
static const int s_demoMainMenuButtonY[] = { 332, 366, 408 };
void PegasusEngine::drawMenuButtonHighlighted(int buttonSelected) {
if (isDemo())
_gfx->drawPictTransparent(Common::String("Images/Demo/Select") + s_demoMainMenuButtonSuffix[buttonSelected] + ".pict", s_demoMainMenuButtonX[buttonSelected], s_demoMainMenuButtonY[buttonSelected], _gfx->getColor(0xff, 0xff, 0xff), true);
else
_gfx->drawPictTransparent(Common::String("Images/Main Menu/Select") + s_mainMenuButtonSuffix[buttonSelected] + ".pict", kMainMenuButtonX, s_mainMenuButtonY[buttonSelected], _gfx->getColor(0xf8, 0xf8, 0xf8), true);
}
static const char *s_mainMenuButtonSelSuffix[] = { "Overvi", "Start", "Restor", "", "Credit", "Quit" };
static const char *s_demoMainMenuButtonSel[] = { "Start", "Credits", "Quit" };
static const int s_mainMenuSelButtonX[] = { 198, 210, 210, 0, 210, 210 };
static const int s_demoMainMenuSelButtonX[] = { 43, 43, 34 };
static const int s_demoMainMenuSelButtonY[] = { 338, 373, 410 };
void PegasusEngine::drawMenuButtonSelected(int buttonSelected) {
if (isDemo())
_gfx->drawPict(Common::String("Images/Demo/") + s_demoMainMenuButtonSel[buttonSelected] + ".pict", s_demoMainMenuSelButtonX[buttonSelected], s_demoMainMenuSelButtonY[buttonSelected], false);
else
_gfx->drawPict(Common::String("Images/Main Menu/pb") + s_mainMenuButtonSelSuffix[buttonSelected] + ".pict", s_mainMenuSelButtonX[buttonSelected], s_mainMenuButtonY[buttonSelected] + 5, false);
drawMenuButtonHighlighted(buttonSelected);
}
void PegasusEngine::setGameMode(int buttonSelected) {
if (isDemo()) {
switch (buttonSelected) {
case kDemoStartButton:
_gameMode = kMainGameMode;
break;
case kDemoCreditsButton:
_sound->stopSound();
runDemoCredits();
_sound->playSound("Sounds/Main Menu.aiff", true);
break;
case kDemoQuitButton:
_gameMode = kQuitMode;
break;
}
} else {
switch (buttonSelected) {
case kInterfaceOverviewButton:
_sound->stopSound();
runInterfaceOverview();
_sound->playSound("Sounds/Main Menu.aiff", true);
break;
case kStartButton:
_gameMode = kMainGameMode;
break;
case kRestoreButton:
showLoadDialog();
break;
case kCreditsButton:
_sound->stopSound();
runCredits();
_sound->playSound("Sounds/Main Menu.aiff", true);
break;
case kQuitButton:
_gameMode = kQuitMode;
break;
}
}
}
} // End of namespace Pegasus