scummvm/engines/tsage/blue_force/blueforce_scenes7.cpp
2014-02-18 02:39:39 +01:00

280 lines
8.1 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_scenes7.h"
#include "tsage/globals.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
namespace TsAGE {
namespace BlueForce {
/*--------------------------------------------------------------------------
* Scene 710 - Beach
*
*--------------------------------------------------------------------------*/
void Scene710::Timer1::signal() {
PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(136, 138, -1);
rotation->setDelay(20);
rotation = BF_GLOBALS._scenePalette.addRotation(146, 148, -1);
rotation->setDelay(30);
rotation = BF_GLOBALS._scenePalette.addRotation(187, 191, -1);
rotation->setDelay(35);
rotation = BF_GLOBALS._scenePalette.addRotation(245, 246, -1);
rotation->setDelay(20);
remove();
}
void Scene710::Action1::signal() {
Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0:
BF_GLOBALS._player.disableControl();
_state = 7104;
if (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)
_state = 7105;
setDelay(3);
break;
case 1: {
ADD_MOVER(BF_GLOBALS._player, scene->_laura._position.x + 8, scene->_laura._position.y + 8);
break;
}
case 2:
BF_GLOBALS._player._strip = 2;
scene->_stripManager.start(_state, this);
break;
case 3:
if (_state != 7105)
BF_GLOBALS._player.enableControl();
else {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 7106;
scene->setAction(&scene->_sequenceManager1, scene, 7106, &BF_GLOBALS._player, &scene->_laura, &scene->_kid, &scene->_dog, NULL);
}
if (_state < 7104) {
_state++;
if ((_state == 7104) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1))
_state = 7105;
}
remove();
break;
default:
break;
}
}
// Laura
bool Scene710::Object3::startAction(CursorType action, Event &event) {
Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
if (action == CURSOR_TALK) {
BF_GLOBALS._player.setAction(&scene->_action1);
return true;
} else
return NamedObject::startAction(action, event);
}
bool Scene710::Object4::startAction(CursorType action, Event &event) {
Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
if ((action == CURSOR_LOOK) && (scene->_kid._position.x < 0)) {
SceneItem::display2(710, 13);
return true;
} else
return NamedObject::startAction(action, event);
}
//Stick
bool Scene710::Object5::startAction(CursorType action, Event &event) {
Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
if (scene->_stickThrowCount <= 2)
return NamedObject::startAction(action, event);
else {
SceneItem::display2(710, 3);
scene->_watchCrate = true;
return true;
}
case CURSOR_USE:
if ((scene->_kid._position.x < 0) && (scene->_dogLying)) {
scene->_stickThrowCount++;
if (!scene->_watchCrate) {
BF_GLOBALS._player.disableControl();
scene->_dogLying = false;
scene->_sceneMode = 7105;
scene->setAction(&scene->_sequenceManager1, scene, 7105, &BF_GLOBALS._player, &scene->_stick, &scene->_dog, NULL);
} else {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 7101;
scene->setAction(&scene->_sequenceManager1, scene, 7101, &BF_GLOBALS._player, &scene->_dog, &scene->_stick, NULL);
}
return true;
}
// No break on purpose
default:
return NamedObject::startAction(action, event);
}
}
void Scene710::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
loadScene(710);
_sceneBounds.moveTo(320, 0);
BF_GLOBALS._sound1.fadeSound(14);
_soundExt1.fadeSound(48);
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.hide();
BF_GLOBALS._player._moveDiff = Common::Point(4, 2);
BF_GLOBALS._player.disableControl();
if (BF_GLOBALS._dayNumber == 0)
BF_GLOBALS._dayNumber = 1;
_stripManager.addSpeaker(&_jakeSpeaker);
_stripManager.addSpeaker(&_skipSpeaker);
_stripManager.addSpeaker(&_lauraSpeaker);
_stripManager.addSpeaker(&_gameTextSpeaker);
_kid.postInit();
_kid._moveDiff = Common::Point(4, 2);
_laura.postInit();
_laura._moveDiff = Common::Point(4, 2);
_dog.postInit();
_dog._moveDiff = Common::Point(4, 2);
_stick.postInit();
_stick.setVisage(710);
_stick.setStrip(2);
_stick.animate(ANIM_MODE_2, NULL);
_stick.setPosition(Common::Point(650, 160));
_stick._moveDiff.x = 16;
_stick.setDetails(710, 4, -1, -1, 1, (SceneItem *)NULL);
_laura.setDetails(710, 2, -1, -1, 1, (SceneItem *)NULL);
_kid.setDetails(710, 6, -1, -1, 1, (SceneItem *)NULL);
_dog.setDetails(710, 0, -1, -1, 1, (SceneItem *)NULL);
_item1.setDetails(Rect(555, 68, 583, 101), 710, 7, 23, -1, 1, NULL);
_item2.setDetails(Rect(583, 46, 611, 78), 710, 7, 23, -1, 1, NULL);
_item3.setDetails(Rect(611, 24, 639, 56), 710, 7, 23, -1, 1, NULL);
_item6.setDetails(1, 710, 9, 1, -1, 1);
_item4.setDetails(2, 710, 8, 14, -1, 1);
_item5.setDetails(3, 710, 10, 16, -1, 1);
_item8.setDetails(Rect(222, 18, 249, 42), 710, 12, 18, -1, 1, NULL);
_item7.setDetails(Rect(0, 0, 640, 52), 710, 11, 17, -1, 1, NULL);
_item9.setDetails(Rect(0, 0, 640, 128), 710, 5, 15, -1, 1, NULL);
_stickThrowCount = 0;
_dogLying = _watchCrate = _throwStick = false;
_action1._state = 7100;
_timer1.set(2, NULL);
_sceneMode = 7100;
setAction(&_sequenceManager1, this, 7100, &BF_GLOBALS._player, &_laura, &_kid, &_dog, NULL);
}
void Scene710::signal() {
switch (_sceneMode) {
case 0:
BF_GLOBALS._player.enableControl();
break;
case 7100:
BF_GLOBALS._player.enableControl();
_sceneMode = 7102;
setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
break;
case 7101:
// Pick up crate part
BF_GLOBALS._player.enableControl();
BF_INVENTORY.setObjectScene(INV_CRATE1, 1);
_stick.remove();
BF_GLOBALS._walkRegions.enableRegion(2);
break;
case 7102:
_stick.setPosition(Common::Point(100, 122));
_stick.animate(ANIM_MODE_NONE, NULL);
_stick._strip = 2;
if (_stickThrowCount <= 2)
_stick._frame = 2;
else {
if (_stickThrowCount == 3) {
BF_GLOBALS._player.disableControl();
_sceneMode = 0;
_stripManager.start(7108, this);
}
_stick._frame = 1;
}
_dogLying = true;
BF_GLOBALS._walkRegions.disableRegion(2);
if ((_throwStick) && (_sceneMode != 0))
BF_GLOBALS._player.enableControl();
break;
case 7103:
if (BF_GLOBALS._player._position.x > 179) {
_sceneMode = 7102;
setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
} else {
_sceneMode = 7104;
setAction(&_sequenceManager3, this, 7104, &_kid, NULL);
}
break;
case 7105:
_throwStick = true;
// No break on purpose
case 7104:
_sceneMode = 7102;
setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
BF_GLOBALS._walkRegions.enableRegion(2);
break;
case 7106:
BF_GLOBALS._sound1.fadeOut2(NULL);
BF_GLOBALS._sceneManager.changeScene(270);
break;
default:
break;
}
}
void Scene710::dispatch() {
if ((_kid._position.x > 0) && (_dogLying) && (_sceneMode != 7106)) {
_dogLying = false;
_sceneMode = 7103;
setAction(&_sequenceManager1, this, 7103, &_kid, &_stick, &_dog, NULL);
}
SceneExt::dispatch();
}
void Scene710::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_dogLying);
s.syncAsSint16LE(_stickThrowCount);
s.syncAsSint16LE(_watchCrate);
s.syncAsSint16LE(_throwStick);
}
} // End of namespace BlueForce
} // End of namespace TsAGE