/* 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 3 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, see <http://www.gnu.org/licenses/>.
 *
 */

#include "tsage/ringworld2/ringworld2_vampire.h"

namespace TsAGE {

namespace Ringworld2 {

/*--------------------------------------------------------------------------
 * Scene 1950 - Flup Tube Corridor Maze
 *
 *--------------------------------------------------------------------------*/

Scene1950::KeypadWindow::KeypadWindow() {
	_buttonIndex = 0;
}

void Scene1950::KeypadWindow::synchronize(Serializer &s) {
	SceneArea::synchronize(s);

	s.syncAsSint16LE(_buttonIndex);
}

Scene1950::KeypadWindow::KeypadButton::KeypadButton() {
	_buttonIndex = 0;
	_pressed = false;
	_toggled = false;
}

void Scene1950::KeypadWindow::KeypadButton::synchronize(Serializer &s) {
	SceneActor::synchronize(s);

	s.syncAsSint16LE(_buttonIndex);
	s.syncAsSint16LE(_pressed);
	s.syncAsSint16LE(_toggled);
}

void Scene1950::KeypadWindow::KeypadButton::init(int indx) {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_buttonIndex = indx;
	_pressed = false;
	_toggled = false;

	postInit();
	setup(1971, 2, 1);
	fixPriority(249);
	setPosition(Common::Point(((_buttonIndex % 4) * 22) + 127, ((_buttonIndex / 4) * 19) + 71));
	scene->_sceneAreas.push_front(this);
}

void Scene1950::KeypadWindow::KeypadButton::process(Event &event) {
	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE)
			&& (_bounds.contains(event.mousePos)) && !_pressed) {
		R2_GLOBALS._sound2.play(227);
		if (!_toggled) {
			setFrame(2);
			_toggled = true;
		} else {
			setFrame(1);
			_toggled = false;
		}
		_pressed = true;
		event.handled = true;
	}

	if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
		_pressed = false;
		event.handled = true;
		Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
		scene->doButtonPress(_buttonIndex);
	}
}

bool Scene1950::KeypadWindow::KeypadButton::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE)
		return false;
	return SceneActor::startAction(action, event);
}

void Scene1950::KeypadWindow::remove() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
	for (_buttonIndex = 0; _buttonIndex < 16; ++_buttonIndex) {
		scene->_sceneAreas.remove(&_buttons[_buttonIndex]);
		_buttons[_buttonIndex].remove();
	}

	ModalWindow::remove();

	if (!R2_GLOBALS.getFlag(37))
		R2_GLOBALS._sound2.play(278);

	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	scene->_eastExit._enabled = true;

	if (!R2_GLOBALS.getFlag(37)) {
		if (R2_GLOBALS.getFlag(36)) {
			scene->_sceneMode = 1964;
			scene->setAction(&scene->_sequenceManager, scene, 1964, &R2_GLOBALS._player, NULL);
		} else {
			scene->_sceneMode = 1965;
			scene->setAction(&scene->_sequenceManager, scene, 1965, &R2_GLOBALS._player, NULL);
		}
	}
}

void Scene1950::KeypadWindow::setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY) {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	if (R2_GLOBALS._player._mover)
		R2_GLOBALS._player.addMover(NULL);
	R2_GLOBALS._player._canWalk = false;

	ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);

	_object1.fixPriority(248);
	scene->_eastExit._enabled = false;
	setup3(1950, 27, 28, 27);

	for (_buttonIndex = 0; _buttonIndex < 16; _buttonIndex++)
		_buttons[_buttonIndex].init(_buttonIndex);
}

void Scene1950::KeypadWindow::setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum) {
	// Copy of Scene1200::LaserPanel::proc13()
	_areaActor.setDetails(resNum, lookLineNum, talkLineNum, useLineNum, 2, (SceneItem *) NULL);
}

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

bool Scene1950::Keypad::startAction(CursorType action, Event &event) {
	if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(37)))
		return SceneHotspot::startAction(action, event);

	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	R2_GLOBALS._player.disableControl();
	if (R2_GLOBALS.getFlag(36)) {
		scene->_sceneMode = 1962;
		scene->setAction(&scene->_sequenceManager, scene, 1962, &R2_GLOBALS._player, NULL);
	} else {
		scene->_sceneMode = 1963;
		scene->setAction(&scene->_sequenceManager, scene, 1963, &R2_GLOBALS._player, NULL);
	}
	return true;
}

bool Scene1950::Door::startAction(CursorType action, Event &event) {
	if (action != R2_SCRITH_KEY)
		return SceneActor::startAction(action, event);

	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	R2_GLOBALS._player.disableControl();
	R2_INVENTORY.setObjectScene(R2_SCRITH_KEY, 0);
	scene->_sceneMode = 1958;
	scene->setAction(&scene->_sequenceManager, scene, 1958, &R2_GLOBALS._player, &scene->_door, NULL);
	return true;
}

bool Scene1950::Scrolls::startAction(CursorType action, Event &event) {
	if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) != 1950))
		return SceneActor::startAction(action, event);

	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 1968;
	scene->setAction(&scene->_sequenceManager, scene, 1968, &R2_GLOBALS._player, NULL);

	return true;
}

bool Scene1950::Gem::startAction(CursorType action, Event &event) {
	if ((action != CURSOR_USE) || (!R2_GLOBALS.getFlag(37)))
		return SceneActor::startAction(action, event);

	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 1967;
	scene->setAction(&scene->_sequenceManager, scene, 1967, &R2_GLOBALS._player, NULL);

	return true;
}

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

Scene1950::Vampire::Vampire() {
	_deadPosition = Common::Point(0, 0);
	_deltaX = 0;
	_deltaY = 0;
	_vampireMode = 0;
}

void Scene1950::Vampire::synchronize(Serializer &s) {
	SceneActor::synchronize(s);

	s.syncAsSint16LE(_deadPosition.x);
	s.syncAsSint16LE(_deadPosition.y);
	s.syncAsSint16LE(_deltaX);
	s.syncAsSint16LE(_deltaY);
	s.syncAsSint16LE(_vampireMode);
}

void Scene1950::Vampire::signal() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	switch (_vampireMode) {
	case 19: {
		_vampireMode = 0;
		setVisage(1960);
		if (R2_GLOBALS._flubMazeEntryDirection == 3)
			setStrip(2);
		else
			setStrip(1);

		NpcMover *mover = new NpcMover();
		addMover(mover, &scene->_vampireDestPos, scene);
		}
		break;
	case 20: {
		// Non fatal shot
		_vampireMode = 19;
		R2_GLOBALS._player.setVisage(22);
		if (R2_GLOBALS._flubMazeEntryDirection == 3)
			R2_GLOBALS._player.setStrip(1);
		else
			R2_GLOBALS._player.setStrip(2);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--;

		if (R2_GLOBALS._flubMazeEntryDirection == 3)
			_deadPosition.x = _position.x + 10;
		else
			_deadPosition.x = _position.x - 10;
		_deadPosition.y = _position.y - 4;

		setVisage(1961);

		if (R2_GLOBALS._flubMazeEntryDirection == 3)
			setStrip(2);
		else
			setStrip(1);

		animate(ANIM_MODE_2, NULL);
		Common::Point pt = _deadPosition;
		PlayerMover *mover = new PlayerMover();
		addMover(mover, &pt, this);

		R2_GLOBALS._player.enableControl();
		}
		break;
	case 21: {
		// Fatal shot
		R2_GLOBALS._player.setVisage(22);
		if (R2_GLOBALS._flubMazeEntryDirection == 3)
			R2_GLOBALS._player.setStrip(1);
		else
			R2_GLOBALS._player.setStrip(2);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);

		setVisage(1961);
		if (R2_GLOBALS._flubMazeEntryDirection == 3)
			setStrip(4);
		else
			setStrip(3);
		setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL);
		addMover(NULL);
		_numFrames = 8;
		R2_GLOBALS._sound2.play(226);
		animate(ANIM_MODE_5, NULL);
		fixPriority(10);

		R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive = false;
		R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired--;
		R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._position = _position;
		_deltaX = (_position.x - R2_GLOBALS._player._position.x) / 2;
		_deltaY = (_position.y - R2_GLOBALS._player._position.y) / 2;

		byte vampireCount = 0;
		for (byte i = 0; i < 18; ++i) {
			if (!R2_GLOBALS._vampireData[i]._isAlive)
				++vampireCount;
		}

		if (vampireCount == 18) {
			R2_GLOBALS.setFlag(36);
			_vampireMode = 23;
			Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, this);
		} else if (vampireCount == 1) {
			_vampireMode = 22;
			Common::Point pt(R2_GLOBALS._player._position.x + _deltaX, R2_GLOBALS._player._position.y + _deltaY);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, this);
		} else {
			R2_GLOBALS._player.enableControl(CURSOR_WALK);
		}

		if (R2_GLOBALS._flubMazeEntryDirection == 3)
			scene->_eastExit._enabled = true;
		else
			scene->_westExit._enabled = true;

		scene->_vampireActive = false;
		}
		break;
	case 22:
		SceneItem::display(1950, 18, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
		R2_GLOBALS._player.enableControl(CURSOR_WALK);
		break;
	case 23:
		SceneItem::display(1950, 25, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
		scene->_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
		scene->setAction(&scene->_sequenceManager, scene, 1960, &R2_GLOBALS._player, NULL);
		break;
	default:
		break;
	}
}

bool Scene1950::Vampire::startAction(CursorType action, Event &event) {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	if (!R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._isAlive ||
			(action != R2_PHOTON_STUNNER))
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl();

	if (R2_GLOBALS._vampireData[scene->_vampireIndex - 1]._shotsRequired <= 1)
		_vampireMode = 21;
	else
		_vampireMode = 20;

	R2_GLOBALS._player.setVisage(25);
	if (R2_GLOBALS._flubMazeEntryDirection == 3)
		R2_GLOBALS._player.setStrip(2);
	else
		R2_GLOBALS._player.setStrip(1);
	R2_GLOBALS._player.animate(ANIM_MODE_5, this);
	R2_GLOBALS._sound3.play(99);

	return true;
}

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

void Scene1950::NorthExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 1;
	scene->_sceneMode = 11;

	Common::Point pt(160, 127);
	PlayerMover *mover = new PlayerMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene1950::UpExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 2;
	scene->_sceneMode = 12;

	if (!scene->_upExitStyle) {
		if (R2_GLOBALS.getFlag(36))
			scene->setAction(&scene->_sequenceManager, scene, 1953, &R2_GLOBALS._player, NULL);
		else
			scene->setAction(&scene->_sequenceManager, scene, 1970, &R2_GLOBALS._player, NULL);
	} else {
		if (R2_GLOBALS.getFlag(36))
			scene->setAction(&scene->_sequenceManager, scene, 1952, &R2_GLOBALS._player, NULL);
		else
			scene->setAction(&scene->_sequenceManager, scene, 1969, &R2_GLOBALS._player, NULL);
	}
}

void Scene1950::EastExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 3;
	scene->_sceneMode = 13;

	if (scene->_vampireActive)
		R2_GLOBALS._player.animate(ANIM_MODE_9);

	Common::Point pt(340, 160);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene1950::DownExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 4;
	scene->_sceneMode = 14;

	if (R2_GLOBALS.getFlag(36))
		scene->setAction(&scene->_sequenceManager, scene, 1956, &R2_GLOBALS._player, NULL);
	else
		scene->setAction(&scene->_sequenceManager, scene, 1973, &R2_GLOBALS._player, NULL);
}

void Scene1950::SouthExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 5;
	scene->_sceneMode = 15;

	Common::Point pt(160, 213);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene1950::WestExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 6;

	if (R2_GLOBALS._flubMazeArea == 2) {
		// In the very first corridor area after the Scrith Door
		if ((R2_GLOBALS.getFlag(36)) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 2) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)) {
			scene->_sceneMode = 1961;
			Common::Point pt(-20, 160);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, scene);
		} else {
			if (!R2_GLOBALS.getFlag(36))
				SceneItem::display(1950, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
			if ((R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) || (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 1950))
				SceneItem::display(1950, 34, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
			scene->_sceneMode = 0;
			Common::Point pt(30, 160);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, scene);
		}
	} else {
		if (scene->_vampireActive)
			R2_GLOBALS._player.animate(ANIM_MODE_9);

		scene->_sceneMode = 16;
		Common::Point pt(-20, 160);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, scene);
	}
}

void Scene1950::ShaftExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 0;
	scene->_sceneMode = 1951;
	scene->setAction(&scene->_sequenceManager, scene, 1951, &R2_GLOBALS._player, NULL);
}

void Scene1950::DoorExit::changeScene() {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	R2_GLOBALS._flubMazeEntryDirection = 3;
	if (R2_GLOBALS._player._visage == 22) {
		scene->_sceneMode = 1975;
		scene->setAction(&scene->_sequenceManager, scene, 1975, &R2_GLOBALS._player, NULL);
	} else {
		SceneItem::display(1950, 22, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
		R2_GLOBALS._flubMazeEntryDirection = 0;
		scene->_sceneMode = 0;
		Common::Point pt(250, 150);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, scene);
		_enabled = true;
	}
}

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

Scene1950::Scene1950() {
	_upExitStyle = false;
	_removeFlag = false;
	_vampireActive = false;
	_vampireDestPos = Common::Point(0, 0);
	_vampireIndex = 0;
}

void Scene1950::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_upExitStyle);
	s.syncAsSint16LE(_removeFlag);
	s.syncAsSint16LE(_vampireActive);
	s.syncAsSint16LE(_vampireDestPos.x);
	s.syncAsSint16LE(_vampireDestPos.y);
	s.syncAsSint16LE(_vampireIndex);
}

void Scene1950::initArea() {
	_northExit._enabled = false;
	_upExit._enabled = false;
	_eastExit._enabled = false;
	_downExit._enabled = false;
	_southExit._enabled = false;
	_westExit._enabled = false;
	_shaftExit._enabled = false;
	_doorExit._enabled = false;
	_northExit._insideArea = false;
	_upExit._insideArea = false;
	_eastExit._insideArea = false;
	_downExit._insideArea = false;
	_southExit._insideArea = false;
	_westExit._insideArea = false;
	_shaftExit._insideArea = false;
	_doorExit._insideArea = false;
	_northExit._moving = false;
	_upExit._moving = false;
	_eastExit._moving = false;
	_downExit._moving = false;
	_southExit._moving = false;
	_westExit._moving = false;
	_shaftExit._moving = false;
	_doorExit._moving = false;
	_upExitStyle = false;

	switch (R2_GLOBALS._flubMazeArea - 1) {
	case 0:
		loadScene(1948);
		break;
	case 1:
	// No break on purpose
	case 8:
	// No break on purpose
	case 10:
	// No break on purpose
	case 12:
	// No break on purpose
	case 16:
	// No break on purpose
	case 19:
	// No break on purpose
	case 23:
	// No break on purpose
	case 30:
	// No break on purpose
	case 44:
	// No break on purpose
	case 72:
	// No break on purpose
	case 74:
	// No break on purpose
	case 86:
	// No break on purpose
	case 96:
	// No break on purpose
	case 103:
		loadScene(1950);
		break;
	case 2:
	// No break on purpose
	case 29:
		loadScene(1965);
		break;
	case 3:
	// No break on purpose
	case 9:
	// No break on purpose
	case 11:
	// No break on purpose
	case 15:
	// No break on purpose
	case 24:
	// No break on purpose
	case 39:
	// No break on purpose
	case 45:
	// No break on purpose
	case 71:
	// No break on purpose
	case 73:
	// No break on purpose
	case 75:
	// No break on purpose
	case 79:
	// No break on purpose
	case 85:
	// No break on purpose
	case 87:
	// No break on purpose
	case 95:
		loadScene(1955);
		break;
	case 4:
	// No break on purpose
	case 6:
	// No break on purpose
	case 13:
	// No break on purpose
	case 27:
	// No break on purpose
	case 41:
	// No break on purpose
	case 48:
	// No break on purpose
	case 50:
	// No break on purpose
	case 54:
	// No break on purpose
	case 76:
	// No break on purpose
	case 80:
	// No break on purpose
	case 90:
	// No break on purpose
	case 104:
		loadScene(1975);
		break;
	case 5:
	// No break on purpose
	case 7:
	// No break on purpose
	case 14:
	// No break on purpose
	case 28:
	// No break on purpose
	case 32:
	// No break on purpose
	case 47:
	// No break on purpose
	case 53:
		loadScene(1997);
		break;
	case 17:
	// No break on purpose
	case 20:
	// No break on purpose
	case 25:
	// No break on purpose
	case 31:
	// No break on purpose
	case 33:
	// No break on purpose
	case 46:
		loadScene(1995);
		break;
	case 18:
	// No break on purpose
	case 22:
	// No break on purpose
	case 26:
	// No break on purpose
	case 36:
	// No break on purpose
	case 38:
	// No break on purpose
	case 43:
	// No break on purpose
	case 51:
	// No break on purpose
	case 70:
	// No break on purpose
	case 78:
	// No break on purpose
	case 84:
	// No break on purpose
	case 89:
	// No break on purpose
	case 101:
		loadScene(1970);
		break;
	case 21:
	// No break on purpose
	case 34:
	// No break on purpose
	case 57:
	// No break on purpose
	case 58:
	// No break on purpose
	case 59:
	// No break on purpose
	case 62:
	// No break on purpose
	case 65:
		loadScene(1980);
		break;
	case 35:
	// No break on purpose
	case 61:
	// No break on purpose
	case 77:
	// No break on purpose
	case 83:
		loadScene(1982);
		break;
	case 37:
	// No break on purpose
	case 52:
	// No break on purpose
	case 82:
	// No break on purpose
	case 88:
	// No break on purpose
	case 92:
	// No break on purpose
	case 97:
	// No break on purpose
	case 100:
		loadScene(1962);
		break;
	case 40:
	// No break on purpose
	case 102:
		loadScene(1960);
		break;
	case 42:
	// No break on purpose
	case 55:
	// No break on purpose
	case 60:
	// No break on purpose
	case 66:
	// No break on purpose
	case 68:
	// No break on purpose
	case 69:
	// No break on purpose
	case 93:
	// No break on purpose
	case 98:
		loadScene(1990);
		break;
	case 49:
	// No break on purpose
	case 81:
	// No break on purpose
	case 91:
	// No break on purpose
	case 94:
	// No break on purpose
	case 99:
		loadScene(1967);
		break;
	case 56:
	// No break on purpose
	case 63:
	// No break on purpose
	case 64:
	// No break on purpose
	case 67:
		loadScene(1985);
		_upExitStyle = true;
		break;
	default:
		break;
	}

	if (R2_GLOBALS._flubMazeArea != 1)
		R2_GLOBALS._walkRegions.load(1950);

	switch (R2_GLOBALS._flubMazeArea - 1) {
	case 0:
		_shaftExit._enabled = true;
		if ((R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0) && (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950))
			_doorExit._enabled = true;
		R2_GLOBALS._walkRegions.disableRegion(2);
		R2_GLOBALS._walkRegions.disableRegion(3);
		R2_GLOBALS._walkRegions.disableRegion(4);
		R2_GLOBALS._walkRegions.disableRegion(5);
		R2_GLOBALS._walkRegions.disableRegion(6);
		break;
	case 1:
	// No break on purpose
	case 2:
	// No break on purpose
	case 3:
	// No break on purpose
	case 8:
	// No break on purpose
	case 9:
	// No break on purpose
	case 10:
	// No break on purpose
	case 11:
	// No break on purpose
	case 12:
	// No break on purpose
	case 15:
	// No break on purpose
	case 16:
	// No break on purpose
	case 19:
	// No break on purpose
	case 23:
	// No break on purpose
	case 24:
	// No break on purpose
	case 29:
	// No break on purpose
	case 30:
	// No break on purpose
	case 39:
	// No break on purpose
	case 40:
	// No break on purpose
	case 44:
	// No break on purpose
	case 45:
	// No break on purpose
	case 71:
	// No break on purpose
	case 72:
	// No break on purpose
	case 73:
	// No break on purpose
	case 74:
	// No break on purpose
	case 75:
	// No break on purpose
	case 79:
	// No break on purpose
	case 85:
	// No break on purpose
	case 86:
	// No break on purpose
	case 87:
	// No break on purpose
	case 95:
	// No break on purpose
	case 96:
	// No break on purpose
	case 102:
	// No break on purpose
	case 103:
		_eastExit._enabled = true;
		_westExit._enabled = true;
		break;
	case 4:
	// No break on purpose
	case 6:
	// No break on purpose
	case 13:
	// No break on purpose
	case 17:
	// No break on purpose
	case 20:
	// No break on purpose
	case 25:
	// No break on purpose
	case 27:
	// No break on purpose
	case 31:
	// No break on purpose
	case 33:
	// No break on purpose
	case 37:
	// No break on purpose
	case 41:
	// No break on purpose
	case 46:
	// No break on purpose
	case 48:
	// No break on purpose
	case 50:
	// No break on purpose
	case 52:
	// No break on purpose
	case 54:
	// No break on purpose
	case 76:
	// No break on purpose
	case 80:
	// No break on purpose
	case 82:
	// No break on purpose
	case 88:
	// No break on purpose
	case 90:
	// No break on purpose
	case 92:
	// No break on purpose
	case 97:
	// No break on purpose
	case 100:
	// No break on purpose
	case 104:
		_westExit._enabled = true;
		R2_GLOBALS._walkRegions.disableRegion(6);
		R2_GLOBALS._walkRegions.disableRegion(9);
		break;
	case 5:
	// No break on purpose
	case 7:
	// No break on purpose
	case 14:
	// No break on purpose
	case 18:
	// No break on purpose
	case 22:
	// No break on purpose
	case 26:
	// No break on purpose
	case 28:
	// No break on purpose
	case 32:
	// No break on purpose
	case 36:
	// No break on purpose
	case 38:
	// No break on purpose
	case 43:
	// No break on purpose
	case 47:
	// No break on purpose
	case 49:
	// No break on purpose
	case 51:
	// No break on purpose
	case 53:
	// No break on purpose
	case 70:
	// No break on purpose
	case 78:
	// No break on purpose
	case 81:
	// No break on purpose
	case 84:
	// No break on purpose
	case 89:
	// No break on purpose
	case 91:
	// No break on purpose
	case 94:
	// No break on purpose
	case 99:
	// No break on purpose
	case 101:
		_eastExit._enabled = true;
		R2_GLOBALS._walkRegions.disableRegion(1);
		R2_GLOBALS._walkRegions.disableRegion(7);
		R2_GLOBALS._walkRegions.disableRegion(13);
		break;
	default:
		R2_GLOBALS._walkRegions.disableRegion(1);
		R2_GLOBALS._walkRegions.disableRegion(6);
		R2_GLOBALS._walkRegions.disableRegion(7);
		R2_GLOBALS._walkRegions.disableRegion(9);
		R2_GLOBALS._walkRegions.disableRegion(13);
		break;
	}

	_northDoorway.remove();
	_northDoorway.removeObject();
	_southDoorway.remove();

	switch (R2_GLOBALS._flubMazeArea - 4) {
	case 0:
	// No break on purpose
	case 3:
	// No break on purpose
	case 16:
	// No break on purpose
	case 22:
	// No break on purpose
	case 24:
	// No break on purpose
	case 32:
	// No break on purpose
	case 33:
	// No break on purpose
	case 45:
	// No break on purpose
	case 46:
	// No break on purpose
	case 48:
	// No break on purpose
	case 51:
	// No break on purpose
	case 56:
	// No break on purpose
	case 59:
	// No break on purpose
	case 67:
	// No break on purpose
	case 68:
	// No break on purpose
	case 70:
	// No break on purpose
	case 73:
	// No break on purpose
	case 82:
	// No break on purpose
	case 90:
		_northExit._enabled = true;
		_northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25);
		//visage,strip,frame,px,py,priority,effect
		_southDoorway.postInit();
		_southDoorway.setVisage(1950);
		_southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1);
		_southDoorway.setFrame(2);
		_southDoorway.setPosition(Common::Point(160, 167));
		_southDoorway.fixPriority(220);
		R2_GLOBALS._walkRegions.disableRegion(3);
		R2_GLOBALS._walkRegions.disableRegion(4);
		break;
	case 7:
	// No break on purpose
	case 10:
	// No break on purpose
	case 23:
	// No break on purpose
	case 29:
	// No break on purpose
	case 31:
	// No break on purpose
	case 39:
	// No break on purpose
	case 40:
	// No break on purpose
	case 52:
	// No break on purpose
	case 53:
	// No break on purpose
	case 55:
	// No break on purpose
	case 63:
	// No break on purpose
	case 65:
	// No break on purpose
	case 66:
	// No break on purpose
	case 75:
	// No break on purpose
	case 77:
	// No break on purpose
	case 81:
	// No break on purpose
	case 87:
	// No break on purpose
	case 89:
	// No break on purpose
	case 97:
		_southExit._enabled = true;

		_southDoorway.postInit();
		_southDoorway.setVisage(1950);
		_southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1);
		_southDoorway.setFrame(3);
		_southDoorway.setPosition(Common::Point(160, 167));
		_southDoorway.fixPriority(220);
		break;
	case 58:
	// No break on purpose
	case 74:
	// No break on purpose
	case 80:
		_northExit._enabled = true;
		_southExit._enabled = true;

		_northDoorway.setup(1950, (R2_GLOBALS._flubMazeArea % 2) + 1, 1, 160, 137, 25);

		_southDoorway.postInit();
		_southDoorway.setVisage(1950);
		_southDoorway.setStrip((((R2_GLOBALS._flubMazeArea - 1) / 35) % 2) + 1);
		_southDoorway.setFrame(3);
		_southDoorway.setPosition(Common::Point(160, 167));
		_southDoorway.fixPriority(220);
		R2_GLOBALS._walkRegions.disableRegion(3);
		R2_GLOBALS._walkRegions.disableRegion(4);
		break;
	default:
		_southDoorway.postInit();
		_southDoorway.setVisage(1950);
		_southDoorway.setStrip(((R2_GLOBALS._flubMazeArea - 1) / 35) % 2 + 1);
		_southDoorway.setFrame(2);
		_southDoorway.setPosition(Common::Point(160, 167));
		_southDoorway.fixPriority(220);
		break;
	}

	switch (R2_GLOBALS._flubMazeArea - 3) {
	case 0:
	// No break on purpose
	case 3:
	// No break on purpose
	case 5:
	// No break on purpose
	case 12:
	// No break on purpose
	case 15:
	// No break on purpose
	case 18:
	// No break on purpose
	case 19:
	// No break on purpose
	case 23:
	// No break on purpose
	case 26:
	// No break on purpose
	case 27:
	// No break on purpose
	case 29:
	// No break on purpose
	case 30:
	// No break on purpose
	case 31:
	// No break on purpose
	case 32:
	// No break on purpose
	case 44:
	// No break on purpose
	case 45:
	// No break on purpose
	case 51:
	// No break on purpose
	case 55:
	// No break on purpose
	case 56:
	// No break on purpose
	case 57:
	// No break on purpose
	case 60:
	// No break on purpose
	case 63:
		_upExit._enabled = true;
		break;
	case 54:
	// No break on purpose
	case 61:
	// No break on purpose
	case 62:
	// No break on purpose
	case 65:
		_upExit._enabled = true;
		// fall through
	case 35:
	// No break on purpose
	case 38:
	// No break on purpose
	case 40:
	// No break on purpose
	case 47:
	// No break on purpose
	case 50:
	// No break on purpose
	case 53:
	// No break on purpose
	case 58:
	// No break on purpose
	case 64:
	// No break on purpose
	case 66:
	// No break on purpose
	case 67:
	// No break on purpose
	case 79:
	// No break on purpose
	case 80:
	// No break on purpose
	case 86:
	// No break on purpose
	case 89:
	// No break on purpose
	case 90:
	// No break on purpose
	case 91:
	// No break on purpose
	case 92:
	// No break on purpose
	case 95:
	// No break on purpose
	case 96:
	// No break on purpose
	case 97:
	// No break on purpose
	case 98:
	// No break on purpose
	case 100:
		_downExit._enabled = true;
		R2_GLOBALS._walkRegions.disableRegion(4);
		R2_GLOBALS._walkRegions.disableRegion(5);
		R2_GLOBALS._walkRegions.disableRegion(6);
		R2_GLOBALS._walkRegions.disableRegion(10);
		R2_GLOBALS._walkRegions.disableRegion(11);
	default:
		break;
	}
	R2_GLOBALS._uiElements.draw();
}

void Scene1950::enterArea() {
	R2_GLOBALS._player.disableControl();
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);

	_vampire.remove();
	_door.remove();
	_scrolls.remove();

	_vampireActive = false;
	_vampireIndex = 0;

	// Certain areas have a vampire in them
	switch (R2_GLOBALS._flubMazeArea) {
	case 10:
		_vampireIndex = 1;
		break;
	case 13:
		_vampireIndex = 2;
		break;
	case 16:
		_vampireIndex = 3;
		break;
	case 17:
		_vampireIndex = 4;
		break;
	case 24:
		_vampireIndex = 5;
		break;
	case 25:
		_vampireIndex = 6;
		break;
	case 31:
		_vampireIndex = 7;
		break;
	case 40:
		_vampireIndex = 8;
		break;
	case 45:
		_vampireIndex = 9;
		break;
	case 46:
		_vampireIndex = 10;
		break;
	case 73:
		_vampireIndex = 11;
		break;
	case 75:
		_vampireIndex = 12;
		break;
	case 80:
		_vampireIndex = 13;
		break;
	case 87:
		_vampireIndex = 14;
		break;
	case 88:
		_vampireIndex = 15;
		break;
	case 96:
		_vampireIndex = 16;
		break;
	case 97:
		_vampireIndex = 17;
		break;
	case 104:
		_vampireIndex = 18;
		break;
	default:
		break;
	}

	if (_vampireIndex != 0) {
		_vampire.postInit();
		_vampire._numFrames = 6;
		_vampire._moveRate = 6;
		_vampire._moveDiff = Common::Point(3, 2);
		_vampire._effect = EFFECT_SHADED;

		if (!R2_GLOBALS._vampireData[_vampireIndex - 1]._isAlive) {
			// Show vampire ashes
			_vampire.setPosition(Common::Point(R2_GLOBALS._vampireData[_vampireIndex - 1]._position));
			_vampire.animate(ANIM_MODE_NONE, NULL);
			_vampire.addMover(NULL);
			_vampire.setVisage(1961);
			_vampire.setStrip(4);
			_vampire.setFrame(10);
			_vampire.fixPriority(10);
			_vampire.setDetails(1950, 15, -1, 17, 2, (SceneItem *) NULL);
		} else {
			// Start the vampire
			_vampire.setVisage(1960);
			_vampire.setPosition(Common::Point(160, 130));
			_vampire.animate(ANIM_MODE_2, NULL);
			_vampire.setDetails(1950, 12, -1, 14, 2, (SceneItem *) NULL);
			_vampireActive = true;
		}
	}
	if ((R2_GLOBALS._flubMazeArea == 1) && (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) != 0)) {
		// Show doorway at the right hand side of the very first flub corridor
		_door.postInit();
		_door.setVisage(1948);
		_door.setStrip(3);
		_door.setPosition(Common::Point(278, 155));
		_door.fixPriority(100);
		_door.setDetails(1950, 19, 20, 23, 2, (SceneItem *) NULL);
	}

	if (R2_GLOBALS._flubMazeArea == 102) {
		R2_GLOBALS._walkRegions.load(1951);
		R2_GLOBALS._walkRegions.disableRegion(1);
		R2_GLOBALS._walkRegions.disableRegion(5);
		R2_GLOBALS._walkRegions.disableRegion(6);
		R2_GLOBALS._walkRegions.disableRegion(7);

		_cube.postInit();
		_cube.setVisage(1970);
		_cube.setStrip(1);
		if (R2_GLOBALS.getFlag(37))
			_cube.setFrame(3);
		else
			_cube.setFrame(1);
		_cube.setPosition(Common::Point(193, 158));
		_cube.setDetails(1950, 3, 4, 5, 2, (SceneItem *) NULL);

		_pulsingLights.postInit();
		_pulsingLights.setVisage(1970);
		_pulsingLights.setStrip(3);
		_pulsingLights.animate(ANIM_MODE_2, NULL);
		_pulsingLights._numFrames = 6;
		_pulsingLights.setPosition(Common::Point(194, 158));
		_pulsingLights.fixPriority(159);

		_keypad.setDetails(Rect(188, 124, 199, 133), 1950, 27, 28, -1, 2, NULL);

		if (R2_INVENTORY.getObjectScene(R2_SAPPHIRE_BLUE) == 1950) {
			_gem.postInit();
			_gem.setVisage(1970);
			_gem.setStrip(1);
			_gem.setFrame(2);
			_gem.fixPriority(160);
		}

		if (R2_GLOBALS.getFlag(37)) {
			_gem.setPosition(Common::Point(192, 118));
			_gem.setDetails(1950, 9, 4, -1, 2, (SceneItem *) NULL);
		} else {
			_containmentField.postInit();
			_containmentField.setVisage(1970);
			_containmentField.setStrip(4);
			_containmentField._numFrames = 4;
			_containmentField.animate(ANIM_MODE_8, 0, NULL);
			_containmentField.setPosition(Common::Point(192, 121));
			_containmentField.fixPriority(159);
			_containmentField.setDetails(1950, 6, 7, 8, 2, (SceneItem *) NULL);

			_gem.setPosition(Common::Point(192, 109));
			_gem.setDetails(1950, 9, 7, 8, 2, (SceneItem *) NULL);
		}

		_scrolls.postInit();
		_scrolls.setVisage(1972);
		_scrolls.setStrip(1);
		_scrolls.setPosition(Common::Point(76, 94));
		_scrolls.fixPriority(25);
		_scrolls.setDetails(1950, 30, -1, -1, 2, (SceneItem *) NULL);
		if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2)
			_scrolls.setFrame(2);
		else
			_scrolls.setFrame(1);

		_removeFlag = true;
	} else if (_removeFlag) {
		_cube.remove();
		_containmentField.remove();
		_gem.remove();
		_pulsingLights.remove();
		_scrolls.remove();

		R2_GLOBALS._sceneItems.remove(&_background);
		_background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 2, NULL);

		_removeFlag = false;
	}

	switch (R2_GLOBALS._flubMazeEntryDirection) {
	case 0:
		_sceneMode = 1950;
		if (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)
			// The original uses CURSOR_ARROW. CURSOR_WALK is much more coherent
			R2_GLOBALS._player.enableControl(CURSOR_WALK);
		else
			setAction(&_sequenceManager, this, 1950, &R2_GLOBALS._player, NULL);

		break;
	case 1: {
		_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
		R2_GLOBALS._player.setPosition(Common::Point(160, 213));
		Common::Point pt(160, 160);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 2:
		_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
		if (R2_GLOBALS.getFlag(36))
			setAction(&_sequenceManager, this, 1957, &R2_GLOBALS._player, NULL);
		else
			setAction(&_sequenceManager, this, 1974, &R2_GLOBALS._player, NULL);
		break;
	case 3:
		// Entering from the left
		if (!_vampireActive) {
			_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
			R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
			Common::Point pt(30, 160);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, this);
		} else {
			_sceneMode = 18;
			_eastExit._enabled = false;
			_vampireDestPos = Common::Point(60, 152);
			R2_GLOBALS._player.enableControl(CURSOR_USE);
			R2_GLOBALS._player._canWalk = false;

			_vampire.setStrip(2);
			NpcMover *mover = new NpcMover();
			_vampire.addMover(mover, &_vampireDestPos, this);

			R2_GLOBALS._player.setPosition(Common::Point(-20, 160));
			Common::Point pt2(30, 160);
			NpcMover *mover2 = new NpcMover();
			R2_GLOBALS._player.addMover(mover2, &pt2, NULL);
		}
		break;
	case 4:
		_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
		if (!_upExitStyle) {
			if (R2_GLOBALS.getFlag(36))
				setAction(&_sequenceManager, this, 1955, &R2_GLOBALS._player, NULL);
			else
				setAction(&_sequenceManager, this, 1972, &R2_GLOBALS._player, NULL);
		} else {
			if (R2_GLOBALS.getFlag(36))
				setAction(&_sequenceManager, this, 1954, &R2_GLOBALS._player, NULL);
			else
				setAction(&_sequenceManager, this, 1971, &R2_GLOBALS._player, NULL);
		}
		break;
	case 5: {
		_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
		R2_GLOBALS._player.setPosition(Common::Point(160, 127));
		Common::Point pt(160, 160);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 6:
		// Entering from the right
		if (!_vampireActive) {
			_sceneMode = R2_GLOBALS._flubMazeEntryDirection;
			if (R2_GLOBALS._flubMazeArea == 1) {
				setAction(&_sequenceManager, this, 1961, &R2_GLOBALS._player, NULL);
			} else {
				R2_GLOBALS._player.setPosition(Common::Point(340, 160));
				Common::Point pt(289, 160);
				NpcMover *mover = new NpcMover();
				R2_GLOBALS._player.addMover(mover, &pt, this);
			}
		} else {
			_sceneMode = 17;
			_westExit._enabled = false;
			_vampireDestPos = Common::Point(259, 152);

			R2_GLOBALS._player.enableControl(CURSOR_USE);
			R2_GLOBALS._player._canWalk = false;

			_vampire.setStrip(1);
			NpcMover *mover = new NpcMover();
			_vampire.addMover(mover, &_vampireDestPos, this);

			R2_GLOBALS._player.setPosition(Common::Point(340, 160));
			Common::Point pt2(289, 160);
			NpcMover *mover2 = new NpcMover();
			R2_GLOBALS._player.addMover(mover2, &pt2, NULL);
		}
		break;
	default:
		break;
	}
}

void Scene1950::doButtonPress(int indx) {
	Scene1950 *scene = (Scene1950 *)R2_GLOBALS._sceneManager._scene;
	R2_GLOBALS._player.disableControl();

	int prevIndex = indx - 1;
	if ((indx / 4) == (prevIndex / 4)) {
		if (prevIndex < 0)
			prevIndex = 3;
	} else {
		prevIndex += 4;
	}

	assert(prevIndex >= 0 && prevIndex < 16);
	if (!_KeypadWindow._buttons[prevIndex]._toggled) {
		_KeypadWindow._buttons[prevIndex].setFrame(2);
		_KeypadWindow._buttons[prevIndex]._toggled = true;
	} else {
		_KeypadWindow._buttons[prevIndex].setFrame(1);
		_KeypadWindow._buttons[prevIndex]._toggled = false;
	}

	prevIndex = indx + 1;
	if ((indx / 4) == (prevIndex / 4)) {
		if (prevIndex >  15)
			prevIndex = 12;
	} else {
		prevIndex -= 4;
	}

	assert(prevIndex >= 0 && prevIndex < 16);
	if (!_KeypadWindow._buttons[prevIndex]._toggled) {
		_KeypadWindow._buttons[prevIndex].setFrame(2);
		_KeypadWindow._buttons[prevIndex]._toggled = true;
	} else {
		_KeypadWindow._buttons[prevIndex].setFrame(1);
		_KeypadWindow._buttons[prevIndex]._toggled = false;
	}

	prevIndex = indx - 4;
	if (prevIndex < 0)
		prevIndex += 16;

	assert(prevIndex >= 0 && prevIndex < 16);
	if (!_KeypadWindow._buttons[prevIndex]._toggled) {
		_KeypadWindow._buttons[prevIndex].setFrame(2);
		_KeypadWindow._buttons[prevIndex]._toggled = true;
	} else {
		_KeypadWindow._buttons[prevIndex].setFrame(1);
		_KeypadWindow._buttons[prevIndex]._toggled = false;
	}

	prevIndex = indx + 4;
	if (prevIndex > 15)
		prevIndex -= 16;

	assert(prevIndex >= 0 && prevIndex < 16);
	if (!_KeypadWindow._buttons[prevIndex]._toggled) {
		_KeypadWindow._buttons[prevIndex].setFrame(2);
		_KeypadWindow._buttons[prevIndex]._toggled = true;
	} else {
		_KeypadWindow._buttons[prevIndex].setFrame(1);
		_KeypadWindow._buttons[prevIndex]._toggled = false;
	}

	// Check whether all the buttons are highlighted
	int cpt = 0;
	for (prevIndex = 0; prevIndex < 16; prevIndex++) {
		if (_KeypadWindow._buttons[prevIndex]._toggled)
			++cpt;
	}

	if (cpt != 16) {
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
	} else {
		R2_GLOBALS.setFlag(37);
		_sceneMode = 24;
		setAction(&_sequenceManager, scene, 1976, NULL);
	}
}

void Scene1950::postInit(SceneObjectList *OwnerList) {
	_upExitStyle = false;
	_removeFlag = false;
	_vampireActive = false;
	_vampireIndex = 0;
	if (R2_GLOBALS._sceneManager._previousScene == 300)
		R2_GLOBALS._flubMazeArea = 103;

	initArea();
	SceneExt::postInit();
	R2_GLOBALS._sound1.play(105);

	_northExit.setDetails(Rect(130, 46, 189, 135), SHADECURSOR_UP, 1950);
	_northExit.setDest(Common::Point(160, 145));

	_upExit.setDetails(Rect(208, 0, 255, 73), EXITCURSOR_N, 1950);
	_upExit.setDest(Common::Point(200, 151));

	_eastExit.setDetails(Rect(305, 95, 320, 147), EXITCURSOR_E, 1950);
	_eastExit.setDest(Common::Point(312, 160));

	_downExit.setDetails(Rect(208, 99, 255, 143), EXITCURSOR_S, 1950);
	_downExit.setDest(Common::Point(200, 151));

	_southExit.setDetails(Rect(113, 154, 206, 168), SHADECURSOR_DOWN, 1950);
	_southExit.setDest(Common::Point(160, 165));

	_westExit.setDetails(Rect(0, 95, 14, 147), EXITCURSOR_W, 1950);
	_westExit.setDest(Common::Point(7, 160));

	_shaftExit.setDetails(Rect(72, 54, 120, 128), EXITCURSOR_NW, 1950);
	_shaftExit.setDest(Common::Point(120, 140));

	_doorExit.setDetails(Rect(258, 60, 300, 145), EXITCURSOR_NE, 1950);
	_doorExit.setDest(Common::Point(268, 149));

	R2_GLOBALS._player.postInit();
	if ( (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 0) && (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 0)
		&& (R2_INVENTORY.getObjectScene(R2_SOAKED_FACEMASK) == 0) && (!R2_GLOBALS.getFlag(36)) )
		R2_GLOBALS._player.setVisage(22);
	else
		R2_GLOBALS._player.setVisage(20);

	R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
	_background.setDetails(Rect(0, 0, 320, 200), 1950, 0, 1, 2, 1, NULL);

	enterArea();
}

void Scene1950::remove() {
	R2_GLOBALS._sound1.stop();
	R2_GLOBALS._sound2.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene1950::signal() {
	switch (_sceneMode) {
	case 11:
		R2_GLOBALS._flubMazeArea += 7;
		initArea();
		enterArea();
		break;
	case 12:
		// Moving up a ladder within the Flub maze
		R2_GLOBALS._flubMazeArea += 35;
		initArea();
		enterArea();
		break;
	case 1975:
		SceneItem::display(1950, 21, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, 1,
			SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
		// fall through
	case 13:
		// Moving east within the Flub maze
		++R2_GLOBALS._flubMazeArea;
		initArea();
		enterArea();
		break;
	case 14:
		// Moving down a ladder within the Flub maze
		R2_GLOBALS._flubMazeArea -= 35;
		initArea();
		enterArea();
		break;
	case 15:
		R2_GLOBALS._flubMazeArea -= 7;
		initArea();
		enterArea();
		break;
	case 16:
		// Moving west within the Flub maze
	// No break on purpose
	case 1961:
		--R2_GLOBALS._flubMazeArea;
		initArea();
		enterArea();
		break;
	case 17: {
		_sceneMode = 13;
		R2_GLOBALS._flubMazeEntryDirection = 3;
		_vampireActive = false;
		R2_GLOBALS._player.disableControl(CURSOR_WALK);
		R2_GLOBALS._player._canWalk = true;
		R2_GLOBALS._player.setVisage(22);
		R2_GLOBALS._player.animate(ANIM_MODE_9);
		Common::Point pt(340, 160);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		Common::Point pt2(289, 160);
		NpcMover *mover2 = new NpcMover();
		_vampire.addMover(mover2, &pt2, NULL);
		}
		break;
	case 18: {
		_sceneMode = 16;
		R2_GLOBALS._flubMazeEntryDirection = 6;
		_vampireActive = false;
		R2_GLOBALS._player.disableControl(CURSOR_WALK);
		R2_GLOBALS._player._canWalk = true;
		R2_GLOBALS._player.setVisage(22);
		R2_GLOBALS._player.animate(ANIM_MODE_9);
		Common::Point pt(-20, 160);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		Common::Point pt2(30, 160);
		NpcMover *mover2 = new NpcMover();
		_vampire.addMover(mover2, &pt2, NULL);
		}
		break;
	case 24:
		_KeypadWindow.remove();
		_sceneMode = 1966;
		_cube.setFrame(3);
		setAction(&_sequenceManager, this, 1966, &_containmentField, &_gem, NULL);
		break;
	case 1951:
		R2_GLOBALS._sound1.fadeOut2(NULL);
		R2_GLOBALS._sceneManager.changeScene(1945);
		break;
	case 1958:
		SceneItem::display(1950, 24, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
		R2_GLOBALS._player.enableControl(CURSOR_WALK);
		_doorExit._enabled = true;
		break;
	case 1959:
		R2_INVENTORY.setObjectScene(R2_SOAKED_FACEMASK, 0);
		R2_GLOBALS._player.enableControl(CURSOR_WALK);
		_doorExit._enabled = true;
		break;
	case 1962:
	// No break on purpose
	case 1963:
		R2_GLOBALS._player.enableControl();
		_KeypadWindow.setup2(1971, 1, 1, 160, 135);
		break;
	case 1964:
	// No break on purpose
	case 1965:
		if (!R2_GLOBALS.getFlag(37))
			SceneItem::display(1950, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);

		R2_GLOBALS._player.enableControl();
		break;
	case 1966:
		_containmentField.remove();
		if (R2_GLOBALS.getFlag(36)) {
			_sceneMode = 1964;
			setAction(&_sequenceManager, this, 1964, &R2_GLOBALS._player, NULL);
		} else {
			_sceneMode = 1965;
			setAction(&_sequenceManager, this, 1965, &R2_GLOBALS._player, NULL);
		}
		_gem.setDetails(1950, 9, -1, -1, 2, (SceneItem *) NULL);
		break;
	case 1967: {
		_sceneMode = 0;
		R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 2);
		_gem.remove();
		if (R2_GLOBALS.getFlag(36))
			R2_GLOBALS._player.setVisage(20);
		else
			R2_GLOBALS._player.setVisage(22);

		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		// This is a hack to work around a pathfinding issue. original destination is (218, 165)
		Common::Point pt(128, 165);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 1968:
		R2_GLOBALS._player.enableControl();
		R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2);
		_scrolls.setFrame(2);
		if (R2_GLOBALS.getFlag(36))
			R2_GLOBALS._player.setVisage(20);
		else
			R2_GLOBALS._player.setVisage(22);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		break;
	default:
		R2_GLOBALS._player.enableControl(CURSOR_WALK);
		break;
	}
}

void Scene1950::process(Event &event) {
	if ( (event.eventType == EVENT_BUTTON_DOWN)
			&& (R2_GLOBALS._player._uiEnabled)
			&& (R2_GLOBALS._events.getCursor() == R2_SOAKED_FACEMASK)
			&& (R2_GLOBALS._player._bounds.contains(event.mousePos))
			&& (R2_INVENTORY.getObjectScene(R2_SCRITH_KEY) == 0)) {
		event.handled = true;
		R2_GLOBALS._player.disableControl();
		_shaftExit._enabled = false;
		_doorExit._enabled = false;
		_sceneMode = 1959;
		setAction(&_sequenceManager, this, 1959, &R2_GLOBALS._player, NULL);
	}

	Scene::process(event);
}

} // End of namespace Ringworld2
} // End of namespace TsAGE
