aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruruk2014-05-24 10:47:07 +0200
committeruruk2014-05-24 10:47:07 +0200
commit3c86aa288b532ddf9370fdcf33f144b43ffab5cc (patch)
tree6b73bfa08858187439b70b923fdacae4c30e05c0
parent4cf5c28fee6d71277a7ca2bea5663aa12e387a68 (diff)
downloadscummvm-rg350-3c86aa288b532ddf9370fdcf33f144b43ffab5cc.tar.gz
scummvm-rg350-3c86aa288b532ddf9370fdcf33f144b43ffab5cc.tar.bz2
scummvm-rg350-3c86aa288b532ddf9370fdcf33f144b43ffab5cc.zip
CGE2: Implement snSound().
Rework the whole Fx class during the process. The intro animation is working now.
-rw-r--r--engines/cge2/cge2.h2
-rw-r--r--engines/cge2/snail.cpp20
-rw-r--r--engines/cge2/sound.cpp74
-rw-r--r--engines/cge2/sound.h13
4 files changed, 41 insertions, 68 deletions
diff --git a/engines/cge2/cge2.h b/engines/cge2/cge2.h
index 8e45ba3ba7..d40d417ae8 100644
--- a/engines/cge2/cge2.h
+++ b/engines/cge2/cge2.h
@@ -173,7 +173,7 @@ public:
void snLight(int val);
void snWalk(Sprite *spr, int val);
void snReach(Sprite *spr, int val);
- void snSound(Sprite *spr, int val, int cnt);
+ void snSound(Sprite *spr, int wav);
void snRoom(Sprite *spr, int val);
void snGhost(Bitmap *bmp);
diff --git a/engines/cge2/snail.cpp b/engines/cge2/snail.cpp
index edbc78c7ad..3de42ddfc0 100644
--- a/engines/cge2/snail.cpp
+++ b/engines/cge2/snail.cpp
@@ -29,6 +29,7 @@
#include "cge2/fileio.h"
#include "cge2/hero.h"
#include "cge2/text.h"
+#include "cge2/sound.h"
namespace CGE2 {
@@ -284,7 +285,7 @@ void CommandHandler::runCommand() {
_vm->snReach(spr, tailCmd._val);
break;
case kCmdSound:
- _vm->snSound(spr, tailCmd._val, _count);
+ _vm->snSound(spr, tailCmd._val);
_count = 1;
break;
case kCmdMap:
@@ -462,8 +463,21 @@ void CGE2Engine::snReach(Sprite *spr, int val) {
warning("STUB: CGE2Engine::snReach()");
}
-void CGE2Engine::snSound(Sprite *spr, int val, int cnt) {
- warning("STUB: CGE2Engine::snSound()");
+void CGE2Engine::snSound(Sprite *spr, int wav) {
+ if (wav == -1)
+ _sound->stop();
+ else {
+ if (_sound->_smpinf._counter && wav < 20)
+ return;
+ if (_commandStat._wait && ((wav & 255) > 80))
+ return;
+
+ _commandStat._ref[1] = wav;
+ _commandStat._ref[0] = !_fx->exist(_commandStat._ref[1]);
+ _sound->play(_fx->load(_commandStat._ref[1], _commandStat._ref[0]),
+ (spr) ? (spr->_pos2D.x / (kScrWidth / 16)) : 8);
+ }
+
}
void CGE2Engine::snRoom(Sprite *spr, int val) {
diff --git a/engines/cge2/sound.cpp b/engines/cge2/sound.cpp
index a3e866f05f..9f5ec2bb6c 100644
--- a/engines/cge2/sound.cpp
+++ b/engines/cge2/sound.cpp
@@ -61,7 +61,8 @@ void Sound::close() {
void Sound::open() {
setRepeat(1);
- play((*_vm->_fx)[30000], 8);
+ warning("STUB: Sound::open()");
+ play(_vm->_fx->load(99, 99));
}
void Sound::setRepeat(int16 count) {
@@ -111,60 +112,37 @@ void Sound::sndDigiStop(SmpInfo *PSmpInfo) {
}
Fx::Fx(CGE2Engine *vm, int size) : _current(NULL), _vm(vm) {
- _cache = new Handler[size];
- for (_size = 0; _size < size; _size++) {
- _cache[_size]._ref = 0;
- _cache[_size]._wav = NULL;
- }
}
Fx::~Fx() {
clear();
- delete[] _cache;
}
void Fx::clear() {
- for (Handler *p = _cache, *q = p + _size; p < q; p++) {
- if (p->_ref) {
- p->_ref = 0;
- delete p->_wav;
- p->_wav = NULL;
- }
- }
+ if (_current)
+ delete _current;
_current = NULL;
}
-int Fx::find(int ref) {
- int i = 0;
- for (Handler *p = _cache, *q = p + _size; p < q; p++) {
- if (p->_ref == ref)
- break;
- else
- ++i;
- }
- return i;
+Common::String Fx::name(int ref, int sub) {
+ char name[] = "%.2dfx%.2d.WAV\0";
+ char subn[] = "%.2dfx%.2d?.WAV\0";
+ char *p = (sub) ? subn : name;
+ Common::String filename = Common::String::format(p, ref >> 8, ref & 0xFF);
+ if (sub)
+ filename.setChar('@' + sub, 6);
+ return filename;
}
-void Fx::name(int ref, int sub) {
- warning("STUB: Fx::name()");
+bool Fx::exist(int ref, int sub) {
+ return _vm->_resman->exist(name(ref, sub).c_str());
}
-DataCk *Fx::load(int idx, int ref) {
- char filename[12];
- warning("TODO: Implement Fx::load() with the use of Fx::name() properly in paralell with Snail! It just won't work this way.");
- sprintf(filename, "FX%05d.WAV", ref);
-
- EncryptedStream file(_vm, filename);
- DataCk *wav = loadWave(&file);
- if (wav) {
- Handler *p = &_cache[idx];
- delete p->_wav;
- p->_wav = wav;
- p->_ref = ref;
- } else {
- warning("Unable to load %s", filename);
- }
- return wav;
+DataCk *Fx::load(int ref, int sub) {
+ Common::String filename = name(ref, sub);
+ EncryptedStream file(_vm, filename.c_str());
+ clear();
+ return (_current = loadWave(&file));
}
DataCk *Fx::loadWave(EncryptedStream *file) {
@@ -178,20 +156,6 @@ DataCk *Fx::loadWave(EncryptedStream *file) {
return new DataCk(data, file->size());
}
-DataCk *Fx::operator[](int ref) {
- int i;
- if ((i = find(ref)) < _size)
- _current = _cache[i]._wav;
- else {
- if ((i = find(0)) >= _size) {
- clear();
- i = 0;
- }
- _current = load(i, ref);
- }
- return _current;
-}
-
MusicPlayer::MusicPlayer(CGE2Engine *vm) : _vm(vm) {
_data = NULL;
_isGM = false;
diff --git a/engines/cge2/sound.h b/engines/cge2/sound.h
index c488c3fbba..6fa2b2a553 100644
--- a/engines/cge2/sound.h
+++ b/engines/cge2/sound.h
@@ -72,7 +72,7 @@ public:
~Sound();
void open();
void close();
- void play(DataCk *wav, int pan);
+ void play(DataCk *wav, int pan = 8);
int16 getRepeat();
void setRepeat(int16 count);
void stop();
@@ -88,23 +88,18 @@ private:
class Fx {
CGE2Engine *_vm;
- struct Handler {
- int _ref;
- DataCk *_wav;
- } *_cache;
int _size;
- DataCk *load(int idx, int ref);
DataCk *loadWave(EncryptedStream *file);
- int find(int ref);
+ Common::String name(int ref, int sub);
public:
DataCk *_current;
Fx(CGE2Engine *vm, int size);
~Fx();
void clear();
- void name(int ref, int sub);
- DataCk *operator[](int ref);
+ bool exist(int ref, int sub = 0);
+ DataCk *load(int ref, int sub = 0);
};
class MusicPlayer: public Audio::MidiPlayer {