TSAGE: Implemented Scene 800 - Jamison & Ryan

This commit is contained in:
Paul Gilbert
2011-09-12 21:51:22 +10:00
parent a029bb8656
commit 0c2dfd2efc
8 changed files with 542 additions and 18 deletions
@@ -26,6 +26,7 @@
#include "tsage/blue_force/blueforce_scenes1.h"
#include "tsage/blue_force/blueforce_scenes3.h"
#include "tsage/blue_force/blueforce_scenes6.h"
#include "tsage/blue_force/blueforce_scenes8.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/graphics.h"
@@ -125,6 +126,8 @@ Scene *BlueForceGame::createScene(int sceneNumber) {
case 710:
error("Scene group 7 not implemented");
case 800:
// Jamison & Ryan
return new Scene800();
case 810:
case 820:
case 830:
@@ -0,0 +1,361 @@
/* 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_scenes8.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 800 - Jamison & Ryan
*
*--------------------------------------------------------------------------*/
bool Scene800::Item1::startAction(CursorType action, Event &event) {
if (action == CURSOR_LOOK) {
SceneItem::display2(800, 11);
return true;
} else {
return SceneHotspot::startAction(action, event);
}
}
bool Scene800::Item2::startAction(CursorType action, Event &event) {
if (action == CURSOR_LOOK) {
SceneItem::display2(800, 1);
return true;
} else {
return SceneHotspot::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
bool Scene800::Doorway::startAction(CursorType action, Event &event) {
Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(800, 4);
return true;
case CURSOR_USE:
if (BF_GLOBALS._dayNumber == 5)
SceneItem::display2(800, 14);
else if (BF_GLOBALS._dayNumber < 2)
SceneItem::display2(800, BF_GLOBALS.getFlag(onDuty) ? 6 : 15);
else if (((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && (BF_GLOBALS._dayNumber == 3)) ||
(BF_GLOBALS._bookmark == bDoneWithIsland))
SceneItem::display(800, 5);
else {
if (BF_GLOBALS.getFlag(fWithLyle)) {
ADD_PLAYER_MOVER_NULL(scene->_lyle, 277, 145);
}
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 8000;
setAction(&scene->_sequenceManager, scene, 8000, &BF_GLOBALS._player, this, NULL);
}
return true;
default:
return NamedObject::startAction(action, event);
}
}
bool Scene800::Car1::startAction(CursorType action, Event &event) {
Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(800, 2);
return true;
case CURSOR_USE:
SceneItem::display2(800, 3);
return true;
case INV_TICKET_BOOK:
if (BF_GLOBALS.getFlag(ticketVW))
SceneItem::display2(800, 12);
else if (!BF_GLOBALS.getFlag(onDuty))
SceneItem::display2(800, 13);
else {
BF_GLOBALS.setFlag(ticketVW);
BF_GLOBALS._player.disableControl();
BF_GLOBALS._uiElements.addScore(30);
scene->_sceneMode = 8005;
scene->setAction(&scene->_action1);
}
return true;
default:
return NamedObject::startAction(action, event);
}
}
bool Scene800::Motorcycle::startAction(CursorType action, Event &event) {
Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(800, 0);
return true;
case CURSOR_USE:
if (BF_GLOBALS.getFlag(fWithLyle))
SceneItem::display2(800, 8);
else {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 8002;
setAction(&scene->_sequenceManager, scene, 8002, &BF_GLOBALS._player, this, NULL);
}
return true;
default:
return NamedObject::startAction(action, event);
}
}
bool Scene800::Lyle::startAction(CursorType action, Event &event) {
Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(800, 7);
return true;
case CURSOR_TALK:
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 8001;
scene->_stripManager.start(8003, scene);
return true;
default:
return NamedObject::startAction(action, event);
}
}
bool Scene800::Car2::startAction(CursorType action, Event &event) {
Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(800, 9);
return true;
case CURSOR_USE:
if (!BF_GLOBALS.getFlag(fWithLyle))
SceneItem::display2(800, 10);
else {
BF_GLOBALS._player.disableControl();
scene->_sceneMode = 8003;
setAction(&scene->_sequenceManager, scene, 8003, &BF_GLOBALS._player, &scene->_lyle, NULL);
}
return true;
default:
return NamedObject::startAction(action, event);
}
}
/*--------------------------------------------------------------------------*/
void Scene800::Action1::signal() {
Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene;
switch (_actionIndex++) {
case 0: {
BF_GLOBALS._player.disableControl();
ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 95, 153);
break;
}
case 1: {
ADD_MOVER(BF_GLOBALS._player, 70, 157);
break;
}
case 2:
BF_GLOBALS._player.setVisage(800);
BF_GLOBALS._player.setStrip(1);
BF_GLOBALS._player.setFrame(1);
BF_GLOBALS._player.fixPriority(200);
BF_GLOBALS._player.animate(ANIM_MODE_4, 16, 1, this);
break;
case 3:
scene->_object6.postInit();
scene->_object6.setVisage(800);
scene->_object6.setStrip(2);
scene->_object6.setFrame(2);
scene->_object6.setPosition(Common::Point(58, 135));
scene->_object6.fixPriority(170);
scene->_object6.animate(ANIM_MODE_5, this);
break;
case 4:
BF_GLOBALS._player.setVisage(352);
BF_GLOBALS._player.setStrip(2);
BF_GLOBALS._player.setFrame(1);
BF_GLOBALS._player.fixPriority(-1);
BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
ADD_MOVER(BF_GLOBALS._player, 89, 154);
break;
case 5:
BF_GLOBALS._player.enableControl();
remove();
break;
}
}
/*--------------------------------------------------------------------------*/
void Scene800::postInit(SceneObjectList *OwnerList) {
loadScene(800);
SceneExt::postInit();
setZoomPercents(130, 50, 155, 100);
_stripManager.addSpeaker(&_gameTextSpeaker);
_stripManager.addSpeaker(&_jakeJacketSpeaker);
_stripManager.addSpeaker(&_lyleHatSpeaker);
BF_GLOBALS._player.postInit();
BF_GLOBALS._player.setVisage(1358);
BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
BF_GLOBALS._player.setPosition(Common::Point(319, 144));
BF_GLOBALS._player._moveDiff = Common::Point(3, 2);
BF_GLOBALS._player.changeZoom(-1);
_motorcycle.postInit();
_motorcycle.setVisage(301);
_motorcycle.setPosition(Common::Point(319, 162));
if ((BF_GLOBALS._dayNumber >= 2) && (BF_GLOBALS._dayNumber < 5)) {
_car2.postInit();
_car2.setVisage(444);
_car2.setStrip(3);
_car2.setFrame(2);
_car2.setPosition(Common::Point(237, 161));
_car2.changeZoom(110);
_car2.fixPriority(158);
BF_GLOBALS._sceneItems.push_back(&_car2);
BF_GLOBALS._walkRegions.proc1(8);
}
if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) {
_car2.remove();
BF_GLOBALS._walkRegions.proc2(8);
}
if (BF_GLOBALS.getFlag(fWithLyle)) {
_lyle.postInit();
_lyle.setVisage(1359);
_lyle.setObjectWrapper(new SceneObjectWrapper());
_lyle.animate(ANIM_MODE_1, NULL);
_lyle.setPosition(Common::Point(210, 160));
_lyle.changeZoom(-1);
BF_GLOBALS._sceneItems.push_back(&_lyle);
_motorcycle.setVisage(580);
_motorcycle.setStrip(2);
_motorcycle.setFrame(2);
} else if (BF_GLOBALS.getFlag(onDuty)) {
BF_GLOBALS._player.setVisage(352);
} else {
_motorcycle.setVisage(580);
_motorcycle.setStrip(2);
_motorcycle.setFrame(2);
}
BF_GLOBALS._sceneItems.push_back(&_motorcycle);
_doorway.postInit();
_doorway.setVisage(800);
_doorway.setStrip(3);
_doorway.setPosition(Common::Point(287, 140));
BF_GLOBALS._sceneItems.push_back(&_doorway);
_car1.postInit();
_car1.setVisage(800);
_car1.setStrip(2);
_car1.setFrame(1);
_car1.setPosition(Common::Point(58, 163));
BF_GLOBALS._sceneItems.push_back(&_car1);
if (BF_GLOBALS._sceneManager._previousScene == 810) {
if (BF_GLOBALS.getFlag(fWithLyle)) {
BF_GLOBALS._player.setPosition(Common::Point(271, 148));
BF_GLOBALS._player.enableControl();
} else {
BF_GLOBALS._player.changeZoom(75);
BF_GLOBALS._player.setPosition(Common::Point(275, 135));
BF_GLOBALS._player.disableControl();
_sceneMode = 8001;
setAction(&_sequenceManager, this, 8001, &BF_GLOBALS._player, &_doorway, NULL);
}
} else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && (BF_GLOBALS._bookmark == bFlashBackThree)) {
BF_GLOBALS._bookmark = bFlashBackThree;
BF_GLOBALS._player.disableControl();
BF_GLOBALS._player.setPosition(Common::Point(231, 150));
BF_GLOBALS._player.setStrip(3);
_lyle.setPosition(Common::Point(244, 162));
_lyle.setStrip(4);
_sceneMode = 8004;
setAction(&_sequenceManager, this, 8001, &_lyle, &_doorway, NULL);
} else {
BF_GLOBALS._player.updateAngle(_motorcycle._position);
BF_GLOBALS._player.enableControl();
}
_item2.setBounds(Rect(47, 26, 319, 143));
BF_GLOBALS._sceneItems.push_back(&_item2);
_item1.setBounds(Rect(0, 0, 320, 165));
BF_GLOBALS._sceneItems.push_back(&_item1);
BF_GLOBALS._sound1.fadeSound(33);
}
void Scene800::signal() {
switch (_sceneMode) {
case 8000:
BF_GLOBALS._sceneManager.changeScene(810);
break;
case 8001:
case 8005:
BF_GLOBALS._player.enableControl();
break;
case 8002:
case 8003:
BF_GLOBALS._sceneManager.changeScene(60);
break;
case 8004:
BF_GLOBALS.clearFlag(fWithLyle);
_lyle.remove();
}
}
void Scene800::dispatch() {
SceneExt::dispatch();
if (BF_GLOBALS._player.getRegionIndex() == 7) {
BF_GLOBALS._player.updateZoom();
} else {
BF_GLOBALS._player.changeZoom(-1);
}
}
} // End of namespace BlueForce
} // End of namespace TsAGE
@@ -0,0 +1,106 @@
/* 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.
*
*/
#ifndef TSAGE_BLUEFORCE_SCENES8_H
#define TSAGE_BLUEFORCE_SCENES8_H
#include "common/scummsys.h"
#include "tsage/blue_force/blueforce_logic.h"
#include "tsage/blue_force/blueforce_speakers.h"
#include "tsage/converse.h"
#include "tsage/events.h"
#include "tsage/core.h"
#include "tsage/scenes.h"
#include "tsage/globals.h"
#include "tsage/sound.h"
namespace TsAGE {
namespace BlueForce {
using namespace TsAGE;
class Scene800: public SceneExt {
/* Actions */
class Action1 : public Action {
public:
virtual void signal();
};
/* Items */
class Item1: public SceneHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Item2: public SceneHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
/* Objects */
class Doorway: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Car1: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Motorcycle: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Lyle: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Car2: public NamedObject {
public:
virtual bool startAction(CursorType action, Event &event);
};
public:
Action1 _action1;
SequenceManager _sequenceManager;
SpeakerJakeJacket _jakeJacketSpeaker;
SpeakerLyleHat _lyleHatSpeaker;
SpeakerGameText _gameTextSpeaker;
Doorway _doorway;
Car1 _car1;
Motorcycle _motorcycle;
Lyle _lyle;
Car2 _car2;
NamedObject _object6;
Item1 _item1;
Item2 _item2;
SceneText _text;
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
virtual void dispatch();
};
} // End of namespace BlueForce
} // End of namespace TsAGE
#endif
@@ -315,6 +315,36 @@ SpeakerJakeRadio::SpeakerJakeRadio(): VisualSpeaker() {
_speakerName = "JAKE_RADIO";
}
/*--------------------------------------------------------------------------*/
SpeakerLyleHat::SpeakerLyleHat(): VisualSpeaker() {
_color1 = 29;
_color2 = 89;
_xp = 75;
_speakerName = "LYLEHAT";
}
void SpeakerLyleHat::setText(const Common::String &msg) {
_removeObject1 = _removeObject2 = true;
_object1.postInit();
_object1.setVisage(278);
_object1.setStrip2(4);
_object1.fixPriority(254);
_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
_object2.postInit();
_object2.setVisage(278);
_object2.setStrip2(2);
_object2.fixPriority(255);
_object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
VisualSpeaker::setText(msg);
_object2.fixCountdown(8, _numFrames);
}
} // End of namespace BlueForce
} // End of namespace TsAGE
@@ -131,6 +131,13 @@ public:
virtual Common::String getClassName() { return "SpeakerJakeRadio"; }
};
class SpeakerLyleHat: public VisualSpeaker {
public:
SpeakerLyleHat();
virtual Common::String getClassName() { return "SpeakerLyleHat"; }
virtual void setText(const Common::String &msg);
};
} // End of namespace BlueForce
+31 -17
View File
@@ -33,6 +33,7 @@
#include "tsage/staticres.h"
#include "tsage/globals.h"
#include "tsage/sound.h"
#include "tsage/blue_force/blueforce_logic.h"
namespace TsAGE {
@@ -1683,6 +1684,16 @@ void SceneItem::display(const Common::String &msg) {
/*--------------------------------------------------------------------------*/
bool SceneHotspot::startAction(CursorType action, Event &event) {
if (_vm->getGameID() != GType_BlueForce)
return SceneItem::startAction(action, event);
else {
BlueForce::SceneExt *scene = (BlueForce::SceneExt *)BF_GLOBALS._sceneManager._scene;
assert(scene);
return scene->display(action);
}
}
void SceneHotspot::doAction(int action) {
switch ((int)action) {
case CURSOR_LOOK:
@@ -3820,27 +3831,30 @@ void SceneHandler::process(Event &event) {
}
// Scan the item list to find one the mouse is within
SynchronizedList<SceneItem *>::iterator i = _globals->_sceneItems.begin();
while ((i != _globals->_sceneItems.end()) && !(*i)->contains(event.mousePos))
++i;
SynchronizedList<SceneItem *>::iterator i;
for (i = _globals->_sceneItems.begin(); i != _globals->_sceneItems.end(); ++i) {
if ((*i)->contains(event.mousePos)) {
// Pass the action to the item
bool handled = (*i)->startAction(_globals->_events.getCursor(), event);
if (!handled)
// Item wasn't handled, keep scanning
continue;
if (i != _globals->_sceneItems.end()) {
// Pass the action to the item
(*i)->startAction(_globals->_events.getCursor(), event);
event.handled = _globals->_events.getCursor() != CURSOR_WALK;
event.handled = _globals->_events.getCursor() != CURSOR_WALK;
if (_globals->_player._uiEnabled && _globals->_player._canWalk &&
(_globals->_events.getCursor() != CURSOR_LOOK)) {
_globals->_events.setCursor(CURSOR_WALK);
} else if (_globals->_player._canWalk && (_globals->_events.getCursor() != CURSOR_LOOK)) {
_globals->_events.setCursor(CURSOR_WALK);
} else if (_globals->_player._uiEnabled && (_globals->_events.getCursor() != CURSOR_LOOK)) {
_globals->_events.setCursor(CURSOR_USE);
}
if (_globals->_player._uiEnabled && _globals->_player._canWalk &&
(_globals->_events.getCursor() != CURSOR_LOOK)) {
_globals->_events.setCursor(CURSOR_WALK);
} else if (_globals->_player._canWalk && (_globals->_events.getCursor() != CURSOR_LOOK)) {
_globals->_events.setCursor(CURSOR_WALK);
} else if (_globals->_player._uiEnabled && (_globals->_events.getCursor() != CURSOR_LOOK)) {
_globals->_events.setCursor(CURSOR_USE);
if (_vm->getGameID() == GType_BlueForce)
event.handled = true;
break;
}
if (_vm->getGameID() == GType_BlueForce)
event.handled = true;
}
// Handle any fallback text display
+3 -1
View File
@@ -440,7 +440,7 @@ public:
class SceneHotspot : public SceneItem {
public:
SceneHotspot() : SceneItem() {}
virtual bool startAction(CursorType action, Event &event);
virtual Common::String getClassName() { return "SceneHotspot"; }
virtual void doAction(int action);
};
@@ -450,6 +450,7 @@ public:
int _resNum, _lookLineNum, _useLineNum, _talkLineNum;
NamedHotspot();
virtual void doAction(int action);
virtual Common::String getClassName() { return "NamedHotspot"; }
virtual void synchronize(Serializer &s);
@@ -823,6 +824,7 @@ public:
return _regionList[idx - 1];
}
void proc1(int v) { warning("TODO: WalkRegions::proc1"); }
void proc2(int v) { warning("TODO: WalkRegions::proc2"); }
};
/*--------------------------------------------------------------------------*/
+1
View File
@@ -7,6 +7,7 @@ MODULE_OBJS := \
blue_force/blueforce_scenes1.o \
blue_force/blueforce_scenes3.o \
blue_force/blueforce_scenes6.o \
blue_force/blueforce_scenes8.o \
blue_force/blueforce_speakers.o \
blue_force/blueforce_ui.o \
converse.o \