MADS: Implement scene 607

This commit is contained in:
Strangerke
2014-05-11 23:50:52 +02:00
parent 3b09886796
commit e21534ecc2
3 changed files with 462 additions and 2 deletions
+1 -1
View File
@@ -235,7 +235,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {
case 605: // viewport closeup
return new Scene605(vm);
case 607: // outside Abdul's garage
return new DummyScene(vm); // TODO
return new Scene607(vm);
case 608: // inside Abdul's garage
return new DummyScene(vm); // TODO
case 609: // outside Buckluster video store
+434 -1
View File
@@ -820,7 +820,7 @@ void Scene604::handleBombActions() {
case 1:
_globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1);
_timebombHotspotId = _scene->_dynamicHotspots.add (0x171, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
_timebombHotspotId = _scene->_dynamicHotspots.add(0x171, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(_timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST);
_game._objects.setRoom(OBJ_TIMEBOMB, _scene->_currentSceneId);
break;
@@ -985,5 +985,438 @@ void Scene605::actions() {
/*------------------------------------------------------------------------*/
void Scene607::setup() {
setPlayerSpritesPrefix();
setAAName();
_scene->addActiveVocab(0x471);
_scene->addActiveVocab(VERB_WALKTO);
}
void Scene607::enter() {
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_3");
if (!_game._visitedScenes._sceneRevisited && (_scene->_priorSceneId != 608))
_globals[kDogStatus] = 1;
if ((_scene->_priorSceneId == 608) && (_globals[kDogStatus] < 3))
_globals[kDogStatus] = 3;
_animationActive = 0;
if ((_globals[kDogStatus] == 1) && (_game._difficulty != DIFFICULTY_EASY)) {
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 3));
_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 7));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', 0));
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
_dogBarking = false;
_dogLoop = false;
_shopAvailable = false;
_dogEatsRex = false;
_dogTimer = 0;
} else
_scene->_hotspots.activate(0x471, false);
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
if (_scene->_priorSceneId == 608) {
_game._player._playerPos = Common::Point(297, 50);
_game._player._facing = FACING_SOUTHEAST;
} else if (_scene->_priorSceneId != -2) {
_game._player._playerPos = Common::Point(40, 104);
_game._player._facing = FACING_SOUTHEAST;
_game._player._visible = false;
_game._player._stepEnabled = false;
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
_scene->loadAnimation(formAnimName('R', 1), 80);
} else if (_globals[kDogStatus] == 2) {
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 3));
_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 7));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', 0));
}
sceneEntrySound();
if (_scene->_roomChanged)
_game._objects.addToInventory(OBJ_BONES);
_vm->_palette->setEntry(252, 63, 44, 30);
_vm->_palette->setEntry(253, 63, 20, 22);
_game.loadQuoteSet(0x2F8, 0x2F7, 0x2F6, 0x2F9, 0x2FA, 0);
}
void Scene607::step() {
if (_globals[kDogStatus] == 2) {
int32 diff = _scene->_frameStartTime - _lastFrameTime;
if ((diff >= 0) && (diff <= 4))
_dogTimer += diff;
else
_dogTimer++;
_lastFrameTime = _scene->_frameStartTime;
}
if ((_dogTimer >= 480) && !_dogLoop && !_shopAvailable && (_globals[kDogStatus] == 2) && !_game._player._special) {
_vm->_sound->command(14);
_dogLoop = true;
_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1, 0, 0);
_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 91);
_dogLoop = false;
_dogTimer = 0;
}
if (_game._trigger == 91) {
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
_dogBarking = false;
_globals[kDogStatus] = 1;
_scene->_hotspots.activate(0x471, true);
}
if (!_dogEatsRex && (_game._difficulty != DIFFICULTY_EASY) && !_animationActive && (_globals[kDogStatus] == 1)
&& !_dogBarking && (_vm->getRandomNumber(1, 50) == 10)) {
_dogBarking = true;
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
_globals._sequenceIndexes[1] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[1], false, 5, 8, 0, 0);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
_scene->_kernelMessages.reset();
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 2, 100);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 70);
_counter = 0;
}
if ((_game._trigger == 70) && !_dogEatsRex && (_globals[kDogStatus] == 1) && !_animationActive) {
int syncIdx = _globals._sequenceIndexes[1];
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
_scene->_kernelMessages.reset();
_dogBarking = false;
}
if (_game._trigger == 100) {
_counter++;
_vm->_sound->command(12);
if ((_counter >= 1) && (_counter <= 4)) {
Common::Point pos(0, 0);
switch (_counter) {
case 1:
pos = Common::Point(237, 5);
break;
case 2:
pos = Common::Point(270, 15);
break;
case 3:
pos = Common::Point(237, 25);
break;
case 4:
pos = Common::Point(270, 36);
break;
default:
break;
}
_scene->_kernelMessages.add(pos, 0xFDFC, 0, 0, 120, _game.getQuote(0x2F9));
}
}
if (_game._player._moving && (_game._difficulty != DIFFICULTY_EASY) && !_shopAvailable && (_globals[kDogStatus] == 1) && (_scene->_rails.getNext() > 0)) {
_game._player.cancelCommand();
_game._player.startWalking(Common::Point(268, 72), FACING_NORTHEAST);
_scene->_rails.resetNext();
}
if ((_game._player._special > 0) && (_game._difficulty != DIFFICULTY_EASY) && (_globals[kDogStatus] == 1) && _game._player._stepEnabled)
_game._player._stepEnabled = false;
if ((_game._difficulty != DIFFICULTY_EASY) && (_globals[kDogStatus] == 1) && (_game._player._playerPos == Common::Point(268, 72))
&& (_game._trigger || !_dogEatsRex)) {
_dogEatsRex = true;
switch (_game._trigger) {
case 91:
case 0:
_animationActive = 1;
_game._player._visible = false;
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, 7);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
_scene->_kernelMessages.reset();
_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FA));
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
_scene->_sequences.addTimer(10, 64);
break;
case 60: {
int syncIdx = _globals._sequenceIndexes[4];
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 8, 45);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
}
break;
case 61: {
int syncIdx = _globals._sequenceIndexes[4];
_globals._sequenceIndexes[4] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[4], false, 15, 3, 0, 0);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 46, -2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 62);
}
break;
case 62: {
int syncIdx = _globals._sequenceIndexes[4];
_animationActive = 2;
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
_scene->_sequences.addTimer(60, 63);
}
break;
case 63:
_vm->_dialogs->show(60729);
_animationActive = 0;
_dogEatsRex = false;
_scene->_reloadSceneFlag = true;
_game._player._stepEnabled = true;
break;
case 64:
if (_dogEatsRex && (_animationActive == 1)) {
_vm->_sound->command(12);
_scene->_sequences.addTimer(10, 64);
}
break;
default:
break;
}
}
switch (_game._trigger) {
case 80:
_game._player._visible = true;
_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
_scene->_sequences.addTimer(6, 81);
break;
case 81:
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 82);
break;
case 82:
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
_game._player._stepEnabled = true;
break;
default:
break;
}
}
void Scene607::handleThrowingBone() {
_animationActive = -1;
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
_game._player._visible = false;
_scene->loadAnimation(formAnimName('D', _animationMode), 1);
break;
case 1:
_game._player._visible = true;
_game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount;
if (_animationMode != 1)
_scene->_hotspots.activate(0x471, false);
else {
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6);
}
_dogBarking = false;
if (_game._objects.isInInventory(OBJ_BONE)) {
_game._objects.setRoom(OBJ_BONE, NOWHERE);
if (_animationMode == 1)
_globals[kBone202Status] = 0;
} else {
_game._objects.setRoom(OBJ_BONES, NOWHERE);
_game._objects.addToInventory(OBJ_BONE);
}
_scene->_sequences.addTimer(60, 2);
break;
case 2: {
int quoteId = 0x2F8;
if (_animationMode == 1)
quoteId = 0x2F7;
if (_animationMode == 2) {
_globals[kDogStatus] = 2;
_dogTimer = 0;
}
_scene->_kernelMessages.reset();
_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(quoteId));
_scene->_sequences.addTimer(60, 3);
}
break;
case 3:
_game._player._stepEnabled = true;
_animationActive = 0;
break;
default:
break;
}
}
void Scene607::preActions() {
if (_action.isAction(VERB_TALKTO, 0x471))
_game._player._needToWalk = false;
if (_action.isAction(0x18B, 0x478) && (_globals[kDogStatus] == 2) && (_game._difficulty != DIFFICULTY_EASY)) {
_shopAvailable = true;
_dogTimer = 0;
}
if (_action.isAction(VERB_THROW, 0x2D, 0x471) || _action.isAction(VERB_THROW, 0x2C, 0x471))
_game._player.walk(Common::Point(193, 100), FACING_NORTHEAST);
if (_action.isAction(VERB_THROW, 0x2D, 0x2C3) || _action.isAction(VERB_THROW, 0x2C, 0x2C3))
_game._player.walk(Common::Point(201, 107), FACING_SOUTHEAST);
}
void Scene607::actions() {
if (_action.isAction(0x18B, 0x478))
_scene->_nextSceneId = 608;
else if (_action.isAction(0x325, 0x324)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
_globals._sequenceIndexes[2] = _scene->_sequences.startReverseCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
break;
case 1: {
int syncIdx = _globals._sequenceIndexes[2];
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
_scene->_sequences.addTimer(6, 2);
}
break;
case 2:
_game._player._visible = false;
_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 10, 1, 0, 0);
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
break;
case 3: {
int syncIdx = _globals._sequenceIndexes[3];
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
_scene->_nextSceneId = 504;
}
break;
default:
break;
}
} else if (_action.isAction(VERB_THROW, 0x2D, 0x471) || _action.isAction(VERB_THROW, 0x2C, 0x471)) {
if (_game._difficulty != DIFFICULTY_EASY) {
_animationMode = 1;
_scene->_kernelMessages.reset();
if (_game._trigger == 0)
_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6));
handleThrowingBone();
}
} else if ((_action.isAction(VERB_THROW, 0x2D, 0x2C3) || _action.isAction(VERB_THROW, 0x2C, 0x2C3)) && (_game._difficulty != DIFFICULTY_EASY)
&& ((_globals[kDogStatus] == 1) || _game._trigger)) {
_animationMode = 2;
if (_game._trigger == 0) {
_scene->_kernelMessages.reset();
_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6));
}
handleThrowingBone();
} else if (_action._lookFlag || _action.isAction(VERB_LOOK, 0x31E)) {
if ((_globals[kDogStatus] == 1) || (_game._difficulty == DIFFICULTY_EASY))
_vm->_dialogs->show(60710);
else
_vm->_dialogs->show(60711);
} else if (_action.isAction(VERB_LOOK, 0x18D))
_vm->_dialogs->show(60712);
else if (_action.isAction(VERB_LOOK, 0x2C3))
_vm->_dialogs->show(60713);
else if (_action.isAction(VERB_LOOK, 0x324))
_vm->_dialogs->show(60714);
else if (_action.isAction(VERB_LOOK, 0x3FB))
_vm->_dialogs->show(60715);
else if (_action.isAction(VERB_LOOK, 0x1E6) && (_globals[kDogStatus] == 1))
_vm->_dialogs->show(60716);
else if (_action.isAction(VERB_LOOK, 0x244))
_vm->_dialogs->show(60717);
else if (_action.isAction(VERB_LOOK, 0x3FD))
_vm->_dialogs->show(60718);
else if (_action.isAction(VERB_LOOK, 0x3FF))
_vm->_dialogs->show(60719);
else if (_action.isAction(VERB_LOOK, 0x31D))
_vm->_dialogs->show(60720);
else if (_action.isAction(VERB_LOOK, 0x3F9))
_vm->_dialogs->show(60721);
else if (_action.isAction(VERB_LOOK, 0x3FA)) {
if (_globals[kDogStatus] == 1)
_vm->_dialogs->show(60723);
else
_vm->_dialogs->show(60722);
} else if (_action.isAction(VERB_LOOK, 0x478)) {
if (_globals[kDogStatus] == 1)
_vm->_dialogs->show(60725);
else
_vm->_dialogs->show(60724);
} else if (_action.isAction(VERB_LOOK, 0x471))
_vm->_dialogs->show(60726);
else if (_action.isAction(VERB_TALKTO, 0x471))
_vm->_dialogs->show(60727);
else if (_action.isAction(VERB_LOOK, 0x31F))
_vm->_dialogs->show(60728);
else if (_action.isAction(0x1AD, 0x31E))
_vm->_dialogs->show(60730);
else if (_action.isAction(0x3FF) && (_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)))
_vm->_dialogs->show(60731);
else
return;
_action._inProgress = false;
}
/*------------------------------------------------------------------------*/
} // End of namespace Nebular
} // End of namespace MADS
+27
View File
@@ -133,6 +133,33 @@ public:
virtual void actions();
virtual void postActions() {};
};
class Scene607: public Scene6xx{
private:
uint32 _dogTimer;
uint32 _lastFrameTime;
bool _dogLoop;
bool _dogEatsRex;
bool _dogBarking;
bool _shopAvailable;
int _animationMode;
int _animationActive;
int _counter;
void handleThrowingBone();
public:
Scene607(MADSEngine *vm) : Scene6xx(vm) {}
virtual void setup();
virtual void enter();
virtual void step();
virtual void preActions();
virtual void actions();
virtual void postActions() {};
};
} // End of namespace Nebular
} // End of namespace MADS