Skip to content

Commit

Permalink
PEGASUS: Implement main menu
Browse files Browse the repository at this point in the history
Sound fading is not working yet, so it has been disabled in the meantime
  • Loading branch information
Matthew Hoops committed Sep 21, 2011
1 parent 46bc7e6 commit b4408d4
Show file tree
Hide file tree
Showing 5 changed files with 510 additions and 0 deletions.
36 changes: 36 additions & 0 deletions engines/pegasus/constants.h
Expand Up @@ -519,6 +519,42 @@ const tHotSpotFlags kJMPClickingSpotFlags = kClickSpotFlag |
kOpticalBiochipSpotFlag |
kAirMaskSpotFlag;

const tMM32BitID kMainMenuID = 1;
const tMM32BitID kPauseMenuID = 2;
const tMM32BitID kCreditsMenuID = 3;
const tMM32BitID kDeathMenuID = 4;

/////////////////////////////////////////////
//
// Menu commands.

const tGameMenuCommand kMenuCmdOverview = kMenuCmdNoCommand + 1;
const tGameMenuCommand kMenuCmdStartAdventure = kMenuCmdOverview + 1;
const tGameMenuCommand kMenuCmdStartWalkthrough = kMenuCmdStartAdventure + 1;
const tGameMenuCommand kMenuCmdRestore = kMenuCmdStartWalkthrough + 1;
const tGameMenuCommand kMenuCmdCredits = kMenuCmdRestore + 1;
const tGameMenuCommand kMenuCmdQuit = kMenuCmdCredits + 1;

const tGameMenuCommand kMenuCmdDeathContinue = kMenuCmdQuit + 1;

const tGameMenuCommand kMenuCmdDeathQuitDemo = kMenuCmdDeathContinue + 1;
const tGameMenuCommand kMenuCmdDeathMainMenuDemo = kMenuCmdDeathQuitDemo + 1;

const tGameMenuCommand kMenuCmdDeathRestore = kMenuCmdDeathContinue + 1;
const tGameMenuCommand kMenuCmdDeathMainMenu = kMenuCmdDeathRestore + 1;

const tGameMenuCommand kMenuCmdPauseSave = kMenuCmdDeathMainMenu + 1;
const tGameMenuCommand kMenuCmdPauseContinue = kMenuCmdPauseSave + 1;
const tGameMenuCommand kMenuCmdPauseRestore = kMenuCmdPauseContinue + 1;
const tGameMenuCommand kMenuCmdPauseQuit = kMenuCmdPauseRestore + 1;

const tGameMenuCommand kMenuCmdCreditsMainMenu = kMenuCmdPauseQuit + 1;

const tGameMenuCommand kMenuCmdCancelRestart = kMenuCmdCreditsMainMenu + 1;
const tGameMenuCommand kMenuCmdEjectRestart = kMenuCmdCancelRestart + 1;

const TimeValue kMenuButtonHiliteTime = 20;
const TimeScale kMenuButtonHiliteScale = kSixtyTicksPerSecond;

} // End of namespace Pegasus

Expand Down
331 changes: 331 additions & 0 deletions engines/pegasus/menu.cpp
Expand Up @@ -41,4 +41,335 @@ void GameMenu::restorePreviousHandler() {
InputHandler::setInputHandler(_previousHandler);
}

enum {
kMainMenuStartDemo = 0,
kMainMenuCreditsDemo,
kMainMenuQuitDemo,
kFirstSelectionDemo = kMainMenuStartDemo,
kLastSelectionDemo = kMainMenuQuitDemo,

kMainMenuOverview = 0,
kMainMenuStart,
kMainMenuRestore,
kMainMenuDifficulty,
kMainMenuCredits,
kMainMenuQuit,
kFirstSelection = kMainMenuOverview,
kLastSelection = kMainMenuQuit
};

static const tCoordType kStartLeftDemo = 44;
static const tCoordType kStartTopDemo = 336;

static const tCoordType kStartSelectLeftDemo = 40;
static const tCoordType kStartSelectTopDemo = 331;

static const tCoordType kCreditsLeftDemo = 44;
static const tCoordType kCreditsTopDemo = 372;

static const tCoordType kCreditsSelectLeftDemo = 40;
static const tCoordType kCreditsSelectTopDemo = 367;

static const tCoordType kMainMenuQuitLeftDemo = 32;
static const tCoordType kMainMenuQuitTopDemo = 412;

static const tCoordType kMainMenuQuitSelectLeftDemo = 28;
static const tCoordType kMainMenuQuitSelectTopDemo = 408;

static const tCoordType kOverviewLeft = 200;
static const tCoordType kOverviewTop = 208;

static const tCoordType kOverviewSelectLeft = 152;
static const tCoordType kOverviewSelectTop = 204;

static const tCoordType kStartLeft = 212;
static const tCoordType kStartTop = 256;

static const tCoordType kStartSelectLeft = 152;
static const tCoordType kStartSelectTop = 252;

static const tCoordType kRestoreLeft = 212;
static const tCoordType kRestoreTop = 296;

static const tCoordType kRestoreSelectLeft = 152;
static const tCoordType kRestoreSelectTop = 292;

static const tCoordType kDifficultyLeft = 320;
static const tCoordType kDifficultyTop = 340;

static const tCoordType kDifficultySelectLeft = 152;
static const tCoordType kDifficultySelectTop = 336;

static const tCoordType kCreditsLeft = 212;
static const tCoordType kCreditsTop = 388;

static const tCoordType kCreditsSelectLeft = 152;
static const tCoordType kCreditsSelectTop = 384;

static const tCoordType kMainMenuQuitLeft = 212;
static const tCoordType kMainMenuQuitTop = 428;

static const tCoordType kMainMenuQuitSelectLeft = 152;
static const tCoordType kMainMenuQuitSelectTop = 424;

// Never set the current input handler to the MainMenu.
MainMenu::MainMenu() : GameMenu(kMainMenuID), _menuBackground(0), _overviewButton(0),
_restoreButton(0), _adventureButton(0), _walkthroughButton(0), _startButton(0),
_creditsButton(0), _quitButton(0), _largeSelect(0), _smallSelect(0) {

bool isDemo = ((PegasusEngine *)g_engine)->isDemo();

if (isDemo)
_menuBackground.initFromPICTFile("Images/Demo/DemoMenu.pict");
else
_menuBackground.initFromPICTFile("Images/Main Menu/MainMenu.mac");
_menuBackground.setDisplayOrder(0);
_menuBackground.startDisplaying();
_menuBackground.show();

if (!isDemo) {
_overviewButton.initFromPICTFile("Images/Main Menu/pbOvervi.pict");
_overviewButton.setDisplayOrder(1);
_overviewButton.moveElementTo(kOverviewLeft, kOverviewTop);
_overviewButton.startDisplaying();

_restoreButton.initFromPICTFile("Images/Main Menu/pbRestor.pict");
_restoreButton.setDisplayOrder(1);
_restoreButton.moveElementTo(kRestoreLeft, kRestoreTop);
_restoreButton.startDisplaying();

_adventureButton.initFromPICTFile("Images/Main Menu/BtnAdv.pict");
_adventureButton.setDisplayOrder(1);
_adventureButton.moveElementTo(kDifficultyLeft, kDifficultyTop);
_adventureButton.startDisplaying();

_walkthroughButton.initFromPICTFile("Images/Main Menu/BtnWlk.pict");
_walkthroughButton.setDisplayOrder(1);
_walkthroughButton.moveElementTo(kDifficultyLeft, kDifficultyTop);
_walkthroughButton.startDisplaying();
}

if (isDemo)
_startButton.initFromPICTFile("Images/Demo/Start.pict");
else
_startButton.initFromPICTFile("Images/Main Menu/pbStart.pict");
_startButton.setDisplayOrder(1);
_startButton.moveElementTo(isDemo ? kStartLeftDemo : kStartLeft, isDemo ? kStartTopDemo : kStartTop);
_startButton.startDisplaying();

if (isDemo)
_creditsButton.initFromPICTFile("Images/Demo/Credits.pict");
else
_creditsButton.initFromPICTFile("Images/Main Menu/pbCredit.pict");
_creditsButton.setDisplayOrder(1);
_creditsButton.moveElementTo(isDemo ? kCreditsLeftDemo : kCreditsLeft, isDemo ? kCreditsTopDemo : kCreditsTop);
_creditsButton.startDisplaying();

if (isDemo)
_quitButton.initFromPICTFile("Images/Demo/Quit.pict");
else
_quitButton.initFromPICTFile("Images/Main Menu/pbQuit.pict");
_quitButton.setDisplayOrder(1);
_quitButton.moveElementTo(isDemo ? kMainMenuQuitLeftDemo : kMainMenuQuitLeft, isDemo ? kMainMenuQuitTopDemo : kMainMenuQuitTop);
_quitButton.startDisplaying();

if (isDemo)
_largeSelect.initFromPICTFile("Images/Demo/SelectL.pict", true);
else
_largeSelect.initFromPICTFile("Images/Main Menu/SelectL.pict", true);
_largeSelect.setDisplayOrder(1);
_largeSelect.startDisplaying();

if (isDemo)
_smallSelect.initFromPICTFile("Images/Demo/SelectS.pict", true);
else
_smallSelect.initFromPICTFile("Images/Main Menu/SelectS.pict", true);
_smallSelect.setDisplayOrder(1);
_smallSelect.startDisplaying();

_menuSelection = isDemo ? kFirstSelectionDemo : kFirstSelection;

_adventureMode = true;

//_menuLoop.attachFader(&_menuFader);
_menuLoop.initFromAIFFFile("Sounds/Main Menu.aiff");

updateDisplay();
}

MainMenu::~MainMenu() {
if (_menuLoop.isPlaying())
stopMainMenuLoop();
}

void MainMenu::startMainMenuLoop() {
FaderMoveSpec spec;

_menuLoop.loopSound();
spec.makeTwoKnotFaderSpec(30, 0, 0, 30, 255);
//_menuFader.startFaderSync(spec);
}

void MainMenu::stopMainMenuLoop() {
FaderMoveSpec spec;

spec.makeTwoKnotFaderSpec(30, 0, 255, 30, 0);
//_menuFader.startFaderSync(spec);
_menuLoop.stopSound();
}

void MainMenu::handleInput(const Input &input, const Hotspot *cursorSpot) {
PegasusEngine *vm = (PegasusEngine *)g_engine;
bool isDemo = vm->isDemo();

if (input.upButtonDown()) {
if (_menuSelection > (isDemo ? kFirstSelectionDemo : kFirstSelection)) {
_menuSelection--;
updateDisplay();
}
} else if (input.downButtonDown()) {
if (_menuSelection < (isDemo ? kLastSelectionDemo : kLastSelection)) {
_menuSelection++;
updateDisplay();
}
} else if (!isDemo && (input.leftButtonDown() || input.rightButtonDown())) {
if (_menuSelection == kMainMenuDifficulty) {
_adventureMode = !_adventureMode;
updateDisplay();
}
} else if (JMPPPInput::isMenuButtonPressInput(input)) {
if (isDemo) {
switch (_menuSelection) {
case kMainMenuCreditsDemo:
_creditsButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_creditsButton.hide();
setLastCommand(kMenuCmdCredits);
break;
case kMainMenuStartDemo:
_startButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_startButton.hide();
setLastCommand(kMenuCmdStartAdventure);
break;
case kMainMenuQuitDemo:
_quitButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_quitButton.hide();
setLastCommand(kMenuCmdQuit);
break;
}
} else {
switch (_menuSelection) {
case kMainMenuOverview:
_overviewButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_overviewButton.hide();
setLastCommand(kMenuCmdOverview);
break;
case kMainMenuRestore:
_restoreButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_restoreButton.hide();
setLastCommand(kMenuCmdRestore);
break;
case kMainMenuCredits:
_creditsButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_creditsButton.hide();
setLastCommand(kMenuCmdCredits);
break;
case kMainMenuStart:
_startButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_startButton.hide();
if (_adventureMode)
setLastCommand(kMenuCmdStartAdventure);
else
setLastCommand(kMenuCmdStartWalkthrough);
break;
case kMainMenuDifficulty:
_adventureMode = !_adventureMode;
updateDisplay();
break;
case kMainMenuQuit:
_quitButton.show();
vm->delayShell(kMenuButtonHiliteTime, kMenuButtonHiliteScale);
_quitButton.hide();
setLastCommand(kMenuCmdQuit);
break;
}
}
}

InputHandler::handleInput(input, cursorSpot);
}

void MainMenu::updateDisplay() {
PegasusEngine *vm = (PegasusEngine *)g_engine;

if (vm->isDemo()) {
switch (_menuSelection) {
case kMainMenuStartDemo:
_smallSelect.moveElementTo(kStartSelectLeftDemo, kStartSelectTopDemo);
_smallSelect.show();
_largeSelect.hide();
break;
case kMainMenuCreditsDemo:
_smallSelect.moveElementTo(kCreditsSelectLeftDemo, kCreditsSelectTopDemo);
_smallSelect.show();
_largeSelect.hide();
break;
case kMainMenuQuitDemo:
_largeSelect.moveElementTo(kMainMenuQuitSelectLeftDemo, kMainMenuQuitSelectTopDemo);
_largeSelect.show();
_smallSelect.hide();
break;
}
} else {
switch (_menuSelection) {
case kMainMenuOverview:
_largeSelect.moveElementTo(kOverviewSelectLeft, kOverviewSelectTop);
_largeSelect.show();
_smallSelect.hide();
break;
case kMainMenuRestore:
_smallSelect.moveElementTo(kRestoreSelectLeft, kRestoreSelectTop);
_smallSelect.show();
_largeSelect.hide();
break;
case kMainMenuDifficulty:
if (_adventureMode) {
_adventureButton.show();
_walkthroughButton.hide();
} else {
_walkthroughButton.show();
_adventureButton.hide();
}

_largeSelect.moveElementTo(kDifficultySelectLeft, kDifficultySelectTop);
_largeSelect.show();
_smallSelect.hide();
break;
case kMainMenuStart:
_smallSelect.moveElementTo(kStartSelectLeft, kStartSelectTop);
_smallSelect.show();
_largeSelect.hide();
break;
case kMainMenuCredits:
_smallSelect.moveElementTo(kCreditsSelectLeft, kCreditsSelectTop);
_smallSelect.show();
_largeSelect.hide();
break;
case kMainMenuQuit:
_smallSelect.moveElementTo(kMainMenuQuitSelectLeft, kMainMenuQuitSelectTop);
_smallSelect.show();
_largeSelect.hide();
break;
}

vm->resetIntroTimer();
}
}

} // End of namespace Pegasus

0 comments on commit b4408d4

Please sign in to comment.