aboutsummaryrefslogtreecommitdiff
path: root/engines/fullpipe
diff options
context:
space:
mode:
authorEugene Sandulenko2014-05-30 08:03:17 +0300
committerEugene Sandulenko2014-05-30 08:03:40 +0300
commit5a80e828e67a6a8b2dbdcbda252e673ffec910e1 (patch)
treea791ea4f6f04e51acbd125bcbb1de3292c6d8cf7 /engines/fullpipe
parentddf38aa288db1538b8ff126190029ce6e0fffc94 (diff)
downloadscummvm-rg350-5a80e828e67a6a8b2dbdcbda252e673ffec910e1.tar.gz
scummvm-rg350-5a80e828e67a6a8b2dbdcbda252e673ffec910e1.tar.bz2
scummvm-rg350-5a80e828e67a6a8b2dbdcbda252e673ffec910e1.zip
FULLPIPE: Implement Sound::setPanAndVolumeByStaticAni()
Diffstat (limited to 'engines/fullpipe')
-rw-r--r--engines/fullpipe/modal.cpp2
-rw-r--r--engines/fullpipe/sound.cpp72
2 files changed, 71 insertions, 3 deletions
diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp
index 743c220585..8981cdb8e6 100644
--- a/engines/fullpipe/modal.cpp
+++ b/engines/fullpipe/modal.cpp
@@ -1105,8 +1105,6 @@ void ModalMainMenu::updateSoundVolume(Sound *snd) {
} else {
snd->setPanAndVolume(-3500, 0);
}
-
- warning("STUB: ModalMainMenu::updateSoundVolume()");
}
void ModalMainMenu::updateSliderPos() {
diff --git a/engines/fullpipe/sound.cpp b/engines/fullpipe/sound.cpp
index ced5c75850..65c9bf84ca 100644
--- a/engines/fullpipe/sound.cpp
+++ b/engines/fullpipe/sound.cpp
@@ -27,6 +27,8 @@
#include "fullpipe/sound.h"
#include "fullpipe/ngiarchive.h"
#include "fullpipe/messages.h"
+#include "fullpipe/statics.h"
+
#include "common/memstream.h"
#include "audio/audiostream.h"
#include "audio/decoders/vorbis.h"
@@ -132,7 +134,75 @@ void Sound::updateVolume() {
}
void Sound::setPanAndVolumeByStaticAni() {
- debug(3, "STUB Sound::setPanAndVolumeByStaticAni()");
+ if (!_objectId)
+ return;
+
+ StaticANIObject *ani = g_fp->_currentScene->getStaticANIObject1ById(_objectId, -1);
+ if (!ani)
+ return;
+
+ int a, b;
+
+ if (ani->_ox >= g_fp->_sceneRect.left) {
+ int par, pan;
+
+ if (ani->_ox <= g_fp->_sceneRect.right) {
+ int dx;
+
+ if (ani->_oy <= g_fp->_sceneRect.bottom) {
+ if (ani->_oy >= g_fp->_sceneRect.top) {
+ setPanAndVolume(g_fp->_sfxVolume, 0);
+
+ return;
+ }
+ dx = g_fp->_sceneRect.top - ani->_oy;
+ } else {
+ dx = ani->_oy - g_fp->_sceneRect.bottom;
+ }
+
+ par = 0;
+
+ if (dx > 800) {
+ setPanAndVolume(-3500, 0);
+ return;
+ }
+
+ pan = -3500;
+ a = g_fp->_sfxVolume - (-3500);
+ b = 800 - dx;
+ } else {
+ int dx = ani->_ox - g_fp->_sceneRect.right;
+
+ if (dx > 800) {
+ setPanAndVolume(-3500, 0);
+ return;
+ }
+
+ pan = -3500;
+ par = dx * (-3500) / -800;
+ a = g_fp->_sfxVolume - (-3500);
+ b = 800 - dx;
+ }
+
+ int32 pp = b * a;
+
+ setPanAndVolume(pan + pp / 800, par);
+
+ return;
+ }
+
+ int dx = g_fp->_sceneRect.left - ani->_ox;
+ if (dx <= 800) {
+ int32 s = (800 - dx) * (g_fp->_sfxVolume - (-3500));
+ int32 p = -3500 + s / 800;
+
+ if (p > g_fp->_sfxVolume)
+ p = g_fp->_sfxVolume;
+
+ setPanAndVolume(p, dx * (-3500) / 800);
+ } else {
+ setPanAndVolume(-3500, 0);
+ }
}
void Sound::setPanAndVolume(int vol, int pan) {