MADS: Phantom: Implement scene 301

This commit is contained in:
Strangerke 2015-10-27 22:28:43 +01:00
parent 49a5b194d0
commit cbb302a550
4 changed files with 372 additions and 3 deletions

View File

@ -97,7 +97,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
// Scene group #3 (catwalks, chandelier, lake / catacombs entrance)
case 301: // catwalk #1 above stage
return new DummyScene(vm); // TODO
return new Scene301(vm);
case 302: // catwalk #2 above stage
return new DummyScene(vm); // TODO
case 303: // above chandelier

View File

@ -84,5 +84,354 @@ void Scene3xx::setPlayerSpritesPrefix() {
/*------------------------------------------------------------------------*/
Scene301::Scene301(MADSEngine *vm) : Scene3xx(vm) {
_anim0ActvFl = false;
_skip1Fl = false;
_skip2Fl = false;
_lightingHotspotId = -1;
_sandbagHotspotId = -1;
}
void Scene301::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_anim0ActvFl);
s.syncAsByte(_skip1Fl);
s.syncAsByte(_skip2Fl);
s.syncAsSint16LE(_lightingHotspotId);
s.syncAsSint16LE(_sandbagHotspotId);
}
void Scene301::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene301::enter() {
_vm->_disableFastwalk = true;
_anim0ActvFl = false;
_skip2Fl = false;
_skip1Fl = false;
_scene->loadSpeech(6);
_scene->_hotspots.activate(NOUN_CABLE, false);
_scene->_hotspots.activate(NOUN_STOOL, false);
_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0), false);
if (_globals[kCurrentYear] == 1993) {
_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1), false);
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', 0), false);
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', 1), false);
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 2), false);
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', 3), false);
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('z', 4), false);
_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 5), false);
_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 6), false);
_lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(50, 116, 50 + 19, 116 + 10));
_scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(67, 129), FACING_NORTHWEST);
_lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(126, 118, 126 + 29, 118 + 8));
_scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(152, 129), FACING_NORTHWEST);
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
_scene->_hotspots.activate(NOUN_CABLE, true);
} else {
_sandbagHotspotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(464, 114, 464 + 11, 114 + 9));
_scene->_dynamicHotspots.setPosition(_sandbagHotspotId, Common::Point(475, 125), FACING_NORTHWEST);
_scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(468, 42, 468 + 6, 42 + 13));
_scene->_hotspots.activate(NOUN_STOOL, true);
_scene->_hotspots.activate(NOUN_BIG_PROP, false);
}
if (_scene->_priorSceneId == 302) {
_game._player.firstWalk(Common::Point(-20, 132), FACING_WEST, Common::Point(19, 132), FACING_EAST, true);
_scene->setCamera(Common::Point(0, 0));
} else if ((_scene->_priorSceneId == 106) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
_game._player._playerPos = Common::Point(568, 133);
_game._player._facing = FACING_WEST;
_scene->setCamera(Common::Point(320, 0));
}
if (!_game._visitedScenes._sceneRevisited) {
_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0), false);
_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -1, -2);
_scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 64);
}
sceneEntrySound();
}
void Scene301::step() {
if ((_globals[kDoneBrieConv203] == 3) && (_scene->_posAdjust.x < 320) && (_game._player._playerPos.x < 350)) {
_game._player.cancelCommand();
_game._player.walk(Common::Point(256, 130), FACING_NORTHWEST);
_game._player.setWalkTrigger(60);
_globals[kDoneBrieConv203] = 0;
_game._player._stepEnabled = false;
}
if (_game._trigger == 60) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('p', 1), 0);
_anim0ActvFl = true;
_game._player._visible = false;
_globals[kPlayerScore] += 10;
_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
}
if (_anim0ActvFl && !_skip1Fl) {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 50) {
_scene->playSpeech(6);
_skip1Fl = true;
}
}
if (_anim0ActvFl) {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 61) {
_scene->setAnimFrame(_globals._animationIndexes[0], 60);
if (!_skip2Fl) {
_vm->_sound->command(1);
_scene->_sequences.setTimingTrigger(420, 70);
_skip2Fl = true;
}
}
}
if (_game._trigger == 70) {
_scene->_userInterface.noInventoryAnim();
// CHECKME: Not sure about the next function call
_scene->_userInterface.refresh();
_scene->_nextSceneId = 104;
}
if (_game._trigger == 64)
_scene->_sequences.setTimingTrigger(60, 65);
if (_game._trigger == 65)
_vm->_dialogs->show(30137);
}
void Scene301::actions() {
if (_action.isAction(VERB_CLIMB_DOWN, NOUN_CIRCULAR_STAIRCASE)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
_game.syncTimers(3, _globals._animationIndexes[0], 2, 0);
break;
case 1:
_scene->_nextSceneId = 106;
break;
default:
break;
}
goto handled;
}
if (_action._lookFlag) {
_vm->_dialogs->show(30110);
goto handled;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
if (_action.isObject(NOUN_GRID)) {
_vm->_dialogs->show(30111);
goto handled;
}
if (_action.isObject(NOUN_CATWALK)) {
_vm->_dialogs->show(30112);
goto handled;
}
if (_action.isObject(NOUN_SIDE_WALL)) {
_vm->_dialogs->show(30113);
goto handled;
}
if (_action.isObject(NOUN_BACK_WALL)) {
_vm->_dialogs->show(30114);
goto handled;
}
if (_action.isObject(NOUN_SUPPORT)) {
_vm->_dialogs->show(30115);
goto handled;
}
if (_action.isObject(NOUN_ACT_CURTAIN)) {
_vm->_dialogs->show(30116);
goto handled;
}
if (_action.isObject(NOUN_HOUSE)) {
_vm->_dialogs->show(30117);
goto handled;
}
if (_action.isObject(NOUN_OTHER_CATWALK)) {
_vm->_dialogs->show(30118);
goto handled;
}
if (_action.isObject(NOUN_GRIDWORK)) {
_vm->_dialogs->show(30119);
goto handled;
}
if (_action.isObject(NOUN_BEAM_POSITION)) {
_vm->_dialogs->show(30120);
goto handled;
}
if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30121);
else
_vm->_dialogs->show(30122);
goto handled;
}
if (_action.isObject(NOUN_TARP)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30123);
else
_vm->_dialogs->show(30140);
goto handled;
}
if (_action.isObject(NOUN_COUNTERWEIGHT_SYSTEM)) {
_vm->_dialogs->show(30124);
goto handled;
}
if (_action.isObject(NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
_vm->_dialogs->show(30125);
goto handled;
}
if (_action.isObject(NOUN_BATTEN)) {
_vm->_dialogs->show(30126);
goto handled;
}
if (_action.isObject(NOUN_STOOL)) {
_vm->_dialogs->show(30127);
goto handled;
}
if (_action.isObject(NOUN_HEMP)) {
_vm->_dialogs->show(30128);
goto handled;
}
if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) {
_vm->_dialogs->show(30129);
goto handled;
}
if (_action.isObject(NOUN_CATWALK_OVER_HOUSE)) {
_vm->_dialogs->show(30130);
goto handled;
}
if (_action.isObject(NOUN_STAIRCASE_POST)) {
_vm->_dialogs->show(30131);
goto handled;
}
if (_action.isObject(NOUN_RAILING)) {
_vm->_dialogs->show(30132);
goto handled;
}
if (_action.isObject(NOUN_CYCLORAMA)) {
_vm->_dialogs->show(30133);
goto handled;
}
if (_action.isObject(NOUN_BIG_PROP)) {
_vm->_dialogs->show(30134);
goto handled;
}
if (_action.isObject(NOUN_PROSCENIUM_ARCH)) {
_vm->_dialogs->show(30135);
goto handled;
}
if (_action.isObject(NOUN_CABLE)) {
_vm->_dialogs->show(30136);
goto handled;
}
}
if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
_vm->_dialogs->show(30138);
goto handled;
}
if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
_vm->_dialogs->show(30141);
goto handled;
}
if (_action.isAction(VERB_TAKE, NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
_vm->_dialogs->show(30139);
goto handled;
}
if (_action.isAction(VERB_TAKE, NOUN_TARP)) {
_vm->_dialogs->show(30142);
goto handled;
}
goto done;
handled:
_action._inProgress = false;
done:
;
}
void Scene301::preActions() {
if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK_OVER_HOUSE))
_game._player._walkOffScreenSceneId = 302;
}
/*------------------------------------------------------------------------*/
} // End of namespace Phantom
} // End of namespace MADS

View File

@ -53,6 +53,26 @@ public:
Scene3xx(MADSEngine *vm) : PhantomScene(vm) { _game._player._scalingVelocity = true; }
};
class Scene301 : public Scene3xx {
private:
bool _anim0ActvFl;
bool _skip1Fl;
bool _skip2Fl;
int _lightingHotspotId;
int _sandbagHotspotId;
public:
Scene301(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 Phantom
} // End of namespace MADS

View File

@ -191,8 +191,6 @@ private:
*/
void writeVocab(ScrCategory category, int id);
void refresh();
void updateRect(const Common::Rect &bounds);
public:
MSurface _surface;
@ -304,6 +302,8 @@ public:
* Synchronize the data
*/
void synchronize(Common::Serializer &s);
void refresh();
};
} // End of namespace MADS