aboutsummaryrefslogtreecommitdiff
path: root/engines/tsage
diff options
context:
space:
mode:
authorPaul Gilbert2011-08-20 19:14:23 +1000
committerPaul Gilbert2011-08-20 19:14:23 +1000
commita21133ed12228e9a818b696bbc148f5b53946a30 (patch)
tree060022b5a1728db495375da269c5b1bc60fecdcc /engines/tsage
parent0d887aa2459db04daddfd2a150f1d1ae4499091b (diff)
downloadscummvm-rg350-a21133ed12228e9a818b696bbc148f5b53946a30.tar.gz
scummvm-rg350-a21133ed12228e9a818b696bbc148f5b53946a30.tar.bz2
scummvm-rg350-a21133ed12228e9a818b696bbc148f5b53946a30.zip
TSAGE: Implemented Blue Force Scene #50 - Map Scene
Diffstat (limited to 'engines/tsage')
-rw-r--r--engines/tsage/blue_force/blueforce_logic.cpp114
-rw-r--r--engines/tsage/blue_force/blueforce_logic.h46
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.cpp263
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.h24
-rw-r--r--engines/tsage/core.cpp18
-rw-r--r--engines/tsage/core.h2
-rw-r--r--engines/tsage/globals.cpp21
-rw-r--r--engines/tsage/globals.h13
-rw-r--r--engines/tsage/ringworld/ringworld_logic.cpp14
-rw-r--r--engines/tsage/ringworld/ringworld_scenes1.cpp2
-rw-r--r--engines/tsage/scenes.cpp2
-rw-r--r--engines/tsage/sound.cpp4
-rw-r--r--engines/tsage/sound.h2
-rw-r--r--engines/tsage/staticres.cpp11
-rw-r--r--engines/tsage/staticres.h11
-rw-r--r--engines/tsage/tsage.cpp2
16 files changed, 517 insertions, 32 deletions
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
index ec85e48fbf..46c9307632 100644
--- a/engines/tsage/blue_force/blueforce_logic.cpp
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -33,7 +33,7 @@ namespace BlueForce {
void BlueForceGame::start() {
// Start the game
- _globals->_sceneManager.changeScene(100);
+ _globals->_sceneManager.changeScene(50);
_globals->_events.setCursor(CURSOR_WALK);
}
@@ -45,6 +45,7 @@ Scene *BlueForceGame::createScene(int sceneNumber) {
// Tsunami Title Screen
return new Scene20();
case 50:
+ return new Scene50();
case 60:
error("Scene group 0 not implemented");
/* Scene Group #1 */
@@ -55,6 +56,7 @@ Scene *BlueForceGame::createScene(int sceneNumber) {
// Introduction Bar Room
return new Scene109();
case 110:
+
case 114:
case 115:
case 125:
@@ -131,23 +133,23 @@ Scene *BlueForceGame::createScene(int sceneNumber) {
/*--------------------------------------------------------------------------*/
-ObjArray::ObjArray(): EventHandler() {
+AObjectArray::AObjectArray(): EventHandler() {
_inUse = false;
clear();
}
-void ObjArray::clear() {
+void AObjectArray::clear() {
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i)
_objList[i] = NULL;
}
-void ObjArray::synchronize(Serializer &s) {
+void AObjectArray::synchronize(Serializer &s) {
EventHandler::synchronize(s);
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i)
SYNC_POINTER(_objList[i]);
}
-void ObjArray::process(Event &event) {
+void AObjectArray::process(Event &event) {
if (_inUse)
error("Array error");
_inUse = true;
@@ -160,7 +162,7 @@ void ObjArray::process(Event &event) {
_inUse = false;
}
-void ObjArray::dispatch() {
+void AObjectArray::dispatch() {
if (_inUse)
error("Array error");
_inUse = true;
@@ -173,12 +175,94 @@ void ObjArray::dispatch() {
_inUse = false;
}
+int AObjectArray::getNewIndex() {
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
+ if (!_objList[i])
+ return i;
+ }
+ error("AObjectArray too full.");
+}
+
+void AObjectArray::add(EventHandler *obj) {
+ int idx = getNewIndex();
+ _objList[idx] = obj;
+}
+
+void AObjectArray::remove(EventHandler *obj) {
+ for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
+ if (_objList[i] == obj) {
+ _objList[i] = NULL;
+ return;
+ }
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Timer::Timer() {
+ _endFrame = 0;
+ _endAction = NULL;
+ _tickAction = NULL;
+}
+
+void Timer::remove() {
+ _endFrame = 0;
+ _endAction = NULL;
+
+ ((Scene100 *)BF_GLOBALS._sceneManager._scene)->removeTimer(this);
+}
+
+void Timer::signal() {
+ assert(_endAction);
+ Action *action = _endAction;
+ remove();
+ action->signal();
+}
+
+void Timer::dispatch() {
+ if (_tickAction)
+ _tickAction->dispatch();
+
+ if (_endFrame) {
+ uint32 frameNumber = BF_GLOBALS._events.getFrameNumber();
+ if (frameNumber > _endFrame)
+ // Timer has expired
+ signal();
+ }
+}
+
+void Timer::set(uint32 delay, Action *action) {
+ assert(delay != 0);
+
+ _endFrame = BF_GLOBALS._sceneHandler->getFrameDifference() + delay;
+ _endAction = action;
+
+ ((SceneExt *)BF_GLOBALS._sceneManager._scene)->addTimer(this);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void SceneItemType1::process(Event &event) {
+ if (_action)
+ _action->process(event);
+}
+
+void SceneItemType1::startMove(SceneObject *sceneObj, va_list va) {
+ warning("TODO: sub_1621C");
+}
+
+/*--------------------------------------------------------------------------*/
+
+void SceneItemType2::startMove(SceneObject *sceneObj, va_list va) {
+}
+
/*--------------------------------------------------------------------------*/
SceneExt::SceneExt(): Scene() {
warning("TODO: dword_503AA/dword_503AE/dword_53030");
_field372 = 0;
+ _field37A = 0;
_field37C = NULL;
}
@@ -200,7 +284,7 @@ void SceneExt::process(Event &event) {
}
void SceneExt::dispatch() {
- _objArray1.dispatch();
+ _timerList.dispatch();
if (_field37A) {
if ((--_field37A == 0) && BF_GLOBALS._v4CEA2) {
@@ -250,6 +334,22 @@ void GameScene::remove() {
BF_GLOBALS._scenePalette._field412 = 1;
}
+/*--------------------------------------------------------------------------*/
+
+void SceneHandlerExt::postInit(SceneObjectList *OwnerList) {
+ SceneHandler::postInit(OwnerList);
+
+ // Load the low end palette data
+ GLOBALS._scenePalette.loadPalette(2);
+ GLOBALS._scenePalette.refresh();
+}
+
+void SceneHandlerExt::process(Event &event) {
+ SceneHandler::process(event);
+
+ // TODO: All the new stuff from Blue Force
+}
+
} // End of namespace BlueForce
} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h
index 1ff6ecf507..9ab8a87a0c 100644
--- a/engines/tsage/blue_force/blueforce_logic.h
+++ b/engines/tsage/blue_force/blueforce_logic.h
@@ -44,23 +44,52 @@ public:
};
#define OBJ_ARRAY_SIZE 10
-class ObjArray: public EventHandler {
+class AObjectArray: public EventHandler {
public:
EventHandler *_objList[OBJ_ARRAY_SIZE];
bool _inUse;
+ int getNewIndex();
public:
- ObjArray();
+ AObjectArray();
void clear();
- virtual Common::String getClassName() { return "ObjArray"; }
+ virtual Common::String getClassName() { return "AObjectArray"; }
virtual void synchronize(Serializer &s);
virtual void process(Event &event);
virtual void dispatch();
+
+ void add(EventHandler *obj);
+ void remove(EventHandler *obj);
+};
+
+class Timer: public EventHandler {
+public:
+ Action *_tickAction;
+ Action *_endAction;
+ uint32 _endFrame;
+public:
+ Timer();
+ void set(uint32 delay, Action *action);
+
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
+class SceneItemType1: public SceneItem {
+public:
+ virtual void process(Event &event);
+ virtual void startMove(SceneObject *sceneObj, va_list va);
+};
+
+class SceneItemType2: public SceneItemType1 {
+public:
+ virtual void startMove(SceneObject *sceneObj, va_list va);
};
class SceneExt: public Scene {
public:
- ObjArray _objArray1, _objArray2;
+ AObjectArray _timerList, _objArray2;
int _field372;
int _field37A;
EventHandler *_field37C;
@@ -75,6 +104,9 @@ public:
virtual void dispatch();
virtual void loadScene(int sceneNum);
virtual void proc13() { warning("TODO: SceneExt::proc13"); }
+
+ void addTimer(Timer *timer) { _timerList.add(timer); }
+ void removeTimer(Timer *timer) { _timerList.remove(timer); }
};
class GameScene: public SceneExt {
@@ -88,6 +120,12 @@ public:
virtual void remove();
};
+class SceneHandlerExt: public SceneHandler {
+public:
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void process(Event &event);
+};
+
class BlueAnimatedSpeaker: public Speaker {
public:
};
diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp
index cc0f9bb1fd..bf9a7572ae 100644
--- a/engines/tsage/blue_force/blueforce_scenes0.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes0.cpp
@@ -199,14 +199,13 @@ void Scene20::postInit(SceneObjectList *OwnerList) {
*--------------------------------------------------------------------------*/
Scene50::Tooltip::Tooltip(): SavedObject() {
- strcpy(_msg, "");
- _field60 = _field62 = 0;
+ _newSceneNumber = _locationId = 0;
}
void Scene50::Tooltip::synchronize(Serializer &s) {
SavedObject::synchronize(s);
_bounds.synchronize(s);
- s.syncBytes((byte *)&_msg[0], 84);
+ s.syncString(_msg);
}
void Scene50::Tooltip2::signal() {
@@ -237,8 +236,266 @@ void Scene50::Tooltip2::dispatch() {
}
}
+void Scene50::Tooltip::set(const Rect &bounds, int v60, const Common::String &msg, int v62) {
+ _bounds = bounds;
+ _newSceneNumber = v60;
+ _msg = msg;
+ _locationId = v62;
+}
+
+void Scene50::Tooltip::update() {
+ // Set up the text object for the scene with the appropriate settings
+ Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene;
+ scene->_text._fontNumber = 10;
+ scene->_text._color1 = BF_GLOBALS._scenePalette._colors.foreground;
+ scene->_text._color2 = BF_GLOBALS._scenePalette._colors.background;
+ scene->_text.setup(_msg);
+
+ int yp = (scene->_text._textSurface.getBounds().height() == 0) ? _bounds.bottom : _bounds.top;
+ scene->_text.setPosition(Common::Point(_bounds.left, yp));
+}
+
+void Scene50::Tooltip::highlight(bool btnDown) {
+ Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene;
+
+ scene->_field382 = _newSceneNumber;
+ if ((scene->_field380 != 0) || (scene->_field380 != _newSceneNumber))
+ update();
+
+ if (btnDown) {
+ if ((BF_GLOBALS._bikiniHutState == 14) && BF_GLOBALS.getFlag(98))
+ scene->_sceneNumber = 600;
+ else if (BF_GLOBALS._bikiniHutState == 5)
+ scene->_sceneNumber = 410;
+ else {
+ BF_GLOBALS._v4CEF4 = _newSceneNumber;
+
+ switch (BF_GLOBALS._v4CEF2) {
+ case 330:
+ case 340:
+ case 342:
+ BF_GLOBALS._player.disableControl();
+ if (_locationId != BF_GLOBALS._mapLocationId) {
+ scene->_sceneNumber = 330;
+ } else {
+ scene->_sceneNumber = (BF_GLOBALS._v4CEA2 != 1) || (BF_GLOBALS._bikiniHutState < 1) ||
+ (BF_GLOBALS._bikiniHutState >= 2) ? 342 : 340;
+ }
+ break;
+
+ case 410:
+ case 551:
+ if (BF_GLOBALS.getFlag((BF_GLOBALS._v4CEF2 == 410) ? 41 : 40)) {
+ BF_GLOBALS._mapLocationId = _locationId;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneNumber = _newSceneNumber;
+ } else {
+ BF_GLOBALS._v4CEA8 = 4;
+ BF_GLOBALS._sceneManager.changeScene(666);
+ return;
+ }
+ break;
+
+ case 300:
+ if (_locationId == 1) {
+ BF_GLOBALS._v4CEF4 = 300;
+ _newSceneNumber = 300;
+ }
+ // Deliberate fall through to default
+ default:
+ BF_GLOBALS._mapLocationId = _locationId;
+ BF_GLOBALS._player.disableControl();
+ scene->_sceneNumber = _newSceneNumber;
+ break;
+ }
+
+ // Signal the scene to change to the new scene
+ scene->_sceneMode = 1;
+ scene->signal();
+ }
+ }
+}
+
/*--------------------------------------------------------------------------*/
+Scene50::Scene50(): SceneExt() {
+ _field382 = 0;
+ _field380 = 0;
+}
+
+void Scene50::postInit(SceneObjectList *OwnerList) {
+ SceneExt::postInit();
+
+ BF_GLOBALS._interfaceY = 200;
+ BF_GLOBALS._player.postInit();
+ BF_GLOBALS._player.setVisage(830);
+ BF_GLOBALS._player.setStrip(3);
+ BF_GLOBALS._player.setPosition(Common::Point(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2));
+ BF_GLOBALS._player.hide();
+ BF_GLOBALS._player.enableControl();
+ BF_GLOBALS._player._uiEnabled = false;
+
+ BF_GLOBALS._scrollFollower = NULL;
+ _text._color1 = 19;
+ _text._color2 = 9;
+ _text._color3 = 9;
+ _text._width = 75;
+ _text._fontNumber = 4;
+ _text._textMode = ALIGN_LEFT;
+ _text.fixPriority(256);
+
+ // Set all the hotspots
+ _location3.set(Rect(10, 92, 24, 105), 180, GRANDMA_FRANNIE, 4);
+ _location2.set(Rect(443, 149, 508, 178), 330, MARINA, 2);
+ _location1.set(Rect(573, 103, 604, 130), 190, POLICE_DEPARTMENT, 1);
+ _location4.set(Rect(313, 21, 325, 33), 114, TONYS_BAR, 8);
+ _location8.set(Rect(69, 79, 82, 88), 580, CHILD_PROTECTIVE_SERVICES, 256);
+ _location6.set(Rect(242, 131, 264, 144), 440, ALLEY_CAT, 64);
+ _location5.set(Rect(383, 57, 402, 70), 380, CITY_HALL_JAIL, 32);
+ _location7.set(Rect(128, 32, 143, 42), 800, JAMISON_RYAN, 128);
+ _location9.set(Rect(349, 125, 359, 132),
+ (BF_GLOBALS._bikiniHutState == 13) || (BF_GLOBALS._bikiniHutState == 14) ? 551 : 550,
+ BIKINI_HUT, 16);
+
+ _item.setBounds(Rect(0, 0, SCREEN_WIDTH * 2, SCREEN_HEIGHT));
+ BF_GLOBALS._sceneItems.push_back(&_item);
+
+ // Find the location to start at
+ int selectedTooltip = BF_GLOBALS._mapLocationId;
+ Tooltip *tooltip = NULL;
+ int xp = 0;
+
+ switch (selectedTooltip) {
+ case 1:
+ tooltip = &_location1;
+ xp = 588;
+ break;
+ case 2:
+ tooltip = &_location2;
+ xp = 475;
+ break;
+ case 4:
+ tooltip = &_location3;
+ xp = 17;
+ break;
+ case 8:
+ tooltip = &_location4;
+ xp = 319;
+ break;
+ case 32:
+ tooltip = &_location5;
+ xp = 392;
+ break;
+ case 64:
+ tooltip = &_location6;
+ xp = 253;
+ break;
+ case 128:
+ tooltip = &_location7;
+ xp = 135;
+ break;
+ case 16:
+ tooltip = &_location9;
+ xp = 354;
+ break;
+ case 256:
+ tooltip = &_location8;
+ xp = 75;
+ break;
+ }
+
+ loadBackground(xp - 160, 0);
+ tooltip->update();
+
+ _timer.set(240, this);
+ _sceneBounds.center(xp, SCREEN_HEIGHT / 2);
+ loadScene(55);
+ _sceneMode = 2;
+}
+
+void Scene50::remove() {
+ // Blank out the screen
+ BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0);
+
+ SceneExt::remove();
+ BF_GLOBALS._v4E238 = 1;
+}
+
+void Scene50::signal() {
+ if (_sceneMode == 1) {
+ // Destination selected
+ if ((BF_GLOBALS._v4CEF2 == 551) && (_sceneNumber != BF_GLOBALS._v4CEF2)) {
+ BF_GLOBALS.setFlag(109);
+ BF_GLOBALS.setFlag(115);
+ BF_GLOBALS.setFlag(121);
+ BF_GLOBALS.setFlag(127);
+ BF_GLOBALS.setFlag(133);
+ }
+
+ if ((BF_GLOBALS._v4CEF2 == 410) && (_sceneNumber != BF_GLOBALS._v4CEF2)) {
+ BF_GLOBALS.setFlag(125);
+ }
+
+ if ((BF_GLOBALS._v4CEF2 == 340) && (_sceneNumber != BF_GLOBALS._v4CEF2)) {
+ BF_GLOBALS.setFlag(123);
+ }
+
+ if ((BF_GLOBALS._v4CEF2 == 380) && (_sceneNumber != BF_GLOBALS._v4CEF2)) {
+ if (BF_GLOBALS._bikiniHutState >= 4)
+ BF_GLOBALS.setFlag(129);
+ if (BF_GLOBALS._bikiniHutState >= 6)
+ BF_GLOBALS.setFlag(131);
+ if (BF_GLOBALS._bikiniHutState == 3) {
+ BF_GLOBALS._v4CEA8 = 19;
+ _sceneNumber = 666;
+ }
+ }
+
+ if ((_sceneNumber == 551) && BF_GLOBALS.getFlag(147))
+ _sceneNumber = 550;
+
+ BF_GLOBALS._sound1.fadeOut2(NULL);
+ BF_GLOBALS._sceneManager.changeScene(_sceneNumber);
+
+ } else if (_sceneMode == 2) {
+ // Initial delay complete, time to switch to interactive mode
+ _text.remove();
+ BF_GLOBALS._player.enableControl();
+ _sceneMode = 0;
+ _field380 = 0;
+ }
+}
+
+void Scene50::process(Event &event) {
+ SceneExt::process(event);
+ Common::Point pt(event.mousePos.x + _sceneBounds.left, event.mousePos.y + _sceneBounds.top);
+ bool mouseDown = false;
+ _field382 = 0;
+
+ if ((event.mousePos.x > 270 && (_sceneBounds.right < (SCREEN_WIDTH * 2))))
+ loadBackground(4, 0);
+ else if ((event.mousePos.x < 50) && (_sceneBounds.left > 0))
+ loadBackground(-4, 0);
+ else
+ mouseDown = event.eventType == EVENT_BUTTON_DOWN;
+
+ if (BF_GLOBALS._player._uiEnabled) {
+ Tooltip *tooltipList[9] = { &_location1, &_location2, &_location3, &_location4,
+ &_location5, &_location6, &_location7, &_location8, &_location9 };
+
+ for (int idx = 0; idx < 9; ++idx) {
+ if (tooltipList[idx]->_bounds.contains(pt)) {
+ // Found a tooltip to highlight
+ tooltipList[idx]->highlight(mouseDown);
+ return;
+ }
+ }
+
+ // No hotspot selected, so remove any current tooltip display
+ _text.remove();
+ }
+}
+
} // End of namespace BlueForce
} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h
index 587941e59e..5c98184ed8 100644
--- a/engines/tsage/blue_force/blueforce_scenes0.h
+++ b/engines/tsage/blue_force/blueforce_scenes0.h
@@ -59,11 +59,14 @@ class Scene50: public SceneExt {
class Tooltip: public SavedObject {
public:
Rect _bounds;
- char _msg[80];
- int _field60;
- int _field62;
+ Common::String _msg;
+ int _newSceneNumber;
+ int _locationId;
public:
Tooltip();
+ void set(const Rect &bounds, int v60, const Common::String &msg, int v62);
+ void update();
+ void highlight(bool btnDown);
virtual Common::String getClassName() { return "Scene50_Tooltip"; }
virtual void synchronize(Serializer &s);
@@ -77,7 +80,20 @@ class Scene50: public SceneExt {
virtual void dispatch();
};
public:
-
+ int _field380, _field382;
+ int _sceneNumber;
+ SceneText _text;
+ SceneItemType2 _item;
+ Tooltip _location1, _location2, _location3, _location4, _location5;
+ Tooltip _location6, _location7, _location8, _location9;
+ Timer _timer;
+public:
+ Scene50();
+ virtual Common::String getClassName() { return "Scene50"; }
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void process(Event &event);
};
} // End of namespace BlueForce
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 864c3af103..7ad2084985 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -3473,6 +3473,7 @@ void GameHandler::synchronize(Serializer &s) {
SceneHandler::SceneHandler() {
_saveGameSlot = -1;
_loadGameSlot = -1;
+ _prevFrameNumber = 0;
}
void SceneHandler::registerHandler() {
@@ -3480,6 +3481,10 @@ void SceneHandler::registerHandler() {
_globals->_game->addHandler(this);
}
+uint32 SceneHandler::getFrameDifference() {
+ return GLOBALS._events.getFrameNumber() - _prevFrameNumber;
+}
+
void SceneHandler::postInit(SceneObjectList *OwnerList) {
_delayTicks = 2;
@@ -3594,10 +3599,19 @@ void SceneHandler::dispatch() {
// Not actually used
//_eventListeners.forEach(SceneHandler::handleListener);
- // Handle pending eents
+ // Handle pending events
Event event;
- while (_globals->_events.getEvent(event))
+ if (_globals->_events.getEvent(event)) {
+ // Process pending events
+ do {
+ process(event);
+ } while (_globals->_events.getEvent(event));
+ } else if (_vm->getGameID() == GType_BlueForce) {
+ // For Blue Force, 'none' events need to be generated in the absence of any
+ event.eventType = EVENT_NONE;
+ event.mousePos = _globals->_events._mousePos;
process(event);
+ }
// Handle drawing the contents of the scene
if (_globals->_sceneManager._scene)
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 96e7e82fe5..19987ed399 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -846,9 +846,11 @@ public:
int _loadGameSlot;
int _delayTicks;
Common::String _saveName;
+ uint32 _prevFrameNumber;
public:
SceneHandler();
void registerHandler();
+ uint32 getFrameDifference();
virtual Common::String getClassName() { return "SceneHandler"; }
virtual void postInit(SceneObjectList *OwnerList = NULL);
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index 47c83fcc94..27067c7d1c 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -116,10 +116,12 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
} else {
_game = new Ringworld::RingworldDemoGame();
}
+ _sceneHandler = new SceneHandler();
break;
case GType_BlueForce:
_game = new BlueForce::BlueForceGame();
+ _sceneHandler = new BlueForce::SceneHandlerExt();
break;
}
}
@@ -127,6 +129,7 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface
Globals::~Globals() {
_scenePalette.clearListeners();
delete _inventory;
+ delete _sceneHandler;
delete _game;
_globals = NULL;
}
@@ -183,6 +186,16 @@ BlueForceGlobals::BlueForceGlobals(): Globals() {
_interfaceY = 0;
_v51C44 = 1;
_v4CEA2 = 0;
+ _v4CEA8 = 0;
+ _v4CEF2 = 0;
+ _v4CEF4 = 0;
+ _v4CF9E = 0;
+ _v4E238 = 0;
+ _v501FC = 0;
+ _v51C42 = 0;
+ _bikiniHutState = 0;
+ _mapLocationId = 1;
+ Common::set_to(&_globalFlags[0], &_globalFlags[12], 0);
}
void BlueForceGlobals::synchronize(Serializer &s) {
@@ -190,6 +203,14 @@ void BlueForceGlobals::synchronize(Serializer &s) {
error("Sync variables");
}
+bool BlueForceGlobals::getFlag(int v) {
+ return _globalFlags[v / 16] & (1 << (v % 8));
+}
+
+void BlueForceGlobals::setFlag(int v) {
+ _globalFlags[v / 16] |= 1 << (v % 8);
+}
+
} // end of namespace BlueForce
} // end of namespace TsAGE
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index c8cfc1c323..2d409b6343 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -40,7 +40,7 @@ public:
GfxSurface _screenSurface;
GfxManager _gfxManagerInstance;
Common::List<GfxManager *> _gfxManagers;
- SceneHandler _sceneHandler;
+ SceneHandler *_sceneHandler;
Game *_game;
EventsClass _events;
SceneManager _sceneManager;
@@ -112,18 +112,27 @@ using namespace TsAGE;
class BlueForceGlobals: public Globals {
public:
- ASound _sound1, _sound2, _sound3;
+ ASoundExt _sound1, _sound2, _sound3;
int _v4CEA2;
+ int _v4CEA8;
+ int _v4CEF2;
+ int _v4CEF4;
int _v4CF9E;
int _v4E238;
int _v501FC;
int _v51C42;
int _v51C44;
int _interfaceY;
+ int _bikiniHutState;
+ int _mapLocationId;
+ uint8 _globalFlags[12];
BlueForceGlobals();
virtual Common::String getClassName() { return "BFGlobals"; }
virtual void synchronize(Serializer &s);
+
+ void setFlag(int v);
+ bool getFlag(int v);
};
} // End of namespace BlueForce
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
index d6e72fe95c..2a34e49b39 100644
--- a/engines/tsage/ringworld/ringworld_logic.cpp
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -1287,7 +1287,7 @@ void RingworldGame::saveGame() {
MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING);
else {
// Show the save dialog
- handleSaveLoad(true, _globals->_sceneHandler._saveGameSlot, _globals->_sceneHandler._saveName);
+ handleSaveLoad(true, _globals->_sceneHandler->_saveGameSlot, _globals->_sceneHandler->_saveName);
}
}
@@ -1296,7 +1296,7 @@ void RingworldGame::restoreGame() {
MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING);
else {
// Show the load dialog
- handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
+ handleSaveLoad(false, _globals->_sceneHandler->_loadGameSlot, _globals->_sceneHandler->_saveName);
}
}
@@ -1348,7 +1348,7 @@ void RingworldGame::start() {
}
if (slot >= 0)
- _globals->_sceneHandler._loadGameSlot = slot;
+ _globals->_sceneHandler->_loadGameSlot = slot;
else
// Switch to the title screen
_globals->_sceneManager.setNewScene(1000);
@@ -1365,8 +1365,8 @@ void RingworldGame::restart() {
_globals->setFlag(34);
// Clear save/load slots
- _globals->_sceneHandler._saveGameSlot = -1;
- _globals->_sceneHandler._loadGameSlot = -1;
+ _globals->_sceneHandler->_saveGameSlot = -1;
+ _globals->_sceneHandler->_loadGameSlot = -1;
_globals->_stripNum = 0;
_globals->_events.setCursor(CURSOR_WALK);
@@ -1431,8 +1431,8 @@ void RingworldGame::endGame(int resNum, int lineNum) {
restart();
breakFlag = true;
} else {
- handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
- breakFlag = _globals->_sceneHandler._loadGameSlot >= 0;
+ handleSaveLoad(false, _globals->_sceneHandler->_loadGameSlot, _globals->_sceneHandler->_saveName);
+ breakFlag = _globals->_sceneHandler->_loadGameSlot >= 0;
}
} while (!breakFlag);
}
diff --git a/engines/tsage/ringworld/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp
index 332aef6d8d..20af25561c 100644
--- a/engines/tsage/ringworld/ringworld_scenes1.cpp
+++ b/engines/tsage/ringworld/ringworld_scenes1.cpp
@@ -3168,7 +3168,7 @@ Scene6100::Scene6100(): Scene() {
_angle = 0;
_msgActive = false;
- _globals->_sceneHandler._delayTicks = 8;
+ _globals->_sceneHandler->_delayTicks = 8;
_globals->_player.disableControl();
_globals->_events.setCursor(CURSOR_WALK);
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index 53e48a1d21..c3625452de 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -113,7 +113,7 @@ void SceneManager::sceneChange() {
assert(_objectCount == _saver->getObjectCount());
}
_objectCount = _saver->getObjectCount();
- _globals->_sceneHandler._delayTicks = 2;
+ _globals->_sceneHandler->_delayTicks = 2;
// Instantiate and set the new scene
_scene = getNewScene();
diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp
index 22aff6cb04..7c8dc83fe9 100644
--- a/engines/tsage/sound.cpp
+++ b/engines/tsage/sound.cpp
@@ -2477,6 +2477,10 @@ void ASoundExt::signal() {
}
}
+void ASoundExt::fadeOut2(Action *action) {
+ fade(0, 10, 10, true, action);
+}
+
/*--------------------------------------------------------------------------*/
SoundDriver::SoundDriver() {
diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h
index 9507d22cfb..afcc8f6377 100644
--- a/engines/tsage/sound.h
+++ b/engines/tsage/sound.h
@@ -406,6 +406,8 @@ public:
int _soundNum;
ASoundExt();
+ void fadeOut2(Action *action);
+
virtual Common::String getClassName() { return "ASoundExt"; }
virtual void synchronize(Serializer &s);
virtual void signal();
diff --git a/engines/tsage/staticres.cpp b/engines/tsage/staticres.cpp
index deb6fd61a6..819cf56f31 100644
--- a/engines/tsage/staticres.cpp
+++ b/engines/tsage/staticres.cpp
@@ -144,6 +144,17 @@ const char *BF_11_YEARS = "Eleven years later.";
const char *BF_NEXT_DAY = "The Next Day";
const char *BF_ACADEMY = "Here we are at the Academy";
+// Scene 50 hotspots
+const char *GRANDMA_FRANNIE = "Grandma Frannie";
+const char *MARINA = "Marina";
+const char *POLICE_DEPARTMENT = "Police Department";
+const char *TONYS_BAR = "Tony's Bar";
+const char *CHILD_PROTECTIVE_SERVICES = "Child Protective Services";
+const char *ALLEY_CAT = "Alley Cat";
+const char *CITY_HALL_JAIL = "City Hall & Jail";
+const char *JAMISON_RYAN = "Jamison & Ryan";
+const char *BIKINI_HUT = "Bikini Hut";
+
} // End of namespace BlueForce
} // End of namespace TsAGE
diff --git a/engines/tsage/staticres.h b/engines/tsage/staticres.h
index 290d627090..b08e92def2 100644
--- a/engines/tsage/staticres.h
+++ b/engines/tsage/staticres.h
@@ -110,6 +110,17 @@ extern const char *BF_11_YEARS;
extern const char *BF_NEXT_DAY;
extern const char *BF_ACADEMY;
+// Scene 50 tooltips
+extern const char *GRANDMA_FRANNIE;
+extern const char *MARINA;
+extern const char *POLICE_DEPARTMENT;
+extern const char *TONYS_BAR;
+extern const char *CHILD_PROTECTIVE_SERVICES;
+extern const char *ALLEY_CAT;
+extern const char *CITY_HALL_JAIL;
+extern const char *JAMISON_RYAN;
+extern const char *BIKINI_HUT;
+
} // End of namespace BlueForce
} // End of namespace TsAGE
diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp
index b958933c0c..2fcabff16c 100644
--- a/engines/tsage/tsage.cpp
+++ b/engines/tsage/tsage.cpp
@@ -102,7 +102,7 @@ Common::Error TSageEngine::run() {
// Basic initialisation
initialize();
- _globals->_sceneHandler.registerHandler();
+ _globals->_sceneHandler->registerHandler();
_globals->_game->execute();
deinitialize();