diff options
author | Peter Kohaut | 2017-08-24 23:43:47 +0200 |
---|---|---|
committer | Peter Kohaut | 2017-08-24 23:43:47 +0200 |
commit | 0da18320af79b6ca8a47248442d106674b5ab860 (patch) | |
tree | 504d769edcf92fc4cbceddfbcdda038ecc040ced /engines/bladerunner/bladerunner.cpp | |
parent | c9b4089ccb0b60389446e07f7f9421e3a7180129 (diff) | |
download | scummvm-rg350-0da18320af79b6ca8a47248442d106674b5ab860.tar.gz scummvm-rg350-0da18320af79b6ca8a47248442d106674b5ab860.tar.bz2 scummvm-rg350-0da18320af79b6ca8a47248442d106674b5ab860.zip |
BLADERUNNER: Added audio mixer & various fixes
Audio mixer is supporting fading and pan animation
Added support for skipping speech by pressing Return
Added proper support for ambient sounds
Added more code to the dialogue menu
Added tooltips to the Spinner
Fixed calculation of volume and pan of walk steps
Code cleanup & formatting
Diffstat (limited to 'engines/bladerunner/bladerunner.cpp')
-rw-r--r-- | engines/bladerunner/bladerunner.cpp | 125 |
1 files changed, 78 insertions, 47 deletions
diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp index a3ac82df0e..7fe3f9ed2e 100644 --- a/engines/bladerunner/bladerunner.cpp +++ b/engines/bladerunner/bladerunner.cpp @@ -25,6 +25,7 @@ #include "bladerunner/actor.h" #include "bladerunner/adq.h" #include "bladerunner/ambient_sounds.h" +#include "bladerunner/audio_mixer.h" #include "bladerunner/audio_player.h" #include "bladerunner/audio_speech.h" #include "bladerunner/chapters.h" @@ -42,6 +43,7 @@ #include "bladerunner/mouse.h" #include "bladerunner/outtake.h" #include "bladerunner/obstacles.h" +#include "bladerunner/regions.h" #include "bladerunner/scene.h" #include "bladerunner/scene_objects.h" #include "bladerunner/script/init.h" @@ -52,6 +54,7 @@ #include "bladerunner/slice_animations.h" #include "bladerunner/slice_renderer.h" #include "bladerunner/spinner.h" +#include "bladerunner/suspects_database.h" #include "bladerunner/text_resource.h" #include "bladerunner/vqa_decoder.h" #include "bladerunner/waypoints.h" @@ -65,7 +68,7 @@ #include "engines/util.h" #include "graphics/pixelformat.h" -#include "suspects_database.h" + namespace BladeRunner { @@ -207,7 +210,7 @@ bool BladeRunnerEngine::startup(bool hasSavegames) { _items = new Items(this); - // Setup sound output + _audioMixer = new AudioMixer(this); _audioPlayer = new AudioPlayer(this); @@ -290,7 +293,6 @@ bool BladeRunnerEngine::startup(bool hasSavegames) { // TODO: KIA - // TODO: Spinner Interface _spinner = new Spinner(this); _elevator = new Elevator(this); @@ -436,7 +438,7 @@ void BladeRunnerEngine::shutdown() { delete _audioPlayer; - // Shutdown sound output + delete _audioMixer; if (isArchiveOpen("MUSIC.MIX")) closeArchive("MUSIC.MIX"); @@ -485,7 +487,8 @@ void BladeRunnerEngine::shutdown() { // TODO: Delete Elevators - // TODO: Delete Spinner Interface + delete _spinner; + _spinner = nullptr; // TODO: Delete KIA @@ -586,9 +589,15 @@ void BladeRunnerEngine::gameTick() { if (_gameIsRunning && _windowIsActive) { // TODO: Only run if not in Kia, script, nor AI - _settings->openNewScene(); + if (!_sceneScript->IsInsideScript() && !_aiScripts->IsInsideScript()) { + _settings->openNewScene(); + } // TODO: Autosave + + //probably not needed, this version of tick is just loading data from buffer + //_audioMixer->tick(); + // TODO: Kia if (_spinner->isOpen()) { @@ -664,14 +673,13 @@ void BladeRunnerEngine::gameTick() { if (_dialogueMenu->isVisible()) { _dialogueMenu->tick(p.x, p.y); - _dialogueMenu->draw(); + _dialogueMenu->draw(_surfaceGame); } _mouse->tick(p.x, p.y); _mouse->draw(_surfaceGame, p.x, p.y); // TODO: Process AUD - // TODO: Footstep sound if (_walkSoundId >= 0) { const char *name = _gameInfo->getSfxTrack(_walkSoundId); @@ -824,21 +832,41 @@ void BladeRunnerEngine::handleEvents() { Common::EventManager *eventMan = _system->getEventManager(); while (eventMan->pollEvent(event)) { switch (event.type) { + case Common::EVENT_KEYUP: + handleKeyUp(event); + break; + case Common::EVENT_KEYDOWN: + handleKeyDown(event); + break; + case Common::EVENT_LBUTTONUP: + handleMouseAction(event.mouse.x, event.mouse.y, true, false); + break; + case Common::EVENT_RBUTTONUP: + case Common::EVENT_MBUTTONUP: + handleMouseAction(event.mouse.x, event.mouse.y, false, false); + break; case Common::EVENT_LBUTTONDOWN: + handleMouseAction(event.mouse.x, event.mouse.y, true, true); + break; case Common::EVENT_RBUTTONDOWN: - case Common::EVENT_LBUTTONUP: - case Common::EVENT_RBUTTONUP: { - bool buttonLeft = event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP; - bool buttonDown = event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_RBUTTONDOWN; - - handleMouseAction(event.mouse.x, event.mouse.y, buttonLeft, buttonDown); - } + case Common::EVENT_MBUTTONDOWN: + handleMouseAction(event.mouse.x, event.mouse.y, false, true); + break; default: - ; + ; // nothing to do } } } +void BladeRunnerEngine::handleKeyUp(Common::Event &event) { + if (event.kbd.keycode == Common::KEYCODE_RETURN) { + _speechSkipped = true; + } +} + +void BladeRunnerEngine::handleKeyDown(Common::Event &event) { +} + void BladeRunnerEngine::handleMouseAction(int x, int y, bool buttonLeft, bool buttonDown) { if (!playerHasControl() || _mouse->isDisabled()) return; @@ -868,40 +896,42 @@ void BladeRunnerEngine::handleMouseAction(int x, int y, bool buttonLeft, bool bu return; } - Vector3 mousePosition = _mouse->getXYZ(x, y); + if (buttonLeft && !buttonDown) { + Vector3 mousePosition = _mouse->getXYZ(x, y); - int isClickable; - int isObstacle; - int isTarget; + int isClickable; + int isObstacle; + int isTarget; - int sceneObjectId = _sceneObjects->findByXYZ(&isClickable, &isObstacle, &isTarget, mousePosition.x, mousePosition.y, mousePosition.z, 1, 0, 1); - int exitIndex = _scene->_exits->getRegionAtXY(x, y); + int sceneObjectId = _sceneObjects->findByXYZ(&isClickable, &isObstacle, &isTarget, mousePosition.x, mousePosition.y, mousePosition.z, true, false, true); + int exitIndex = _scene->_exits->getRegionAtXY(x, y); - if ((sceneObjectId < 0 || sceneObjectId > 73) && exitIndex >= 0) { - handleMouseClickExit(x, y, exitIndex); - return; - } + if ((sceneObjectId < 0 || sceneObjectId > 73) && exitIndex >= 0) { + handleMouseClickExit(x, y, exitIndex); + return; + } - int regionIndex = _scene->_regions->getRegionAtXY(x, y); - if (regionIndex >= 0) { - handleMouseClickRegion(x, y, regionIndex); - return; - } + int regionIndex = _scene->_regions->getRegionAtXY(x, y); + if (regionIndex >= 0) { + handleMouseClickRegion(x, y, regionIndex); + return; + } - if (sceneObjectId == -1) { - bool isRunning; - _playerActor->loopWalkToXYZ(mousePosition, 0, false, false, false, &isRunning); - debug("Clicked on nothing %f, %f, %f", mousePosition.x, mousePosition.y, mousePosition.z); - return; - } else if (sceneObjectId >= 0 && sceneObjectId <= 73) { - handleMouseClickActor(x, y, sceneObjectId); - return; - } else if (sceneObjectId >= 74 && sceneObjectId <= 197) { - handleMouseClickItem(x, y, sceneObjectId - 74); - return; - } else if (sceneObjectId >= 198 && sceneObjectId <= 293) { - handleMouseClick3DObject(x, y, sceneObjectId - 198, isClickable, isTarget); - return; + if (sceneObjectId == -1) { + bool isRunning; + _playerActor->loopWalkToXYZ(mousePosition, 0, false, false, false, &isRunning); + debug("Clicked on nothing %f, %f, %f", mousePosition.x, mousePosition.y, mousePosition.z); + return; + } else if (sceneObjectId >= 0 && sceneObjectId <= 73) { + handleMouseClickActor(x, y, sceneObjectId); + return; + } else if (sceneObjectId >= 74 && sceneObjectId <= 197) { + handleMouseClickItem(x, y, sceneObjectId - 74); + return; + } else if (sceneObjectId >= 198 && sceneObjectId <= 293) { + handleMouseClick3DObject(x, y, sceneObjectId - 198, isClickable, isTarget); + return; + } } } @@ -939,8 +969,9 @@ void BladeRunnerEngine::gameWaitForActive() { } void BladeRunnerEngine::loopActorSpeaking() { - if (!_audioSpeech->isPlaying()) + if (!_audioSpeech->isPlaying()) { return; + } playerLosesControl(); @@ -1019,7 +1050,7 @@ Common::SeekableReadStream *BladeRunnerEngine::getResourceStream(const Common::S } debug("getResource: Resource %s not found.", name.c_str()); - return 0; + return nullptr; } bool BladeRunnerEngine::playerHasControl() { |