scummvm/engines/tsage/blue_force/blueforce_scenes1.cpp

708 lines
19 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 "common/config-manager.h"
#include "tsage/blue_force/blueforce_scenes1.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
#include "tsage/globals.h"
namespace TsAGE {
namespace BlueForce {
/*--------------------------------------------------------------------------
* Scene 100 - Tsunami Title Screen #2
*
*--------------------------------------------------------------------------*/
void Scene100::Text::dispatch() {
SceneText::dispatch();
// Keep the second text string below the first one
Scene100 *scene = (Scene100 *)BF_GLOBALS._sceneManager._scene;
Common::Point &pt = scene->_action1._sceneText1._position;
scene->_action1._sceneText2.setPosition(Common::Point(pt.x,
pt.y + scene->_action1._textHeight));
}
void Scene100::Action1::signal() {
static byte black[3] = { 0, 0, 0 };
switch (_actionIndex++) {
case 0:
_state = 0;
setDelay(6);
break;
case 1: {
Common::String msg1 = _resourceManager->getMessage(100, _state++);
if (msg1.compareTo("LASTCREDIT")) {
Common::String msg2 = _resourceManager->getMessage(100, _state++);
setTextStrings(msg1, msg2, this);
--_actionIndex;
} else {
setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this);
Common::Point pt(_sceneText1._position.x, 80);
NpcMover *mover = new NpcMover();
_sceneText1.addMover(mover, &pt, this);
}
break;
}
case 2:
setDelay(600);
break;
case 3:
BF_GLOBALS._sound1.fade(0, 10, 10, 1, this);
GLOBALS._scenePalette.addFader(black, 1, 2, NULL);
break;
case 4:
error("??exit");
break;
}
}
void Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) {
// Set data for first text control
_sceneText1._fontNumber = 10;
_sceneText1._width = 160;
_sceneText1._textMode = ALIGN_RIGHT;
_sceneText1._color1 = BF_GLOBALS._scenePalette._colors.foreground;
_sceneText1._color2 = BF_GLOBALS._scenePalette._colors.background;
_sceneText1._color3 = BF_GLOBALS._scenePalette._colors.foreground;
_sceneText1.setup(msg1);
_sceneText1.fixPriority(255);
_sceneText1.setPosition(Common::Point(
(SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202));
_sceneText1._moveRate = 30;
_sceneText1._moveDiff.y = 1;
// Set data for second text control
_sceneText2._fontNumber = 10;
_sceneText2._width = _sceneText1._width;
_sceneText2._textMode = _sceneText1._textMode;
_sceneText2._color1 = _sceneText1._color1;
_sceneText2._color2 = 31;
_sceneText2._color3 = _sceneText1._color3;
_sceneText2.setup(msg2);
_sceneText2.fixPriority(255);
GfxSurface textSurface = _sceneText2.getFrame();
_sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202));
_sceneText2._moveRate = 30;
_sceneText2._moveDiff.y = 1;
_textHeight = textSurface.getBounds().height();
int yp = -(_textHeight * 2);
Common::Point pt(_sceneText1._position.x, yp);
NpcMover *mover = new NpcMover();
_sceneText1.addMover(mover, &pt, action);
}
void Scene100::Action2::signal() {
Scene100 *scene = (Scene100 *)_globals->_sceneManager._scene;
static byte black[3] = {0, 0, 0};
switch (_actionIndex++) {
case 0:
BF_GLOBALS._scenePalette.addFader(black, 1, -2, this);
break;
case 1:
setDelay(180);
break;
case 2: {
const char *SEEN_INTRO = "seen_intro";
if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) {
// First time being played, so will need to show the intro
ConfMan.setBool(SEEN_INTRO, true);
ConfMan.flushToDisk();
} else {
// Prompt user for whether to start play or watch introduction
_globals->_player.enableControl();
if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {
// Signal to start the game
scene->_index = 190;
remove();
return;
}
}
// At this point the introduction needs to start
_globals->_scenePalette.addFader(black, 1, 2, this);
break;
}
case 3:
remove();
break;
}
}
/*--------------------------------------------------------------------------*/
Scene100::Scene100(): SceneExt() {
_index = 0;
}
void Scene100::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._scenePalette.loadPalette(2);
BF_GLOBALS._v51C44 = 1;
Scene::postInit();
BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
_globals->_player.enableControl();
_globals->_player.hide();
_globals->_player.disableControl();
_index = 109;
if (BF_GLOBALS._dayNumber < 6) {
// Title
loadScene(100);
BF_GLOBALS._sound1.play(2);
setAction(&_action2, this);
} else {
// Credits
loadScene(101);
BF_GLOBALS._sound1.play(118);
setAction(&_action1, this);
}
}
void Scene100::signal() {
++_sceneMode;
if (BF_GLOBALS._dayNumber < 6) {
BF_GLOBALS._scenePalette.clearListeners();
BF_GLOBALS._scenePalette.loadPalette(100);
BF_GLOBALS._sceneManager.changeScene(_index);
} else {
if (_sceneMode > 1)
BF_GLOBALS._events.setCursor(CURSOR_ARROW);
setAction(this, &_action1, this);
}
}
/*--------------------------------------------------------------------------
* Scene 109 - Introduction Bar Room
*
*--------------------------------------------------------------------------*/
void Scene109::Action1::signal() {
Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
setDelay(30);
break;
case 1:
BF_GLOBALS._sound1.play(12);
BF_GLOBALS._sceneObjects->draw();
BF_GLOBALS._scenePalette.loadPalette(2);
BF_GLOBALS._scenePalette.refresh();
setDelay(10);
break;
case 2:
scene->_text.setup(BF_19840515, this);
break;
case 3:
BF_GLOBALS._v51C44 = 1;
scene->loadScene(115);
scene->_protaginist2.show();
scene->_protaginist2.setPriority(133);
scene->_protaginist1.show();
scene->_bartender.show();
scene->_object1.show();
scene->_drunk.show();
scene->_drunk.setAction(&scene->_action3);
scene->_object2.show();
scene->_object9.show();
scene->_object9.setAction(&scene->_action2);
BF_GLOBALS._v501FC = 170;
setDelay(60);
break;
case 4:
// Start drinking
scene->_bartender.setAction(&scene->_sequenceManager4, NULL, 109, &scene->_bartender, &scene->_object2, NULL);
scene->_protaginist1.setAction(&scene->_sequenceManager5, NULL, 107, &scene->_protaginist1, NULL);
scene->_protaginist2.setAction(&scene->_sequenceManager6, this, 106, &scene->_protaginist2, NULL);
break;
case 5:
// Open briefcase and pass over disk
setAction(&scene->_sequenceManager6, this, 105, &scene->_object10, NULL);
break;
case 6:
// Protaginist 2 walk to the bar
scene->_object10.remove();
setAction(&scene->_sequenceManager6, this, 100, &scene->_protaginist2, NULL);
break;
case 7:
// Two thugs enter and walk to table
scene->_object7.setAction(&scene->_sequenceManager7, NULL, 103, &scene->_object7, NULL);
scene->_object5.setAction(&scene->_sequenceManager8, this, 102, &scene->_object5, NULL);
scene->_protaginist2.setAction(&scene->_sequenceManager6, NULL, 104, &scene->_protaginist2, &scene->_bartender, NULL);
break;
case 8:
// Protaginist 1 leaves, protaginist 2 stands up
setAction(&scene->_sequenceManager8, this, 101, &scene->_object5, &scene->_protaginist1, NULL);
break;
case 9:
// Shots fired!
scene->_protaginist1.setAction(&scene->_sequenceManager5, this, 98, &scene->_protaginist1, NULL);
scene->_object7.setAction(&scene->_sequenceManager7, NULL, 99, &scene->_object7, NULL);
break;
case 10:
// End scene
scene->_sceneMode = 1;
remove();
break;
}
}
void Scene109::Action2::signal() {
Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
scene->setAction(&scene->_sequenceManager2, this, 3117, &scene->_object9, NULL);
}
void Scene109::Action3::signal() {
Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene;
scene->setAction(&scene->_sequenceManager3, this, 108, &scene->_drunk, NULL);
}
/*--------------------------------------------------------------------------*/
Scene109::Text::Text(): SceneText() {
_action = NULL;
_frameNumber = 0;
_diff = 0;
}
void Scene109::Text::setup(const Common::String &msg, Action *action) {
_frameNumber = BF_GLOBALS._events.getFrameNumber();
_diff = 180;
_action = action;
_fontNumber = 4;
_width = 300;
_textMode = ALIGN_CENTER;
_color1 = BF_GLOBALS._scenePalette._colors.background;
_color2 = _color3 = 0;
SceneText::setup(msg);
// Center the text on-screen
reposition();
_bounds.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
// Set the new position
_position.x = _bounds.left;
_position.y = _bounds.top;
}
void Scene109::Text::synchronize(Serializer &s) {
SceneText::synchronize(s);
SYNC_POINTER(_action);
s.syncAsUint32LE(_frameNumber);
s.syncAsSint16LE(_diff);
}
void Scene109::Text::dispatch() {
if (_diff) {
uint32 frameNumber = BF_GLOBALS._events.getFrameNumber();
if (_frameNumber < frameNumber) {
_diff -= frameNumber - _frameNumber;
_frameNumber = frameNumber;
if (_diff <= 0) {
// Time has expired, so remove the text and signal the designated action
remove();
if (_action)
_action->signal();
}
}
}
}
/*--------------------------------------------------------------------------*/
Scene109::Scene109(): PalettedScene() {
}
void Scene109::postInit(SceneObjectList *OwnerList) {
PalettedScene::postInit(OwnerList);
loadScene(999);
_protaginist2.postInit();
_protaginist2.setVisage(119);
_protaginist2.setFrame(11);
_protaginist2.fixPriority(133);
_protaginist2.setPosition(Common::Point(165, 124));
_protaginist2.hide();
_protaginist1.postInit();
_protaginist1.setVisage(118);
_protaginist1.setStrip(1);
_protaginist1.setFrame(8);
_protaginist1.fixPriority(132);
_protaginist1.setPosition(Common::Point(143, 125));
_protaginist1.hide();
_bartender.postInit();
_bartender.setVisage(121);
_bartender.setStrip(2);
_bartender.setFrame(1);
_bartender.setPriority(-1);
_bartender.setPosition(Common::Point(92, 64));
_bartender.hide();
_object1.postInit();
_object1.setVisage(121);
_object1.setStrip(6);
_object1.setFrame(1);
_object1.setPriority(-1);
_object1.setPosition(Common::Point(110, 64));
_object1.hide();
_drunk.postInit();
_drunk.setVisage(120);
_drunk.setStrip(2);
_drunk.setFrame(5);
_drunk.setPriority(-1);
_drunk.setPosition(Common::Point(127, 97));
_drunk.hide();
_object2.postInit();
_object2.setVisage(121);
_object2.setStrip(5);
_object2.setFrame(1);
_object2.setPriority(-1);
_object2.setPosition(Common::Point(104, 64));
_object2.hide();
_object9.postInit();
_object9.setVisage(115);
_object9.setStrip(4);
_object9.setFrame(1);
_object9.setPosition(Common::Point(262, 29));
_object9.hide();
_object5.postInit();
_object5.hide();
_object7.postInit();
_object7.hide();
_object10.postInit();
_object10.hide();
BF_GLOBALS._player.disableControl();
setAction(&_action1, this);
}
void Scene109::signal() {
if (_sceneMode == 1) {
BF_GLOBALS._scenePalette.clearListeners();
BF_GLOBALS._sceneManager.changeScene(110);
}
}
/*--------------------------------------------------------------------------
* Scene 190 - Front of Police Station
*
*--------------------------------------------------------------------------*/
bool Scene190::Object4::startAction(CursorType action, Event &event) {
Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE: {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 13;
Common::Point pt(62, 96);
PlayerMover *mover = new PlayerMover();
BF_GLOBALS._player.addMover(mover, &pt, scene);
return true;
}
default:
return NamedObject::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
bool Scene190::Item1::startAction(CursorType action, Event &event) {
Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
scene->setAction(&scene->_action1);
return true;
default:
return NamedHotspot::startAction(action, event);
}
}
bool Scene190::Item2::startAction(CursorType action, Event &event) {
Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
scene->_stripManager.start(1900, scene);
return true;
default:
return NamedHotspot::startAction(action, event);
}
}
bool Scene190::Exit::startAction(CursorType action, Event &event) {
Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
Common::Point pt(316, 91);
PlayerMover *mover = new PlayerMover();
BF_GLOBALS._player.addMover(mover, &pt, scene);
return true;
}
/*--------------------------------------------------------------------------*/
void Scene190::Action1::signal() {
Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
BF_GLOBALS._player.disableControl();
setDelay(2);
break;
case 1: {
ADD_MOVER(BF_GLOBALS._player, 165, 91);
break;
}
case 2:
scene->_sound.play(82);
scene->_object2.animate(ANIM_MODE_5, this);
break;
case 3:
ADD_MOVER(BF_GLOBALS._player, 180, 86);
break;
case 4:
scene->_sound.play(82);
scene->_object2.animate(ANIM_MODE_6, this);
break;
case 5:
BF_GLOBALS._sound1.fadeOut2(NULL);
BF_GLOBALS._sceneManager.changeScene(315);
break;
}
}
/*--------------------------------------------------------------------------*/
Scene190::Scene190(): SceneExt() {
_fieldB52 = true;
_cursorVisage.setVisage(1, 8);
}
void Scene190::postInit(SceneObjectList *OwnerList) {
BF_GLOBALS._dialogCenter.y = 100;
if ((BF_GLOBALS._sceneManager._previousScene == 100) ||
(BF_GLOBALS._sceneManager._previousScene == 20)) {
// clearScreen();
}
if (BF_GLOBALS._dayNumber == 0)
// If at start of game, change to first day
BF_GLOBALS._dayNumber = 1;
// Load the scene data
loadScene(190);
BF_GLOBALS._scenePalette.loadPalette(2);
_stripManager.addSpeaker(&_speaker);
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.disableControl();
// Initialise objects
_object2.postInit();
_object2.setVisage(190);
_object2.setStrip(1);
_object2.setPosition(Common::Point(179, 88));
_object3.postInit();
_object3.setVisage(190);
_object3.setStrip(2);
_object3.fixPriority(200);
_object3.setPosition(Common::Point(170, 31));
_object3.animate(ANIM_MODE_7, 0, NULL);
_object3.setDetails(190, 8, 26, 19, 1, NULL);
if (BF_GLOBALS.getFlag(fWithLyle)) {
BF_GLOBALS._player.setVisage(303);
BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
_object4.postInit();
_object4.setVisage(444);
_object4.setFrame(2);
_object4.setPosition(Common::Point(54, 114));
_object4.setDetails(190, -1, -1, -1, 1, NULL);
switch (BF_GLOBALS._sceneManager._previousScene) {
case 300: {
_sceneMode = 12;
BF_GLOBALS._player.setPosition(Common::Point(316, 91));
ADD_MOVER(BF_GLOBALS._player, 305, 91);
break;
}
case 315:
_sceneMode = 1901;
setAction(&_sequenceManager, this, 1901, &BF_GLOBALS._player, &_object2, NULL);
break;
case 50:
case 60:
default:
_fieldB52 = false;
BF_GLOBALS._player.setPosition(Common::Point(62, 96));
BF_GLOBALS._player._strip = 3;
BF_GLOBALS._player.enableControl();
break;
}
} else {
BF_GLOBALS._player.setVisage(BF_GLOBALS._player._visage);
BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
switch (BF_GLOBALS._sceneManager._previousScene) {
case 300: {
if (!BF_GLOBALS.getFlag(onBike)) {
BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 11 : 12;
BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1304 : 303);
BF_GLOBALS._player.setPosition(Common::Point(316, 91));
ADD_MOVER(BF_GLOBALS._player, 305, 91);
} else {
BF_GLOBALS._player.disableControl();
_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 193 : 191;
setAction(&_sequenceManager, this, 193, &BF_GLOBALS._player, NULL);
}
break;
}
case 315:
BF_GLOBALS._player._moveDiff = Common::Point(3, 1);
_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 1900 : 1901;
setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_object2, NULL);
break;
case 50:
case 60:
default:
BF_GLOBALS.setFlag(onBike);
BF_GLOBALS._player.disableControl();
_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 192 : 190;
setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
break;
}
}
if (BF_GLOBALS.getFlag(onBike)) {
BF_GLOBALS._sound1.play(BF_GLOBALS.getFlag(onDuty) ? 37 : 29);
} else if (BF_GLOBALS._sceneManager._previousScene != 300) {
BF_GLOBALS._sound1.play(33);
}
_exit.setDetails(Rect(310, 50, 320, 125), 190, -1, -1, -1, 1, NULL);
_item2.setDetails(Rect(108, 1, 111, 94), 190, 7, 11, 18, 1, NULL);
_item4.setDetails(2, 190, 5, 10, 16, 1);
_item3.setDetails(1, 190, 4, 10, 15, 1);
_item8.setDetails(6, 190, 20, 21, 22, 1);
_item1.setDetails(7, 190, 1, 10, -1, 1);
_item7.setDetails(5, 190, 0, 10, 12, 1);
_item6.setDetails(4, 190, 2, 10, 13, 1);
_item5.setDetails(3, 190, 3, 10, 14, 1);
_item9.setDetails(Rect(0, 0, 89, 68), 190, 6, 10, 17, 1, NULL);
_item10.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 190, 23, -1, -1, 1, NULL);
}
void Scene190::signal() {
switch (_sceneMode) {
case 10:
if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne))
BF_GLOBALS._sound1.changeSound(49);
BF_GLOBALS._sceneManager.changeScene(300);
break;
case 11:
case 12:
case 1900:
case 1901:
BF_GLOBALS._player.enableControl();
_fieldB52 = false;
break;
case 13:
case 191:
case 193:
BF_GLOBALS._sceneManager.changeScene(60);
break;
case 190:
case 192:
BF_GLOBALS._sceneManager.changeScene(300);
break;
case 0:
default:
BF_GLOBALS._player.enableControl();
break;
}
}
void Scene190::process(Event &event) {
SceneExt::process(event);
if (BF_GLOBALS._player._enabled && !_eventHandler && (event.mousePos.y < (BF_INTERFACE_Y - 1))) {
// Check if the cursor is on an exit
if (_exit.contains(event.mousePos)) {
GfxSurface surface = _cursorVisage.getFrame(3);
BF_GLOBALS._events.setCursor(surface);
} else {
// In case an exit cursor was being shown, restore the previously selected cursor
CursorType cursorId = BF_GLOBALS._events.getCursor();
BF_GLOBALS._events.setCursor(cursorId);
}
}
}
void Scene190::dispatch() {
SceneExt::dispatch();
if (!_action && !_fieldB52 && (BF_GLOBALS._player._position.x >= 310)
&& !BF_GLOBALS.getFlag(onBike)) {
// Handle walking off to the right side of the screen
BF_GLOBALS._player.disableControl();
_fieldB52 = true;
_sceneMode = 10;
ADD_MOVER(BF_GLOBALS._player, 330, BF_GLOBALS._player._position.y);
}
}
} // End of namespace BlueForce
} // End of namespace TsAGE