aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThierry Crozat2017-12-02 23:18:29 +0000
committerThierry Crozat2018-01-23 02:15:42 +0000
commit1b2e4f926c644d5835409c7a78d1ca8d58783c3e (patch)
tree113d17676b902914cddd10d865fe0a91fa8ae994
parent0c5f02959f12b62fe4a25bf9fb8445bc4b35e8f6 (diff)
downloadscummvm-rg350-1b2e4f926c644d5835409c7a78d1ca8d58783c3e.tar.gz
scummvm-rg350-1b2e4f926c644d5835409c7a78d1ca8d58783c3e.tar.bz2
scummvm-rg350-1b2e4f926c644d5835409c7a78d1ca8d58783c3e.zip
SUPERNOVA: Implement alarm
-rw-r--r--devtools/create_supernova/gametext.h1
-rw-r--r--engines/supernova/msn_def.h2
-rw-r--r--engines/supernova/state.cpp60
-rw-r--r--engines/supernova/state.h2
-rw-r--r--engines/supernova/supernova.cpp6
-rw-r--r--engines/supernova/supernova.h10
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())