Skip to content

Commit

Permalink
NEVERHOOD: Add Scene1317
Browse files Browse the repository at this point in the history
- Fix SmackerPlayer (last frame was dropped, this hopefully doesn't break other stuff...)
  • Loading branch information
johndoe123 authored and wjp committed May 8, 2013
1 parent 3e122b0 commit 38378d2
Show file tree
Hide file tree
Showing 5 changed files with 226 additions and 5 deletions.
2 changes: 1 addition & 1 deletion engines/neverhood/gamemodule.cpp
Expand Up @@ -284,7 +284,7 @@ void GameModule::startup() {
createModule2200(-1);
#endif
#if 1
_vm->gameState().sceneNum = 7;
_vm->gameState().sceneNum = 16;
createModule1300(-1);
#endif
}
Expand Down
181 changes: 181 additions & 0 deletions engines/neverhood/module1300.cpp
Expand Up @@ -207,6 +207,11 @@ void Module1300::createScene1308(int which) {
}

void Module1300::createScene1309(int which) {
_vm->gameState().sceneNum = 8;
// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
// TODO Music18hList_stop(0x203197, 0, 2);
_childObject = new DiskplayerScene(_vm, this, 1);
SetUpdateHandler(&Module1300::updateScene1309);
}

void Module1300::createScene1310(int which) {
Expand Down Expand Up @@ -256,6 +261,11 @@ void Module1300::createScene1316(int which) {
}

void Module1300::createScene1317(int which) {
_vm->gameState().sceneNum = 16;
// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
// TODO Music18hList_stop(0x203197, 0, 2);
_childObject = new Scene1317(_vm, this, which);
SetUpdateHandler(&Module1300::updateScene1317);
}

void Module1300::createScene1318(int which) {
Expand Down Expand Up @@ -359,6 +369,14 @@ void Module1300::updateScene1308() {
}

void Module1300::updateScene1309() {
_childObject->handleUpdate();
if (_done) {
_done = false;
delete _childObject;
_childObject = NULL;
createScene1306(2);
_childObject->handleUpdate();
}
}

void Module1300::updateScene1310() {
Expand Down Expand Up @@ -452,6 +470,14 @@ void Module1300::updateScene1316() {
}

void Module1300::updateScene1317() {
_childObject->handleUpdate();
if (_done) {
_done = false;
delete _childObject;
_childObject = NULL;
createScene1318(-1);
_childObject->handleUpdate();
}
}

void Module1300::updateScene1318() {
Expand Down Expand Up @@ -1991,4 +2017,159 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
return 0;
}

Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which)
: Scene(vm, parentModule, true) {

SetMessageHandler(&Scene1317::handleMessage);
_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false));
_mouseCursor = addSprite(new Mouse433(_vm, 0x08284011, NULL));
_mouseCursor->getSurface()->setVisible(false);
_smackerFileHash = 0;
_smackerFlag1 = false;
}

void Scene1317::update() {
if (_smackerFileHash) {
_smackerPlayer->open(_smackerFileHash, _smackerFlag1);
_smackerFileHash = 0;
}
Scene::update();
}

void Scene1317::upChooseKing() {
if (!_klaymanBlinks && _klaymanBlinkCountdown != 0 && (--_klaymanBlinkCountdown == 0))
_klaymanBlinks = true;

if (!_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) {
_smackerPlayer->rewind();
} else if (_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) {
_smackerPlayer->rewind();
_klaymanBlinks = false;
_klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
}

if (!_klaymanBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0))
stNoDecisionYet();

if (_smackerFileHash) {
_smackerPlayer->open(_smackerFileHash, _smackerFlag1);
_smackerFileHash = 0;
}

Scene::update();

}

uint32 Scene1317::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x3002:
stChooseKing();
break;
}
return messageResult;
}

uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x0001:
if (param.asPoint().x >= 21 && param.asPoint().y >= 24 &&
param.asPoint().x <= 261 && param.asPoint().y <= 280) {
stHoborgAsKing();
} else if (param.asPoint().x >= 313 && param.asPoint().y >= 184 &&
param.asPoint().x <= 399 && param.asPoint().y <= 379) {
stKlaymanAsKing();
} else if (param.asPoint().x >= 347 && param.asPoint().y >= 380 &&
param.asPoint().x <= 418 && param.asPoint().y <= 474) {
stKlaymanAsKing();
}
break;
}
return messageResult;
}

uint32 Scene1317::hmNoDecisionYet(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x3002:
stChooseKing();
break;
}
return messageResult;
}

uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x3002:
stEndMovie();
break;
}
return messageResult;
}

uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x3002:
_parentModule->sendMessage(0x1009, 0, this);
break;
}
return messageResult;
}

uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x3002:
_parentModule->sendMessage(0x1009, 0, this);
break;
}
return messageResult;
}

void Scene1317::stChooseKing() {
_mouseCursor->getSurface()->setVisible(true);
SetMessageHandler(&Scene1317::hmChooseKing);
SetUpdateHandler(&Scene1317::upChooseKing);
_smackerFileHash = 0x10982841;
_smackerFlag1 = true;
_decisionCountdown = 450;
_klaymanBlinks = false;
_klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
}

void Scene1317::stNoDecisionYet() {
_mouseCursor->getSurface()->setVisible(false);
SetMessageHandler(&Scene1317::hmNoDecisionYet);
SetUpdateHandler(&Scene1317::update);
_smackerFileHash = 0x20982841;
_smackerFlag1 = false;
}

void Scene1317::stHoborgAsKing() {
_mouseCursor->getSurface()->setVisible(false);
SetMessageHandler(&Scene1317::hmHoborgAsKing);
SetUpdateHandler(&Scene1317::update);
_smackerFileHash = 0x40982841;
_smackerFlag1 = false;
}

void Scene1317::stKlaymanAsKing() {
_mouseCursor->getSurface()->setVisible(false);
SetMessageHandler(&Scene1317::hmKlaymanAsKing);
SetUpdateHandler(&Scene1317::update);
_smackerFileHash = 0x80982841;
_smackerFlag1 = false;
}

void Scene1317::stEndMovie() {
_mouseCursor->getSurface()->setVisible(false);
SetMessageHandler(&Scene1317::hmEndMovie);
SetUpdateHandler(&Scene1317::update);
_smackerFileHash = 0x40800711;
_smackerFlag1 = false;
}

} // End of namespace Neverhood
26 changes: 26 additions & 0 deletions engines/neverhood/module1300.h
Expand Up @@ -26,6 +26,7 @@
#include "neverhood/neverhood.h"
#include "neverhood/module.h"
#include "neverhood/scene.h"
#include "neverhood/smackerplayer.h"

namespace Neverhood {

Expand Down Expand Up @@ -322,6 +323,31 @@ class Scene1308 : public Scene {
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
};

class Scene1317 : public Scene {
public:
Scene1317(NeverhoodEngine *vm, Module *parentModule, int which);
protected:
SmackerPlayer *_smackerPlayer;
bool _klaymanBlinks;
int _klaymanBlinkCountdown;
int _decisionCountdown;
uint32 _smackerFileHash;
bool _smackerFlag1;
void update();
void upChooseKing();
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmChooseKing(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmNoDecisionYet(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmKlaymanAsKing(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmEndMovie(int messageNum, const MessageParam &param, Entity *sender);
void stChooseKing();
void stNoDecisionYet();
void stHoborgAsKing();
void stKlaymanAsKing();
void stEndMovie();
};

} // End of namespace Neverhood

#endif /* NEVERHOOD_MODULE1300_H */
20 changes: 17 additions & 3 deletions engines/neverhood/smackerplayer.cpp
Expand Up @@ -170,10 +170,9 @@ void SmackerPlayer::update() {
_dirtyFlag = false;
}

#if 0
if (!_smackerDecoder->endOfVideo()) {

updateFrame();

if (_smackerDecoder->endOfVideo() && !_keepLastFrame) {
// Inform the scene about the end of the video playback
if (_scene) {
Expand All @@ -187,8 +186,23 @@ void SmackerPlayer::update() {
}
_flag2 = false;
}

}
#endif

if (!_smackerDecoder->endOfVideo()) {
updateFrame();
} else if (!_keepLastFrame) {
// Inform the scene about the end of the video playback
if (_scene) {
_scene->sendMessage(0x3002, 0, this);
}
_flag2 = true;
} else {
rewind();
updateFrame();
_flag2 = false;
}

}

void SmackerPlayer::updateFrame() {
Expand Down
2 changes: 1 addition & 1 deletion engines/neverhood/smackerplayer.h
Expand Up @@ -59,6 +59,7 @@ class SmackerPlayer : public Entity {
uint32 getFrameNumber();
uint getStatus();
void setDrawPos(int16 x, int16 y);
void rewind();
protected:
Scene *_scene;
Palette *_palette;
Expand All @@ -72,7 +73,6 @@ class SmackerPlayer : public Entity {
bool _flag2;
bool _dirtyFlag;
int _drawX, _drawY;
void rewind();
void update();
void updateFrame();
void updatePalette();
Expand Down

0 comments on commit 38378d2

Please sign in to comment.