mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-19 10:41:55 +00:00
183 lines
5.4 KiB
C++
183 lines
5.4 KiB
C++
/* 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 "video/avi_decoder.h"
|
|
|
|
#include "gnap/gnap.h"
|
|
#include "gnap/gamesys.h"
|
|
#include "gnap/resource.h"
|
|
#include "gnap/scenes/intro.h"
|
|
|
|
namespace Gnap {
|
|
|
|
SceneIntro::SceneIntro(GnapEngine *vm) : Scene(vm) {
|
|
}
|
|
|
|
int SceneIntro::init() {
|
|
return 0x37C;
|
|
}
|
|
|
|
void SceneIntro::run() {
|
|
const int animIdArr[] = {
|
|
0x356, 0x357, 0x358, 0x35A, 0x35F,
|
|
0x360, 0x361, 0x362, 0x363, 0x364,
|
|
0x365, 0x368, 0x369, 0x36B, 0x378,
|
|
0x36C, 0x36D, 0x36E, 0x36F, 0x370,
|
|
0x371, 0x372, 0x373, 0x374, 0x375,
|
|
0x376, 0x377, 0x378, 0x379, 0x37A,
|
|
0x37B, 0};
|
|
|
|
const int backgroundIdArr[] = {
|
|
0x354, 0x355, 0, 1, 3,
|
|
4, 5, 6, 7, 8,
|
|
7, 9, 0xA, 0xB, 0xC,
|
|
0xD, 0xE, 0xF, 0x10, 0x11,
|
|
0x12, 0x13, 0x17, 0x14, 0x19,
|
|
0x1A, 0x14, 0x15, 0x16, 0x14,
|
|
0x19, 0};
|
|
|
|
GameSys& gameSys = *_vm->_gameSys;
|
|
int index = 0;
|
|
bool skip = false;
|
|
|
|
_vm->hideCursor();
|
|
_vm->_dat->open(1, "musop_n.dat");
|
|
|
|
Video::VideoDecoder *videoDecoder = new Video::AVIDecoder();
|
|
if (!videoDecoder->loadFile("hoffman.avi")) {
|
|
delete videoDecoder;
|
|
warning("Unable to open video 'hoffman.avi' - Skipping intro");
|
|
return;
|
|
}
|
|
videoDecoder->start();
|
|
|
|
int vidPosX = (800 - videoDecoder->getWidth()) / 2;
|
|
int vidPosY = (600 - videoDecoder->getHeight()) / 2;
|
|
bool skipVideo = false;
|
|
|
|
_vm->screenEffect(1, 255, 255, 255);
|
|
|
|
while (!_vm->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) {
|
|
if (videoDecoder->needsUpdate()) {
|
|
const Graphics::Surface *frame = videoDecoder->decodeNextFrame();
|
|
if (frame) {
|
|
if (frame->format.bytesPerPixel == 1) {
|
|
_vm->_system->copyRectToScreen(frame->getPixels(), frame->pitch, vidPosX, vidPosY, frame->w, frame->h);
|
|
} else if (frame->format.bytesPerPixel != 4) {
|
|
Graphics::Surface *frame1 = frame->convertTo(_vm->_system->getScreenFormat());
|
|
_vm->_system->copyRectToScreen(frame1->getPixels(), frame1->pitch, vidPosX, vidPosY, frame1->w, frame1->h);
|
|
frame1->free();
|
|
delete frame1;
|
|
} else {
|
|
// The intro AVI is played upside down, it's the only video played in the English version
|
|
for (uint16 y = 0; y < frame->h / 2; y++) {
|
|
uint32 *ptrFrom = (uint32*)frame->getBasePtr(0, y);
|
|
uint32 *ptrTo = (uint32*)frame->getBasePtr(0, frame->h - y - 1);
|
|
for (uint16 x = 0; x < frame->w; x++) {
|
|
uint32 t = *ptrFrom;
|
|
*ptrFrom = *ptrTo;
|
|
*ptrTo = t;
|
|
ptrFrom++;
|
|
ptrTo++;
|
|
}
|
|
}
|
|
|
|
Graphics::Surface *frame1 = frame->convertTo(_vm->_system->getScreenFormat());
|
|
_vm->_system->copyRectToScreen(frame1->getPixels(), frame1->pitch, vidPosX, vidPosY, frame1->w, frame1->h);
|
|
frame1->free();
|
|
delete frame1;
|
|
}
|
|
_vm->_system->updateScreen();
|
|
}
|
|
}
|
|
|
|
Common::Event event;
|
|
while (g_system->getEventManager()->pollEvent(event)) {
|
|
if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) ||
|
|
event.type == Common::EVENT_LBUTTONUP)
|
|
skipVideo = true;
|
|
}
|
|
|
|
_vm->_system->delayMillis(10);
|
|
}
|
|
|
|
delete videoDecoder;
|
|
|
|
gameSys.drawSpriteToBackground(0, 0, backgroundIdArr[index]);
|
|
gameSys.insertSequence(0x356, 2, 0, 0, kSeqNone, 0, 0, 0);
|
|
gameSys.setAnimation(0x356, 2, 0);
|
|
|
|
while (!_vm->_sceneDone) {
|
|
_vm->gameUpdateTick();
|
|
|
|
if (gameSys.getAnimationStatus(0) == 2 || skip ) {
|
|
skip = false;
|
|
gameSys.requestClear2(false);
|
|
gameSys.requestClear1();
|
|
if ( index == 11 || index == 1 )
|
|
_vm->screenEffect(0, 0, 0, 0);
|
|
|
|
gameSys.setAnimation(0, 0, 0);
|
|
if (++index >= 31)
|
|
_vm->_sceneDone = true;
|
|
else {
|
|
gameSys.insertSequence(animIdArr[index], 2, 0, 0, kSeqNone, 0, 0, 0);
|
|
if (index == 2) {
|
|
_vm->playSound(0x10000, false);
|
|
gameSys.insertSequence(0x359, 2, 0, 0, 0, 0, 0, 0);
|
|
} else if (index == 3)
|
|
gameSys.insertSequence(0x35B, 2, 0, 0, kSeqNone, 0, 0, 0);
|
|
else if (index == 12)
|
|
gameSys.insertSequence(0x36A, 2, 0, 0, kSeqNone, 0, 0, 0);
|
|
|
|
gameSys.drawSpriteToBackground(0, 0, backgroundIdArr[index]);
|
|
gameSys.setAnimation(animIdArr[index], 2, 0);
|
|
|
|
if (index == 11)
|
|
_vm->stopSound(0x10000);
|
|
}
|
|
}
|
|
|
|
if (_vm->isKeyStatus1(Common::KEYCODE_ESCAPE) || _vm->isKeyStatus1(Common::KEYCODE_SPACE) || _vm->isKeyStatus1(29)) {
|
|
_vm->clearKeyStatus1(Common::KEYCODE_ESCAPE);
|
|
_vm->clearKeyStatus1(Common::KEYCODE_SPACE);
|
|
_vm->clearKeyStatus1(29);
|
|
if (index == 0) {
|
|
skip = true;
|
|
_vm->stopSound(0x3CF);
|
|
} else if (index == 1)
|
|
skip = true;
|
|
else
|
|
_vm->_sceneDone = true;
|
|
}
|
|
}
|
|
|
|
_vm->stopSound(0x10000);
|
|
|
|
_vm->_newSceneNum = 1;
|
|
_vm->_newCursorValue = 1;
|
|
|
|
_vm->_dat->open(1, "stock_n.dat");
|
|
}
|
|
|
|
} // End of namespace Gnap
|