Files
scummvm-cursorfix/engines/lastexpress/menu/menu.cpp
2026-02-02 04:50:13 +01:00

1193 lines
31 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "lastexpress/fight/fight.h"
#include "lastexpress/game/logic.h"
#include "lastexpress/game/savegame.h"
#include "lastexpress/menu/menu.h"
#include "lastexpress/menu/clock.h"
#include "lastexpress/graphics.h"
#include "lastexpress/lastexpress.h"
#include "common/config-manager.h"
namespace LastExpress {
Menu::Menu(LastExpressEngine *engine) {
_engine = engine;
if (_engine->isDemo())
_eggTimerDelta = DEMO_TIMEOUT;
}
Menu::~Menu() {
for (int i = 0; i < 8; i++) {
if (_menuSeqs[i]) {
_engine->getMemoryManager()->freeMem(_menuSeqs[i]->rawSeqData);
delete _menuSeqs[i];
_menuSeqs[i] = nullptr;
}
}
}
void Menu::doEgg(bool doSaveGame, int type, int32 time) {
if (!_isShowingMenu) {
_isShowingMenu = true;
if (_engine->isDemo())
_eggTimerDelta = DEMO_TIMEOUT;
_engine->getOtisManager()->wipeAllGSysInfo();
if (!_engine->mouseHasRightClicked()) {
if (!_engine->isDemo() && _engine->getVCR()->isVirgin(0) && _engine->getArchiveManager()->lockCD(1)) {
if (!_hasShownIntro) {
_engine->getNISManager()->doNIS("1930.NIS", 0x4000);
_engine->getMessageManager()->clearClickEvents();
_engine->mouseSetRightClicked(false);
_engine->getSoundManager()->playSoundFile("MUS001.SND", kSoundTypeIntro | kVolumeFull, 0, 0);
_engine->getNISManager()->doNIS("1931.NIS", 0x4000);
_hasShownIntro = true;
}
} else if (!_hasShownStartScreen) {
_engine->getSoundManager()->playSoundFile("MUS018.SND", kSoundTypeIntro | kVolumeFull, 0, 0);
_engine->getLogicManager()->bumpCathNode(65);
int32 delay = _engine->getSoundFrameCounter() + 60;
while (_engine->getSoundFrameCounter() < delay) {
if (_engine->mouseHasRightClicked())
break;
_engine->waitForTimer(4);
_engine->getSoundManager()->soundThread();
}
}
}
_hasShownStartScreen = true;
_engine->getVCR()->init(doSaveGame, type, time);
_engine->getSoundManager()->killAmbient();
_engine->getSoundManager()->killAllExcept(kSoundTagIntro, kSoundTagMenu, 0, 0, 0, 0, 0);
if (_engine->getLogicManager()->dialogRunning("TIMER"))
_engine->getLogicManager()->endDialog("TIMER");
_engine->getArchiveManager()->unlockCD();
_currentHotspotLink = 0;
_engine->_doShowCredits = false;
_engine->setEventTickInternal(false);
_engine->getLogicManager()->_activeItem = 0;
_moveClockHandsFlag = _engine->getClock()->statusClock();
_engine->_navigationEngineIsRunning = false;
_engine->getMessageManager()->clearEventQueue();
_engine->_cursorX = _engine->_systemEventLastMouseCoords.x;
_engine->_cursorY = _engine->_systemEventLastMouseCoords.y;
bool oldShouldRedraw = _engine->getGraphicsManager()->canDrawMouse();
_engine->getGraphicsManager()->setMouseDrawable(false);
_engine->_cursorType = 0;
_engine->getGraphicsManager()->newMouseLoc();
_engine->getGraphicsManager()->setMouseDrawable(oldShouldRedraw);
_engine->getMessageManager()->setEventHandle(kEventChannelMouse, &LastExpressEngine::eggMouseWrapper);
_engine->getMessageManager()->setEventHandle(kEventChannelTimer, &LastExpressEngine::eggTimerWrapper);
_menuSeqs[1] = _engine->getArchiveManager()->loadSeq("buttns.seq", 15, 0);
_menuSeqs[0] = _engine->getArchiveManager()->loadSeq("helpnewr.seq", 15, 0);
switchEggs(_engine->_currentGameFileColorId);
updateEgg();
_engine->getMessageManager()->setEventHandle(kEventChannelMouse, &LastExpressEngine::eggMouseWrapper);
_engine->getMessageManager()->setEventHandle(kEventChannelTimer, &LastExpressEngine::eggTimerWrapper);
}
}
void Menu::endEgg() {
_engine->getMessageManager()->setEventHandle(kEventChannelMouse, &LastExpressEngine::nodeStepMouseWrapper);
_engine->getMessageManager()->setEventHandle(kEventChannelTimer, &LastExpressEngine::nodeStepTimerWrapper);
eggFree();
_engine->getVCR()->free();
_isShowingMenu = false;
}
void Menu::eggFree() {
for (int i = 0; i < 8; i++) {
_engine->getSpriteManager()->destroySprite(&_startMenuFrames[i], false);
if (_menuSeqs[i]) {
_engine->getMemoryManager()->freeMem(_menuSeqs[i]->rawSeqData);
delete _menuSeqs[i];
_menuSeqs[i] = nullptr;
}
}
}
void Menu::eggMouse(Event *event) {
if (_engine->isDemo())
_eggTimerDelta = DEMO_TIMEOUT;
if (_engine->getGraphicsManager()->canDrawMouse()) {
bool redrawMouse = true;
_engine->getGraphicsManager()->setMouseDrawable(false);
_engine->getGraphicsManager()->burstMouseArea(false); // The original updated the screen, we don't to avoid flickering...
_engine->_cursorX = event->x;
_engine->_cursorY = event->y;
_eggCurrentMouseFlags = (event->flags & kMouseFlagLeftButton) != 0;
_engine->_cursorType = 0;
if (_engine->_doShowCredits) {
if ((event->flags & kMouseFlagRightDown) != 0) {
setSprite(7, -1, true);
_engine->_doShowCredits = false;
}
if ((event->flags & kMouseFlagLeftDown) != 0) {
if (_eggCreditsIndex == _menuSeqs[7]->numFrames - 1) {
setSprite(7, -1, true);
_engine->_doShowCredits = false;
} else {
_eggCreditsIndex++;
setSprite(7, _eggCreditsIndex, true);
}
}
} else {
uint8 location = 0;
Link *foundLink = nullptr;
for (Link *i = _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].link; i; i = i->next) {
if (_engine->getLogicManager()->pointIn(_engine->_cursorX, _engine->_cursorY, i) && i->location >= location) {
location = i->location;
foundLink = i;
}
}
if (foundLink != _currentHotspotLink || (event->flags & kMouseFlagLeftDown) != 0 || (event->flags & kMouseFlagLeftUp) != 0) {
_currentHotspotLink = foundLink;
if ((event->flags & kMouseFlagLeftUp) != 0 && !_moveClockHandsFlag && _engine->getClock()->statusClock())
_engine->getVCR()->stop();
if (foundLink) {
redrawMouse = eggCursorAction(foundLink->action, event->flags);
_engine->mouseSetRightClicked(false);
_engine->mouseSetLeftClicked(false);
} else {
clearSprites();
}
}
}
if (redrawMouse) {
_engine->getGraphicsManager()->setMouseDrawable(true);
_engine->getGraphicsManager()->newMouseLoc();
_engine->getGraphicsManager()->burstMouseArea();
}
}
}
void Menu::eggTimer(Event *event) {
_engine->setEventTickInternal(false);
if (_engine->getClock()->statusClock()) {
_engine->getClock()->tickClock();
} else if (_moveClockHandsFlag) {
_moveClockHandsFlag = false;
}
if (!--_eggTimerDelta) {
if (_engine->isDemo()) {
endEgg();
if (!_engine->demoEnding(false))
_engine->getSaveManager()->removeSavegame(_engine->_savegameNames[_engine->_currentGameFileColorId]);
doEgg(false, 0, 0);
} else {
updateEgg();
_eggTimerDelta = 15;
}
}
}
void Menu::clearSprites() {
_currentHotspotLink = 0;
for (int i = 0; i < 8; i++)
setSprite(i, -1, false);
_engine->getSpriteManager()->drawCycle();
}
void Menu::updateEgg() {
if (_isShowingMenu && _engine->getGraphicsManager()->canDrawMouse() && !_engine->_doShowCredits) {
Link *chosenLink = nullptr;
uint16 location = 0;
for (Link *i = _engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].link; i; i = i->next) {
if (_engine->getLogicManager()->pointIn(_engine->_cursorX, _engine->_cursorY, i) && location <= i->location) {
location = i->location;
chosenLink = i;
}
}
if (chosenLink) {
eggCursorAction(chosenLink->action, _eggCurrentMouseFlags);
} else {
clearSprites();
}
}
}
bool Menu::eggCursorAction(int8 action, int8 flags) {
switch (action) {
case kMenuActionCredits:
if (_engine->getClock()->statusClock()) {
clearSprites();
return true;
}
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(1, 6, true);
setSprite(0, -1, true);
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
clearSprites();
_engine->_doShowCredits = true;
_eggCreditsIndex = 0;
setSprite(7, 0, true);
return true;
} else {
if ((flags & kMouseFlagLeftUp) != 0)
return true;
setSprite(1, 5, true);
setSprite(0, 32, true);
return true;
}
case kMenuActionQuit:
setSprite(0, 12, true);
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(2, 11, true);
if (!ConfMan.getBool("confirm_exit")) {
_engine->getSoundManager()->killAllSlots();
_engine->getSoundManager()->soundThread();
}
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
while (_engine->getLogicManager()->dialogRunning("LIB046")) {
_engine->getSoundManager()->soundThread();
_engine->waitForTimer(4);
}
g_system->delayMillis(334);
_engine->getGraphicsManager()->setMouseDrawable(false);
if (!ConfMan.getBool("confirm_exit")) {
endEgg();
}
Common::Event event;
event.type = Common::EVENT_QUIT;
g_system->getEventManager()->pushEvent(event);
_engine->_exitFromMenuButton = true;
if (ConfMan.getBool("confirm_exit")) {
return true;
}
} else {
setSprite(2, 10, true);
return true;
}
return false;
case kMenuActionPlayGame:
case kMenuAction4:
{
if (action == kMenuAction4) {
if (_engine->isDemo()) {
clearSprites();
return true;
}
if ((flags & kMouseFlagLeftDown) != 0)
_engine->_currentSavePoint = 0;
}
if (_engine->getClock()->statusClock()) {
clearSprites();
return true;
}
int whichCD = 1;
if (_engine->getLogicManager()->_globals[kGlobalChapter] > 1)
whichCD = (_engine->getLogicManager()->_globals[kGlobalChapter] > 3) + 2;
if (_engine->isDemo()) {
if (!_gameInNotStartedInFile) {
setSprite(1, 7, true);
if (_engine->_currentSavePoint == _engine->_lastSavePointIdInFile) {
if (_engine->getVCR()->currentEndsGame()) {
setSprite(0, 6, true);
} else {
setSprite(0, 3, true);
}
} else {
setSprite(0, 5, true);
}
}
if ((flags & kMouseFlagLeftDown) == 0)
return true;
_engine->getLogicManager()->loadTrain(whichCD);
setSprite(0, -1, true);
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
_engine->getMessageManager()->clearMessageQueue();
endEgg();
Slot *slot = _engine->getSoundManager()->_soundCache;
if (_engine->getSoundManager()->_soundCache) {
do {
if (slot->_tag == kSoundTagIntro)
break;
slot = slot->_next;
} while (slot);
if (slot)
slot->setFade(0);
}
_engine->getLogicManager()->fadeToBlack();
} else {
char path[80];
if (_engine->getArchiveManager()->isCDAvailable(whichCD, path, sizeof(path))) {
if (_gameInNotStartedInFile) {
setSprite(1, 0, true);
setSprite(0, 31, true);
} else {
setSprite(1, 7, true);
if (_engine->_lastSavePointIdInFile == _engine->_currentSavePoint) {
if (_engine->getVCR()->currentEndsGame()) {
setSprite(0, 6, true);
} else {
setSprite(0, 3, true);
}
} else {
setSprite(0, 5, true);
}
}
} else {
setSprite(1, -1, true);
setSprite(0, whichCD - 1, true);
}
if ((flags & kMouseFlagLeftDown) == 0)
return true;
if (!_engine->getArchiveManager()->lockCD(whichCD))
return true;
_engine->getLogicManager()->loadTrain(whichCD);
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getMessageManager()->clearMessageQueue();
endEgg();
if (!_engine->_currentSavePoint) {
if (!_engine->mouseHasRightClicked()) {
_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 3);
if (!_engine->mouseHasRightClicked()) {
_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 4);
if (!_engine->mouseHasRightClicked()) {
_engine->getLogicManager()->bumpCathNode(5 * _engine->_currentGameFileColorId + 5);
if (!_engine->mouseHasRightClicked()) {
Slot *slot = _engine->getSoundManager()->_soundCache;
if (_engine->getSoundManager()->_soundCache) {
do {
if (slot->_tag == kSoundTagIntro)
break;
slot = slot->_next;
} while (slot);
if (slot)
slot->setFade(0);
}
_engine->getNISManager()->doNIS("1601.NIS", 0x4000);
_engine->getLogicManager()->_doneNIS[kEventIntro] = 1;
}
}
}
}
if (!_engine->getLogicManager()->_doneNIS[kEventIntro]) {
_engine->getLogicManager()->_doneNIS[kEventIntro] = 1;
Slot *slot = _engine->getSoundManager()->_soundCache;
if (_engine->getSoundManager()->_soundCache) {
do {
if (slot->_tag == kSoundTagIntro)
break;
slot = slot->_next;
} while (slot);
if (slot)
slot->setFade(0);
_engine->getLogicManager()->fadeToBlack();
}
}
} else {
Slot *slot = _engine->getSoundManager()->_soundCache;
if (_engine->getSoundManager()->_soundCache) {
do {
if (slot->_tag == kSoundTagIntro)
break;
slot = slot->_next;
} while (slot);
if (slot)
slot->setFade(0);
_engine->getLogicManager()->fadeToBlack();
}
}
}
_engine->_navigationEngineIsRunning = true;
_engine->getVCR()->go();
if (!_isShowingMenu)
_engine->getLogicManager()->restoreIcons();
return false;
}
case kMenuActionSwitchEggs:
if (_engine->getClock()->statusClock()) {
clearSprites();
return true;
}
if (_engine->isDemo()) {
if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
return true;
setSprite(3, 0, true);
setSprite(0, 7, true);
return true;
} else {
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(3, 1, true);
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB047", -1, 0);
switchEggs(_engine->getVCR()->switchGames());
_engine->_fightSkipCounter = 0;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
setSprite(3, 0, true);
if (_gameInNotStartedInFile || _engine->_currentGameFileColorId == 5) {
setSprite(0, 25, true);
} else if (_engine->getVCR()->isVirgin(_engine->_currentGameFileColorId + 1)) {
setSprite(0, 7, true);
} else {
switch (_engine->_currentGameFileColorId) {
case 0:
setSprite(0, 26, true);
break;
case 1:
setSprite(0, 28, true);
break;
case 2:
setSprite(0, 30, true);
break;
case 3:
setSprite(0, 29, true);
break;
case 4:
setSprite(0, 27, true);
break;
default:
break;
}
}
return true;
}
case kMenuActionRewind:
if (!_engine->_currentSavePoint) {
clearSprites();
return true;
}
if (_engine->getClock()->getTimeTo() < _engine->getClock()->getTimeShowing()) {
clearSprites();
return true;
}
if ((flags & kMouseFlagLeftButton) != 0) {
if ((flags & kMouseFlagLeftDown) == 0)
return true;
if (_engine->getClock()->statusClock())
_moveClockHandsFlag = false;
setSprite(1, 2, true);
setSprite(0, -1, true);
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
_engine->getVCR()->rewind();
_moveClockHandsFlag = false;
} else {
setSprite(1, 1, true);
if ((flags & kMouseFlagLeftUp) == 0)
setSprite(0, 34, true);
}
return true;
case kMenuActionFastForward:
if (_engine->_lastSavePointIdInFile <= _engine->_currentSavePoint) {
clearSprites();
return true;
}
if (_engine->getClock()->getTimeTo() > _engine->getClock()->getTimeShowing()) {
clearSprites();
return true;
}
if ((flags & kMouseFlagLeftButton) != 0) {
if ((flags & kMouseFlagLeftDown) == 0)
return true;
if (_engine->getClock()->statusClock())
_moveClockHandsFlag = false;
setSprite(1, 4, true);
setSprite(0, -1, true);
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
_engine->getVCR()->forward();
_moveClockHandsFlag = false;
} else {
setSprite(1, 3, true);
if ((flags & kMouseFlagLeftUp) == 0)
setSprite(0, 33, true);
}
return true;
case kMenuActionGoToParis:
if (_engine->_gameTimeOfLastSavePointInFile < 1037700 || _engine->getClock()->getTimeShowing() == 1037700 || _engine->getClock()->getTimeTo() == 1037700) {
clearSprites();
return true;
}
setCity(0);
if (_engine->isDemo()) {
// Demo doesn't implement time seeking...
if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
return true;
setSprite(0, 13, true);
return true;
} else {
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getVCR()->seekToTime(1037700);
_moveClockHandsFlag = true;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
setSprite(0, 13, true);
return true;
}
case kMenuActionGoToStrasbourg:
if (_engine->_gameTimeOfLastSavePointInFile < 1490400 || _engine->getClock()->getTimeShowing() == 1490400 || _engine->getClock()->getTimeTo() == 1490400) {
clearSprites();
return true;
}
setCity(1);
if (_engine->isDemo()) {
// Demo doesn't implement time seeking...
if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
return true;
if (_engine->getClock()->getTimeShowing() <= 1490400) {
setSprite(0, 14, true);
} else {
setSprite(0, 15, true);
}
return true;
} else {
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getVCR()->seekToTime(1490400);
_moveClockHandsFlag = true;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
if (_engine->getClock()->getTimeShowing() <= 1490400) {
setSprite(0, 14, true);
} else {
setSprite(0, 15, true);
}
return true;
}
case kMenuActionGoToMunich:
if (_engine->_gameTimeOfLastSavePointInFile < 1852200 || _engine->getClock()->getTimeShowing() == 1852200 || _engine->getClock()->getTimeTo() == 1852200) {
clearSprites();
return true;
}
setCity(2);
if (_engine->isDemo()) {
// Demo doesn't implement time seeking...
if ((flags & (kMouseFlagLeftDown | kMouseFlagLeftUp)) != 0)
return true;
if (_engine->getClock()->getTimeShowing() <= 1852200) {
setSprite(0, 17, true);
} else {
setSprite(0, 16, true);
}
return true;
} else {
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getVCR()->seekToTime(1852200);
_moveClockHandsFlag = true;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
if (_engine->getClock()->getTimeShowing() <= 1852200) {
setSprite(0, 17, true);
} else {
setSprite(0, 16, true);
}
return true;
}
case kMenuActionGoToVienna:
if (_engine->isDemo()) {
clearSprites();
return true;
}
if (_engine->_gameTimeOfLastSavePointInFile < 2268000 || _engine->getClock()->getTimeShowing() == 2268000 || _engine->getClock()->getTimeTo() == 2268000) {
clearSprites();
return true;
}
setCity(3);
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getVCR()->seekToTime(2268000);
_moveClockHandsFlag = true;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
if (_engine->getClock()->getTimeShowing() <= 2268000) {
setSprite(0, 18, true);
} else {
setSprite(0, 19, true);
}
return true;
case kMenuActionGoToBudapest:
if (_engine->isDemo()) {
clearSprites();
return true;
}
if (_engine->_gameTimeOfLastSavePointInFile < 2551500 || _engine->getClock()->getTimeShowing() == 2551500 || _engine->getClock()->getTimeTo() == 2551500) {
clearSprites();
return true;
}
setCity(4);
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getVCR()->seekToTime(2551500);
_moveClockHandsFlag = true;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
if (_engine->getClock()->getTimeShowing() <= 2551500) {
setSprite(0, 21, true);
} else {
setSprite(0, 20, true);
}
return true;
case kMenuActionGoToBelgrad:
if (_engine->isDemo()) {
clearSprites();
return true;
}
if (_engine->_gameTimeOfLastSavePointInFile < 2952000 || _engine->getClock()->getTimeShowing() == 2952000 || _engine->getClock()->getTimeTo() == 2952000) {
clearSprites();
return true;
}
setCity(5);
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getVCR()->seekToTime(2952000);
_moveClockHandsFlag = true;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
if (_engine->getClock()->getTimeShowing() <= 2952000) {
setSprite(0, 22, true);
} else {
setSprite(0, 23, true);
}
return true;
case kMenuActionGoToCostantinople:
if (_engine->isDemo()) {
clearSprites();
return true;
}
if (_engine->_gameTimeOfLastSavePointInFile < 4941000 || _engine->getClock()->getTimeShowing() == 4941000 || _engine->getClock()->getTimeTo() == 4941000) {
clearSprites();
return true;
}
setCity(6);
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(0, -1, true);
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
_engine->getVCR()->seekToTime(4941000);
_moveClockHandsFlag = true;
return true;
}
if ((flags & kMouseFlagLeftUp) != 0)
return true;
setSprite(0, 24, true);
return true;
case kMenuActionVolumeDown:
{
if (_engine->getClock()->statusClock()) {
clearSprites();
return true;
}
if (_engine->getSoundManager()->getMasterVolume() <= 0) {
setSprite(2, 2, true);
setSprite(0, -1, true);
return true;
}
setSprite(0, 9, true);
if ((flags & kMouseFlagLeftDown) == 0) {
setSprite(2, 1, true);
return true;
}
setSprite(2, 0, true);
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
_engine->getSoundManager()->setMasterVolume(_engine->getSoundManager()->getMasterVolume() - 1);
_engine->getVCR()->storeSettings();
int32 delay = _engine->getSoundFrameCounter() + 15;
if (_engine->getSoundFrameCounter() + 15 < _engine->getSoundFrameCounter())
return true;
do {
_engine->getSoundManager()->soundThread();
_engine->waitForTimer(4);
} while (delay > _engine->getSoundFrameCounter());
return true;
}
case kMenuActionVolumeUp:
if (_engine->getClock()->statusClock()) {
clearSprites();
return true;
}
if (_engine->getSoundManager()->getMasterVolume() >= 7) {
setSprite(2, 2, true);
setSprite(0, -1, true);
return true;
} else {
setSprite(0, 8, true);
if ((flags & kMouseFlagLeftDown) != 0) {
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
setSprite(2, 4, true);
_engine->getSoundManager()->setMasterVolume(_engine->getSoundManager()->getMasterVolume() + 1);
_engine->getVCR()->storeSettings();
int32 delay = _engine->getSoundFrameCounter() + 15;
if (_engine->getSoundFrameCounter() >= (_engine->getSoundFrameCounter() + 15)) {
return true;
}
do {
_engine->getSoundManager()->soundThread();
_engine->waitForTimer(4);
} while (_engine->getSoundFrameCounter() < delay);
return true;
} else {
setSprite(2, 3, true);
return true;
}
}
case kMenuActionBrightnessDown:
if (_engine->getClock()->statusClock()) {
clearSprites();
return true;
}
if (_engine->getGraphicsManager()->getGammaLevel() <= 0) {
setSprite(2, 7, true);
setSprite(0, -1, true);
return true;
}
setSprite(0, 11, true);
if ((flags & kMouseFlagLeftDown) == 0) {
setSprite(2, 6, true);
return true;
}
setSprite(2, 5, true);
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
_engine->getGraphicsManager()->setGammaLevel(_engine->getGraphicsManager()->getGammaLevel() - 1);
_engine->getVCR()->storeSettings();
_engine->getArchiveManager()->loadBG(_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].sceneFilename);
for (int i = 0; i < 8; i++) {
_engine->getSpriteManager()->destroySprite(&_startMenuFrames[i], false);
if (_menuSeqs[i]) {
_engine->getMemoryManager()->freeMem(_menuSeqs[i]->rawSeqData);
delete _menuSeqs[i];
_menuSeqs[i] = nullptr;
}
}
setSprite(0, 11, false);
setSprite(2, 5, false);
_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_frontBuffer);
if (_engine->getGraphicsManager()->acquireSurface()) {
_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_frontBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), 0, 0, 640, 480);
_engine->getGraphicsManager()->unlockSurface();
}
_engine->getGraphicsManager()->burstAll();
return true;
case kMenuActionBrightnessUp:
if (_engine->getClock()->statusClock()) {
clearSprites();
return true;
} else {
if (_engine->getGraphicsManager()->getGammaLevel() >= 6) {
setSprite(2, 7, true);
setSprite(0, -1, true);
return true;
} else {
setSprite(0, 10, true);
if ((flags & kMouseFlagLeftDown) != 0) {
setSprite(2, 9, true);
if (_engine->isDemo()) {
_engine->getSoundManager()->playSoundFile("LIB046.SND", 16, 0, 0);
} else {
_engine->getLogicManager()->playDialog(0, "LIB046", -1, 0);
}
_engine->getGraphicsManager()->setGammaLevel(_engine->getGraphicsManager()->getGammaLevel() + 1);
_engine->getVCR()->storeSettings();
_engine->getArchiveManager()->loadBG(_engine->getLogicManager()->_trainData[_engine->getLogicManager()->_activeNode].sceneFilename);
for (int i = 0; i < 8; i++) {
_engine->getSpriteManager()->destroySprite(&_startMenuFrames[i], false);
if (_menuSeqs[i]) {
_engine->getMemoryManager()->freeMem(_menuSeqs[i]->rawSeqData);
delete _menuSeqs[i];
_menuSeqs[i] = nullptr;
}
}
setSprite(0, 10, false);
setSprite(2, 9, false);
_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_frontBuffer);
if (_engine->getGraphicsManager()->acquireSurface()) {
_engine->getGraphicsManager()->copy(_engine->getGraphicsManager()->_frontBuffer, (PixMap *)_engine->getGraphicsManager()->_screenSurface.getPixels(), 0, 0, 640, 480);
_engine->getGraphicsManager()->unlockSurface();
}
_engine->getGraphicsManager()->burstAll();
return true;
} else {
setSprite(2, 8, true);
return true;
}
}
}
default:
clearSprites();
return true;
}
}
void Menu::setSprite(int sequenceType, int index, bool redrawFlag) {
if (index == -1) {
_engine->getSpriteManager()->destroySprite(&_startMenuFrames[sequenceType], redrawFlag);
} else {
if (!_menuSeqs[sequenceType]) {
_menuSeqs[sequenceType] = _engine->getArchiveManager()->loadSeq(_eggButtonsSeqNames[sequenceType], 15, 0);
}
if (_menuSeqs[sequenceType]) {
if (_startMenuFrames[sequenceType] != &_menuSeqs[sequenceType]->sprites[index]) {
_engine->getSpriteManager()->destroySprite(&_startMenuFrames[sequenceType], false);
_startMenuFrames[sequenceType] = &_menuSeqs[sequenceType]->sprites[index];
_engine->getSpriteManager()->drawSprite(_startMenuFrames[sequenceType]);
if (redrawFlag) {
_engine->getSpriteManager()->drawCycle();
}
}
}
}
}
void Menu::setCity(int cityIndex) {
setSprite((_cityIndexes[cityIndex] >> 6) + 3, _cityIndexes[cityIndex] & 0x3F, true);
}
void Menu::switchEggs(int whichEgg) {
_engine->getSpriteManager()->destroySprite(&_startMenuFrames[3], false);
_engine->getSpriteManager()->drawCycleSimple(_engine->getGraphicsManager()->_frontBuffer);
if (_menuSeqs[3]) {
_engine->getMemoryManager()->freeMem(_menuSeqs[3]->rawSeqData);
delete _menuSeqs[3];
_menuSeqs[3] = nullptr;
}
_gameInNotStartedInFile = _engine->isDemo() || _engine->_gameTimeOfLastSavePointInFile < 1061100;
if (_engine->isDemo() || _engine->_gameTimeOfLastSavePointInFile >= 1061100) {
_engine->getLogicManager()->bumpCathNode((5 * whichEgg) + 1);
} else {
_engine->getLogicManager()->bumpCathNode((5 * whichEgg) + 2);
}
_engine->getGraphicsManager()->setMouseDrawable(true);
_engine->getLogicManager()->mouseStatus();
if (_engine->isDemo()) {
Common::strcpy_s(_eggButtonsSeqNames[3], "aconred.seq");
_menuSeqs[3] = _engine->getArchiveManager()->loadSeq(_eggButtonsSeqNames[3], 15, 0);
return;
}
if (_gameInNotStartedInFile && whichEgg == 0) {
return;
}
if (_gameInNotStartedInFile) {
Common::strcpy_s(_eggButtonsSeqNames[3], "aconblu3.seq");
} else {
switch (whichEgg) {
case 0:
Common::strcpy_s(_eggButtonsSeqNames[3], "aconred.seq");
break;
case 1:
Common::strcpy_s(_eggButtonsSeqNames[3], "acongren.seq");
break;
case 2:
Common::strcpy_s(_eggButtonsSeqNames[3], "aconpurp.seq");
break;
case 3:
Common::strcpy_s(_eggButtonsSeqNames[3], "aconteal.seq");
break;
case 4:
Common::strcpy_s(_eggButtonsSeqNames[3], "acongold.seq");
break;
case 5:
Common::strcpy_s(_eggButtonsSeqNames[3], "aconblu3.seq");
break;
default:
break;
}
}
_menuSeqs[3] = _engine->getArchiveManager()->loadSeq(_eggButtonsSeqNames[3], 15, 0);
}
bool Menu::isShowingMenu() {
return _isShowingMenu;
}
void Menu::setEggTimerDelta(int delta) {
_eggTimerDelta = delta;
}
int Menu::getEggTimerDelta() {
return _eggTimerDelta;
}
} // End of namespace LastExpress