aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStrangerke2014-05-13 00:15:48 +0200
committerStrangerke2014-05-13 00:15:48 +0200
commit85c311059c3fe562b688765820066825a47d2f10 (patch)
tree69d206e1849a335ec5644dcc2f7dc5574398dbaf
parent8e728a04e893ebb9efe249715506289f2088ab16 (diff)
downloadscummvm-rg350-85c311059c3fe562b688765820066825a47d2f10.tar.gz
scummvm-rg350-85c311059c3fe562b688765820066825a47d2f10.tar.bz2
scummvm-rg350-85c311059c3fe562b688765820066825a47d2f10.zip
MADS: Implement scene 609
-rw-r--r--engines/mads/nebular/nebular_scenes.cpp2
-rw-r--r--engines/mads/nebular/nebular_scenes6.cpp333
-rw-r--r--engines/mads/nebular/nebular_scenes6.h17
3 files changed, 346 insertions, 6 deletions
diff --git a/engines/mads/nebular/nebular_scenes.cpp b/engines/mads/nebular/nebular_scenes.cpp
index fa2c4a3d58..debc1df78d 100644
--- a/engines/mads/nebular/nebular_scenes.cpp
+++ b/engines/mads/nebular/nebular_scenes.cpp
@@ -239,7 +239,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
case 608: // inside Abdul's garage
return new Scene608(vm);
case 609: // outside Buckluster video store
- return new DummyScene(vm); // TODO
+ return new Scene609(vm);
case 610: // inside Buckluster video store
return new DummyScene(vm); // TODO
case 611: // back alley
diff --git a/engines/mads/nebular/nebular_scenes6.cpp b/engines/mads/nebular/nebular_scenes6.cpp
index 6c228c1234..f934c42750 100644
--- a/engines/mads/nebular/nebular_scenes6.cpp
+++ b/engines/mads/nebular/nebular_scenes6.cpp
@@ -1255,11 +1255,11 @@ void Scene607::handleThrowingBone() {
_dogBarking = false;
if (_game._objects.isInInventory(OBJ_BONE)) {
- _game._objects.setRoom(OBJ_BONE, NOWHERE);
+ _game._objects.setRoom(OBJ_BONE, 1);
if (_animationMode == 1)
_globals[kBone202Status] = 0;
} else {
- _game._objects.setRoom(OBJ_BONES, NOWHERE);
+ _game._objects.setRoom(OBJ_BONES, 1);
_game._objects.addToInventory(OBJ_BONE);
}
@@ -1505,9 +1505,9 @@ void Scene608::handleThrowingBone() {
_scene->_sequences.addTimer(1, 2);
else {
if (_game._objects.isInInventory(OBJ_BONE))
- _game._objects.setRoom(OBJ_BONE, NOWHERE);
+ _game._objects.setRoom(OBJ_BONE, 1);
else {
- _game._objects.setRoom(OBJ_BONES, NOWHERE);
+ _game._objects.setRoom(OBJ_BONES, 1);
_game._objects.addToInventory(OBJ_BONE);
}
_scene->_sequences.addTimer(60, 3);
@@ -2247,7 +2247,7 @@ void Scene608::actions() {
if (_dogActiveFl) {
if (_game._trigger == 0) {
_scene->_kernelMessages.reset();
- _scene->_kernelMessages.add(Common::Point(0,0), 0x1110, 34, 0, 120, _game.getQuote(0x301));
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x301));
}
_throwMode = 6;
handleThrowingBone();
@@ -2378,6 +2378,329 @@ void Scene608::actions() {
/*------------------------------------------------------------------------*/
+void Scene609::setup() {
+ setPlayerSpritesPrefix();
+ setAAName();
+}
+
+void Scene609::enter() {
+ _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
+ _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
+ _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('h', 0));
+ _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_9");
+ _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMRC_9");
+
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+
+ if (!_game._visitedScenes._sceneRevisited)
+ _globals[kBeenInVideoStore] = false;
+
+ if (_scene->_priorSceneId == 611) {
+ _game._player._playerPos = Common::Point(264, 69);
+ _game._player._facing = FACING_SOUTHWEST;
+ } else if (_scene->_priorSceneId == 610) {
+ _game._player._playerPos = Common::Point(23, 90);
+ _game._player._facing = FACING_EAST;
+ _scene->_sequences.addTimer(60, 60);
+ _game._player._stepEnabled = false;
+ } else if (_scene->_priorSceneId != -2) {
+ _game._player._playerPos = Common::Point(86, 136);
+ _game._player._facing = FACING_NORTHEAST;
+ _game._player._visible = false;
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->loadAnimation(formAnimName('R', 1), 70);
+ }
+
+ if (_scene->_roomChanged) {
+ _game._objects.addToInventory(OBJ_DOOR_KEY);
+ if (_game._difficulty != DIFFICULTY_EASY)
+ _game._objects.addToInventory(OBJ_PENLIGHT);
+ }
+
+ sceneEntrySound();
+ _game.loadQuoteSet(0x305, 0x306, 0x307, 0x308, 0x309, 0);
+}
+
+void Scene609::step() {
+ switch (_game._trigger) {
+ case 60:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
+ break;
+
+ case 61:
+ _scene->_hotspots.activate(0x425, false);
+ _game._player.walk(Common::Point(101, 100), FACING_EAST);
+ _scene->_sequences.addTimer(180, 62);
+ break;
+
+ case 62:
+ _scene->_sequences.remove( _globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_hotspots.activate(0x425, true);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 63);
+ break;
+
+ case 63:
+ if (!_globals[kHasTalkedToHermit] && (_game._difficulty != DIFFICULTY_HARD)) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 26, 2, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _scene->_sequences.setMsgPosition(_globals._sequenceIndexes[3], Common::Point(287, 73));
+ _scene->_sequences.setScale(_globals._sequenceIndexes[3], 47);
+ }
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ switch (_game._trigger) {
+ case 70:
+ _game._player._visible = true;
+ _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
+ _scene->_sequences.addTimer(6, 71);
+ break;
+
+ case 71:
+ if (!_globals[kHasTalkedToHermit]) {
+ _globals._sequenceIndexes[3] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[3], false, 26, 2, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
+ _scene->_sequences.setMsgPosition(_globals._sequenceIndexes[3], Common::Point(287, 73));
+ _scene->_sequences.setScale(_globals._sequenceIndexes[3], 47);
+ }
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
+ break;
+
+ case 72:
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene609::enterStore() {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ if (_videoDoorMode == 2)
+ _scene->_sequences.addTimer(1, 4);
+ else {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x305));
+ _scene->_sequences.addTimer(120, 1);
+ }
+ break;
+
+ case 1:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x306));
+ _scene->_sequences.addTimer(60, 2);
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[5], true, 11, 2, 0, 0);
+ _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3:
+ _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
+ _game._player._visible = true;
+ _game._objects.setRoom(OBJ_DOOR_KEY, 1);
+ _scene->_sequences.addTimer(15, 4);
+ break;
+
+ case 4:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], true, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addTimer(15, 5);
+ break;
+
+ case 5:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
+ break;
+
+ case 6:
+ _scene->_hotspots.activate(0x425, false);
+ if (_videoDoorMode == 1) {
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(0x307));
+ }
+ _game._player.walk(Common::Point(23, 90), FACING_WEST);
+ _scene->_sequences.addTimer(180, 7);
+ break;
+
+ case 7:
+ _scene->_sequences.remove(_globals._sequenceIndexes[2]);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
+ break;
+
+ case 8:
+ _scene->_hotspots.activate(0x425, true);
+ _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
+ _globals[kBeenInVideoStore] = true;
+ _game._player._stepEnabled = true;
+ _scene->_nextSceneId = 610;
+ break;
+
+ default:
+ break;
+ }
+}
+
+void Scene609::preActions() {
+ if (_action.isAction(0x17B, 0x6F, 0x425))
+ _game._player.walk(Common::Point(78, 99), FACING_NORTHWEST);
+}
+
+void Scene609::actions() {
+ if (_action.isAction(0x18C, 0x423))
+ _scene->_nextSceneId = 611;
+ else if (_action.isAction(0x18B, 0x425)) {
+ if (!_globals[kBeenInVideoStore]) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x308));
+ _scene->_sequences.addTimer(120, 1);
+ break;
+
+ case 1:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], true, 1);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]);
+ _scene->_sequences.addTimer(30, 2);
+ break;
+
+ case 2:
+ _scene->_sequences.remove(_globals._sequenceIndexes[5]);
+ _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
+ _game._player._visible = true;
+ _scene->_sequences.addTimer(60, 3);
+ break;
+
+ case 3:
+ _scene->_kernelMessages.reset();
+ _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x309));
+ _scene->_sequences.addTimer(120, 4);
+ break;
+
+ case 4:
+ _game._player._stepEnabled = true;
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ _videoDoorMode = 2;
+ enterStore();
+ }
+ } else if (_action.isAction(0x17B, 0x6F, 0x425)) {
+ _videoDoorMode = 1;
+ enterStore();
+ } else if (_action.isAction(0x325, 0x324)) {
+ switch (_game._trigger) {
+ case 0:
+ _game._player._stepEnabled = false;
+ _scene->_sequences.remove(_globals._sequenceIndexes[1]);
+ _globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle (_globals._spriteIndexes[1], false, 6, 1, 0, 0);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
+ break;
+
+ case 1: {
+ int syncIdx = _globals._sequenceIndexes[1];
+ _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
+ _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
+ _scene->_sequences.addTimer(6, 2);
+ }
+ break;
+
+ case 2:
+ _game._player._visible = false;
+ _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
+ break;
+
+ case 3: {
+ int syncIdx = _globals._sequenceIndexes[4];
+ _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
+ _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
+ _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
+ _scene->_nextSceneId = 504;
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else if (_action._lookFlag)
+ _vm->_dialogs->show(60910);
+ else if (_action.isAction(VERB_LOOK, 0x31E))
+ _vm->_dialogs->show(60911);
+ else if (_action.isAction(VERB_LOOK, 0x421))
+ _vm->_dialogs->show(60912);
+ else if (_action.isAction(VERB_LOOK, 0x427))
+ _vm->_dialogs->show(60913);
+ else if (_action.isAction(VERB_LOOK, 0x33A))
+ _vm->_dialogs->show(60914);
+ else if (_action.isAction(VERB_LOOK, 0x2CD))
+ _vm->_dialogs->show(60915);
+ else if (_action.isAction(VERB_LOOK, 0x324))
+ _vm->_dialogs->show(60916);
+ else if (_action.isAction(VERB_LOOK, 0x41F))
+ _vm->_dialogs->show(60917);
+ else if (_action.isAction(VERB_LOOK, 0x425)) {
+ if (!_globals[kBeenInVideoStore])
+ _vm->_dialogs->show(60918);
+ else
+ _vm->_dialogs->show(60919);
+ } else if (_action.isAction(0x1AD, 0x31E))
+ _vm->_dialogs->show(60730);
+ else
+ return;
+
+ _action._inProgress = false;
+}
+
+/*------------------------------------------------------------------------*/
+
void Scene620::setup() {
_game._player._spritesPrefix = "";
setAAName();
diff --git a/engines/mads/nebular/nebular_scenes6.h b/engines/mads/nebular/nebular_scenes6.h
index d259eab61e..a5fa754a85 100644
--- a/engines/mads/nebular/nebular_scenes6.h
+++ b/engines/mads/nebular/nebular_scenes6.h
@@ -209,6 +209,23 @@ public:
virtual void postActions() {};
};
+class Scene609: public Scene6xx{
+private:
+ int _videoDoorMode;
+
+ void enterStore();
+
+public:
+ Scene609(MADSEngine *vm) : Scene6xx(vm) {}
+
+ virtual void setup();
+ virtual void enter();
+ virtual void step();
+ virtual void preActions();
+ virtual void actions();
+ virtual void postActions() {};
+};
+
class Scene620: public Scene6xx{
public:
Scene620(MADSEngine *vm) : Scene6xx(vm) {}