diff options
-rw-r--r-- | engines/supernova2/ms2_def.h | 4 | ||||
-rw-r--r-- | engines/supernova2/resman.cpp | 4 | ||||
-rw-r--r-- | engines/supernova2/resman.h | 2 | ||||
-rw-r--r-- | engines/supernova2/sound.h | 3 | ||||
-rw-r--r-- | engines/supernova2/state.cpp | 77 | ||||
-rw-r--r-- | engines/supernova2/state.h | 6 |
6 files changed, 92 insertions, 4 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h index ba7133997c..40ce6d7289 100644 --- a/engines/supernova2/ms2_def.h +++ b/engines/supernova2/ms2_def.h @@ -164,8 +164,8 @@ kString170, kStringToothbrush, kString172, kString173, kString174, kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal, kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet, kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD, -kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kString194, -kString195, kString196, kString197, kString198, kString199, +kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD, +kStringChipEmpty, kStringListeningToCD, kStringNoChip, kStringTipsy, kString199, kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth, kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater, kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole, diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp index b3c0e11dae..b4becd80a7 100644 --- a/engines/supernova2/resman.cpp +++ b/engines/supernova2/resman.cpp @@ -122,6 +122,7 @@ void ResourceManager::initSoundFiles() { } _musicIntroBuffer.reset(convertToMod("ms2_data.052")); + _musicMadMonkeysBuffer.reset(convertToMod("ms2_data.056")); _musicOutroBuffer.reset(convertToMod("ms2_data.049")); } @@ -171,6 +172,9 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) { case kMusicIntro: _musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get())); return _musicIntro.get(); + case kMusicMadMonkeys: + _musicMadMonkeys.reset(Audio::makeProtrackerStream(_musicMadMonkeysBuffer.get())); + return _musicMadMonkeys.get(); case kMusicOutro: _musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get())); return _musicOutro.get(); diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h index 16e237eadb..325cfb20d8 100644 --- a/engines/supernova2/resman.h +++ b/engines/supernova2/resman.h @@ -63,8 +63,10 @@ private: private: Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples]; Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer; + Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer; Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer; Common::ScopedPtr<Audio::AudioStream> _musicIntro; + Common::ScopedPtr<Audio::AudioStream> _musicMadMonkeys; Common::ScopedPtr<Audio::AudioStream> _musicOutro; int _audioRate; MS2Image _images[kNumImageFiles]; diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h index 877f3fa992..2bbc982586 100644 --- a/engines/supernova2/sound.h +++ b/engines/supernova2/sound.h @@ -42,7 +42,8 @@ enum AudioId { enum MusicId { kMusicIntro = 52, - kMusicOutro = 56 + kMusicMadMonkeys = 56, + kMusicOutro = 55 }; class Sound { diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index c60b5048d4..db26601a50 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -41,6 +41,8 @@ bool GameManager::serialize(Common::WriteStream *out) { out->writeByte(_state._poleMagnet); out->writeByte(_state._admission); out->writeByte(_state._tipsy); + out->writeUint32LE(_state._eventTime); + out->writeSint32LE(_state._eventCallback); // Inventory out->writeSint32LE(_inventory.getSize()); @@ -72,6 +74,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) { _state._poleMagnet = in->readByte(); _state._admission = in->readByte(); _state._tipsy = in->readByte(); + _state._eventTime = in->readUint32LE(); + _state._eventCallback = (EventFunction)in->readSint32LE(); _vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money)); _oldTime = g_system->getMillis(); @@ -336,6 +340,8 @@ void GameManager::initState() { _state._poleMagnet = false; _state._admission = 0; _state._tipsy = false; + _state._eventTime = kMaxTimerValue; + _state._eventCallback = kNoFn; } void GameManager::initRooms() { @@ -459,6 +465,24 @@ void GameManager::updateEvents() { if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0) _currentRoom->animation(); + if (_state._eventCallback != kNoFn && g_system->getMillis() >= _state._eventTime) { + _vm->_allowLoadGame = false; + _vm->_allowSaveGame = false; + _state._eventTime = kMaxTimerValue; + EventFunction fn = _state._eventCallback; + _state._eventCallback = kNoFn; + switch (fn) { + case kNoFn: + break; + case kSoberFn: + sober(); + break; + } + _vm->_allowLoadGame = true; + _vm->_allowSaveGame = true; + return; + } + _mouseClicked = false; _keyPressed = false; Common::Event event; @@ -1220,7 +1244,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { default: _vm->renderMessage(kStringCDNotInserted); } - } else if (verb == ACTION_OPEN && Object::combine(obj1, obj2, DISCMAN, PLAYER)) { + } else if (verb == ACTION_OPEN && obj1._id == PLAYER) { switch (_state._admission) { case 1: _state._admission = 0; @@ -1235,11 +1259,56 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { } } else if (verb == ACTION_OPEN && obj1._id == DISCMAN) { _vm->renderMessage(kStringWhatFor); + } else if (verb == ACTION_PRESS && obj1._id == DISCMAN) { + _vm->renderMessage(kStringMMCD); + playCD(); + } else if (verb == ACTION_PRESS && obj1._id == PLAYER) { + switch (_state._admission) { + case 1: + _vm->renderMessage(kStringChipEmpty); + break; + case 2: + _vm->renderMessage(kStringListeningToCD); + playCD(); + break; + default: + _vm->renderMessage(kStringNoChip); + } + } else if ((verb == ACTION_OPEN || verb == ACTION_USE) && + obj1._id == BOTTLE && (obj1._type & CARRIED)) { + _vm->renderMessage(kStringTipsy); + _state._tipsy = true; + _state._eventTime = g_system->getMillis() + 60000; + _state._eventCallback = kSoberFn; + } else if (verb == ACTION_LOOK && obj1._id == MUSCARD) { + _vm->setCurrentImage(30); + _vm->renderImage(0); + //karte_an = true + waitOnInput(100000); + //karte_an = false + _vm->removeMessage(); + _vm->renderRoom(*_currentRoom); + drawMapExits(); + drawInventory(); + drawStatus(); + drawCommandBox(); } else return false; return true; } +void GameManager::playCD() { + CursorMan.showMouse(false); + _vm->playSound(kMusicMadMonkeys); + Common::KeyCode k = Common::KEYCODE_INVALID; + while(_vm->_sound->isPlaying()) + if (waitOnInput(1, k)) + break; + _vm->_sound->stop(); + _vm->removeMessage(); + CursorMan.showMouse(true); +} + void GameManager::handleInput() { bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]); if (!validCommand) @@ -1541,5 +1610,11 @@ void GameManager::playerTakeOut() { o->_section = 0; takeObject(*o); } + +void GameManager::sober() +{ + _state._tipsy = false; +} + } diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h index 3d8b650f06..32037fd5f7 100644 --- a/engines/supernova2/state.h +++ b/engines/supernova2/state.h @@ -33,6 +33,8 @@ namespace Supernova2 { const int32 kMaxTimerValue = 0x7FFFFFFF; +enum EventFunction { kNoFn, kSoberFn}; + struct GameState { int16 _money; bool _addressKnown; @@ -40,6 +42,8 @@ struct GameState { bool _poleMagnet; char _admission; bool _tipsy; + EventFunction _eventCallback; + uint32 _eventTime; }; class Inventory { @@ -197,6 +201,8 @@ public: void taxiUnknownDestination(); void taxiPayment(int price, int destination); void playerTakeOut(); + void sober(); + void playCD(); private: int _prevImgId; |