diff options
| -rw-r--r-- | engines/mads/dragonsphere/dragonsphere_scenes.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/dragonsphere/dragonsphere_scenes.h | 41 | ||||
| -rw-r--r-- | engines/mads/dragonsphere/dragonsphere_scenes1.cpp | 424 | ||||
| -rw-r--r-- | engines/mads/dragonsphere/dragonsphere_scenes1.h | 18 | 
4 files changed, 465 insertions, 20 deletions
| diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.cpp b/engines/mads/dragonsphere/dragonsphere_scenes.cpp index 0f0fb5c103..c0781f5d18 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes.cpp +++ b/engines/mads/dragonsphere/dragonsphere_scenes.cpp @@ -45,7 +45,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) {  	case 101:	// king's bedroom  		return new Scene101(vm);  	case 102:	// queen's bedroom -		return new DummyScene(vm);	// TODO +		return new Scene102(vm);  	case 103:	// outside king's bedroom  		return new DummyScene(vm);	// TODO  	case 104:	// fireplace / bookshelf diff --git a/engines/mads/dragonsphere/dragonsphere_scenes.h b/engines/mads/dragonsphere/dragonsphere_scenes.h index 2ecf8e9955..a3bc22cb93 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes.h +++ b/engines/mads/dragonsphere/dragonsphere_scenes.h @@ -33,24 +33,34 @@ namespace MADS {  namespace Dragonsphere { +enum Verb { +	VERB_LOOK = 0x3, +	VERB_TAKE = 0x4, +	VERB_PUSH = 0x5, +	VERB_OPEN = 0x6, +	VERB_PUT = 0x7, +	VERB_TALK_TO = 0x8, +	VERB_GIVE = 0x9, +	VERB_PULL = 0xA, +	VERB_CLOSE = 0xB, +	VERB_THROW = 0xC, +	VERB_WALK_TO = 0xD, +	VERB_WALK_ACROSS = 0x11, +	VERB_WALK_BEHIND = 0x1C, +	VERB_LOOK_AT = 0x1E, +	VERB_WALK_THROUGH = 0x25, +	VERB_WALK_INTO = 0x27, +	VERB_WALK_DOWN = 0xA9, +	VERB_WALK = 0x1CB, +	VERB_WALK_AROUND = 0x221 +}; +  enum Noun {  	NOUN_GAME = 0x1,  	NOUN_QSAVE = 0x2, -	NOUN_LOOK = 0x3, -	NOUN_TAKE = 0x4, -	NOUN_PUSH = 0x5, -	NOUN_OPEN = 0x6, -	NOUN_PUT = 0x7, -	NOUN_TALK_TO = 0x8, -	NOUN_GIVE = 0x9, -	NOUN_PULL = 0xA, -	NOUN_CLOSE = 0xB, -	NOUN_THROW = 0xC, -	NOUN_WALK_TO = 0xD,  	NOUN_NOTHING = 0xE,  	NOUN_ = 0xF,  	NOUN_FLOOR = 0x10, -	NOUN_WALK_ACROSS = 0x11,  	NOUN_RUG = 0x12,  	NOUN_CARPET = 0x13,  	NOUN_WALL = 0x14, @@ -61,18 +71,14 @@ enum Noun {  	NOUN_NIGHTSTAND = 0x19,  	NOUN_TAPESTRY = 0x1A,  	NOUN_DRESSING_SCREEN = 0x1B, -	NOUN_WALK_BEHIND = 0x1C,  	NOUN_ROYAL_CREST = 0x1D, -	NOUN_LOOK_AT = 0x1E,  	NOUN_WASHBASIN = 0x1F,  	NOUN_WASH_AT = 0x20,  	NOUN_BOOK = 0x21,  	NOUN_FIREPLACE = 0x22,  	NOUN_FIREPLACE_SCREEN = 0x23,  	NOUN_DOOR_TO_QUEENS_ROOM = 0x24, -	NOUN_WALK_THROUGH = 0x25,  	NOUN_HALL_TO_SOUTH = 0x26, -	NOUN_WALK_INTO = 0x27,  	NOUN_WALL_PLAQUE = 0x28,  	NOUN_DECORATION = 0x29,  	NOUN_SWORDS = 0x2A, @@ -202,7 +208,6 @@ enum Noun {  	NOUN_DOOR = 0xA6,  	NOUN_WALL_SWITCH = 0xA7,  	NOUN_STAIRS = 0xA8, -	NOUN_WALK_DOWN = 0xA9,  	NOUN_EDGE_OF_ABYSS = 0xAA,  	NOUN_COURTYARD = 0xAB,  	NOUN_ROCK = 0xAC, @@ -492,7 +497,6 @@ enum Noun {  	NOUN_PATH_TO_HIGHTOWER = 0x1C8,  	NOUN_SPIRIT_PLANE = 0x1C9,  	NOUN_SPIRIT_TREE = 0x1CA, -	NOUN_WALK = 0x1CB,  	NOUN_REMAINS = 0x1CC,  	NOUN_DOORWAY_TO_ELEVATOR = 0x1CD,  	NOUN_DRAGON_DOOR = 0x1CE, @@ -578,7 +582,6 @@ enum Noun {  	NOUN_SHIFTER_VILLAGE = 0x21E,  	NOUN_SLATHAN_SKY = 0x21F,  	NOUN_SHIFTER = 0x220, -	NOUN_WALK_AROUND = 0x221,  	NOUN_WRECKED_BRIDGE = 0x222,  	NOUN_SHACK = 0x223,  	NOUN_WRECKED_SHACK = 0x224, diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp index 6f107df42b..5b5aa72213 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp +++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp @@ -239,5 +239,429 @@ void Scene101::preActions() {  /*------------------------------------------------------------------------*/ +Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) { +	_diaryHotspotIdx1 = -1; +	_diaryHotspotIdx2 = -1; +	_diaryFrame = -1; +	_animRunning = -1; +} + +void Scene102::synchronize(Common::Serializer &s) { +	Scene1xx::synchronize(s); + +	s.syncAsSint16LE(_diaryHotspotIdx1); +	s.syncAsSint16LE(_diaryHotspotIdx2); +	s.syncAsSint16LE(_diaryFrame); +	s.syncAsSint16LE(_animRunning); +} + +void Scene102::setup() { +	setPlayerSpritesPrefix(); +	setAAName(); + +	_scene->addActiveVocab(NOUN_DIARIES); +	_scene->addActiveVocab(VERB_WALK_TO); +} + +void Scene102::enter() { +	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0), false); +	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1), false); +	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0), false); +	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1), false); +	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1), false); +	_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6", false); +	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2), false); + +	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 0, 0); +	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 0, 0); +	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0, 0); + +	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); +	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); +	_diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); +	_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); + +	_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); +	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); +	_diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); +	_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); + +	if (_scene->_priorSceneId == 103) { +		_game._player._playerPos = Common::Point(170, 152); +		_game._player._facing = FACING_NORTHWEST; +		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); +		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); +	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { +		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); +		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); +		_game._player.firstWalk(Common::Point(-10, 130), FACING_EAST, Common::Point(35, 144), FACING_EAST, false); +		_game._player.setWalkTrigger(70); +	} else { +		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); +		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); +	} + +	sceneEntrySound(); +} + +void Scene102::step() { +	int resetFrame; + +	if ((_animRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) { +		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { +			_diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); +			resetFrame = -1; + +			switch (_diaryFrame) { +			case 6: +				_scene->deleteSequence(_globals._sequenceIndexes[1]); +				_game.syncTimers(1, _globals._sequenceIndexes[1], 3, _globals._animationIndexes[0]); +				break; + +			case 10: +				_vm->_sound->command(65); +				break; + +			case 26: +				_vm->_dialogs->show(10210); +				_vm->_dialogs->show(10211); +				_vm->_dialogs->show(10212); +				break; + +			default: +				break; +			} + +			if (resetFrame >= 0) { +				if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) { +					_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); +					_diaryFrame = resetFrame; +				} +			} +		} +	} + +	if ((_animRunning == 2) && _scene->_animation[_globals._animationIndexes[0]]) { +		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { +			_diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); +			resetFrame = -1; + +			switch (_diaryFrame) { +			case 6: +				_scene->deleteSequence(_globals._sequenceIndexes[2]); +				_game.syncTimers(1, _globals._sequenceIndexes[2], 3, _globals._animationIndexes[0]); +				break; + +			case 26: +				_vm->_dialogs->show(10213); +				_vm->_dialogs->show(10214); +				break; + +			default: +				break; +			} + +			if (resetFrame >= 0) { +				if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) { +					_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); +					_diaryFrame = resetFrame; +				} +			} +		} +	} + +	if (_game._trigger >= 70) { +		switch (_game._trigger) { +		case 70: +			_scene->deleteSequence(_globals._sequenceIndexes[6]); +			_vm->_sound->command(25); +			_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); +			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); +			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); +			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 71); +			break; + +		case 71: { +			int idx = _globals._sequenceIndexes[6]; +			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); +			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], -2); +			_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx); +			_game._player._stepEnabled = true; +			} +			break; + +		default: +			break; +		} +	} +} + +void Scene102::actions() { +	if (_action._lookFlag) { +		_vm->_dialogs->show(10201); +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) { +		switch (_game._trigger) { +		case 0: +			_game._player._stepEnabled = false; +			_game._player._visible = false; +			_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2); +			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7],true); +			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 2, 2, 1); +			_scene->_sequences.setTrigger(_globals._sequenceIndexes[7], 0, 0, 3); +			break; + +		case 1: +			_scene->deleteSequence(_globals._sequenceIndexes[6]); +			_vm->_sound->command(24); +			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); +			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); +			_scene->_sequences.setTrigger(_globals._sequenceIndexes[6], 0, 0, 2); +			break; + +		case 2: { +			int idx = _globals._sequenceIndexes[6]; +			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 5); +			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); +			_game.syncTimers(1, _globals._sequenceIndexes[6], 1, idx); +			} +			break; + +		case 3: +			_game._player._visible = true; +			_game.syncTimers(2, 0, 1, _globals._sequenceIndexes[7]); +			_game._player.walk(Common::Point(0, 130), FACING_WEST); +			_game._player._walkOffScreenSceneId = 101; +			break; + +		default: +			break; +		} +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { +		_scene->_nextSceneId = 103; +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_TAKE, NOUN_DIARIES) || _action.isAction(VERB_OPEN, NOUN_DIARIES)) { +		switch (_game._trigger) { +		case 0: +			_game._player._stepEnabled = false; +			_game._player._visible = false; +			_animRunning = 1; +			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('B',-1), 1); +			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0); +			break; + +		case 1: +			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); +			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); +			_diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); +			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); +			_game._player._visible = true; +			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]); +			_scene->_sequences.setTimingTrigger(6, 2); +			break; + +		case 2: +			_game._player.walk(Common::Point(51, 121), FACING_NORTHWEST); +			_game._player.setWalkTrigger(3); +			break; + +		case 3: +			_game._player._visible = false; +			_animRunning = 2; +			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 4); +			_game.syncTimers(3, _globals._animationIndexes[0], 2, 0); +			break; + +		case 4: +			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); +			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); +			_diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); +			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); +			_game._player._visible = true; +			_game._player._stepEnabled = true; +			_game.syncTimers(2, 0, 3, _globals._animationIndexes[0]); +			break; + +		default: +			break; +		} +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { +		if (_action.isObject(NOUN_FIREPLACE)) { +			_vm->_dialogs->show(10202); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_BED)) { +			_vm->_dialogs->show(10203); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_SHUTTERS)) { +			_vm->_dialogs->show(10204); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_RUG)) { +			_vm->_dialogs->show(10206); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_BOOKCASE)) { +			_vm->_dialogs->show(10208); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_DIARIES)) { +			_vm->_dialogs->show(10209); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) { +			_vm->_dialogs->show(10215); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_FLOWERS)) { +			_vm->_dialogs->show(10216); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_WINDOW)) { +			_vm->_dialogs->show(10217); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_WOOD_BASKET)) { +			_vm->_dialogs->show(10219); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_FIREPLACE_SCREEN)) { +			_vm->_dialogs->show(10220); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_NIGHTSTAND)) { +			_vm->_dialogs->show(10222); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { +			_vm->_dialogs->show(10223); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_CHEST)) { +			_vm->_dialogs->show(10224); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_TAPESTRY)) { +			_vm->_dialogs->show(10226); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_SCONCE)) { +			_vm->_dialogs->show(10227); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_FLOOR)) { +			_vm->_dialogs->show(10228); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_WALL)) { +			_vm->_dialogs->show(10229); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_DECORATION)) { +			_vm->_dialogs->show(10230); +			_action._inProgress = false; +			return; +		} + +		if (_action.isObject(NOUN_CEILING)) { +			_vm->_dialogs->show(10231); +			_action._inProgress = false; +			return; +		} +	} + +	if (_action.isAction(VERB_OPEN, NOUN_CHEST)) { +		_vm->_dialogs->show(10224); +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_TAKE, NOUN_FLOWERS)) { +		_vm->_dialogs->show(10225); +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_OPEN, NOUN_WINDOW)) { +		_vm->_dialogs->show(10218); +		_action._inProgress = false; +		return; +	} + +	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) { +		_vm->_dialogs->show(10221); +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_CLOSE, NOUN_SHUTTERS)) { +		_vm->_dialogs->show(10205); +		_action._inProgress = false; +		return; +	} + +	if (_action.isAction(VERB_PULL, NOUN_RUG)) { +		_vm->_dialogs->show(10207); +		_action._inProgress = false; +		return; +	} +} + +void Scene102::preActions() { +} + +/*------------------------------------------------------------------------*/ +  } // End of namespace Dragonsphere  } // End of namespace MADS diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.h b/engines/mads/dragonsphere/dragonsphere_scenes1.h index 023a789505..ac82669d68 100644 --- a/engines/mads/dragonsphere/dragonsphere_scenes1.h +++ b/engines/mads/dragonsphere/dragonsphere_scenes1.h @@ -64,6 +64,24 @@ public:  	virtual void preActions();  	virtual void actions();  }; + +class Scene102 : public Scene1xx { +private: +	int _diaryHotspotIdx1; +	int _diaryHotspotIdx2; +	int _diaryFrame; +	int _animRunning; + +public: +	Scene102(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 Dragonsphere  } // End of namespace MADS | 
