diff options
-rw-r--r-- | engines/tsage/core.cpp | 48 | ||||
-rw-r--r-- | engines/tsage/core.h | 14 | ||||
-rw-r--r-- | engines/tsage/ringworld_logic.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/ringworld_scenes10.cpp | 324 | ||||
-rw-r--r-- | engines/tsage/ringworld_scenes10.h | 30 |
5 files changed, 380 insertions, 38 deletions
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 84bd878f6f..d6f4ab8078 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1182,6 +1182,39 @@ void PaletteRotation::setDelay(int amount) { /*--------------------------------------------------------------------------*/ +void PaletteUnknown::synchronise(Serialiser &s) { + PaletteModifier::synchronise(s); + + s.syncAsSint16LE(_step); + s.syncAsSint16LE(_percent); + s.syncAsSint16LE(_field12); + s.syncAsSint16LE(_field14); + for (int i = 0; i < 256; ++i) + s.syncAsUint32LE(_palette[i]); +} + +void PaletteUnknown::signal() { + _percent -= _step; + if (_percent > 0) { + _scenePalette->fade((byte *)_palette, true /* 256 */, _percent); + } else { + remove(); + } +} + +void PaletteUnknown::remove() { + for (int i = 0; i < 256; i++) + _scenePalette->_palette[i] = _palette[i]; + _scenePalette->refresh(); + if (_scenePalette->_listeners.contains(this)) + _scenePalette->_listeners.remove(this); + delete this; + if (_action) + _action->signal(); +} + +/*--------------------------------------------------------------------------*/ + ScenePalette::ScenePalette() { // Set a default gradiant range for (int idx = 0; idx < 256; ++idx) @@ -1323,6 +1356,21 @@ PaletteRotation *ScenePalette::addRotation(int start, int end, int rotationMode, return obj; } +PaletteUnknown *ScenePalette::addUnkPal(byte *arrBufferRGB, int unkNumb, bool disabled, Action *action) { + PaletteUnknown *paletteUnk = new PaletteUnknown(); + paletteUnk->_action = action; + for (int i = 0; i < 256; i++) { + if (unkNumb <= 1) + paletteUnk->_palette[i] = arrBufferRGB[i]; + else + paletteUnk->_palette[i] = arrBufferRGB[0]; + } +// PaletteRotation::setPalette(this, disabled); + _globals->_scenePalette._listeners.push_back(paletteUnk); + return paletteUnk; +} + + void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) { ScenePalette tempPalette; if (_globals->_sceneManager._hasPalette) { diff --git a/engines/tsage/core.h b/engines/tsage/core.h index be3dde15fc..78f5fcf276 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -344,6 +344,19 @@ public: void setDelay(int amount); }; +/*--------------------------------------------------------------------------*/ + +class PaletteUnknown: public PaletteModifier { +public: + int _step, _percent, _field12, _field14; + uint32 _palette[256]; +public: + virtual Common::String getClassName() { return "PaletteUnknown"; } + virtual void synchronise(Serialiser &s); + virtual void signal(); + virtual void remove(); +}; + enum FadeMode {FADEMODE_NONE = 0, FADEMODE_GRADUAL = 1, FADEMODE_IMMEDIATE = 2}; class ScenePalette: public SavedObject { @@ -372,6 +385,7 @@ public: void clearListeners(); void fade(const byte *adjustData, bool fullAdjust, int percent); PaletteRotation *addRotation(int start, int end, int rotationMode, int duration = 0, Action *action = NULL); + PaletteUnknown *addUnkPal(byte *arrBufferRGB, int unkNumb, bool disabled, Action *action); static void changeBackground(const Rect &bounds, FadeMode fadeMode); diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index f196b8b024..82d1b02d6b 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -165,6 +165,8 @@ Scene *SceneFactory::createScene(int sceneNumber) { case 9700: return new Scene9700(); case 9750: return new Scene9750(); case 9850: return new Scene9850(); + // Scene 9900: Ending + case 9900: return new Scene9900(); case 9999: return new Scene9999(); default: diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp index ed9ddedf31..ae1e290189 100644 --- a/engines/tsage/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld_scenes10.cpp @@ -1480,7 +1480,6 @@ void Scene9850::Hotspot20::doAction(int action) { } void Scene9850::signal() { - warning("Signal : %d", _sceneMode); switch (_sceneMode ++) { case 10: // Hidden closet closed @@ -1633,35 +1632,38 @@ void Scene9850::postInit(SceneObjectList *OwnerList) { * Scene 9900 * *--------------------------------------------------------------------------*/ -void Scene9900::Action1::signal() { +void Scene9900::strAction1::signal() { + static byte mask1[3]= {0xFF, 0xFF, 0xFF}; + static byte mask2[3]= {0x00, 0x00, 0x00}; + Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: scene->_soundHandler.startSound(351, 0, 127); - scene->_object9.postInit(); - scene->_object9.setVisage(18); - scene->_object9._frame = 1; - scene->_object9._strip = 6; - scene->_object9.setPosition(Common::Point(171, 59)); - scene->_object9.animate(ANIM_MODE_5, 0); + _object9.postInit(); + _object9.setVisage(18); + _object9._frame = 1; + _object9._strip = 6; + _object9.setPosition(Common::Point(171, 59)); + _object9.animate(ANIM_MODE_5, 0); _globals->_scenePalette.addRotation(67, 111, 1, 1, this); scene->_object2.hide(); break; case 1: - scene->_palette1.getPalette(); - warning("TODO sub_1CDF6"); + _palette1.getPalette(); + _globals->_scenePalette.addUnkPal(mask1, 1, true /*10*/, this); break; case 2: - scene->_object9.remove(); - warning("TODO sub_1CDF6"); + _object9.remove(); + _globals->_scenePalette.addUnkPal(mask2, 1, true /*5*/, this); break; case 3: _globals->_soundHandler.startSound(377, 0, 127); setDelay(120); break; case 4: - warning("TODO sub_1CDF6"); + _globals->_scenePalette.addUnkPal((byte *)_palette1._palette, 256, 1, this); break; case 5: remove(); @@ -1671,14 +1673,69 @@ void Scene9900::Action1::signal() { } } -void Scene9900::Action2::signal() { - Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene; - +void Scene9900::strAction2::signal() { switch (_actionIndex++) { case 0: - case 1: - scene->_palette1.getPalette(); - + var1 = 0; + _txtArray1Index = 0; + _txtArray1[0]._position.y = 200; + _txtArray1[0]._position.y = 300; + _txtArray2[0]._position.y = 400; + _txtArray2[0]._position.y = 500; + var3 = 0; + // No break on purpose + case 1: { + Common::String msg = _vm->_dataManager->getMessage(8030, var1++); + if (!msg.compareTo("LASTCREDIT")) { + if (var3 == 0) { + // Not used? + // int x = _txtArray1[_txtArray1Index].getFrame().getBounds().height(); + _txtArray1[_txtArray1Index]._moveDiff.y = 10; + + NpcMover *mover = new NpcMover(); + Common::Point pt(_txtArray1[_txtArray1Index]._moveDiff.x, -100); + _txtArray1[_txtArray1Index].addMover(mover, &pt, 0); + + // Not used? + // int x = _txtArray2[_txtArray1Index].getFrame().getBounds().height(); + _txtArray2[_txtArray1Index]._moveDiff.y = 10; + _txtArray1Index = (_txtArray1Index++) % 2; + } + var3 = 1; + _txtArray1[_txtArray1Index]._textMode = ALIGN_CENTRE; + _txtArray1[_txtArray1Index]._width = 240; + _txtArray1[_txtArray1Index]._fontNumber = 2; + _txtArray1[_txtArray1Index]._colour1 = 7; + _txtArray1[_txtArray1Index].setup(msg); + _txtArray1[_txtArray1Index]._field7A = 20; + _txtArray1[_txtArray1Index]._moveDiff.y = 2; + _txtArray1[_txtArray1Index].setPriority2(255); + int frameWidth = _txtArray1[_txtArray1Index].getFrame().getBounds().width(); + int frameHeight = _txtArray1[_txtArray1Index].getFrame().getBounds().height(); + _txtArray1[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200)); + NpcMover *mover2 = new NpcMover(); + Common::Point pt2(_txtArray1[_txtArray1Index]._position.x, 100); + _txtArray1[_txtArray1Index].addMover(mover2, &pt2, 0); + + _txtArray2[_txtArray1Index]._textMode = ALIGN_CENTRE; + _txtArray2[_txtArray1Index]._width = 240; + _txtArray2[_txtArray1Index]._fontNumber = 2; + _txtArray2[_txtArray1Index]._colour1 = 23; + + msg = _vm->_dataManager->getMessage(8030, var1++); + _txtArray2[_txtArray1Index].setup(msg); + _txtArray2[_txtArray1Index]._field7A = 20; + _txtArray2[_txtArray1Index]._moveDiff.y = 2; + _txtArray2[_txtArray1Index].setPriority2(255); + frameWidth = _txtArray2[_txtArray1Index].getFrame().getBounds().width(); + _txtArray2[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200 + frameHeight)); + } else { + _globals->_player.enableControl(); + _actionIndex = 3; + signal(); + } + break; + } case 2: setDelay(60); _actionIndex = 1; @@ -1687,17 +1744,234 @@ void Scene9900::Action2::signal() { setDelay(7200); break; case 4: + _txtArray1[0].remove(); + _txtArray1[1].remove(); + _txtArray2[0].remove(); + _txtArray2[1].remove(); + remove(); + break; + default: + break; + } +} +void Scene9900::strAction2::dispatch() { +// if (this->_txtArray1[0]._textSurface != 0) { + int frameHeight = _txtArray1[0].getFrame().getBounds().height(); + _txtArray2[0]._position.y = frameHeight + _txtArray1[0]._position.y; + _txtArray2[0]._flags |= OBJFLAG_PANES; +// } +// if (this->_txtArray1[1]._textSurface != 0) { + frameHeight = _txtArray1[1].getFrame().getBounds().height(); + _txtArray2[1]._position.y = frameHeight + _txtArray1[1]._position.y; + _txtArray2[1]._flags |= OBJFLAG_PANES; +// } + Action::dispatch(); +} + +void Scene9900::strAction3::signal() { + static byte mask3[3]= {0xFF, 0x00, 0x00}; + static byte mask4[3]= {0x00, 0x00, 0x00}; + + switch (_actionIndex++) { + case 0: + _palette2.getPalette(); + _palette3.loadPalette(2003); + _globals->_scenePalette.addUnkPal((byte *)_palette3._palette, 256, true /*5*/, this); + break; + case 1: + _globals->_scenePalette.addUnkPal(mask3, 1, true /*10*/, this); + break; + case 2: + _globals->_scenePalette.addUnkPal(mask4, 1, true /*1*/, this); + break; + case 3: + _palette2.loadPalette(17); + _globals->_sceneManager._scene->loadScene(17); + _globals->_scenePalette.addUnkPal((byte *)_palette2._palette, 256, true /*5*/, this); + break; + case 4: + _globals->_game.endGame(9900, 61); + remove(); + default: + break; + } +} + +void Scene9900::signal() { + if ((_sceneMode != 9913) && (_sceneMode != 9905) && (_sceneMode != 9904) && (_sceneMode != 9912)) { + _object1.hide(); + _object2.hide(); + _object3.hide(); + _object4.hide(); + _object5.hide(); + _object6.hide(); + } + + _object1.animate(ANIM_MODE_NONE, 0); + _object2.animate(ANIM_MODE_NONE, 0); + _object3.animate(ANIM_MODE_NONE, 0); + _object4.animate(ANIM_MODE_NONE, 0); + _object5.animate(ANIM_MODE_NONE, 0); + _object6.animate(ANIM_MODE_NONE, 0); + + _object1.setObjectWrapper(0); + _object2.setObjectWrapper(0); + _object3.setObjectWrapper(0); + _object4.setObjectWrapper(0); + _object5.setObjectWrapper(0); + _object6.setObjectWrapper(0); + + _object1.addMover(0); + _object2.addMover(0); + _object3.addMover(0); + _object4.addMover(0); + _object5.addMover(0); + _object6.addMover(0); + + switch (_sceneMode){ + case 150: + _globals->_soundHandler.startSound(380, 0, 127); + _object8.postInit(0); + _object8.setVisage(2002); + _object8.setStrip(1); + _object8.setFrame(1); + _object8.setPriority2(200); + _object8.setPosition(Common::Point(64, 199)); + _globals->_player.disableControl(); + _sceneMode = 9908; + setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 162: + warning("TBC: shutdown();"); + _globals->_game.quitGame(); + break; + case 9901: + _globals->_player.disableControl(); + _sceneMode = 9906; + setAction(&_sequenceManager, this, 9906, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + _globals->_player._uiEnabled = true; + _globals->_events.setCursor(CURSOR_USE); + break; + case 9902: + _globals->_player.disableControl(); + _sceneMode = 9901; + setAction(&_sequenceManager, this, 9901, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9903: + _globals->_player.disableControl(); + _sceneMode = 9902; + setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9904: + _globals->_soundHandler.startSound(390, 0, 127); + _sceneMode = 9912; + setAction(&_strAction2, this); + break; + case 9905: + _sceneMode = 150; + setAction(&_strAction1, this); + break; + case 9906: + if (_object8._state == 0) { + _globals->_player.disableControl(); + _sceneMode = 9913; + setAction(&_sequenceManager, this, 9913, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + } else { + _globals->_player.disableControl(); + _sceneMode = 9905; + setAction(&_sequenceManager, this, 9905, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + } + break; + case 9907: + _globals->_player.disableControl(); + _sceneMode = 9903; + setAction(&_sequenceManager, this, 9903, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9908: + _object8.remove(); + _globals->_player.disableControl(); + _sceneMode = 9904; + setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9909: + _globals->_soundHandler.startSound(375, 0, 127); + _globals->_player.disableControl(); + _sceneMode = 9907; + setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9910: + _globals->_player.disableControl(); + _sceneMode = 9911; + setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9911: + _globals->_soundHandler.startSound(367, 0, 127); + _globals->_player.disableControl(); + _sceneMode = 9909; + setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + break; + case 9912: + _globals->_player.disableControl(); + _sceneMode = 9912; + setAction(&_sequenceManager, this, 9912, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); + _sceneMode = 162; + _globals->_player.enableControl(); + _globals->_player._canWalk = false; + break; + case 9913: + _sceneMode = 200; + setAction(&_strAction3, this); + break; default: break; } } -void Scene9900::Action2::dispatch() {} -void Scene9900::Action3::signal() {} -void Scene9900::postInit(SceneObjectList *OwnerList) {} -void Scene9900::signal() {} -void Scene9900::dispatch() {} -void Scene9900::process(Event &event){} +void Scene9900::process(Event &event) { + if (event.handled) + return; + Scene::process(event); + if (_sceneMode != 9906) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (_globals->_events.getCursor() == OBJECT_ITEMS)) { + _object8._state = 1; + _globals->_inventory._items._sceneNumber = 9900; + _globals->_events.setCursor(CURSOR_USE); + } + } +} + +void Scene9900::dispatch() { + if (_action) + _action->dispatch(); +} + +void Scene9900::postInit(SceneObjectList *OwnerList) { + _object1.postInit(0); + _object1.hide(); + _object2.postInit(0); + _object2.hide(); + _object3.postInit(0); + _object3.hide(); + _object4.postInit(0); + _object4.hide(); + _object5.postInit(0); + _object5.hide(); + _object6.postInit(0); + _object6.hide(); + + _object8._state = 0; + + _globals->_inventory._concentrator._sceneNumber = 9900; + _globals->_inventory._items._rlbNum = 3; + _globals->_inventory._items._cursorNum = 6; + _globals->_inventory._items._description = Common::String("One of the items from the stasis ship. The other is on the Lance's bridge."); + + _stripManager.addSpeaker(&_speakerMR); + _globals->_player.disableControl(); + _sceneMode = 9910; + setAction(&_sequenceManager, this, 9910, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); +} + /*-------------------------------------------------------------------------- * Scene 9999 * diff --git a/engines/tsage/ringworld_scenes10.h b/engines/tsage/ringworld_scenes10.h index 6f43bcf9b6..4f70a23ede 100644 --- a/engines/tsage/ringworld_scenes10.h +++ b/engines/tsage/ringworld_scenes10.h @@ -455,19 +455,30 @@ public: }; class Scene9900: public Scene { - class Action1: public Action { + class strAction1: public Action { public: + SceneObject _object9; + ScenePalette _palette1; + virtual void signal(); }; - class Action2: public Action { + class strAction2: public Action { public: + SceneText _txtArray1[2]; + SceneText _txtArray2[2]; + int var1, _txtArray1Index, var3; + virtual void signal(); virtual void dispatch(); }; - class Action3: public Action { + class strAction3: public Action { public: + SceneObject _object10; + ScenePalette _palette2; + ScenePalette _palette3; + virtual void signal(); }; @@ -493,16 +504,9 @@ public: SceneObject _object6; SceneObject _object7; SceneObjectExt _object8; - Action1 _action1; - SceneObject _object9; - ScenePalette _palette1; - Action2 _action2; - SceneTextArr1 _sceneTextArr1; - SceneTextArr2 _sceneTextArr2; - Action3 _action3; - SceneObject _object10; - ScenePalette _palette2; - ScenePalette _palette3; + strAction1 _strAction1; + strAction2 _strAction2; + strAction3 _strAction3; SpeakerMR _speakerMR; virtual void postInit(SceneObjectList *OwnerList = NULL); |