/* 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_scenes7.h"
#include "tsage/globals.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"

namespace TsAGE {

namespace BlueForce {

/*--------------------------------------------------------------------------
 * Scene 710 - Beach
 *
 *--------------------------------------------------------------------------*/

void Scene710::Timer1::signal() {
	PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(136, 138, -1);
	rotation->setDelay(20);
	rotation = BF_GLOBALS._scenePalette.addRotation(146, 148, -1);
	rotation->setDelay(30);
	rotation = BF_GLOBALS._scenePalette.addRotation(187, 191, -1);
	rotation->setDelay(35);
	rotation = BF_GLOBALS._scenePalette.addRotation(245, 246, -1);
	rotation->setDelay(20);
	remove();
}

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

	switch (_actionIndex++) {
	case 0:
		BF_GLOBALS._player.disableControl();
		_state = 7104;
		if (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)
			_state = 7105;
		setDelay(3);
		break;
	case 1: {
		ADD_MOVER(BF_GLOBALS._player, scene->_laura._position.x + 8, scene->_laura._position.y + 8);
		break;
		}
	case 2:
		BF_GLOBALS._player._strip = 2;
		scene->_stripManager.start(_state, this);
		break;
	case 3:
		if (_state != 7105)
			BF_GLOBALS._player.enableControl();
		else {
			BF_GLOBALS._player.disableControl();
			scene->_sceneMode = 7106;
			scene->setAction(&scene->_sequenceManager1, scene, 7106, &BF_GLOBALS._player, &scene->_laura, &scene->_kid, &scene->_dog, NULL);
		}
		if (_state < 7104) {
			_state++;
			if ((_state == 7104) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1))
					_state = 7105;
		}
		remove();
		break;
	default:
		break;
	}
}

// Laura
bool Scene710::Object3::startAction(CursorType action, Event &event) {
	Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;

	if (action == CURSOR_TALK) {
		BF_GLOBALS._player.setAction(&scene->_action1);
		return true;
	} else
		return NamedObject::startAction(action, event);
}

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

	if ((action == CURSOR_LOOK) && (scene->_kid._position.x < 0)) {
		SceneItem::display2(710, 13);
		return true;
	} else
		return NamedObject::startAction(action, event);
}

//Stick
bool Scene710::Object5::startAction(CursorType action, Event &event) {
	Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_LOOK:
		if (scene->_stickThrowCount <= 2)
			return NamedObject::startAction(action, event);
		else {
			SceneItem::display2(710, 3);
			scene->_watchCrate = true;
			return true;
		}
	case CURSOR_USE:
		if ((scene->_kid._position.x < 0) && (scene->_dogLying)) {
			scene->_stickThrowCount++;
			if (!scene->_watchCrate) {
				BF_GLOBALS._player.disableControl();
				scene->_dogLying = false;
				scene->_sceneMode = 7105;
				scene->setAction(&scene->_sequenceManager1, scene, 7105, &BF_GLOBALS._player, &scene->_stick, &scene->_dog, NULL);
			} else {
				BF_GLOBALS._player.disableControl();
				scene->_sceneMode = 7101;
				scene->setAction(&scene->_sequenceManager1, scene, 7101, &BF_GLOBALS._player, &scene->_dog, &scene->_stick, NULL);
			}
			return true;
		}
		// No break on purpose
	default:
		return NamedObject::startAction(action, event);
	}
}

void Scene710::postInit(SceneObjectList *OwnerList) {
	SceneExt::postInit();
	loadScene(710);
	_sceneBounds.moveTo(320, 0);

	BF_GLOBALS._sound1.fadeSound(14);
	_soundExt1.fadeSound(48);

	BF_GLOBALS._player.postInit();
	BF_GLOBALS._player.hide();
	BF_GLOBALS._player._moveDiff = Common::Point(4, 2);
	BF_GLOBALS._player.disableControl();
	if (BF_GLOBALS._dayNumber == 0)
		BF_GLOBALS._dayNumber = 1;
	_stripManager.addSpeaker(&_jakeSpeaker);
	_stripManager.addSpeaker(&_skipSpeaker);
	_stripManager.addSpeaker(&_lauraSpeaker);
	_stripManager.addSpeaker(&_gameTextSpeaker);

	_kid.postInit();
	_kid._moveDiff = Common::Point(4, 2);
	_laura.postInit();
	_laura._moveDiff = Common::Point(4, 2);
	_dog.postInit();
	_dog._moveDiff = Common::Point(4, 2);
	_stick.postInit();
	_stick.setVisage(710);
	_stick.setStrip(2);
	_stick.animate(ANIM_MODE_2, NULL);
	_stick.setPosition(Common::Point(650, 160));
	_stick._moveDiff.x = 16;
	_stick.setDetails(710, 4, -1, -1, 1, (SceneItem *)NULL);
	_laura.setDetails(710, 2, -1, -1, 1, (SceneItem *)NULL);
	_kid.setDetails(710, 6, -1, -1, 1, (SceneItem *)NULL);
	_dog.setDetails(710, 0, -1, -1, 1, (SceneItem *)NULL);

	_item1.setDetails(Rect(555, 68, 583, 101), 710, 7,  23, -1, 1, NULL);
	_item2.setDetails(Rect(583, 46, 611,  78), 710, 7,  23, -1, 1, NULL);
	_item3.setDetails(Rect(611, 24, 639,  56), 710, 7,  23, -1, 1, NULL);
	_item6.setDetails(1, 710, 9,  1,  -1, 1);
	_item4.setDetails(2, 710, 8,  14, -1, 1);
	_item5.setDetails(3, 710, 10, 16, -1, 1);
	_item8.setDetails(Rect(222, 18, 249,  42), 710, 12, 18, -1, 1, NULL);
	_item7.setDetails(Rect(0,    0, 640,  52), 710, 11, 17, -1, 1, NULL);
	_item9.setDetails(Rect(0,    0, 640, 128), 710,  5, 15, -1, 1, NULL);

	_stickThrowCount = 0;
	_dogLying = _watchCrate = _throwStick = false;
	_action1._state = 7100;
	_timer1.set(2, NULL);
	_sceneMode = 7100;
	setAction(&_sequenceManager1, this, 7100, &BF_GLOBALS._player, &_laura, &_kid, &_dog, NULL);
}

void Scene710::signal() {
	switch (_sceneMode) {
	case 0:
		BF_GLOBALS._player.enableControl();
		break;
	case 7100:
		BF_GLOBALS._player.enableControl();
		_sceneMode = 7102;
		setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
		break;
	case 7101:
		// Pick up crate part
		BF_GLOBALS._player.enableControl();
		BF_INVENTORY.setObjectScene(INV_CRATE1, 1);
		_stick.remove();
		BF_GLOBALS._walkRegions.enableRegion(2);
		break;
	case 7102:
		_stick.setPosition(Common::Point(100, 122));
		_stick.animate(ANIM_MODE_NONE, NULL);
		_stick._strip = 2;
		if (_stickThrowCount <= 2)
			_stick._frame = 2;
		else {
			if (_stickThrowCount == 3) {
				BF_GLOBALS._player.disableControl();
				_sceneMode = 0;
				_stripManager.start(7108, this);
			}
			_stick._frame = 1;
		}
		_dogLying = true;
		BF_GLOBALS._walkRegions.disableRegion(2);
		if ((_throwStick) && (_sceneMode != 0))
			BF_GLOBALS._player.enableControl();
		break;
	case 7103:
		if (BF_GLOBALS._player._position.x > 179) {
			_sceneMode = 7102;
			setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
		} else {
			_sceneMode = 7104;
			setAction(&_sequenceManager3, this, 7104, &_kid, NULL);
		}
		break;
	case 7105:
		_throwStick = true;
		// No break on purpose
	case 7104:
		_sceneMode = 7102;
		setAction(&_sequenceManager1, this, 7102, &_dog, NULL);
		BF_GLOBALS._walkRegions.enableRegion(2);
		break;
	case 7106:
		BF_GLOBALS._sound1.fadeOut2(NULL);
		BF_GLOBALS._sceneManager.changeScene(270);
		break;
	default:
		break;
	}
}

void Scene710::dispatch() {
	if ((_kid._position.x > 0) && (_dogLying) && (_sceneMode != 7106)) {
		_dogLying = false;
		_sceneMode = 7103;
		setAction(&_sequenceManager1, this, 7103, &_kid, &_stick, &_dog, NULL);
	}
	SceneExt::dispatch();
}

void Scene710::synchronize(Serializer &s) {
	SceneExt::synchronize(s);
	s.syncAsSint16LE(_dogLying);
	s.syncAsSint16LE(_stickThrowCount);
	s.syncAsSint16LE(_watchCrate);
	s.syncAsSint16LE(_throwStick);
}


} // End of namespace BlueForce
} // End of namespace TsAGE