From 38b3f18029cbcb5bca476164eeaf63800e527a7d Mon Sep 17 00:00:00 2001 From: strangerke Date: Sun, 3 Apr 2011 23:43:36 +0200 Subject: TSAGE: Fix SpeakerGText, Add SpeakerOR, implement Scene9400 --- engines/tsage/ringworld_logic.cpp | 38 ++++++++++- engines/tsage/ringworld_logic.h | 7 +++ engines/tsage/ringworld_scenes10.cpp | 118 +++++++++++++++++++++++++++++++++++ engines/tsage/ringworld_scenes10.h | 45 ++++++++++++- 4 files changed, 202 insertions(+), 6 deletions(-) (limited to 'engines') diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 8a174a4822..89b298bd74 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -157,6 +157,7 @@ Scene *SceneFactory::createScene(int sceneNumber) { case 9300: return new Scene9300(); case 9350: return new Scene9350(); case 9360: return new Scene9360(); + case 9400: return new Scene9400(); case 9700: return new Scene9700(); case 9750: return new Scene9750(); case 9999: return new Scene9999(); @@ -325,17 +326,16 @@ void SpeakerGText::setText(const Common::String &msg) { _globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth); textRect.centre(_sceneObject._position.x, _sceneObject._position.y); _textPos.x = textRect.left; - setText(msg); + Speaker::setText(msg); } void SpeakerGText::removeText() { _sceneObject.remove(); - removeText(); + Speaker::removeText(); } /*--------------------------------------------------------------------------*/ - SpeakerPOR::SpeakerPOR() { _speakerName = "POR"; _newSceneNumber = 7221; @@ -384,6 +384,38 @@ void SpeakerPOR::setText(const Common::String &msg) { /*--------------------------------------------------------------------------*/ +SpeakerOR::SpeakerOR() { + _speakerName = "OR"; + _newSceneNumber = 9430; + _textPos = Common::Point(8, 36); + _colour1 = 42; + _textWidth = 136; +} + +void SpeakerOR::setText(const Common::String &msg) { + _object1.postInit(&_objectList); + _object1.setVisage(9431); + _object1.setStrip2(2); + _object1.setPriority2(255); + _object1.changeZoom(100); + _object1._frame = 1; + _object1.setPosition(Common::Point(202, 147), 0); + _object1.animate(ANIM_MODE_7, 0, 0); + + _object2.postInit(&_objectList); + _object2.setVisage(9431); + _object2.setStrip2(1); + _object2.setPriority2(255); + _object2.setZoom(100); + _object2._frame = 1; + _object2.setPosition(Common::Point(199, 85), 0); + _object2.setAction(&_speakerAction, 0); + + Speaker::setText(msg); +} + +/*--------------------------------------------------------------------------*/ + SpeakerOText::SpeakerOText(): SpeakerGText() { _speakerName = "OTEXT"; _textWidth = 240; diff --git a/engines/tsage/ringworld_logic.h b/engines/tsage/ringworld_logic.h index 047c6220d5..281833fc38 100644 --- a/engines/tsage/ringworld_logic.h +++ b/engines/tsage/ringworld_logic.h @@ -131,6 +131,13 @@ public: virtual void setText(const Common::String &msg); }; +class SpeakerOR: public AnimatedSpeaker { +public: + SpeakerOR(); + virtual Common::String getClassName() { return "SpeakerOR"; } + virtual void setText(const Common::String &msg); +}; + class SpeakerOText: public SpeakerGText { public: SpeakerOText(); diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp index bebf199a2d..add5a6ba0c 100644 --- a/engines/tsage/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld_scenes10.cpp @@ -696,6 +696,124 @@ void Scene9360::postInit(SceneObjectList *OwnerList) { _object1.quickInit(9351, 1, 1, 131, 90, 0); } +/*-------------------------------------------------------------------------- + * Scene 9400 + * + *--------------------------------------------------------------------------*/ +Scene9400::Scene9400() { + _field1032 = 0; +} + +void Scene9400::SceneHotspot7::doAction(int action) { + Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; + + if ((action == CURSOR_USE) && (_globals->_inventory._straw._sceneNumber != 1)) { + scene->_sceneState = 1; + scene->setAction(&scene->_sequenceManager, scene, 9408, &_globals->_player, 0); + } else { + SceneHotspot_3::doAction(action); + } +} + +void Scene9400::SceneHotspot8::doAction(int action) { + Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; + + if (action == CURSOR_TALK) { + _globals->_player.disableControl(); + scene->_sceneState = 2; + scene->signal(); + } else { + SceneHotspot_3::doAction(action); + } +} + +void Scene9400::signal() { + switch (_sceneState ++) { + case 0: + _object1._numFrames = 6; + _stripManager.start(9400, this); + break; + case 1: + _object1._numFrames = 6; + _object1.animate(ANIM_MODE_2, 0); + _globals->_player.enableControl(); + break; + case 2: + _object1.animate(ANIM_MODE_5, this); + break; + case 3: + _stripManager.start(9405, this); + break; + case 4: + _object1.animate(ANIM_MODE_2, this); + _globals->_player.enableControl(); + break; + case 9350: + _globals->_sceneManager.changeScene(9350); + break; + default: + break; + } +} + +void Scene9400::dispatch() { + if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){ + if (_field1032 == 0) { + _soundHandler.startSound(296, 0, 127); + _field1032 = 1; + } + } else { + _field1032 = 0; + } + if (_action == 0) { + if (_globals->_player._position.y < 120) { + _sceneState = 9350; + _globals->_player.disableControl(); + setAction(&_action1); + Common::Point pt(-45, 88); + NpcMover *mover = new NpcMover(); + _globals->_player.addMover(mover, &pt, this); + } + } else { + Scene::dispatch(); + } +} + +void Scene9400::postInit(SceneObjectList *OwnerList) { + Scene::postInit(); + _sceneNumber = 9400; + setZoomPercents(0, 100, 200, 100); + _globals->_player.postInit(); + _object1.postInit(0); + _object3.postInit(0); + _speakerQText._textPos.x = 20; + + _hotspot7.quickInit(157, 66, 180, 110, 9400, 21, 23); + _hotspot5.quickInit(130, 133, 152, 198, 9400, 22, -1); + _hotspot1.quickInit(33, 280, 69, 297, 9400, 1, 2); + _hotspot2.quickInit(73, 96, 87, 159, 9400, 3, 4); + _hotspot3.quickInit(89, 253, 111, 305, 9400, 5, 6); + _hotspot4.quickInit(46, 0, 116, 35, 9400, 7, 8); + _hotspot8.quickInit(58, 169, 122, 200, 9400, 9, 10); + _hotspot6.quickInit(0, 0, 199, 319, 9400, 16, 0); + + _stripManager.addSpeaker(&_speakerQText); + _stripManager.addSpeaker(&_speakerOR); + _stripManager.addSpeaker(&_speakerOText); + + _globals->_events.setCursor(CURSOR_WALK); + _globals->_player.disableControl(); + + // Useless check (skipped) : if (_globals->_sceneManager._previousScene == 9350) + _sceneState = 2; + if (!_globals->getFlag(89)) { + _globals->setFlag(89); + _sceneState = 0; + } + + setAction(&_sequenceManager, this, 9400, &_globals->_player, &_object1, &_object3, 0); +} + /*-------------------------------------------------------------------------- * Scene 9700 * diff --git a/engines/tsage/ringworld_scenes10.h b/engines/tsage/ringworld_scenes10.h index c321d53e85..35a35e193a 100644 --- a/engines/tsage/ringworld_scenes10.h +++ b/engines/tsage/ringworld_scenes10.h @@ -58,7 +58,7 @@ class Scene9100: public Scene { public: virtual void doAction(int action); }; - +public: SequenceManager _sequenceManager; SceneObject _object1; SceneObject _object2; @@ -84,7 +84,7 @@ class Scene9150: public Scene2 { virtual void signal(); virtual void dispatch(); }; - +public: SequenceManager _sequenceManager1; SequenceManager _sequenceManager2; SceneObject _object1; @@ -111,7 +111,7 @@ class Scene9200: public Scene2 { public: virtual void doAction(int action); }; - +public: SequenceManager _sequenceManager; SceneObject _object1; SceneObject _object2; @@ -137,6 +137,7 @@ class Scene9200: public Scene2 { }; class Scene9300: public Scene { +public: SequenceManager _sequenceManager; SceneObject _object1; SceneObject _object2; @@ -160,6 +161,7 @@ class Scene9300: public Scene { }; class Scene9350: public Scene2 { +public: SequenceManager _sequenceManager; Object9350 _object1; SceneObject _object2; @@ -175,6 +177,7 @@ class Scene9350: public Scene2 { }; class Scene9360: public Scene2 { +public: SequenceManager _sequenceManager; Action _action1; Object9350 _object1; @@ -192,6 +195,42 @@ class Scene9360: public Scene2 { virtual void dispatch(); }; +class Scene9400: public Scene2 { + class SceneHotspot7: public SceneHotspot_3{ + public: + virtual void doAction(int action); + }; + + class SceneHotspot8: public SceneHotspot_3{ + public: + virtual void doAction(int action); + }; +public: + Scene9400(); + SequenceManager _sequenceManager; + Action _action1; + SceneObject _object1; + SceneObject _object2; + SceneObject _object3; + SpeakerOText _speakerOText; + SpeakerOR _speakerOR; + SpeakerQText _speakerQText; + SceneHotspot_3 _hotspot1; + SceneHotspot_3 _hotspot2; + SceneHotspot_3 _hotspot3; + SceneHotspot_3 _hotspot4; + SceneHotspot_3 _hotspot5; + SceneHotspot_3 _hotspot6; + SoundHandler _soundHandler; + int _field1032; + SceneHotspot7 _hotspot7; + SceneHotspot8 _hotspot8; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + class Scene9700: public Scene2 { SequenceManager _sequenceManager; SceneObject _object1; -- cgit v1.2.3