SUPERNOVA2: Add sound to all rooms currently coded

This commit is contained in:
Jaromir Wysoglad 2019-06-03 10:56:24 +02:00 committed by Thierry Crozat
parent b9c528425a
commit 63ca424ac3
10 changed files with 218 additions and 45 deletions

View File

@ -8,6 +8,7 @@ MODULE_OBJS := \
rooms.o \
screen.o \
console.o \
sound.o \
supernova2.o
MODULE_DIRS += \

View File

@ -42,30 +42,20 @@ struct AudioInfo {
int _offsetEnd;
};
//static Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
static Common::MemoryReadStream *convertToMod(const char *filename, int version = 2);
/*static const AudioInfo audioInfo[kAudioNumSamples] = {
{44, 0, -1},
{45, 0, -1},
{46, 0, 2510},
{46, 2510, 4020},
{46, 4020, -1},
{47, 0, 24010},
{47, 24010, -1},
{48, 0, 2510},
{48, 2510, 10520},
{48, 10520, 13530},
{48, 13530, -1},
{50, 0, 12786},
{50, 12786, -1},
{51, 0, -1},
static const AudioInfo audioInfo[kAudioNumSamples] = {
{55, 18230, -1},
{47, 0, 16010},
{47, 16010, -1},
{49, 8010, -1},
{49, 0, 8010},
{52, 0, -1},
{53, 0, -1},
{54, 0, 8010},
{54, 8010, 24020},
{54, 24020, 30030},
{54, 30030, 31040},
{54, 31040, -1}
};*/
{54, 0, -1},
{55, 0, -1},
{56, 0, -1},
};
static const byte mouseNormal[64] = {
0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
@ -94,12 +84,11 @@ static const byte mouseWait[64] = {
ResourceManager::ResourceManager()
: _audioRate(11931) {
//initSoundFiles();
initSoundFiles();
initGraphics();
}
//TODO
/*void ResourceManager::initSoundFiles() {
void ResourceManager::initSoundFiles() {
// Sound
// Note:
// - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
@ -109,7 +98,7 @@ ResourceManager::ResourceManager()
Common::File file;
for (int i = 0; i < kAudioNumSamples; ++i) {
if (!file.open(Common::String::format("msn_data.%03d", audioInfo[i]._filenumber))) {
if (!file.open(Common::String::format("ms2_data.%03d", audioInfo[i]._filenumber))) {
error("File %s could not be read!", file.getName());
}
@ -132,9 +121,9 @@ ResourceManager::ResourceManager()
streamFlag, DisposeAfterUse::YES));
}
_musicIntroBuffer.reset(convertToMod("msn_data.052"));
_musicOutroBuffer.reset(convertToMod("msn_data.049"));
}*/
_musicIntroBuffer.reset(convertToMod("ms2_data.052"));
_musicOutroBuffer.reset(convertToMod("ms2_data.049"));
}
void ResourceManager::initGraphics() {
Screen::initPalette();
@ -170,8 +159,7 @@ void ResourceManager::initImages() {
}
}
//TODO
/*Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
Audio::SeekableAudioStream *stream = _soundSamples[index].get();
stream->rewind();
@ -189,7 +177,7 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
default:
error("Invalid music constant in playAudio()");
}
}*/
}
const MS2Image *ResourceManager::getImage(int filenumber) const {
if (filenumber < 47)
@ -209,10 +197,8 @@ const byte *ResourceManager::getImage(CursorId id) const {
}
}
//TODO
/*
static Common::MemoryReadStream *convertToMod(const char *filename, int version) {
// MSN format
// MS2 format
struct {
uint16 seg;
uint16 start;
@ -396,6 +382,6 @@ static Common::MemoryReadStream *convertToMod(const char *filename, int version)
return new Common::MemoryReadStream(buffer.getData(), buffer.size(), DisposeAfterUse::YES);
}
*/
}

View File

@ -27,7 +27,7 @@
#include "common/ptr.h"
#include "supernova2/graphics.h"
//#include "supernova/sound.h"
#include "supernova2/sound.h"
namespace Common {
@ -49,8 +49,8 @@ public:
public:
ResourceManager();
//Audio::SeekableAudioStream *getSoundStream(AudioId index);
//Audio::AudioStream *getSoundStream(MusicId index);
Audio::SeekableAudioStream *getSoundStream(AudioId index);
Audio::AudioStream *getSoundStream(MusicId index);
const MS2Image *getImage(int filenumber) const;
const byte *getImage(CursorId id) const;
@ -61,11 +61,11 @@ private:
void initImages();
private:
//Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
//Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
//Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
//Common::ScopedPtr<Audio::AudioStream> _musicIntro;
//Common::ScopedPtr<Audio::AudioStream> _musicOutro;
Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
Common::ScopedPtr<Audio::AudioStream> _musicIntro;
Common::ScopedPtr<Audio::AudioStream> _musicOutro;
int _audioRate;
MS2Image _images[kNumImageFiles];
byte _cursorNormal[256];

View File

@ -258,6 +258,7 @@ void Intro::titleScreen() {
const Common::String title1 = "V1.02";
_vm->_screen->renderText(title1, 295, 190, 3);
_vm->playSound(kMusicIntro);
Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
while (!_vm->shouldQuit()) {
_gm->updateEvents();
@ -267,6 +268,7 @@ void Intro::titleScreen() {
g_system->updateScreen();
g_system->delayMillis(_vm->_delay);
}
_vm->stopSound();
_vm->paletteFadeOut();
CursorMan.showMouse(true);
}
@ -408,8 +410,10 @@ bool Intro::tvDialogue() {
_gm->wait(3);
_vm->renderImage(i);
}
_vm->playSound(kAudioIntroDing);
_gm->wait(30);
_vm->renderImage(11);
_vm->playSound(kAudioIntroDing);
_gm->wait(60);
_vm->_system->fillScreen(kColorBlack);
@ -673,6 +677,7 @@ bool Street::interact(Action verb, Object &obj1, Object &obj2) {
else {
_vm->renderMessage(kStringSawPole);
_gm->takeObject(*getObject(3));
_vm->playSound(kAudioSuccess);
}
}
else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {

View File

@ -0,0 +1,65 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "audio/audiostream.h"
#include "audio/mixer.h"
#include "audio/decoders/raw.h"
#include "audio/mods/protracker.h"
#include "common/system.h"
#include "supernova2/resman.h"
#include "supernova2/sound.h"
#include "supernova2/supernova2.h"
namespace Supernova2 {
Sound::Sound(Audio::Mixer *mixer, ResourceManager *resMan)
: _mixer(mixer)
, _resMan(resMan) {
}
void Sound::play(AudioId index) {
Audio::AudioStream *stream = _resMan->getSoundStream(index);
stop();
_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, stream,
-1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
}
void Sound::play(MusicId index) {
Audio::AudioStream *stream = _resMan->getSoundStream(index);
stop();
_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, stream,
-1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
}
bool Sound::isPlaying() {
return _mixer->isSoundHandleActive(_soundHandle);
}
void Sound::stop() {
if (_mixer->isSoundHandleActive(_soundHandle))
_mixer->stopHandle(_soundHandle);
}
}

View File

@ -0,0 +1,65 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef SUPERNOVA2_SOUND_H
#define SUPERNOVA2_SOUND_H
#include "audio/mixer.h"
namespace Supernova2 {
class Supernova2Engine;
class ResourceManager;
enum AudioId {
kAudioIntroDing,
kAudioSuccess,
kAudioTaxiOpen,
kAudioTaxiLeaving,
kAudioTaxiArriving,
kAudioNumSamples = 10 //TODO find out how many samples there are
};
enum MusicId {
kMusicIntro = 52,
kMusicOutro = 56
};
class Sound {
public:
public:
Sound(Audio::Mixer *mixer, ResourceManager *resMan);
void play(AudioId index);
void play(MusicId index);
void stop();
bool isPlaying();
private:
Audio::Mixer *_mixer;
ResourceManager *_resMan;
Audio::SoundHandle _soundHandle;
};
}
#endif

View File

@ -972,6 +972,18 @@ void GameManager::handleTime() {
_oldTime = newTime;
}
void GameManager::pauseTimer(bool pause) {
if (pause == _timerPaused)
return;
if (pause) {
_timerPaused = true;
} else {
_oldTime = g_system->getMillis();
_timerPaused = false;
}
}
int GameManager::invertSection(int section) {
if (section < 128)
section += 128;
@ -990,6 +1002,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
takeObject(*_rooms[TAXISTAND]->getObject(4));
takeObject(*_rooms[TAXISTAND]->getObject(5));
takeMoney(1);
_vm->playSound(kAudioSuccess);
}
} else if (verb == ACTION_PRESS && obj1._id == TRANSMITTER) {
if (_currentRoom == _rooms[TAXISTAND]) {
@ -997,6 +1010,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
_vm->renderImage(5);
wait(3);
_vm->renderImage(6);
_vm->playSound(kAudioTaxiOpen);
_currentRoom->getObject(0)->_type = EXIT;
drawMapExits();
}
@ -1064,6 +1078,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
case 2:
_vm->renderMessage(kStringTransferCD);
_state._admission = 2;
_vm->playSound(kAudioSuccess);
break;
default:
_vm->renderMessage(kStringCDNotInserted);
@ -1258,6 +1273,9 @@ void GameManager::taxiPayment(int price, int destination) {
Common::String t = _vm->getGameString(kStringTaxiAccelerating);
_vm->renderMessage(t);
_vm->playSound(kAudioTaxiLeaving);
while(_vm->_sound->isPlaying())
wait(1);
waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
_vm->removeMessage();
@ -1267,6 +1285,9 @@ void GameManager::taxiPayment(int price, int destination) {
Common::String t2 = _vm->getGameString(kString5MinutesLater);
_vm->renderMessage(t2);
_vm->playSound(kAudioTaxiArriving);
while(_vm->_sound->isPlaying())
wait(1);
waitOnInput((t2.size() + 20) * _vm->_textSpeed / 10);
_vm->removeMessage();

View File

@ -27,7 +27,7 @@
#include "common/rect.h"
#include "common/keyboard.h"
#include "supernova2/rooms.h"
//#include "supernova2/sound.h"
#include "supernova2/sound.h"
namespace Supernova2 {
@ -181,6 +181,7 @@ public:
void resetInputState();
void handleInput();
void handleTime();
void pauseTimer(bool pause);
void setAnimationTimer(int ticks);
int dialog(int num, byte rowLength[6], StringId text[6], int number);
void sentence(int number, bool brightness);

View File

@ -42,6 +42,7 @@
#include "gui/saveload.h"
#include "supernova2/resman.h"
#include "supernova2/sound.h"
#include "supernova2/screen.h"
#include "supernova2/supernova2.h"
#include "supernova2/state.h"
@ -77,6 +78,7 @@ Supernova2Engine::Supernova2Engine(OSystem *syst)
: Engine(syst)
, _console(nullptr)
, _gm(nullptr)
, _sound(nullptr)
, _resMan(nullptr)
, _screen(nullptr)
, _allowLoadGame(true)
@ -99,6 +101,7 @@ Supernova2Engine::~Supernova2Engine() {
delete _resMan;
delete _screen;
delete _sleepAutoSave;
delete _sound;
}
Common::Error Supernova2Engine::run() {
@ -130,6 +133,7 @@ void Supernova2Engine::init() {
error("Failed reading game strings");
_resMan = new ResourceManager();
_sound = new Sound(_mixer, _resMan);
_gm = new GameManager(this);
_screen = new Screen(this, _resMan);
_console = new Console(this, _gm);
@ -156,6 +160,12 @@ bool Supernova2Engine::hasFeature(EngineFeature f) const {
}
}
void Supernova2Engine::pauseEngineIntern(bool pause) {
_mixer->pauseAll(pause);
_gm->pauseTimer(pause);
}
Common::Error Supernova2Engine::loadGameStrings() {
Common::String cur_lang = ConfMan.get("language");
Common::String string_id("TEXT");
@ -225,6 +235,14 @@ void Supernova2Engine::setGameString(int idx, const Common::String &string) {
_gameStrings[idx] = string;
}
void Supernova2Engine::playSound(AudioId sample) {
_sound->play(sample);
}
void Supernova2Engine::playSound(MusicId index) {
_sound->play(index);
}
void Supernova2Engine::renderImage(int section) {
if (section > 128)
_gm->_currentRoom->setSectionVisible(section - 128, false);
@ -611,4 +629,8 @@ void Supernova2Engine::errorTempSave(bool saving) {
error("Unrecoverable error");
}
void Supernova2Engine::stopSound() {
_sound->stop();
}
}

View File

@ -34,6 +34,7 @@
#include "supernova2/graphics.h"
#include "supernova2/ms2_def.h"
#include "supernova2/rooms.h"
#include "supernova2/sound.h"
#include "supernova2/imageid.h"
namespace Common {
@ -50,6 +51,7 @@ namespace Supernova2 {
class GuiElement;
class ResourceManager;
class Sound;
class console;
class GameManager;
class Screen;
@ -65,9 +67,11 @@ public:
virtual Common::Error saveGameState(int slot, const Common::String &desc);
virtual bool canSaveGameStateCurrently();
virtual bool hasFeature(EngineFeature f) const;
virtual void pauseEngineIntern(bool pause);
GameManager *_gm;
Console *_console;
Sound *_sound;
ResourceManager *_resMan;
Screen *_screen;
bool _allowLoadGame;
@ -93,6 +97,8 @@ public:
void setGameString(int idx, const Common::String &string);
// forwarding calls
void playSound(AudioId sample);
void playSound(MusicId index);
void paletteFadeIn();
void paletteFadeOut();
void paletteBrightness();
@ -120,6 +126,7 @@ public:
void renderBox(int x, int y, int width, int height, byte color);
void renderBox(const GuiElement &guiElement);
void setColor63(byte value);
void stopSound();
};
}