diff options
| author | Thierry Crozat | 2017-12-02 23:18:29 +0000 | 
|---|---|---|
| committer | Thierry Crozat | 2018-01-23 02:15:42 +0000 | 
| commit | 1b2e4f926c644d5835409c7a78d1ca8d58783c3e (patch) | |
| tree | 113d17676b902914cddd10d865fe0a91fa8ae994 | |
| parent | 0c5f02959f12b62fe4a25bf9fb8445bc4b35e8f6 (diff) | |
| download | scummvm-rg350-1b2e4f926c644d5835409c7a78d1ca8d58783c3e.tar.gz scummvm-rg350-1b2e4f926c644d5835409c7a78d1ca8d58783c3e.tar.bz2 scummvm-rg350-1b2e4f926c644d5835409c7a78d1ca8d58783c3e.zip  | |
SUPERNOVA: Implement alarm
| -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())  | 
