MADS: Phantom: Add scene 406

This commit is contained in:
Strangerke 2015-10-31 00:47:43 +01:00
parent f2e17d83fe
commit 89684642bb
3 changed files with 428 additions and 1 deletions

View File

@ -126,7 +126,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
case 404: // labyrinth room, 3 exits
return new Scene404(vm);
case 406: // labyrinth room, 2 exits
return new DummyScene(vm); // TODO
return new Scene406(vm);
case 407: // catacomb room / lake
return new DummyScene(vm); // TODO
case 408: // catacomb corridor

View File

@ -1552,5 +1552,411 @@ void Scene404::preActions() {
/*------------------------------------------------------------------------*/
Scene406::Scene406(MADSEngine *vm) : Scene4xx(vm) {
_frameInRoomFl = false;
_takingFrameInRoomFl = false;
_redFrameHotspotId = -1;
_greenFrameHostpotId = -1;
_blueFrameHotspotId = -1;
_yellowFrameHotspotId = -1;
}
void Scene406::synchronize(Common::Serializer &s) {
Scene4xx::synchronize(s);
s.syncAsByte(_frameInRoomFl);
s.syncAsByte(_takingFrameInRoomFl);
s.syncAsSint16LE(_redFrameHotspotId);
s.syncAsSint16LE(_greenFrameHostpotId);
s.syncAsSint16LE(_blueFrameHotspotId);
s.syncAsSint16LE(_yellowFrameHotspotId);
}
void Scene406::setup() {
setPlayerSpritesPrefix();
setAAName();
_scene->addActiveVocab(NOUN_RED_FRAME);
_scene->addActiveVocab(NOUN_YELLOW_FRAME);
_scene->addActiveVocab(NOUN_BLUE_FRAME);
_scene->addActiveVocab(NOUN_GREEN_FRAME);
}
void Scene406::enter() {
_game.initCatacombs();
_globals._spriteIndexes[0] = _scene->_sprites.addSprites("*RRD_9", false);
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 0), false);
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('f', 1), false);
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 2), false);
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('f', 3), false);
if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
switch (_globals[kCatacombsFrom]) {
case 1:
_game._player._playerPos = Common::Point(310, 118);
_game._player._facing = FACING_WEST;
_game._player.walk(Common::Point(271, 118), FACING_WEST);
break;
case 3:
_game._player._playerPos = Common::Point(20, 122);
_game._player._facing = FACING_SOUTH;
_game._player.walk(Common::Point(66, 122), FACING_EAST);
break;
default:
break;
}
}
if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
sceneEntrySound();
}
void Scene406::step() {
}
void Scene406::actions() {
if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
&& (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
if (_frameInRoomFl)
_vm->_dialogs->show(29);
else {
switch (_game._trigger) {
case (0):
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
break;
case 1:
if (_action.isObject(NOUN_RED_FRAME)) {
_game._objects.setRoom(OBJ_RED_FRAME, NOWHERE);
_game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
if (_action.isObject(NOUN_GREEN_FRAME)) {
_game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE);
_game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
if (_action.isObject(NOUN_BLUE_FRAME)) {
_game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE);
_game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
if (_action.isObject(NOUN_YELLOW_FRAME)) {
_game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE);
_game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600;
_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
_yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1));
_scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST);
}
break;
case 2:
_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
_game._player._visible = true;
_game._player._stepEnabled = true;
break;
default:
break;
}
}
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_TAKE)
&& (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME))) {
if ((_takingFrameInRoomFl || _game._trigger)) {
switch (_game._trigger) {
case (0):
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], true, 5, 2);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 5);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 2, 5, 1);
_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
break;
case 1:
if (_action.isObject(NOUN_RED_FRAME)) {
_scene->deleteSequence(_globals._sequenceIndexes[1]);
_scene->_dynamicHotspots.remove(_redFrameHotspotId);
_game._objects.addToInventory(OBJ_RED_FRAME);
}
if (_action.isObject(NOUN_GREEN_FRAME)) {
_scene->deleteSequence(_globals._sequenceIndexes[2]);
_scene->_dynamicHotspots.remove(_greenFrameHostpotId);
_game._objects.addToInventory(OBJ_GREEN_FRAME);
}
if (_action.isObject(NOUN_BLUE_FRAME)) {
_scene->deleteSequence(_globals._sequenceIndexes[3]);
_scene->_dynamicHotspots.remove(_blueFrameHotspotId);
_game._objects.addToInventory(OBJ_BLUE_FRAME);
}
if (_action.isObject(NOUN_YELLOW_FRAME)) {
_scene->deleteSequence(_globals._sequenceIndexes[4]);
_scene->_dynamicHotspots.remove(_yellowFrameHotspotId);
_game._objects.addToInventory(OBJ_YELLOW_FRAME);
}
_vm->_sound->command(26);
break;
case 2:
_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
_game._player._visible = true;
_game._player._stepEnabled = true;
break;
default:
break;
}
_action._inProgress = false;
return;
}
}
if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) {
_game.moveCatacombs(3);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) {
_game.moveCatacombs(1);
_action._inProgress = false;
return;
}
if (_action._lookFlag) {
_vm->_dialogs->show(40610);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
if (_action.isObject(NOUN_WALL)) {
_vm->_dialogs->show(40611);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_FLOOR)) {
_vm->_dialogs->show(40612);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_ARCHWAY)) {
_vm->_dialogs->show(40613);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_EXPOSED_BRICK)) {
_vm->_dialogs->show(40614);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_MORE_CATACOMBS)) {
_vm->_dialogs->show(40615);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BLOCKED_ARCHWAY)) {
_vm->_dialogs->show(40616);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) {
_vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) {
_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) {
_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) {
_vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GRATE)) {
_vm->_dialogs->show(40617);
_action._inProgress = false;
return;
}
}
if (_action.isAction(VERB_OPEN, NOUN_GRATE) || _action.isAction(VERB_PUSH, NOUN_GRATE) || _action.isAction(VERB_PULL, NOUN_GRATE)) {
switch (_game._trigger) {
case (0):
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], true, 5, 1);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 2);
break;
case 2:
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], true, -2);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true);
_scene->_sequences.setTimingTrigger(30, 3);
break;
case 3:
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], true, 5, 1);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], false);
_scene->_sequences.setTrigger(_globals._sequenceIndexes[0], 0, 0, 4);
break;
case 4:
_game._player._visible = true;
_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[0]);
_scene->_sequences.setTimingTrigger(6, 5);
break;
case 5:
_game._player._stepEnabled = true;
_vm->_dialogs->show(40618);
break;
default:
break;
}
_action._inProgress = false;
}
}
void Scene406::preActions() {
_frameInRoomFl = false;
_takingFrameInRoomFl = false;
if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_frameInRoomFl = true;
if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME))
_takingFrameInRoomFl = true;
}
if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_frameInRoomFl = true;
if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME))
_takingFrameInRoomFl = true;
}
if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_frameInRoomFl = true;
if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME))
_takingFrameInRoomFl = true;
}
if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) {
_frameInRoomFl = true;
if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME))
_takingFrameInRoomFl = true;
}
if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR)
&& (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) {
if (_frameInRoomFl)
_game._player._needToWalk = false;
else {
Common::Point pos = _scene->_sprites[_globals._spriteIndexes[1]]->getFramePos(0);
pos.x += 12;
_game._player.walk(pos, FACING_NORTHWEST);
}
}
}
/*------------------------------------------------------------------------*/
} // End of namespace Phantom
} // End of namespace MADS

View File

@ -117,6 +117,27 @@ public:
virtual void preActions();
virtual void actions();
};
class Scene406 : public Scene4xx {
private:
bool _frameInRoomFl;
bool _takingFrameInRoomFl;
int _redFrameHotspotId;
int _greenFrameHostpotId;
int _blueFrameHotspotId;
int _yellowFrameHotspotId;
public:
Scene406(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