mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-25 19:25:20 +00:00
244 lines
6.5 KiB
C++
244 lines
6.5 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 "startrek/startrek.h"
|
|
|
|
namespace StarTrek {
|
|
|
|
void StarTrekEngine::playIntro() {
|
|
// TODO: .MT audio file
|
|
|
|
initStarfieldPosition();
|
|
initStarfield(10, 20, 309, 169, 128);
|
|
|
|
Bitmap *fakeStarfieldBitmap = new StubBitmap(0, 0);
|
|
initStarfieldSprite(&_starfieldSprite, fakeStarfieldBitmap, _starfieldRect);
|
|
|
|
//delR3(&_enterpriseR3); // TODO: uncomment
|
|
|
|
R3 planetR3 = R3();
|
|
planetR3.matrix = initMatrix();
|
|
planetR3.field1e = 3;
|
|
planetR3.funcPtr1 = 0;
|
|
planetR3.funcPtr2 = 0;
|
|
|
|
_gfx->clearScreenAndPriBuffer();
|
|
_gfx->fadeoutScreen();
|
|
_gfx->loadPalette("gold");
|
|
_gfx->setBackgroundImage("goldlogo");
|
|
_sound->playVoc("logo");
|
|
_gfx->copyBackgroundScreen();
|
|
_system->updateScreen();
|
|
_system->delayMillis(10);
|
|
_gfx->fadeinScreen();
|
|
|
|
uint32 clockTicks = _clockTicks;
|
|
|
|
Sprite subtitleSprite;
|
|
_gfx->addSprite(&subtitleSprite);
|
|
subtitleSprite.setXYAndPriority(0, 0, 12);
|
|
subtitleSprite.setBitmap(loadBitmapFile("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 = 0;
|
|
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;
|
|
_sound->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.bitmap = new Bitmap(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:
|
|
delete planetR3.bitmap;
|
|
planetR3.bitmap = nullptr;
|
|
delR3(&planetR3);
|
|
break;
|
|
|
|
case 378:
|
|
_gfx->delSprite(&subtitleSprite);
|
|
_byte_45b3c = 1;
|
|
break;
|
|
|
|
default:
|
|
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(loadBitmapFile("blank"));
|
|
else {
|
|
Common::String file = Common::String::format("tittxt%02d", index);
|
|
sprite->setBitmap(loadBitmapFile(file));
|
|
}
|
|
}
|
|
}
|
|
|
|
} // End of namespace StarTrek
|