diff options
author | Joost Peters | 2003-11-07 02:33:20 +0000 |
---|---|---|
committer | Joost Peters | 2003-11-07 02:33:20 +0000 |
commit | e9581dda6e4191aa95a35776a4ac356e61fa982c (patch) | |
tree | f60cc55cd939d2c5234f4cf982f37ac7f9f6e7ce | |
parent | 239aea0ff01b1fc3f4a62c35f0362550de2f696c (diff) | |
download | scummvm-rg350-e9581dda6e4191aa95a35776a4ac356e61fa982c.tar.gz scummvm-rg350-e9581dda6e4191aa95a35776a4ac356e61fa982c.tar.bz2 scummvm-rg350-e9581dda6e4191aa95a35776a4ac356e61fa982c.zip |
Added partial playSong() implementation
svn-id: r11179
-rw-r--r-- | queen/cutaway.cpp | 6 | ||||
-rw-r--r-- | queen/defs.h | 1 | ||||
-rw-r--r-- | queen/logic.cpp | 6 | ||||
-rw-r--r-- | queen/sound.cpp | 486 | ||||
-rw-r--r-- | queen/sound.h | 5 |
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; }; |