aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/tsage/globals.cpp3
-rw-r--r--engines/tsage/globals.h1
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp123
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.h34
4 files changed, 147 insertions, 14 deletions
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index d2999a2603..d21321a201 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -380,7 +380,9 @@ void Ringworld2Globals::reset() {
_v57C2C = 0;
_v58CE2 = 0;
Common::set_to(&_v565F1[0], &_v565F1[MAX_CHARACTERS], 0);
+ _insetUp = 0;
+ // Reset fields stored in the player class
_player._characterIndex = 1;
_player._characterScene[1] = 100;
_player._characterScene[2] = 300;
@@ -396,6 +398,7 @@ void Ringworld2Globals::synchronize(Serializer &s) {
s.syncAsSint16LE(_v58CE2);
for (int i = 0; i < MAX_CHARACTERS; ++i)
s.syncAsSint16LE(_v565F1[i]);
+ s.syncAsSint16LE(_insetUp);
}
} // end of namespace Ringworld2
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index c4108e175c..d644a02e7c 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -243,6 +243,7 @@ class Ringworld2Globals: public TsAGE2Globals {
public:
ASoundExt _sound1, _sound2, _sound3, _sound4;
PlayStream _playStream;
+ int _insetUp;
int _v565F5;
int _v5657C;
int _v57C2C;
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index fa8d0be1af..7294b3d726 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -176,18 +176,8 @@ void SceneExt::postInit(SceneObjectList *OwnerList) {
}
void SceneExt::remove() {
-/*
- R2_GLOBALS._uiElements.hide();
- R2_GLOBALS._uiElements.resetClear();
-
- if (_action) {
- if (_action->_endHandler)
- _action->_endHandler = NULL;
- _action->remove();
- }
-
- _focusObject = NULL;
-*/
+ _sceneAreas.clear();
+ Scene::remove();
}
void SceneExt::process(Event &event) {
@@ -338,7 +328,17 @@ void SceneHandlerExt::process(Event &event) {
return;
}
- SceneHandler::process(event);
+ SceneExt *scene = static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene);
+ if (scene) {
+ // Handle any scene areas that have been registered
+ SynchronizedList<SceneArea *>::iterator saIter;
+ for (saIter = scene->_sceneAreas.begin(); saIter != scene->_sceneAreas.end() && !event.handled; ++saIter) {
+ (*saIter)->process(event);
+ }
+ }
+
+ if (!event.handled)
+ SceneHandler::process(event);
}
/*--------------------------------------------------------------------------*/
@@ -880,6 +880,103 @@ void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int us
_useLineNum = useLineNum;
}
+/*--------------------------------------------------------------------------*/
+
+SceneArea::SceneArea(): EventHandler() {
+ _enabled = true;
+ _insideArea = false;
+ _savedCursorNum = CURSOR_NONE;
+ _cursorState = 0;
+}
+
+void SceneArea::synchronize(Serializer &s) {
+ EventHandler::synchronize(s);
+
+ _bounds.synchronize(s);
+ s.syncAsSint16LE(_enabled);
+ s.syncAsSint16LE(_insideArea);
+ s.syncAsSint16LE(_cursorNum);
+ s.syncAsSint16LE(_savedCursorNum);
+ s.syncAsSint16LE(_cursorState);
+}
+
+void SceneArea::remove() {
+ static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene)->_sceneAreas.remove(this);
+}
+
+void SceneArea::process(Event &event) {
+ if (!R2_GLOBALS._insetUp && _enabled && R2_GLOBALS._events.isCursorVisible()) {
+ CursorType cursor = R2_GLOBALS._events.getCursor();
+
+ if (_bounds.contains(event.mousePos)) {
+ // Cursor moving in bounded area
+ if (cursor != _cursorNum) {
+ _savedCursorNum = cursor;
+ _cursorState = 0;
+ R2_GLOBALS._events.setCursor(_cursorNum);
+ }
+ _insideArea = true;
+ } else if ((event.mousePos.y < 171) && _insideArea && (_cursorNum != cursor) &&
+ (_savedCursorNum != CURSOR_NONE)) {
+ // Cursor moved outside bounded area
+ R2_GLOBALS._events.setCursor(_savedCursorNum);
+ }
+ }
+}
+
+void SceneArea::setDetails(const Rect &bounds, CursorType cursor) {
+ _bounds = bounds;
+ _cursorNum = cursor;
+
+ static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene)->_sceneAreas.push_front(this);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SceneExit::SceneExit(): SceneArea() {
+ _moving = false;
+ _destPos = Common::Point(-1, -1);
+}
+
+void SceneExit::synchronize(Serializer &s) {
+ SceneArea::synchronize(s);
+
+ s.syncAsSint16LE(_moving);
+ s.syncAsSint16LE(_destPos.x);
+ s.syncAsSint16LE(_destPos.y);
+}
+
+void SceneExit::setDetails(const Rect &bounds, CursorType cursor, int sceneNumber) {
+ _sceneNumber = sceneNumber;
+ SceneArea::setDetails(bounds, cursor);
+}
+
+void SceneExit::changeScene() {
+ R2_GLOBALS._sceneManager.setNewScene(_sceneNumber);
+}
+
+void SceneExit::process(Event &event) {
+ if (!R2_GLOBALS._insetUp) {
+ SceneArea::process(event);
+
+ if (_enabled && (event.eventType == EVENT_BUTTON_DOWN)) {
+ if (!_bounds.contains(event.mousePos))
+ _moving = 0;
+ else if (!R2_GLOBALS._player._canWalk) {
+ _moving = 0;
+ changeScene();
+ event.handled = true;
+ } else {
+ Common::Point dest((_destPos.x == -1) ? event.mousePos.x : _destPos.x,
+ (_destPos.y == -1) ? event.mousePos.y : _destPos.y);
+ ADD_PLAYER_MOVER(dest.x, dest.y);
+
+ _moving = true;
+ event.handled = true;
+ }
+ }
+ }
+}
} // End of namespace Ringworld2
diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h
index 4adfc9bc05..152e6f8518 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.h
+++ b/engines/tsage/ringworld2/ringworld2_logic.h
@@ -42,6 +42,38 @@ public:
static Scene *createScene(int sceneNumber);
};
+class SceneArea: public EventHandler {
+public:
+ Rect _bounds;
+ bool _enabled;
+ bool _insideArea;
+ CursorType _cursorNum;
+ CursorType _savedCursorNum;
+ int _cursorState;
+public:
+ SceneArea();
+ void setDetails(const Rect &bounds, CursorType cursor);
+
+ virtual void synchronize(Serializer &s);
+ virtual void remove();
+ virtual void process(Event &event);
+};
+
+class SceneExit: public SceneArea {
+public:
+ bool _moving;
+ int _sceneNumber;
+ Common::Point _destPos;
+public:
+ SceneExit();
+ void setDetails(const Rect &bounds, CursorType cursor, int sceneNumber);
+ void setDest(const Common::Point &p) { _destPos = p; }
+ void changeScene();
+
+ virtual void synchronize(Serializer &s);
+ virtual void process(Event &event);
+};
+
class SceneExt: public Scene {
private:
static void startStrip();
@@ -55,6 +87,7 @@ public:
SceneObject *_focusObject;
Visage _cursorVisage;
+ SynchronizedList<SceneArea *> _sceneAreas;
Rect _v51C34;
public:
@@ -249,7 +282,6 @@ public:
}
};
-
} // End of namespace Ringworld2
} // End of namespace TsAGE