2008-12-21 23:43:12 +00:00
|
|
|
/* 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.
|
|
|
|
*
|
|
|
|
* $URL$
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
// "Faery Tale Adventure II: Halls of the Dead" Intro sequence scene procedures
|
|
|
|
|
|
|
|
#include "saga/saga.h"
|
|
|
|
#include "saga/scene.h"
|
2008-12-22 11:26:29 +00:00
|
|
|
#include "saga/gfx.h"
|
2008-12-21 23:43:12 +00:00
|
|
|
|
|
|
|
#include "sound/mixer.h"
|
2008-12-22 11:26:29 +00:00
|
|
|
#include "graphics/surface.h"
|
2008-12-21 23:43:12 +00:00
|
|
|
#include "graphics/video/smk_player.h"
|
|
|
|
|
2008-12-22 11:26:29 +00:00
|
|
|
#include "common/events.h"
|
|
|
|
#include "common/system.h"
|
|
|
|
|
2008-12-21 23:43:12 +00:00
|
|
|
namespace Saga {
|
|
|
|
|
|
|
|
class MoviePlayerSMK : Graphics::SMKPlayer {
|
|
|
|
protected:
|
|
|
|
virtual void setPalette(byte *pal);
|
|
|
|
public:
|
2008-12-22 11:26:29 +00:00
|
|
|
MoviePlayerSMK(SagaEngine *vm): _vm(vm), SMKPlayer(vm->_mixer) {
|
|
|
|
_frameSkipped = 0;
|
|
|
|
_ticks = 0;
|
|
|
|
}
|
|
|
|
~MoviePlayerSMK(void) { closeFile(); }
|
|
|
|
|
2009-01-01 15:06:43 +00:00
|
|
|
bool load(const char *filename) {
|
2008-12-22 11:26:29 +00:00
|
|
|
_skipVideo = false;
|
|
|
|
return loadFile(filename);
|
|
|
|
}
|
|
|
|
void playVideo();
|
|
|
|
void stopVideo() { closeFile(); }
|
|
|
|
private:
|
|
|
|
bool processFrame();
|
|
|
|
PalEntry _smkPalette[256];
|
|
|
|
uint32 _ticks;
|
|
|
|
uint16 _frameSkipped;
|
|
|
|
bool _skipVideo;
|
|
|
|
SagaEngine *_vm;
|
|
|
|
Common::Event _event;
|
2008-12-21 23:43:12 +00:00
|
|
|
};
|
|
|
|
|
2008-12-22 11:26:29 +00:00
|
|
|
void MoviePlayerSMK::setPalette(byte *pal) {
|
|
|
|
for (int i = 0; i < 256; i++) {
|
|
|
|
_smkPalette[i].red = *pal++;
|
|
|
|
_smkPalette[i].green = *pal++;
|
|
|
|
_smkPalette[i].blue = *pal++;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm->_gfx->setPalette(_smkPalette, true);
|
2008-12-21 23:43:12 +00:00
|
|
|
}
|
|
|
|
|
2008-12-22 11:26:29 +00:00
|
|
|
void MoviePlayerSMK::playVideo() {
|
|
|
|
while (getCurFrame() < getFrameCount() && !_skipVideo && !_vm->shouldQuit()) {
|
|
|
|
Common::EventManager *eventMan = _vm->_system->getEventManager();
|
|
|
|
// process events, and skip video if esc is pressed
|
|
|
|
while (eventMan->pollEvent(_event)) {
|
|
|
|
switch (_event.type) {
|
|
|
|
case Common::EVENT_KEYDOWN:
|
|
|
|
if (_event.kbd.keycode == Common::KEYCODE_ESCAPE)
|
|
|
|
_skipVideo = true;
|
|
|
|
break;
|
|
|
|
case Common::EVENT_RTL:
|
|
|
|
case Common::EVENT_QUIT:
|
|
|
|
_skipVideo = true;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
decodeNextFrame();
|
|
|
|
if (processFrame())
|
|
|
|
_vm->_system->updateScreen();
|
|
|
|
}
|
2008-12-21 23:43:12 +00:00
|
|
|
}
|
|
|
|
|
2008-12-22 11:26:29 +00:00
|
|
|
bool MoviePlayerSMK::processFrame() {
|
|
|
|
Graphics::Surface *screen = _vm->_system->lockScreen();
|
2009-01-01 15:06:43 +00:00
|
|
|
copyFrameToBuffer((byte *)screen->pixels,
|
|
|
|
(_vm->getDisplayInfo().width - getWidth()) / 2,
|
2008-12-22 14:36:58 +00:00
|
|
|
(_vm->getDisplayInfo().height - getHeight()) / 2,
|
|
|
|
_vm->getDisplayInfo().width);
|
2008-12-22 11:26:29 +00:00
|
|
|
_vm->_system->unlockScreen();
|
|
|
|
|
|
|
|
if (!getAudioLag() || getFrameWaitTime() || _frameSkipped > getFrameRate()) {
|
|
|
|
if (_frameSkipped > getFrameRate()) {
|
|
|
|
warning("force frame %i redraw", getCurFrame());
|
|
|
|
_frameSkipped = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (getAudioLag() > 0) {
|
|
|
|
while (getAudioLag() > 0) {
|
|
|
|
_vm->_system->delayMillis(10);
|
|
|
|
}
|
|
|
|
// In case the background sound ends prematurely, update
|
|
|
|
// _ticks so that we can still fall back on the no-sound
|
|
|
|
// sync case for the subsequent frames.
|
|
|
|
_ticks = _vm->_system->getMillis();
|
|
|
|
} else {
|
|
|
|
_ticks += getFrameDelay();
|
|
|
|
//while (_vm->_system->getMillis() < _ticks) // FIXME
|
|
|
|
_vm->_system->delayMillis(10);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
warning("dropped frame %i", getCurFrame());
|
|
|
|
_frameSkipped++;
|
|
|
|
return false;
|
2008-12-21 23:43:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int Scene::FTA2StartProc() {
|
2008-12-22 11:26:29 +00:00
|
|
|
MoviePlayerSMK *smkPlayer = new MoviePlayerSMK(_vm);
|
|
|
|
|
|
|
|
_vm->_gfx->showCursor(false);
|
|
|
|
|
|
|
|
// Show Ignite logo
|
|
|
|
if (smkPlayer->load("trimark.smk")) {
|
|
|
|
debug(0, "Playing video trimark.smk");
|
|
|
|
smkPlayer->playVideo();
|
|
|
|
smkPlayer->stopVideo();
|
|
|
|
} else {
|
|
|
|
warning("Failed to load video file trimark.smk");
|
|
|
|
}
|
2008-12-21 23:43:12 +00:00
|
|
|
|
2008-12-22 11:26:29 +00:00
|
|
|
// Play introduction
|
|
|
|
if (smkPlayer->load("intro.smk")) {
|
|
|
|
debug(0, "Playing video intro.smk");
|
|
|
|
smkPlayer->playVideo();
|
|
|
|
smkPlayer->stopVideo();
|
|
|
|
} else {
|
|
|
|
warning("Failed to load video file intro.smk");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cleanup
|
2008-12-21 23:43:12 +00:00
|
|
|
delete smkPlayer;
|
|
|
|
|
2008-12-22 11:26:29 +00:00
|
|
|
// HACK: Forcibly quit here
|
2008-12-21 23:43:12 +00:00
|
|
|
_vm->quitGame();
|
|
|
|
|
2008-12-22 11:26:29 +00:00
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Scene::FTA2EndProc(FTA2Endings whichEnding) {
|
|
|
|
char videoName[20];
|
|
|
|
|
|
|
|
switch (whichEnding) {
|
|
|
|
case kFta2BadEndingLaw:
|
|
|
|
strcpy(videoName, "end_1.smk");
|
|
|
|
break;
|
|
|
|
case kFta2BadEndingChaos:
|
|
|
|
strcpy(videoName, "end_2.smk");
|
|
|
|
break;
|
|
|
|
case kFta2GoodEnding1:
|
|
|
|
strcpy(videoName, "end_3a.smk");
|
|
|
|
break;
|
|
|
|
case kFta2GoodEnding2:
|
|
|
|
strcpy(videoName, "end_3b.smk");
|
|
|
|
break;
|
|
|
|
case kFta2BadEndingDeath:
|
|
|
|
strcpy(videoName, "end_4.smk");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
error("Unknown FTA2 ending");
|
|
|
|
}
|
|
|
|
|
|
|
|
MoviePlayerSMK *smkPlayer = new MoviePlayerSMK(_vm);
|
|
|
|
|
|
|
|
_vm->_gfx->showCursor(false);
|
|
|
|
|
2008-12-22 11:49:49 +00:00
|
|
|
// Play ending
|
2008-12-22 11:26:29 +00:00
|
|
|
if (smkPlayer->load(videoName)) {
|
|
|
|
debug(0, "Playing video %s", videoName);
|
|
|
|
smkPlayer->playVideo();
|
|
|
|
smkPlayer->stopVideo();
|
|
|
|
} else {
|
|
|
|
warning("Failed to load video file %s", videoName);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cleanup
|
|
|
|
delete smkPlayer;
|
|
|
|
|
|
|
|
return SUCCESS;
|
2008-12-21 23:43:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
} // End of namespace Saga
|