aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorjohndoe1232011-08-02 10:56:16 +0000
committerWillem Jan Palenstijn2013-05-08 20:39:34 +0200
commit87d1f79f311f25ea434680caff508614a5c892d9 (patch)
tree846cd7a51b2d04bb09c31134dfacbdd0c3a7280e /engines
parentd88836596d4c12763332d300c0da2282e24f535d (diff)
downloadscummvm-rg350-87d1f79f311f25ea434680caff508614a5c892d9.tar.gz
scummvm-rg350-87d1f79f311f25ea434680caff508614a5c892d9.tar.bz2
scummvm-rg350-87d1f79f311f25ea434680caff508614a5c892d9.zip
NEVERHOOD: More work on Scene3009
Diffstat (limited to 'engines')
-rw-r--r--engines/neverhood/gamemodule.cpp20
-rw-r--r--engines/neverhood/gamemodule.h1
-rw-r--r--engines/neverhood/module3000.cpp487
-rw-r--r--engines/neverhood/module3000.h91
-rw-r--r--engines/neverhood/neverhood.cpp2
-rw-r--r--engines/neverhood/smackerplayer.cpp80
-rw-r--r--engines/neverhood/smackerplayer.h3
7 files changed, 483 insertions, 201 deletions
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index f280399a01..c1ee6dda15 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -45,8 +45,6 @@ GameModule::GameModule(NeverhoodEngine *vm)
SetMessageHandler(&GameModule::handleMessage);
- //startup();
-
}
GameModule::~GameModule() {
@@ -183,6 +181,16 @@ void GameModule::initScene1405Vars() {
}
+void GameModule::initScene3009Vars() {
+ if (!getSubVar(0x40050052, 0x8C9819C2)) {
+ for (int i = 0; i < 3; i++) {
+ setSubVar(0x00504B86, i, _vm->_rnd->getRandomNumber(12 - 1));
+ setSubVar(0x0A4C0A9A, i, _vm->_rnd->getRandomNumber(12 - 1));
+ }
+ setSubVar(0x40050052, 0x8C9819C2, 1);
+ }
+}
+
uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Module::handleMessage(messageNum, param, sender);
switch (messageNum) {
@@ -214,13 +222,19 @@ void GameModule::startup() {
// createModule1500(0); // Logos and intro video //Real
// createModule1000(-1);
// createModule2300(2);
- _vm->gameState().sceneNum = 8;
//createModule1200(-1);
//createModule1800(-1);
//createModule1700(-1);
//createModule1700(1);
//createModule1400(-1);
+#if 1
+ _vm->gameState().sceneNum = 8;
createModule3000(-1);
+#endif
+#if 0
+ _vm->gameState().sceneNum = 0;
+ createModule1800(-1);
+#endif
}
void GameModule::createModule1000(int which) {
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 8d5aace8e4..6290a85209 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -38,6 +38,7 @@ public:
void handleMouseMove(int16 x, int16 y);
void handleMouseDown(int16 x, int16 y);
void initScene1405Vars();
+ void initScene3009Vars();
protected:
Entity *_prevChildObject;
bool _someFlag1;
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index c82c111c82..45db8adc7e 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -21,6 +21,7 @@
*/
#include "neverhood/module3000.h"
+#include "neverhood/gamemodule.h"
#include "neverhood/navigationscene.h"
namespace Neverhood {
@@ -37,7 +38,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
- _flag = getGlobalVar(0x10938830) != 0;
+ _flag = getGlobalVar(0x10938830) != 0;
if (_flag) {
// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
@@ -196,7 +197,7 @@ void Module3000::createScene3007(int which) {
}
void Module3000::createScene3008(int which) {
- _vm->gameState().sceneNum = 6;
+ _vm->gameState().sceneNum = 7;
// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
if (!getSubVar(0x40050052, 0x089809C2)) {
setSubVar(0x40050052, 0x089809C2, 1);
@@ -208,7 +209,7 @@ void Module3000::createScene3008(int which) {
}
void Module3000::createScene3009(int which) {
- _vm->gameState().sceneNum = 7;
+ _vm->gameState().sceneNum = 8;
_childObject = new Scene3009(_vm, this, which);
SetUpdateHandler(&Module3000::updateScene3009);
}
@@ -478,6 +479,24 @@ void Module3000::updateScene3007() {
void Module3000::updateScene3009() {
_childObject->handleUpdate();
// TODO...
+ if (_moduleDone) {
+ _moduleDone = false;
+ delete _childObject;
+ _childObject = NULL;
+ _flag = getGlobalVar(0x10938830); // CHECKME
+ if (_moduleDoneStatus != 1) {
+ // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0):
+ createScene3005(1);
+ _childObject->handleUpdate();
+ } else if (getGlobalVar(0xF0402B0A)) {
+ createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false);
+ SetUpdateHandler(&Module3000::updateScene3002b);
+ } else {
+ // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0);
+ createScene3005(1);
+ _childObject->handleUpdate();
+ }
+ }
}
void Module3000::updateScene3010() {
@@ -516,7 +535,7 @@ static const uint32 kScene3009SmackerFileHashes[] = {
0x340A0049
};
-static const uint32 kScene3009VarValues[] = {
+static const uint32 kScene3009CannonLocationFileHashes[] = {
0x00000000,
0x8004001B,
0x0004001A,
@@ -534,17 +553,17 @@ static const uint32 kScene3009VarValues[] = {
0x240A1101
};
-static const uint32 kClass439FileHashes[] = {
+static const uint32 kSsScene3009SymbolEdgesFileHashes[] = {
0x618827A0,
0xB1A92322
};
-static const uint32 kClass440FileHashes[] = {
+static const uint32 kSsScene3009TargetLineFileHashes[] = {
0x4011018C,
0x15086623
};
-static const NPoint kClass524Points[] = {
+static const NPoint kAsScene3009SymbolPoints[] = {
{289, 338},
{285, 375},
{284, 419},
@@ -553,12 +572,12 @@ static const NPoint kClass524Points[] = {
{541, 372}
};
-static const uint32 kClass524FileHashes[] = {
+static const uint32 kAsScene3009SymbolFileHashes[] = {
0x24542582,
0x1CD61D96
};
-static const uint32 kClass441FileHashes1[] = {
+static const uint32 kSsScene3009SymbolArrowFileHashes1[] = {
0x24016060,
0x21216221,
0x486160A0,
@@ -573,7 +592,7 @@ static const uint32 kClass441FileHashes1[] = {
0x20212004
};
-static const uint32 kClass441FileHashes2[] = {
+static const uint32 kSsScene3009SymbolArrowFileHashes2[] = {
0x40092024,
0x01636002,
0x8071E028,
@@ -588,7 +607,7 @@ static const uint32 kClass441FileHashes2[] = {
0x28616460
};
-Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene)
+SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene)
: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene),
_flag1(false) {
@@ -607,12 +626,12 @@ Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene)
_surface->setVisible(false);
processDelta();
_needRefresh = true;
- SetUpdateHandler(&Class438::update);
- SetMessageHandler(&Class438::handleMessage);
+ SetUpdateHandler(&SsScene3009FireCannonButton::update);
+ SetMessageHandler(&SsScene3009FireCannonButton::handleMessage);
_soundResource.load(0x3901B44F);
}
-void Class438::update() {
+void SsScene3009FireCannonButton::update() {
StaticSprite::update();
if (_flag1 && !_soundResource.isPlaying()) {
_parentScene->sendMessage(0x2000, 0, this);
@@ -620,7 +639,7 @@ void Class438::update() {
}
}
-uint32 Class438::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x1011:
@@ -635,10 +654,10 @@ uint32 Class438::handleMessage(int messageNum, const MessageParam &param, Entity
return messageResult;
}
-Class439::Class439(NeverhoodEngine *vm, int index)
+SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
: StaticSprite(vm, 1400), _blinkCountdown(0) {
- _spriteResource.load2(kClass439FileHashes[index]);
+ _spriteResource.load2(kSsScene3009SymbolEdgesFileHashes[index]);
createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
_x = _spriteResource.getPosition().x;
_y = _spriteResource.getPosition().y;
@@ -652,10 +671,10 @@ Class439::Class439(NeverhoodEngine *vm, int index)
} else {
startBlinking();
}
- SetUpdateHandler(&Class439::update);
+ SetUpdateHandler(&SsScene3009SymbolEdges::update);
}
-void Class439::update() {
+void SsScene3009SymbolEdges::update() {
if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) {
if (_blinkToggle) {
_surface->setVisible(true);
@@ -668,29 +687,29 @@ void Class439::update() {
}
}
-void Class439::show() {
+void SsScene3009SymbolEdges::show() {
_surface->setVisible(true);
StaticSprite::update();
_blinkCountdown = 0;
}
-void Class439::hide() {
+void SsScene3009SymbolEdges::hide() {
_surface->setVisible(false);
StaticSprite::update();
_blinkCountdown = 0;
}
-void Class439::startBlinking() {
+void SsScene3009SymbolEdges::startBlinking() {
_surface->setVisible(true);
StaticSprite::update();
_blinkCountdown = 3;
_blinkToggle = true;
}
-Class440::Class440(NeverhoodEngine *vm, int index)
+SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index)
: StaticSprite(vm, 1400) {
- _spriteResource.load2(kClass440FileHashes[index]);
+ _spriteResource.load2(kSsScene3009TargetLineFileHashes[index]);
createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
_x = _spriteResource.getPosition().x;
_y = _spriteResource.getPosition().y;
@@ -702,7 +721,72 @@ Class440::Class440(NeverhoodEngine *vm, int index)
_needRefresh = true;
}
-Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
+void SsScene3009TargetLine::show() {
+ _surface->setVisible(true);
+ StaticSprite::update();
+}
+
+SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index)
+ : StaticSprite(vm, 1400), _soundResource(vm), _asSymbol(asSymbol),
+ _index(index), _enabled(true), _countdown(0) {
+
+ _incrDecr = _index % 2;
+
+ _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
+ createSurface(1200, 33, 31);
+ _x = _spriteResource.getPosition().x;
+ _y = _spriteResource.getPosition().y;
+ _drawRect.x = 0;
+ _drawRect.y = 0;
+ _drawRect.width = 33;
+ _drawRect.height = 31;
+ _deltaRect = _drawRect;
+ processDelta();
+ _needRefresh = true;
+ SetUpdateHandler(&SsScene3009SymbolArrow::update);
+ SetMessageHandler(&SsScene3009SymbolArrow::handleMessage);
+ _soundResource.load(0x2C852206);
+}
+
+void SsScene3009SymbolArrow::hide() {
+ _enabled = false;
+ _surface->setVisible(false);
+}
+
+void SsScene3009SymbolArrow::update() {
+ StaticSprite::update();
+ if (_countdown != 0 && (--_countdown == 0)) {
+ _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
+ _needRefresh = true;
+ _drawRect.x = 0;
+ _drawRect.y = 0;
+ _drawRect.width = _spriteResource.getDimensions().width;
+ _drawRect.height = _spriteResource.getDimensions().height;
+ }
+}
+
+uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+ switch (messageNum) {
+ case 0x1011:
+ if (_enabled && _countdown == 0) {
+ _countdown = 2;
+ _spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]);
+ _needRefresh = true;
+ _drawRect.x = 0;
+ _drawRect.y = 0;
+ _drawRect.width = _spriteResource.getDimensions().width;
+ _drawRect.height = _spriteResource.getDimensions().height;
+ _soundResource.play();
+ _asSymbol->sendMessage(0x2005, _incrDecr, this);
+ }
+ messageResult = 1;
+ break;
+ }
+ return messageResult;
+}
+
+AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
: AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
_x = 300;
@@ -712,17 +796,17 @@ Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
updatePosition();
_surface->setVisible(false);
SetUpdateHandler(&AnimatedSprite::update);
- SetMessageHandler(&Class522::handleMessage);
+ SetMessageHandler(&AsScene3009VerticalIndicator::handleMessage);
}
-void Class522::show() {
+void AsScene3009VerticalIndicator::show() {
setFileHash(0xC2463913, 0, -1);
_surface->setVisible(true);
updatePosition();
_enabled = true;
}
-uint32 Class522::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x1011:
@@ -735,13 +819,136 @@ uint32 Class522::handleMessage(int messageNum, const MessageParam &param, Entity
return messageResult;
}
-Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
- : Scene(vm, parentModule, true), _flag1(false), _flag2(false),
- _flag3(false), _flag4(false), _countdown1(1), _countdown2(1) {
+AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue)
+ : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
+
+ _x = getGlobalVar(0x9040018A) ? 533 : 92;
+ _y = 150;
+ createSurface1(0xC0C12954, 1200);
+ _needRefresh = true;
+ updatePosition();
+ _surface->setVisible(false);
+ SetUpdateHandler(&AnimatedSprite::update);
+ SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage);
+ if (varValue == 8 || varValue == 9 || varValue == 10) {
+ SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight);
+ _x = 280;
+ }
+}
+
+uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+ switch (messageNum) {
+ case 0x1011:
+ if (_enabled) {
+ _parentScene->sendMessage(0x2004, 0, this);
+ }
+ messageResult = 1;
+ break;
+ }
+ return messageResult;
+}
+
+void AsScene3009HorizontalIndicator::suMoveLeft() {
+ _x -= 6;
+ if (_x < 92) {
+ SetSpriteCallback(NULL);
+ _x = 92;
+ }
+}
+
+void AsScene3009HorizontalIndicator::suMoveRight() {
+ _x += 6;
+ if (_x > 533) {
+ SetSpriteCallback(NULL);
+ _x = 533;
+ }
+}
+
+void AsScene3009HorizontalIndicator::show() {
+ setFileHash(0xC0C12954, 0, -1);
+ _surface->setVisible(true);
+ updatePosition();
+ _enabled = true;
+}
+
+void AsScene3009HorizontalIndicator::stMoveLeft() {
+ _x = 533;
+ SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveLeft);
+}
+
+void AsScene3009HorizontalIndicator::stMoveRight() {
+ _x = 330;
+ SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight);
+}
+
+AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
+ : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) {
+
+ _symbolIndex = getSubVar(0x00000914, _index);
- _varValue = getGlobalVar(0x20580A86);
+ _x = kAsScene3009SymbolPoints[_index].x;
+ _y = kAsScene3009SymbolPoints[_index].y;
+ createSurface1(kAsScene3009SymbolFileHashes[_index / 3], 1200);
+ setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+ _newHashListIndex = _symbolIndex;
+ _needRefresh = true;
+ updatePosition();
+ SetUpdateHandler(&AnimatedSprite::update);
+ SetMessageHandler(&AsScene3009Symbol::handleMessage);
+
+ _ssArrowPrev = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 0);
+ _parentScene->addSprite(_ssArrowPrev);
+ _vm->_collisionMan->addSprite(_ssArrowPrev);
+
+ _ssArrowNext = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 1);
+ _parentScene->addSprite(_ssArrowNext);
+ _vm->_collisionMan->addSprite(_ssArrowNext);
+
+}
+
+uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+ switch (messageNum) {
+ case 0x2005:
+ if (param.asInteger()) {
+ if (_symbolIndex == 11)
+ _symbolIndex = 0;
+ else
+ _symbolIndex++;
+ } else {
+ if (_symbolIndex == 0)
+ _symbolIndex = 11;
+ else
+ _symbolIndex--;
+ }
+ setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+ _newHashListIndex = _symbolIndex;
+ setSubVar(0x00000914, _index, _symbolIndex);
+ if (_index / 3 == 0) {
+ _parentScene->sendMessage(0x2001, 0, this);
+ } else {
+ _parentScene->sendMessage(0x2003, 0, this);
+ }
+ messageResult = 1;
+ break;
+ }
+ return messageResult;
+}
+
+void AsScene3009Symbol::hide() {
+ _ssArrowPrev->hide();
+ _ssArrowNext->hide();
+}
+
+Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
+ : Scene(vm, parentModule, true), _keepVideo(false), _flag2(false),
+ /*_flag3(false), */_flag4(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) {
+
+ _cannonLocation = getGlobalVar(0x20580A86);
+ debug("_cannonLocation = %d", _cannonLocation);
- // TODO _vm->gameModule()->initScene3009Vars();
+ _vm->gameModule()->initScene3009Vars();
setGlobalVar(0xF0402B0A, 0);
_surfaceFlag = true;
@@ -750,137 +957,129 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
_background = addBackground(new DirtyBackground(_vm, 0xD000420C, 0, 0));
_palette = new Palette(_vm, 0xD000420C);
- _palette->usePalette();
_mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620));
- _class438 = addSprite(new Class438(_vm, this));
- _vm->_collisionMan->addSprite(_class438);
+ _ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this));
+ _vm->_collisionMan->addSprite(_ssFireCannonButton);
- _class522 = new Class522(_vm, this, _varValue);
- addSprite(_class522);
- _vm->_collisionMan->addSprite(_class522);
+ _asVerticalIndicator = new AsScene3009VerticalIndicator(_vm, this, _cannonLocation);
+ addSprite(_asVerticalIndicator);
+ _vm->_collisionMan->addSprite(_asVerticalIndicator);
-#if 0
- _class523 = new Class523(_vm, this, _varValue);
- addSprite(_class523);
- _vm->_collisionMan->addSprite(_class523);
-#endif
+ _asHorizontalIndicator = new AsScene3009HorizontalIndicator(_vm, this, _cannonLocation);
+ addSprite(_asHorizontalIndicator);
+ _vm->_collisionMan->addSprite(_asHorizontalIndicator);
- if (_varValue != 0 && _varValue != 8 && _varValue != 9 && _varValue != 9) {
- _flag1 = true;
+ if (_cannonLocation != 0 && _cannonLocation != 8 && _cannonLocation != 9 && _cannonLocation != 10) {
+ _keepVideo = true;
} else {
- _flag1 = false;
- if (_varValue == 0) {
-#if 0
- _class523->stMoveUp();
-#endif
+ _keepVideo = false;
+ if (_cannonLocation != 0) {
+ _asHorizontalIndicator->stMoveRight();
_flag4 = true;
}
}
- _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_varValue], false, _flag1));
+ _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_cannonLocation], false, _keepVideo));
_smackerPlayer->setDrawPos(89, 37);
+ _palette->usePalette();
addSprite(new StaticSprite(_vm, 0x8540252C, 400));
for (int i = 0; i < 2; i++) {
- _class439Array[i] = new Class439(_vm, i);
- addSprite(_class439Array[i]);
- _class440Array[i] = new Class440(_vm, i);
- addSprite(_class440Array[i]);
+ _ssSymbolEdges[i] = new SsScene3009SymbolEdges(_vm, i);
+ addSprite(_ssSymbolEdges[i]);
+ _ssTargetLines[i] = new SsScene3009TargetLine(_vm, i);
+ addSprite(_ssTargetLines[i]);
}
-#if 0
for (int i = 0; i < 6; i++) {
- _class524Array[i] = new Class524(_vm, this, i);
- addSprite(_class524Array[i]);
+ _asSymbols[i] = new AsScene3009Symbol(_vm, this, i);
+ addSprite(_asSymbols[i]);
if (i < 3)
- _varValueArray[i] = getSubVar(0x00504B86, i);
+ _correctSymbols[i] = getSubVar(0x00504B86, i);
else
- _varValueArray[i] = getSubVar(0x0A4C0A9A, i - 3);
+ _correctSymbols[i] = getSubVar(0x0A4C0A9A, i - 3);
}
-#endif
SetMessageHandler(&Scene3009::handleMessage);
SetUpdateHandler(&Scene3009::update);
+
+ // DEBUG: Set the correct code
+ for (int i = 0; i < 6; i++)
+ setSubVar(0x00000914, i, _correctSymbols[i]);
+ sendMessage(0x2003, 0, this);
+ //setGlobalVar(0x610210B7, 1);
+
}
void Scene3009::update() {
Scene::update();
- if (!_flag1 && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _varValue <= 14) {
- switch (_varValue) {
+
+ if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonLocation <= 14) {
+ switch (_cannonLocation) {
case 0:
case 14:
_smackerPlayer->open(0x340A0049, true);
_palette->usePalette();
- _flag1 = true;
+ _keepVideo = true;
break;
case 8:
_smackerPlayer->open(0x0082080D, true);
_palette->usePalette();
- _flag1 = true;
+ _keepVideo = true;
_flag4 = false;
break;
case 9:
_smackerPlayer->open(0x0282080D, true);
_palette->usePalette();
- _flag1 = true;
+ _keepVideo = true;
_flag4 = false;
break;
case 10:
_smackerPlayer->open(0x0882080D, true);
_palette->usePalette();
- _flag1 = true;
+ _keepVideo = true;
_flag4 = false;
break;
case 11:
case 12:
case 13:
if (_flag2) {
- if (_varValue == 11)
+ if (_cannonLocation == 11)
_smackerPlayer->open(0x110A000F, false);
- else if (_varValue == 12)
+ else if (_cannonLocation == 12)
_smackerPlayer->open(0x500B004F, false);
- else if (_varValue == 13)
+ else if (_cannonLocation == 13)
_smackerPlayer->open(0x100B010E, false);
_palette->usePalette();
_flag2 = false;
-#if 0
- _class523->stMoveDown();
-#endif
+ _asHorizontalIndicator->stMoveLeft();
} else {
- sub462DC0();
+ playExtVideo();
}
break;
}
}
- if (_countdown1 != 0 && (--_countdown1 == 0) && sub462E10()) {
-#if 0
+ if (_lockSymbolsPart1Countdown != 0 && (--_lockSymbolsPart1Countdown == 0) && isSymbolsPart1Solved()) {
for (int i = 0; i < 3; i++)
- _class524Array[i]->hide();
-#endif
+ _asSymbols[i]->hide();
if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
- _class439Array[0]->show();
- _class440Array[0]->getSurface()->setVisible(true);
- // TODO _class440Array->StaticSprite_update
- _class522->show();
+ _ssSymbolEdges[0]->show();
+ _ssTargetLines[0]->show();
+ _asVerticalIndicator->show();
}
}
- if (_countdown2 != 0 && (--_countdown2 == 0) && sub462E50()) {
-#if 0
- for (int i = 0; i < 6; i++)
- _class524Array[i]->hide();
-#endif
+ if (_lockSymbolsPart2Countdown != 0 && (--_lockSymbolsPart2Countdown == 0) && isSymbolsPart2Solved()) {
+ for (int i = 3; i < 6; i++)
+ _asSymbols[i]->hide();
if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
- _class439Array[1]->show();
- _class440Array[1]->getSurface()->setVisible(true);
-#if 0
- // TODO _class440Array[1]->StaticSprite_update
- _class523->show();
-#endif
+ _ssSymbolEdges[1]->show();
+ _ssTargetLines[1]->show();
+ _asHorizontalIndicator->show();
}
}
@@ -902,104 +1101,104 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
case 0x2000:
if (!getGlobalVar(0x000809C2)) {
if (!getGlobalVar(0x10938830)) {
- _varValue = 1;
+ _cannonLocation = 1;
setGlobalVar(0x10938830, 1);
} else {
- _varValue = 2;
+ _cannonLocation = 2;
}
} else if (!getGlobalVar(0x9040018A)) {
- _varValue = 3;
+ _cannonLocation = 3;
} else if (!getGlobalVar(0x610210B7)) {
- _varValue = 4;
+ _cannonLocation = 4;
} else if (!getGlobalVar(0x0C0288F4)) {
setGlobalVar(0x0C0288F4, 1);
- _varValue = 5;
+ _cannonLocation = 5;
} else {
- _varValue = 6;
+ _cannonLocation = 6;
}
- sub462DC0();
+ playExtVideo();
break;
case 0x2001:
- _countdown1 = 24;
+ _lockSymbolsPart1Countdown = 24;
break;
case 0x2002:
if (!getGlobalVar(0x9040018A) && !_flag4) {
if (getGlobalVar(0x000809C2)) {
- _varValue = 14;
+ _cannonLocation = 14;
setGlobalVar(0x000809C2, 0);
} else {
- _varValue = 7;
+ _cannonLocation = 7;
setGlobalVar(0x000809C2, 1);
}
- sub462DC0();
+ playExtVideo();
}
break;
case 0x2003:
- _countdown2 = 24;
+ _lockSymbolsPart2Countdown = 24;
break;
case 0x2004:
if (getGlobalVar(0x000809C2)) {
if (!getGlobalVar(0x9040018A)) {
if (!getGlobalVar(0x610210B7)) {
- _varValue = 8;
+ _cannonLocation = 8;
+ } else if (!getGlobalVar(0x0C0288F4)) {
+ _cannonLocation = 9;
} else {
- if (!getGlobalVar(0x0C0288F4)) {
- _varValue = 9;
- } else {
- _varValue = 10;
- }
+ _cannonLocation = 10;
}
setGlobalVar(0x9040018A, 1);
_flag4 = true;
- sub462DC0();
- } else if (!getGlobalVar(0x610210B7)) {
- _varValue = 11;
- _smackerPlayer->open(0x108A000F, false);
- } else if (!getGlobalVar(0x0C0288F4)) {
- _varValue = 12;
- _smackerPlayer->open(0x500B002F, false);
+ playExtVideo();
} else {
- _varValue = 13;
- _smackerPlayer->open(0x100B008E, false);
+ if (!getGlobalVar(0x610210B7)) {
+ _cannonLocation = 11;
+ _smackerPlayer->open(0x108A000F, false);
+ } else if (!getGlobalVar(0x0C0288F4)) {
+ _cannonLocation = 12;
+ _smackerPlayer->open(0x500B002F, false);
+ } else {
+ _cannonLocation = 13;
+ _smackerPlayer->open(0x100B008E, false);
+ }
+ _palette->usePalette();
+ _flag2 = true;
+ _flag4 = true;
+ _keepVideo = false;
+ setGlobalVar(0x9040018A, 0);
}
- _palette->usePalette();
- _flag2 = true;
- _flag4 = true;
- _flag1 = false;
- setGlobalVar(0x9040018A, 0);
}
break;
}
return 0;
}
-void Scene3009::sub462DC0() {
- setGlobalVar(0x20580A86, _varValue);
- setGlobalVar(0xF0402B0A, kScene3009VarValues[_varValue]);
+void Scene3009::playExtVideo() {
+ setGlobalVar(0x20580A86, _cannonLocation);
+ setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]);
_parentModule->sendMessage(0x1009, 1, this);
}
-bool Scene3009::sub462E10() {
+bool Scene3009::isSymbolsPart1Solved() {
for (int i = 0; i < 3; i++)
- if (_varValueArray[i] != getSubVar(0x00000914, i))
+ if (_correctSymbols[i] != getSubVar(0x00000914, i))
return false;
return true;
}
-bool Scene3009::sub462E50() {
- for (int i = 0; i < 6; i++)
- if (_varValueArray[i] != getSubVar(0x00000914, i))
+bool Scene3009::isSymbolsPart2Solved() {
+ for (int i = 3; i < 6; i++)
+ if (_correctSymbols[i] != getSubVar(0x00000914, i))
return false;
return true;
}
bool Scene3009::sub462E90() {
- return _flag3 || _flag4;
+ return /*_flag3 || */_flag4;
}
// Scene3010
-static const uint32 kScene3010VarNameHashes[] = {
+static const uint32 kScene3010ButtonNameHashes[] = {
0x304008D2,
0x40119852,
0x01180951
@@ -1042,7 +1241,7 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene
NDimensions dimensions1, dimensions2;
- _buttonEnabled = getSubVar(0x14800353, kScene3010VarNameHashes[_buttonIndex]) != 0;
+ _buttonEnabled = getSubVar(0x14800353, kScene3010ButtonNameHashes[_buttonIndex]) != 0;
_spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
dimensions1 = _spriteResource.getDimensions();
_spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
@@ -1133,10 +1332,10 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene
_parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), _unlocked(false), _locked(false),
_countdown(0) {
- _x = kAsScene3010DeadBoltPoints[_boltIndex].x;
- _y = kAsScene3010DeadBoltPoints[_boltIndex].y;
+ _x = kAsScene3010DeadBoltPoints[_boltIndex].x;
+ _y = kAsScene3010DeadBoltPoints[_boltIndex].y;
- if (getSubVar(0x14800353, kScene3010VarNameHashes[_boltIndex])) {
+ if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) {
createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200);
setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
_soundResource1.load(0x46005BC4);
@@ -1249,9 +1448,9 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
int initCountdown = 0;
// DEBUG: Enable all buttons
- setSubVar(0x14800353, kScene3010VarNameHashes[0], 1);
- setSubVar(0x14800353, kScene3010VarNameHashes[1], 1);
- setSubVar(0x14800353, kScene3010VarNameHashes[2], 1);
+ setSubVar(0x14800353, kScene3010ButtonNameHashes[0], 1);
+ setSubVar(0x14800353, kScene3010ButtonNameHashes[1], 1);
+ setSubVar(0x14800353, kScene3010ButtonNameHashes[2], 1);
_surfaceFlag = true;
@@ -1265,7 +1464,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
_ssDeadBoltButtons[i] = new SsScene3010DeadBoltButton(_vm, this, i, initCountdown, which == 1);//CHECKME
addSprite(_ssDeadBoltButtons[i]);
_vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]);
- if (getSubVar(0x14800353, kScene3010VarNameHashes[i]))
+ if (getSubVar(0x14800353, kScene3010ButtonNameHashes[i]))
initCountdown++;
_boltUnlocking[i] = false;
_boltUnlocked[i] = false;
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 9bda5db2af..499741d851 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -68,9 +68,9 @@ protected:
class Scene3009;
-class Class438 : public StaticSprite {
+class SsScene3009FireCannonButton : public StaticSprite {
public:
- Class438(NeverhoodEngine *vm, Scene3009 *parentScene);
+ SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene);
protected:
Scene3009 *_parentScene;
SoundResource _soundResource;
@@ -79,9 +79,9 @@ protected:
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
};
-class Class439 : public StaticSprite {
+class SsScene3009SymbolEdges : public StaticSprite {
public:
- Class439(NeverhoodEngine *vm, int index);
+ SsScene3009SymbolEdges(NeverhoodEngine *vm, int index);
void show();
void hide();
void startBlinking();
@@ -92,14 +92,30 @@ protected:
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
};
-class Class440 : public StaticSprite {
+class SsScene3009TargetLine : public StaticSprite {
public:
- Class440(NeverhoodEngine *vm, int index);
+ SsScene3009TargetLine(NeverhoodEngine *vm, int index);
+ void show();
};
-class Class522 : public AnimatedSprite {
+class SsScene3009SymbolArrow : public StaticSprite {
public:
- Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
+ SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index);
+ void hide();
+protected:
+ SoundResource _soundResource;
+ Sprite *_asSymbol;
+ int _index;
+ int _incrDecr;
+ bool _enabled;
+ int _countdown;
+ void update();
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene3009VerticalIndicator : public AnimatedSprite {
+public:
+ AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
void show();
protected:
Scene3009 *_parentScene;
@@ -107,33 +123,58 @@ protected:
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
};
+class AsScene3009HorizontalIndicator : public AnimatedSprite {
+public:
+ AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue);
+ void show();
+ void stMoveLeft();
+ void stMoveRight();
+protected:
+ Scene3009 *_parentScene;
+ bool _enabled;
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+ void suMoveLeft();
+ void suMoveRight();
+};
+
+class AsScene3009Symbol : public AnimatedSprite {
+public:
+ AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
+ void hide();
+protected:
+ Scene3009 *_parentScene;
+ int _index;
+ uint32 _symbolIndex;
+ SsScene3009SymbolArrow *_ssArrowPrev;
+ SsScene3009SymbolArrow *_ssArrowNext;
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
class Scene3009 : public Scene {
public:
Scene3009(NeverhoodEngine *vm, Module *parentModule, int which);
bool sub462E90();
protected:
- int _countdown1;
- int _countdown2;
+ int _lockSymbolsPart1Countdown;
+ int _lockSymbolsPart2Countdown;
SmackerPlayer *_smackerPlayer;
- Sprite *_class438;
- Class439 *_class439Array[2];
- Class440 *_class440Array[2];
- Class522 *_class522;
-#if 0
- Class523 *_class523;
- Class524 *_class524Array[6];
-#endif
- uint32 _varValue;
- uint32 _varValueArray[6];
- bool _flag1;
+ Sprite *_ssFireCannonButton;
+ SsScene3009SymbolEdges *_ssSymbolEdges[2];
+ SsScene3009TargetLine *_ssTargetLines[2];
+ AsScene3009VerticalIndicator *_asVerticalIndicator;
+ AsScene3009HorizontalIndicator *_asHorizontalIndicator;
+ AsScene3009Symbol *_asSymbols[6];
+ uint32 _cannonLocation;
+ uint32 _correctSymbols[6];
+ bool _keepVideo;
bool _flag2;
- bool _flag3;
+ // UNUSED? bool _flag3;
bool _flag4;
void update();
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
- void sub462DC0();
- bool sub462E10();
- bool sub462E50();
+ void playExtVideo();
+ bool isSymbolsPart1Solved();
+ bool isSymbolsPart2Solved();
};
// Scene3010
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 0db5d62c2c..c6a7e5abf2 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -198,7 +198,7 @@ Common::Error NeverhoodEngine::run() {
_screen->wait();
_screen->update();
- debug("---------------------------------------");
+ debug(0, "---------------------------------------");
}
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 66e7a58746..39f49cb6e7 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -83,6 +83,7 @@ SmackerPlayer::~SmackerPlayer() {
void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
debug("SmackerPlayer::open(%08X)", fileHash);
+ _fileHash = fileHash;
_keepLastFrame = keepLastFrame;
close();
@@ -143,6 +144,21 @@ void SmackerPlayer::setDrawPos(int16 x, int16 y) {
}
}
+void SmackerPlayer::rewind() {
+
+ delete _smackerDecoder;
+ _smackerDecoder = NULL;
+ _stream = NULL;
+
+ _smackerFirst = true;
+
+ _stream = _vm->_res->createStream(_fileHash);
+
+ _smackerDecoder = new Video::SmackerDecoder(_vm->_mixer);
+ _smackerDecoder->loadStream(_stream);
+
+}
+
void SmackerPlayer::update() {
debug(8, "SmackerPlayer::update()");
@@ -156,34 +172,7 @@ void SmackerPlayer::update() {
if (!_smackerDecoder->endOfVideo()) {
- const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
-
- if (_smackerFirst) {
- _smackerSurface->setSmackerFrame(smackerFrame);
- if (_drawX < 0 || _drawY < 0) {
- if (_doubleSurface) {
- _drawX = 320 - _smackerDecoder->getWidth();
- _drawY = 240 - _smackerDecoder->getHeight();
- } else {
- _drawX = (640 - _smackerDecoder->getWidth()) / 2;
- _drawY = (480 - _smackerDecoder->getHeight()) / 2;
- }
- }
- _smackerSurface->getDrawRect().x = _drawX;
- _smackerSurface->getDrawRect().y = _drawY;
- _smackerFirst = false;
- }
-
- if (_doubleSurface) {
- // TODO
- }
-
- // TODO _vm->_screen->_skipUpdate = true;
- _dirtyFlag = true;
-
- if (_smackerDecoder->hasDirtyPalette()) {
- updatePalette();
- }
+ updateFrame();
if (_smackerDecoder->endOfVideo() && !_keepLastFrame) {
// Inform the scene about the end of the video playback
@@ -192,12 +181,47 @@ void SmackerPlayer::update() {
}
_flag2 = true;
} else {
+ if (_smackerDecoder->endOfVideo()) {
+ rewind();
+ updateFrame();
+ }
_flag2 = false;
}
}
}
+void SmackerPlayer::updateFrame() {
+ const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
+
+ if (_smackerFirst) {
+ _smackerSurface->setSmackerFrame(smackerFrame);
+ if (_drawX < 0 || _drawY < 0) {
+ if (_doubleSurface) {
+ _drawX = 320 - _smackerDecoder->getWidth();
+ _drawY = 240 - _smackerDecoder->getHeight();
+ } else {
+ _drawX = (640 - _smackerDecoder->getWidth()) / 2;
+ _drawY = (480 - _smackerDecoder->getHeight()) / 2;
+ }
+ }
+ _smackerSurface->getDrawRect().x = _drawX;
+ _smackerSurface->getDrawRect().y = _drawY;
+ _smackerFirst = false;
+ }
+
+ if (_doubleSurface) {
+ // TODO
+ }
+
+ // TODO _vm->_screen->_skipUpdate = true;
+ _dirtyFlag = true;
+
+ if (_smackerDecoder->hasDirtyPalette()) {
+ updatePalette();
+ }
+}
+
void SmackerPlayer::updatePalette() {
byte tempPalette[1024];
const byte *smackerPalette = _smackerDecoder->getPalette();
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index 6579bb4add..fb7f6daa96 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -64,6 +64,7 @@ protected:
Palette *_palette;
Video::SmackerDecoder *_smackerDecoder;
SmackerSurface *_smackerSurface;
+ uint32 _fileHash;
bool _smackerFirst;
bool _doubleSurface;
Common::SeekableReadStream *_stream;
@@ -71,7 +72,9 @@ protected:
bool _flag2;
bool _dirtyFlag;
int _drawX, _drawY;
+ void rewind();
void update();
+ void updateFrame();
void updatePalette();
};