diff options
Diffstat (limited to 'engines/startrek/intro.cpp')
-rw-r--r-- | engines/startrek/intro.cpp | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/engines/startrek/intro.cpp b/engines/startrek/intro.cpp new file mode 100644 index 0000000000..8d17fc48b0 --- /dev/null +++ b/engines/startrek/intro.cpp @@ -0,0 +1,240 @@ +/* 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 "startrek/startrek.h" + +namespace StarTrek { + +void StarTrekEngine::playIntro() { + // TODO: .MT audio file + + initStarfieldPosition(); + initStarfield(10, 20, 309, 169, 128); + + SharedPtr<Bitmap> fakeStarfieldBitmap(new StubBitmap(0, 0)); + _starfieldSprite.bitmap = fakeStarfieldBitmap; + initStarfieldSprite(&_starfieldSprite, fakeStarfieldBitmap, _starfieldRect); + + //delR3(&_enterpriseR3); // TODO: uncomment + + R3 planetR3 = R3(); + planetR3.matrix = initMatrix(); + planetR3.field1e = 3; + planetR3.funcPtr1 = nullptr; + planetR3.funcPtr2 = nullptr; + planetR3.bitmapOffset = 0; + + _gfx->clearScreenAndPriBuffer(); + _gfx->fadeoutScreen(); + _gfx->loadPalette("gold"); + _gfx->setBackgroundImage(_gfx->loadBitmap("goldlogo")); + _sound->playVoc("logo"); + _gfx->copyBackgroundScreen(); + _system->updateScreen(); + _gfx->fadeinScreen(); + + uint32 clockTicks = _clockTicks; + + Sprite subtitleSprite; + _gfx->addSprite(&subtitleSprite); + subtitleSprite.setXYAndPriority(0, 0, 12); + subtitleSprite.bitmap = _gfx->loadBitmap("blank"); + subtitleSprite.drawPriority2 = 16; + + int index = 12; + while (index >= 0) { + Common::String file = Common::String::format("credit%02d.shp", index); + // TODO: This loads the file, but does not do anything with the resulting data, so + // this is just for caching it? + // Remember to deal with similar commented function calls below, too. + //loadFileWithParams(file, false, true, false); + index -= 1; + } + + //loadFileWithParams("legal.bmp", false, true, false); + + index = 6; + while (index >= 0) { + Common::String file = Common::String::format("tittxt%02d.bmp", index); + //loadFileWithParams(file, false, true, false); + index -= 1; + } + + //loadFileWithParams("planet.shp", false, true, false); + + index = 6; + while (index >= 0) { + Common::String file = Common::String::format("ent%d3.r3s", index); + //loadFileWithParams(file, false, true, false); + index -= 1; + } + + // TODO: kirkintr + + clockTicks += 540; + + while (_clockTicks < clockTicks && _sound->isMidiPlaying()) { + waitForNextTick(true); + } + + // TODO: MT audio file + + _gfx->fadeoutScreen(); + _gfx->loadPalette("bridge"); + _gfx->clearScreenAndPriBuffer(); + _sound->loadMusicFile("title"); + clockTicks = _clockTicks; + + int32 starfieldZoomSpeed; + int16 frame = 0; + bool buttonPressed = false; + + while (frame != 0x180 || (_sound->isMidiPlaying() && !buttonPressed)) { + if (!buttonPressed) { + TrekEvent event; + while (popNextEvent(&event, false)) { + if (event.type == TREKEVENT_KEYDOWN) { + _gfx->fadeoutScreen(); + buttonPressed = true; + } else if (event.type == TREKEVENT_TICK) + break; + } + } + + switch (frame) { + case 0: + starfieldZoomSpeed = 10; + playMidiMusicTracks(MIDITRACK_0, -1); + _byte_45b3c = 0; + break; + + case 30: + _sound->playVoc("kirkintr"); + loadSubtitleSprite(0, &subtitleSprite); + break; + + case 36: + loadSubtitleSprite(1, &subtitleSprite); + break; + + case 42: // Enterprise moves toward camera + loadSubtitleSprite(-1, &subtitleSprite); + addR3(&_enterpriseR3); + _enterpriseR3.field1e = 2; + initIntroR3ObjectToMove(&_enterpriseR3, 330, 5000, 0, 0, 18); + break; + + case 60: // Enterprise moves away from camera + initIntroR3ObjectToMove(&_enterpriseR3, 0, 0, 30, 5000, 6); + break; + + case 66: // Cut to scene with planet + loadSubtitleSprite(2, &subtitleSprite); + planetR3.field22 = 2000; + planetR3.field24 = 10000 / _starfieldPointDivisor; + planetR3.shpFile = loadFile("planet.shp"); + initIntroR3ObjectToMove(&planetR3, 6, 10000, 6, 10000, 0); + addR3(&planetR3); + initIntroR3ObjectToMove(&_enterpriseR3, -15, 250, 15, 500, 18); + starfieldZoomSpeed = 0; + break; + + case 186: + delR3(&_enterpriseR3); + // TODO: the rest + break; + + case 366: + planetR3.shpFile.reset(); + delR3(&planetR3); + break; + + case 378: + _gfx->delSprite(&subtitleSprite); + _byte_45b3c = 1; + break; + } + + if (!buttonPressed) { + updateStarfieldAndShips(false); + _gfx->drawAllSprites(); + _gfx->incPaletteFadeLevel(); + clockTicks += 3; + + while (_clockTicks < clockTicks) + waitForNextTick(); + } + + _starfieldPosition.z += starfieldZoomSpeed; + + frame++; + if (frame >= 0x186) + frame = 0x186; + } + + _gfx->fadeoutScreen(); + _gfx->delSprite(&_starfieldSprite); + // TODO: the rest +} + +void StarTrekEngine::initIntroR3ObjectToMove(R3 *r3, int16 srcAngle, int16 srcDepth, int16 destAngle, int16 destDepth, int16 ticks) { + Fixed8 a1 = Fixed8::fromRaw((srcAngle << 8) / 90); + Fixed8 a2 = Fixed8::fromRaw((destAngle << 8) / 90); + + r3->pos.x = sin(a1).multToInt(srcDepth) + _starfieldPosition.x; + r3->pos.z = cos(a1).multToInt(srcDepth) + _starfieldPosition.z; + r3->pos.y = 0; + + int32 deltaX = sin(a2).multToInt(destDepth) + _starfieldPosition.x - r3->pos.x; + int32 deltaZ = cos(a2).multToInt(destDepth) + _starfieldPosition.z - r3->pos.z; + debug("Z: %d, %d", r3->pos.z - _starfieldPosition.z, cos(a2).multToInt(destDepth)); + + Angle angle = atan2(deltaX, deltaZ); + r3->matrix = initSpeedMatrixForXZMovement(angle, initMatrix()); + + debugCN(5, kDebugSpace, "initIntroR3ObjectToMove: pos %x,%x,%x; ", r3->pos.x, r3->pos.y, r3->pos.z); + + if (ticks != 0) { + debugC(5, kDebugSpace, "speed %x,%x,%x\n", r3->speed.x, r3->speed.y, r3->speed.z); + r3->speed.x = deltaX / ticks; + r3->speed.z = deltaZ / ticks; + r3->speed.y = 0; + } else { + debugC(5, kDebugSpace, "speed 0\n"); + r3->speed.x = 0; + r3->speed.z = 0; + r3->speed.y = 0; + } +} + +void StarTrekEngine::loadSubtitleSprite(int index, Sprite *sprite) { + if (_showSubtitles) { + if (index == -1) + sprite->setBitmap(_gfx->loadBitmap("blank")); + else { + Common::String file = Common::String::format("tittxt%02d", index); + sprite->setBitmap(_gfx->loadBitmap(file)); + } + } +} + +} // End of namespace StarTrek |