/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#include "tsage/blue_force/blueforce_scenes2.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"

namespace TsAGE {

namespace BlueForce {

/*--------------------------------------------------------------------------
 * Scene 200 - Credits - Motorcycle Training
 *
 *--------------------------------------------------------------------------*/

void Scene200::Action1::signal() {
	Scene200 *scene = (Scene200 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);

	assert(owner);

	switch (_actionIndex++) {
	case 0:
		setDelay(1);
		break;
	case 1:
		BF_GLOBALS._scenePalette.loadPalette(235);
		BF_GLOBALS._scenePalette.refresh();
		_state = 0;
		setDelay(30);
		break;
	case 2:
		assert(_owner);
		owner->animate(ANIM_MODE_5, this);
		break;
	case 3:
		if (++_state < 2) {
			scene->_action2.signal();
			owner->setFrame(1);
			_actionIndex = 2;
		}
		setDelay(2);
		break;
	case 4: {
		PaletteRotation *rot;
		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
		rot->setDelay(10);
		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
		rot->setDelay(10);

		scene->setAction(&scene->_sequenceManager, this, 201, &scene->_object1, &scene->_object2,
			&scene->_object3, &scene->_object4, &scene->_object5, &scene->_object6, NULL);
		break;
	}
	case 5:
		BF_GLOBALS._sceneManager.changeScene(210);
		break;
	default:
		break;
	}
}

void Scene200::Action2::signal() {
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
	assert(owner);

	switch (_actionIndex++) {
	case 1:
		owner->setPosition(owner->_position, 0);
		owner->animate(ANIM_MODE_5, this);
		break;
	case 2:
		owner->setPosition(owner->_position, 1000);
		owner->setFrame(1);
		_actionIndex = 0;
		setDelay(1);
		break;
	default:
		break;
	}
}


/*--------------------------------------------------------------------------*/

void Scene200::postInit(SceneObjectList *OwnerList) {
	SceneExt::postInit();
	loadScene(200);
	setZoomPercents(0, 100, 200, 100);
	BF_GLOBALS._sound1.play(3);

	_object10.postInit();
	_object10.setVisage(200);
	_object10.setPosition(Common::Point(114, 102));
	_object10.setStrip(2);
	_object10.setFrame(1);
	_object10.changeZoom(100);

	_object1.postInit();
	_object1.hide();
	_object2.postInit();
	_object2.hide();
	_object3.postInit();
	_object3.hide();
	_object4.postInit();
	_object4.hide();
	_object5.postInit();
	_object5.hide();
	_object6.postInit();
	_object6.hide();

	_object11.postInit();
	_object11.setVisage(200);
	_object11.setPosition(Common::Point(96, 112), 1000);
	_object11.setStrip(3);
	_object11.setFrame(1);
	_object11.changeZoom(100);

	_object10.setAction(&_action1);
	_object11.setAction(&_action2);
}

void Scene200::remove() {
	BF_GLOBALS._scenePalette.clearListeners();
	SceneExt::remove();
}

/*--------------------------------------------------------------------------
 * Scene 210 - Credits - Car Training
 *
 *--------------------------------------------------------------------------*/

void Scene210::Action1::signal() {
	Scene210 *scene = (Scene210 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(_owner);
	assert(owner);

	switch (_actionIndex++) {
	case 0:
		setDelay(1);
		break;
	case 1:
		owner->animate(ANIM_MODE_5, this);
		break;
	case 2: {
		PaletteRotation *rot;
		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
		rot->setDelay(10);
		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
		rot->setDelay(10);

		scene->setAction(&scene->_sequenceManager, this, 210, &scene->_object10, &scene->_object11,
			&scene->_object12, &scene->_object13, &scene->_object14, &scene->_object15, NULL);
		break;
	}
	case 3:
		BF_GLOBALS._sceneManager.changeScene(220);
		break;
	default:
		break;
	}
}

/*--------------------------------------------------------------------------*/

void Scene210::postInit(SceneObjectList *OwnerList) {
	SceneExt::postInit();
	loadScene(210);

// FIXME: This fixes an obvious glitch during scene transition.
//        Shouldn't it be included in the 2 previous functions?
	clearScreen();
//

	BF_GLOBALS._scenePalette.loadPalette(235);
	BF_GLOBALS._scenePalette.refresh();

	_object9.postInit();
	_object9.setVisage(210);
	_object9.setPosition(Common::Point(146, 151));
	_object9.setStrip(1);
	_object9.setFrame(1);
	_object9.changeZoom(100);
	_object9.setAction(&_action1);

	_object10.postInit();
	_object10.hide();
	_object11.postInit();
	_object11.hide();
	_object12.postInit();
	_object12.hide();
	_object13.postInit();
	_object13.hide();
	_object14.postInit();
	_object14.hide();
	_object15.postInit();
	_object15.hide();
}

void Scene210::remove() {
	BF_GLOBALS._scenePalette.clearListeners();
	SceneExt::remove();
}

/*--------------------------------------------------------------------------
 * Scene 220 - Credits - Martial Arts
 *
 *--------------------------------------------------------------------------*/

void Scene220::Action1::signal() {
	Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene;

	switch (_actionIndex++) {
	case 0:
		setDelay(1);
		break;
	case 1:
		BF_GLOBALS._scenePalette.loadPalette(235);
		BF_GLOBALS._scenePalette.refresh();
		setDelay(30);
		break;
	case 2:
		BF_GLOBALS._scenePalette.clearListeners();
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 3:
		scene->_object2.setVisage(221);
		scene->_object2.setFrame(1);
		scene->_object2.setPosition(Common::Point(178, 122));
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 4:
		BF_GLOBALS._scenePalette.loadPalette(2);
		BF_GLOBALS._scenePalette.refresh();
		BF_GLOBALS._scenePalette.loadPalette(235);
		BF_GLOBALS._scenePalette.refresh();
		setDelay(5);
		break;
	case 5:
		scene->_object1.remove();

		scene->_object2.setVisage(222);
		scene->_object2.setFrame(1);
		scene->_object2.setPosition(Common::Point(164, 138));
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 6:
		scene->_object2.setVisage(223);
		scene->_object2.setFrame(1);
		scene->_object2.setPosition(Common::Point(164, 139));
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 7:
		scene->_object2.setVisage(230);
		scene->_object2.setFrame(1);
		scene->_object2.setPosition(Common::Point(168, 136));
		scene->_object2.animate(ANIM_MODE_4, 13, 1, this);
		break;
	case 8:
		scene->_object2.animate(ANIM_MODE_5, this);

		scene->_object3.postInit();
		scene->_object3.setVisage(231);
		scene->_object3.setPosition(Common::Point(65, 179));
		scene->_object3.setStrip(1);
		scene->_object3.setFrame(1);
		scene->_object3.changeZoom(100);
		scene->_object3.setAction(&scene->_action2, this);
		break;
	case 9:
		break;
	case 10:
		scene->_object2.setVisage(224);
		scene->_object2.setFrame(1);
		scene->_object2.setPosition(Common::Point(148, 143));
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 11: {
		PaletteRotation *rot;
		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
		rot->setDelay(10);
		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
		rot->setDelay(10);

		scene->setAction(&scene->_sequenceManager, this, 220, &scene->_object4, &scene->_object5,
			&scene->_object6, &scene->_object7, &scene->_object8, &scene->_object9, NULL);
		break;
	}
	case 12:
		scene->_object2.setVisage(232);
		scene->_object2.setFrame(1);
		scene->_object2.setPosition(Common::Point(146, 143));
		scene->_object2._numFrames = 5;
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 13:
		scene->_object2.setVisage(228);
		scene->_object2.setFrame(1);
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 14:
		scene->_object2.setVisage(229);
		scene->_object2.setFrame(1);
		scene->_object2.animate(ANIM_MODE_5, this);
		break;
	case 15:
		BF_GLOBALS._sceneManager.changeScene(225);
		break;
	default:
		break;
	}
}

void Scene220::Action2::signal() {
	Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene;

	switch (_actionIndex++) {
	case 0:
		scene->_object3.setPosition(scene->_object3._position);
		scene->_object3.animate(ANIM_MODE_5, this);
		break;
	case 1:
		setDelay(50);
		break;
	case 2:
		scene->_object3.remove();
		remove();
		break;
	default:
		break;
	}
}

/*--------------------------------------------------------------------------*/

void Scene220::postInit(SceneObjectList *OwnerList) {
	SceneExt::postInit();
	loadScene(220);

// FIXME: This fixes an obvious glitch during scene transition.
//        Shouldn't it be included in the 2 previous functions?
	clearScreen();
//

	_object2.postInit();
	_object2.setVisage(220);
	_object2.setPosition(Common::Point(182, 122));
	_object2.setStrip(1);
	_object2.setFrame(1);
	_object2.changeZoom(100);

	_object1.postInit();
	_object1.setVisage(220);
	_object1.setPosition(Common::Point(164, 138));
	_object1.setStrip(2);
	_object1.setFrame(1);
	_object1.changeZoom(100);

	_object4.postInit();
	_object4.hide();
	_object5.postInit();
	_object5.hide();
	_object6.postInit();
	_object6.hide();
	_object7.postInit();
	_object7.hide();
	_object8.postInit();
	_object8.hide();
	_object9.postInit();
	_object9.hide();

	_object2.setAction(&_action1);
}

void Scene220::remove() {
	BF_GLOBALS._scenePalette.clearListeners();
	SceneExt::remove();
}

/*--------------------------------------------------------------------------
 * Scene 225 - Credits - Gun Training
 *
 *--------------------------------------------------------------------------*/

void Scene225::Action1::signal() {
	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);

	switch (_actionIndex++) {
	case 0:
		setDelay(30);
		break;
	case 1:
		BF_GLOBALS._scenePalette.loadPalette(235);
		BF_GLOBALS._scenePalette.refresh();
		setDelay(5);
		break;
	case 2:
		owner->animate(ANIM_MODE_4, 7, 1, this);
		break;
	case 3:
		scene->_object8.animate(ANIM_MODE_5, this);
		owner->animate(ANIM_MODE_5, this);
		break;
	case 4:
		scene->_object8.remove();
		break;
	case 5:
		scene->_action3.signal();
		break;
	case 6:
		owner->setPosition(Common::Point(owner->_position.x, owner->_position.y - 4));
		owner->setStrip(2);
		owner->setFrame(1);
		owner->animate(ANIM_MODE_5, this);
		break;
	case 7:
		scene->_action2.signal();
		break;
	case 8:
		owner->animate(ANIM_MODE_6, this);
		break;
	case 9:
		owner->setPosition(Common::Point(owner->_position.x - 2, owner->_position.y - 1));
		owner->setStrip(3);
		owner->setFrame(1);
		owner->animate(ANIM_MODE_5, this);
		break;
	case 10: {
		owner->setPosition(Common::Point(owner->_position.x + 10, owner->_position.y + 4));
		owner->setStrip(4);
		owner->setFrame(1);
		owner->fixPriority(116);
		owner->animate(ANIM_MODE_1, NULL);

		Common::Point destPos(138, 117);
		NpcMover *mover = new NpcMover();
		owner->addMover(mover, &destPos, this);
		break;
	}
	case 11: {
		owner->setPosition(Common::Point(owner->_position.x - 12, owner->_position.y - 1));
		owner->setStrip(5);
		owner->setFrame(1);
		owner->_moveDiff.x = 8;

		Common::Point destPos(402, 116);
		NpcMover *mover2 = new NpcMover();
		owner->addMover(mover2, &destPos, this);

		BF_GLOBALS._player.setPosition(Common::Point(owner->_position.x, 0));
		ADD_MOVER_NULL(BF_GLOBALS._player, 500, 0);
		break;
	}
	case 12:
		owner->setVisage(1227);
		owner->setStrip(1);
		owner->setFrame(1);
		owner->animate(ANIM_MODE_5, this);
		break;
	case 13:
		owner->setStrip(2);
		owner->setFrame(4);
		scene->_action4.signal();
		break;
	case 14:
		owner->animate(ANIM_MODE_6, this);
		break;
	case 15:
		scene->_action6.signal();
		break;
	case 16:
		owner->animate(ANIM_MODE_4, 4, 1, this);
		break;
	case 17:
		owner->setFrame(6);
		owner->animate(ANIM_MODE_5, this);
		break;
	case 18:
		scene->_action5.signal();
		break;
	case 19:
		owner->animate(ANIM_MODE_4, 4, -1, this);
		break;
	case 20:
		PaletteRotation *rot;
		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
		rot->setDelay(10);
		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
		rot->setDelay(10);

		scene->setAction(&scene->_sequenceManager, this, 225, &scene->_object15, &scene->_object16,
			&scene->_object17, &scene->_object18, &scene->_object19, &scene->_object20, NULL);
		break;
	case 21:
		scene->_object21.hide();
		BF_GLOBALS._player._moveDiff.x = 5;
		BF_GLOBALS._sceneManager.changeScene(265);
		break;
	default:
		break;
	}
}

void Scene225::Action2::signal() {
	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);

	switch (_actionIndex++) {
	case 0:
		break;
	case 1:
		owner->animate(ANIM_MODE_5, this);
		break;
	case 2:
		owner->setStrip(3);
		owner->setFrame(2);
		scene->_action1.signal();
		break;
	default:
		break;
	}
}

void Scene225::Action3::signal() {
	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);

	switch (_actionIndex++) {
	case 0:
		break;
	case 1:
		owner->animate(ANIM_MODE_5, this);
		break;
	case 2:
		owner->setStrip(3);
		owner->setFrame(1);
		scene->_action1.signal();
		break;
	default:
		break;
	}
}

void Scene225::Action4::signal() {
	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);

	switch (_actionIndex++) {
	case 0:
		break;
	case 1:
		owner->animate(ANIM_MODE_5, this);
		break;
	case 2:
		owner->setStrip(5);
		owner->setFrame(4);
		scene->_action1.signal();
		break;
	default:
		break;
	}
}

void Scene225::Action5::signal() {
	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);

	switch (_actionIndex++) {
	case 0:
		break;
	case 1:
		owner->animate(ANIM_MODE_5, this);
		break;
	case 2:
		owner->setStrip(3);
		owner->setFrame(6);
		scene->_action1.signal();
		break;
	default:
		break;
	}
}

void Scene225::Action6::signal() {
	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
	SceneObject *owner = static_cast<SceneObject *>(this->_owner);

	switch (_actionIndex++) {
	case 0:
		break;
	case 1:
		owner->animate(ANIM_MODE_5, this);
		break;
	case 2:
		owner->setStrip(3);
		owner->setFrame(3);
		scene->_action1.signal();
		break;
	default:
		break;
	}
}

/*--------------------------------------------------------------------------*/

void Scene225::postInit(SceneObjectList *OwnerList) {
	SceneExt::postInit();
	loadScene(1225);
	loadBackground(-320, 0);

	_object8.postInit();
	_object8.setVisage(1225);
	_object8.setPosition(Common::Point(114, 119));
	_object8._frame = 1;
	_object8.setStrip(2);
	_object8.changeZoom(100);

	_object9.postInit();
	_object9.setVisage(1226);
	_object9.setPosition(Common::Point(83, 128));
	_object9.setStrip(1);
	_object9.changeZoom(100);

	BF_GLOBALS._player.postInit();
	BF_GLOBALS._player.setPosition(Common::Point(83, 0));
	BF_GLOBALS._player.hide();

	_object10.postInit();
	_object10.setVisage(1225);
	_object10.setPosition(Common::Point(237, 29));
	_object10.setStrip(1);
	_object10._frame = 1;
	_object10.changeZoom(100);
	_object10._numFrames = 2;

	_object11.postInit();
	_object11.setVisage(1225);
	_object11.setPosition(Common::Point(290, 47));
	_object11.setStrip(1);
	_object11._frame = 1;
	_object11.changeZoom(100);
	_object11._numFrames = 2;

	_object12.postInit();
	_object12.setVisage(1225);
	_object12.setPosition(Common::Point(368, 35));
	_object12.setStrip(4);
	_object12._frame = 1;
	_object12.changeZoom(100);
	_object12._numFrames = 2;

	_object13.postInit();
	_object13.setVisage(1225);
	_object13.setPosition(Common::Point(416, 33));
	_object13.setStrip(1);
	_object13._frame = 1;
	_object13.changeZoom(100);
	_object13._numFrames = 2;

	_object14.postInit();
	_object14.setVisage(1225);
	_object14.setPosition(Common::Point(476, 30));
	_object14.setStrip(1);
	_object14._frame = 1;
	_object14.changeZoom(100);
	_object14._numFrames = 2;

	_object21.postInit();
	_object21.setVisage(235);
	_object21.setStrip(1);
	_object21._frame = 1;
	_object21.setPosition(Common::Point(498, 41));
	_object21.changeZoom(100);
	_object21.hide();

	_object15.postInit();
	_object15.hide();
	_object16.postInit();
	_object16.hide();
	_object17.postInit();
	_object17.hide();
	_object18.postInit();
	_object18.hide();
	_object19.postInit();
	_object19.hide();
	_object20.postInit();
	_object20.hide();

	_object9.setAction(&_action1);
	_object10.setAction(&_action2);
	_object11.setAction(&_action3);
	_object12.setAction(&_action4);
	_object13.setAction(&_action5);
	_object14.setAction(&_action6);
}

void Scene225::remove() {
	BF_GLOBALS._scenePalette.clearListeners();
	SceneExt::remove();
}

/*--------------------------------------------------------------------------
 * Scene 265 - Intro - Graduation Article
 *
 *--------------------------------------------------------------------------*/

void Scene265::Action1::signal() {
	switch (_actionIndex++) {
	case 0:
		BF_GLOBALS._scenePalette.loadPalette(2);
		setDelay(30);
		break;
	case 1:
		BF_GLOBALS._scenePalette.refresh();
		setDelay(240);
		break;
	case 2:
		ADD_MOVER(BF_GLOBALS._player, 160, 280);
		break;
	case 3:
		// Wait until sound finishes playing
		if (BF_GLOBALS._sound1.isPlaying())
			_actionIndex = 3;
		setDelay(1);
		break;
	case 4:
		BF_GLOBALS._dayNumber = 1;
		BF_GLOBALS._sceneManager.changeScene(190);
		break;
	default:
		break;
	}
}

/*--------------------------------------------------------------------------*/

void Scene265::postInit(SceneObjectList *OwnerList) {
	SceneExt::postInit();
	loadScene(265);

	BF_GLOBALS._player.postInit();
	BF_GLOBALS._player.setPosition(Common::Point(160, 100));
	BF_GLOBALS._player.hide();
	setAction(&_action1);
}

void Scene265::remove() {
	clearScreen();
	SceneExt::remove();
}

/*--------------------------------------------------------------------------
 * Scene 270 - Living Room & Kitchen
 *
 *--------------------------------------------------------------------------*/

void Scene270::Action1::signal() {
	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;

	scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
}

/*--------------------------------------------------------------------------*/

bool Scene270::Lyle::startAction(CursorType action, Event &event) {
	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_TALK:
		scene->_field21A0 = 1;
		BF_GLOBALS._player.disableControl();
		scene->_sceneMode = 2706;

		if (scene->_field380 == 1) {
			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL);
		} else {
			scene->signal();
		}
		return true;
	case INV_CRATE1:
		scene->_field21A0 = 2;
		BF_GLOBALS._player.disableControl();
		scene->_sceneMode = 2706;

		if (scene->_field380 == 1) {
			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, NULL);
		} else {
			scene->signal();
		}
		return true;
	default:
		return NamedObject::startAction(action, event);
	}
}

bool Scene270::Grandma::startAction(CursorType action, Event &event) {
	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_TALK:
		switch (BF_GLOBALS._dayNumber) {
		case 1:
			// Day 1
			if (scene->_field380 == 1) {
				scene->_stripManager.start((scene->_grandma._position.x == 157) ? 2712 : 2723, &BF_GLOBALS._stripProxy);
			} else if (BF_GLOBALS._bookmark == bBookedFrankieEvidence) {
				BF_GLOBALS._player.disableControl();
				scene->_sceneMode = 2710;
				scene->setAction(&scene->_sequenceManager1, scene, 2710, &BF_GLOBALS._player, &scene->_grandma, NULL);
			} else if (BF_GLOBALS.getFlag(onDuty) || (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) == 2) ||
						(scene->_field386 != 0)) {
				scene->_stripManager.start(2723, &BF_GLOBALS._stripProxy);
			} else {
				BF_GLOBALS._player.disableControl();
				scene->_sceneMode = 2715;
				scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, &scene->_grandma, NULL);
			}
			return true;
		case 3:
			// Day 3
			if (scene->_field380 == 1) {
				scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy);
			} else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) {
				scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy);
			} else {
				BF_GLOBALS._player.disableControl();
				scene->_sceneMode = 2713;
				scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_grandma, NULL);
			}
			return true;
		default:
			break;
		}
		break;
	default:
		break;
	}

	return NamedObject::startAction(action, event);
}

/*--------------------------------------------------------------------------*/

bool Scene270::Item::startAction(CursorType action, Event &event) {
	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;

	if ((action == CURSOR_USE) && (scene->_field380 == 0)) {
		BF_GLOBALS._player.disableControl();
		scene->_object2.postInit();
		scene->_object2.hide();
		scene->_sceneMode = 2705;
		scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object2, NULL);
		return true;
	} else {
		return NamedHotspot::startAction(action, event);
	}
}

bool Scene270::Exit::startAction(CursorType action, Event &event) {
	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;

	if (!_action && !scene->_field384 && !scene->_field386) {
		if (scene->_field380 == 1) {
			scene->_tempPos = Common::Point(320, 140);
			BF_GLOBALS._player.disableControl();

			scene->_sceneMode = 2706;
			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL);
		} else {
			ADD_PLAYER_MOVER(320, 140);
		}
		return true;
	} else {
		return false;
	}
}

/*--------------------------------------------------------------------------*/

Scene270::Scene270(): SceneExt() {
	_field380 = _field382 =_field384 = _field386 = 0;
	_field219A = _tempPos.x = _tempPos.y = _field21A0 = 0;
	_sceneMode = 0;
}

void Scene270::synchronize(Serializer &s) {
	SceneExt::synchronize(s);
	s.syncAsSint16LE(_field380);
	s.syncAsSint16LE(_field382);
	s.syncAsSint16LE(_field384);
	s.syncAsSint16LE(_field386);
	s.syncAsSint16LE(_field219A);
	s.syncAsSint16LE(_tempPos.x);
	s.syncAsSint16LE(_tempPos.y);
	s.syncAsSint16LE(_field21A0);
}

void Scene270::postInit(SceneObjectList *OwnerList) {
	SceneExt::postInit();
	loadScene(270);
	setZoomPercents(120, 90, 130, 100);

	if (BF_GLOBALS._sceneManager._previousScene != 560)
		BF_GLOBALS._sound1.fadeSound(26);

	_exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL);

	if (BF_GLOBALS._dayNumber == 0) {
		BF_GLOBALS._dayNumber = 1;
		BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2);
		BF_INVENTORY.setObjectScene(INV_CRATE1, 1);
		BF_GLOBALS._sceneManager._previousScene = 710;
	}

	if (((BF_GLOBALS._bookmark >= bLauraToParamedics) && (BF_GLOBALS._dayNumber == 1) &&
				(BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2) &&
				(BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 1)) ||
			((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3))) {
		BF_GLOBALS._walkRegions.disableRegion(6);
		BF_GLOBALS._walkRegions.disableRegion(14);
		BF_GLOBALS._walkRegions.disableRegion(19);

		_grandma.postInit();
		_grandma.setVisage(274);
		_grandma.setPosition(Common::Point(157, 132));
		_grandma._numFrames = 5;
		_grandma.animate(ANIM_MODE_2, NULL);
		_grandma.fixPriority(129);
	}

	if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) {
		_grandma.postInit();
	}

	if (BF_GLOBALS._sceneManager._previousScene == 710) {
		_skip.postInit();
		_laura.postInit();
		_lyle.postInit();
		_grandma.postInit();
	}

	_stripManager.addSpeaker(&_grandmaSpeaker);
	_stripManager.addSpeaker(&_lyleSpeaker);
	_stripManager.addSpeaker(&_jakeSpeaker);
	_stripManager.addSpeaker(&_skipSpeaker);
	_stripManager.addSpeaker(&_lauraSpeaker);
	_stripManager.addSpeaker(&_gameTextSpeaker);

	_tv.postInit();
	_tv.setVisage(270);
	_tv.setPosition(Common::Point(264, 74));
	_tv.setStrip(5);
	_tv.fixPriority(132);
	_tv._numFrames = 3;
	_tv.setAction(&_action1);

	_fireplace.postInit();
	_fireplace.setVisage(270);
	_fireplace.setStrip(2);
	_fireplace.setPosition(Common::Point(302, 121));
	_fireplace.fixPriority(132);
	_fireplace.animate(ANIM_MODE_2, NULL);

	_fridge.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
	_object3.setDetails(270, 12, 13, 14, 1, (SceneItem *)NULL);
	_laura.setDetails(270, 15, -1, -1, 1, (SceneItem *)NULL);
	_skip.setDetails(270, 14, -1, -1, 1, (SceneItem *)NULL);
	_lyle.setDetails(270, 34, 35, 36, 1, (SceneItem *)NULL);
	_tv.setDetails(270, 3, 4, 5, 1, (SceneItem *)NULL);
	_fireplace.setDetails(270, 6, 7, 8, 1, (SceneItem *)NULL);

	if ((BF_GLOBALS._sceneManager._previousScene == 710) && (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard)) {
		_grandma.setDetails(270, 15, 16, 17, 1, (SceneItem *)NULL);
	} else {
		_grandma.setDetails(270, 40, 16, 17, 1, (SceneItem *)NULL);
	}

	_afgan.setDetails(4, 270, 27, 28, 29, 1);
	_couch.setDetails(1, 270, 18, 19, 20, 1);
	_photos.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL);
	_appliances.setDetails(3, 270, 24, 25, 26, 1);
	_ivy.setDetails(2, 270, 30, 31, 32, 1);
	_background.setDetails(Rect(0, 0, 320, 168), 270, 0, 1, 2, 1, NULL);

	BF_GLOBALS._player.postInit();
	BF_GLOBALS._player._moveDiff.x = 8;
	BF_GLOBALS._player.changeZoom(-1);
	BF_GLOBALS._player.disableControl();

	switch (BF_GLOBALS._sceneManager._previousScene) {
	case 560:
		if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) {
			_field219A = 1;
			BF_GLOBALS._player._moveDiff.x = 5;
			_field386 = 0;

			_grandma.animate(ANIM_MODE_1, NULL);
			setAction(&_sequenceManager1, NULL, 2720, &BF_GLOBALS._player, &_grandma, NULL);
			BF_GLOBALS._bookmark = bLyleStoppedBy;
		} else {
			_sceneMode = 2700;
			setAction(&_sequenceManager1, this, 2700, &BF_GLOBALS._player, NULL);
		}
		break;
	case 690:
		BF_GLOBALS._player.setPosition(Common::Point(-13, 162));
		_sceneMode = 2702;
		setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
		break;
	case 710:
		BF_GLOBALS._player._moveDiff.x = 6;
		_sceneMode = 2717;
		setAction(&_sequenceManager1, this, 2717, &BF_GLOBALS._player, &_laura, &_skip, &_lyle, &_grandma, NULL);
		break;
	default:
		_sceneMode = 2701;
		setAction(&_sequenceManager1, this, 2701, &BF_GLOBALS._player, NULL);
		break;
	}
}

void Scene270::signal() {
	switch (_sceneMode) {
	case 10:
		_sceneMode = 2702;
		setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
		break;
	case 11:
		BF_GLOBALS._player._strip = 8;
		BF_GLOBALS._player._frame = 1;

		if (_field382) {
			_sceneMode = 2719;
			_stripManager.start(2720, this);
		} else {
			_field382 = 1;
			_sceneMode = 13;
			_stripManager.start(2718, this);
		}
		break;
	case 12:
		BF_GLOBALS._player._strip = 8;
		BF_GLOBALS._player._frame = 1;
		_sceneMode = 13;
		_stripManager.start(2719, this);
		break;
	case 13:
	case 2713:
	case 2715:
		BF_GLOBALS._player.enableControl();
		break;
	case 2700:
		_field219A = 1;
		BF_GLOBALS._player._strip = 6;
		BF_GLOBALS._player.enableControl();
		break;
	case 2701:
		BF_GLOBALS._player._strip = 2;
		BF_GLOBALS._player.enableControl();
		_field219A = 1;
		break;
	case 2702:
		BF_GLOBALS._player._strip = 1;
		BF_GLOBALS._player.enableControl();
		_field219A = 1;
		break;
	case 2705:
		_field380 = 1;
		BF_GLOBALS._player.enableControl();
		break;
	case 2706:
		BF_GLOBALS._player.changeZoom(-1);
		_object2.remove();
		_field380 = 0;

		switch (_field21A0) {
		case 1:
			_sceneMode = 11;
			ADD_PLAYER_MOVER(192, 135);
			break;
		case 2:
			if (BF_GLOBALS.getFlag(shownLyleCrate1Day1)) {
				SceneItem::display2(270, 37);
				BF_GLOBALS._player.enableControl();
			} else {
				T2_GLOBALS._uiElements.addScore(30);
				BF_GLOBALS.setFlag(shownLyleCrate1Day1);
				_sceneMode = 12;
				ADD_PLAYER_MOVER(192, 135);
			}
			break;
		default:
			BF_GLOBALS._player.enableControl();
			ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y);
			break;
		}

		_field21A0 = 0;
		break;
	case 2710:
		BF_GLOBALS._bookmark = bEndOfWorkDayOne;
		BF_GLOBALS._player.enableControl();
		break;
	case 2711:
		BF_GLOBALS._player.setPosition(Common::Point(150, 300));
		BF_GLOBALS._sound1.fadeOut2(NULL);
		BF_GLOBALS._sceneManager.changeScene(180);
		BF_GLOBALS._bookmark = bLyleStoppedBy;
		break;
	case 2712:
		BF_GLOBALS._sound1.fadeOut2(NULL);
		BF_GLOBALS._sceneManager.changeScene(180);
		break;
	case 2714:
		BF_GLOBALS._sceneManager.changeScene(560);
		break;
	case 2717:
		_sceneMode = 2718;
		_lyle.setFrame2(-1);
		setAction(&_sequenceManager1, this, 2718, &BF_GLOBALS._player, &_laura, &_skip,
			&_lyle, &_grandma, NULL);
		break;
	case 2718:
		BF_GLOBALS._walkRegions.disableRegion(6);
		BF_GLOBALS._walkRegions.disableRegion(14);
		BF_GLOBALS._walkRegions.disableRegion(19);

		_field219A = 1;
		BF_GLOBALS._bookmark = bTalkedToGrannyAboutSkipsCard;

		_grandma.setStrip(8);
		_grandma._frame = 5;
		_field384 = 1;
		_field386 = 1;

		BF_GLOBALS._player._moveDiff.x = 8;
		BF_GLOBALS._player.enableControl();
		break;
	case 2719:
		_sceneMode = 13;
		_field384 = 0;
		BF_GLOBALS._player._moveDiff.x = 6;

		_lyle.setFrame2(-1);
		setAction(&_sequenceManager1, this, 2719, &BF_GLOBALS._player, &_lyle, &_grandma, NULL);
		break;
	default:
		break;
	}
}

void Scene270::process(Event &event) {
	if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
			(_field380 == 1) && !_action) {
		_tempPos = event.mousePos;
		BF_GLOBALS._player.disableControl();
		_sceneMode = 2706;
		setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object2, NULL);
		event.handled = true;
	}

	SceneExt::process(event);

	if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1)) &&
			!_field384 && !_field386) {
		// Check if the cursor is on an exit
		if (_exit.contains(event.mousePos)) {
			GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
			BF_GLOBALS._events.setCursor(surface);
		} else {
			// In case an exit cursor was being shown, restore the previously selected cursor
			CursorType cursorId = BF_GLOBALS._events.getCursor();
			BF_GLOBALS._events.setCursor(cursorId);
		}
	}
}

void Scene270::dispatch() {
	if (_field384) {
		_lyle.updateAngle(BF_GLOBALS._player._position);

		if (_lyle._angle < 110)
			_lyle.setFrame2(4);
		else if (_lyle._angle < 180)
			_lyle.setFrame2(3);
		else if (_lyle._angle < 250)
			_lyle.setFrame2(2);
		else
			_lyle.setFrame2(1);
	}

	if (_field386) {
		if (BF_GLOBALS._player._position.x > 290) {
			_grandma.setFrame(6);
		} else if (BF_GLOBALS._player._position.x > 274) {
			_grandma.setFrame(5);
		} else if (BF_GLOBALS._player._position.x > 258) {
			_grandma.setFrame(4);
		} else if (BF_GLOBALS._player._position.x > 242) {
			_grandma.setFrame(3);
		} else if (BF_GLOBALS._player._position.x > 226) {
			_grandma.setFrame(2);
		} else if (BF_GLOBALS._player._position.x > 210) {
			if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame > 1))
				_grandma.animate(ANIM_MODE_6, NULL);
		} else {
			if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame < 3))
				_grandma.animate(ANIM_MODE_4, 3, 1, NULL);
		}
	}

	if (!_action && _field219A) {
		if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 125)) {
			_field219A = 0;
			BF_GLOBALS._player.disableControl();
			if (!_field384) {
				BF_GLOBALS._sceneManager.changeScene(560);
			} else {
				BF_GLOBALS._player.addMover(NULL);
				SceneItem::display2(270, 38);
				_sceneMode = 2700;
				ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y + 15);
			}
		}

		if (BF_GLOBALS._player._position.x <= 20) {
			_field219A = 0;
			BF_GLOBALS._player.disableControl();
			BF_GLOBALS._player.addMover(NULL);
			BF_GLOBALS._player._strip = 3;
			BF_GLOBALS._player._frame = 1;

			if (BF_GLOBALS._sceneObjects->contains(&_grandma)) {
				_sceneMode = 10;
				_stripManager.start(2711, this);
			} else {
				SceneItem::display2(270, 33);
				_sceneMode = 2702;
				setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
			}
		}

		if (BF_GLOBALS._player._position.x > 310) {
			_field219A = 0;
			BF_GLOBALS._player.disableControl();
			if (!_field384 && !_field386) {
				_sceneMode = 2712;
				setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL);
			} else {
				BF_GLOBALS._player.addMover(NULL);
				BF_GLOBALS._player._strip = 2;
				BF_GLOBALS._player._frame = 1;
				SceneItem::display2(270, !_field384 ? 39 : 38);
				_sceneMode = 2701;

				ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y);
			}
		}
	}

	SceneExt::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 271 - Living Room & Kitchen #2
 *
 *--------------------------------------------------------------------------*/

void Scene271::Action1::signal() {
	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;

	setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
}

/*--------------------------------------------------------------------------*/

bool Scene271::Object12::startAction(CursorType action, Event &event) {
	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_TALK:
		if (BF_GLOBALS._dayNumber == 1) {
			if (!BF_GLOBALS.getFlag(onDuty) && (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2)) {
				scene->_sceneMode = 2715;
				scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, NULL);
				return true;
			}
		} else if (BF_GLOBALS._dayNumber == 3) {
			if (scene->_field796 == 1) {
				scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy);
				return true;
			} else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) {
				scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy);
				return true;
			} else {
				BF_GLOBALS._player.disableControl();
				scene->_sceneMode = 2713;
				scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_object12, NULL);
				BF_GLOBALS.setFlag(fGotGreen355fTalkedToGrannyDay3);
				return true;
			}
		}
		break;
	default:
		break;
	}

	return NamedObject::startAction(action, event);
}

/*--------------------------------------------------------------------------*/

bool Scene271::Item::startAction(CursorType action, Event &event) {
	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;

	if ((action == CURSOR_USE) && !scene->_field796) {
		BF_GLOBALS._player.disableControl();
		scene->_object1.postInit();
		scene->_object1.hide();

		scene->_sceneMode = 2705;
		scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object1, NULL);
		return true;
	} else {
		return NamedHotspot::startAction(action, event);
	}
}

bool Scene271::Exit::startAction(CursorType action, Event &event) {
	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;

	if (!scene->_action) {
		if (scene->_field796 == 1) {
			scene->_tempPos = Common::Point(320, 140);
			BF_GLOBALS._player.disableControl();
			scene->_sceneMode = 2706;
			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object1, NULL);
		} else {
			ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 320, 140);
		}
	}

	return true;
}

/*--------------------------------------------------------------------------*/

Scene271::Scene271() {
	_field796 = _field2E16 = 0;
	_tempPos.x = _tempPos.y = 0;
	_rect1 = Rect(236, 120, 266, 130);
}

void Scene271::synchronize(Serializer &s) {
	PalettedScene::synchronize(s);

	s.syncAsSint16LE(_field796);
	s.syncAsSint16LE(_field2E16);
	s.syncAsSint16LE(_tempPos.x);
	s.syncAsSint16LE(_tempPos.y);
	_rect1.synchronize(s);
}

void Scene271::postInit(SceneObjectList *OwnerList) {
	PalettedScene::postInit();
	loadScene(270);
	setZoomPercents(120, 80, 140, 100);
	BF_GLOBALS._sound1.fadeSound(26);

	_stripManager.addSpeaker(&_grandmaSpeaker);
	_stripManager.addSpeaker(&_lyleSpeaker);
	_stripManager.addSpeaker(&_jakeSpeaker);
	_stripManager.addSpeaker(&_skipSpeaker);
	_stripManager.addSpeaker(&_lauraSpeaker);
	_stripManager.addSpeaker(&_gameTextSpeaker);
	_stripManager.addSpeaker(&_granTextSpeaker);
	_stripManager.addSpeaker(&_lyleTextSpeaker);

	_exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL);

	_tv.postInit();
	_tv.setVisage(270);
	_tv.setPosition(Common::Point(264, 74));
	_tv.setStrip(5);
	_tv.fixPriority(132);
	_tv._numFrames = 3;
	_tv.setAction(&_action1);

	if ((BF_GLOBALS._sceneManager._previousScene != 280) && (BF_GLOBALS._sceneManager._previousScene != 620)) {
		_object10.postInit();
		_object10.setVisage(270);
		_object10.setStrip(2);
		_object10.setPosition(Common::Point(302, 121));
		_object10.fixPriority(132);
		_object10.animate(ANIM_MODE_2, NULL);
	}

	_object5.postInit();
	_object5.hide();

	_item5.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
	_object6.setDetails(270, 12, 13, 14, 1, (SceneItem *)NULL);
	_object7.setDetails(270, 15, -1, -1, 1, (SceneItem *)NULL);
	_object8.setDetails(270, 14, -1, -1, 1, (SceneItem *)NULL);
	_object11.setDetails(270, -1, -1, -1, 1, (SceneItem *)NULL);
	_tv.setDetails(270, 3, 4, 5, 1, (SceneItem *)NULL);
	_object10.setDetails(270, 6, 7, 8, 1, (SceneItem *)NULL);
	_object12.setDetails(270, 15, 16, 17, 1, (SceneItem *)NULL);
	_item3.setDetails(4, 270, 27, 28, 29, 1);
	_item1.setDetails(1, 270, 18, 19, 20, 1);
	_item6.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL);
	_item2.setDetails(3, 270, 24, 25, 26, 1);
	_item4.setDetails(2, 270, 30, 31, 32, 1);
	_item11.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 270, 0, 1, 2, 1, NULL);

	BF_GLOBALS._player.postInit();
	BF_GLOBALS._player._moveDiff.x = 8;
	BF_GLOBALS._player.changeZoom(-1);
	BF_GLOBALS._player.disableControl();

	_field796 = 0;
	_sceneMode = 0;
	_field2E16 = 0;

	if (BF_GLOBALS._dayNumber == 0) {
		BF_GLOBALS._dayNumber = 1;
		BF_GLOBALS._sceneManager.changeScene(180);
	}

	switch (BF_GLOBALS._sceneManager._previousScene) {
	case 180:
		BF_GLOBALS._walkRegions.disableRegion(6);
		BF_GLOBALS._walkRegions.disableRegion(14);
		BF_GLOBALS._walkRegions.disableRegion(19);

		BF_GLOBALS._player.setVisage(275);
		BF_GLOBALS._player.setPosition(Common::Point(348, 151));

		_object12.postInit();
		_object12.setVisage(274);
		_object12.setPosition(Common::Point(157, 132));
		_object12._numFrames = 5;
		_object12.animate(ANIM_MODE_2, NULL);
		break;
	case 280:
		BF_GLOBALS._player.setVisage(271);
		BF_GLOBALS._player.setStrip(5);
		BF_GLOBALS._player._frame = 6;
		BF_GLOBALS._player.setPosition(Common::Point(228, 138));

		_object1.postInit();
		_object1.setPosition(Common::Point(340, 100));

		_object11.postInit();
		_object11.setVisage(272);
		_object11.setStrip(1);
		_object11._frame = 2;
		_object11.setPosition(Common::Point(35, 136));

		_object6.postInit();
		_object6.hide();

		BF_GLOBALS._walkRegions.disableRegion(6);
		BF_GLOBALS._walkRegions.disableRegion(14);
		BF_GLOBALS._walkRegions.disableRegion(19);

		_object12.postInit();
		_object12.setVisage(274);
		_object12.setPosition(Common::Point(157, 132));
		_object12.animate(ANIM_MODE_2, NULL);
		_object12._numFrames = 5;
		_object12.fixPriority(120);
		_field796 = 1;
		break;
	case 590:
		BF_GLOBALS._player.setVisage(275);
		BF_GLOBALS._player.setStrip(5);
		BF_GLOBALS._player.setPosition(Common::Point(58, 133));
		BF_GLOBALS._player.changeZoom(-1);

		_object8.postInit();
		_object8.setVisage(279);
		_object8.setPosition(Common::Point(87, 127));
		_object8.fixPriority(146);

		_object7.postInit();
		_object7.setVisage(277);
		_object7.setStrip(7);
		_object7.setPosition(Common::Point(48, 149));

		BF_GLOBALS._walkRegions.disableRegion(6);
		BF_GLOBALS._walkRegions.disableRegion(14);
		BF_GLOBALS._walkRegions.disableRegion(19);

		_object12.postInit();
		_object12.setVisage(276);
		_object12.setPosition(Common::Point(129, 130));

		_object2.postInit();
		_object2.setVisage(270);
		_object2.setStrip(3);
		_object2.setFrame(2);
		_object2.setPosition(Common::Point(62, 101));
		_object2.fixPriority(145);

		_object3.postInit();
		_object3.setVisage(270);
		_object3.setStrip(3);
		_object3.setFrame(3);
		_object3.setPosition(Common::Point(90, 104));
		_object3.fixPriority(132);

		_object4.postInit();
		_object4.setVisage(270);
		_object4.setStrip(3);
		_object4.setFrame(4);
		_object4.setPosition(Common::Point(132, 87));
		_object4.fixPriority(1);
		break;
	default:
		BF_GLOBALS._player.setVisage(271);
		BF_GLOBALS._player.setFrame(1);
		BF_GLOBALS._player.setPosition(Common::Point(239, 145));

		BF_GLOBALS._walkRegions.disableRegion(6);
		BF_GLOBALS._walkRegions.disableRegion(14);
		BF_GLOBALS._walkRegions.disableRegion(19);

		_object12.postInit();
		_object12.setVisage(274);
		_object12.setPosition(Common::Point(157, 132));
		_object12.animate(ANIM_MODE_2, NULL);
		_object12._numFrames = 5;

		_object1.postInit();
		_object1.setVisage(271);
		_object1.setStrip(4);
		_object1.setPosition(Common::Point(220, 117));
		_object1.fixPriority(145);
		break;
	}

	_sceneMode = 11;

	static uint32 black = 0;
	add2Faders((const byte *)&black, 2, 270, this);
}

void Scene271::signal() {
	static uint32 black = 0;

	switch (_sceneMode) {
	case 10:
		_sceneMode = 2702;
		setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
		break;
	case 11:
		switch (BF_GLOBALS._sceneManager._previousScene) {
		case 180:
			_sceneMode = 2716;
			setAction(&_sequenceManager1, this, 2716, &BF_GLOBALS._player, &_object12, NULL);
			break;
		case 280:
			BF_GLOBALS._dayNumber = 3;
			BF_INVENTORY.alterInventory(3);

			_sceneMode = 2707;
			setAction(&_sequenceManager1, this, 2707, &BF_GLOBALS._player, &_object1, &_object11, &_object5, &_object6, NULL);
			break;
		case 590:
			_sceneMode = 2704;
			setAction(&_sequenceManager1, this, 2704, &BF_GLOBALS._player, &_object12, &_object7, &_object8, NULL);
			break;
		default:
			_object11.postInit();
			_object11.setPosition(Common::Point(340, 100));
			BF_GLOBALS._sound1.play(36);

			_sceneMode = 2709;
			setAction(&_sequenceManager1, this, 2709, &BF_GLOBALS._player, &_object1, &_object12, &_object11, NULL);
			break;
		}
		break;
	case 12:
		BF_GLOBALS._sound1.changeSound(67);
		BF_GLOBALS._sceneManager.changeScene(280);
		break;
	case 13:
		BF_GLOBALS._sound1.fadeOut2(NULL);
		BF_GLOBALS._sceneManager.changeScene(666);
		break;
	case 2702:
		BF_GLOBALS._player._strip = 1;
		BF_GLOBALS._player.enableControl();
		_field2E16 = 1;
		break;
	case 2704:
		BF_GLOBALS._sound1.fadeOut2(NULL);
		BF_GLOBALS._sceneManager.changeScene(690);
		break;
	case 2705:
		_field796 = 1;
		BF_GLOBALS._player.enableControl();
		break;
	case 2706:
		BF_GLOBALS._player.changeZoom(-1);
		BF_GLOBALS._player.enableControl();

		_object1.remove();
		_field796 = 0;
		ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y);
		break;
	case 2707:
		BF_GLOBALS._player.enableControl();
		_field796 = 1;
		_field2E16 = 1;

		_object1.remove();
		_object11.remove();

		BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 1);
		break;
	case 2709:
		BF_GLOBALS._sound1.play(68);
		_sceneMode = 12;
		addFader((const byte *)&black, 2, this);
		break;
	case 2712:
		BF_GLOBALS._sound1.fadeOut2(NULL);
		BF_GLOBALS._sceneManager.changeScene(180);
		break;
	case 2713:
		BF_GLOBALS._player.enableControl();
		break;
	case 2714:
		BF_GLOBALS._sceneManager.changeScene(560);
		break;
	case 2715:
		break;
	case 2716:
		BF_GLOBALS._deathReason = 24;
		_sceneMode = 13;
		addFader((const byte *)&black, 2, this);
		break;
	default:
		break;
	}
}

void Scene271::process(Event &event) {
	if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
			(_field796 == 1)  && (!_action)) {
		_tempPos = event.mousePos;
		BF_GLOBALS._player.disableControl();

		_sceneMode = 2706;
		setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object1, NULL);
		event.handled = true;
	}

	SceneExt::process(event);

	if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < UI_INTERFACE_Y)) {
		if (_exit.contains(event.mousePos)) {
			GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_E);
			BF_GLOBALS._events.setCursor(cursor);
		} else {
			CursorType cursorId = BF_GLOBALS._events.getCursor();
			BF_GLOBALS._events.setCursor(cursorId);
		}
	}
}

void Scene271::dispatch() {
	if (!_action && (_field2E16 == 1)) {
		if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 120)) {
			_field2E16 = 0;
			BF_GLOBALS._sceneManager.changeScene(560);
		}

		if (BF_GLOBALS._player._position.x <= 20) {
			_field2E16 = 0;
			BF_GLOBALS._player.disableControl();
			BF_GLOBALS._player._mover->remove();
			BF_GLOBALS._player._strip = 3;
			BF_GLOBALS._player._frame = 1;

			if (BF_GLOBALS._sceneObjects->contains(&_object12)) {
				_sceneMode = 10;
				_stripManager.start(2711, this);
			} else {
				SceneItem::display2(270, 33);
				_sceneMode = 2702;
				setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
			}
		}

		if (BF_GLOBALS._player._position.x >= 300) {
			_field2E16 = 0;
			BF_GLOBALS._player.disableControl();
			_sceneMode = 2712;
			setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL);
		}
	}

	SceneExt::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 280 - Bedroom Flashback cut-scene
 *
 *--------------------------------------------------------------------------*/

void Scene280::Action1::signal() {
	Scene280 *scene = (Scene280 *)BF_GLOBALS._sceneManager._scene;
	static uint32 black = 0;

	switch (_actionIndex++) {
	case 0:
		scene->_jake.postInit();
		scene->_jake.setVisage(283);
		scene->_jake.setPosition(Common::Point(331, 200));
		scene->_jake.animate(ANIM_MODE_1, NULL);
		scene->_jake.setStrip(1);
		ADD_MOVER(scene->_jake, 189, 131);
		break;
	case 1:
		scene->_jake.setStrip(2);
		scene->_jake.setFrame(1);
		scene->_jake.animate(ANIM_MODE_8, 0, NULL);
		scene->_jake._numFrames = 5;

		scene->_stripManager.start(2800, this);
		break;
	case 2:
		scene->_jake.animate(ANIM_MODE_5, NULL);
		scene->_dad.animate(ANIM_MODE_5, this);
		break;
	case 3:
		scene->_jake.setStrip(4);
		scene->_jake.setFrame(1);
		scene->_dad.setStrip(2);
		scene->_jake.setFrame(1);
		scene->_dad.animate(ANIM_MODE_5, this);
		break;
	case 4:
		scene->_dad.setStrip(3);
		scene->_dad.setFrame(1);
		scene->_dad.animate(ANIM_MODE_5, this);
		break;
	case 5:
		scene->_object4.hide();
		scene->_dad.setVisage(282);
		scene->_dad.setStrip(1);
		scene->_dad.setFrame(1);
		scene->_dad._numFrames = 5;
		scene->_dad.animate(ANIM_MODE_5, this);
		break;
	case 6:
		scene->_stripManager.start(2801, this);
		break;
	case 7:
		scene->_mum.postInit();
		scene->_mum.setVisage(282);
		scene->_mum.setStrip(2);
		scene->_mum.setFrame(1);
		scene->_mum.fixPriority(1);
		scene->_mum.setPosition(Common::Point(160, 138));

		scene->_jake.setStrip(3);
		scene->_jake.setFrame(1);
		scene->_jake.animate(ANIM_MODE_5, this);

		scene->_dad._numFrames = 10;
		scene->_dad.setVisage(284);
		scene->_dad.setStrip(1);
		scene->_dad.fixPriority(-1);
		scene->_dad.setPosition(Common::Point(174, 136));
		scene->_dad.setFrame(1);
		scene->_dad.animate(ANIM_MODE_1, NULL);
		ADD_MOVER(scene->_dad, 438, 320);
		break;
	case 8:
		scene->_mum.animate(ANIM_MODE_4, 5, 1, this);
		break;
	case 9:
		scene->_sceneMode = 2;
		BF_GLOBALS._sound1.fadeOut2(NULL);
		scene->addFader((const byte *)&black, 2, scene);

		scene->_jake.remove();
		scene->_mum.animate(ANIM_MODE_5, NULL);
		break;
	}
}

/*--------------------------------------------------------------------------*/

void Scene280::postInit(SceneObjectList *OwnerList) {
	PalettedScene::postInit();
	BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
	loadScene(280);

	_stripManager.addSpeaker(&_gameTextSpeaker);

	_dad.postInit();
	_dad.setVisage(281);
	_dad.setPosition(Common::Point(160, 138));
	_dad.fixPriority(1);

	_object4.postInit();
	_object4.setVisage(280);
	_object4.setPosition(Common::Point(139, 141));

	const uint32 black = 0;
	add2Faders((const byte *)&black, 2, 280, this);
	_sceneMode = 1;
	setAction(&_action1);
}

void Scene280::signal() {
	if (_sceneMode == 2)
		BF_GLOBALS._sceneManager.changeScene(271);
}

} // End of namespace BlueForce

} // End of namespace TsAGE
