diff options
-rw-r--r-- | devtools/create_supernova/gametext.h | 1 | ||||
-rw-r--r-- | engines/supernova/msn_def.h | 2 | ||||
-rw-r--r-- | engines/supernova/state.cpp | 60 | ||||
-rw-r--r-- | engines/supernova/state.h | 2 | ||||
-rw-r--r-- | engines/supernova/supernova.cpp | 6 | ||||
-rw-r--r-- | engines/supernova/supernova.h | 10 |
6 files changed, 77 insertions, 4 deletions
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h index 11cc6566a5..d5b6c9a293 100644 --- a/devtools/create_supernova/gametext.h +++ b/devtools/create_supernova/gametext.h @@ -814,6 +814,7 @@ const char *gameText[] = { "Horst Hummel! Von wo rufen Sie an?", // kStringTelomat19 "Hmm, keine Antwort.", // kStringTelomat20 "Passwort:", // kStringTelomat21 + "Deine Armbanduhr piepst,|die Alarmzeit ist erreicht.", // kStringAlarm NULL }; diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h index e11d117b82..597749ab7b 100644 --- a/engines/supernova/msn_def.h +++ b/engines/supernova/msn_def.h @@ -557,7 +557,7 @@ enum StringID { kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7, kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12, kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17, - kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21 + kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm }; static StringID guiCommands[] = { diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp index 19be0f6ac1..3d2679c3f6 100644 --- a/engines/supernova/state.cpp +++ b/engines/supernova/state.cpp @@ -1584,8 +1584,10 @@ void GameManager::handleTime() { int32 newTime = g_system->getMillis(); int32 delta = newTime - _oldTime; _state._time += delta; - if (_state._time > 86400000) + if (_state._time > 86400000) { _state._time -= 86400000; // 24h wrap around + _state._alarmOn = (_state._timeAlarm > _state._time); + } if (_animationTimer > delta) _animationTimer -= delta; else @@ -2300,4 +2302,60 @@ void GameManager::guard3Shot() { shot(3,2); } +void GameManager::alarm() { + if (_rooms[INTRO]->getObject(2)->hasProperty(CARRIED)) { + alarmSound(); + if (_currentRoom->getId() == GUARD) + guardShot(); + else if (_currentRoom->getId() == CORRIDOR4 || _currentRoom->getId() == CORRIDOR7) { + guardNoticed(); + _state._corridorSearch = true; + } else if (_currentRoom->getId() == GUARD3) + guard3Shot(); + else if (_currentRoom->getId() == CORRIDOR1) + busted(33); + } else { + if (_currentRoom->getId() == CORRIDOR2 || + _currentRoom->getId() == CORRIDOR4 || + _currentRoom->getId() == GUARD || + _currentRoom->getId() == CORRIDOR7 || + _currentRoom->getId() == CELL) + { + alarmSound(); + if (_currentRoom->getId() == GUARD) + guardShot(); + guardNoticed(); + if (_currentRoom->getId() == CORRIDOR4) + _state._corridorSearch = true; + } + _rooms[GUARD]->setSectionVisible(1, true); + _rooms[GUARD]->getObject(3)->_click = 255; + if (!_rooms[GUARD]->getObject(5)->hasProperty(CARRIED)) { + _rooms[GUARD]->setSectionVisible(7, true); + _rooms[GUARD]->getObject(5)->_click = 4; + } + _state._eventTime = _state._time + ticksToMsec(180); + _state._eventCallback = kGuardReturnedFn; + } +} + +void GameManager::alarmSound() { + animationOff(); + _vm->removeMessage(); + _vm->renderMessage(kStringAlarm); + + int32 end = _state._time + ticksToMsec(_timer1); + do { + _vm->playSound(kAudioAlarm); + while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle)) { + g_system->delayMillis(_vm->_delay); + _vm->updateEvents(); + g_system->updateScreen(); + } + } while (_state._time < end && !_vm->shouldQuit()); + + _vm->removeMessage(); + animationOn(); +} + } diff --git a/engines/supernova/state.h b/engines/supernova/state.h index 23d60b16b3..91ab54f49f 100644 --- a/engines/supernova/state.h +++ b/engines/supernova/state.h @@ -214,6 +214,8 @@ public: void outro(); void guardShot(); void guard3Shot(); + void alarm(); + void alarmSound(); private: int _prevImgId; diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp index 395fd781f2..6b1006aee3 100644 --- a/engines/supernova/supernova.cpp +++ b/engines/supernova/supernova.cpp @@ -213,6 +213,12 @@ void SupernovaEngine::updateEvents() { return; } + if (_gm->_state._alarmOn && _gm->_state._timeAlarm <= _gm->_state._time) { + _gm->_state._alarmOn = false; + _gm->alarm(); + return; + } + _gm->_mouseClicked = false; _gm->_keyPressed = false; while (g_system->getEventManager()->pollEvent(_event)) { diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h index d452213682..5602ce6035 100644 --- a/engines/supernova/supernova.h +++ b/engines/supernova/supernova.h @@ -156,8 +156,14 @@ public: return textWidth(text.c_str()); } void renderMessage(StringID stringId, MessagePosition position = kMessageNormal, Common::String var1 = "", Common::String var2 = "") { - //TODO : Merge the gameString and the variables, if any - renderMessage(getGameString(stringId), position); + Common::String text = getGameString(stringId); + if (!var1.empty()) { + if (!var2.empty()) + text = Common::String::format(text.c_str(), var1.c_str(), var2.c_str()); + else + text = Common::String::format(text.c_str(), var1.c_str()); + } + renderMessage(text, position); } void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal) { if (!text.empty()) |