mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-16 06:39:17 +00:00
520 lines
14 KiB
C++
520 lines
14 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 "tsage/blue_force/blueforce_scenes6.h"
|
|
#include "tsage/blue_force/blueforce_dialogs.h"
|
|
#include "tsage/scenes.h"
|
|
#include "tsage/tsage.h"
|
|
#include "tsage/staticres.h"
|
|
|
|
namespace TsAGE {
|
|
|
|
namespace BlueForce {
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 600 - Crash cut-scene
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene600::Action1::signal() {
|
|
Scene600 *scene = (Scene600 *)BF_GLOBALS._sceneManager._scene;
|
|
static byte red[3] = {220, 0, 0};
|
|
|
|
switch (_actionIndex++) {
|
|
case 0:
|
|
setDelay(2);
|
|
break;
|
|
case 1:
|
|
BF_GLOBALS._sound1.play(57);
|
|
setDelay(120);
|
|
break;
|
|
case 2:
|
|
scene->_sound1.play(59);
|
|
setAction(&scene->_sequenceManager, this, 600, &scene->_object2, &scene->_ryan,
|
|
&BF_GLOBALS._player, &scene->_skidMarks, NULL);
|
|
break;
|
|
case 3:
|
|
BF_GLOBALS._sound1.play(61);
|
|
setDelay(180);
|
|
break;
|
|
case 4:
|
|
setDelay(180);
|
|
break;
|
|
case 5: {
|
|
BF_GLOBALS._player.remove();
|
|
scene->_ryan.remove();
|
|
scene->_object2.remove();
|
|
scene->_skidMarks.remove();
|
|
|
|
for (int percent = 100; percent >= 0; percent -= 2) {
|
|
BF_GLOBALS._scenePalette.fade((const byte *)&red, false, percent);
|
|
g_system->delayMillis(5);
|
|
}
|
|
|
|
SynchronizedList<SceneObject *>::iterator i;
|
|
for (i = BF_GLOBALS._sceneObjects->begin(); i != BF_GLOBALS._sceneObjects->end(); ++i) {
|
|
SceneObject *pObj = *i;
|
|
pObj->addMover(NULL);
|
|
pObj->setObjectWrapper(NULL);
|
|
pObj->animate(ANIM_MODE_NONE, NULL);
|
|
}
|
|
|
|
BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
|
|
BF_GLOBALS._v51C44 = 1;
|
|
scene->loadScene(999);
|
|
setDelay(5);
|
|
break;
|
|
}
|
|
case 6:
|
|
setDelay(5);
|
|
break;
|
|
case 7:
|
|
BF_GLOBALS._v51C44 = 0;
|
|
remove();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void Scene600::postInit(SceneObjectList *OwnerList) {
|
|
SceneExt::postInit();
|
|
loadScene(600);
|
|
setZoomPercents(0, 100, 200, 100);
|
|
_sceneBounds.moveTo(320, 0);
|
|
|
|
_sound1.play(58);
|
|
_sound1.holdAt(1);
|
|
|
|
BF_GLOBALS._player.postInit();
|
|
BF_GLOBALS._player.hide();
|
|
BF_GLOBALS._player.setPosition(Common::Point(639, 0));
|
|
BF_GLOBALS._player.disableControl();
|
|
|
|
_skidMarks.postInit();
|
|
_skidMarks.hide();
|
|
_object2.postInit();
|
|
|
|
_ryan.postInit();
|
|
_ryan.setVisage(600);
|
|
_ryan.setStrip(7);
|
|
_ryan.setPosition(Common::Point(417, 82));
|
|
|
|
BF_GLOBALS.clearFlag(onDuty);
|
|
BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60);
|
|
BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 60);
|
|
_sceneMode = 600;
|
|
|
|
setAction(&_action1, this);
|
|
}
|
|
|
|
void Scene600::signal() {
|
|
BF_GLOBALS._sceneManager.changeScene(620);
|
|
}
|
|
|
|
// WORKAROUND: Fix for original game bug where the global scrolling object follower
|
|
// remains set to an object within the scene that is no longer active
|
|
void Scene600::remove() {
|
|
BF_GLOBALS._scrollFollower = &BF_GLOBALS._player;
|
|
|
|
SceneExt::remove();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 620 - Hospital cut-scene
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene620::postInit(SceneObjectList *OwnerList) {
|
|
SceneExt::postInit();
|
|
loadScene(999);
|
|
|
|
BF_GLOBALS._player.postInit();
|
|
BF_GLOBALS._player.disableControl();
|
|
BF_GLOBALS._player.setVisage(621);
|
|
BF_GLOBALS._player.setPosition(Common::Point(47, 96));
|
|
|
|
static const uint32 black = 0;
|
|
add2Faders((const byte *)&black, 2, 621, this);
|
|
}
|
|
|
|
void Scene620::signal() {
|
|
static const uint32 black = 0;
|
|
|
|
switch (_sceneMode++) {
|
|
case 0:
|
|
case 3:
|
|
case 9:
|
|
case 12:
|
|
_timer1.set(60, this);
|
|
break;
|
|
case 1:
|
|
case 4:
|
|
case 7:
|
|
case 10:
|
|
case 13:
|
|
case 16:
|
|
case 19:
|
|
addFader((const byte *)&black, 2, this);
|
|
break;
|
|
case 2:
|
|
BF_GLOBALS._player.remove();
|
|
_object1.postInit();
|
|
_object1.setVisage(622);
|
|
_object1.setPosition(Common::Point(101, 41));
|
|
add2Faders((const byte *)&black, 2, 622, this);
|
|
break;
|
|
case 5:
|
|
_object1.remove();
|
|
|
|
_object2.postInit();
|
|
_object2.setVisage(623);
|
|
_object2.setPosition(Common::Point(216, 4));
|
|
add2Faders((const byte *)&black, 2, 623, this);
|
|
break;
|
|
case 6:
|
|
_object2.animate(ANIM_MODE_5, this);
|
|
break;
|
|
case 8:
|
|
_object2.remove();
|
|
|
|
_object3.postInit();
|
|
_object3.setVisage(624);
|
|
_object3.setFrame(1);
|
|
_object3.setPosition(Common::Point(28, 88));
|
|
add2Faders((const byte *)&black, 2, 624, this);
|
|
break;
|
|
case 11:
|
|
_object3.remove();
|
|
|
|
_object4.postInit();
|
|
_object4.setVisage(625);
|
|
_object4.setPosition(Common::Point(168, 8));
|
|
add2Faders((const byte *)&black, 2, 625, this);
|
|
break;
|
|
case 14:
|
|
_object4.remove();
|
|
|
|
_object5.postInit();
|
|
_object5.setVisage(626);
|
|
_object5.setPosition(Common::Point(249, 183));
|
|
add2Faders((const byte *)&black, 2, 626, this);
|
|
break;
|
|
case 15:
|
|
_object5.animate(ANIM_MODE_5, this);
|
|
break;
|
|
case 17:
|
|
_object5.remove();
|
|
|
|
_object6.postInit();
|
|
_object6.setVisage(627);
|
|
_object6.setPosition(Common::Point(65, 24));
|
|
add2Faders((const byte *)&black, 2, 627, this);
|
|
break;
|
|
case 18:
|
|
_object6.animate(ANIM_MODE_5, this);
|
|
break;
|
|
case 20:
|
|
_object6.remove();
|
|
BF_GLOBALS._bookmark = bArrestedDrunk;
|
|
BF_GLOBALS._v4CEB6 = 0;
|
|
BF_GLOBALS._dayNumber = 3;
|
|
BF_GLOBALS._sceneManager.changeScene(271);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 666 - Death Scene
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene666::Action1::signal() {
|
|
switch (_actionIndex++) {
|
|
case 0:
|
|
BF_GLOBALS._player.hide();
|
|
setDelay(6);
|
|
break;
|
|
case 1:
|
|
BF_GLOBALS._game->restartGame();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene666::Item1::startAction(CursorType action, Event &event) {
|
|
return true;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void Scene666::postInit(SceneObjectList *OwnerList) {
|
|
BF_GLOBALS._sound1.play(27);
|
|
SceneExt::postInit();
|
|
BF_GLOBALS._interfaceY = 200;
|
|
loadScene(999);
|
|
BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
|
|
|
|
if (BF_GLOBALS._dayNumber == 0) {
|
|
BF_GLOBALS._dayNumber = 1;
|
|
BF_GLOBALS._deathReason = BF_GLOBALS._randomSource.getRandomNumber(23);
|
|
}
|
|
|
|
BF_GLOBALS._scenePalette.loadPalette(BF_GLOBALS._sceneManager._previousScene);
|
|
T2_GLOBALS._uiElements._active = false;
|
|
|
|
_item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 666, -1, -1, -1, 1, NULL);
|
|
BF_GLOBALS._player.postInit();
|
|
BF_GLOBALS._events.setCursor(CURSOR_WALK);
|
|
|
|
if (BF_GLOBALS._sceneManager._previousScene == 271) {
|
|
setAction(&_action1);
|
|
} else {
|
|
switch (BF_GLOBALS._deathReason) {
|
|
case 4:
|
|
case 18:
|
|
case 19:
|
|
case 20:
|
|
BF_GLOBALS._scenePalette.loadPalette(668);
|
|
BF_GLOBALS._player.setVisage(668);
|
|
BF_GLOBALS._player.setStrip2(1);
|
|
BF_GLOBALS._player.setPosition(Common::Point(77, 155));
|
|
BF_GLOBALS._player.animate(ANIM_MODE_5, this);
|
|
break;
|
|
case 5:
|
|
BF_GLOBALS._scenePalette.loadPalette(900);
|
|
BF_GLOBALS._scenePalette.refresh();
|
|
BF_GLOBALS._player.setVisage(666);
|
|
BF_GLOBALS._player.setPosition(Common::Point(60, 160));
|
|
signal();
|
|
break;
|
|
case 7:
|
|
case 11:
|
|
case 12:
|
|
case 22:
|
|
BF_GLOBALS._scenePalette.loadPalette(667);
|
|
BF_GLOBALS._scenePalette.refresh();
|
|
|
|
_object1.postInit();
|
|
_object2.postInit();
|
|
_object3.postInit();
|
|
setAction(&_sequenceManager, this, 6660, &BF_GLOBALS._player, &_object1, &_object2,
|
|
&_object3, NULL);
|
|
break;
|
|
case 13:
|
|
case 14:
|
|
BF_GLOBALS._scenePalette.loadPalette(665);
|
|
BF_GLOBALS._scenePalette.refresh();
|
|
BF_GLOBALS._player.setVisage(665);
|
|
BF_GLOBALS._player.setPosition(Common::Point(80, 140));
|
|
signal();
|
|
break;
|
|
case 24:
|
|
BF_GLOBALS._player.setVisage(664);
|
|
BF_GLOBALS._player.setPosition(Common::Point(70, 160));
|
|
signal();
|
|
break;
|
|
default:
|
|
BF_GLOBALS._scenePalette.loadPalette(669);
|
|
BF_GLOBALS._scenePalette.refresh();
|
|
BF_GLOBALS._player.setVisage(669);
|
|
BF_GLOBALS._player.setStrip(1);
|
|
BF_GLOBALS._player.setPosition(Common::Point(27, 27));
|
|
BF_GLOBALS._player.animate(ANIM_MODE_5, this);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene666::remove() {
|
|
BF_GLOBALS._sound1.fadeOut2(NULL);
|
|
BF_GLOBALS._scrollFollower = &BF_GLOBALS._player;
|
|
SceneExt::remove();
|
|
T2_GLOBALS._uiElements._active = true;
|
|
}
|
|
|
|
void Scene666::signal() {
|
|
BF_GLOBALS._player.enableControl();
|
|
Rect textRect, sceneBounds;
|
|
|
|
_text._color1 = 19;
|
|
_text._color2 = 9;
|
|
_text._color3 = 13;
|
|
_text._fontNumber = 4;
|
|
_text._width = 150;
|
|
|
|
Common::String msg = g_resourceManager->getMessage(666, BF_GLOBALS._deathReason);
|
|
sceneBounds = BF_GLOBALS._sceneManager._scene->_sceneBounds;
|
|
sceneBounds.collapse(4, 2);
|
|
BF_GLOBALS.gfxManager()._font.getStringBounds(msg.c_str(), textRect, _text._width);
|
|
textRect.moveTo(160, 10);
|
|
textRect.contain(sceneBounds);
|
|
|
|
_text.setup(msg);
|
|
_text.setPosition(Common::Point(textRect.left, textRect.top));
|
|
_text.setPriority(255);
|
|
_text.show();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 690 - Decking
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
bool Scene690::Object1::startAction(CursorType action, Event &event) {
|
|
Scene690 *scene = (Scene690 *)BF_GLOBALS._sceneManager._scene;
|
|
|
|
if ((action == CURSOR_USE) && (scene->_object2._strip == 1)) {
|
|
BF_GLOBALS._player.disableControl();
|
|
BF_GLOBALS._walkRegions.enableRegion(1);
|
|
BF_GLOBALS._walkRegions.enableRegion(6);
|
|
scene->_sceneMode = 6901;
|
|
scene->setAction(&scene->_sequenceManager, scene, 6901, &BF_GLOBALS._player,
|
|
&scene->_object2, &scene->_object1, &scene->_object4, &scene->_object5, NULL);
|
|
return true;
|
|
} else {
|
|
return NamedObject::startAction(action, event);
|
|
}
|
|
}
|
|
|
|
bool Scene690::Object2::startAction(CursorType action, Event &event) {
|
|
Scene690 *scene = (Scene690 *)BF_GLOBALS._sceneManager._scene;
|
|
|
|
switch (action) {
|
|
case CURSOR_USE:
|
|
if (scene->_object2._strip == 3) {
|
|
scene->_object6.postInit();
|
|
scene->_object6.hide();
|
|
scene->_object6.fixPriority(1);
|
|
scene->_object6.setDetails(690, 21, 17, 23, 1, NULL);
|
|
|
|
BF_GLOBALS._player.disableControl();
|
|
scene->_sceneMode = 6902;
|
|
scene->setAction(&scene->_sequenceManager, scene, 6902, &BF_GLOBALS._player,
|
|
&scene->_object2, &scene->_object6, NULL);
|
|
return true;
|
|
}
|
|
break;
|
|
case CURSOR_TALK:
|
|
scene->_stripManager.start(6900, &BF_GLOBALS._stripProxy);
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return NamedObject::startAction(action, event);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void Scene690::postInit(SceneObjectList *OwnerList) {
|
|
SceneExt::postInit();
|
|
loadScene(690);
|
|
setZoomPercents(125, 80, 140, 100);
|
|
BF_GLOBALS._sound1.fadeSound(48);
|
|
|
|
if (BF_GLOBALS._dayNumber == 0)
|
|
BF_GLOBALS._dayNumber = 1;
|
|
|
|
_stripManager.addSpeaker(&_jakeSpeaker);
|
|
|
|
_object1.postInit();
|
|
_object1.setVisage(690);
|
|
_object1.setStrip2(2);
|
|
_object1.fixPriority(188);
|
|
_object1.setPosition(Common::Point(50, 166));
|
|
_object1.setDetails(690, 4, 17, 26, 1, NULL);
|
|
|
|
_object3.postInit();
|
|
_object3.setVisage(690);
|
|
_object3.fixPriority(100);
|
|
_object3.setPosition(Common::Point(238, 125));
|
|
_object3.setDetails(690, 7, 17, 28, 1, NULL);
|
|
|
|
_object2.postInit();
|
|
_object2.setVisage(694);
|
|
_object2.setStrip2(3);
|
|
_object2.fixPriority(125);
|
|
_object2.setPosition(Common::Point(100, 134));
|
|
_object2.setDetails(690, 12, -1, 11, 1, NULL);
|
|
|
|
BF_GLOBALS._player.postInit();
|
|
BF_GLOBALS._player.disableControl();
|
|
BF_GLOBALS._player._moveDiff.x = 8;
|
|
|
|
_object4.postInit();
|
|
_object4.setDetails(690, 13, -1, -1, 1, NULL);
|
|
|
|
_object5.postInit();
|
|
_object5.setDetails(690, 14, -1, -1, 1, NULL);
|
|
|
|
_sceneMode = 6903;
|
|
setAction(&_sequenceManager, this, 6903, &BF_GLOBALS._player, &_object3, &_object4, &_object5, NULL);
|
|
|
|
_item1.setDetails(Rect(45, 28, 74, 48), 690, 0, 15, 20, 1, NULL);
|
|
_item2.setDetails(Rect(0, 0, 129, 78), 690, 1, 15, 20, 1, NULL);
|
|
_item9.setDetails(Rect(4, 26, 35, 143), 690, 29, 17, 22, 1, NULL);
|
|
_item10.setDetails(Rect(87, 29, 109, 112), 690, 29, 17, 22, 1, NULL);
|
|
_item11.setDetails(Rect(135, 30, 160, 120), 690, 29, 17, 22, 1, NULL);
|
|
_item3.setDetails(Rect(37, 89, 84, 117), 690, 2, 16, 21, 1, NULL);
|
|
_item4.setDetails(Rect(123, 98, 201, 131), 690, 5, -1, -1, 1, NULL);
|
|
_item7.setDetails(Rect(285, 95, 303, 133), 690, 8, -1, 25, 1, NULL);
|
|
_item16.setDetails(Rect(166, 35, 210, 116), 690, 32, -1, -1, 1, NULL);
|
|
_item6.setDetails(Rect(255, 44, 289, 130), 690, 7, 17, 24, 1, NULL);
|
|
_item8.setDetails(Rect(299, 44, 314, 53), 690, 27, 15, -1, 1, NULL);
|
|
_item5.setDetails(Rect(130, 20, 319, 135), 690, 6, 16, 28, 1, NULL);
|
|
_item12.setDetails(1, 690, 10, -1, -1, 1);
|
|
_item13.setDetails(2, 690, 30, -1, -1, 1);
|
|
_item14.setDetails(3, 690, 31, -1, -1, 1);
|
|
_item15.setDetails(4, 690, 9, -1, -1, 1);
|
|
_item17.setDetails(Rect(143, 0, 182, 14), 690, 33, -1, -1, 1, NULL);
|
|
}
|
|
|
|
void Scene690::signal() {
|
|
switch (_sceneMode) {
|
|
case 6901:
|
|
BF_GLOBALS._sound1.fadeOut2(NULL);
|
|
BF_GLOBALS._sceneManager.changeScene(710);
|
|
break;
|
|
case 6902:
|
|
BF_GLOBALS._player.enableControl();
|
|
break;
|
|
case 6903:
|
|
BF_GLOBALS._walkRegions.disableRegion(1);
|
|
BF_GLOBALS._walkRegions.disableRegion(6);
|
|
BF_GLOBALS._player.enableControl();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
} // End of namespace BlueForce
|
|
|
|
} // End of namespace TsAGE
|