Skip to content

Commit

Permalink
NEVERHOOD: Implement the actual audio code
Browse files Browse the repository at this point in the history
Sounds and music play now in some scenes
(I didn't change the comments to code in all modules yet)

- Fix calcHash to ignore non-alphanumeric characters, this fixes at least
  one animation glitch (when inserting tapes into the player)
- Move SoundResource to sound.cpp
  • Loading branch information
johndoe123 authored and wjp committed May 8, 2013
1 parent 0bb70c3 commit fc0e40d
Show file tree
Hide file tree
Showing 18 changed files with 673 additions and 199 deletions.
1 change: 1 addition & 0 deletions engines/neverhood/entity.h
Expand Up @@ -27,6 +27,7 @@
#include "neverhood/neverhood.h"
#include "neverhood/gamevars.h"
#include "neverhood/graphics.h"
#include "neverhood/sound.h"

namespace Neverhood {

Expand Down
6 changes: 3 additions & 3 deletions engines/neverhood/gamemodule.cpp
Expand Up @@ -298,9 +298,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
void GameModule::startup() {
// TODO: Displaying of error text probably not needed in ScummVM
// createModule(1500, 0); // Logos and intro video //Real
#if 0
#if 1
_vm->gameState().sceneNum = 0;
createModule(1200, -1);
createModule(1400, -1);
#endif
#if 0
_vm->gameState().sceneNum = 0;
Expand Down Expand Up @@ -339,7 +339,7 @@ void GameModule::startup() {
_vm->gameState().sceneNum = 8;
createModule(2600, -1);
#endif
#if 1
#if 0
_vm->gameState().which = 0;
_vm->gameState().sceneNum = 1;
createModule(2700, -1);
Expand Down
20 changes: 10 additions & 10 deletions engines/neverhood/klayman.cpp
Expand Up @@ -60,7 +60,7 @@ static const KlaymanIdleTableItem klaymanTable4[] = {
Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
_counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0),
_counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
_tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
_status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false),
_flagFA(false), _ladderStatus(0), _pathPoints(NULL), _resourceHandle(-1), _soundFlag(false) {

Expand Down Expand Up @@ -2119,24 +2119,24 @@ void Klayman::cbLeverReleasedEvent() {
void Klayman::stInsertDisk() {
if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertDisk))) {
_status2 = 2;
_counter2 = 0;
_tapesToInsert = 0;
for (uint32 i = 0; i < 20; i++) {
if (getSubVar(0x02038314, i)) {
setSubVar(0x02720344, i, 1);
setSubVar(0x02038314, i, 0);
_counter2++;
_tapesToInsert++;
}
}
if (_counter2 == 0) {
gotoState(NULL);
if (_tapesToInsert == 0) {
GotoState(NULL);
gotoNextStateExt();
} else {
startAnimation(0xD8C8D100, 0, -1);
SetUpdateHandler(&Klayman::update);
SetSpriteUpdate(&Klayman::spriteUpdate41F250);
SetMessageHandler(&Klayman::hmInsertDisk);
_acceptInput = false;
_counter2--;
_tapesToInsert--;
}
}
}
Expand All @@ -2145,12 +2145,12 @@ uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam &param, Entity *
switch (messageNum) {
case 0x100D:
if (param.asInteger() == 0x06040580) {
if (_counter2 == 0) {
// TODO: Calc calcHash value somewhere else
if (_tapesToInsert == 0) {
// TODO: Calc calcHash value somewhere else
nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
}
} else if (_counter2 != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
_counter2--;
} else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
_tapesToInsert--;
startAnimationByHash(0xD8C8D100, 0x01084280, 0);
} else if (param.asInteger() == 0x062A1510) {
_soundResource1.play(0x41688704);
Expand Down
2 changes: 1 addition & 1 deletion engines/neverhood/klayman.h
Expand Up @@ -185,7 +185,7 @@ class Klayman : public AnimatedSprite {
int16 _counter, _counterMax;
int16 _counter3, _counter3Max;
int16 _counter1;
int16 _counter2;
int16 _tapesToInsert;
bool _flagF6;
bool _isLeverDown;
bool _isWalkingOpenDoorNotified;
Expand Down
20 changes: 10 additions & 10 deletions engines/neverhood/module1000.cpp
Expand Up @@ -31,8 +31,8 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)

_musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144;

// TODO SoundMan_addMusic(0x03294419, 0x061880C6);
// TODO SoundMan_addMusic(0x03294419, _musicFileHash);
_vm->_soundMan->addMusic(0x03294419, 0x061880C6);
_vm->_soundMan->addMusic(0x03294419, _musicFileHash);

if (which < 0) {
createScene(_vm->gameState().sceneNum, -1);
Expand All @@ -45,32 +45,32 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
}

Module1000::~Module1000() {
// TODO SoundMan_deleteMusicGroup(0x03294419);
_vm->_soundMan->deleteMusicGroup(0x03294419);
}

void Module1000::createScene(int sceneNum, int which) {
debug("Module1000::createScene(%d, %d)", sceneNum, which);
_vm->gameState().sceneNum = sceneNum;
switch (_vm->gameState().sceneNum) {
case 0:
// TODO SoundMan_startMusic(0x061880C6, 0, 0, 1);
_vm->_soundMan->startMusic(0x061880C6, 0, 0);
_childObject = new Scene1001(_vm, this, which);
break;
case 1:
// TODO SoundMan_startMusic(0x061880C6, 0, 0, 1);
_vm->_soundMan->startMusic(0x061880C6, 0, 0);
_childObject = new Scene1002(_vm, this, which);
break;
case 2:
// TODO SoundMan_startMusic(0x061880C6, 0, 0);
_vm->_soundMan->startMusic(0x061880C6, 0, 0);
_childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00);
break;
case 3:
// TODO SoundMan_stopMusic(0x061880C6, 0, 2);
_vm->_soundMan->stopMusic(0x061880C6, 0, 2);
_childObject = new Scene1004(_vm, this, which);
break;
case 4:
// TODO SoundMan_stopMusic(0x061880C6, 0, 0);
// TODO SoundMan_startMusic(_musicFileHash, 0, 0, 1);
_vm->_soundMan->stopMusic(0x061880C6, 0, 0);
_vm->_soundMan->startMusic(_musicFileHash, 0, 0);
_childObject = new Scene1005(_vm, this, which);
break;
}
Expand Down Expand Up @@ -105,7 +105,7 @@ void Module1000::updateScene() {
createScene(1, 2);
break;
case 4:
// TODO SoundMan_stopMusic(_musicFileHash, 0, 1);
_vm->_soundMan->stopMusic(_musicFileHash, 0, 1);
createScene(3, 1);
break;
}
Expand Down
45 changes: 25 additions & 20 deletions engines/neverhood/module1100.cpp
Expand Up @@ -22,6 +22,7 @@

#include "neverhood/module1100.h"
#include "neverhood/gamemodule.h"
#include "neverhood/navigationscene.h"

namespace Neverhood {

Expand All @@ -36,16 +37,16 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
createScene(9, 3);
}

// TODO SoundMan_addSoundList(0x2C818, dword_4B85B0, true);
// TODO SoundMan_addSoundList(0x0002C818, dword_4B85B0, true);
// TODO SoundMan_setSoundListParams(dword_4B85B0, true, 50, 600, 20, 250);
// TODO SoundMan_setSoundParams(0x74E01054, false, 100, 200, 10, 20);
// TODO SoundMan_setSoundVolume(0x74E01054, 60);
// TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
_vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20);
_vm->_soundMan->setSoundVolume(0x74E01054, 60);
_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);

}

Module1100::~Module1100() {
// TODO SoundMan_deleteGroup(0x2C818);
_vm->_soundMan->deleteGroup(0x0002C818);
}

void Module1100::createScene(int sceneNum, int which) {
Expand Down Expand Up @@ -86,19 +87,19 @@ void Module1100::createScene(int sceneNum, int which) {
createSmackerScene(0x04180007, true, false, false);
break;
case 6:
// TODO SoundMan_deleteSoundGroup(0x2C818);
_vm->_soundMan->deleteSoundGroup(0x0002C818);
createSmackerScene(kSmackerFileHashList06, true, true, false);
break;
case 7:
// TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0);
_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
createSmackerScene(kSmackerFileHashList07, true, true, false);
break;
case 8:
_childObject = new Scene1109(_vm, this, which);
break;
case 1002:
_countdown = 40;
// TODO SoundMan_setTwoSoundsPlayFlag(true);
_vm->_soundMan->setTwoSoundsPlayFlag(true);
createSmackerScene(0x00012211, true, true, false);
break;
}
Expand All @@ -111,17 +112,17 @@ void Module1100::updateScene() {
switch (_vm->gameState().sceneNum) {
case 0:
_countdown = 0;
// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
// TODO SoundMan_setSoundVolume(0x48498E46, 65);
// TODO SoundMan_setSoundVolume(0x50399F64, 65);
_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
_vm->_soundMan->setSoundVolume(0x48498E46, 65);
_vm->_soundMan->setSoundVolume(0x50399F64, 65);
if (_moduleResult == 0) {
createScene(1, 0);
} else if (_moduleResult == 1) {
createScene(8, 0);
}
break;
case 1:
// TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
if (getGlobalVar(0x0C0288F4)) {
if (_moduleResult == 0) {
createScene(6, -1);
Expand All @@ -137,7 +138,7 @@ void Module1100::updateScene() {
}
break;
case 2:
// TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0);
_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
if (_navigationAreaType == 3) {
createScene(7, -1);
} else if (_moduleResult == 1) {
Expand All @@ -161,16 +162,19 @@ void Module1100::updateScene() {
}
break;
case 5:
_vm->_soundMan->setTwoSoundsPlayFlag(false);
if (getGlobalVar(0x610210B7)) {
createScene(3, 0);
} else {
createScene(4, 0);
}
break;
case 6:
_vm->_soundMan->setTwoSoundsPlayFlag(false);
leaveModule(1);
break;
case 7:
_vm->_soundMan->setTwoSoundsPlayFlag(false);
createScene(2, 2);
break;
case 8:
Expand All @@ -181,8 +185,9 @@ void Module1100::updateScene() {
}
break;
case 1002:
_vm->_soundMan->setTwoSoundsPlayFlag(false);
_countdown = 0;
// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64, 0);
_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
createScene(1, 1);
break;
}
Expand All @@ -191,7 +196,7 @@ void Module1100::updateScene() {
case 0:
#if 0 // TODO
if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
SoundMan_playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64);
SoundMan_setSoundVolume(0x48498E46, 65);
SoundMan_setSoundVolume(0x50399F64, 65);
}
Expand All @@ -200,21 +205,21 @@ void Module1100::updateScene() {
case 1:
#if 0 // TODO
if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
SoundMan_playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F);
}
#endif
break;
case 2:
// TODO SoundMan_setSoundParams(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0);
_vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->getSoundFlag1(), 0, 0, 0, 0);
break;
case 5:
case 6:
case 7:
case 1002:
if (_countdown != 0 && (--_countdown == 0)) {
// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
// TODO SoundMan_setSoundVolume(0x48498E46, 65);
// TODO SoundMan_setSoundVolume(0x50399F64, 65);
_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
_vm->_soundMan->setSoundVolume(0x48498E46, 65);
_vm->_soundMan->setSoundVolume(0x50399F64, 65);
}
break;
}
Expand Down
27 changes: 12 additions & 15 deletions engines/neverhood/module1200.cpp
Expand Up @@ -39,12 +39,12 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
createScene(0, 0);
}

// TODO SoundMan_addMusic(0x00478311, 0x62222CAE);
// TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1);
_vm->_soundMan->addMusic(0x00478311, 0x62222CAE);
_vm->_soundMan->startMusic(0x62222CAE, 0, 0);
}

Module1200::~Module1200() {
// TODO SoundMan_deleteMusicGroup(0x00478311);
_vm->_soundMan->deleteMusicGroup(0x00478311);
}

void Module1200::createScene(int sceneNum, int which) {
Expand All @@ -58,7 +58,7 @@ void Module1200::createScene(int sceneNum, int which) {
_childObject = new Scene1202(_vm, this, which);
break;
case 2:
// TODO SoundMan_stopMusic(0x62222CAE, 0, 0);
_vm->_soundMan->stopMusic(0x62222CAE, 0, 0);
createSmackerScene(0x31890001, true, true, false);
setGlobalVar(0x2A02C07B, 1);
break;
Expand Down Expand Up @@ -87,7 +87,7 @@ void Module1200::updateScene() {
createScene(0, 1);
break;
case 2:
// TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1);
_vm->_soundMan->startMusic(0x62222CAE, 0, 0);
createScene(0, 3);
break;
}
Expand Down Expand Up @@ -371,7 +371,7 @@ AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sp
}

AsScene1201TntMan::~AsScene1201TntMan() {
// TODO SoundMan_deleteSoundGroup(0x01D00560);
_vm->_soundMan->deleteSoundGroup(0x01D00560);
}

uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
Expand Down Expand Up @@ -426,8 +426,8 @@ void AsScene1201TntMan::sub40CD60() {
}

void AsScene1201TntMan::sub40CD90() {
// TODO SoundMan_addSound(0x01D00560, 0x4B044624, true);
// TODO SoundMan_playSoundLooping(0x4B044624);
_vm->_soundMan->addSound(0x01D00560, 0x4B044624);
_vm->_soundMan->playSoundLooping(0x4B044624);
_flag = true;
startAnimation(0x85084190, 0, -1);
SetMessageHandler(&AsScene1201TntMan::handleMessage);
Expand All @@ -447,16 +447,16 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
}

Class465::~Class465() {
// TODO SoundMan_deleteSoundGroup(0x041080A4);
_vm->_soundMan->deleteSoundGroup(0x041080A4);
}

void Class465::update() {
AnimatedSprite::update();
if (getGlobalVar(0x20A0C516)) {
setVisible(true);
SetUpdateHandler(&AnimatedSprite::update);
// TODO SoundMan_addSound(0x041080A4, 0x460A1050, true);
// TODO SoundMan_playSoundLooping(0x460A1050);
_vm->_soundMan->addSound(0x041080A4, 0x460A1050);
_vm->_soundMan->playSoundLooping(0x460A1050);
}
}

Expand Down Expand Up @@ -1227,10 +1227,7 @@ bool Scene1202::isSolved() {
}

void Scene1202::doPaletteEffect() {
#if 0 // TODO
Palette2 *palette2 = (Palette2*)_palette;
palette2->startFadeToPalette(24);
#endif
// TODO
}

} // End of namespace Neverhood

0 comments on commit fc0e40d

Please sign in to comment.