mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 06:08:35 +00:00
MADS: Phantom: Implement scene 301
This commit is contained in:
parent
49a5b194d0
commit
cbb302a550
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user