From 796b04d3cdc95986be03fab6eb66d50138942cfc Mon Sep 17 00:00:00 2001 From: Strangerke Date: Fri, 23 Oct 2015 00:28:47 +0200 Subject: MADS: Dragon: Implement scene 102 --- engines/mads/dragonsphere/dragonsphere_scenes.cpp | 2 +- engines/mads/dragonsphere/dragonsphere_scenes.h | 41 +- engines/mads/dragonsphere/dragonsphere_scenes1.cpp | 424 +++++++++++++++++++++ engines/mads/dragonsphere/dragonsphere_scenes1.h | 18 + 4 files changed, 465 insertions(+), 20 deletions(-) diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp index 0f0fb5c103..c0781f5d18 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp +++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp @@ -45,7 +45,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) { case 101: // king's bedroom return new Scene101(vm); case 102: // queen's bedroom - return new DummyScene(vm); // TODO + return new Scene102(vm); case 103: // outside king's bedroom return new DummyScene(vm); // TODO case 104: // fireplace / bookshelf diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.h b/engines/mads/dragonsphere/dragonsphere_scenes.h index 2ecf8e9955..a3bc22cb93 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes.h +++ b/engines/mads/dragonsphere/dragonsphere_scenes.h @@ -33,24 +33,34 @@ namespace MADS { namespace Dragonsphere { +enum Verb { + VERB_LOOK = 0x3, + VERB_TAKE = 0x4, + VERB_PUSH = 0x5, + VERB_OPEN = 0x6, + VERB_PUT = 0x7, + VERB_TALK_TO = 0x8, + VERB_GIVE = 0x9, + VERB_PULL = 0xA, + VERB_CLOSE = 0xB, + VERB_THROW = 0xC, + VERB_WALK_TO = 0xD, + VERB_WALK_ACROSS = 0x11, + VERB_WALK_BEHIND = 0x1C, + VERB_LOOK_AT = 0x1E, + VERB_WALK_THROUGH = 0x25, + VERB_WALK_INTO = 0x27, + VERB_WALK_DOWN = 0xA9, + VERB_WALK = 0x1CB, + VERB_WALK_AROUND = 0x221 +}; + enum Noun { NOUN_GAME = 0x1, NOUN_QSAVE = 0x2, - NOUN_LOOK = 0x3, - NOUN_TAKE = 0x4, - NOUN_PUSH = 0x5, - NOUN_OPEN = 0x6, - NOUN_PUT = 0x7, - NOUN_TALK_TO = 0x8, - NOUN_GIVE = 0x9, - NOUN_PULL = 0xA, - NOUN_CLOSE = 0xB, - NOUN_THROW = 0xC, - NOUN_WALK_TO = 0xD, NOUN_NOTHING = 0xE, NOUN_ = 0xF, NOUN_FLOOR = 0x10, - NOUN_WALK_ACROSS = 0x11, NOUN_RUG = 0x12, NOUN_CARPET = 0x13, NOUN_WALL = 0x14, @@ -61,18 +71,14 @@ enum Noun { NOUN_NIGHTSTAND = 0x19, NOUN_TAPESTRY = 0x1A, NOUN_DRESSING_SCREEN = 0x1B, - NOUN_WALK_BEHIND = 0x1C, NOUN_ROYAL_CREST = 0x1D, - NOUN_LOOK_AT = 0x1E, NOUN_WASHBASIN = 0x1F, NOUN_WASH_AT = 0x20, NOUN_BOOK = 0x21, NOUN_FIREPLACE = 0x22, NOUN_FIREPLACE_SCREEN = 0x23, NOUN_DOOR_TO_QUEENS_ROOM = 0x24, - NOUN_WALK_THROUGH = 0x25, NOUN_HALL_TO_SOUTH = 0x26, - NOUN_WALK_INTO = 0x27, NOUN_WALL_PLAQUE = 0x28, NOUN_DECORATION = 0x29, NOUN_SWORDS = 0x2A, @@ -202,7 +208,6 @@ enum Noun { NOUN_DOOR = 0xA6, NOUN_WALL_SWITCH = 0xA7, NOUN_STAIRS = 0xA8, - NOUN_WALK_DOWN = 0xA9, NOUN_EDGE_OF_ABYSS = 0xAA, NOUN_COURTYARD = 0xAB, NOUN_ROCK = 0xAC, @@ -492,7 +497,6 @@ enum Noun { NOUN_PATH_TO_HIGHTOWER = 0x1C8, NOUN_SPIRIT_PLANE = 0x1C9, NOUN_SPIRIT_TREE = 0x1CA, - NOUN_WALK = 0x1CB, NOUN_REMAINS = 0x1CC, NOUN_DOORWAY_TO_ELEVATOR = 0x1CD, NOUN_DRAGON_DOOR = 0x1CE, @@ -578,7 +582,6 @@ enum Noun { NOUN_SHIFTER_VILLAGE = 0x21E, NOUN_SLATHAN_SKY = 0x21F, NOUN_SHIFTER = 0x220, - NOUN_WALK_AROUND = 0x221, NOUN_WRECKED_BRIDGE = 0x222, NOUN_SHACK = 0x223, NOUN_WRECKED_SHACK = 0x224, diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp index 6f107df42b..5b5aa72213 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp +++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp @@ -239,5 +239,429 @@ void Scene101::preActions() { /*------------------------------------------------------------------------*/ +Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) { + _diaryHotspotIdx1 = -1; + _diaryHotspotIdx2 = -1; + _diaryFrame = -1; + _animRunning = -1; +} + +void Scene102::synchronize(Common::Serializer &s) { + Scene1xx::synchronize(s); + + s.syncAsSint16LE(_diaryHotspotIdx1); + s.syncAsSint16LE(_diaryHotspotIdx2); + s.syncAsSint16LE(_diaryFrame); + s.syncAsSint16LE(_animRunning); +} + +void Scene102::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_DIARIES); + _scene->addActiveVocab(VERB_WALK_TO); +} + +void Scene102::enter() { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0), false); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1), false); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0), false); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1), false); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1), false); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6", false); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2), false); + + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 0, 0); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 0, 0); + _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0, 0); + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); + _diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); + _diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); + + if (_scene->_priorSceneId == 103) { + _game._player._playerPos = Common::Point(170, 152); + _game._player._facing = FACING_NORTHWEST; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _game._player.firstWalk(Common::Point(-10, 130), FACING_EAST, Common::Point(35, 144), FACING_EAST, false); + _game._player.setWalkTrigger(70); + } else { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + } + + sceneEntrySound(); +} + +void Scene102::step() { + int resetFrame; + + if ((_animRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { + _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + resetFrame = -1; + + switch (_diaryFrame) { + case 6: + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _game.syncTimers(1, _globals._sequenceIndexes[1], 3, _globals._animationIndexes[0]); + break; + + case 10: + _vm->_sound->command(65); + break; + + case 26: + _vm->_dialogs->show(10210); + _vm->_dialogs->show(10211); + _vm->_dialogs->show(10212); + break; + + default: + break; + } + + if (resetFrame >= 0) { + if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _diaryFrame = resetFrame; + } + } + } + } + + if ((_animRunning == 2) && _scene->_animation[_globals._animationIndexes[0]]) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { + _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + resetFrame = -1; + + switch (_diaryFrame) { + case 6: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _game.syncTimers(1, _globals._sequenceIndexes[2], 3, _globals._animationIndexes[0]); + break; + + case 26: + _vm->_dialogs->show(10213); + _vm->_dialogs->show(10214); + break; + + default: + break; + } + + if (resetFrame >= 0) { + if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _diaryFrame = resetFrame; + } + } + } + } + + if (_game._trigger >= 70) { + switch (_game._trigger) { + case 70: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _vm->_sound->command(25); + _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 71); + break; + + case 71: { + int idx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], -2); + _game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx); + _game._player._stepEnabled = true; + } + break; + + default: + break; + } + } +} + +void Scene102::actions() { + if (_action._lookFlag) { + _vm->_dialogs->show(10201); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7],true); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 2, 1); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 3); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _vm->_sound->command(24); + _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2); + break; + + case 2: { + int idx = _globals._sequenceIndexes[6]; + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); + _game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx); + } + break; + + case 3: + _game._player._visible = true; + _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]); + _game._player.walk(Common::Point(0, 130), FACING_WEST); + _game._player._walkOffScreenSceneId = 101; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { + _scene->_nextSceneId = 103; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_DIARIES) || _action.isAction(VERB_OPEN, NOUN_DIARIES)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _animRunning = 1; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('B',-1), 1); + _game.syncTimers(3, _globals._animationIndexes[0], 2, 0); + break; + + case 1: + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); + _diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); + _game._player._visible = true; + _game.syncTimers(2, 0, 3, _globals._animationIndexes[0]); + _scene->_sequences.setTimingTrigger(6, 2); + break; + + case 2: + _game._player.walk(Common::Point(51, 121), FACING_NORTHWEST); + _game._player.setWalkTrigger(3); + break; + + case 3: + _game._player._visible = false; + _animRunning = 2; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 4); + _game.syncTimers(3, _globals._animationIndexes[0], 2, 0); + break; + + case 4: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); + _diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); + _game._player._visible = true; + _game._player._stepEnabled = true; + _game.syncTimers(2, 0, 3, _globals._animationIndexes[0]); + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FIREPLACE)) { + _vm->_dialogs->show(10202); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BED)) { + _vm->_dialogs->show(10203); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SHUTTERS)) { + _vm->_dialogs->show(10204); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RUG)) { + _vm->_dialogs->show(10206); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOOKCASE)) { + _vm->_dialogs->show(10208); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DIARIES)) { + _vm->_dialogs->show(10209); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) { + _vm->_dialogs->show(10215); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOWERS)) { + _vm->_dialogs->show(10216); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WINDOW)) { + _vm->_dialogs->show(10217); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WOOD_BASKET)) { + _vm->_dialogs->show(10219); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FIREPLACE_SCREEN)) { + _vm->_dialogs->show(10220); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_NIGHTSTAND)) { + _vm->_dialogs->show(10222); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { + _vm->_dialogs->show(10223); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHEST)) { + _vm->_dialogs->show(10224); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TAPESTRY)) { + _vm->_dialogs->show(10226); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SCONCE)) { + _vm->_dialogs->show(10227); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(10228); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(10229); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DECORATION)) { + _vm->_dialogs->show(10230); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(10231); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_CHEST)) { + _vm->_dialogs->show(10224); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_FLOWERS)) { + _vm->_dialogs->show(10225); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_WINDOW)) { + _vm->_dialogs->show(10218); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) { + _vm->_dialogs->show(10221); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_SHUTTERS)) { + _vm->_dialogs->show(10205); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_RUG)) { + _vm->_dialogs->show(10207); + _action._inProgress = false; + return; + } +} + +void Scene102::preActions() { +} + +/*------------------------------------------------------------------------*/ + } // End of namespace Dragonsphere } // End of namespace MADS diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h index 023a789505..ac82669d68 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes1.h +++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h @@ -64,6 +64,24 @@ public: virtual void preActions(); virtual void actions(); }; + +class Scene102 : public Scene1xx { +private: + int _diaryHotspotIdx1; + int _diaryHotspotIdx2; + int _diaryFrame; + int _animRunning; + +public: + Scene102(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; } // End of namespace Dragonsphere } // End of namespace MADS -- cgit v1.2.3