1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/* 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 canSkip, bool canAbort)
: Scene(vm, parentModule), _doubleSurface(doubleSurface), _canSkip(canSkip), _canAbort(canAbort), _videoPlayedBefore(false),
_fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) {
debug(0, "SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, canSkip, canAbort);
// NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags)
if (getGlobalVar(V_SMACKER_CAN_ABORT)) {
_canSkip = 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(0, "SmackerScene::setFileHash(%08X)", fileHash);
_fileHash[0] = fileHash;
_fileHashList = _fileHash;
}
void SmackerScene::setFileHashList(const uint32 *fileHashList) {
debug(0, "SmackerScene::setFileHashList(...)");
_fileHashList = fileHashList;
}
void SmackerScene::nextVideo() {
debug(0, "SmackerScene::nextVideo()");
_fileHashListIndex++;
if (_fileHashList && _fileHashList[_fileHashListIndex] != 0) {
uint32 smackerFileHash = _fileHashList[_fileHashListIndex];
ResourceHandle resourceHandle;
_vm->_res->queryResource(smackerFileHash, resourceHandle);
if (resourceHandle.type() != kResTypeVideo) {
// Not a Smacker file
_vm->_screen->setSmackerDecoder(NULL);
sendMessage(_parentModule, 0x1009, 0);
return;
}
_videoPlayedBefore = getSubVar(VA_SMACKER_PLAYED, smackerFileHash);
if (!_videoPlayedBefore)
setSubVar(VA_SMACKER_PLAYED, smackerFileHash, 1);
if (_fileHashListIndex == 0)
_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false));
else
_smackerPlayer->open(smackerFileHash, false);
_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
} else {
_vm->_screen->setSmackerDecoder(NULL);
sendMessage(_parentModule, 0x1009, 0);
}
}
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 NM_KEYPRESS_SPACE:
if ((_videoPlayedBefore && _canSkip) || (_canAbort && _canSkip))
_playNextVideoFlag = true;
break;
case NM_KEYPRESS_ESC:
if (_canAbort)
sendMessage(_parentModule, 0x1009, 0);
break;
case NM_ANIMATION_STOP:
_playNextVideoFlag = true;
break;
}
return messageResult;
}
} // End of namespace Neverhood
|