/* 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 "drascula/drascula.h"

namespace Drascula {

void DrasculaEngine::updateAnim(int y, int destX, int destY, int width, int height, int count, byte* src, int delayVal, bool copyRectangle) {
	int x = 0;

	for (int n = 0; n < count; n++){
		x++;
		if (copyRectangle) {
			copyBackground(destX, destY, destX, destY, width, height, bgSurface, screenSurface);
			copyRect(x, y, destX, destY, width, height, src, screenSurface);
		} else {
			copyBackground(x, y, destX, destY, width, height, src, screenSurface);
		}
		updateScreen(destX, destY, destX, destY, width, height, screenSurface);
		x += width;
		updateEvents();
		pause(delayVal);
	}
}

void DrasculaEngine::animation_1_1() {
	debug(4, "animation_1_1()");

	while (term_int == 0 && !shouldQuit()) {
		playMusic(29);
		playFLI("logoddm.bin", 9);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		delay(600);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		clearRoom();
		delay(340);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		playMusic(26);
		delay(500);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		playFLI("logoalc.bin", 8);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		clearRoom();
		loadPic("cielo.alg", screenSurface, COMPLETE_PAL);
		black();
		updateScreen();
		fadeFromBlack(2);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		delay(900);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		color_abc(kColorRed);
		centerText(_textmisc[1], 160, 100);
		updateScreen();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		delay(1000);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		delay(1200);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		playFLI("scrollb.bin", 9);

		clearRoom();
		playSound(5);
		if (animate("scr2.bin", 17))
			break;
		stopSound();
		if (animate("scr3.bin", 17))
			break;
		loadPic("cielo2.alg", screenSurface, COMPLETE_PAL);
		updateScreen();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		fadeToBlack(1);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		clearRoom();

		loadPic(96, frontSurface, COMPLETE_PAL);
		loadPic(103, bgSurface, HALF_PAL);
		loadPic(104, drawSurface3);
		loadPic("aux104.alg", drawSurface2);

		playMusic(4);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		delay(400);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		for (int l2 = 0; l2 < 3; l2++)
			for (int l = 0; l < 7; l++) {
				copyBackground();
				copyBackground(interf_x[l], interf_y[l], 156, 45, 63, 31, drawSurface2, screenSurface);
				updateScreen();
				if (getScan() == Common::KEYCODE_ESCAPE || shouldQuit()) {
					term_int = 1;
					break;
				}
				pause(3);
			}
			if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
				break;

		for (int l = 0, l2 = 0, p = 0; l < 180; l++) {
			copyBackground(0, 0, 320 - l, 0, l, 200, drawSurface3, screenSurface);
			copyBackground(l, 0, 0, 0, 320 - l, 200, bgSurface, screenSurface);

			copyRect(interf_x[l2], interf_y[l2], 156 - l, 45, 63, 31, drawSurface2, screenSurface);
			updateScreen();
			updateEvents();
			p++;
			if (p == 6) {
				p = 0;
				l2++;
			}
			if (l2 == 7)
				l2 = 0;
			if (getScan() == Common::KEYCODE_ESCAPE  || shouldQuit()) {
				term_int = 1;
				break;
			}
		}
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		copyBackground(0, 0, 0, 0, 320, 200, screenSurface, bgSurface);

		talk_drascula_big(1);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		clearRoom();

		loadPic(100, bgSurface, HALF_PAL);
		loadPic("auxigor.alg", frontSurface);
		loadPic("auxdr.alg", backSurface);
		trackDrascula = 0;
		drasculaX = 129;
		drasculaY = 95;
		trackIgor = 1;
		igorX = 66;
		igorY = 97;

		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		talk_igor(8, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		talk_drascula(2);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_drascula(3);
		if (animate("lib.bin", 16))
			break;
		if (animate("lib2.bin", 16))
			break;
		clearRoom();
		color_solo = kColorRed;
		loadPic("plan1.alg", screenSurface, HALF_PAL);
		updateScreen();
		pause(10);
		talk_solo(_textd[4],"d4.als");
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		loadPic("plan1.alg", screenSurface, HALF_PAL);
		updateScreen();
		talk_solo(_textd[5], "d5.als");
		if (animate("lib2.bin", 16))
			break;
		clearRoom();
		loadPic("plan2.alg", screenSurface, HALF_PAL);
		updateScreen();
		pause(20);
		talk_solo(_textd[6], "d6.als");
		if (animate("lib2.bin", 16))
			break;
		clearRoom();
		loadPic("plan3.alg", screenSurface, HALF_PAL);
		updateScreen();
		pause(20);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_solo(_textd[7], "d7.als");
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		loadPic("plan3.alg", screenSurface, HALF_PAL);
		updateScreen();
		talk_solo(_textd[8], "d8.als");
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		clearRoom();
		loadPic(100, bgSurface, HALF_PAL);
		MusicFadeout();
		stopMusic();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_igor(9, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_drascula(9);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_igor(10, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		playMusic(11);
		talk_drascula(10);
		if (animate("rayo1.bin", 16))
			break;
		playSound(5);
		if (animate("rayo2.bin", 15))
			break;
		if (animate("frel2.bin", 16))
			break;
		if (animate("frel.bin", 16))
			break;
		if (animate("frel.bin", 16))
			break;
		stopSound();
		clearRoom();
		black();
		playMusic(23);
		fadeFromBlack(0);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		trackDrascula = 1;
		talk_igor(1, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_drascula(11, 1);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		trackDrascula = 3;
		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		pause(1);
		trackDrascula = 0;
		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		talk_drascula(12);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		trackDrascula = 3;
		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		pause(1);
		trackDrascula = 1;
		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		talk_igor(2, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		pause(13);
		talk_drascula(13, 1);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		trackDrascula = 3;
		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		pause(1);
		trackDrascula = 0;
		copyBackground();
		placeIgor();
		placeDrascula();
		updateScreen();
		talk_drascula(14);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_igor(3, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_drascula(15);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_igor(4, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_drascula(16);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_igor(5, kIgorDch);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		trackIgor = 3;
		talk_drascula(17);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		pause(18);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_igor(6, kIgorFront);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		fadeToBlack(0);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		clearRoom();

		if (_lang == kSpanish)
			playMusic(31);
		else
			playMusic(2);

		pause(5);
		playFLI("intro.bin", 12);
		term_int = 1;
	}
	clearRoom();
	loadPic(96, frontSurface, COMPLETE_PAL);
	loadPic(99, backSurface);
}

void DrasculaEngine::animation_2_1() {
	debug(4, "animation_2_1()");

	int l;

	gotoObject(231, 91);
	characterVisible = 0;

	term_int = 0;

	while (!shouldQuit()) {
		if (animate("ag.bin", 14))
			break;

		loadPic("an11y13.alg", extraSurface);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		talk_bartender(22);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		loadPic(97, extraSurface);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		pause(4);
		playSound(1);
		hiccup(18);
		finishSound();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		clearRoom();
		stopMusic();
		musicStopped = 1;
		memset(screenSurface, 0, 64000);
		color_solo = kColorWhite;
		pause(80);

		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_solo(_textbj[1], "BJ1.als");
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		clearRoom();
		loadPic("bj.alg", screenSurface, HALF_PAL);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		black();
		updateScreen();
		fadeFromBlack(1);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		color_solo = kColorYellow;
		talk_solo(_text[214], "214.als");
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		clearRoom();

		loadPic(16, bgSurface, HALF_PAL);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		loadPic("auxbj.alg", drawSurface3);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;

		_roomNumber = 16;

		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		for (l = 0; l < 200; l++)
			factor_red[l] = 99;
		bjX = 170;
		bjY = 90;
		trackBJ = 0;
		curX = 91;
		curY = 95;
		trackProtagonist = 1;
		characterVisible = 1;

		loadPic("97g.alg", extraSurface);
		if (animate("lev.bin", 15))
			break;

		gotoObject(100 + curWidth / 2, 99 + curHeight);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		trackProtagonist = 1;
		curX = 100;
		curY = 95;

		playTalkSequence(2);	// sequence 2, chapter 1

		if (animate("gaf.bin", 15))
			break;
		if (animate("bjb.bin", 14))
			break;
		playMusic(9);
		loadPic(97, extraSurface);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		updateRoom();
		updateScreen();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		pause(120);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_solo(_text[223], "223.als");
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		color_solo = kColorWhite;
		updateRoom();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		updateScreen();
		pause(110);
		talk_solo(_textbj[11], "BJ11.als");
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		updateRoom();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		updateScreen();
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		pause(118);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		gotoObject(132, 97 + curHeight);
		pause(60);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk(224);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk_bj(12);
		gotoObject(157, 98 + curHeight);
		if (animate("bes.bin", 16))
			break;
		playMusic(11);
		if (animate("rap.bin", 16))
			break;
		trackProtagonist = 3;
		// The room number was originally changed here to "no_bj.alg",
		// which doesn't exist. In reality, this was just a hack to
		// set the room number to a non-existent one, so that BJ does
		// not appear again when the room is refreshed after the
		// animation where Count Drascula abducts her. We set the
		// room number to -1 for the same purpose
		// Also check animation_9_6(), where the same hack was used by
		// the original
		_roomNumber = -1;
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		pause(8);
		updateRoom();
		updateScreen();
		talk(225);
		pause(76);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		trackProtagonist = 1;
		updateRoom();
		updateScreen();
		talk(226);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		updateRoom();
		updateScreen();
		pause(30);
		if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE) || shouldQuit())
			break;
		talk(227);
		fadeToBlack(0);
		break;
	}
}

void DrasculaEngine::animation_3_1() {
	debug(4, "animation_3_1()");

	loadPic("an11y13.alg", extraSurface);

	playTalkSequence(3);	// sequence 3, chapter 1

	loadPic(97, extraSurface);
}

void DrasculaEngine::animation_4_1() {
	debug(4, "animation_4_1()");

	loadPic("an12.alg", extraSurface);

	talk(205);

	updateRefresh_pre();

	copyBackground(1, 139, 228, 112, 47, 60, extraSurface, screenSurface);
	updateScreen(228,112, 228,112, 47,60, screenSurface);

	pause(3);

	updateRefresh_pre();

	copyBackground(49, 139, 228, 112, 47, 60, extraSurface, screenSurface);
	moveCharacters();

	updateScreen();

	pause(3);
	stopMusic();
	flags[11] = 1;

	talk_pianist(1);
	talk(206);
	talk_pianist(2);
	talk(207);
	talk_pianist(3);
	talk(208);
	talk_pianist(4);
	talk(209);

	flags[11] = 0;
	loadPic(97, extraSurface);
}

void DrasculaEngine::animation_2_2() {
	debug(4, "animation_2_2()");

	trackProtagonist = 0;
	copyBackground();
	moveCharacters();
	updateRefresh();
	updateScreen();
	loadPic("an2_1.alg", frontSurface);
	loadPic("an2_2.alg", extraSurface);

	copyBackground();
	copyBackground(1, 1, 201, 87, 50, 52, frontSurface, screenSurface);
	updateScreen();

	updateAnim(1, 201, 87, 50, 52, 6, frontSurface);
	updateAnim(55, 201, 87, 50, 52, 6, frontSurface);
	updateAnim(109, 201, 87, 50, 52, 6, frontSurface);

	playSound(2);

	updateAnim(1, 201, 87, 50, 52, 6, extraSurface);
	updateAnim(55, 201, 87, 50, 52, 6, extraSurface);
	updateAnim(109, 201, 87, 50, 52, 2, extraSurface);

	copyBackground();
	updateScreen();

	finishSound();

	pause (4);

	playSound(1);
	hipo_sin_nadie(12);
	finishSound();
}

void DrasculaEngine::animation_4_2() {
	debug(4, "animation_4_2()");

	stopMusic();
	flags[9] = 1;

	pause(12);
	talk(60);
	pause(8);

	clearRoom();
	loadPic("ciego1.alg", bgSurface, HALF_PAL);	// ciego = blind
	loadPic("ciego2.alg", drawSurface3);
	loadPic("ciego3.alg", extraSurface);
	loadPic("ciego4.alg", backSurface);
	loadPic("ciego5.alg", frontSurface);

	copyBackground();
	updateScreen();

	pause(10);

	talk_blind(1);
	pause(5);
	talk_hacker(57);
	pause(6);

	if (flags[4] == 0) {	// first time
		talk_blind(2);
		pause(4);
		talk_hacker(58);
		talk_blind(3);
		delay(14);
		talk_hacker(59);
		talk_blind(4);
		talk_hacker(60);
		talk_blind(5);
		talk_hacker(61);
		talk_blind(6);
		talk_hacker(62);
		talk_blind(7);
		talk_hacker(63);
		talk_blind(8);
		copyBackground();
		updateScreen();
		_system->delayMillis(1000);
		talk_hacker(64);
		talk_blind(9);

		flags[4] = 1;	// talked to the blind man
	} else {	// second time
		_system->delayMillis(1000);
		talk_blind(10);
		talk_hacker(65);

		flags[33] = 1;
	}

	flags[9] = 0;

	copyBackground();
	updateScreen();

	pause(14);

	clearRoom();

	playMusic(roomMusic);
	loadPic(9, bgSurface, HALF_PAL);
	loadPic("aux9.alg", drawSurface3);
	loadPic(96, frontSurface);
	loadPic(97, extraSurface);
	loadPic(99, backSurface);
	selectVerb(kVerbNone);
}

void DrasculaEngine::animation_14_2() {
	debug(4, "animation_14_2()");

	loadPic("an14_2.alg", backSurface);

	int l = 0;
	for (int n = -160; n <= 0; n = n + 5 + l) {
		copyBackground();
		updateRefresh_pre();
		moveCharacters();
		moveVonBraun();
		int cY = n;
		copyRect(150, 6, 69, cY, 158, 161, backSurface, screenSurface);
		updateRefresh();
		updateScreen();
		l++;
	}

	flags[24] = 1;

	memcpy(bgSurface, screenSurface, 64000);

	playSound(7);
	hiccup(15);

	finishSound();

	loadPic(99, backSurface);
}

void DrasculaEngine::asco() {
	loadPic(roomDisk, drawSurface3);
	loadPic(_roomNumber, bgSurface, HALF_PAL);
	black();
	updateRoom();
	updateScreen();
	fadeFromBlack(0);
	if (roomMusic != 0)
		playMusic(roomMusic);
	else
		stopMusic();
}

// The drunk tells us about Von Braun
void DrasculaEngine::animation_16_2() {
	debug(4, "animation_16_2()");

	char curPic[20];
	talk_drunk(12);
	talk(371);

	clearRoom();

	if (_lang == kSpanish)
		playMusic(30);
	else
		playMusic(32);

	if (getScan() != 0) {
		asco();
		return;
	}

	color_abc(kColorDarkGreen);

	for (int i = 1; i <= 4; i++) {
		if (i < 4)
			sprintf(curPic, "his%i.alg", i);
		else
			strcpy(curPic, "his4_2.alg");

		loadPic(curPic, screenSurface, HALF_PAL);
		centerText(_texthis[i], 180, 180);
		updateScreen();

		if (getScan() != 0) {
			asco();
			return;
		}

		uint32 now = _system->getMillis();
		while (_system->getMillis() - now < 3000 * 2) {
			delay(50);
			if (getScan() != 0) {
				asco();
				return;
			}
		}

		if (i < 4) {
			fadeToBlack(1);
			clearRoom();
			if (getScan() != 0) {
				asco();
				return;
			}
		}
	}

	loadPic("his4_1.alg", bgSurface, HALF_PAL);
	loadPic("his4_2.alg", drawSurface3);

	for (int l = 1; l < 200; l++) {
		copyBackground(0, 0, 0, l, 320, 200 - l, drawSurface3, screenSurface);
		copyBackground(0, 200 - l, 0, 0, 320, l, bgSurface, screenSurface);
		delay(10);
		updateScreen();
		if (getScan() != 0) {
			asco();
			return;
		}
	}

	pause(5);
	fadeToBlack(2);
	clearRoom();

	asco();
}

void DrasculaEngine::animation_20_2() {
	debug(4, "animation_20_2()");

	talk_vonBraun(7, kVonBraunDoor);
	talk_vonBraun(8, kVonBraunDoor);
	talk(383);
	talk_vonBraun(9, kVonBraunDoor);
	talk(384);
	talk_vonBraun(10, kVonBraunDoor);
	talk(385);
	talk_vonBraun(11, kVonBraunDoor);
	if (flags[23] == 0) {
		talk(350);
	talk_vonBraun(57, kVonBraunDoor);
	} else {
		talk(386);
		talk_vonBraun(12, kVonBraunDoor);
		flags[18] = 0;
		flags[14] = 1;
		toggleDoor(15, 1, kOpenDoor);
		exitRoom(1);
		animation_23_2();
		exitRoom(0);
		flags[21] = 0;
		flags[24] = 0;
		trackVonBraun = 1;
		vonBraunX = 120;

		breakOut = 1;
	}
}

void DrasculaEngine::animation_23_2() {
	debug(4, "animation_23_2()");

	int p_x, p_y;
	int maxN;
	int animX, animY;

	// Animation offsets - without earplugs
	int johnFrameX[] = {1, 38, 75, 112, 75, 112, 75, 112, 149, 112, 149, 112, 149, 186, 223, 260,
						1, 38, 75, 112, 149, 112, 149, 112, 149, 112, 149, 186, 223, 260, 260, 260, 260, 223};
	int johnFrameY[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76,
						76, 76, 76, 76, 76, 76, 76, 1, 1, 1, 1};

	// Animation offsets - with earplugs
	int john2FrameX[] = {1, 35, 69, 103, 137, 171, 205, 239, 273, 1, 35, 69, 103, 137};
	int john2FrameY[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 73, 73, 73, 73};

	loadPic("an24.alg", frontSurface);

	flags[21] = 1;

	if (flags[25] == 0) {
		talk_vonBraun(13, kVonBraunDoor);
		talk_vonBraun(14, kVonBraunDoor);
		pause(10);
		talk(387);
	}

	talk_vonBraun(15, kVonBraunNormal);
	placeVonBraun(42);
	trackVonBraun = 1;
	talk_vonBraun(16, kVonBraunNormal);
	trackVonBraun = 2;
	gotoObject(157, 147);
	gotoObject(131, 149);
	trackProtagonist = 0;
	animation_14_2();
	if (flags[25] == 0)
		talk_vonBraun(17, kVonBraunNormal);
	pause(8);
	trackVonBraun = 1;
	talk_vonBraun(18, kVonBraunNormal);

	if (flags[29] == 0)	{
		// John isn't wearing earplugs
		p_x = curX + 2;
		p_y = curY - 3;
		maxN = 34;
		animX = 36;
		animY = 74;

		loadPic("an23.alg", backSurface);
	} else {
		// John is wearing earplugs
		p_x = curX + 4;
		p_y = curY;
		maxN = 14;
		animX = 33;
		animY = 71;

		pause(50);

		loadPic("an23_2.alg", backSurface);
	}

	for (int n = 0; n < maxN; n++) {
		copyRect(p_x, p_y, p_x, p_y, animX, animY, bgSurface, screenSurface);
		if (flags[29] == 0)
			copyRect(johnFrameX[n], johnFrameY[n], p_x, p_y, animX, animY, backSurface, screenSurface);
		else
			copyRect(john2FrameX[n], john2FrameY[n], p_x, p_y, animX, animY, backSurface, screenSurface);
		updateRefresh();
		updateScreen(p_x, p_y, p_x, p_y, animX, animY, screenSurface);
		updateEvents();
		pause(5);
	}

	loadPic(99, backSurface);

	trackVonBraun = 2;
	animation_25_2();
	placeVonBraun(99);

	if (flags[29] == 0) {
		talk_vonBraun(19, kVonBraunNormal);
		if (flags[25] == 0) {
			talk_vonBraun(20, kVonBraunNormal);
			if (removeObject(kItemMoney) == 0)
				flags[30] = 1;
			if (removeObject(kItemTwoCoins) == 0)
				flags[31] = 1;
			if (removeObject(kItemOneCoin) == 0)
				flags[32] = 1;
		}
		talk_vonBraun(21, kVonBraunNormal);
	} else
		animation_27_2();

	flags[25] = 1;
	breakOut = 1;
}

void DrasculaEngine::animation_25_2() {
	debug(4, "animation_25_2()");

	loadPic("an14_2.alg", backSurface);
	loadPic(18, bgSurface);

	flags[24] = 0;

	playSound(6);

	for (int n = 0; n >= -160; n = n - 8) {
		copyBackground();

		updateRefresh_pre();
		moveCharacters();
		moveVonBraun();

		int cY = n;
		copyRect(150, 6, 69, cY, 158, 161, backSurface, screenSurface);

		updateRefresh();
		updateScreen();
		updateEvents();
	}

	finishSound();

	loadPic(99, backSurface);
}

void DrasculaEngine::animation_27_2() {
	debug(4, "animation_27_2()");

	flags[22] = 1;

	selectVerb(kVerbNone);
	removeObject(kItemEarWithEarPlug);
	addObject(kItemEarplugs);

	talk_vonBraun(23, kVonBraunNormal);
	talk_vonBraun(24, kVonBraunNormal);
	if (flags[30] == 1)
		addObject(kItemMoney);
	if (flags[31] == 1)
		addObject(kItemTwoCoins);
	if (flags[32] == 1)
		addObject(kItemOneCoin);
	talk_vonBraun(25, kVonBraunNormal);
	talk_vonBraun(26, kVonBraunNormal);
}

void DrasculaEngine::animation_29_2() {
	debug(4, "animation_29_2()");

	if (flags[33] == 0) {
		playTalkSequence(29);	// sequence 29, chapter 2
	} else
		talk_vonBraun(43, kVonBraunNormal);

	talk(402);
	talk_vonBraun(42, kVonBraunNormal);

	if (flags[38] == 0) {
		talk(403);
		breakOut = 1;
	} else
		talk(386);
}

void DrasculaEngine::animation_31_2() {
	debug(4, "animation_31_2()");

	talk_vonBraun(44, kVonBraunNormal);
	placeVonBraun(-50);
	pause(15);
	gotoObject(159, 140);
	loadPic(99, backSurface);

	playTalkSequence(31);	// sequence 31, chapter 2

	selectVerb(kVerbNone);
	removeObject(kItemLeaves);
	removeObject(kItemBubbleGum);
	removeObject(kItemTissues);
	removeObject(kItemCigarettes);
	removeObject(kItemCandle);
	addObject(kItemReefer);
}

void DrasculaEngine::animation_35_2() {
	debug(4, "animation_35_2()");

	gotoObject(96, 165);
	gotoObject(79, 165);

	updateRoom();
	updateScreen();

	loadPic("an35_1.alg", backSurface);
	loadPic("an35_2.alg", frontSurface);

	updateAnim(1, 70, 90, 46, 80, 6, backSurface);
	updateAnim(82, 70, 90, 46, 80, 6, backSurface);
	updateAnim(1, 70, 90, 46, 80, 6, frontSurface);
	updateAnim(82, 70, 90, 46, 80, 2, frontSurface);

	copyBackground();

	updateScreen();

	pause(19);

	playSound(1);
	hipo_sin_nadie(18);
	finishSound();

	pause(10);

	fadeToBlack(2);
}

void DrasculaEngine::animation_2_3() {
	debug(4, "animation_2_3()");

	flags[0] = 1;
	playMusic(13);

	int px = curX - 20, py = curY - 1;

	loadPic("an2y_1.alg", frontSurface);
	loadPic("an2y_2.alg", extraSurface);
	loadPic("an2y_3.alg", backSurface);

	updateAnim(2, px, py, 71, 72, 4, frontSurface, 3, true);
	updateAnim(75, px, py, 71, 72, 4, frontSurface, 3, true);
	updateAnim(2, px, py, 71, 72, 4, extraSurface, 3, true);
	updateAnim(75, px, py, 71, 72, 4, extraSurface, 3, true);
	updateAnim(2, px, py, 71, 72, 4, backSurface, 3, true);
	updateAnim(75, px, py, 71, 72, 4, backSurface, 3, true);

	playMusic(13);

	px = 120;
	py = 63;

	loadPic("any_1.alg", frontSurface);
	loadPic("any_2.alg", extraSurface);
	loadPic("any_3.alg", backSurface);

	updateAnim(1, px, py, 77, 89, 4, frontSurface, 3, true);
	updateAnim(91, px, py, 77, 89, 4, frontSurface, 3, true);
	updateAnim(1, px, py, 77, 89, 4, extraSurface, 3, true);
	updateAnim(91, px, py, 77, 89, 4, extraSurface, 3, true);
	updateAnim(1, px, py, 77, 89, 4, backSurface, 3, true);
	updateAnim(91, px, py, 77, 89, 4, backSurface, 3, true);

	flags[1] = 1;
	updateRoom();
	updateScreen(120, 0, 120, 0, 200, 200, screenSurface);

	px = curX - 20;
	py = curY - 1;

	loadPic("an3y_1.alg", frontSurface);
	loadPic("an3y_2.alg", extraSurface);
	loadPic("an3y_3.alg", backSurface);

	updateAnim(2, px, py, 71, 72, 4, frontSurface, 3, true);
	updateAnim(75, px, py, 71, 72, 4, frontSurface, 3, true);
	updateAnim(2, px, py, 71, 72, 4, extraSurface, 3, true);
	updateAnim(75, px, py, 71, 72, 4, extraSurface, 3, true);
	updateAnim(2, px, py, 71, 72, 4, backSurface, 3, true);
	updateAnim(75, px, py, 71, 72, 4, backSurface, 3, true);

	flags[0] = 0;
	flags[1] = 1;

	loadPic(96, frontSurface);
	loadPic(97, extraSurface);
	loadPic(99, backSurface);

	gotoObject(332, 127);
}

void DrasculaEngine::animation_6_3() {
	debug(4, "animation_6_3()");

	int frame = 0, px = 112, py = 62;
	int yoda_x[] = { 3 ,82, 161, 240, 3, 82 };
	int yoda_y[] = { 3, 3, 3, 3, 94, 94 };

	characterMoved = 0;
	flags[3] = 1;
	updateRoom();
	updateScreen();

	flags[1] = 0;

	loadPic("an4y.alg", frontSurface);

	for (frame = 0; frame < 6; frame++) {
		pause(3);
		copyBackground();
		copyRect(yoda_x[frame], yoda_y[frame], px, py,	78, 90,	frontSurface, screenSurface);
		updateScreen(px, py, px, py, 78, 90, screenSurface);
		updateEvents();
	}

	flags[2] = 1;

	loadPic(96, frontSurface);

	updateRoom();
	updateScreen();
}

void DrasculaEngine::animation_castle() {
	debug(4, "animation_castle()");

	loadPic("anr_1.alg", frontSurface, HALF_PAL);
	loadPic("anr_2.alg", extraSurface);
	loadPic("anr_3.alg", backSurface);
	loadPic("anr_4.alg", bgSurface);
	loadPic("anr_5.alg", drawSurface3);

	updateScreen(0, 0, 0, 0, 320, 200, frontSurface);

	pause(50);

	playSound(5);

	updateScreen(0, 0, 0, 0, 320, 200, extraSurface);
	pause(3);
	updateScreen(0, 0, 0, 0, 320, 200, backSurface);
	pause(3);
	updateScreen(0, 0, 0, 0, 320, 200, bgSurface);
	pause(3);
	updateScreen(0, 0, 0, 0, 320, 200, backSurface);
	pause(3);
	updateScreen(0, 0, 0, 0, 320, 200, drawSurface3);
	pause(3);
	updateScreen(0, 0, 0, 0, 320, 200, frontSurface);
	finishSound();
}

void DrasculaEngine::animation_7_4() {
	debug(4, "animation_7_4()");

	black();
	talk(427);
	fadeFromBlack(1);
	removeObject(8);
	removeObject(10);
	removeObject(12);
	removeObject(16);
	addObject(17);
	flags[30] = 0;
	flags[29] = 0;
}

void DrasculaEngine::animation_1_5() {
	debug(4, "animation_1_5()");

	if (flags[0] == 0) {
		talk(430);
		talk_bj(16);
		talk_bj(17);
		talk_bj(18);
		talk(217);
		talk_bj(19);
		talk(229);
		pause(5);
		gotoObject(114, 170);
		trackProtagonist = 3;
		talk(431);
		talk_bj(20);
		trackProtagonist = 2;
		pause(4);
		talk(438);
		roomX = 120;
		roomY = 157;
		walkToObject = 1;
		trackFinal = 1;
		startWalking();
		talk_bj(21);

		while (!shouldQuit()) {
			if (characterMoved == 0)
				break;
			updateRoom();
			updateScreen();
			updateEvents();
		}

		trackProtagonist = 1;
		talk(229);
		flags[0] = 1;
	}

	trackProtagonist = 1;
	converse(8);
}

void DrasculaEngine::animation_5_5(){
	debug(4, "animation_5_5(");

	int h;
	int frame = 0;
	int boneX[] = {1, 99, 197, 1, 99, 197, 1, 99, 197};
	int boneY[] = {1, 1, 1, 66, 66, 66, 131, 131, 131};
	int flyX[] = {1, 63, 125, 187, 249};
	int pixelX = curX - 53, pixelY = curY - 9;

	selectVerb(kVerbNone);
	removeObject(8);

	gotoObject(curX - 19, curY + curHeight);
	trackProtagonist = 1;
	updateRoom();
	updateScreen();

	loadPic("3an5_1.alg", backSurface);
	loadPic("3an5_2.alg", frontSurface);

	for (frame = 0; frame < 9; frame++) {
		pause(3);
		copyBackground();
		copyRect(boneX[frame], boneY[frame], pixelX, pixelY, 97, 64, backSurface, screenSurface);
		updateScreen(pixelX, pixelY, pixelX,pixelY, 97,64, screenSurface);
		updateEvents();
	}

	copyBackground(52, 161, 198, 81, 26, 24, drawSurface3, screenSurface);
	updateScreen(198, 81, 198, 81, 26, 24, screenSurface);

	for (frame = 0; frame < 9; frame++) {
		pause(3);
		copyBackground();
		copyRect(boneX[frame], boneY[frame], pixelX, pixelY, 97, 64, frontSurface, screenSurface);
		updateScreen(pixelX, pixelY, pixelX,pixelY, 97, 64, screenSurface);
		updateEvents();
	}

	flags[6] = 1;
	updateVisible();
	pause(12);

	loadPic(96, frontSurface);
	for (h = 0; h < (200 - 18); h++)
		copyBackground(0, 53, 0, h, 320, 19, frontSurface, screenSurface);

	updateScreen();

	loadPic(101, bgSurface, HALF_PAL);
	loadPic("3an5_3.alg", backSurface);
	loadPic("3an5_4.alg", extraSurface);

	updateScreen(0, 0, 0, 0, 320, 200, bgSurface);
	pause(9);
	for (frame = 0; frame < 5; frame++) {
		pause(3);
		copyBackground(flyX[frame], 1, 174, 79, 61, 109, backSurface, screenSurface);
		updateScreen(174, 79, 174, 79, 61, 109, screenSurface);
		updateEvents();
	}
	for (frame = 0; frame < 5; frame++) {
		pause(3);
		copyBackground(flyX[frame], 1, 174, 79, 61, 109, extraSurface, screenSurface);
		updateScreen(174, 79, 174, 79, 61, 109, screenSurface);
		updateEvents();
	}
	updateScreen(0, 0, 0, 0, 320, 200, bgSurface);

	playSound(1);
	finishSound();

	loadPic(99, backSurface);
	loadPic(97, extraSurface);

	clearRoom();

	loadPic(49, bgSurface, HALF_PAL);
}

void DrasculaEngine::animation_12_5() {
	debug(4, "animation_12_5()");

	DacPalette256 bgPalette1;
	DacPalette256 bgPalette2;
	DacPalette256 bgPalette3;

	int frame;
	const int rayX[] = {1, 46, 91, 136, 181, 226, 271, 181};
	const int frusky_x[] = {100, 139, 178, 217, 100, 178, 217, 139, 100, 139};
	const int elfrusky_x[] = {1, 68, 135, 1, 68, 135, 1, 68, 135, 68, 1, 135, 68, 135, 68};
	int color, component;
	signed char fade;

	playMusic(26);
	updateRoom();
	updateScreen();
	pause(27);
	animate("rayo1.bin", 23);
	playSound(5);
	animate("rayo2.bin", 17);
	trackProtagonist = 1;
	updateRoom();
	updateScreen();

	setDefaultPalette(darkPalette);

	for (color = 0; color < 255; color++)
		for (component = 0; component < 3; component++) {
			bgPalette1[color][component] = gamePalette[color][component];
			bgPalette2[color][component] = gamePalette[color][component];
			bgPalette3[color][component] = gamePalette[color][component];
		}

	for (fade = 3; fade >= 0; fade--) {
		for (color = 0; color < 128; color++) {
			for (component = 0; component < 3; component++) {
				bgPalette3[color][component] = adjustToVGA(bgPalette3[color][component] - 8 + fade);
				if (fade <= 2)
					bgPalette2[color][component] = adjustToVGA(bgPalette2[color][component] - 8 + fade);
				if (fade <= 1)
					bgPalette1[color][component] = adjustToVGA(bgPalette1[color][component] - 8 + fade);
			}
		}
	}

	loadPic("3an11_1.alg", backSurface);

	for (frame = 0; frame < 8; frame++) {
		if (frame == 2 || frame == 4 || frame == 8 || frame == 10)
			setPalette((byte *)&bgPalette1);
		else if (frame == 1 || frame == 5 || frame == 7 || frame == 9)
			setPalette((byte *)&bgPalette2);
		else
			setPalette((byte *)&bgPalette3);

		pause(4);
		updateRoom();
		copyRect(rayX[frame], 1, 41, 0, 44, 44, backSurface, screenSurface);
		copyRect(frusky_x[frame], 113, 205, 50, 38, 86, drawSurface3, screenSurface);
		updateScreen();
		updateEvents();
	}

	stopSound();

	for (frame = 0; frame < 15; frame++) {
		if (frame == 2 || frame == 4 || frame == 7 || frame == 9)
			setPalette((byte *)&bgPalette1);
		else if (frame == 1 || frame == 5)
			setPalette((byte *)&gamePalette);
		else
			setPalette((byte *)&bgPalette2);

		pause(4);
		updateRoom();
		copyRect(elfrusky_x[frame], 47, 192, 39, 66, 106, backSurface, screenSurface);
		updateScreen();
		updateEvents();
	}

	animate("frel.bin", 16);
	clearRoom();
	setDefaultPalette(brightPalette);
	setPalette((byte *)&gamePalette);

	flags[1] = 1;

	animation_12_5_frankenstein();

	playSound(1);
	hiccup(12);
	finishSound();

	loadPic(99, backSurface);

	gotoObject(40, 169);
	gotoObject(-14, 175);

	doBreak = 1;
	previousMusic = roomMusic;
	characterVisible = 1;
	clearRoom();
	trackProtagonist = 1;
	characterMoved = 0;
	curX = -1;
	objExit = 104;
	selectVerb(kVerbNone);
	enterRoom(57);
}

void DrasculaEngine::animation_12_5_frankenstein() {
	int frank_x = 199;
	int frus_x[] = {1, 46, 91, 136, 181, 226, 271};
	int frus_y[] = {1, 1, 1, 1, 1, 1, 1, 89};
	int frame = 0;

	loadPic("auxfr.alg", backSurface);

	updateRoom();
	copyRect(1, 1, frank_x, 81, 44, 87, backSurface, screenSurface);
	updateScreen();
	pause(15);

	playMusic(18);

	while (!shouldQuit()) {
		updateRoom();
		copyRect(frus_x[frame], frus_y[frame], frank_x, 81, 44, 87, backSurface, screenSurface);
		updateScreen();
		frank_x -= 5;
		frame++;
		if (frank_x <= -45)
			break;
		if (frame == 7) {
			frame = 0;
			trackProtagonist = 3;
		}
		updateEvents();
		pause(6);
	}
}

void DrasculaEngine::animation_14_5() {
	debug(4, "animation_14_5()");

	flags[11] = 1;
	playSound(3);
	updateRoom();
	updateScreen(0, 0, 0,0 , 320, 200, screenSurface);
	finishSound();
	pause(17);
	trackProtagonist = 3;
	talk(246);
	gotoObject(89, 160);
	flags[10] = 1;
	playSound(7);
	updateRoom();
	updateScreen();
	finishSound();
	pause(14);
	trackProtagonist = 3;
	updateRoom();
	updateScreen();
	talk_solo(_textd[18], "d18.als");
	fadeToBlack(1);
}

void DrasculaEngine::animation_1_6() {
	debug(4, "animation_1_6()");

	hideCursor();
	trackProtagonist = 0;
	curX = 103;
	curY = 108;
	flags[0] = 1;
	for (int l = 0; l < 200; l++)
		factor_red[l] = 98;

	loadPic("auxig2.alg", frontSurface);
	loadPic("auxdr.alg", drawSurface2);
	loadPic("car.alg", backSurface);
	talk_drascula(19, 1);
	talk(247);
	talk_drascula(20, 1);
	talk_drascula(21, 1);
	talk(248);
	talk_drascula(22, 1);
	talk(249);
	talk_drascula(23, 1);
	converse(11);
	talk_drascula(26, 1);

	animate("fum.bin", 15);

	talk_drascula(27, 1);
	talk(254);
	talk_drascula(28, 1);
	talk(255);
	talk_drascula(29, 1);
	updateEvents();
	fadeToBlack(1);
	updateEvents();
	clearRoom();
	loadPic("time1.alg", screenSurface);
	updateScreen();
	updateEvents();
	delay(930);
	updateEvents();
	clearRoom();
	black();
	characterVisible = 0;
	flags[0] = 0;
	updateRoom();
	updateScreen();
	fadeFromBlack(1);
	talk(256);
	talk_drascula(30, 1);
	talk(257);
	fadeToBlack(0);
	updateEvents();
	clearRoom();
	loadPic("time1.alg", screenSurface);
	updateScreen();
	updateEvents();
	delay(900);
	updateEvents();
	clearRoom();
	black();
	updateRoom();
	updateScreen();
	fadeFromBlack(1);
	talk(258);
	talk_drascula(31, 1);
	animation_5_6();
	talk_drascula(32, 1);
	talk_igor(11, kIgorDch);
	trackIgor = 3;
	talk_drascula(33, 1);
	talk_igor(12, kIgorFront);
	talk_drascula(34, 1);
	trackDrascula = 0;
	talk_drascula(35);

	clearRoom();
	enterRoom(102);
	activatePendulum();
}

void DrasculaEngine::animation_5_6() {
	debug(4, "animation_5_6()");

	animate("man.bin", 14);

	for (int n = -125; n <= 0; n = n + 2) {
		copyBackground();
		updateRefresh_pre();
		int pY = n;
		copyRect(1, 29, 204, pY, 18, 125, drawSurface3, screenSurface);

		updateRefresh();
		updateScreen();
		updateEvents();

		pause(2);
	}

	flags[3] = 1;
}

void DrasculaEngine::animation_6_6() {
	debug(4, "animation_6_6()");

	animate("rct.bin", 11);
	clearRoom();
	selectVerb(kVerbNone);
	removeObject(20);
	loadPic(96, frontSurface);
	loadPic(97, frontSurface);
	loadPic(97, _lang == kSpanish ? tableSurface : extraSurface);
	loadPic(99, backSurface);
	doBreak = 1;
	objExit = 104;
	curX = -1;
	selectVerb(kVerbNone);
	enterRoom(58);
	characterVisible = 1;
	trackProtagonist = 1;
	animate("hbp.bin", 14);

	trackProtagonist = 3;
	flags[0] = 1;
	flags[1] = 0;
	flags[2] = 1;
}

void DrasculaEngine::animation_9_6() {
	debug(4, "animation_9_6()");

	int v_cd;

	(void)animate("fin.bin", 14);
	playMusic(13);
	flags[5] = 1;
	(void)animate("drf.bin", 16);
	fadeToBlack(0);
	clearRoom();
	curX = -1;
	objExit = 108;
	enterRoom(59);
	// The room number was originally changed here to "nada.alg",
	// which is a non-existent file. In reality, this was just a
	// hack to set the room number to a non-existent one, so that
	// room sprites do not appear again when the room is refreshed.
	// We set the room number to -1 for the same purpose.
	// Also check animation_2_1(), where the same hack was used
	// by the original
	_roomNumber = -2;
	loadPic("nota2.alg", bgSurface, HALF_PAL);
	black();
	trackProtagonist = 1;
	curX -= 21;
	updateRoom();
	updateScreen();
	fadeFromBlack(0);
	pause(96);
	gotoObject(116, 178);
	trackProtagonist = 2;
	updateRoom();
	updateScreen();
	playMusic(9);
	clearRoom();
	loadPic("nota.alg", bgSurface, COMPLETE_PAL);
	color_abc(kColorWhite);
	talk_solo(_textbj[24], "bj24.als");
	talk_solo(_textbj[25], "bj25.als");
	talk_solo(_textbj[26], "bj26.als");
	talk_solo(_textbj[27], "bj27.als");
	talk_solo(_textbj[28], "bj28.als");
	trackProtagonist = 3;
	clearRoom();
	loadPic(96, frontSurface, COMPLETE_PAL);
	loadPic("nota2.alg", bgSurface, HALF_PAL);
	talk(296);
	talk(297);
	talk(298);
	trackProtagonist = 1;
	talk(299);
	talk(300);
	updateRoom();
	copyBackground(0, 0, 0, 0, 320, 200, screenSurface, bgSurface);
	updateScreen();
	color_abc(kColorLightGreen);
	talk_solo(_textmisc[2], "s15.als");
	loadPic("nota2.alg", bgSurface);
	trackProtagonist = 0;
	updateRoom();
	updateScreen();
	talk(301);
	v_cd = _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType) / 16;
	v_cd += 4;
	playMusic(17);
	fadeToBlack(1);
	clearRoom();
	playFLI("qpc.bin", 1);
	MusicFadeout();
	stopMusic();
	clearRoom();
	_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, v_cd * 16);
	playMusic(3);
	playFLI("crd.bin", 1);
	stopMusic();
}

void DrasculaEngine::animation_19_6() {
	debug(4, "animation_19_6()");

	copyBackground();
	copyBackground(140, 23, 161, 69, 35, 80, drawSurface3, screenSurface);

	updateRefresh_pre();
	moveCharacters();
	updateScreen();
	pause(6);
	updateRoom();
	updateScreen();
	playSound(4);
	pause(6);
	finishSound();
}

void DrasculaEngine::animation_12_2() {
	debug(4, "animation_12_2()");

	loadPic("an12.alg", extraSurface);

	talk(356);

	updateRefresh_pre();

	copyBackground(1, 139, 228, 112, 47, 60, extraSurface, screenSurface);
	updateScreen(228, 112, 228, 112, 47, 60, screenSurface);

	pause(3);

	updateRefresh_pre();

	copyBackground(49, 139, 228, 112, 47, 60, extraSurface, screenSurface);
	moveCharacters();

	updateScreen();

	pause(3);
	stopMusic();
	flags[11] = 1;

	talk_pianist(5);
	converse(1);

	flags[11] = 0;
	loadPic(974, extraSurface);
}

void DrasculaEngine::animation_26_2() {
	debug(4, "animation_26_2()");

	loadPic("an12.alg", extraSurface);

	talk(392);

	updateRefresh_pre();

	copyBackground(1, 139, 228, 112, 47, 60, extraSurface, screenSurface);
	updateScreen(228, 112, 228, 112, 47, 60, screenSurface);

	pause(3);

	updateRefresh_pre();

	copyBackground(49, 139, 228, 112, 47, 60, extraSurface, screenSurface);
	moveCharacters();

	updateScreen();

	pause(3);
	stopMusic();
	flags[11] = 1;

	talk_pianist(5);
	talk(393);
	talk_pianist(17);
	talk_pianist(18);
	talk_pianist(19);

	loadPic("an26.alg", extraSurface);

	updateAnim(1, 225, 113, 50, 59, 6, extraSurface);

	int	x = 0;
	for (int n = 0; n < 6; n++) {
		x++;
		copyBackground(x, 61, 225, 113, 50, 59, extraSurface, screenSurface);
		updateScreen(225, 113, 225, 113, 50, 59, screenSurface);
		x = x + 50;
		if (n == 2)
			playSound(9);
		updateEvents();
		pause(3);
	}

	stopSound();

	updateAnim(121, 225, 113, 50, 59, 6, extraSurface);

	pickObject(11);
	removeObject(kItemBook);

	flags[11] = 0;
	flags[39] = 1;
	loadPic(974, extraSurface);
	roomMusic = 16;
}

void DrasculaEngine::animation_11_2() {
	debug(4, "animation_11_2()");

	loadPic("an11y13.alg", extraSurface);

	playTalkSequence(11);	// sequence 11, chapter 2

	loadPic(974, extraSurface);
}

void DrasculaEngine::animation_13_2() {
	debug(4, "animation_13_2()");

	loadPic("an11y13.alg", frontSurface);

	if (flags[41] == 0) {
		playTalkSequence(13);	// sequence 13, chapter 2
	}

	loadPic(964, frontSurface);
}

void DrasculaEngine::animation_24_2() {
	debug(4, "animation_24_2()");

	if (curX < 178)
		gotoObject(208, 136);
	trackProtagonist = 3;
	updateRoom();
	pause(3);
	trackProtagonist = 0;

	talk(356);

	loadPic("an24.alg", frontSurface);

	loadPic("an32_1.alg", drawSurface3);
	loadPic("an32_2.alg", backSurface);

	updateAnim(1, 113, 53, 65, 81, 4, drawSurface3, 4);
	updateAnim(83, 113, 53, 65, 81, 4, drawSurface3, 4);
	updateAnim(1, 113, 53, 65, 81, 4, backSurface, 4);

	int x = 0;
	for (int n = 0; n < 3; n++) {
		x++;
		copyBackground(x, 83, 113, 53, 65, 81, backSurface, screenSurface);
		updateScreen(113, 53, 113, 53, 65, 81, screenSurface);
		x = x + 65;
		if (n < 2)
			pause(4);

		updateEvents();
	}

	loadPic("aux18.alg", drawSurface3);

	flags[21] = 1;

	talk_vonBraun(22, kVonBraunNormal);

	if (flags[22] == 0)
		converse(4);
	else
		converse(5);

	exitRoom(0);
	flags[21] = 0;
	flags[24] = 0;
	trackVonBraun = 1;
	vonBraunX = 120;
}

void DrasculaEngine::animation_34_2() {
	debug(4, "animation_34_2()");

	trackProtagonist = 1;
	updateRoom();
	updateScreen();

	loadPic("an34_1.alg", backSurface);
	loadPic("an34_2.alg", extraSurface);

	updateAnim(1, 218, 79, 83, 75, 3, backSurface);
	updateAnim(77, 218, 79, 83, 75, 3, backSurface);

	playSound(8);

	updateAnim(1, 218, 79, 83, 75, 3, extraSurface);

	finishSound();

	pause(30);

	copyBackground(1, 77, 218, 79, 83, 75, extraSurface, screenSurface);
	updateScreen(218, 79, 218, 79, 83, 75, screenSurface);
	pause(3);

	loadPic(994, backSurface);
	loadPic(974, extraSurface);
}

void DrasculaEngine::animation_36_2() {
	debug(4, "animation_36_2()");

	loadPic("an11y13.alg", extraSurface);

	talk(404);
	talk_bartender(19);
	talk_bartender(20);
	talk_bartender(21);
	talk(355);
	pause(40);
	talk_bartender(82);

	loadPic(974, extraSurface);
}

// Use sickle on plant
void DrasculaEngine::animation_7_2() {
	debug(4, "animation_7_2()");

	loadPic("an7_1.alg", backSurface);
	loadPic("an7_2.alg", extraSurface);
	loadPic("an7_3.alg", frontSurface);

	if (flags[3] == 1)
		copyBackground(258, 110, 85, 44, 23, 53, drawSurface3, bgSurface);

	copyBackground();

	updateScreen();

	updateAnim(1, 80, 64, 51, 73, 6, backSurface, 3, true);
	updateAnim(75, 80, 64, 51, 73, 6, backSurface, 3, true);
	updateAnim(1, 80, 64, 51, 73, 6, extraSurface, 3, true);
	updateAnim(75, 80, 64, 51, 73, 6, extraSurface, 3, true);
	updateAnim(1, 80, 64, 51, 73, 6, frontSurface, 3, true);

	loadPic("an7_4.alg", backSurface);
	loadPic("an7_5.alg", extraSurface);
	loadPic("an7_6.alg", frontSurface);
	loadPic("an7_7.alg", drawSurface3);

	updateAnim(1, 80, 64, 51, 73, 6, backSurface, 3, true);
	updateAnim(75, 80, 64, 51, 73, 6, backSurface, 3, true);
	updateAnim(1, 80, 64, 51, 73, 6, extraSurface, 3, true);
	updateAnim(75, 80, 64, 51, 73, 6, extraSurface, 3, true);
	updateAnim(1, 80, 64, 51, 73, 6, frontSurface, 3, true);
	updateAnim(75, 80, 64, 51, 73, 6, extraSurface, 3, true);
	updateAnim(1, 80, 64, 51, 73, 6, frontSurface, 3, true);
	updateAnim(75, 80, 64, 51, 73, 6, frontSurface, 3, true);
	updateAnim(1, 80, 64, 51, 73, 6, drawSurface3, 3, true);
	updateAnim(75, 80, 64, 51, 73, 2, drawSurface3, 3, true);

	loadPic("an7_8.alg", backSurface);
	loadPic("an7_9.alg", extraSurface);

	updateAnim(1, 80, 64, 51, 73, 6, backSurface, 3, true);
	updateAnim(75, 80, 64, 51, 73, 6, backSurface, 3, true);
	updateAnim(1, 80, 64, 51, 73, 6, extraSurface, 3, true);

	copyBackground(80, 64, 80, 64, 51, 73, bgSurface, screenSurface);
	copyRect(1, 75, 80, 64, 51, 73, extraSurface, screenSurface);
	updateScreen(80, 64, 80, 64, 51, 73, screenSurface);

	flags[37] = 1;

	if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1)
		flags[38] = 1;

	loadPic(99, backSurface);
	loadPic(97, extraSurface);
	loadPic(96, frontSurface);
	loadPic("aux3.alg", drawSurface3);
}

void DrasculaEngine::animation_5_2() {
	debug(4, "animation_5_2()");

	trackProtagonist = 0;
	updateRoom();
	updateScreen();

	loadPic("an5_1.alg", backSurface);
	loadPic("an5_2.alg", extraSurface);
	loadPic("an5_3.alg", frontSurface);
	loadPic("an5_4.alg", drawSurface3);

	copyBackground(1, 1, 213, 66,	53,84, backSurface, screenSurface);
	updateScreen();

	updateAnim(1, 213, 66, 52, 84, 6, backSurface);
	updateAnim(86, 213, 66, 52, 84, 6, backSurface);
	updateAnim(1, 213, 66, 52, 84, 6, extraSurface);
	updateAnim(1, 213, 66, 52, 84, 6, extraSurface);
	updateAnim(86, 213, 66, 52, 84, 6, extraSurface);
	updateAnim(1, 213, 66, 52, 84, 6, frontSurface);

	playSound(1);
	updateAnim(86, 213, 66, 52, 84, 6, frontSurface);
	stopSound();

	updateAnim(1, 213, 66, 52, 84, 6, drawSurface3);

	loadPic(994, backSurface);
	loadPic(974, extraSurface);
	loadPic(964, frontSurface);
	loadPic("aux5.alg", drawSurface3);
	flags[8] = 1;
	curX = curX - 4;
	talk_sync(_text[46], "46.als", "4442444244244");
	selectVerb(kVerbNone);
}

void DrasculaEngine::animation_6_2() {
	debug(4, "animation_6_2()");

	stopMusic();
	flags[9] = 1;

	clearRoom();
	loadPic("ciego1.alg", bgSurface, HALF_PAL);	// ciego = blind
	loadPic("ciego2.alg", drawSurface3);
	loadPic("ciego3.alg", extraSurface);
	loadPic("ciego4.alg", backSurface);
	loadPic("ciego5.alg", frontSurface);

	copyBackground();
	updateScreen();

	pause(1);

	if (flags[4] == 1)
		talk_hacker(66);
	pause(6);
	talk_blind(11);
	pause(4);
	talk_hacker(67);

	copyBackground();
	updateScreen();

	pause(10);

	clearRoom();

	playMusic(roomMusic);
	loadPic(9, bgSurface, HALF_PAL);
	loadPic("aux9.alg", drawSurface3);
	loadPic(96, frontSurface);
	loadPic(97, extraSurface);
	loadPic(99, backSurface);
	selectVerb(kVerbNone);

	flags[9] = 0;
}

void DrasculaEngine::animation_1_4() {
	debug(4, "animation_1_4()");

	if (flags[21] == 0) {
		strcpy(objName[2], "igor");
		talk(275);

		updateRefresh_pre();

		copyBackground(131, 133, 199, 95, 50, 66, drawSurface3, screenSurface);
		updateScreen(199, 95, 199, 95, 50, 66, screenSurface);

		pause(3);

		updateRefresh_pre();

		copyBackground(182, 133, 199, 95, 50, 66, drawSurface3, screenSurface);
		moveCharacters();

		updateScreen();

		pause(3);
		flags[18] = 1;
		flags[20] = 1;

		talk_igor(13, kIgorSeated);
		talk_igor(14, kIgorSeated);
		talk_igor(15, kIgorSeated);
		flags[21] = 1;
	} else {
		talk(356);

		updateRefresh_pre();

		copyBackground(131, 133, 199, 95, 50, 66, drawSurface3, screenSurface);
		updateScreen(199, 95, 199, 95, 50, 66, screenSurface);
		pause(2);

		updateRefresh_pre();

		copyBackground(182, 133, 199, 95, 50, 66, drawSurface3, screenSurface);
		moveCharacters();

		updateScreen();

		flags[18] = 1;
		flags[20] = 1;

		talk(276);
		pause(14);
		talk_igor(6, kIgorSeated);
	}

	converse(6);
	flags[20] = 0;
	flags[18] = 0;
}

void DrasculaEngine::animation_5_4(){
	debug(4, "animation_5_4(");

	trackProtagonist = 3;
	loadPic("anh_dr.alg", backSurface);
	gotoObject(99, 160);
	gotoObject(38, 177);
	characterVisible = 0;
	updateRoom();
	updateScreen();
	delay(800);
	animate("bio.bin", 14);
	flags[29] = 1;
	curX = 95;
	curY = 82;
	updateRoom();
	updateScreen();
	toggleDoor(2, 0, kOpenDoor);
	loadPic("auxigor.alg", frontSurface);
	igorX = 100;
	igorY = 65;
	talk_igor(29, kIgorFront);
	talk_igor(30, kIgorFront);
	loadPic(96, frontSurface);
	loadPic(99, backSurface);
	characterVisible = 1;
	fadeToBlack(0);
	exitRoom(0);
}

void DrasculaEngine::animation_6_4() {
	debug(4, "animation_6_4()");

	int prevRoom = _roomNumber;

	_roomNumber = 26;
	clearRoom();
	loadPic(26, bgSurface, HALF_PAL);
	loadPic("aux26.alg", drawSurface3);
	loadPic("auxigor.alg", frontSurface);
	copyBackground();
	update_26_pre();
	igorX = 104;
	igorY = 71;
	placeIgor();
	updateScreen();
	pause(40);
	talk_igor(26, kIgorFront);
	_roomNumber = prevRoom;
	clearRoom();
	loadPic(96, frontSurface);
	loadPic(roomDisk, drawSurface3);
	loadPic(_roomNumber, bgSurface, HALF_PAL);
	selectVerb(kVerbNone);
	updateRoom();
}

void DrasculaEngine::animation_8_4() {
	debug(4, "animation_8_4()");

	int bookcaseX[] = {1, 75, 149, 223, 1, 75, 149, 223, 149, 223, 149, 223, 149, 223};
	int bookcaseY[] = {1, 1, 1, 1, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74};

	loadPic("an_8.alg", frontSurface);

	for (int frame = 0; frame < 14; frame++) {
		pause(2);
		copyBackground(bookcaseX[frame], bookcaseY[frame], 77, 45, 73, 72, frontSurface, screenSurface);
		updateScreen(77, 45, 77, 45, 73, 72, screenSurface);
		updateEvents();
	}

	loadPic(96, frontSurface);
	toggleDoor(7, 2, kOpenDoor);
}

void DrasculaEngine::activatePendulum() {
	debug(4, "activatePendulum()");

	flags[1] = 2;
	characterVisible = 0;
	_roomNumber = 102;
	loadPic(102, bgSurface, HALF_PAL);
	loadPic("an_p1.alg", drawSurface3);
	loadPic("an_p2.alg", _lang == kSpanish ? tableSurface : extraSurface);
	loadPic("an_p3.alg", frontSurface);

	copyBackground(0, 171, 0, 0, OBJWIDTH, OBJHEIGHT, backSurface, drawSurface3);

	savedTime = getTime();
}

} // End of namespace Drascula
