diff options
author | johndoe123 | 2011-07-04 17:58:38 +0000 |
---|---|---|
committer | Willem Jan Palenstijn | 2013-05-08 20:30:58 +0200 |
commit | 21eb88053caa4cc7167f81dba9afc7f0ef89996d (patch) | |
tree | bbc1f3e645a55c3dda70bfdbbe3ab075e4e0f13b /engines/neverhood/smackerscene.cpp | |
parent | bd1749863e45cde53707d0ae38b28825bc0dba2e (diff) | |
download | scummvm-rg350-21eb88053caa4cc7167f81dba9afc7f0ef89996d.tar.gz scummvm-rg350-21eb88053caa4cc7167f81dba9afc7f0ef89996d.tar.bz2 scummvm-rg350-21eb88053caa4cc7167f81dba9afc7f0ef89996d.zip |
NEVERHOOD: Implement SmackerScene, SmackerPlayer and related stuff
- The intro video after the logo screens is now played (still needs better sync)
Diffstat (limited to 'engines/neverhood/smackerscene.cpp')
-rw-r--r-- | engines/neverhood/smackerscene.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp new file mode 100644 index 0000000000..f3ee5775bc --- /dev/null +++ b/engines/neverhood/smackerscene.cpp @@ -0,0 +1,127 @@ +/* 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 "neverhood/smackerscene.h" + +namespace Neverhood { + +SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort) + : Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _fieldDF(false), + _fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) { + + debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort); + + // NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags) + + /* TODO + if (_vm->getGlobalVarValue(0x06C02850)) { + _flag1 = true; + _canAbort = true; + } + */ + + if (_doubleSurface) { + _vm->_screen->clear(); + } + + _fileHash[0] = 0; + _fileHash[1] = 0; + + SetUpdateHandler(&SmackerScene::update); + SetMessageHandler(&SmackerScene::handleMessage); + +} + +SmackerScene::~SmackerScene() { + +} + +void SmackerScene::setFileHash(uint32 fileHash) { + debug("SmackerScene::setFileHash(%08X)", fileHash); + _fileHash[0] = fileHash; + _fileHashList = _fileHash; +} + +void SmackerScene::setFileHashList(uint32 *fileHashList) { + debug("SmackerScene::setFileHashList(...)"); + _fileHashList = fileHashList; +} + +void SmackerScene::nextVideo() { + debug("SmackerScene::nextVideo()"); + + _fileHashListIndex++; + + if (_fileHashList && _fileHashList[_fileHashListIndex] != 0) { + uint32 smackerFileHash = _fileHashList[_fileHashListIndex]; + if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) { + // Not a Smacker file + _parentModule->sendMessage(0x1009, 0, this); + return; + } + // TODO _fieldDF = getGlobalSubVarValue(0x00800410, smackerFileHash); + if (!_fieldDF) { + // TODO setGlobalSubVarValue(0x00800410, smackerFileHash) = 1; + } + if (_fileHashListIndex == 0) { + _smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false); + addEntity(_smackerPlayer); + addSurface(_smackerPlayer->getSurface()); + // TODO? Screen.hSmack = _smackerPlayer; + } else { + _smackerPlayer->open(smackerFileHash, false); + } + } else { + _parentModule->sendMessage(0x1009, 0, this); + } + + +} + +void SmackerScene::update() { + if (_playNextVideoFlag) { + nextVideo(); + _playNextVideoFlag = false; + } + Scene::update(); +} + +uint32 SmackerScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0009: + if ((_fieldDF && _flag1) || (_canAbort && _flag1)) + _playNextVideoFlag = true; + break; + case 0x000C: + if (_canAbort) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x3002: + _playNextVideoFlag = true; + break; + } + return messageResult; +} + +} // End of namespace Neverhood |