aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/supernova2/ms2_def.h4
-rw-r--r--engines/supernova2/resman.cpp4
-rw-r--r--engines/supernova2/resman.h2
-rw-r--r--engines/supernova2/sound.h3
-rw-r--r--engines/supernova2/state.cpp77
-rw-r--r--engines/supernova2/state.h6
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;