MADS: Dragon: Implement scene 102

This commit is contained in:
Strangerke 2015-10-23 00:28:47 +02:00
parent 0f27b68d57
commit 796b04d3cd
4 changed files with 465 additions and 20 deletions

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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