aboutsummaryrefslogtreecommitdiff
path: root/queen
diff options
context:
space:
mode:
authorJoost Peters2003-11-07 02:33:20 +0000
committerJoost Peters2003-11-07 02:33:20 +0000
commite9581dda6e4191aa95a35776a4ac356e61fa982c (patch)
treef60cc55cd939d2c5234f4cf982f37ac7f9f6e7ce /queen
parent239aea0ff01b1fc3f4a62c35f0362550de2f696c (diff)
downloadscummvm-rg350-e9581dda6e4191aa95a35776a4ac356e61fa982c.tar.gz
scummvm-rg350-e9581dda6e4191aa95a35776a4ac356e61fa982c.tar.bz2
scummvm-rg350-e9581dda6e4191aa95a35776a4ac356e61fa982c.zip
Added partial playSong() implementation
svn-id: r11179
Diffstat (limited to 'queen')
-rw-r--r--queen/cutaway.cpp6
-rw-r--r--queen/defs.h1
-rw-r--r--queen/logic.cpp6
-rw-r--r--queen/sound.cpp486
-rw-r--r--queen/sound.h5
5 files changed, 486 insertions, 18 deletions
diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp
index d4c43a45f9..cc394468c7 100644
--- a/queen/cutaway.cpp
+++ b/queen/cutaway.cpp
@@ -1115,10 +1115,8 @@ void Cutaway::run(char *nextFilename) {
ObjectType objectType = getObjectType(object);
- if (object.song) {
- debug(0, "Should play song %i here", object.song);
- // XXX playsong(object.song);
- }
+ if (object.song)
+ _sound->playSong(object.song);
switch (objectType) {
case OBJECT_TYPE_ANIMATION:
diff --git a/queen/defs.h b/queen/defs.h
index 630addf8cc..8be1467825 100644
--- a/queen/defs.h
+++ b/queen/defs.h
@@ -75,6 +75,7 @@ enum {
};
enum {
+ ITEM_NONE = 0,
ITEM_BAT = 1,
ITEM_JOURNAL,
ITEM_JOURNAL_DEMO = 7,
diff --git a/queen/logic.cpp b/queen/logic.cpp
index 809898358e..7435145d3b 100644
--- a/queen/logic.cpp
+++ b/queen/logic.cpp
@@ -1911,8 +1911,8 @@ void Logic::inventorySetup() {
_graphics->bankLoad("objects.BBK", 14);
_inventoryItem[0] = ITEM_BAT;
_inventoryItem[1] = _resource->isDemo() ? ITEM_JOURNAL_DEMO : ITEM_JOURNAL;
- _inventoryItem[2] = 0;
- _inventoryItem[3] = 0;
+ _inventoryItem[2] = ITEM_NONE;
+ _inventoryItem[3] = ITEM_NONE;
}
void Logic::inventoryRefresh() {
@@ -1967,7 +1967,7 @@ void Logic::removeDuplicateItems() {
for (int i = 0; i < 4; i++)
for (int j = i + 1; j < 4; j++)
if (_inventoryItem[i] == _inventoryItem[j])
- _inventoryItem[j] = 0;
+ _inventoryItem[j] = ITEM_NONE;
}
uint16 Logic::numItemsInventory() const {
diff --git a/queen/sound.cpp b/queen/sound.cpp
index cb8097f11a..b756570b13 100644
--- a/queen/sound.cpp
+++ b/queen/sound.cpp
@@ -27,6 +27,7 @@
#include "queen/sound.h"
#define SB_HEADER_SIZE 110
+#define STOP_MUSIC -1
namespace Queen {
@@ -94,7 +95,7 @@ static ov_callbacks g_File_wrap = {
#endif
Sound::Sound(SoundMixer *mixer, Input *input, Resource *resource) :
- _mixer(mixer), _input(input), _resource(resource), _sfxHandle(0) {
+ _mixer(mixer), _input(input), _resource(resource), _sfxHandle(0), _lastOverride(0), _currentSong(0) {
}
Sound::~Sound() {
@@ -128,10 +129,478 @@ Sound *Sound::giveSound(SoundMixer *mixer, Input *input, Resource *resource, uin
}
}
-bool Sound::isPlaying() {
- return _sfxHandle != 0;
+void Sound::waitSfxFinished() {
+ while((volatile PlayingSoundHandle)_sfxHandle != 0)
+ _input->delay(10);
}
+void Sound::playSong(int16 songNum) {
+ if (songNum == STOP_MUSIC) {
+ //stop the music
+ //_fanfareCount = _fluteCount = 0;
+ //_oldName[0] = 0;
+ return;
+ }
+
+ // Remap some songs because there is less amiga music
+ // and we want lastoverride to work properly
+ switch(songNum) {
+ case 1:
+ case 2:
+ songNum = 39;
+ break;
+
+ case 37:
+ case 52:
+ case 196:
+ songNum = 90;
+ break;
+
+ case 38:
+ case 89:
+ songNum = 3;
+ break;
+
+ case 24:
+ case 158:
+ songNum = 117;
+ break;
+
+ case 71:
+ case 72:
+ case 73:
+ case 75:
+ songNum = 133;
+ break;
+
+ case 203:
+ songNum = 67;
+ break;
+
+ case 145:
+ songNum = 140;
+ break;
+
+ case 53:
+ case 204:
+ songNum = 44;
+ break;
+
+ case 136:
+ case 142:
+ case 179:
+ songNum = 86;
+ break;
+
+ case 101:
+ case 102:
+ case 143:
+ songNum = 188;
+ break;
+
+ case 65:
+ case 62:
+ songNum = 69;
+ break;
+
+ case 118:
+ case 119:
+ songNum = 137;
+ break;
+
+ case 130:
+ case 131:
+ songNum = 59;
+ break;
+
+ case 174:
+ case 175:
+ songNum = 57;
+ break;
+
+ case 171:
+ case 121:
+ songNum = 137;
+ break;
+
+ case 138:
+ case 170:
+ case 149:
+ songNum = 28;
+ break;
+
+ case 122:
+ case 180:
+ case 83:
+ case 98:
+ songNum = 83;
+ break;
+
+ case 20:
+ case 33:
+ songNum = 34;
+ break;
+
+ case 29:
+ case 35:
+ songNum = 36;
+ break;
+
+ case 7:
+ case 9:
+ case 10:
+ songNum = 11;
+ break;
+
+ case 110:
+ songNum = 94;
+ break;
+
+ case 111:
+ songNum = 95;
+ break;
+
+ case 30:
+ songNum = 43;
+ break;
+
+ case 76:
+ songNum = 27;
+ break;
+
+ case 194:
+ case 195:
+ songNum = 32;
+ break;
+ }
+
+ // Sound effects and volume changes exit before setting lastoverride
+ // 04-19-95 01:31pm Fix sfx bug
+ if(_lastOverride != 32 && _lastOverride != 44) {
+ switch(songNum) {
+ // Volume normal
+ case 5:
+ warning("Sound::playSong() -> alter_current_volume() not implemented yet");
+ //alter_current_volume();
+ return;
+
+ // Volume soft
+ case 15:
+ //volumecontrol(-1,(20*VOLUME)/100);
+ return;
+
+ // Volume medium
+ case 14:
+ //volumecontrol(-1,(32*VOLUME)/100);
+ return;
+
+ // Open door
+ case 25:
+ sfxPlay("116BSSSS");
+ return;
+
+ // Close door
+ case 26:
+ sfxPlay("105ASSSS");
+ return;
+
+ // Light switch
+ case 56:
+ sfxPlay("27SSSSSS");
+ return;
+
+ // Hydraulic doors open
+ case 57:
+ sfxPlay("96SSSSSS");
+ return;
+
+ // Hydraulic doors close
+ case 58:
+ sfxPlay("97SSSSSS");
+ return;
+
+ // Metallic door slams
+ case 59:
+ sfxPlay("105SSSSS");
+ return;
+
+ // Oracle rezzes in
+ case 63:
+ sfxPlay("132SSSSS");
+ return;
+
+ // Cloth slide 1
+ case 27:
+ sfxPlay("135SSSSS");
+ return;
+
+ // Splash
+ case 83:
+ sfxPlay("18SSSSSS");
+ return;
+
+ // Agression enhancer
+ case 85:
+ sfxPlay("138BSSSS");
+ return;
+
+ // Dino Ray
+ case 68:
+ sfxPlay("138SSSSS");
+ return;
+
+ // Dino transformation
+ case 140:
+ sfxPlay("55BSSSSS");
+ return;
+
+ // Experimental laser
+ case 141:
+ sfxPlay("55SSSSSS");
+ return;
+
+ // Plane hatch open
+ case 94:
+ sfxPlay("3SSSSSSS");
+ return;
+
+ // Plane hatch close
+ case 95:
+ sfxPlay("4SSSSSSS");
+ return;
+
+ // Oracle rezzes out
+ case 117:
+ sfxPlay("70SSSSSS");
+ return;
+
+ // Dino horn
+ case 124:
+ sfxPlay("103SSSSS");
+ return;
+
+ // Punch
+ case 127:
+ sfxPlay("128SSSSS");
+ return;
+
+ // Body hits ground
+ case 128:
+ sfxPlay("129SSSSS");
+ return;
+
+ // Explosion
+ case 137:
+ sfxPlay("88SSSSSS");
+ return;
+
+ // Stone door grind 1
+ case 86:
+ sfxPlay("1001SSSS");
+ return;
+
+ // Stone door grind 2
+ case 188:
+ sfxPlay("1002SSSS");
+ return;
+
+ // Cloth slide 2
+ case 28:
+ sfxPlay("1005SSSS");
+ return;
+
+ // Rattle bars
+ case 151:
+ sfxPlay("115SSSSS");
+ return;
+
+ // Door dissolves
+ case 152:
+ sfxPlay("56SSSSSS");
+ return;
+
+ // Altar slides
+ case 153:
+ sfxPlay("85SSSSSS");
+ return;
+
+ // Pull lever
+ case 166:
+ sfxPlay("1008SSSS");
+ return;
+
+ // Zap Frank
+ case 182:
+ sfxPlay("1023SSSS");
+ return;
+
+ // Splorch
+ case 69:
+ sfxPlay("137ASSSS");
+ return;
+
+ // Robot laser
+ case 70:
+ sfxPlay("61SSSSSS");
+ return;
+
+ // Pick hits stone
+ case 133:
+ sfxPlay("71SSSSSS");
+ return;
+
+ // Press button
+ case 165:
+ sfxPlay("1007SSSS");
+ return;
+ }
+ }
+
+
+ // Exit if trying to play a song that's already playing
+ // and instruments are already loaded i.e. last song wasn't -1
+ if (songNum == _lastOverride /* && oldName[0] != 0 */ )
+
+ // Play songs
+ switch(songNum) {
+ // Hotel
+ case 39:
+ //goSong("hotel",1);
+ break;
+
+ case 19:
+ //goSong("hotel",3);
+ break;
+
+ case 34:
+ //goSong("hotel",2);
+ break;
+
+ case 36:
+ //goSong("hotel",4);
+ //fanfarerestore=lastoverride;
+ //fanfarecount=60;
+ break;
+
+ // Jungle
+ case 40:
+ //goSong("jung",1);
+ //fanfarerestore=lastoverride;
+ //fanfarecount=80;
+ //flutecount=100;
+ break;
+
+ case 3:
+ //goSong("jung",2);
+ //flutecount=100;
+ break;
+
+ // Temple
+ case 54:
+ //goSong("temple",1);
+ break;
+
+ case 12:
+ //goSong("temple",2);
+ break;
+
+ case 11:
+ //goSong("temple",3);
+ break;
+
+ case 31:
+ //goSong("temple",4);
+ //fanfarerestore=lastoverride;
+ //fanfarecount=80;
+ break;
+
+ // Floda
+ case 41:
+ //goSong("floda",4);
+ //fanfarerestore=lastoverride;
+ //fanfarecount=60;
+ break;
+
+ case 13:
+ //goSong("floda",3);
+ break;
+
+ case 16:
+ //goSong("floda",1);
+ break;
+
+ case 17:
+ //goSong("floda",2);
+ break;
+
+ case 43:
+ //goSong("floda",5);
+ break;
+
+ // Prequel (End credits)
+ case 67:
+ //goSong("title",1);
+ // 05-19-95 03:24pm Removed to fix A500 Bug
+ //fanfarerestore=90;
+ //fanfarecount=550;
+ break;
+
+ // Title (Intro credits)
+ case 88:
+ //goSong("title",1);
+ break;
+
+ // Valley
+ case 90:
+ //goSong("awestruk",1);
+ break;
+
+ // Confrontation
+ case 91:
+ //goSong("'jungle'",1);
+ break;
+
+ // Frank
+ case 46:
+ //goSong("frank",1);
+ break;
+
+ // Trader Bob
+ case 6:
+ //goSong("bob",1);
+ break;
+
+ // Azura
+ case 44:
+ //goSong("azura",1);
+ break;
+
+ // Amazon Fortress
+ case 21:
+ //goSong("fort",1);
+ break;
+
+ // Rocket
+ case 32:
+ //goSong("rocket",1);
+ break;
+
+ // Robot
+ case 92:
+ //goSong("robot",1);
+ break;
+
+ // Song not handled by amiga
+ default:
+ return;
+ }
+
+
+ _lastOverride = _currentSong = songNum;
+
+}
+
+
int SBSound::playSound(byte *sound, uint32 size) {
byte flags = 0 | SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE;
return _mixer->playRaw(&_sfxHandle, sound, size, 11025, flags);
@@ -147,8 +616,7 @@ void SBSound::sfxPlay(const char *base) {
}
strcat(name, ".SB");
- while(isPlaying())
- _input->delay(10);
+ waitSfxFinished();
if (_resource->exists(name))
playSound(_resource->loadFileMalloc(name, SB_HEADER_SIZE), _resource->fileSize(name) - SB_HEADER_SIZE);
@@ -165,8 +633,7 @@ void MP3Sound::sfxPlay(const char *base) {
}
strcat(name, ".SB");
- while(isPlaying())
- _input->delay(10);
+ waitSfxFinished();
if (_resource->exists(name))
_mixer->playMP3(&_sfxHandle, _resource->giveCompressedSound(name), _resource->fileSize(name));
@@ -184,9 +651,8 @@ void OGGSound::sfxPlay(const char *base) {
}
strcat(name, ".SB");
- while(isPlaying())
- _input->delay(10);
-
+ waitSfxFinished();
+
if (_resource->exists(name)) {
OggVorbis_File *oggFile = new OggVorbis_File;
file_info *f = new file_info;
diff --git a/queen/sound.h b/queen/sound.h
index d66c2cf690..b82da9ca3a 100644
--- a/queen/sound.h
+++ b/queen/sound.h
@@ -37,13 +37,16 @@ public:
virtual ~Sound();
virtual void sfxPlay(const char *base) = 0;
static Sound *giveSound(SoundMixer *mixer, Input *input, Resource *resource, uint8 compression);
- bool isPlaying();
+ void waitSfxFinished();
+ void playSong(int16 songNum);
protected:
SoundMixer *_mixer;
Input *_input;
Resource *_resource;
+ int16 _lastOverride;
+ int16 _currentSong;
PlayingSoundHandle _sfxHandle;
};