From 6a98108eac1203eaf1058fa24ad9c80fc9ba45a8 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 2 May 2008 13:26:48 +0000 Subject: Move talk_* to talk.cpp svn-id: r31815 --- engines/drascula/drascula.cpp | 6259 ++++++++++++++--------------------------- engines/drascula/module.mk | 3 +- engines/drascula/talk.cpp | 2053 ++++++++++++++ 3 files changed, 4173 insertions(+), 4142 deletions(-) create mode 100644 engines/drascula/talk.cpp (limited to 'engines/drascula') diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 34fe2c4760..9eedf370ae 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -2125,4307 +2125,2377 @@ void DrasculaEngine::pon_bj() { copyRectClip(pos_bj, dir_dibujo3, dir_zona_pantalla); } -void DrasculaEngine::talk_igor_dch(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[8] = { 56, 82, 108, 134, 160, 186, 212, 238 }; - int cara; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(BLANCO); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - pon_igor(); - pon_dr(); - copyBackground(x_igor + 17, y_igor, x_igor + 17, y_igor, 37, 24, dir_dibujo1, dir_zona_pantalla); - - copyRect(x_talk[cara], 148, x_igor + 17, y_igor, 25, 24, dir_hare_frente, dir_zona_pantalla); - - updateRefresh(); +void DrasculaEngine::hipo(int contador) { + int y = 0, sentido = 0; + if (num_ejec == 3) + y = -1; - if (con_voces == 0) - centra_texto(dicho, x_igor + 26, y_igor); +comienza: + contador--; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateRoom(); + if (num_ejec == 3) + updateScreen(0, 0, 0, y, 320, 200, dir_zona_pantalla); + else + updateScreen(0, 1, 0, y, 320, 198, dir_zona_pantalla); - pause(3); + if (sentido == 0) + y++; + else + y--; - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); + if (num_ejec == 3) { + if (y == 1) + sentido = 1; + if (y == -1) + sentido = 0; } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_dr_izq(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 }; - int cara; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(ROJO); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + if (y == 2) + sentido = 1; + if (y == 0) + sentido = 0; } + if (contador > 0) + goto comienza; -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - pon_igor(); - pon_dr(); - if (num_ejec == 6) - pon_hare(); - - copyBackground(x_dr, y_dr, x_dr, y_dr, 38, 31, dir_dibujo1, dir_zona_pantalla); - if (num_ejec == 6) - copyRect(x_talk[cara], 90, x_dr, y_dr, 38, 31, dir_dibujo2, dir_zona_pantalla); - else - copyRect(x_talk[cara], 90, x_dr, y_dr, 38, 31, dir_hare_fondo, dir_zona_pantalla); - - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, x_dr + 19, y_dr); - + updateRoom(); updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} - pause(3); +void DrasculaEngine::fin_sound() { + delay(1); - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - buffer_teclado(); if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; + while (LookForFree() != 0); delete sku; sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; } - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::talk_dr_dch(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 }; - int cara; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(ROJO); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } +void DrasculaEngine::playmusic(int p) { + AudioCD.stop(); + AudioCD.play(p - 1, 1, 0, 0); +} -bucless: +void DrasculaEngine::stopmusic() { + AudioCD.stop(); +} - cara = _rnd->getRandomNumber(7); +int DrasculaEngine::music_status() { + return AudioCD.isPlaying(); +} +void DrasculaEngine::updateRoom() { copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); updateRefresh_pre(); - - pon_igor(); - pon_dr(); - if (num_ejec == 6) - pon_hare(); - - copyBackground(x_dr, y_dr, x_dr, y_dr, 45, 31, dir_dibujo1, dir_zona_pantalla); - if (num_ejec != 6) - copyRect(x_talk[cara], 58, x_dr + 7, y_dr, 38, 31, dir_hare_fondo, dir_zona_pantalla); - else - copyRect(x_talk[cara], 58, x_dr + 7, y_dr, 38, 31, dir_dibujo2, dir_zona_pantalla); - - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, x_dr + 19, y_dr); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); + if (num_ejec == 3) { + if (flags[0] == 0) + pon_hare(); + else + copyRect(113, 54, hare_x - 20, hare_y - 1, 77, 89, dir_dibujo3, dir_zona_pantalla); } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } - - if (num_ejec == 6) - updateRoom(); - - pon_igor(); - pon_dr(); - if (num_ejec == 6) pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + } + updateRefresh(); } -void DrasculaEngine::talk_solo(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - if (num_ejec == 1) - color_abc(color_solo); - else if (num_ejec == 4) - color_abc(ROJO); +bool DrasculaEngine::carga_partida(const char *nom_game) { + int l, n_ejec2; + Common::InSaveFile *sav; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + if (!(sav = _saveFileMan->openForLoading(nom_game))) { + error("missing savegame file"); } - if (num_ejec == 6) - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - -bucless: - - if (con_voces == 0) { - if (num_ejec == 1) - centra_texto(dicho, 156, 90); - else if (num_ejec == 6) - centra_texto(dicho, 213, 72); - else if (num_ejec == 5) - centra_texto(dicho, 173, 92); + n_ejec2 = sav->readSint32LE(); + if (n_ejec2 != num_ejec) { + strcpy(nom_partida, nom_game); + num_ejec = n_ejec2 - 1; + hay_que_load = 1; + return false; } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + sav->read(datos_actuales, 20); + hare_x = sav->readSint32LE(); + hare_y = sav->readSint32LE(); + sentido_hare = sav->readSint32LE(); - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + for (l = 1; l < 43; l++) { + objetos_que_tengo[l] = sav->readSint32LE(); } - if (num_ejec == 6) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + for (l = 0; l < NUM_BANDERAS; l++) { + flags[l] = sav->readSint32LE(); } -} -void DrasculaEngine::talk_igor_frente(const char *dicho, const char *filename) { - int tiempou; - long tiempol; + lleva_objeto = sav->readSint32LE(); + objeto_que_lleva = sav->readSint32LE(); + hay_que_load = 0; - int x_talk[8] = { 56, 86, 116, 146, 176, 206, 236, 266 }; - int cara; + return true; +} - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); +void DrasculaEngine::puertas_cerradas(int l) { + if (num_ejec == 1 || num_ejec == 3 || num_ejec == 5 || num_ejec == 6) + return; + else if (num_ejec == 2) { + if (num_obj[l] == 138 && flags[0] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 138 && flags[0] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 136 && flags[8] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 136 && flags[8] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 156 && flags[16] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 156 && flags[16] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 163 && flags[17] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 163 && flags[17] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 177 && flags[15] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 177 && flags[15] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 175 && flags[40] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 175 && flags[40] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 173 && flags[36] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 173 && flags[36] == 1) + espuerta[l] = 1; + } else if (num_ejec == 4) { + if (num_obj[l] == 101 && flags[0] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 101 && flags[0] == 1 && flags[28] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 103 && flags[0] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 103 && flags[0] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 104 && flags[1] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 104 && flags[1] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 105 && flags[1] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 105 && flags[1] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 106 && flags[2] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 106 && flags[2] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 107 && flags[2] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 107 && flags[2] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 110 && flags[6] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 110 && flags[6] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 114 && flags[4] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 114 && flags[4] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 115 && flags[4] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 115 && flags[4] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 116 && flags[5] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 116 && flags[5] == 1 && flags[23] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 117 && flags[5] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 117 && flags[5] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 120 && flags[8] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 120 && flags[8] == 1) + espuerta[l] = 1; + else if (num_obj[l] == 122 && flags[7] == 0) + espuerta[l] = 0; + else if (num_obj[l] == 122 && flags[7] == 1) + espuerta[l] = 1; + } +} - color_abc(BLANCO); +void DrasculaEngine::color_hare() { + int color, componente; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + for (color = 235; color < 253; color++) { + for (componente = 0; componente < 3; componente++) { + palJuego[color][componente] = palHare[color][componente]; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); } + ActualizaPaleta(); +} -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - if (num_ejec == 1 || num_ejec == 4) - pon_igor(); - if (num_ejec == 1) - pon_dr(); - if (num_ejec == 1 || num_ejec == 6) - copyBackground(x_igor, y_igor, x_igor, y_igor, 29, 25, dir_dibujo1, dir_zona_pantalla); - copyRect(x_talk[cara], 173, x_igor, y_igor, 29, 25, dir_hare_frente, dir_zona_pantalla); - - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, x_igor + 26, y_igor); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } +void DrasculaEngine::funde_hare(int oscuridad) { + char fundido; + unsigned int color, componente; - if (num_ejec == 6) { - updateRoom(); + for (fundido = oscuridad; fundido >= 0; fundido--) { + for (color = 235; color < 253; color++) { + for (componente = 0; componente < 3; componente++) + palJuego[color][componente] = LimitaVGA(palJuego[color][componente] - 8 + fundido); + } } - if (num_ejec == 1) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + ActualizaPaleta(); } -void DrasculaEngine::talk_tabernero(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[9] = { 1, 23, 45, 67, 89, 111, 133, 155, 177 }; - int cara; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(MARRON); +void DrasculaEngine::paleta_hare_claro() { + int color, componente; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + for (color = 235; color < 253; color++) { + for (componente = 0; componente < 3; componente++) + palHareClaro[color][componente] = palJuego[color][componente]; } +} -bucless: +void DrasculaEngine::paleta_hare_oscuro() { + int color, componente; - if (num_ejec == 1) { - if (music_status() == 0) - playmusic(musica_room); - } else if (num_ejec == 2) { - if (music_status() == 0 && flags[11] == 0 && musica_room != 0) - playmusic(musica_room); + for (color = 235; color < 253; color++) { + for (componente = 0; componente < 3; componente++) + palHareOscuro[color][componente] = palJuego[color][componente]; } +} - cara = _rnd->getRandomNumber(8); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); +void DrasculaEngine::hare_claro() { + int color, componente; - copyBackground(x_talk[cara], 2, 121, 44, 21, 24, dir_hare_dch, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + for (color = 235; color < 253; color++) { + for (componente = 0; componente < 3; componente++) + palJuego[color][componente] = palHareClaro[color][componente]; + } - if (con_voces == 0) - centra_texto(dicho, 132, 45); + ActualizaPaleta(); +} - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +void DrasculaEngine::empieza_andar() { + hare_se_mueve = 1; - pause(3); + paso_x = PASO_HARE_X; + paso_y = PASO_HARE_Y; - byte key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete(sku); - ctvd_terminate(); + if (num_ejec == 2) { + if ((sitio_x < hare_x) && (sitio_y <= (hare_y + alto_hare))) + cuadrante_1(); + else if ((sitio_x < hare_x) && (sitio_y > (hare_y + alto_hare))) + cuadrante_3(); + else if ((sitio_x > hare_x + ancho_hare) && (sitio_y <= (hare_y + alto_hare))) + cuadrante_2(); + else if ((sitio_x > hare_x + ancho_hare) && (sitio_y > (hare_y + alto_hare))) + cuadrante_4(); + else if (sitio_y < hare_y + alto_hare) + anda_parriba(); + else if (sitio_y > hare_y + alto_hare) + anda_pabajo(); } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + if ((sitio_x < hare_x + ancho_hare / 2 ) && (sitio_y <= (hare_y + alto_hare))) + cuadrante_1(); + else if ((sitio_x < hare_x + ancho_hare / 2) && (sitio_y > (hare_y + alto_hare))) + cuadrante_3(); + else if ((sitio_x > hare_x + ancho_hare / 2) && (sitio_y <= (hare_y + alto_hare))) + cuadrante_2(); + else if ((sitio_x > hare_x + ancho_hare / 2) && (sitio_y > (hare_y + alto_hare))) + cuadrante_4(); + else + hare_se_mueve = 0; } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + conta_vez = vez(); } -void DrasculaEngine::hipo(int contador) { - int y = 0, sentido = 0; - if (num_ejec == 3) - y = -1; - -comienza: - contador--; - - updateRoom(); - if (num_ejec == 3) - updateScreen(0, 0, 0, y, 320, 200, dir_zona_pantalla); - else - updateScreen(0, 1, 0, y, 320, 198, dir_zona_pantalla); +void DrasculaEngine::pon_hare() { + int pos_hare[6]; + int r; - if (sentido == 0) - y++; - else - y--; + if (hare_se_mueve == 1 && paso_x == PASO_HARE_X) { + for (r = 0; r < paso_x; r++) { + if (num_ejec != 2) { + if (sentido_hare == 0 && sitio_x - r == hare_x + ancho_hare / 2) { + hare_se_mueve = 0; + paso_x = PASO_HARE_X; + paso_y = PASO_HARE_Y; + } + if (sentido_hare == 1 && sitio_x + r == hare_x + ancho_hare / 2) { + hare_se_mueve = 0; + paso_x = PASO_HARE_X; + paso_y = PASO_HARE_Y; + hare_x = sitio_x - ancho_hare / 2; + hare_y = sitio_y - alto_hare; + } + } else if (num_ejec == 2) { + if (sentido_hare == 0 && sitio_x - r == hare_x) { + hare_se_mueve = 0; + paso_x = PASO_HARE_X; + paso_y = PASO_HARE_Y; + } + if (sentido_hare == 1 && sitio_x + r == hare_x + ancho_hare) { + hare_se_mueve = 0; + paso_x = PASO_HARE_X; + paso_y = PASO_HARE_Y; + hare_x = sitio_x - ancho_hare + 4; + hare_y = sitio_y - alto_hare; + } + } + } + } + if (hare_se_mueve == 1 && paso_y == PASO_HARE_Y) { + for (r = 0; r < paso_y; r++) { + if (sentido_hare == 2 && sitio_y - r == hare_y + alto_hare) { + hare_se_mueve = 0; + paso_x = PASO_HARE_X; + paso_y = PASO_HARE_Y; + } + if (sentido_hare == 3 && sitio_y + r == hare_y + alto_hare) { + hare_se_mueve = 0; + paso_x = PASO_HARE_X; + paso_y = PASO_HARE_Y; + } + } + } - if (num_ejec == 3) { - if (y == 1) - sentido = 1; - if (y == -1) - sentido = 0; - } else { - if (y == 2) - sentido = 1; - if (y == 0) - sentido = 0; + if (num_ejec == 1 || num_ejec == 4 || num_ejec == 5 || num_ejec == 6) { + if (hare_se_ve == 0) + goto no_vuelco; } - if (contador > 0) - goto comienza; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} + if (hare_se_mueve == 0) { + pos_hare[0] = 0; + pos_hare[1] = DIF_MASK_HARE; + pos_hare[2] = hare_x; + pos_hare[3] = hare_y; + if (num_ejec == 2) { + pos_hare[4] = ancho_hare; + pos_hare[5] = alto_hare; + } else { + pos_hare[4] = ANCHO_PERSONAJE; + pos_hare[5] = ALTO_PERSONAJE; + } -void DrasculaEngine::fin_sound() { - delay(1); + if (sentido_hare == 0) { + pos_hare[1] = 0; + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + } else if (sentido_hare == 1) { + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + } else if (sentido_hare == 2) { + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_fondo, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_fondo, dir_zona_pantalla); + } else { + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_frente, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); + } + } else if (hare_se_mueve == 1) { + pos_hare[0] = frame_x[num_frame]; + pos_hare[1] = frame_y + DIF_MASK_HARE; + pos_hare[2] = hare_x; + pos_hare[3] = hare_y; + if (num_ejec == 2) { + pos_hare[4] = ancho_hare; + pos_hare[5] = alto_hare; + } else { + pos_hare[4] = ANCHO_PERSONAJE; + pos_hare[5] = ALTO_PERSONAJE; + } + if (sentido_hare == 0) { + pos_hare[1] = 0; + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + } else if (sentido_hare == 1) { + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + } else if (sentido_hare == 2) { + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_fondo, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_fondo, dir_zona_pantalla); + } else { + if (num_ejec == 2) + copyRectClip(pos_hare, dir_hare_frente, dir_zona_pantalla); + else + reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], + factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); + } - if (hay_sb == 1) { - while (LookForFree() != 0); - delete sku; - sku = NULL; +no_vuelco: + aumenta_num_frame(); } } -void DrasculaEngine::talk_bj(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[5] = { 64, 92, 120, 148, 176 }; - int cara; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); +void DrasculaEngine::menu_sin_volcar() { + int h, n, x; + char texto_icono[13]; - buffer_teclado(); + x = sobre_que_objeto(); + strcpy(texto_icono, nombre_icono[x]); - color_abc(BLANCO); + for (n = 1; n < 43; n++) { + h = objetos_que_tengo[n]; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + if (h != 0) { + if (num_ejec == 6) + copyBackground(x_pol[n], y_pol[n], x_obj[n], y_obj[n], + ANCHOBJ, ALTOBJ, dir_mesa, dir_zona_pantalla); + else + copyBackground(x_pol[n], y_pol[n], x_obj[n], y_obj[n], + ANCHOBJ, ALTOBJ, dir_hare_frente, dir_zona_pantalla); } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + copyRect(x1d_menu[h], y1d_menu[h], x_obj[n], y_obj[n], + ANCHOBJ, ALTOBJ, dir_hare_fondo, dir_zona_pantalla); } -bucless: - if (num_ejec != 5) { - cara = _rnd->getRandomNumber(4); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_bj + 2, y_bj - 1, x_bj + 2, y_bj - 1, 27, 40, - dir_dibujo1, dir_zona_pantalla); - - copyRect(x_talk[cara], 99, x_bj + 2, y_bj - 1, 27, 40, - dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, x_bj + 7, y_bj); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - } else { - updateRoom(); - - if (con_voces == 0) - centra_texto(dicho, 93, 80); + if (x < 7) + print_abc(texto_icono, x_obj[x] - 2, y_obj[x] - 7); +} - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - } +void DrasculaEngine::barra_menu() { + int n, sobre_verbo = 1; - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + for (n = 0; n < 7; n++) { + if (x_raton > x_barra[n] && x_raton < x_barra[n + 1]) + sobre_verbo = 0; + copyRect(ANCHOBJ * n, ALTOBJ * sobre_verbo, x_barra[n], 2, + ANCHOBJ, ALTOBJ, dir_hare_fondo, dir_zona_pantalla); + sobre_verbo = 1; } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::talk(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int suma_1_pixel = 0; - if (num_ejec != 2) - suma_1_pixel = 1; - - int y_mask_talk = 170; - int x_talk_dch[6] = { 1, 25, 49, 73, 97, 121 }; - int x_talk_izq[6] = { 145, 169, 193, 217, 241, 265 }; - int cara; +void DrasculaEngine::saca_objeto() { + int h = 0, n; - int longitud; - longitud = strlen(dicho); + updateRoom(); - if (num_ejec == 6) { - if (flags[0] == 0 && (!strcmp(num_room, "102.alg"))) { - talk_pen(dicho, filename); - return; - } - if (flags[0] == 0 && (!strcmp(num_room, "58.alg"))) { - talk_pen2(dicho, filename); - return; + for (n = 1; n < 43; n++){ + if (sobre_que_objeto() == n) { + h = objetos_que_tengo[n]; + objetos_que_tengo[n] = 0; + if (h != 0) + lleva_objeto = 1; } } - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); + espera_soltar(); - if (num_ejec != 2) { - if (factor_red[hare_y + alto_hare] == 100) - suma_1_pixel = 0; - } + if (lleva_objeto == 1) + elige_objeto(h); +} - if (num_ejec == 2) - buffer_teclado(); +bool DrasculaEngine::sal_de_la_habitacion(int l) { + char salgo[13]; - if (num_ejec == 4) { - if (strcmp(num_room, "24.alg") || flags[29] == 0) { - color_abc(AMARILLO); - } - } else { - color_abc(AMARILLO); - } - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - cara = _rnd->getRandomNumber(5); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + if (num_ejec == 1) { + if (num_obj[l] == 105 && flags[0] == 0) + talk(TEXT442, "442.als"); + else { + puertas_cerradas(l); + if (espuerta[l] != 0) { + lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); + sentido_hare = sentidobj[l]; + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + hare_se_mueve = 0; + sentido_hare = sentido_alkeva[l]; + obj_saliendo = alapuertakeva[l]; + rompo = 1; + musica_antes = musica_room; - updateRefresh_pre(); - if (num_ejec == 2) - copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, ancho_hare, alto_talk - 1, dir_zona_pantalla, dir_dibujo3); - else - copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), - dir_zona_pantalla, dir_dibujo3); + if (num_obj[l] == 105) { + animation_2_1(); + return true; + } + clearRoom(); + strcpy(salgo, alapantallakeva[l]); + strcat(salgo, ".ald"); + hare_x = -1; + carga_escoba(salgo); + } + } + } else if (num_ejec == 2) { + puertas_cerradas(l); + if (espuerta[l] != 0) { + lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); + hare_se_mueve = 0; + sentido_hare = sentido_alkeva[l]; + obj_saliendo = alapuertakeva[l]; + rompo = 1; + musica_antes = musica_room; + if (num_obj[l] == 136) + animation_2_2(); + if (num_obj[l] == 124) + animation_3_2(); + if (num_obj[l] == 173) { + animation_35_2(); + return true; + } if (num_obj[l] == 146 && flags[39] == 1) { + flags[5] = 1; + flags[11] = 1; + } + if (num_obj[l] == 176 && flags[29] == 1) { + flags[29] = 0; + resta_objeto(23); + suma_objeto(11); + } + clearRoom(); + delete ald; + ald = NULL; + strcpy(salgo, alapantallakeva[l]); + strcat(salgo, ".ald"); + hare_x =- 1; + carga_escoba(salgo); + } + } else if (num_ejec == 3) { + puertas_cerradas(l); + if (espuerta[l] != 0 && visible[l] == 1) { + lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); + sentido_hare = sentidobj[l]; + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + hare_se_mueve = 0; + sentido_hare = sentido_alkeva[l]; + obj_saliendo = alapuertakeva[l]; + rompo = 1; + musica_antes = musica_room; + clearRoom(); + strcpy(salgo, alapantallakeva[l]); + strcat(salgo, ".ald"); + hare_x =- 1; + carga_escoba(salgo); + } + } else if (num_ejec == 4) { + puertas_cerradas(l); + if (espuerta[l] != 0) { + lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); + sentido_hare = sentidobj[l]; + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + hare_se_mueve = 0; + sentido_hare = sentido_alkeva[l]; + obj_saliendo = alapuertakeva[l]; + rompo = 1; + musica_antes = musica_room; - pon_hare(); + if (num_obj[l] == 108) + lleva_al_hare(171, 78); + clearRoom(); + strcpy(salgo, alapantallakeva[l]); + strcat(salgo, ".ald"); + hare_x = -1; + carga_escoba(salgo); + } + } else if (num_ejec == 5) { + puertas_cerradas(l); + if (espuerta[l] != 0 && visible[l] == 1) { + lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); + sentido_hare = sentidobj[l]; + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + hare_se_mueve = 0; + sentido_hare = sentido_alkeva[l]; + obj_saliendo = alapuertakeva[l]; + rompo = 1; + musica_antes = musica_room; + hare_se_ve = 1; + clearRoom(); + strcpy(salgo, alapantallakeva[l]); + strcat(salgo, ".ald"); + hare_x = -1; + carga_escoba(salgo); + } + } else if (num_ejec == 6) { + puertas_cerradas(l); + if (espuerta[l] != 0) { + lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); + sentido_hare = sentidobj[l]; + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + hare_se_mueve = 0; + sentido_hare = sentido_alkeva[l]; + obj_saliendo = alapuertakeva[l]; + rompo = 1; + musica_antes = musica_room; + clearRoom(); + strcpy(salgo, alapantallakeva[l]); + strcat(salgo, ".ald"); + hare_x = -1; + carga_escoba(salgo); - if (num_ejec == 2) { - if (!strcmp(fondo_y_menu, "99.alg") || !strcmp(fondo_y_menu, "994.alg")) - copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, ancho_hare, alto_talk - 1, dir_dibujo3, dir_zona_pantalla); - } else { - copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), - dir_dibujo3, dir_zona_pantalla); + if (obj_saliendo == 105) + animation_19_6(); + } } - if (sentido_hare == 0) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 8, hare_y - 1, ancho_talk, alto_talk, - dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, hare_x + (int)((8.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], - dir_hare_dch, dir_zona_pantalla); - - updateRefresh(); - } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, - dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, hare_x + (int)((12.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, - dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, - suma_1_pixel + hare_x + (int)((12.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], - dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 3) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 8, hare_y, ancho_talk, alto_talk, - dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, - suma_1_pixel + hare_x + (int)((8.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk,alto_talk, factor_red[hare_y + alto_hare], - dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } + return false; +} - if (con_voces == 0) - centra_texto(dicho, hare_x, hare_y); +bool DrasculaEngine::coge_objeto() { + int h, n; + h = objeto_que_lleva; + comprueba_flags = 1; + updateRoom(); + menu_sin_volcar(); updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - pause(3); + if (objeto_que_lleva < 7) + goto usando_verbos; - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + for (n = 1; n < 43; n++) { + if (sobre_que_objeto() == n && objetos_que_tengo[n] == 0) { + objetos_que_tengo[n] = h; + lleva_objeto = 0; + comprueba_flags = 0; + } } - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +usando_verbos: - if (num_ejec == 1) { - if (music_status() == 0 && flags[11] == 0 && corta_musica == 0) - playmusic(musica_room); + if (comprueba_flags == 1) { + if (comprueba_banderas_menu()) + return true; } -} - -void DrasculaEngine::playmusic(int p) { - AudioCD.stop(); - AudioCD.play(p - 1, 1, 0, 0); -} - -void DrasculaEngine::stopmusic() { - AudioCD.stop(); -} - -int DrasculaEngine::music_status() { - return AudioCD.isPlaying(); -} + espera_soltar(); + if (lleva_objeto == 0) + sin_verbo(); -void DrasculaEngine::updateRoom() { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateRefresh_pre(); - if (num_ejec == 3) { - if (flags[0] == 0) - pon_hare(); - else - copyRect(113, 54, hare_x - 20, hare_y - 1, 77, 89, dir_dibujo3, dir_zona_pantalla); - } else { - pon_hare(); - } - updateRefresh(); + return false; } -bool DrasculaEngine::carga_partida(const char *nom_game) { - int l, n_ejec2; - Common::InSaveFile *sav; - - if (!(sav = _saveFileMan->openForLoading(nom_game))) { - error("missing savegame file"); - } - - n_ejec2 = sav->readSint32LE(); - if (n_ejec2 != num_ejec) { - strcpy(nom_partida, nom_game); - num_ejec = n_ejec2 - 1; - hay_que_load = 1; - return false; - } - sav->read(datos_actuales, 20); - hare_x = sav->readSint32LE(); - hare_y = sav->readSint32LE(); - sentido_hare = sav->readSint32LE(); +bool DrasculaEngine::banderas(int fl) { + hare_se_mueve = 0; + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - for (l = 1; l < 43; l++) { - objetos_que_tengo[l] = sav->readSint32LE(); - } + hay_respuesta = 1; - for (l = 0; l < NUM_BANDERAS; l++) { - flags[l] = sav->readSint32LE(); - } - - lleva_objeto = sav->readSint32LE(); - objeto_que_lleva = sav->readSint32LE(); - hay_que_load = 0; - - return true; -} - -void DrasculaEngine::puertas_cerradas(int l) { - if (num_ejec == 1 || num_ejec == 3 || num_ejec == 5 || num_ejec == 6) - return; - else if (num_ejec == 2) { - if (num_obj[l] == 138 && flags[0] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 138 && flags[0] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 136 && flags[8] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 136 && flags[8] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 156 && flags[16] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 156 && flags[16] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 163 && flags[17] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 163 && flags[17] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 177 && flags[15] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 177 && flags[15] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 175 && flags[40] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 175 && flags[40] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 173 && flags[36] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 173 && flags[36] == 1) - espuerta[l] = 1; - } else if (num_ejec == 4) { - if (num_obj[l] == 101 && flags[0] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 101 && flags[0] == 1 && flags[28] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 103 && flags[0] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 103 && flags[0] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 104 && flags[1] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 104 && flags[1] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 105 && flags[1] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 105 && flags[1] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 106 && flags[2] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 106 && flags[2] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 107 && flags[2] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 107 && flags[2] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 110 && flags[6] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 110 && flags[6] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 114 && flags[4] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 114 && flags[4] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 115 && flags[4] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 115 && flags[4] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 116 && flags[5] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 116 && flags[5] == 1 && flags[23] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 117 && flags[5] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 117 && flags[5] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 120 && flags[8] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 120 && flags[8] == 1) - espuerta[l] = 1; - else if (num_obj[l] == 122 && flags[7] == 0) - espuerta[l] = 0; - else if (num_obj[l] == 122 && flags[7] == 1) - espuerta[l] = 1; - } -} - -void DrasculaEngine::color_hare() { - int color, componente; - - for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) { - palJuego[color][componente] = palHare[color][componente]; - } - } - ActualizaPaleta(); -} - -void DrasculaEngine::funde_hare(int oscuridad) { - char fundido; - unsigned int color, componente; - - for (fundido = oscuridad; fundido >= 0; fundido--) { - for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - palJuego[color][componente] = LimitaVGA(palJuego[color][componente] - 8 + fundido); - } - } - - ActualizaPaleta(); -} - -void DrasculaEngine::paleta_hare_claro() { - int color, componente; - - for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - palHareClaro[color][componente] = palJuego[color][componente]; - } -} - -void DrasculaEngine::paleta_hare_oscuro() { - int color, componente; - - for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - palHareOscuro[color][componente] = palJuego[color][componente]; - } -} - -void DrasculaEngine::hare_claro() { - int color, componente; - - for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - palJuego[color][componente] = palHareClaro[color][componente]; - } - - ActualizaPaleta(); -} - -void DrasculaEngine::empieza_andar() { - hare_se_mueve = 1; - - paso_x = PASO_HARE_X; - paso_y = PASO_HARE_Y; - - if (num_ejec == 2) { - if ((sitio_x < hare_x) && (sitio_y <= (hare_y + alto_hare))) - cuadrante_1(); - else if ((sitio_x < hare_x) && (sitio_y > (hare_y + alto_hare))) - cuadrante_3(); - else if ((sitio_x > hare_x + ancho_hare) && (sitio_y <= (hare_y + alto_hare))) - cuadrante_2(); - else if ((sitio_x > hare_x + ancho_hare) && (sitio_y > (hare_y + alto_hare))) - cuadrante_4(); - else if (sitio_y < hare_y + alto_hare) - anda_parriba(); - else if (sitio_y > hare_y + alto_hare) - anda_pabajo(); - } else { - if ((sitio_x < hare_x + ancho_hare / 2 ) && (sitio_y <= (hare_y + alto_hare))) - cuadrante_1(); - else if ((sitio_x < hare_x + ancho_hare / 2) && (sitio_y > (hare_y + alto_hare))) - cuadrante_3(); - else if ((sitio_x > hare_x + ancho_hare / 2) && (sitio_y <= (hare_y + alto_hare))) - cuadrante_2(); - else if ((sitio_x > hare_x + ancho_hare / 2) && (sitio_y > (hare_y + alto_hare))) - cuadrante_4(); - else - hare_se_mueve = 0; - } - conta_vez = vez(); -} - -void DrasculaEngine::pon_hare() { - int pos_hare[6]; - int r; - - if (hare_se_mueve == 1 && paso_x == PASO_HARE_X) { - for (r = 0; r < paso_x; r++) { - if (num_ejec != 2) { - if (sentido_hare == 0 && sitio_x - r == hare_x + ancho_hare / 2) { - hare_se_mueve = 0; - paso_x = PASO_HARE_X; - paso_y = PASO_HARE_Y; - } - if (sentido_hare == 1 && sitio_x + r == hare_x + ancho_hare / 2) { - hare_se_mueve = 0; - paso_x = PASO_HARE_X; - paso_y = PASO_HARE_Y; - hare_x = sitio_x - ancho_hare / 2; - hare_y = sitio_y - alto_hare; - } - } else if (num_ejec == 2) { - if (sentido_hare == 0 && sitio_x - r == hare_x) { - hare_se_mueve = 0; - paso_x = PASO_HARE_X; - paso_y = PASO_HARE_Y; - } - if (sentido_hare == 1 && sitio_x + r == hare_x + ancho_hare) { - hare_se_mueve = 0; - paso_x = PASO_HARE_X; - paso_y = PASO_HARE_Y; - hare_x = sitio_x - ancho_hare + 4; - hare_y = sitio_y - alto_hare; - } - } - } - } - if (hare_se_mueve == 1 && paso_y == PASO_HARE_Y) { - for (r = 0; r < paso_y; r++) { - if (sentido_hare == 2 && sitio_y - r == hare_y + alto_hare) { - hare_se_mueve = 0; - paso_x = PASO_HARE_X; - paso_y = PASO_HARE_Y; - } - if (sentido_hare == 3 && sitio_y + r == hare_y + alto_hare) { - hare_se_mueve = 0; - paso_x = PASO_HARE_X; - paso_y = PASO_HARE_Y; - } - } - } - - if (num_ejec == 1 || num_ejec == 4 || num_ejec == 5 || num_ejec == 6) { - if (hare_se_ve == 0) - goto no_vuelco; - } - - if (hare_se_mueve == 0) { - pos_hare[0] = 0; - pos_hare[1] = DIF_MASK_HARE; - pos_hare[2] = hare_x; - pos_hare[3] = hare_y; - if (num_ejec == 2) { - pos_hare[4] = ancho_hare; - pos_hare[5] = alto_hare; - } else { - pos_hare[4] = ANCHO_PERSONAJE; - pos_hare[5] = ALTO_PERSONAJE; - } - - if (sentido_hare == 0) { - pos_hare[1] = 0; - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_fondo, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_fondo, dir_zona_pantalla); - } else { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); - } - } else if (hare_se_mueve == 1) { - pos_hare[0] = frame_x[num_frame]; - pos_hare[1] = frame_y + DIF_MASK_HARE; - pos_hare[2] = hare_x; - pos_hare[3] = hare_y; - if (num_ejec == 2) { - pos_hare[4] = ancho_hare; - pos_hare[5] = alto_hare; - } else { - pos_hare[4] = ANCHO_PERSONAJE; - pos_hare[5] = ALTO_PERSONAJE; - } - if (sentido_hare == 0) { - pos_hare[1] = 0; - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_fondo, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_fondo, dir_zona_pantalla); - } else { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); - } - -no_vuelco: - aumenta_num_frame(); - } -} - -void DrasculaEngine::menu_sin_volcar() { - int h, n, x; - char texto_icono[13]; - - x = sobre_que_objeto(); - strcpy(texto_icono, nombre_icono[x]); - - for (n = 1; n < 43; n++) { - h = objetos_que_tengo[n]; - - if (h != 0) { - if (num_ejec == 6) - copyBackground(x_pol[n], y_pol[n], x_obj[n], y_obj[n], - ANCHOBJ, ALTOBJ, dir_mesa, dir_zona_pantalla); - else - copyBackground(x_pol[n], y_pol[n], x_obj[n], y_obj[n], - ANCHOBJ, ALTOBJ, dir_hare_frente, dir_zona_pantalla); - } - copyRect(x1d_menu[h], y1d_menu[h], x_obj[n], y_obj[n], - ANCHOBJ, ALTOBJ, dir_hare_fondo, dir_zona_pantalla); - } - - if (x < 7) - print_abc(texto_icono, x_obj[x] - 2, y_obj[x] - 7); -} - -void DrasculaEngine::barra_menu() { - int n, sobre_verbo = 1; - - for (n = 0; n < 7; n++) { - if (x_raton > x_barra[n] && x_raton < x_barra[n + 1]) - sobre_verbo = 0; - copyRect(ANCHOBJ * n, ALTOBJ * sobre_verbo, x_barra[n], 2, - ANCHOBJ, ALTOBJ, dir_hare_fondo, dir_zona_pantalla); - sobre_verbo = 1; - } -} - -void DrasculaEngine::saca_objeto() { - int h = 0, n; - - updateRoom(); - - for (n = 1; n < 43; n++){ - if (sobre_que_objeto() == n) { - h = objetos_que_tengo[n]; - objetos_que_tengo[n] = 0; - if (h != 0) - lleva_objeto = 1; - } - } - - espera_soltar(); - - if (lleva_objeto == 1) - elige_objeto(h); -} - -bool DrasculaEngine::sal_de_la_habitacion(int l) { - char salgo[13]; - - if (num_ejec == 1) { - if (num_obj[l] == 105 && flags[0] == 0) - talk(TEXT442, "442.als"); - else { - puertas_cerradas(l); - if (espuerta[l] != 0) { - lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - sentido_hare = sentidobj[l]; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; - sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; - musica_antes = musica_room; - - if (num_obj[l] == 105) { - animation_2_1(); - return true; - } - clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); - hare_x = -1; - carga_escoba(salgo); - } - } - } else if (num_ejec == 2) { - puertas_cerradas(l); - if (espuerta[l] != 0) { - lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - hare_se_mueve = 0; - sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; - musica_antes = musica_room; - if (num_obj[l] == 136) - animation_2_2(); - if (num_obj[l] == 124) - animation_3_2(); - if (num_obj[l] == 173) { - animation_35_2(); - return true; - } if (num_obj[l] == 146 && flags[39] == 1) { - flags[5] = 1; - flags[11] = 1; - } - if (num_obj[l] == 176 && flags[29] == 1) { - flags[29] = 0; - resta_objeto(23); - suma_objeto(11); - } - clearRoom(); - delete ald; - ald = NULL; - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); - hare_x =- 1; - carga_escoba(salgo); - } - } else if (num_ejec == 3) { - puertas_cerradas(l); - if (espuerta[l] != 0 && visible[l] == 1) { - lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - sentido_hare = sentidobj[l]; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; - sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; - musica_antes = musica_room; - clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); - hare_x =- 1; - carga_escoba(salgo); - } - } else if (num_ejec == 4) { - puertas_cerradas(l); - if (espuerta[l] != 0) { - lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - sentido_hare = sentidobj[l]; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; - sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; - musica_antes = musica_room; - - if (num_obj[l] == 108) - lleva_al_hare(171, 78); - clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); - hare_x = -1; - carga_escoba(salgo); - } - } else if (num_ejec == 5) { - puertas_cerradas(l); - if (espuerta[l] != 0 && visible[l] == 1) { - lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - sentido_hare = sentidobj[l]; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; - sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; - musica_antes = musica_room; - hare_se_ve = 1; - clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); - hare_x = -1; - carga_escoba(salgo); - } - } else if (num_ejec == 6) { - puertas_cerradas(l); - if (espuerta[l] != 0) { - lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - sentido_hare = sentidobj[l]; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; - sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; - musica_antes = musica_room; - clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); - hare_x = -1; - carga_escoba(salgo); - - if (obj_saliendo == 105) - animation_19_6(); - } - } - - return false; -} - -bool DrasculaEngine::coge_objeto() { - int h, n; - h = objeto_que_lleva; - comprueba_flags = 1; - - updateRoom(); - menu_sin_volcar(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - if (objeto_que_lleva < 7) - goto usando_verbos; - - for (n = 1; n < 43; n++) { - if (sobre_que_objeto() == n && objetos_que_tengo[n] == 0) { - objetos_que_tengo[n] = h; - lleva_objeto = 0; - comprueba_flags = 0; - } - } - -usando_verbos: - - if (comprueba_flags == 1) { - if (comprueba_banderas_menu()) - return true; - } - espera_soltar(); - if (lleva_objeto == 0) - sin_verbo(); - - return false; -} - -bool DrasculaEngine::banderas(int fl) { - hare_se_mueve = 0; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - hay_respuesta = 1; - - if (menu_scr == 1) { - if (num_ejec == 1) { - if (objeto_que_lleva == LOOK && fl == 28) - talk(TEXT328, "328.als"); - } else if (num_ejec == 2) { - if ((objeto_que_lleva == LOOK && fl == 22 && flags[23] == 0) - || (objeto_que_lleva == OPEN && fl == 22 && flags[23] == 0)) { - talk(TEXT164, "164.als"); - flags[23] = 1; - sin_verbo(); - suma_objeto(7); - suma_objeto(18); - } else if (objeto_que_lleva == LOOK && fl == 22 && flags[23] == 1) - talk(TEXT307, "307.als"); - else if (objeto_que_lleva == LOOK && fl == 28) - talk(TEXT328, "328.als"); - else if (objeto_que_lleva == LOOK && fl == 7) - talk(TEXT143, "143.als"); - else if (objeto_que_lleva == TALK && fl == 7) - talk(TEXT144, "144.als"); - else if (objeto_que_lleva == LOOK && fl == 8) - talk(TEXT145, "145.als"); - else if (objeto_que_lleva == TALK && fl == 8) - talk(TEXT146, "146.als"); - else if (objeto_que_lleva == LOOK && fl == 9) - talk(TEXT147, "147.als"); - else if (objeto_que_lleva == TALK && fl == 9) - talk(TEXT148, "148.als"); - else if (objeto_que_lleva == LOOK && fl == 10) - talk(TEXT151, "151.als"); - else if (objeto_que_lleva == LOOK && fl == 11) - talk(TEXT152, "152.als"); - else if (objeto_que_lleva == TALK && fl == 11) - talk(TEXT153, "153.als"); - else if (objeto_que_lleva == LOOK && fl == 12) - talk(TEXT154, "154.als"); - else if (objeto_que_lleva == LOOK && fl == 13) - talk(TEXT155, "155.als"); - else if (objeto_que_lleva == LOOK && fl == 14) - talk(TEXT157, "157.als"); - else if (objeto_que_lleva == LOOK && fl == 15) - talk(TEXT58, "58.als"); - else if (objeto_que_lleva == LOOK && fl == 16) - talk(TEXT158, "158.als"); - else if (objeto_que_lleva == LOOK && fl == 17) - talk(TEXT159, "159.als"); - else if (objeto_que_lleva == LOOK && fl == 18) - talk(TEXT160, "160.als"); - else if (objeto_que_lleva == LOOK && fl == 19) - talk(TEXT161, "161.als"); - else if (objeto_que_lleva == LOOK && fl == 20) - talk(TEXT162, "162.als"); - else if (objeto_que_lleva == LOOK && fl == 23) - talk(TEXT152, "152.als"); - else - hay_respuesta = 0; - } else if (num_ejec == 3) { - if (objeto_que_lleva == LOOK && fl == 22) - talk(TEXT307, "307.als"); - else if (objeto_que_lleva == LOOK && fl == 28) - talk(TEXT328, "328.als"); - else if (objeto_que_lleva == LOOK && fl == 7) - talk(TEXT143, "143.als"); - else if (objeto_que_lleva == TALK && fl == 7) - talk(TEXT144, "144.als"); - else if (objeto_que_lleva == LOOK && fl == 8) - talk(TEXT145, "145.als"); - else if (objeto_que_lleva == TALK && fl == 8) - talk(TEXT146, "146.als"); - else if (objeto_que_lleva == LOOK && fl == 9) - talk(TEXT147, "147.als"); - else if (objeto_que_lleva == TALK && fl == 9) - talk(TEXT148, "148.als"); - else if (objeto_que_lleva == LOOK && fl == 10) - talk(TEXT151, "151.als"); - else if (objeto_que_lleva == LOOK && fl == 11) - talk(TEXT152, "152.als"); - else if (objeto_que_lleva == TALK && fl == 11) - talk(TEXT153, "153.als"); - else if (objeto_que_lleva == LOOK && fl == 12) - talk(TEXT154, "154.als"); - else if (objeto_que_lleva == LOOK && fl == 13) - talk(TEXT155, "155.als"); - else if (objeto_que_lleva == LOOK && fl == 14) - talk(TEXT157, "157.als"); - else if (objeto_que_lleva == LOOK && fl == 15) - talk(TEXT58, "58.als"); - else if (objeto_que_lleva == LOOK && fl == 16) - talk(TEXT158, "158.als"); - else if (objeto_que_lleva == LOOK && fl == 17) - talk(TEXT159, "159.als"); - else if (objeto_que_lleva == LOOK && fl == 18) - talk(TEXT160, "160.als"); - else if (objeto_que_lleva == LOOK && fl == 19) - talk(TEXT161, "161.als"); - else if (objeto_que_lleva == LOOK && fl == 20) - talk(TEXT162, "162.als"); - else if (objeto_que_lleva == LOOK && fl == 23) - talk(TEXT152, "152.als"); - else - hay_respuesta = 0; - } else if (num_ejec == 4) { - if ((objeto_que_lleva == 18 && fl == 19) || (objeto_que_lleva == 19 && fl == 18)) { - sin_verbo(); - elige_objeto(21); - resta_objeto(18); - resta_objeto(19); - } else if ((objeto_que_lleva == 14 && fl == 19) || (objeto_que_lleva == 19 && fl == 14)) - talk(TEXT484, "484.als"); - else if (objeto_que_lleva == LOOK && fl == 28) - talk(TEXT328, "328.als"); - else if (objeto_que_lleva == LOOK && fl == 7) - talk(TEXT478, "478.als"); - else if (objeto_que_lleva == LOOK && fl == 8) - talk(TEXT480, "480.als"); - else if (objeto_que_lleva == LOOK && fl == 9) { - talk(TEXT482, "482.als"); - talk(TEXT483, "483.als"); - } else if (objeto_que_lleva == LOOK && fl == 10) - talk(TEXT485, "485.als"); - else if (objeto_que_lleva == LOOK && fl == 11) - talk(TEXT488, "488.als"); - else if (objeto_que_lleva == LOOK && fl == 12) - talk(TEXT486, "486.als"); - else if (objeto_que_lleva == LOOK && fl == 13) - talk(TEXT490, "490.als"); - else if (objeto_que_lleva == LOOK && fl == 14) - talk(TEXT122, "122.als"); - else if (objeto_que_lleva == LOOK && fl == 15) - talk(TEXT117, "117.als"); - else if (objeto_que_lleva == TALK && fl == 15) - talk(TEXT118, "118.als"); - else if (objeto_que_lleva == OPEN && fl == 15) - talk(TEXT119, "119.als"); - else if (objeto_que_lleva == LOOK && fl == 16) - talk(TEXT491, "491.als"); - else if (objeto_que_lleva == LOOK && fl == 17) - talk(TEXT478, "478.als"); - else if (objeto_que_lleva == LOOK && fl == 18) - talk(TEXT493, "493.als"); - else if (objeto_que_lleva == LOOK && fl == 19) { - talk(TEXT494, "494.als"); - talk(TEXT495, "495.als"); - } else if (objeto_que_lleva == LOOK && fl == 20) - talk(TEXT162, "162.als"); - else if (objeto_que_lleva == LOOK && fl == 21) - talk(TEXT496, "496.als"); - else if (objeto_que_lleva == LOOK && fl == 22) - talk(TEXT161, "161.als"); - else - hay_respuesta = 0; - } else if (num_ejec == 5) { - if (objeto_que_lleva == LOOK && fl == 28) - talk(TEXT328, "328.als"); - else if (objeto_que_lleva == LOOK && fl == 7) - talk(TEXT478,"478.als"); - else if (objeto_que_lleva == LOOK && fl == 8) - talk(TEXT120, "120.als"); - else if (objeto_que_lleva == LOOK && fl == 9) { - talk(TEXT482, "482.als"); - talk(TEXT483, "483.als"); - } else if (objeto_que_lleva == LOOK && fl == 11) - talk(TEXT488, "488.als"); - else if (objeto_que_lleva == LOOK && fl == 13) - talk(TEXT490, "490.als"); - else if (objeto_que_lleva == LOOK && fl == 14) - talk(TEXT121, "121.als"); - else if (objeto_que_lleva == LOOK && fl == 15) - talk(TEXT117, "117.als"); - else if (objeto_que_lleva == TALK && fl == 15) - talk(TEXT118, "118.als"); - else if (objeto_que_lleva == OPEN && fl == 15) - talk(TEXT119, "119.als"); - else if (objeto_que_lleva == LOOK && fl == 17) - talk(TEXT478, "478.als"); - else if (objeto_que_lleva == LOOK && fl == 20) - talk(TEXT162, "162.als"); - else - hay_respuesta = 0; - } else if (num_ejec == 6) { - if (objeto_que_lleva == LOOK && fl == 28) - talk(TEXT328, "328.als"); - else if (objeto_que_lleva == LOOK && fl == 9) { - talk(TEXT482, "482.als"); - talk(TEXT483, "483.als"); - } else if (objeto_que_lleva == LOOK && fl == 20) - talk(TEXT123, "123.als"); - else if (objeto_que_lleva == LOOK && fl == 21) - talk(TEXT441, "441.als"); - else - hay_respuesta = 0; - } - } else { - if (num_ejec == 1) { - if (objeto_que_lleva == LOOK && fl == 50) - talk(TEXT308, "308.als"); - else if (objeto_que_lleva == OPEN && fl == 50) - talk(TEXT310, "310.als"); - else if (objeto_que_lleva == CLOSE && fl == 50) - talk(TEXT311, "311.als"); - else if (objeto_que_lleva == MOVE && fl == 50) - talk(TEXT312, "312.als"); - else if (objeto_que_lleva == PICK && fl == 50) - talk(TEXT313, "313.als"); - else if (objeto_que_lleva == TALK && fl == 50) - talk(TEXT314, "314.als"); - else if (!strcmp(num_room, "62.alg")) - room_62(fl); - else if (!strcmp(num_room, "63.alg")) - room_63(fl); - else - hay_respuesta = 0; - } else if (num_ejec == 2) { - if (objeto_que_lleva == LOOK && fl == 50) - talk(TEXT308, "308.als"); - else if (objeto_que_lleva == OPEN && fl == 50) - talk(TEXT310, "310.als"); - else if (objeto_que_lleva == CLOSE && fl == 50) - talk(TEXT311, "311.als"); - else if (objeto_que_lleva == MOVE && fl == 50) - talk(TEXT312, "312.als"); - else if (objeto_que_lleva == PICK && fl == 50) - talk(TEXT313, "313.als"); - else if (objeto_que_lleva == TALK && fl == 50) - talk(TEXT314, "314.als"); - else if (objeto_que_lleva == 11 && fl == 50 && flags[22] == 0 && strcmp(num_room, "18.alg")) - talk(TEXT315, "315.als"); - else if (objeto_que_lleva == 13 && fl == 50) - talk(TEXT156, "156.als"); - else if (objeto_que_lleva == 20 && fl == 50) - talk(TEXT163, "163.als"); - else if (!strcmp(num_room, "1.alg")) - room_1(fl); - else if (!strcmp(num_room, "3.alg")) - room_3(fl); - else if (!strcmp(num_room, "4.alg")) - room_4(fl); - else if (!strcmp(num_room, "5.alg")) - room_5(fl); - else if (!strcmp(num_room, "6.alg")) - room_6(fl); - else if (!strcmp(num_room, "7.alg")) - room_7(fl); - else if (!strcmp(num_room, "8.alg")) - room_8(fl); - else if (!strcmp(num_room, "9.alg")) - room_9(fl); - else if (!strcmp(num_room, "12.alg")) - room_12(fl); - else if (!strcmp(num_room, "14.alg")) - room_14(fl); - else if (!strcmp(num_room, "15.alg")) - room_15(fl); - else if (!strcmp(num_room, "16.alg")) - room_16(fl); - else if (!strcmp(num_room, "17.alg")) - room_17(fl); - else if (!strcmp(num_room, "18.alg")) - room_18(fl); - else if (!strcmp(num_room, "19.alg")) - room_19(fl); - else - hay_respuesta = 0; - } else if (num_ejec == 3) { - if (objeto_que_lleva == LOOK && fl == 50) - talk(TEXT309, "309.als"); - else if (objeto_que_lleva == OPEN && fl == 50) - talk(TEXT310, "310.als"); - else if (objeto_que_lleva == CLOSE && fl == 50) - talk(TEXT311, "311.als"); - else if (objeto_que_lleva == MOVE && fl == 50) - talk(TEXT312, "312.als"); - else if (objeto_que_lleva == PICK && fl == 50) - talk(TEXT313, "313.als"); - else if (objeto_que_lleva == TALK && fl == 50) - talk(TEXT314, "314.als"); - else if (!strcmp(num_room, "13.alg")) { - if (room_13(fl)) - return true; - } else - hay_respuesta = 0; - } else if (num_ejec == 4) { - if (!strcmp(num_room, "28.alg")) - talk(TEXT178, "178.als"); - else if (objeto_que_lleva == LOOK && fl == 50) - talk(TEXT309, "309.als"); - else if (objeto_que_lleva == OPEN && fl == 50) - talk(TEXT310, "310.als"); - else if (objeto_que_lleva == CLOSE && fl == 50) - talk(TEXT311, "311.als"); - else if (objeto_que_lleva == MOVE && fl == 50) - talk(TEXT312, "312.als"); - else if (objeto_que_lleva == PICK && fl == 50) - talk(TEXT313, "313.als"); - else if (objeto_que_lleva == TALK && fl == 50) - talk(TEXT314, "314.als"); - else if (objeto_que_lleva == 8 && fl == 50 && flags[18] == 0) - talk(TEXT481, "481.als"); - else if (objeto_que_lleva == 9 && fl == 50) - talk(TEXT484, "484.als"); - else if (objeto_que_lleva == 12 && fl == 50 && flags[18] == 0) - talk(TEXT487, "487.als"); - else if (objeto_que_lleva == 20 && fl == 50) - talk(TEXT487, "487.als"); - else if (!strcmp(num_room, "21.alg")) { - if (room_21(fl)) - return true; - } else if (!strcmp(num_room, "22.alg")) - room_22(fl); - else if (!strcmp(num_room, "23.alg")) - room_23(fl); - else if (!strcmp(num_room, "24.alg")) - room_24(fl); - else if (!strcmp(num_room, "26.alg")) - room_26(fl); - else if (!strcmp(num_room, "27.alg")) - room_27(fl); - else if (!strcmp(num_room, "29.alg")) - room_29(fl); - else if (!strcmp(num_room, "30.alg")) - room_30(fl); - else if (!strcmp(num_room, "31.alg")) - room_31(fl); - else if (!strcmp(num_room, "34.alg")) - room_34(fl); - else if (!strcmp(num_room, "35.alg")) - room_35(fl); - else if (!strcmp(num_room, "44.alg")) - room_44(fl); - else - hay_respuesta = 0; - } else if (num_ejec == 5) { - if (objeto_que_lleva == LOOK && fl == 50) - talk("Cuanto mas me miro, mas me gusto", "54.als"); - else if (objeto_que_lleva == OPEN && fl == 50) - talk("y luego como me cierro", "19.als"); - else if (objeto_que_lleva == CLOSE && fl == 50) - talk("Tendre que abrirme primero no", "19.als"); - else if (objeto_que_lleva == MOVE && fl == 50) - talk("Estoy bien donde estoy", "19.als"); - else if (objeto_que_lleva == PICK && fl == 50) - talk("Ya me tengo", "11.als"); - else if (objeto_que_lleva == TALK && fl == 50) - talk("hola yo", "16.als"); - else if (objeto_que_lleva == 20 && fl == 50) - talk(TEXT487, "487.als"); - else if (!strcmp(num_room, "49.alg")) - room_49(fl); - else if (!strcmp(num_room, "53.alg")) - room_53(fl); - else if (!strcmp(num_room, "54.alg")) - room_54(fl); - else if (!strcmp(num_room, "55.alg")) - room_55(fl); - else if (!strcmp(num_room, "56.alg")) { - if (room_56(fl)) - return true; - } else - hay_respuesta = 0; - } else if (num_ejec == 6) { - if (objeto_que_lleva == LOOK && fl == 50 && flags[0] == 1) - talk(TEXT308, "308.als"); - else if (objeto_que_lleva == LOOK && fl == 50 && flags[0] == 0) - talk(TEXT310, "250.als" ); - else if (objeto_que_lleva == OPEN && fl == 50) - talk(TEXT310, "310.als" ); - else if (objeto_que_lleva == CLOSE && fl == 50) - talk(TEXT311, "311.als" ); - else if (objeto_que_lleva == MOVE && fl == 50) - talk(TEXT312, "312.als" ); - else if (objeto_que_lleva == PICK && fl == 50) - talk(TEXT313, "313.als" ); - else if (objeto_que_lleva == TALK && fl == 50) - talk(TEXT314, "314.als" ); - else if (!strcmp(num_room, "102.alg")) - room_pendulo(fl); - else if (!strcmp(num_room, "58.alg")) - room_58(fl); - else if (!strcmp(num_room, "59.alg")) - room_59(fl); - else if (!strcmp(num_room, "60.alg")) { - if (room_60(fl)) - return true; - } else if (!strcmp(num_room, "61.alg")) - room_61(fl); - else - hay_respuesta = 0; - } - } - if (hay_respuesta == 0 && hay_nombre == 1) - room_0(); - else if (hay_respuesta == 0 && menu_scr == 1) - room_0(); - - return false; -} - -void DrasculaEngine::cursor_mesa() { - int pos_cursor[8]; - - pos_cursor[0] = 225; - pos_cursor[1] = 56; - pos_cursor[2] = x_raton - 20; - pos_cursor[3] = y_raton - 12; - pos_cursor[4] = 40; - pos_cursor[5] = 25; - - copyRectClip(pos_cursor, dir_mesa, dir_zona_pantalla); -} - -void DrasculaEngine::introduce_nombre() { - Common::KeyCode key; - int v = 0, h = 0; - char select2[23]; - strcpy(select2, " "); - for (;;) { - buffer_teclado(); - select2[v] = '-'; - copyBackground(115, 14, 115, 14, 176, 9, dir_dibujo1, dir_zona_pantalla); - print_abc(select2, 117, 15); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - key = getscan(); - delay(70); - if (key != 0) { - if (key == Common::KEYCODE_q) - select2[v] = 'q'; - else if (key == Common::KEYCODE_w) - select2[v] = 'w'; - else if (key == Common::KEYCODE_e) - select2[v] = 'e'; - else if (key == Common::KEYCODE_r) - select2[v] = 'r'; - else if (key == Common::KEYCODE_t) - select2[v] = 't'; - else if (key == Common::KEYCODE_y) - select2[v] = 'y'; - else if (key == Common::KEYCODE_u) - select2[v] = 'u'; - else if (key == Common::KEYCODE_i) - select2[v] = 'i'; - else if (key == Common::KEYCODE_o) - select2[v] = 'o'; - else if (key == Common::KEYCODE_p) - select2[v] = 'p'; - else if (key == Common::KEYCODE_a) - select2[v] = 'a'; - else if (key == Common::KEYCODE_s) - select2[v] = 's'; - else if (key == Common::KEYCODE_d) - select2[v] = 'd'; - else if (key == Common::KEYCODE_f) - select2[v] = 'f'; - else if (key == Common::KEYCODE_g) - select2[v] = 'g'; - else if (key == Common::KEYCODE_h) - select2[v] = 'h'; - else if (key == Common::KEYCODE_j) - select2[v] = 'j'; - else if (key == Common::KEYCODE_k) - select2[v] = 'k'; - else if (key == Common::KEYCODE_l) - select2[v] = 'l'; - else if ((key == Common::KEYCODE_LCTRL) || (key == Common::KEYCODE_RCTRL)) - select2[v] = '\164'; - else if (key == Common::KEYCODE_z) - select2[v] = 'z'; - else if (key == Common::KEYCODE_x) - select2[v] = 'x'; - else if (key == Common::KEYCODE_c) - select2[v] = 'c'; - else if (key == Common::KEYCODE_v) - select2[v] = 'v'; - else if (key == Common::KEYCODE_b) - select2[v] = 'b'; - else if (key == Common::KEYCODE_n) - select2[v] = 'n'; - else if (key == Common::KEYCODE_m) - select2[v] = 'm'; - else if (key == Common::KEYCODE_1) - select2[v] = '1'; - else if (key == Common::KEYCODE_2) - select2[v] = '2'; - else if (key == Common::KEYCODE_3) - select2[v] = '3'; - else if (key == Common::KEYCODE_4) - select2[v] = '4'; - else if (key == Common::KEYCODE_5) - select2[v] = '5'; - else if (key == Common::KEYCODE_6) - select2[v] = '6'; - else if (key == Common::KEYCODE_7) - select2[v] = '7'; - else if (key == Common::KEYCODE_8) - select2[v] = '8'; - else if (key == Common::KEYCODE_9) - select2[v] = '9'; - else if (key == Common::KEYCODE_0) - select2[v] = '0'; - else if (key == Common::KEYCODE_SPACE) - select2[v] = '\167'; - else if (key == ESC) - break; - else if (key == Common::KEYCODE_RETURN) { - select2[v] = '\0'; - h = 1; - break; - } else if (key == Common::KEYCODE_BACKSPACE) - select2[v] = '\0'; - else - v--; - - if (key == Common::KEYCODE_BACKSPACE) - v--; - else - v++; - } - if (v == 22) - v = 21; - else if (v == -1) - v = 0; - } - if (h == 1) { - strcpy(select, select2); - hay_seleccion = 1; - } -} - -void DrasculaEngine::para_grabar(char nom_game[]) { - graba_partida(nom_game); - comienza_sound("99.als"); - fin_sound(); -} - -void DrasculaEngine::OpenSSN(const char *Name, int Pause) { - MiVideoSSN = (byte *)malloc(64256); - GlobalSpeed = 1000 / Pause; - FrameSSN = 0; - UsingMem = 0; - if (MiVideoSSN == NULL) - return; - _Sesion = new Common::File; - _Sesion->open(Name); - mSesion = TryInMem(_Sesion); - LastFrame = _system->getMillis(); -} - -int DrasculaEngine::PlayFrameSSN() { - int Exit = 0; - int Lengt; - byte *BufferSSN; - - if (!UsingMem) - _Sesion->read(&CHUNK, 1); - else { - memcpy(&CHUNK, mSesion, 1); - mSesion += 1; - } - switch (CHUNK) { - case SET_PALET: - if (!UsingMem) - _Sesion->read(dacSSN, 768); - else { - memcpy(dacSSN, mSesion, 768); - mSesion += 768; - } - set_dacSSN(dacSSN); - break; - case EMPTY_FRAME: - WaitFrameSSN(); - break; - case INIT_FRAME: - if (!UsingMem) { - _Sesion->read(&CMP, 1); - _Sesion->read(&Lengt, 4); - } else { - memcpy(&CMP, mSesion, 1); - mSesion += 1; - memcpy(&Lengt, mSesion, 4); - mSesion += 4; - } - if (CMP == CMP_RLE) { - if (!UsingMem) { - BufferSSN = (byte *)malloc(Lengt); - _Sesion->read(BufferSSN, Lengt); - } else { - BufferSSN = (byte *)malloc(Lengt); - memcpy(BufferSSN, mSesion, Lengt); - mSesion += Lengt; - } - Des_RLE(BufferSSN, MiVideoSSN); - free(BufferSSN); - if (FrameSSN) { - WaitFrameSSN(); - MixVideo(VGA, MiVideoSSN); - _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); - } else { - WaitFrameSSN(); - memcpy(VGA, MiVideoSSN, 64000); - _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); - } - _system->updateScreen(); - FrameSSN++; - } else { - if (CMP == CMP_OFF) { - if (!UsingMem) { - BufferSSN = (byte *)malloc(Lengt); - _Sesion->read(BufferSSN, Lengt); - } else { - BufferSSN = (byte *)malloc(Lengt); - memcpy(BufferSSN, mSesion, Lengt); - mSesion += Lengt; - } - Des_OFF(BufferSSN, MiVideoSSN, Lengt); - free(BufferSSN); - if (FrameSSN) { - WaitFrameSSN(); - MixVideo(VGA, MiVideoSSN); - _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); - } else { - WaitFrameSSN(); - memcpy(VGA, MiVideoSSN, 64000); - _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); - } - _system->updateScreen(); - FrameSSN++; - } - } - break; - case END_ANIM: - Exit = 1; - break; - default: - Exit = 1; - break; - } - - return (!Exit); -} - -void DrasculaEngine::EndSSN() { - free(MiVideoSSN); - if (UsingMem) - free(pointer); - else { - _Sesion->close(); - delete _Sesion; - } -} - -byte *DrasculaEngine::TryInMem(Common::File *Sesion) { - int Lengt; - - Sesion->seek(0, SEEK_END); - Lengt = Sesion->pos(); - Sesion->seek(0, SEEK_SET); - pointer = (byte *)malloc(Lengt); - if (pointer == NULL) - return NULL; - Sesion->read(pointer, Lengt); - UsingMem = 1; - Sesion->close(); - delete Sesion; - return pointer; -} - -void DrasculaEngine::set_dacSSN(byte *PalBuf) { - setvgapalette256((byte *)PalBuf); -} - -void DrasculaEngine::Des_OFF(byte *BufferOFF, byte *MiVideoOFF, int Lenght) { - int x = 0; - unsigned char Reps; - int Offset; - - memset(MiVideoSSN, 0, 64000); - while (x < Lenght) { - Offset = BufferOFF[x] + BufferOFF[x + 1] * 256; - Reps = BufferOFF[x + 2]; - memcpy(MiVideoOFF + Offset, &BufferOFF[x + 3], Reps); - x += 3 + Reps; - } -} - -void DrasculaEngine::Des_RLE(byte *BufferRLE, byte *MiVideoRLE) { - signed int con = 0; - unsigned int X = 0; - unsigned int fExit = 0; - char ch, rep; - while (!fExit) { - ch = *BufferRLE++; - rep = 1; - if ((ch & 192) == 192) { - rep = (ch & 63); - ch =* BufferRLE++; - } - for (con = 0; con < rep; con++) { - *MiVideoRLE++ = ch; - X++; - if (X > 64000) - fExit = 1; - } - } -} - -void DrasculaEngine::MixVideo(byte *OldScreen, byte *NewScreen) { - int x; - for (x = 0; x < 64000; x++) - OldScreen[x] ^= NewScreen[x]; -} - -void DrasculaEngine::WaitFrameSSN() { - uint32 now; - while ((now = _system->getMillis()) - LastFrame < ((uint32) GlobalSpeed)) - _system->delayMillis(GlobalSpeed - (now - LastFrame)); - LastFrame = LastFrame + GlobalSpeed; -} - -byte *DrasculaEngine::carga_pcx(byte *NamePcc) { - signed int con = 0; - unsigned int X = 0; - unsigned int fExit = 0; - char ch, rep; - byte *AuxPun; - - AuxPun = AuxBuffDes; - - while (!fExit) { - ch = *NamePcc++; - rep = 1; - if ((ch & 192) == 192) { - rep = (ch & 63); - ch = *NamePcc++; - } - for (con = 0; con< rep; con++) { - *AuxPun++ = ch; - X++; - if (X > 64000) - fExit = 1; - } - } - return AuxBuffDes; -} - -void DrasculaEngine::set_dac(byte *dac) { - setvgapalette256((byte *)dac); -} - -void DrasculaEngine::WaitForNext(int FPS) { - _system->delayMillis(1000 / FPS); -} - -int DrasculaEngine::vez() { - return _system->getMillis() / 20; // originaly was 1 -} - -void DrasculaEngine::reduce_hare_chico(int xx1, int yy1, int xx2, int yy2, int ancho, int alto, int factor, byte *dir_inicio, byte *dir_fin) { - float suma_x, suma_y; - int n, m; - float pixel_x, pixel_y; - int pos_pixel[6]; - - nuevo_ancho = (ancho * factor) / 100; - nuevo_alto = (alto * factor) / 100; - - suma_x = ancho / nuevo_ancho; - suma_y = alto / nuevo_alto; - - pixel_x = xx1; - pixel_y = yy1; - - for (n = 0; n < nuevo_alto; n++) { - for (m = 0; m < nuevo_ancho; m++) { - pos_pixel[0] = (int)pixel_x; - pos_pixel[1] = (int)pixel_y; - pos_pixel[2] = xx2 + m; - pos_pixel[3] = yy2 + n; - pos_pixel[4] = 1; - pos_pixel[5] = 1; - - copyRectClip(pos_pixel, dir_inicio, dir_fin); - - pixel_x = pixel_x + suma_x; - } - pixel_x = xx1; - pixel_y = pixel_y + suma_y; - } -} - -char DrasculaEngine::codifica(char car) { - return ~car; -} - -void DrasculaEngine::cuadrante_1() { - float distancia_x, distancia_y; - - if (num_ejec == 2) - distancia_x = hare_x - sitio_x; - else - distancia_x = hare_x + ancho_hare / 2 - sitio_x; - - distancia_y = (hare_y + alto_hare) - sitio_y; - - if (distancia_x < distancia_y) { - direccion_hare = 0; - sentido_hare = 2; - paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); - } else { - direccion_hare = 7; - sentido_hare = 0; - paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); - } -} - -void DrasculaEngine::cuadrante_2() { - float distancia_x, distancia_y; - - if (num_ejec == 2) - distancia_x = abs(hare_x + ancho_hare - sitio_x); - else - distancia_x = abs(hare_x + ancho_hare / 2 - sitio_x); - - distancia_y = (hare_y + alto_hare) - sitio_y; - - if (distancia_x < distancia_y) { - direccion_hare = 1; - sentido_hare = 2; - paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); - } else { - direccion_hare = 2; - sentido_hare = 1; - paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); - } -} - -void DrasculaEngine::cuadrante_3() { - float distancia_x, distancia_y; - - if (num_ejec == 2) - distancia_x = hare_x - sitio_x; - else - distancia_x = hare_x + ancho_hare / 2 - sitio_x; - - distancia_y = sitio_y - (hare_y + alto_hare); - - if (distancia_x < distancia_y) { - direccion_hare = 5; - sentido_hare = 3; - paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); - } else { - direccion_hare = 6; - sentido_hare = 0; - paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); - } -} - -void DrasculaEngine::cuadrante_4() { - float distancia_x, distancia_y; - - if (num_ejec == 2) - distancia_x = abs(hare_x + ancho_hare - sitio_x); - else - distancia_x = abs(hare_x + ancho_hare / 2 - sitio_x); - - distancia_y = sitio_y - (hare_y + alto_hare); - - if (distancia_x < distancia_y) { - direccion_hare = 4; - sentido_hare = 3; - paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); - } else { - direccion_hare = 3; - sentido_hare = 1; - paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); - } -} - -void DrasculaEngine::graba_partida(char nom_game[]) { - Common::OutSaveFile *out; - int l; - - if (!(out = _saveFileMan->openForSaving(nom_game))) { - error("no puedo abrir el archivo"); - } - out->writeSint32LE(num_ejec); - out->write(datos_actuales, 20); - out->writeSint32LE(hare_x); - out->writeSint32LE(hare_y); - out->writeSint32LE(sentido_hare); - - for (l = 1; l < 43; l++) { - out->writeSint32LE(objetos_que_tengo[l]); - } - - for (l = 0; l < NUM_BANDERAS; l++) { - out->writeSint32LE(flags[l]); - } - - out->writeSint32LE(lleva_objeto); - out->writeSint32LE(objeto_que_lleva); - - out->finalize(); - if (out->ioFailed()) - warning("Can't write file '%s'. (Disk full?)", nom_game); - - delete out; -} - -void DrasculaEngine::aumenta_num_frame() { - diff_vez = vez() - conta_vez; - - if (diff_vez >= 6) { - conta_vez = vez(); - num_frame++; - if (num_frame == 6) - num_frame = 0; - - if (direccion_hare == 0) { - hare_x = hare_x - paso_x; - hare_y = hare_y - paso_y; - } else if (direccion_hare == 7) { - hare_x = hare_x - paso_x; - hare_y = hare_y - paso_y; - } else if (direccion_hare == 1) { - hare_x = hare_x + paso_x; - hare_y = hare_y - paso_y; - } else if (direccion_hare == 2) { - hare_x = hare_x + paso_x; - hare_y = hare_y - paso_y; - } else if (direccion_hare == 3) { - hare_x = hare_x + paso_x; - hare_y = hare_y + paso_y; - } else if (direccion_hare == 4) { - hare_x = hare_x + paso_x; - hare_y = hare_y + paso_y; - } else if (direccion_hare == 5) { - hare_x = hare_x - paso_x; - hare_y = hare_y + paso_y; - } else if (direccion_hare == 6) { - hare_x = hare_x - paso_x; - hare_y = hare_y + paso_y; - } - } - - if (num_ejec != 2) { - diferencia_y = (int)(alto_hare - nuevo_alto); - diferencia_x = (int)(ancho_hare - nuevo_ancho); - hare_y = hare_y + diferencia_y; - hare_x = hare_x + diferencia_x; - alto_hare = (int)nuevo_alto; - ancho_hare = (int)nuevo_ancho; - } -} - -int DrasculaEngine::sobre_que_objeto() { - int n = 0; - - for (n = 1; n < 43; n++) { - if (x_raton > x_obj[n] && y_raton > y_obj[n] - && x_raton < x_obj[n] + ANCHOBJ && y_raton < y_obj[n] + ALTOBJ) - break; - } - - return n; -} - -bool DrasculaEngine::comprueba_banderas_menu() { - int h, n; - - for (n = 0; n < 43; n++) { - if (sobre_que_objeto() == n) { - h = objetos_que_tengo[n]; - if (h != 0) - if (banderas(h)) - return true; - } - } - - return false; -} - -void DrasculaEngine::conversa(const char *nom_fich) { - int h; - int juego1 = 1, juego2 = 1, juego3 = 1, juego4 = 1; - char frase1[78]; - char frase2[78]; - char frase3[87]; - char frase4[78]; - char para_codificar[13]; - char suena1[13]; - char suena2[13]; - char suena3[13]; - char suena4[13]; - int longitud; - int respuesta1; - int respuesta2; - int respuesta3; - int usado1 = 0; - int usado2 = 0; - int usado3 = 0; - char buffer[256]; - - rompo_y_salgo = 0; - - strcpy(para_codificar, nom_fich); - - if (num_ejec == 5) - sin_verbo(); - - ald = new Common::File; - ald->open(nom_fich); - if (!ald->isOpen()) { - error("missing data file"); - } - int size = ald->size(); - - getLine(ald, buffer, size); - sscanf(buffer, "%s", frase1); - getLine(ald, buffer, size); - sscanf(buffer, "%s", frase2); - getLine(ald, buffer, size); - sscanf(buffer, "%s", frase3); - getLine(ald, buffer, size); - sscanf(buffer, "%s", frase4); - getLine(ald, buffer, size); - sscanf(buffer, "%s", suena1); - getLine(ald, buffer, size); - sscanf(buffer, "%s", suena2); - getLine(ald, buffer, size); - sscanf(buffer, "%s", suena3); - getLine(ald, buffer, size); - sscanf(buffer, "%s", suena4); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &respuesta1); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &respuesta2); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &respuesta3); - delete ald; - ald = NULL; - - if (num_ejec == 2 && !strcmp(nom_fich, "op_5.cal") && flags[38] == 1 && flags[33] == 1) { - strcpy(frase3, TEXT405); - strcpy(suena3, "405.als"); - respuesta3 = 31; - } - - if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[7] == 1) { - strcpy(frase3, TEXT273); - strcpy(suena3, "273.als"); - respuesta3 = 14; - } - - if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[10] == 1) { - strcpy(frase3, " cuanto queda para que acabe el partido?"); - strcpy(suena3, "274.als"); - respuesta3 = 15; - } - - longitud = strlen(frase1); - for (h = 0; h < longitud; h++) - if (frase1[h] == (char)0xa7) - frase1[h] = ' '; - - longitud = strlen(frase2); - for (h = 0; h < longitud; h++) - if (frase2[h] == (char)0xa7) - frase2[h] = ' '; - - longitud = strlen(frase3); - for (h = 0; h < longitud; h++) - if (frase3[h] == (char)0xa7) - frase3[h] = ' '; - - longitud = strlen(frase4); - for (h = 0; h < longitud; h++) - if (frase4[h] == (char)0xa7) - frase4[h] = ' '; - - loadPic("car.alg"); - decompressPic(dir_hare_fondo, 1); - // TODO code here should limit y position for mouse in dialog menu, - // but we can't implement this due lack backend functionality - // from 1(top) to 31 - color_abc(VERDE_CLARO); - -bucle_opc: - - updateRoom(); - - if (num_ejec == 1 || num_ejec == 4 || num_ejec == 6) { - if (music_status() == 0 && flags[11] == 0) - playmusic(musica_room); - } else if (num_ejec == 2) { - if (music_status() == 0 && flags[11] == 0 && musica_room != 0) - playmusic(musica_room); - } else if (num_ejec == 3 || num_ejec == 5) { - if (music_status() == 0) - playmusic(musica_room); - } - - MirarRaton(); - - if (y_raton > 0 && y_raton < 9) { - if (usado1 == 1 && _color != BLANCO) - color_abc(BLANCO); - else if (usado1 == 0 && _color != VERDE_CLARO) - color_abc(VERDE_CLARO); - } else if (y_raton > 8 && y_raton < 17) { - if (usado2 == 1 && _color != BLANCO) - color_abc(BLANCO); - else if (usado2 == 0 && _color != VERDE_CLARO) - color_abc(VERDE_CLARO); - } else if (y_raton > 16 && y_raton < 25) { - if (usado3 == 1 && _color != BLANCO) - color_abc(BLANCO); - else if (usado3 == 0 && _color != VERDE_CLARO) - color_abc(VERDE_CLARO); - } else if (_color != VERDE_CLARO) - color_abc(VERDE_CLARO); - - if (y_raton > 0 && y_raton < 9) - juego1 = 2; - else if (y_raton > 8 && y_raton < 17) - juego2 = 2; - else if (y_raton > 16 && y_raton < 25) - juego3 = 2; - else if (y_raton > 24 && y_raton < 33) - juego4 = 2; - - print_abc_opc(frase1, 1, 2, juego1); - print_abc_opc(frase2, 1, 10, juego2); - print_abc_opc(frase3, 1, 18, juego3); - print_abc_opc(frase4, 1, 26, juego4); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - if ((boton_izq == 1) && (juego1 == 2)) { - delay(100); - usado1 = 1; - talk(frase1, suena1); - if (num_ejec == 3) - grr(); - else - responde(respuesta1); - } else if ((boton_izq == 1) && (juego2 == 2)) { - delay(100); - usado2 = 1; - talk(frase2, suena2); - if (num_ejec == 3) - grr(); - else - responde(respuesta2); - } else if ((boton_izq == 1) && (juego3 == 2)) { - delay(100); - usado3 = 1; - talk(frase3, suena3); - if (num_ejec == 3) - grr(); - else - responde(respuesta3); - } else if ((boton_izq == 1) && (juego4 == 2)) { - delay(100); - talk(frase4, suena4); - rompo_y_salgo = 1; - } - - if (boton_izq == 1) { - delay(100); - color_abc(VERDE_CLARO); - } - - if (usado1 == 0) - juego1 = 1; - else - juego1 = 3; - if (usado2 == 0) - juego2 = 1; - else - juego2 = 3; - if (usado3 == 0) - juego3 = 1; - else - juego3 = 3; - - juego4 = 1; - - if (rompo_y_salgo == 0) - goto bucle_opc; - - if (num_ejec == 2) - loadPic(fondo_y_menu); - else - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - if (num_ejec != 5) - sin_verbo(); -} - -void DrasculaEngine::print_abc_opc(const char *dicho, int x_pantalla, int y_pantalla, int juego) { - int pos_texto[6]; - int y_de_signos, y_de_letra, x_de_letra = 0, h, longitud; - longitud = strlen(dicho); - - for (h = 0; h < longitud; h++) { - if (juego == 1) { - y_de_letra = Y_ABC_OPC_1; - y_de_signos = Y_SIGNOS_OPC_1; - } else if (juego == 3) { - y_de_letra = Y_ABC_OPC_3; - y_de_signos = Y_SIGNOS_OPC_3; - } else { - y_de_letra = Y_ABC_OPC_2; - y_de_signos = Y_SIGNOS_OPC_2; - } - - int c = toupper(dicho[h]); - if (c == 'A') - x_de_letra = X_A_OPC; - else if (c == 'B') - x_de_letra = X_B_OPC; - else if (c == 'C') - x_de_letra = X_C_OPC; - else if (c == 'D') - x_de_letra = X_D_OPC; - else if (c == 'E') - x_de_letra = X_E_OPC; - else if (c == 'F') - x_de_letra = X_F_OPC; - else if (c == 'G') - x_de_letra = X_G_OPC; - else if (c == 'H') - x_de_letra = X_H_OPC; - else if (c == 'I') - x_de_letra = X_I_OPC; - else if (c == 'J') - x_de_letra = X_J_OPC; - else if (c == 'K') - x_de_letra = X_K_OPC; - else if (c == 'L') - x_de_letra = X_L_OPC; - else if (c == 'M') - x_de_letra = X_M_OPC; - else if (c == 'N') - x_de_letra = X_N_OPC; - else if (c == 'O') - x_de_letra = X_O_OPC; - else if (c == 'P') - x_de_letra = X_P_OPC; - else if (c == 'Q') - x_de_letra = X_Q_OPC; - else if (c == 'R') - x_de_letra = X_R_OPC; - else if (c == 'S') - x_de_letra = X_S_OPC; - else if (c == 'T') - x_de_letra = X_T_OPC; - else if (c == 'U') - x_de_letra = X_U_OPC; - else if (c == 'V') - x_de_letra = X_V_OPC; - else if (c == 'W') - x_de_letra = X_W_OPC; - else if (c == 'X') - x_de_letra = X_X_OPC; - else if (c == 'Y') - x_de_letra = X_Y_OPC; - else if (c == 'Z') - x_de_letra = X_Z_OPC; - else if (c == ' ') - x_de_letra = ESPACIO_OPC; - else { - y_de_letra = y_de_signos; - if (c == '.') - x_de_letra = X_PUNTO_OPC; - else if (c == ',') - x_de_letra = X_COMA_OPC; - else if (c == '-') - x_de_letra = X_GUION_OPC; - else if (c == '?') - x_de_letra = X_CIERRA_INTERROGACION_OPC; - else if (c == 0xa8) - x_de_letra = X_ABRE_INTERROGACION_OPC; -// else if (c == '\'') // FIXME -// x_de_letra = ESPACIO; // space for now - else if (c == '"') - x_de_letra = X_COMILLAS_OPC; - else if (c == '!') - x_de_letra = X_CIERRA_INTERROGACION_OPC; - else if (c == 0xad) - x_de_letra = X_ABRE_EXCLAMACION_OPC; - else if (c == ';') - x_de_letra = X_PUNTO_Y_COMA_OPC; - else if (c == '>') - x_de_letra = X_MAYOR_QUE_OPC; - else if (c == '<') - x_de_letra = X_MENOR_QUE_OPC; - else if (c == '$') - x_de_letra = X_DOLAR_OPC; - else if (c == '%') - x_de_letra = X_POR_CIENTO_OPC; - else if (c == ':') - x_de_letra = X_DOS_PUNTOS_OPC; - else if (c == '&') - x_de_letra = X_AND_OPC; - else if (c == '/') - x_de_letra = X_BARRA_OPC; - else if (c == '(') - x_de_letra = X_ABRE_PARENTESIS_OPC; - else if (c == ')') - x_de_letra = X_CIERRA_PARENTESIS_OPC; - else if (c == '*') - x_de_letra = X_ASTERISCO_OPC; - else if (c == '+') - x_de_letra = X_MAS_OPC; - else if (c == '1') - x_de_letra = X_N1_OPC; - else if (c == '2') - x_de_letra = X_N2_OPC; - else if (c == '3') - x_de_letra = X_N3_OPC; - else if (c == '4') - x_de_letra = X_N4_OPC; - else if (c == '5') - x_de_letra = X_N5_OPC; - else if (c == '6') - x_de_letra = X_N6_OPC; - else if (c == '7') - x_de_letra = X_N7_OPC; - else if (c == '8') - x_de_letra = X_N8_OPC; - else if (c == '9') - x_de_letra = X_N9_OPC; - else if (c == '0') - x_de_letra = X_N0_OPC; - } - - pos_texto[0] = x_de_letra; - pos_texto[1] = y_de_letra; - pos_texto[2] = x_pantalla; - pos_texto[3] = y_pantalla; - pos_texto[4] = ANCHO_LETRAS_OPC; - pos_texto[5] = ALTO_LETRAS_OPC; - - copyRectClip(pos_texto, dir_hare_fondo, dir_zona_pantalla); - - x_pantalla = x_pantalla + ANCHO_LETRAS_OPC; - } -} - -void DrasculaEngine::responde(int funcion) { - if (num_ejec == 1) { - if (funcion == 10) - talk_borracho(TEXTB1, "B1.als"); - else if (funcion == 11) - talk_borracho(TEXTB2, "B2.als"); - else if (funcion == 12) - talk_borracho(TEXTB3, "B3.als"); - } else if (num_ejec == 2) { - if (funcion == 8) - animation_8_2(); - else if (funcion == 9) - animation_9_2(); - else if (funcion == 10) - animation_10_2(); - else if (funcion == 15) - animation_15_2(); - else if (funcion == 16) - animation_16_2(); - else if (funcion == 17) - animation_17_2(); - else if (funcion == 19) - animation_19_2(); - else if (funcion == 20) - animation_20_2(); - else if (funcion == 21) - animation_21_2(); - else if (funcion == 23) - animation_23_2(); - else if (funcion == 28) - animation_28_2(); - else if (funcion == 29) - animation_29_2(); - else if (funcion == 30) - animation_30_2(); - else if (funcion == 31) - animation_31_2(); - } else if (num_ejec == 4) { - if (funcion == 2) - animation_2_4(); - else if (funcion == 3) - animation_3_4(); - else if (funcion == 4) - animation_4_4(); - } else if (num_ejec == 5) { - if (funcion == 2) - animation_2_5(); - else if (funcion == 3) - animation_3_5(); - else if (funcion == 6) - animation_6_5(); - else if (funcion == 7) - animation_7_5(); - else if (funcion == 8) - animation_8_5(); - else if (funcion == 15) - animation_15_5(); - else if (funcion == 16) - animation_16_5(); - else if (funcion == 17) - animation_17_5(); - } else if (num_ejec == 6) { - if (funcion == 2) - animation_2_6(); - else if (funcion == 3) - animation_3_6(); - else if (funcion == 4) - animation_4_6(); - else if (funcion == 11) - animation_11_6(); - else if (funcion == 12) - animation_12_6(); - else if (funcion == 13) - animation_13_6(); - else if (funcion == 14) - animation_14_6(); - else if (funcion == 15) - animation_15_6(); - } -} - -void DrasculaEngine::talk_pianista(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - int x_talk[4] = { 97, 145, 193, 241 }; - int cara; - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(BLANCO); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - cara = _rnd->getRandomNumber(3); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 139, 228, 112, 47, 60, - dir_hare_dch, dir_zona_pantalla); - pon_hare(); - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, 221, 128); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - byte key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_borracho(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[8] = { 1, 21, 41, 61, 81, 101, 121, 141 }; - int cara; - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - if (num_ejec == 1) { - loadPic("an11y13.alg"); - decompressPic(dir_hare_frente, 1); - } - - flags[13] = 1; - -bebiendo: - - if (flags[12] == 1) { - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - goto bebiendo; - } - - buffer_teclado(); - - color_abc(VERDE_OSCURO); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz\n"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 29, 177, 50, 19, 19, dir_hare_frente, dir_zona_pantalla); - pon_hare(); - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, 181, 54); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - byte key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - flags[13] = 0; - if (num_ejec == 1) { - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - } - - if (num_ejec == 1) { - if (music_status() == 0 && flags[11] == 0) - playmusic(musica_room); - } else if (num_ejec == 2) { - if (music_status() == 0 && flags[11] == 0 && musica_room != 0) - playmusic(musica_room); - } -} - -void DrasculaEngine::suma_objeto(int osj) { - int h, puesto = 0; - - for (h = 1; h < 43; h++) { - if (objetos_que_tengo[h] == osj) - puesto = 1; - } - - if (puesto == 0) { - for (h = 1; h < 43; h++) { - if (objetos_que_tengo[h] == 0) { - objetos_que_tengo[h] = osj; - puesto = 1; - break; - } - } - } -} - -void DrasculaEngine::fin_sound_corte() { - if (hay_sb == 1) { - ctvd_stop(); - delete sku; - sku = NULL; - ctvd_terminate(); - } -} - -void DrasculaEngine::MusicFadeout() { - int org_vol = _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType); - for (;;) { - int vol = _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType); - vol -= 10; - if (vol < 0) - vol = 0; - _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, vol); - if (vol == 0) - break; - update_events(); - _system->updateScreen(); - _system->delayMillis(50); - } - AudioCD.stop(); - _system->delayMillis(100); - _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, org_vol); -} - -void DrasculaEngine::ctvd_end() { - _mixer->stopHandle(_soundHandle); -} - -void DrasculaEngine::ctvd_stop() { - _mixer->stopHandle(_soundHandle); -} - -void DrasculaEngine::ctvd_terminate() { -// _mixer->stopHandle(_soundHandle); -} - -void DrasculaEngine::ctvd_speaker(int flag) {} - -void DrasculaEngine::ctvd_output(Common::File *file_handle) {} - -void DrasculaEngine::ctvd_init(int b) { - int soundSize = sku->size(); - byte *soundData = (byte *)malloc(soundSize); - sku->seek(32); - sku->read(soundData, soundSize); - _mixer->playRaw(Audio::Mixer::kSFXSoundType, &_soundHandle, soundData, soundSize - 64, - 11025, Audio::Mixer::FLAG_AUTOFREE | Audio::Mixer::FLAG_UNSIGNED); -} - -int DrasculaEngine::LookForFree() { - return _mixer->isSoundHandleActive(_soundHandle); -} - -void DrasculaEngine::actualiza_datos() { - if (num_ejec == 1) { - // nothing - } else if (num_ejec == 2) { - if (!strcmp(num_room,"2.alg") && flags[40] == 0) - visible[3] = 0; - else if (!strcmp(num_room, "3.alg") && flags[3] == 1) - visible[8] = 0; - else if (!strcmp(num_room, "6.alg") && flags[1] == 1 && flags[10] == 0) { - visible[2] = 0; - visible[4] = 1; - } else if (!strcmp(num_room, "7.alg") && flags[35] == 1) - visible[3] = 0; - else if (!strcmp(num_room, "14.alg") && flags[5] == 1) - visible[4] = 0; - else if (!strcmp(num_room, "18.alg") && flags[28] == 1) - visible[2] = 0; - } else if (num_ejec == 3) { - // nothing - } else if (num_ejec == 4) { - if (!strcmp(num_room, "23.alg") && flags[0] == 0 && flags[11] == 0) - visible[2] = 1; - if (!strcmp(num_room, "23.alg") && flags[0] == 1 && flags[11] == 0) - visible[2] = 0; - if (!strcmp(num_room, "21.alg") && flags[10] == 1) - visible[2] = 0; - if (!strcmp(num_room, "22.alg") && flags[26] == 1) { - visible[2] = 0; - visible[1] = 1; - } - if (!strcmp(num_room, "22.alg") && flags[27] == 1) - visible[3] = 0; - if (!strcmp(num_room, "26.alg") && flags[21] == 0) - strcpy(nombre_obj[2], "HUNCHBACKED"); - if (!strcmp(num_room, "26.alg") && flags[18] == 1) - visible[2] = 0; - if (!strcmp(num_room, "26.alg") && flags[12] == 1) - visible[1] = 0; - if (!strcmp(num_room, "35.alg") && flags[14] == 1) - visible[2] = 0; - if (!strcmp(num_room, "35.alg") && flags[17] == 1) - visible[3] = 1; - if (!strcmp(num_room, "35.alg") && flags[15] == 1) - visible[1] = 0; - } else if (num_ejec == 5) { - if (!strcmp(num_room,"49.alg") && flags[6] == 1) - visible[2] = 0; - if (!strcmp(num_room,"49.alg") && flags[6] == 0) - visible[1] = 0; - if (!strcmp(num_room,"49.alg") && flags[6] == 1) - visible[1] = 1; - if (!strcmp(num_room,"45.alg") && flags[6] == 1) - visible[3] = 1; - if (!strcmp(num_room,"53.alg") && flags[2] == 1) - visible[3] = 0; - if (!strcmp(num_room,"54.alg") && flags[13] == 1) - visible[3] = 0; - if (!strcmp(num_room,"55.alg") && flags[8] == 1) - visible[1] = 0; - } else if (num_ejec == 6) { - if ((!strcmp(num_room, "58.alg")) && flags[8] == 0) - espuerta[1] = 0; - if ((!strcmp(num_room, "58.alg")) && flags[8] == 1) - espuerta[1] = 1; - if (!strcmp(num_room, "59.alg")) - espuerta[1] = 0; - if (!strcmp(num_room, "60.alg")) { - sentido_dr = 0; - x_dr = 155; - y_dr = 69; - } - } -} - -void DrasculaEngine::talk_vb(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[6] = {1, 27, 53, 79, 105, 131}; - int cara; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(VON_BRAUN); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + if (menu_scr == 1) { + if (num_ejec == 1) { + if (objeto_que_lleva == LOOK && fl == 28) + talk(TEXT328, "328.als"); + } else if (num_ejec == 2) { + if ((objeto_que_lleva == LOOK && fl == 22 && flags[23] == 0) + || (objeto_que_lleva == OPEN && fl == 22 && flags[23] == 0)) { + talk(TEXT164, "164.als"); + flags[23] = 1; + sin_verbo(); + suma_objeto(7); + suma_objeto(18); + } else if (objeto_que_lleva == LOOK && fl == 22 && flags[23] == 1) + talk(TEXT307, "307.als"); + else if (objeto_que_lleva == LOOK && fl == 28) + talk(TEXT328, "328.als"); + else if (objeto_que_lleva == LOOK && fl == 7) + talk(TEXT143, "143.als"); + else if (objeto_que_lleva == TALK && fl == 7) + talk(TEXT144, "144.als"); + else if (objeto_que_lleva == LOOK && fl == 8) + talk(TEXT145, "145.als"); + else if (objeto_que_lleva == TALK && fl == 8) + talk(TEXT146, "146.als"); + else if (objeto_que_lleva == LOOK && fl == 9) + talk(TEXT147, "147.als"); + else if (objeto_que_lleva == TALK && fl == 9) + talk(TEXT148, "148.als"); + else if (objeto_que_lleva == LOOK && fl == 10) + talk(TEXT151, "151.als"); + else if (objeto_que_lleva == LOOK && fl == 11) + talk(TEXT152, "152.als"); + else if (objeto_que_lleva == TALK && fl == 11) + talk(TEXT153, "153.als"); + else if (objeto_que_lleva == LOOK && fl == 12) + talk(TEXT154, "154.als"); + else if (objeto_que_lleva == LOOK && fl == 13) + talk(TEXT155, "155.als"); + else if (objeto_que_lleva == LOOK && fl == 14) + talk(TEXT157, "157.als"); + else if (objeto_que_lleva == LOOK && fl == 15) + talk(TEXT58, "58.als"); + else if (objeto_que_lleva == LOOK && fl == 16) + talk(TEXT158, "158.als"); + else if (objeto_que_lleva == LOOK && fl == 17) + talk(TEXT159, "159.als"); + else if (objeto_que_lleva == LOOK && fl == 18) + talk(TEXT160, "160.als"); + else if (objeto_que_lleva == LOOK && fl == 19) + talk(TEXT161, "161.als"); + else if (objeto_que_lleva == LOOK && fl == 20) + talk(TEXT162, "162.als"); + else if (objeto_que_lleva == LOOK && fl == 23) + talk(TEXT152, "152.als"); + else + hay_respuesta = 0; + } else if (num_ejec == 3) { + if (objeto_que_lleva == LOOK && fl == 22) + talk(TEXT307, "307.als"); + else if (objeto_que_lleva == LOOK && fl == 28) + talk(TEXT328, "328.als"); + else if (objeto_que_lleva == LOOK && fl == 7) + talk(TEXT143, "143.als"); + else if (objeto_que_lleva == TALK && fl == 7) + talk(TEXT144, "144.als"); + else if (objeto_que_lleva == LOOK && fl == 8) + talk(TEXT145, "145.als"); + else if (objeto_que_lleva == TALK && fl == 8) + talk(TEXT146, "146.als"); + else if (objeto_que_lleva == LOOK && fl == 9) + talk(TEXT147, "147.als"); + else if (objeto_que_lleva == TALK && fl == 9) + talk(TEXT148, "148.als"); + else if (objeto_que_lleva == LOOK && fl == 10) + talk(TEXT151, "151.als"); + else if (objeto_que_lleva == LOOK && fl == 11) + talk(TEXT152, "152.als"); + else if (objeto_que_lleva == TALK && fl == 11) + talk(TEXT153, "153.als"); + else if (objeto_que_lleva == LOOK && fl == 12) + talk(TEXT154, "154.als"); + else if (objeto_que_lleva == LOOK && fl == 13) + talk(TEXT155, "155.als"); + else if (objeto_que_lleva == LOOK && fl == 14) + talk(TEXT157, "157.als"); + else if (objeto_que_lleva == LOOK && fl == 15) + talk(TEXT58, "58.als"); + else if (objeto_que_lleva == LOOK && fl == 16) + talk(TEXT158, "158.als"); + else if (objeto_que_lleva == LOOK && fl == 17) + talk(TEXT159, "159.als"); + else if (objeto_que_lleva == LOOK && fl == 18) + talk(TEXT160, "160.als"); + else if (objeto_que_lleva == LOOK && fl == 19) + talk(TEXT161, "161.als"); + else if (objeto_que_lleva == LOOK && fl == 20) + talk(TEXT162, "162.als"); + else if (objeto_que_lleva == LOOK && fl == 23) + talk(TEXT152, "152.als"); + else + hay_respuesta = 0; + } else if (num_ejec == 4) { + if ((objeto_que_lleva == 18 && fl == 19) || (objeto_que_lleva == 19 && fl == 18)) { + sin_verbo(); + elige_objeto(21); + resta_objeto(18); + resta_objeto(19); + } else if ((objeto_que_lleva == 14 && fl == 19) || (objeto_que_lleva == 19 && fl == 14)) + talk(TEXT484, "484.als"); + else if (objeto_que_lleva == LOOK && fl == 28) + talk(TEXT328, "328.als"); + else if (objeto_que_lleva == LOOK && fl == 7) + talk(TEXT478, "478.als"); + else if (objeto_que_lleva == LOOK && fl == 8) + talk(TEXT480, "480.als"); + else if (objeto_que_lleva == LOOK && fl == 9) { + talk(TEXT482, "482.als"); + talk(TEXT483, "483.als"); + } else if (objeto_que_lleva == LOOK && fl == 10) + talk(TEXT485, "485.als"); + else if (objeto_que_lleva == LOOK && fl == 11) + talk(TEXT488, "488.als"); + else if (objeto_que_lleva == LOOK && fl == 12) + talk(TEXT486, "486.als"); + else if (objeto_que_lleva == LOOK && fl == 13) + talk(TEXT490, "490.als"); + else if (objeto_que_lleva == LOOK && fl == 14) + talk(TEXT122, "122.als"); + else if (objeto_que_lleva == LOOK && fl == 15) + talk(TEXT117, "117.als"); + else if (objeto_que_lleva == TALK && fl == 15) + talk(TEXT118, "118.als"); + else if (objeto_que_lleva == OPEN && fl == 15) + talk(TEXT119, "119.als"); + else if (objeto_que_lleva == LOOK && fl == 16) + talk(TEXT491, "491.als"); + else if (objeto_que_lleva == LOOK && fl == 17) + talk(TEXT478, "478.als"); + else if (objeto_que_lleva == LOOK && fl == 18) + talk(TEXT493, "493.als"); + else if (objeto_que_lleva == LOOK && fl == 19) { + talk(TEXT494, "494.als"); + talk(TEXT495, "495.als"); + } else if (objeto_que_lleva == LOOK && fl == 20) + talk(TEXT162, "162.als"); + else if (objeto_que_lleva == LOOK && fl == 21) + talk(TEXT496, "496.als"); + else if (objeto_que_lleva == LOOK && fl == 22) + talk(TEXT161, "161.als"); + else + hay_respuesta = 0; + } else if (num_ejec == 5) { + if (objeto_que_lleva == LOOK && fl == 28) + talk(TEXT328, "328.als"); + else if (objeto_que_lleva == LOOK && fl == 7) + talk(TEXT478,"478.als"); + else if (objeto_que_lleva == LOOK && fl == 8) + talk(TEXT120, "120.als"); + else if (objeto_que_lleva == LOOK && fl == 9) { + talk(TEXT482, "482.als"); + talk(TEXT483, "483.als"); + } else if (objeto_que_lleva == LOOK && fl == 11) + talk(TEXT488, "488.als"); + else if (objeto_que_lleva == LOOK && fl == 13) + talk(TEXT490, "490.als"); + else if (objeto_que_lleva == LOOK && fl == 14) + talk(TEXT121, "121.als"); + else if (objeto_que_lleva == LOOK && fl == 15) + talk(TEXT117, "117.als"); + else if (objeto_que_lleva == TALK && fl == 15) + talk(TEXT118, "118.als"); + else if (objeto_que_lleva == OPEN && fl == 15) + talk(TEXT119, "119.als"); + else if (objeto_que_lleva == LOOK && fl == 17) + talk(TEXT478, "478.als"); + else if (objeto_que_lleva == LOOK && fl == 20) + talk(TEXT162, "162.als"); + else + hay_respuesta = 0; + } else if (num_ejec == 6) { + if (objeto_que_lleva == LOOK && fl == 28) + talk(TEXT328, "328.als"); + else if (objeto_que_lleva == LOOK && fl == 9) { + talk(TEXT482, "482.als"); + talk(TEXT483, "483.als"); + } else if (objeto_que_lleva == LOOK && fl == 20) + talk(TEXT123, "123.als"); + else if (objeto_que_lleva == LOOK && fl == 21) + talk(TEXT441, "441.als"); + else + hay_respuesta = 0; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - - copyBackground(vb_x + 5, 64, ANCHOBJ + 1, 0, 25, 27, dir_dibujo1, dir_dibujo3); - -bucless: - - if (sentido_vb == 1) { - cara = _rnd->getRandomNumber(5); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - pon_hare(); - pon_vb(); - - copyBackground(ANCHOBJ + 1, 0, vb_x + 5, 64, 25, 27, dir_dibujo3, dir_zona_pantalla); - copyRect(x_talk[cara], 34, vb_x + 5, 64, 25, 27, dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } - - if (con_voces == 0) - centra_texto(dicho, vb_x, 66); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if (music_status() == 0 && flags[11] == 0 && musica_room != 0) - playmusic(musica_room); -} - -void DrasculaEngine::talk_vbpuerta(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(VON_BRAUN); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + if (num_ejec == 1) { + if (objeto_que_lleva == LOOK && fl == 50) + talk(TEXT308, "308.als"); + else if (objeto_que_lleva == OPEN && fl == 50) + talk(TEXT310, "310.als"); + else if (objeto_que_lleva == CLOSE && fl == 50) + talk(TEXT311, "311.als"); + else if (objeto_que_lleva == MOVE && fl == 50) + talk(TEXT312, "312.als"); + else if (objeto_que_lleva == PICK && fl == 50) + talk(TEXT313, "313.als"); + else if (objeto_que_lleva == TALK && fl == 50) + talk(TEXT314, "314.als"); + else if (!strcmp(num_room, "62.alg")) + room_62(fl); + else if (!strcmp(num_room, "63.alg")) + room_63(fl); + else + hay_respuesta = 0; + } else if (num_ejec == 2) { + if (objeto_que_lleva == LOOK && fl == 50) + talk(TEXT308, "308.als"); + else if (objeto_que_lleva == OPEN && fl == 50) + talk(TEXT310, "310.als"); + else if (objeto_que_lleva == CLOSE && fl == 50) + talk(TEXT311, "311.als"); + else if (objeto_que_lleva == MOVE && fl == 50) + talk(TEXT312, "312.als"); + else if (objeto_que_lleva == PICK && fl == 50) + talk(TEXT313, "313.als"); + else if (objeto_que_lleva == TALK && fl == 50) + talk(TEXT314, "314.als"); + else if (objeto_que_lleva == 11 && fl == 50 && flags[22] == 0 && strcmp(num_room, "18.alg")) + talk(TEXT315, "315.als"); + else if (objeto_que_lleva == 13 && fl == 50) + talk(TEXT156, "156.als"); + else if (objeto_que_lleva == 20 && fl == 50) + talk(TEXT163, "163.als"); + else if (!strcmp(num_room, "1.alg")) + room_1(fl); + else if (!strcmp(num_room, "3.alg")) + room_3(fl); + else if (!strcmp(num_room, "4.alg")) + room_4(fl); + else if (!strcmp(num_room, "5.alg")) + room_5(fl); + else if (!strcmp(num_room, "6.alg")) + room_6(fl); + else if (!strcmp(num_room, "7.alg")) + room_7(fl); + else if (!strcmp(num_room, "8.alg")) + room_8(fl); + else if (!strcmp(num_room, "9.alg")) + room_9(fl); + else if (!strcmp(num_room, "12.alg")) + room_12(fl); + else if (!strcmp(num_room, "14.alg")) + room_14(fl); + else if (!strcmp(num_room, "15.alg")) + room_15(fl); + else if (!strcmp(num_room, "16.alg")) + room_16(fl); + else if (!strcmp(num_room, "17.alg")) + room_17(fl); + else if (!strcmp(num_room, "18.alg")) + room_18(fl); + else if (!strcmp(num_room, "19.alg")) + room_19(fl); + else + hay_respuesta = 0; + } else if (num_ejec == 3) { + if (objeto_que_lleva == LOOK && fl == 50) + talk(TEXT309, "309.als"); + else if (objeto_que_lleva == OPEN && fl == 50) + talk(TEXT310, "310.als"); + else if (objeto_que_lleva == CLOSE && fl == 50) + talk(TEXT311, "311.als"); + else if (objeto_que_lleva == MOVE && fl == 50) + talk(TEXT312, "312.als"); + else if (objeto_que_lleva == PICK && fl == 50) + talk(TEXT313, "313.als"); + else if (objeto_que_lleva == TALK && fl == 50) + talk(TEXT314, "314.als"); + else if (!strcmp(num_room, "13.alg")) { + if (room_13(fl)) + return true; + } else + hay_respuesta = 0; + } else if (num_ejec == 4) { + if (!strcmp(num_room, "28.alg")) + talk(TEXT178, "178.als"); + else if (objeto_que_lleva == LOOK && fl == 50) + talk(TEXT309, "309.als"); + else if (objeto_que_lleva == OPEN && fl == 50) + talk(TEXT310, "310.als"); + else if (objeto_que_lleva == CLOSE && fl == 50) + talk(TEXT311, "311.als"); + else if (objeto_que_lleva == MOVE && fl == 50) + talk(TEXT312, "312.als"); + else if (objeto_que_lleva == PICK && fl == 50) + talk(TEXT313, "313.als"); + else if (objeto_que_lleva == TALK && fl == 50) + talk(TEXT314, "314.als"); + else if (objeto_que_lleva == 8 && fl == 50 && flags[18] == 0) + talk(TEXT481, "481.als"); + else if (objeto_que_lleva == 9 && fl == 50) + talk(TEXT484, "484.als"); + else if (objeto_que_lleva == 12 && fl == 50 && flags[18] == 0) + talk(TEXT487, "487.als"); + else if (objeto_que_lleva == 20 && fl == 50) + talk(TEXT487, "487.als"); + else if (!strcmp(num_room, "21.alg")) { + if (room_21(fl)) + return true; + } else if (!strcmp(num_room, "22.alg")) + room_22(fl); + else if (!strcmp(num_room, "23.alg")) + room_23(fl); + else if (!strcmp(num_room, "24.alg")) + room_24(fl); + else if (!strcmp(num_room, "26.alg")) + room_26(fl); + else if (!strcmp(num_room, "27.alg")) + room_27(fl); + else if (!strcmp(num_room, "29.alg")) + room_29(fl); + else if (!strcmp(num_room, "30.alg")) + room_30(fl); + else if (!strcmp(num_room, "31.alg")) + room_31(fl); + else if (!strcmp(num_room, "34.alg")) + room_34(fl); + else if (!strcmp(num_room, "35.alg")) + room_35(fl); + else if (!strcmp(num_room, "44.alg")) + room_44(fl); + else + hay_respuesta = 0; + } else if (num_ejec == 5) { + if (objeto_que_lleva == LOOK && fl == 50) + talk("Cuanto mas me miro, mas me gusto", "54.als"); + else if (objeto_que_lleva == OPEN && fl == 50) + talk("y luego como me cierro", "19.als"); + else if (objeto_que_lleva == CLOSE && fl == 50) + talk("Tendre que abrirme primero no", "19.als"); + else if (objeto_que_lleva == MOVE && fl == 50) + talk("Estoy bien donde estoy", "19.als"); + else if (objeto_que_lleva == PICK && fl == 50) + talk("Ya me tengo", "11.als"); + else if (objeto_que_lleva == TALK && fl == 50) + talk("hola yo", "16.als"); + else if (objeto_que_lleva == 20 && fl == 50) + talk(TEXT487, "487.als"); + else if (!strcmp(num_room, "49.alg")) + room_49(fl); + else if (!strcmp(num_room, "53.alg")) + room_53(fl); + else if (!strcmp(num_room, "54.alg")) + room_54(fl); + else if (!strcmp(num_room, "55.alg")) + room_55(fl); + else if (!strcmp(num_room, "56.alg")) { + if (room_56(fl)) + return true; + } else + hay_respuesta = 0; + } else if (num_ejec == 6) { + if (objeto_que_lleva == LOOK && fl == 50 && flags[0] == 1) + talk(TEXT308, "308.als"); + else if (objeto_que_lleva == LOOK && fl == 50 && flags[0] == 0) + talk(TEXT310, "250.als" ); + else if (objeto_que_lleva == OPEN && fl == 50) + talk(TEXT310, "310.als" ); + else if (objeto_que_lleva == CLOSE && fl == 50) + talk(TEXT311, "311.als" ); + else if (objeto_que_lleva == MOVE && fl == 50) + talk(TEXT312, "312.als" ); + else if (objeto_que_lleva == PICK && fl == 50) + talk(TEXT313, "313.als" ); + else if (objeto_que_lleva == TALK && fl == 50) + talk(TEXT314, "314.als" ); + else if (!strcmp(num_room, "102.alg")) + room_pendulo(fl); + else if (!strcmp(num_room, "58.alg")) + room_58(fl); + else if (!strcmp(num_room, "59.alg")) + room_59(fl); + else if (!strcmp(num_room, "60.alg")) { + if (room_60(fl)) + return true; + } else if (!strcmp(num_room, "61.alg")) + room_61(fl); + else + hay_respuesta = 0; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - updateRoom(); - if (con_voces == 0) - centra_texto(dicho, 150, 80); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; } + if (hay_respuesta == 0 && hay_nombre == 1) + room_0(); + else if (hay_respuesta == 0 && menu_scr == 1) + room_0(); - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if (music_status() == 0 && flags[11] == 0 && musica_room != 0) - playmusic(musica_room); + return false; } -void DrasculaEngine::talk_ciego(const char *dicho, const char *filename, const char *sincronia) { - byte *num_cara; - int p = 0; - int pos_ciego[6]; - int cara = 0; - - int longitud; - longitud = strlen(dicho); - - buffer_teclado(); - - color_abc(VON_BRAUN); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - - pos_ciego[1] = 2; - pos_ciego[2] = 73; - pos_ciego[3] = 1; - pos_ciego[4] = 126; - pos_ciego[5] = 149; - -bucless: - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pos_ciego[5] = 149; - char c = toupper(sincronia[p]); - if (c == '0') - cara = 0; - if (c == '1') - cara = 1; - if (c == '2') - cara = 2; - if (c == '3') - cara = 3; - if (c == '4') - cara = 4; - if (c == '5') - cara = 5; - if (c == '6') - cara = 6; - if (c == '7') - cara = 7; - - if (cara == 0 || cara == 2 || cara == 4 || cara == 6) - pos_ciego[0] = 1; - else - pos_ciego[0] = 132; - - if (cara == 0) - num_cara = dir_dibujo3; - else if (cara == 1) - num_cara = dir_dibujo3; - else if (cara == 2) - num_cara = dir_hare_dch; - else if (cara == 3) - num_cara = dir_hare_dch; - else if (cara == 4) - num_cara = dir_hare_fondo; - else if (cara == 5) - num_cara = dir_hare_fondo; - else { - num_cara = dir_hare_frente; - pos_ciego[5] = 146; - } - - copyRectClip( pos_ciego, num_cara, dir_zona_pantalla); - - if (con_voces == 0) - centra_texto(dicho, 310, 71); +void DrasculaEngine::cursor_mesa() { + int pos_cursor[8]; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - pause(2); - p++; + pos_cursor[0] = 225; + pos_cursor[1] = 56; + pos_cursor[2] = x_raton - 20; + pos_cursor[3] = y_raton - 12; + pos_cursor[4] = 40; + pos_cursor[5] = 25; - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } + copyRectClip(pos_cursor, dir_mesa, dir_zona_pantalla); } -void DrasculaEngine::talk_hacker(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - color_abc(AMARILLO); +void DrasculaEngine::introduce_nombre() { + Common::KeyCode key; + int v = 0, h = 0; + char select2[23]; + strcpy(select2, " "); + for (;;) { + buffer_teclado(); + select2[v] = '-'; + copyBackground(115, 14, 115, 14, 176, 9, dir_dibujo1, dir_zona_pantalla); + print_abc(select2, 117, 15); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + key = getscan(); + delay(70); + if (key != 0) { + if (key == Common::KEYCODE_q) + select2[v] = 'q'; + else if (key == Common::KEYCODE_w) + select2[v] = 'w'; + else if (key == Common::KEYCODE_e) + select2[v] = 'e'; + else if (key == Common::KEYCODE_r) + select2[v] = 'r'; + else if (key == Common::KEYCODE_t) + select2[v] = 't'; + else if (key == Common::KEYCODE_y) + select2[v] = 'y'; + else if (key == Common::KEYCODE_u) + select2[v] = 'u'; + else if (key == Common::KEYCODE_i) + select2[v] = 'i'; + else if (key == Common::KEYCODE_o) + select2[v] = 'o'; + else if (key == Common::KEYCODE_p) + select2[v] = 'p'; + else if (key == Common::KEYCODE_a) + select2[v] = 'a'; + else if (key == Common::KEYCODE_s) + select2[v] = 's'; + else if (key == Common::KEYCODE_d) + select2[v] = 'd'; + else if (key == Common::KEYCODE_f) + select2[v] = 'f'; + else if (key == Common::KEYCODE_g) + select2[v] = 'g'; + else if (key == Common::KEYCODE_h) + select2[v] = 'h'; + else if (key == Common::KEYCODE_j) + select2[v] = 'j'; + else if (key == Common::KEYCODE_k) + select2[v] = 'k'; + else if (key == Common::KEYCODE_l) + select2[v] = 'l'; + else if ((key == Common::KEYCODE_LCTRL) || (key == Common::KEYCODE_RCTRL)) + select2[v] = '\164'; + else if (key == Common::KEYCODE_z) + select2[v] = 'z'; + else if (key == Common::KEYCODE_x) + select2[v] = 'x'; + else if (key == Common::KEYCODE_c) + select2[v] = 'c'; + else if (key == Common::KEYCODE_v) + select2[v] = 'v'; + else if (key == Common::KEYCODE_b) + select2[v] = 'b'; + else if (key == Common::KEYCODE_n) + select2[v] = 'n'; + else if (key == Common::KEYCODE_m) + select2[v] = 'm'; + else if (key == Common::KEYCODE_1) + select2[v] = '1'; + else if (key == Common::KEYCODE_2) + select2[v] = '2'; + else if (key == Common::KEYCODE_3) + select2[v] = '3'; + else if (key == Common::KEYCODE_4) + select2[v] = '4'; + else if (key == Common::KEYCODE_5) + select2[v] = '5'; + else if (key == Common::KEYCODE_6) + select2[v] = '6'; + else if (key == Common::KEYCODE_7) + select2[v] = '7'; + else if (key == Common::KEYCODE_8) + select2[v] = '8'; + else if (key == Common::KEYCODE_9) + select2[v] = '9'; + else if (key == Common::KEYCODE_0) + select2[v] = '0'; + else if (key == Common::KEYCODE_SPACE) + select2[v] = '\167'; + else if (key == ESC) + break; + else if (key == Common::KEYCODE_RETURN) { + select2[v] = '\0'; + h = 1; + break; + } else if (key == Common::KEYCODE_BACKSPACE) + select2[v] = '\0'; + else + v--; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + if (key == Common::KEYCODE_BACKSPACE) + v--; + else + v++; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + if (v == 22) + v = 21; + else if (v == -1) + v = 0; } - -bucless: - if (con_voces == 0) - centra_texto(dicho, 156, 170); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + if (h == 1) { + strcpy(select, select2); + hay_seleccion = 1; } - - key = 0; } -void DrasculaEngine::anda_pabajo() { - direccion_hare = 4; - sentido_hare = 3; - paso_x = 0; +void DrasculaEngine::para_grabar(char nom_game[]) { + graba_partida(nom_game); + comienza_sound("99.als"); + fin_sound(); } -void DrasculaEngine::anda_parriba() { - direccion_hare = 0; - sentido_hare = 2; - paso_x = 0; +void DrasculaEngine::OpenSSN(const char *Name, int Pause) { + MiVideoSSN = (byte *)malloc(64256); + GlobalSpeed = 1000 / Pause; + FrameSSN = 0; + UsingMem = 0; + if (MiVideoSSN == NULL) + return; + _Sesion = new Common::File; + _Sesion->open(Name); + mSesion = TryInMem(_Sesion); + LastFrame = _system->getMillis(); } -void DrasculaEngine::pon_vb() { - int pos_vb[6]; - - if (vb_se_mueve == 0) { - pos_vb[0] = 256; - pos_vb[1] = 129; - pos_vb[2] = vb_x; - pos_vb[3] = 66; - pos_vb[4] = 33; - pos_vb[5] = 69; - if (sentido_vb == 0) - pos_vb[0] = 222; - else if (sentido_vb == 1) - pos_vb[0] = 188; - } else { - pos_vb[2] = vb_x; - pos_vb[3] = 66; - pos_vb[4] = 28; - pos_vb[5] = 68; +int DrasculaEngine::PlayFrameSSN() { + int Exit = 0; + int Lengt; + byte *BufferSSN; - if (sentido_vb == 0) { - pos_vb[0] = frame_vb; - pos_vb[1] = 62; + if (!UsingMem) + _Sesion->read(&CHUNK, 1); + else { + memcpy(&CHUNK, mSesion, 1); + mSesion += 1; + } + switch (CHUNK) { + case SET_PALET: + if (!UsingMem) + _Sesion->read(dacSSN, 768); + else { + memcpy(dacSSN, mSesion, 768); + mSesion += 768; + } + set_dacSSN(dacSSN); + break; + case EMPTY_FRAME: + WaitFrameSSN(); + break; + case INIT_FRAME: + if (!UsingMem) { + _Sesion->read(&CMP, 1); + _Sesion->read(&Lengt, 4); } else { - pos_vb[0] = frame_vb; - pos_vb[1] = 131; + memcpy(&CMP, mSesion, 1); + mSesion += 1; + memcpy(&Lengt, mSesion, 4); + mSesion += 4; } - - frame_vb = frame_vb + 29; - if (frame_vb > 146) - frame_vb = 1; + if (CMP == CMP_RLE) { + if (!UsingMem) { + BufferSSN = (byte *)malloc(Lengt); + _Sesion->read(BufferSSN, Lengt); + } else { + BufferSSN = (byte *)malloc(Lengt); + memcpy(BufferSSN, mSesion, Lengt); + mSesion += Lengt; + } + Des_RLE(BufferSSN, MiVideoSSN); + free(BufferSSN); + if (FrameSSN) { + WaitFrameSSN(); + MixVideo(VGA, MiVideoSSN); + _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); + } else { + WaitFrameSSN(); + memcpy(VGA, MiVideoSSN, 64000); + _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); + } + _system->updateScreen(); + FrameSSN++; + } else { + if (CMP == CMP_OFF) { + if (!UsingMem) { + BufferSSN = (byte *)malloc(Lengt); + _Sesion->read(BufferSSN, Lengt); + } else { + BufferSSN = (byte *)malloc(Lengt); + memcpy(BufferSSN, mSesion, Lengt); + mSesion += Lengt; + } + Des_OFF(BufferSSN, MiVideoSSN, Lengt); + free(BufferSSN); + if (FrameSSN) { + WaitFrameSSN(); + MixVideo(VGA, MiVideoSSN); + _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); + } else { + WaitFrameSSN(); + memcpy(VGA, MiVideoSSN, 64000); + _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); + } + _system->updateScreen(); + FrameSSN++; + } + } + break; + case END_ANIM: + Exit = 1; + break; + default: + Exit = 1; + break; } - copyRectClip(pos_vb, dir_hare_frente, dir_zona_pantalla); + return (!Exit); } -void DrasculaEngine::lleva_vb(int punto_x) { - if (punto_x < vb_x) - sentido_vb = 0; - else - sentido_vb = 1; - - vb_se_mueve = 1; - - for (;;) { - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if (sentido_vb == 0) { - vb_x = vb_x - 5; - if (vb_x <= punto_x) - break; - } else { - vb_x = vb_x + 5; - if (vb_x >= punto_x) - break; - } - pause(5); +void DrasculaEngine::EndSSN() { + free(MiVideoSSN); + if (UsingMem) + free(pointer); + else { + _Sesion->close(); + delete _Sesion; } - - vb_se_mueve = 0; } -void DrasculaEngine::hipo_sin_nadie(int contador){ - int y = 0, sentido = 0; - if (num_ejec == 3) - y = -1; - -comienza: - contador--; - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - if (num_ejec == 3) - updateScreen(0, 0, 0, y, 320, 200, dir_zona_pantalla); - else - updateScreen(0, 1, 0, y, 320, 198, dir_zona_pantalla); - - if (sentido == 0) - y++; - else - y--; - - if (num_ejec == 3) { - if (y == 1) - sentido = 1; - if (y == -1) - sentido = 0; - } else { - if (y == 2) - sentido = 1; - if (y == 0) - sentido = 0; - } - if (contador > 0) - goto comienza; +byte *DrasculaEngine::TryInMem(Common::File *Sesion) { + int Lengt; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + Sesion->seek(0, SEEK_END); + Lengt = Sesion->pos(); + Sesion->seek(0, SEEK_SET); + pointer = (byte *)malloc(Lengt); + if (pointer == NULL) + return NULL; + Sesion->read(pointer, Lengt); + UsingMem = 1; + Sesion->close(); + delete Sesion; + return pointer; } -void DrasculaEngine::abre_puerta(int nflag, int n_puerta) { - if (flags[nflag] == 0) { - if (num_ejec == 1 /*|| num_ejec == 4*/) { - if (nflag != 7) { - comienza_sound("s3.als"); - flags[nflag] = 1; - } - } else { - comienza_sound("s3.als"); - flags[nflag] = 1; - } - - if (n_puerta != NO_PUERTA) - puertas_cerradas(n_puerta); - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - fin_sound(); - sin_verbo(); - } +void DrasculaEngine::set_dacSSN(byte *PalBuf) { + setvgapalette256((byte *)PalBuf); } -void DrasculaEngine::mapa() { - int l, veo = 0; +void DrasculaEngine::Des_OFF(byte *BufferOFF, byte *MiVideoOFF, int Lenght) { + int x = 0; + unsigned char Reps; + int Offset; - for (l = 0; l < objs_room; l++) { - if (x_raton > x1[l] && y_raton > y1[l] - && x_raton < x2[l] && y_raton < y2[l] - && visible[l] == 1) { - strcpy(texto_nombre, nombre_obj[l]); - hay_nombre = 1; - veo = 1; - } + memset(MiVideoSSN, 0, 64000); + while (x < Lenght) { + Offset = BufferOFF[x] + BufferOFF[x + 1] * 256; + Reps = BufferOFF[x + 2]; + memcpy(MiVideoOFF + Offset, &BufferOFF[x + 3], Reps); + x += 3 + Reps; } - - if (veo == 0) - hay_nombre = 0; } -void DrasculaEngine::grr() { - int longitud; - longitud = 30; - - buffer_teclado(); - - color_abc(VERDE_OSCURO); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open("s10.als"); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); +void DrasculaEngine::Des_RLE(byte *BufferRLE, byte *MiVideoRLE) { + signed int con = 0; + unsigned int X = 0; + unsigned int fExit = 0; + char ch, rep; + while (!fExit) { + ch = *BufferRLE++; + rep = 1; + if ((ch & 192) == 192) { + rep = (ch & 63); + ch =* BufferRLE++; + } + for (con = 0; con < rep; con++) { + *MiVideoRLE++ = ch; + X++; + if (X > 64000) + fExit = 1; } - ctvd_init(4); - ctvd_speaker(1); - ctvd_output(sku); - } - - updateRoom(); - copyBackground(253, 110, 150, 65, 20, 30, dir_dibujo3, dir_zona_pantalla); - - if (con_voces == 0) - centra_texto(".groaaarrrrgghhh!", 153, 65); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - -bucless: - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::talk_lobo(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[9] = {52, 79, 106, 133, 160, 187, 214, 241, 268}; - int cara; +void DrasculaEngine::MixVideo(byte *OldScreen, byte *NewScreen) { + int x; + for (x = 0; x < 64000; x++) + OldScreen[x] ^= NewScreen[x]; +} - int longitud; - longitud = strlen(dicho); +void DrasculaEngine::WaitFrameSSN() { + uint32 now; + while ((now = _system->getMillis()) - LastFrame < ((uint32) GlobalSpeed)) + _system->delayMillis(GlobalSpeed - (now - LastFrame)); + LastFrame = LastFrame + GlobalSpeed; +} - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); +byte *DrasculaEngine::carga_pcx(byte *NamePcc) { + signed int con = 0; + unsigned int X = 0; + unsigned int fExit = 0; + char ch, rep; + byte *AuxPun; - color_abc(ROJO); + AuxPun = AuxBuffDes; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + while (!fExit) { + ch = *NamePcc++; + rep = 1; + if ((ch & 192) == 192) { + rep = (ch & 63); + ch = *NamePcc++; + } + for (con = 0; con< rep; con++) { + *AuxPun++ = ch; + X++; + if (X > 64000) + fExit = 1; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - cara = _rnd->getRandomNumber(8); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 136, 198, 81, 26, 24, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, 203, 78); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + return AuxBuffDes; } -void DrasculaEngine::talk_mus(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[8] = { 16, 35, 54, 73, 92, 111, 130, 149}; - int cara; +void DrasculaEngine::set_dac(byte *dac) { + setvgapalette256((byte *)dac); +} - int longitud; - longitud = strlen(dicho); +void DrasculaEngine::WaitForNext(int FPS) { + _system->delayMillis(1000 / FPS); +} - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); +int DrasculaEngine::vez() { + return _system->getMillis() / 20; // originaly was 1 +} - buffer_teclado(); +void DrasculaEngine::reduce_hare_chico(int xx1, int yy1, int xx2, int yy2, int ancho, int alto, int factor, byte *dir_inicio, byte *dir_fin) { + float suma_x, suma_y; + int n, m; + float pixel_x, pixel_y; + int pos_pixel[6]; - color_abc(BLANCO); + nuevo_ancho = (ancho * factor) / 100; + nuevo_alto = (alto * factor) / 100; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } + suma_x = ancho / nuevo_ancho; + suma_y = alto / nuevo_alto; -bucless: + pixel_x = xx1; + pixel_y = yy1; - cara = _rnd->getRandomNumber(7); + for (n = 0; n < nuevo_alto; n++) { + for (m = 0; m < nuevo_ancho; m++) { + pos_pixel[0] = (int)pixel_x; + pos_pixel[1] = (int)pixel_y; + pos_pixel[2] = xx2 + m; + pos_pixel[3] = yy2 + n; + pos_pixel[4] = 1; + pos_pixel[5] = 1; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyRectClip(pos_pixel, dir_inicio, dir_fin); - updateRefresh_pre(); + pixel_x = pixel_x + suma_x; + } + pixel_x = xx1; + pixel_y = pixel_y + suma_y; + } +} - copyBackground(x_talk[cara], 156, 190, 64, 18, 24, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); +char DrasculaEngine::codifica(char car) { + return ~car; +} - if (con_voces == 0) - centra_texto(dicho, 197, 64); +void DrasculaEngine::cuadrante_1() { + float distancia_x, distancia_y; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (num_ejec == 2) + distancia_x = hare_x - sitio_x; + else + distancia_x = hare_x + ancho_hare / 2 - sitio_x; - pause(3); + distancia_y = (hare_y + alto_hare) - sitio_y; - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); + if (distancia_x < distancia_y) { + direccion_hare = 0; + sentido_hare = 2; + paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + direccion_hare = 7; + sentido_hare = 0; + paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::activa_pendulo() { - flags[1] = 2; - hare_se_ve = 0; - strcpy(num_room, "102.alg"); - loadPic("102.alg"); - decompressPic(dir_dibujo1, MEDIA); - loadPic("an_p1.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("an_p2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("an_p3.alg"); - decompressPic(dir_hare_frente, 1); +void DrasculaEngine::cuadrante_2() { + float distancia_x, distancia_y; - copyBackground(0, 171, 0, 0, ANCHOBJ, ALTOBJ, dir_hare_fondo, dir_dibujo3); + if (num_ejec == 2) + distancia_x = abs(hare_x + ancho_hare - sitio_x); + else + distancia_x = abs(hare_x + ancho_hare / 2 - sitio_x); - conta_ciego_vez = vez(); -} + distancia_y = (hare_y + alto_hare) - sitio_y; -void DrasculaEngine::talk_pen(const char *dicho, const char *filename) { - int tiempou; - long tiempol; + if (distancia_x < distancia_y) { + direccion_hare = 1; + sentido_hare = 2; + paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); + } else { + direccion_hare = 2; + sentido_hare = 1; + paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); + } +} - int x_talk[8] = {112, 138, 164, 190, 216, 242, 268, 294}; - int cara; +void DrasculaEngine::cuadrante_3() { + float distancia_x, distancia_y; - int longitud; - longitud = strlen(dicho); + if (num_ejec == 2) + distancia_x = hare_x - sitio_x; + else + distancia_x = hare_x + ancho_hare / 2 - sitio_x; - flags[1] = 1; + distancia_y = sitio_y - (hare_y + alto_hare); - updateRoom(); - copyRect(44, 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (distancia_x < distancia_y) { + direccion_hare = 5; + sentido_hare = 3; + paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); + } else { + direccion_hare = 6; + sentido_hare = 0; + paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); + } +} - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); +void DrasculaEngine::cuadrante_4() { + float distancia_x, distancia_y; - buffer_teclado(); + if (num_ejec == 2) + distancia_x = abs(hare_x + ancho_hare - sitio_x); + else + distancia_x = abs(hare_x + ancho_hare / 2 - sitio_x); - color_abc(AMARILLO); + distancia_y = sitio_y - (hare_y + alto_hare); - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + if (distancia_x < distancia_y) { + direccion_hare = 4; + sentido_hare = 3; + paso_x = (int)(distancia_x / (distancia_y / PASO_HARE_Y)); + } else { + direccion_hare = 3; + sentido_hare = 1; + paso_y = (int)(distancia_y / (distancia_x / PASO_HARE_X)); } +} -bucless: +void DrasculaEngine::graba_partida(char nom_game[]) { + Common::OutSaveFile *out; + int l; - cara = _rnd->getRandomNumber(7); + if (!(out = _saveFileMan->openForSaving(nom_game))) { + error("no puedo abrir el archivo"); + } + out->writeSint32LE(num_ejec); + out->write(datos_actuales, 20); + out->writeSint32LE(hare_x); + out->writeSint32LE(hare_y); + out->writeSint32LE(sentido_hare); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + for (l = 1; l < 43; l++) { + out->writeSint32LE(objetos_que_tengo[l]); + } - updateRefresh_pre(); + for (l = 0; l < NUM_BANDERAS; l++) { + out->writeSint32LE(flags[l]); + } - copyRect(x_talk[cara], 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); + out->writeSint32LE(lleva_objeto); + out->writeSint32LE(objeto_que_lleva); - updateRefresh(); + out->finalize(); + if (out->ioFailed()) + warning("Can't write file '%s'. (Disk full?)", nom_game); - if (con_voces == 0) - centra_texto(dicho, 160, 105); + delete out; +} - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +void DrasculaEngine::aumenta_num_frame() { + diff_vez = vez() - conta_vez; - pause(3); + if (diff_vez >= 6) { + conta_vez = vez(); + num_frame++; + if (num_frame == 6) + num_frame = 0; - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + if (direccion_hare == 0) { + hare_x = hare_x - paso_x; + hare_y = hare_y - paso_y; + } else if (direccion_hare == 7) { + hare_x = hare_x - paso_x; + hare_y = hare_y - paso_y; + } else if (direccion_hare == 1) { + hare_x = hare_x + paso_x; + hare_y = hare_y - paso_y; + } else if (direccion_hare == 2) { + hare_x = hare_x + paso_x; + hare_y = hare_y - paso_y; + } else if (direccion_hare == 3) { + hare_x = hare_x + paso_x; + hare_y = hare_y + paso_y; + } else if (direccion_hare == 4) { + hare_x = hare_x + paso_x; + hare_y = hare_y + paso_y; + } else if (direccion_hare == 5) { + hare_x = hare_x - paso_x; + hare_y = hare_y + paso_y; + } else if (direccion_hare == 6) { + hare_x = hare_x - paso_x; + hare_y = hare_y + paso_y; + } } - flags[1] = 0; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateRefresh_pre(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_pen2(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[5]={122, 148, 174, 200, 226}; - int cara; - - int longitud; - longitud = strlen(dicho); + if (num_ejec != 2) { + diferencia_y = (int)(alto_hare - nuevo_alto); + diferencia_x = (int)(ancho_hare - nuevo_ancho); + hare_y = hare_y + diferencia_y; + hare_x = hare_x + diferencia_x; + alto_hare = (int)nuevo_alto; + ancho_hare = (int)nuevo_ancho; + } +} - flags[1] = 1; +int DrasculaEngine::sobre_que_objeto() { + int n = 0; - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); + for (n = 1; n < 43; n++) { + if (x_raton > x_obj[n] && y_raton > y_obj[n] + && x_raton < x_obj[n] + ANCHOBJ && y_raton < y_obj[n] + ALTOBJ) + break; + } - buffer_teclado(); + return n; +} - color_abc(AMARILLO); +bool DrasculaEngine::comprueba_banderas_menu() { + int h, n; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + for (n = 0; n < 43; n++) { + if (sobre_que_objeto() == n) { + h = objetos_que_tengo[n]; + if (h != 0) + if (banderas(h)) + return true; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); } -bucless: + return false; +} - cara = _rnd->getRandomNumber(4); +void DrasculaEngine::conversa(const char *nom_fich) { + int h; + int juego1 = 1, juego2 = 1, juego3 = 1, juego4 = 1; + char frase1[78]; + char frase2[78]; + char frase3[87]; + char frase4[78]; + char para_codificar[13]; + char suena1[13]; + char suena2[13]; + char suena3[13]; + char suena4[13]; + int longitud; + int respuesta1; + int respuesta2; + int respuesta3; + int usado1 = 0; + int usado2 = 0; + int usado3 = 0; + char buffer[256]; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + rompo_y_salgo = 0; - updateRefresh_pre(); + strcpy(para_codificar, nom_fich); - copyBackground(x_talk[cara], 171, 173, 116, 25, 28, dir_dibujo3, dir_zona_pantalla); + if (num_ejec == 5) + sin_verbo(); - updateRefresh(); + ald = new Common::File; + ald->open(nom_fich); + if (!ald->isOpen()) { + error("missing data file"); + } + int size = ald->size(); - if (con_voces == 0) - centra_texto(dicho, 195, 107); + getLine(ald, buffer, size); + sscanf(buffer, "%s", frase1); + getLine(ald, buffer, size); + sscanf(buffer, "%s", frase2); + getLine(ald, buffer, size); + sscanf(buffer, "%s", frase3); + getLine(ald, buffer, size); + sscanf(buffer, "%s", frase4); + getLine(ald, buffer, size); + sscanf(buffer, "%s", suena1); + getLine(ald, buffer, size); + sscanf(buffer, "%s", suena2); + getLine(ald, buffer, size); + sscanf(buffer, "%s", suena3); + getLine(ald, buffer, size); + sscanf(buffer, "%s", suena4); + getLine(ald, buffer, size); + sscanf(buffer, "%d", &respuesta1); + getLine(ald, buffer, size); + sscanf(buffer, "%d", &respuesta2); + getLine(ald, buffer, size); + sscanf(buffer, "%d", &respuesta3); + delete ald; + ald = NULL; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (num_ejec == 2 && !strcmp(nom_fich, "op_5.cal") && flags[38] == 1 && flags[33] == 1) { + strcpy(frase3, TEXT405); + strcpy(suena3, "405.als"); + respuesta3 = 31; + } - pause(3); + if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[7] == 1) { + strcpy(frase3, TEXT273); + strcpy(suena3, "273.als"); + respuesta3 = 14; + } - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[10] == 1) { + strcpy(frase3, " cuanto queda para que acabe el partido?"); + strcpy(suena3, "274.als"); + respuesta3 = 15; } - flags[1] = 0; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateRefresh_pre(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} + longitud = strlen(frase1); + for (h = 0; h < longitud; h++) + if (frase1[h] == (char)0xa7) + frase1[h] = ' '; -void DrasculaEngine::talk_taber2(const char *dicho, const char *filename) { - int tiempou; - long tiempol; + longitud = strlen(frase2); + for (h = 0; h < longitud; h++) + if (frase2[h] == (char)0xa7) + frase2[h] = ' '; - int x_talk[6] = {1, 23, 45, 67, 89, 111}; - int cara; + longitud = strlen(frase3); + for (h = 0; h < longitud; h++) + if (frase3[h] == (char)0xa7) + frase3[h] = ' '; - int longitud; - longitud = strlen(dicho); + longitud = strlen(frase4); + for (h = 0; h < longitud; h++) + if (frase4[h] == (char)0xa7) + frase4[h] = ' '; - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); + loadPic("car.alg"); + decompressPic(dir_hare_fondo, 1); + // TODO code here should limit y position for mouse in dialog menu, + // but we can't implement this due lack backend functionality + // from 1(top) to 31 + color_abc(VERDE_CLARO); - buffer_teclado(); +bucle_opc: - color_abc(MARRON); + updateRoom(); - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + if (num_ejec == 1 || num_ejec == 4 || num_ejec == 6) { + if (music_status() == 0 && flags[11] == 0) + playmusic(musica_room); + } else if (num_ejec == 2) { + if (music_status() == 0 && flags[11] == 0 && musica_room != 0) + playmusic(musica_room); + } else if (num_ejec == 3 || num_ejec == 5) { + if (music_status() == 0) + playmusic(musica_room); } -bucless: - - cara = _rnd->getRandomNumber(5); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + MirarRaton(); - updateRefresh_pre(); + if (y_raton > 0 && y_raton < 9) { + if (usado1 == 1 && _color != BLANCO) + color_abc(BLANCO); + else if (usado1 == 0 && _color != VERDE_CLARO) + color_abc(VERDE_CLARO); + } else if (y_raton > 8 && y_raton < 17) { + if (usado2 == 1 && _color != BLANCO) + color_abc(BLANCO); + else if (usado2 == 0 && _color != VERDE_CLARO) + color_abc(VERDE_CLARO); + } else if (y_raton > 16 && y_raton < 25) { + if (usado3 == 1 && _color != BLANCO) + color_abc(BLANCO); + else if (usado3 == 0 && _color != VERDE_CLARO) + color_abc(VERDE_CLARO); + } else if (_color != VERDE_CLARO) + color_abc(VERDE_CLARO); - copyBackground(x_talk[cara], 130, 151, 43, 21, 24, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + if (y_raton > 0 && y_raton < 9) + juego1 = 2; + else if (y_raton > 8 && y_raton < 17) + juego2 = 2; + else if (y_raton > 16 && y_raton < 25) + juego3 = 2; + else if (y_raton > 24 && y_raton < 33) + juego4 = 2; - if (con_voces == 0) - centra_texto(dicho, 132, 45); + print_abc_opc(frase1, 1, 2, juego1); + print_abc_opc(frase2, 1, 10, juego2); + print_abc_opc(frase3, 1, 18, juego3); + print_abc_opc(frase4, 1, 26, juego4); updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - pause(3); + if ((boton_izq == 1) && (juego1 == 2)) { + delay(100); + usado1 = 1; + talk(frase1, suena1); + if (num_ejec == 3) + grr(); + else + responde(respuesta1); + } else if ((boton_izq == 1) && (juego2 == 2)) { + delay(100); + usado2 = 1; + talk(frase2, suena2); + if (num_ejec == 3) + grr(); + else + responde(respuesta2); + } else if ((boton_izq == 1) && (juego3 == 2)) { + delay(100); + usado3 = 1; + talk(frase3, suena3); + if (num_ejec == 3) + grr(); + else + responde(respuesta3); + } else if ((boton_izq == 1) && (juego4 == 2)) { + delay(100); + talk(frase4, suena4); + rompo_y_salgo = 1; + } - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + if (boton_izq == 1) { + delay(100); + color_abc(VERDE_CLARO); } - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} + if (usado1 == 0) + juego1 = 1; + else + juego1 = 3; + if (usado2 == 0) + juego2 = 1; + else + juego2 = 3; + if (usado3 == 0) + juego3 = 1; + else + juego3 = 3; + + juego4 = 1; -void DrasculaEngine::talk_bj_cama(const char *dicho, const char *filename) { - int tiempou; - long tiempol; + if (rompo_y_salgo == 0) + goto bucle_opc; - int x_talk[5] = {51, 101, 151, 201, 251}; - int cara; + if (num_ejec == 2) + loadPic(fondo_y_menu); + else + loadPic("99.alg"); + decompressPic(dir_hare_fondo, 1); + if (num_ejec != 5) + sin_verbo(); +} - int longitud; +void DrasculaEngine::print_abc_opc(const char *dicho, int x_pantalla, int y_pantalla, int juego) { + int pos_texto[6]; + int y_de_signos, y_de_letra, x_de_letra = 0, h, longitud; longitud = strlen(dicho); - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(BLANCO); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + for (h = 0; h < longitud; h++) { + if (juego == 1) { + y_de_letra = Y_ABC_OPC_1; + y_de_signos = Y_SIGNOS_OPC_1; + } else if (juego == 3) { + y_de_letra = Y_ABC_OPC_3; + y_de_signos = Y_SIGNOS_OPC_3; + } else { + y_de_letra = Y_ABC_OPC_2; + y_de_signos = Y_SIGNOS_OPC_2; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - cara = _rnd->getRandomNumber(4); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(65, 103, 65, 103, 49, 38, dir_dibujo1, dir_zona_pantalla); - copyRect(x_talk[cara], 105, 65, 103, 49, 38, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + int c = toupper(dicho[h]); + if (c == 'A') + x_de_letra = X_A_OPC; + else if (c == 'B') + x_de_letra = X_B_OPC; + else if (c == 'C') + x_de_letra = X_C_OPC; + else if (c == 'D') + x_de_letra = X_D_OPC; + else if (c == 'E') + x_de_letra = X_E_OPC; + else if (c == 'F') + x_de_letra = X_F_OPC; + else if (c == 'G') + x_de_letra = X_G_OPC; + else if (c == 'H') + x_de_letra = X_H_OPC; + else if (c == 'I') + x_de_letra = X_I_OPC; + else if (c == 'J') + x_de_letra = X_J_OPC; + else if (c == 'K') + x_de_letra = X_K_OPC; + else if (c == 'L') + x_de_letra = X_L_OPC; + else if (c == 'M') + x_de_letra = X_M_OPC; + else if (c == 'N') + x_de_letra = X_N_OPC; + else if (c == 'O') + x_de_letra = X_O_OPC; + else if (c == 'P') + x_de_letra = X_P_OPC; + else if (c == 'Q') + x_de_letra = X_Q_OPC; + else if (c == 'R') + x_de_letra = X_R_OPC; + else if (c == 'S') + x_de_letra = X_S_OPC; + else if (c == 'T') + x_de_letra = X_T_OPC; + else if (c == 'U') + x_de_letra = X_U_OPC; + else if (c == 'V') + x_de_letra = X_V_OPC; + else if (c == 'W') + x_de_letra = X_W_OPC; + else if (c == 'X') + x_de_letra = X_X_OPC; + else if (c == 'Y') + x_de_letra = X_Y_OPC; + else if (c == 'Z') + x_de_letra = X_Z_OPC; + else if (c == ' ') + x_de_letra = ESPACIO_OPC; + else { + y_de_letra = y_de_signos; + if (c == '.') + x_de_letra = X_PUNTO_OPC; + else if (c == ',') + x_de_letra = X_COMA_OPC; + else if (c == '-') + x_de_letra = X_GUION_OPC; + else if (c == '?') + x_de_letra = X_CIERRA_INTERROGACION_OPC; + else if (c == 0xa8) + x_de_letra = X_ABRE_INTERROGACION_OPC; +// else if (c == '\'') // FIXME +// x_de_letra = ESPACIO; // space for now + else if (c == '"') + x_de_letra = X_COMILLAS_OPC; + else if (c == '!') + x_de_letra = X_CIERRA_INTERROGACION_OPC; + else if (c == 0xad) + x_de_letra = X_ABRE_EXCLAMACION_OPC; + else if (c == ';') + x_de_letra = X_PUNTO_Y_COMA_OPC; + else if (c == '>') + x_de_letra = X_MAYOR_QUE_OPC; + else if (c == '<') + x_de_letra = X_MENOR_QUE_OPC; + else if (c == '$') + x_de_letra = X_DOLAR_OPC; + else if (c == '%') + x_de_letra = X_POR_CIENTO_OPC; + else if (c == ':') + x_de_letra = X_DOS_PUNTOS_OPC; + else if (c == '&') + x_de_letra = X_AND_OPC; + else if (c == '/') + x_de_letra = X_BARRA_OPC; + else if (c == '(') + x_de_letra = X_ABRE_PARENTESIS_OPC; + else if (c == ')') + x_de_letra = X_CIERRA_PARENTESIS_OPC; + else if (c == '*') + x_de_letra = X_ASTERISCO_OPC; + else if (c == '+') + x_de_letra = X_MAS_OPC; + else if (c == '1') + x_de_letra = X_N1_OPC; + else if (c == '2') + x_de_letra = X_N2_OPC; + else if (c == '3') + x_de_letra = X_N3_OPC; + else if (c == '4') + x_de_letra = X_N4_OPC; + else if (c == '5') + x_de_letra = X_N5_OPC; + else if (c == '6') + x_de_letra = X_N6_OPC; + else if (c == '7') + x_de_letra = X_N7_OPC; + else if (c == '8') + x_de_letra = X_N8_OPC; + else if (c == '9') + x_de_letra = X_N9_OPC; + else if (c == '0') + x_de_letra = X_N0_OPC; + } - if (con_voces == 0) - centra_texto(dicho, 104, 102); + pos_texto[0] = x_de_letra; + pos_texto[1] = y_de_letra; + pos_texto[2] = x_pantalla; + pos_texto[3] = y_pantalla; + pos_texto[4] = ANCHO_LETRAS_OPC; + pos_texto[5] = ALTO_LETRAS_OPC; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRectClip(pos_texto, dir_hare_fondo, dir_zona_pantalla); - pause(3); + x_pantalla = x_pantalla + ANCHO_LETRAS_OPC; + } +} - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; +void DrasculaEngine::responde(int funcion) { + if (num_ejec == 1) { + if (funcion == 10) + talk_borracho(TEXTB1, "B1.als"); + else if (funcion == 11) + talk_borracho(TEXTB2, "B2.als"); + else if (funcion == 12) + talk_borracho(TEXTB3, "B3.als"); + } else if (num_ejec == 2) { + if (funcion == 8) + animation_8_2(); + else if (funcion == 9) + animation_9_2(); + else if (funcion == 10) + animation_10_2(); + else if (funcion == 15) + animation_15_2(); + else if (funcion == 16) + animation_16_2(); + else if (funcion == 17) + animation_17_2(); + else if (funcion == 19) + animation_19_2(); + else if (funcion == 20) + animation_20_2(); + else if (funcion == 21) + animation_21_2(); + else if (funcion == 23) + animation_23_2(); + else if (funcion == 28) + animation_28_2(); + else if (funcion == 29) + animation_29_2(); + else if (funcion == 30) + animation_30_2(); + else if (funcion == 31) + animation_31_2(); + } else if (num_ejec == 4) { + if (funcion == 2) + animation_2_4(); + else if (funcion == 3) + animation_3_4(); + else if (funcion == 4) + animation_4_4(); + } else if (num_ejec == 5) { + if (funcion == 2) + animation_2_5(); + else if (funcion == 3) + animation_3_5(); + else if (funcion == 6) + animation_6_5(); + else if (funcion == 7) + animation_7_5(); + else if (funcion == 8) + animation_8_5(); + else if (funcion == 15) + animation_15_5(); + else if (funcion == 16) + animation_16_5(); + else if (funcion == 17) + animation_17_5(); + } else if (num_ejec == 6) { + if (funcion == 2) + animation_2_6(); + else if (funcion == 3) + animation_3_6(); + else if (funcion == 4) + animation_4_6(); + else if (funcion == 11) + animation_11_6(); + else if (funcion == 12) + animation_12_6(); + else if (funcion == 13) + animation_13_6(); + else if (funcion == 14) + animation_14_6(); + else if (funcion == 15) + animation_15_6(); } - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::talk_htel(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - char *num_cara; - - int x_talk[3] = {1, 94, 187}; - int cara, pantalla; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); +void DrasculaEngine::suma_objeto(int osj) { + int h, puesto = 0; - color_abc(AMARILLO); + for (h = 1; h < 43; h++) { + if (objetos_que_tengo[h] == osj) + puesto = 1; + } - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + if (puesto == 0) { + for (h = 1; h < 43; h++) { + if (objetos_que_tengo[h] == 0) { + objetos_que_tengo[h] = osj; + puesto = 1; + break; + } } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); } +} -bucless: - - cara = _rnd->getRandomNumber(2); - pantalla = _rnd->getRandomNumber(2); - - if (cara == 0 && pantalla == 0) - num_cara = (char *)dir_dibujo3; - else if (pantalla == 1) - num_cara = (char *)dir_hare_frente; - else - num_cara = (char *)dir_hare_fondo; - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - copyBackground(x_talk[cara], 1, 45, 24, 92, 108, (byte *)num_cara, dir_zona_pantalla); - - if (con_voces == 0) - centra_texto(dicho, 90, 50); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - pause(3); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); +void DrasculaEngine::fin_sound_corte() { if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; + ctvd_stop(); delete sku; sku = NULL; ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; } - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::talk_sinc(const char *dicho, const char *filename, const char *sincronia) { - int suma_1_pixel = 1; - int y_mask_talk = 170; - int x_talk_dch[6] = {1, 25, 49, 73, 97, 121}; - int x_talk_izq[6] = {145, 169, 193, 217, 241, 265}; - int p, cara = 0; - - int longitud; - longitud = strlen(dicho); - - buffer_teclado(); - - color_abc(AMARILLO); - - if (num_ejec == 1) { - if (factor_red[hare_y + alto_hare] == 100) - suma_1_pixel = 0; +void DrasculaEngine::MusicFadeout() { + int org_vol = _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType); + for (;;) { + int vol = _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType); + vol -= 10; + if (vol < 0) + vol = 0; + _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, vol); + if (vol == 0) + break; + update_events(); + _system->updateScreen(); + _system->delayMillis(50); } + AudioCD.stop(); + _system->delayMillis(100); + _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, org_vol); +} - p = 0; +void DrasculaEngine::ctvd_end() { + _mixer->stopHandle(_soundHandle); +} - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } +void DrasculaEngine::ctvd_stop() { + _mixer->stopHandle(_soundHandle); +} -bucless: +void DrasculaEngine::ctvd_terminate() { +// _mixer->stopHandle(_soundHandle); +} - if (sincronia[p] == '0') - cara = 0; - if (sincronia[p] == '1') - cara = 1; - if (sincronia[p] == '2') - cara = 2; - if (sincronia[p] == '3') - cara = 3; - if (sincronia[p] == '4') - cara = 4; - if (sincronia[p] == '5') - cara = 5; - if (sincronia[p] == '6') - cara = 6; - if (sincronia[p] == '7') - cara = 7; +void DrasculaEngine::ctvd_speaker(int flag) {} - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); +void DrasculaEngine::ctvd_output(Common::File *file_handle) {} - updateRefresh_pre(); - if (num_ejec == 2) - copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, ancho_hare, alto_talk - 1, dir_zona_pantalla, dir_dibujo3); - else - copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), dir_zona_pantalla, dir_dibujo3); - pon_hare(); - if (num_ejec == 2) { - if (alto_hare != 56) - copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, ancho_hare, alto_talk - 1, dir_dibujo3, dir_zona_pantalla); - } else - copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), dir_dibujo3, dir_zona_pantalla); +void DrasculaEngine::ctvd_init(int b) { + int soundSize = sku->size(); + byte *soundData = (byte *)malloc(soundSize); + sku->seek(32); + sku->read(soundData, soundSize); + _mixer->playRaw(Audio::Mixer::kSFXSoundType, &_soundHandle, soundData, soundSize - 64, + 11025, Audio::Mixer::FLAG_AUTOFREE | Audio::Mixer::FLAG_UNSIGNED); +} - if (sentido_hare == 0) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 8, hare_y - 1, ancho_talk, alto_talk, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, (int)(hare_x + (8.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, (int)(hare_x + (12.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, - (int)(suma_1_pixel + hare_x + (12.0f / 100) * factor_red[hare_y + alto_hare]), hare_y, - ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 3) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 8, hare_y, ancho_talk, alto_talk, dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, - (int)(suma_1_pixel + hare_x + (8.0f / 100) * factor_red[hare_y + alto_hare]), hare_y, - ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); - updateRefresh(); +int DrasculaEngine::LookForFree() { + return _mixer->isSoundHandleActive(_soundHandle); +} + +void DrasculaEngine::actualiza_datos() { + if (num_ejec == 1) { + // nothing + } else if (num_ejec == 2) { + if (!strcmp(num_room,"2.alg") && flags[40] == 0) + visible[3] = 0; + else if (!strcmp(num_room, "3.alg") && flags[3] == 1) + visible[8] = 0; + else if (!strcmp(num_room, "6.alg") && flags[1] == 1 && flags[10] == 0) { + visible[2] = 0; + visible[4] = 1; + } else if (!strcmp(num_room, "7.alg") && flags[35] == 1) + visible[3] = 0; + else if (!strcmp(num_room, "14.alg") && flags[5] == 1) + visible[4] = 0; + else if (!strcmp(num_room, "18.alg") && flags[28] == 1) + visible[2] = 0; + } else if (num_ejec == 3) { + // nothing + } else if (num_ejec == 4) { + if (!strcmp(num_room, "23.alg") && flags[0] == 0 && flags[11] == 0) + visible[2] = 1; + if (!strcmp(num_room, "23.alg") && flags[0] == 1 && flags[11] == 0) + visible[2] = 0; + if (!strcmp(num_room, "21.alg") && flags[10] == 1) + visible[2] = 0; + if (!strcmp(num_room, "22.alg") && flags[26] == 1) { + visible[2] = 0; + visible[1] = 1; + } + if (!strcmp(num_room, "22.alg") && flags[27] == 1) + visible[3] = 0; + if (!strcmp(num_room, "26.alg") && flags[21] == 0) + strcpy(nombre_obj[2], "HUNCHBACKED"); + if (!strcmp(num_room, "26.alg") && flags[18] == 1) + visible[2] = 0; + if (!strcmp(num_room, "26.alg") && flags[12] == 1) + visible[1] = 0; + if (!strcmp(num_room, "35.alg") && flags[14] == 1) + visible[2] = 0; + if (!strcmp(num_room, "35.alg") && flags[17] == 1) + visible[3] = 1; + if (!strcmp(num_room, "35.alg") && flags[15] == 1) + visible[1] = 0; + } else if (num_ejec == 5) { + if (!strcmp(num_room,"49.alg") && flags[6] == 1) + visible[2] = 0; + if (!strcmp(num_room,"49.alg") && flags[6] == 0) + visible[1] = 0; + if (!strcmp(num_room,"49.alg") && flags[6] == 1) + visible[1] = 1; + if (!strcmp(num_room,"45.alg") && flags[6] == 1) + visible[3] = 1; + if (!strcmp(num_room,"53.alg") && flags[2] == 1) + visible[3] = 0; + if (!strcmp(num_room,"54.alg") && flags[13] == 1) + visible[3] = 0; + if (!strcmp(num_room,"55.alg") && flags[8] == 1) + visible[1] = 0; + } else if (num_ejec == 6) { + if ((!strcmp(num_room, "58.alg")) && flags[8] == 0) + espuerta[1] = 0; + if ((!strcmp(num_room, "58.alg")) && flags[8] == 1) + espuerta[1] = 1; + if (!strcmp(num_room, "59.alg")) + espuerta[1] = 0; + if (!strcmp(num_room, "60.alg")) { + sentido_dr = 0; + x_dr = 155; + y_dr = 69; + } } +} - if (con_voces == 0) - centra_texto(dicho, hare_x, hare_y); +void DrasculaEngine::anda_pabajo() { + direccion_hare = 4; + sentido_hare = 3; + paso_x = 0; +} - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +void DrasculaEngine::anda_parriba() { + direccion_hare = 0; + sentido_hare = 2; + paso_x = 0; +} - p++; - pause(3); +void DrasculaEngine::pon_vb() { + int pos_vb[6]; - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); + if (vb_se_mueve == 0) { + pos_vb[0] = 256; + pos_vb[1] = 129; + pos_vb[2] = vb_x; + pos_vb[3] = 66; + pos_vb[4] = 33; + pos_vb[5] = 69; + if (sentido_vb == 0) + pos_vb[0] = 222; + else if (sentido_vb == 1) + pos_vb[0] = 188; } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; - } - - if (num_ejec == 1 && music_status() == 0 && flags[11] == 0) - playmusic(musica_room); - if (num_ejec == 2 && music_status() == 0 && flags[11] == 0 && musica_room != 0) - playmusic(musica_room); -} - -void DrasculaEngine::talk_baul(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - int cara = 0, cara_antes; - int longitud; + pos_vb[2] = vb_x; + pos_vb[3] = 66; + pos_vb[4] = 28; + pos_vb[5] = 68; - longitud = strlen(dicho); + if (sentido_vb == 0) { + pos_vb[0] = frame_vb; + pos_vb[1] = 62; + } else { + pos_vb[0] = frame_vb; + pos_vb[1] = 131; + } - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); + frame_vb = frame_vb + 29; + if (frame_vb > 146) + frame_vb = 1; + } - buffer_teclado(); + copyRectClip(pos_vb, dir_hare_frente, dir_zona_pantalla); +} - cara_antes = flags[19]; +void DrasculaEngine::lleva_vb(int punto_x) { + if (punto_x < vb_x) + sentido_vb = 0; + else + sentido_vb = 1; - color_abc(MARRON); + vb_se_mueve = 1; - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + for (;;) { + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (sentido_vb == 0) { + vb_x = vb_x - 5; + if (vb_x <= punto_x) + break; + } else { + vb_x = vb_x + 5; + if (vb_x >= punto_x) + break; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); + pause(5); } -bucless: - - if (cara == 1) - cara = 0; - else - cara = 1; + vb_se_mueve = 0; +} - flags[19] = cara; - updateRoom(); +void DrasculaEngine::hipo_sin_nadie(int contador){ + int y = 0, sentido = 0; + if (num_ejec == 3) + y = -1; - if (con_voces == 0) - centra_texto(dicho, 263, 69); +comienza: + contador--; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + if (num_ejec == 3) + updateScreen(0, 0, 0, y, 320, 200, dir_zona_pantalla); + else + updateScreen(0, 1, 0, y, 320, 198, dir_zona_pantalla); - pause(4); + if (sentido == 0) + y++; + else + y--; - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); + if (num_ejec == 3) { + if (y == 1) + sentido = 1; + if (y == -1) + sentido = 0; } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; + if (y == 2) + sentido = 1; + if (y == 0) + sentido = 0; } + if (contador > 0) + goto comienza; - flags[19] = cara_antes; - updateRoom(); + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::cierra_puerta(int nflag, int n_puerta) { - if (flags[nflag] == 1) { - comienza_sound("s4.als"); - flags[nflag] = 0; +void DrasculaEngine::abre_puerta(int nflag, int n_puerta) { + if (flags[nflag] == 0) { + if (num_ejec == 1 /*|| num_ejec == 4*/) { + if (nflag != 7) { + comienza_sound("s3.als"); + flags[nflag] = 1; + } + } else { + comienza_sound("s3.als"); + flags[nflag] = 1; + } + if (n_puerta != NO_PUERTA) puertas_cerradas(n_puerta); updateRoom(); @@ -6435,107 +4505,51 @@ void DrasculaEngine::cierra_puerta(int nflag, int n_puerta) { } } -void DrasculaEngine::talk_igorpuerta(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(BLANCO); +void DrasculaEngine::mapa() { + int l, veo = 0; - if (hay_sb == 1){ - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); + for (l = 0; l < objs_room; l++) { + if (x_raton > x1[l] && y_raton > y1[l] + && x_raton < x2[l] && y_raton < y2[l] + && visible[l] == 1) { + strcpy(texto_nombre, nombre_obj[l]); + hay_nombre = 1; + veo = 1; } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - updateRoom(); - if (con_voces == 0) - centra_texto(dicho, 87, 66); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; } - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (veo == 0) + hay_nombre = 0; } -void DrasculaEngine::talk_igor_sentado(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[4] = { 80, 102, 124, 146 }; - int cara; - +void DrasculaEngine::grr() { int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); + longitud = 30; buffer_teclado(); - color_abc(BLANCO); + color_abc(VERDE_OSCURO); if (hay_sb == 1) { sku = new Common::File; - sku->open(filename); + sku->open("s10.als"); if (!sku->isOpen()) { error("no puedo abrir archivo de voz"); } - ctvd_init(2); + ctvd_init(4); ctvd_speaker(1); ctvd_output(sku); } -bucless: - - cara = _rnd->getRandomNumber(3); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 109, 207, 92, 21, 23, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + updateRoom(); + copyBackground(253, 110, 150, 65, 20, 30, dir_dibujo3, dir_zona_pantalla); if (con_voces == 0) - centra_texto(dicho, 221, 102); + centra_texto(".groaaarrrrgghhh!", 153, 65); updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - pause(3); - +bucless: int key = getscan(); if (key != 0) ctvd_stop(); @@ -6556,72 +4570,35 @@ bucless: updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } -void DrasculaEngine::talk_igor_peluca(const char *dicho, const char *filename) { - int tiempou; - long tiempol; - - int x_talk[4] = {119, 158, 197, 236}; - int cara = 0; - - int longitud; - longitud = strlen(dicho); - - tiempol = _system->getMillis(); - tiempou = (unsigned int)tiempol / 2; - _rnd->setSeed(tiempou); - - buffer_teclado(); - - color_abc(BLANCO); - - if (hay_sb == 1){ - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - _rnd->getRandomNumber(3); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 78, 199, 94, 38, 27, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); - - if (con_voces == 0) - centra_texto(dicho, 221, 102); +void DrasculaEngine::activa_pendulo() { + flags[1] = 2; + hare_se_ve = 0; + strcpy(num_room, "102.alg"); + loadPic("102.alg"); + decompressPic(dir_dibujo1, MEDIA); + loadPic("an_p1.alg"); + decompressPic(dir_dibujo3, 1); + loadPic("an_p2.alg"); + decompressPic(dir_hare_dch, 1); + loadPic("an_p3.alg"); + decompressPic(dir_hare_frente, 1); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 171, 0, 0, ANCHOBJ, ALTOBJ, dir_hare_fondo, dir_dibujo3); - pause(3); + conta_ciego_vez = vez(); +} - int key = getscan(); - if (key != 0) - ctvd_stop(); - buffer_teclado(); - if (hay_sb == 1){ - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - longitud = longitud - 2; - if (longitud > 0) - goto bucless; +void DrasculaEngine::cierra_puerta(int nflag, int n_puerta) { + if (flags[nflag] == 1) { + comienza_sound("s4.als"); + flags[nflag] = 0; + if (n_puerta != NO_PUERTA) + puertas_cerradas(n_puerta); + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + fin_sound(); + sin_verbo(); } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); } } // End of namespace Drascula diff --git a/engines/drascula/module.mk b/engines/drascula/module.mk index d1efd2a17e..79a0f5cc84 100644 --- a/engines/drascula/module.mk +++ b/engines/drascula/module.mk @@ -4,7 +4,8 @@ MODULE_OBJS = \ animation.o \ detection.o \ drascula.o \ - rooms.o + rooms.o \ + talk.o # This module can be built as a plugin diff --git a/engines/drascula/talk.cpp b/engines/drascula/talk.cpp new file mode 100644 index 0000000000..058cfd1ad2 --- /dev/null +++ b/engines/drascula/talk.cpp @@ -0,0 +1,2053 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "drascula/drascula.h" +#include "drascula/texts.h" + +namespace Drascula { +void DrasculaEngine::talk_igor_dch(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[8] = { 56, 82, 108, 134, 160, 186, 212, 238 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(7); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + pon_igor(); + pon_dr(); + copyBackground(x_igor + 17, y_igor, x_igor + 17, y_igor, 37, 24, dir_dibujo1, dir_zona_pantalla); + + copyRect(x_talk[cara], 148, x_igor + 17, y_igor, 25, 24, dir_hare_frente, dir_zona_pantalla); + + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, x_igor + 26, y_igor); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) + term_int = 1; + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + pon_igor(); + pon_dr(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_dr_izq(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(ROJO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(7); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + pon_igor(); + pon_dr(); + if (num_ejec == 6) + pon_hare(); + + copyBackground(x_dr, y_dr, x_dr, y_dr, 38, 31, dir_dibujo1, dir_zona_pantalla); + if (num_ejec == 6) + copyRect(x_talk[cara], 90, x_dr, y_dr, 38, 31, dir_dibujo2, dir_zona_pantalla); + else + copyRect(x_talk[cara], 90, x_dr, y_dr, 38, 31, dir_hare_fondo, dir_zona_pantalla); + + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, x_dr + 19, y_dr); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) + term_int = 1; + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + pon_igor(); + pon_dr(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_dr_dch(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(ROJO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(7); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateRefresh_pre(); + + pon_igor(); + pon_dr(); + if (num_ejec == 6) + pon_hare(); + + copyBackground(x_dr, y_dr, x_dr, y_dr, 45, 31, dir_dibujo1, dir_zona_pantalla); + if (num_ejec != 6) + copyRect(x_talk[cara], 58, x_dr + 7, y_dr, 38, 31, dir_hare_fondo, dir_zona_pantalla); + else + copyRect(x_talk[cara], 58, x_dr + 7, y_dr, 38, 31, dir_dibujo2, dir_zona_pantalla); + + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, x_dr + 19, y_dr); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) + term_int = 1; + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + if (num_ejec == 6) + updateRoom(); + + pon_igor(); + pon_dr(); + if (num_ejec == 6) + pon_hare(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_solo(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + if (num_ejec == 1) + color_abc(color_solo); + else if (num_ejec == 4) + color_abc(ROJO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + + if (num_ejec == 6) + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + +bucless: + + if (con_voces == 0) { + if (num_ejec == 1) + centra_texto(dicho, 156, 90); + else if (num_ejec == 6) + centra_texto(dicho, 213, 72); + else if (num_ejec == 5) + centra_texto(dicho, 173, 92); + } + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + byte key = getscan(); + if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) + term_int = 1; + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + if (num_ejec == 6) { + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + } +} + +void DrasculaEngine::talk_igor_frente(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[8] = { 56, 86, 116, 146, 176, 206, 236, 266 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(7); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + if (num_ejec == 1 || num_ejec == 4) + pon_igor(); + if (num_ejec == 1) + pon_dr(); + if (num_ejec == 1 || num_ejec == 6) + copyBackground(x_igor, y_igor, x_igor, y_igor, 29, 25, dir_dibujo1, dir_zona_pantalla); + copyRect(x_talk[cara], 173, x_igor, y_igor, 29, 25, dir_hare_frente, dir_zona_pantalla); + + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, x_igor + 26, y_igor); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) + term_int = 1; + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + if (num_ejec == 6) { + updateRoom(); + } + + if (num_ejec == 1) { + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + pon_igor(); + pon_dr(); + } + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_tabernero(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[9] = { 1, 23, 45, 67, 89, 111, 133, 155, 177 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(MARRON); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + if (num_ejec == 1) { + if (music_status() == 0) + playmusic(musica_room); + } else if (num_ejec == 2) { + if (music_status() == 0 && flags[11] == 0 && musica_room != 0) + playmusic(musica_room); + } + + cara = _rnd->getRandomNumber(8); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 2, 121, 44, 21, 24, dir_hare_dch, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 132, 45); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete(sku); + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_bj(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[5] = { 64, 92, 120, 148, 176 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + if (num_ejec != 5) { + cara = _rnd->getRandomNumber(4); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_bj + 2, y_bj - 1, x_bj + 2, y_bj - 1, 27, 40, + dir_dibujo1, dir_zona_pantalla); + + copyRect(x_talk[cara], 99, x_bj + 2, y_bj - 1, 27, 40, + dir_dibujo3, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, x_bj + 7, y_bj); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + } else { + updateRoom(); + + if (con_voces == 0) + centra_texto(dicho, 93, 80); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + } + + byte key = getscan(); + if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) + term_int = 1; + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int suma_1_pixel = 0; + if (num_ejec != 2) + suma_1_pixel = 1; + + int y_mask_talk = 170; + int x_talk_dch[6] = { 1, 25, 49, 73, 97, 121 }; + int x_talk_izq[6] = { 145, 169, 193, 217, 241, 265 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + if (num_ejec == 6) { + if (flags[0] == 0 && (!strcmp(num_room, "102.alg"))) { + talk_pen(dicho, filename); + return; + } + if (flags[0] == 0 && (!strcmp(num_room, "58.alg"))) { + talk_pen2(dicho, filename); + return; + } + } + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + if (num_ejec != 2) { + if (factor_red[hare_y + alto_hare] == 100) + suma_1_pixel = 0; + } + + if (num_ejec == 2) + buffer_teclado(); + + if (num_ejec == 4) { + if (strcmp(num_room, "24.alg") || flags[29] == 0) { + color_abc(AMARILLO); + } + } else { + color_abc(AMARILLO); + } + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(5); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + if (num_ejec == 2) + copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, ancho_hare, alto_talk - 1, dir_zona_pantalla, dir_dibujo3); + else + copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), + dir_zona_pantalla, dir_dibujo3); + + pon_hare(); + + if (num_ejec == 2) { + if (!strcmp(fondo_y_menu, "99.alg") || !strcmp(fondo_y_menu, "994.alg")) + copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, ancho_hare, alto_talk - 1, dir_dibujo3, dir_zona_pantalla); + } else { + copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), + dir_dibujo3, dir_zona_pantalla); + } + + if (sentido_hare == 0) { + if (num_ejec == 2) + copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 8, hare_y - 1, ancho_talk, alto_talk, + dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_izq[cara], y_mask_talk, hare_x + (int)((8.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], + dir_hare_dch, dir_zona_pantalla); + + updateRefresh(); + } else if (sentido_hare == 1) { + if (num_ejec == 2) + copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, + dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_dch[cara], y_mask_talk, hare_x + (int)((12.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + updateRefresh(); + } else if (sentido_hare == 2) { + if (num_ejec == 2) + copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, + dir_hare_frente, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_izq[cara], y_mask_talk, + suma_1_pixel + hare_x + (int)((12.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], + dir_hare_frente, dir_zona_pantalla); + updateRefresh(); + } else if (sentido_hare == 3) { + if (num_ejec == 2) + copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 8, hare_y, ancho_talk, alto_talk, + dir_hare_frente, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_dch[cara], y_mask_talk, + suma_1_pixel + hare_x + (int)((8.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, ancho_talk,alto_talk, factor_red[hare_y + alto_hare], + dir_hare_frente, dir_zona_pantalla); + updateRefresh(); + } + + if (con_voces == 0) + centra_texto(dicho, hare_x, hare_y); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) + term_int = 1; + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + if (num_ejec == 1) { + if (music_status() == 0 && flags[11] == 0 && corta_musica == 0) + playmusic(musica_room); + } +} + +void DrasculaEngine::talk_pianista(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + int x_talk[4] = { 97, 145, 193, 241 }; + int cara; + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(3); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 139, 228, 112, 47, 60, + dir_hare_dch, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 221, 128); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_borracho(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[8] = { 1, 21, 41, 61, 81, 101, 121, 141 }; + int cara; + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + if (num_ejec == 1) { + loadPic("an11y13.alg"); + decompressPic(dir_hare_frente, 1); + } + + flags[13] = 1; + +bebiendo: + + if (flags[12] == 1) { + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + goto bebiendo; + } + + buffer_teclado(); + + color_abc(VERDE_OSCURO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz\n"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(7); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 29, 177, 50, 19, 19, dir_hare_frente, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 181, 54); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + byte key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + flags[13] = 0; + if (num_ejec == 1) { + loadPic("96.alg"); + decompressPic(dir_hare_frente, 1); + } + + if (num_ejec == 1) { + if (music_status() == 0 && flags[11] == 0) + playmusic(musica_room); + } else if (num_ejec == 2) { + if (music_status() == 0 && flags[11] == 0 && musica_room != 0) + playmusic(musica_room); + } +} + +void DrasculaEngine::talk_vb(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[6] = {1, 27, 53, 79, 105, 131}; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(VON_BRAUN); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + + copyBackground(vb_x + 5, 64, ANCHOBJ + 1, 0, 25, 27, dir_dibujo1, dir_dibujo3); + +bucless: + + if (sentido_vb == 1) { + cara = _rnd->getRandomNumber(5); + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + pon_hare(); + pon_vb(); + + copyBackground(ANCHOBJ + 1, 0, vb_x + 5, 64, 25, 27, dir_dibujo3, dir_zona_pantalla); + copyRect(x_talk[cara], 34, vb_x + 5, 64, 25, 27, dir_hare_frente, dir_zona_pantalla); + updateRefresh(); + } + + if (con_voces == 0) + centra_texto(dicho, vb_x, 66); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (music_status() == 0 && flags[11] == 0 && musica_room != 0) + playmusic(musica_room); +} + +void DrasculaEngine::talk_vbpuerta(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(VON_BRAUN); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + updateRoom(); + if (con_voces == 0) + centra_texto(dicho, 150, 80); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (music_status() == 0 && flags[11] == 0 && musica_room != 0) + playmusic(musica_room); +} + +void DrasculaEngine::talk_ciego(const char *dicho, const char *filename, const char *sincronia) { + byte *num_cara; + int p = 0; + int pos_ciego[6]; + int cara = 0; + + int longitud; + longitud = strlen(dicho); + + buffer_teclado(); + + color_abc(VON_BRAUN); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + + pos_ciego[1] = 2; + pos_ciego[2] = 73; + pos_ciego[3] = 1; + pos_ciego[4] = 126; + pos_ciego[5] = 149; + +bucless: + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + pos_ciego[5] = 149; + char c = toupper(sincronia[p]); + if (c == '0') + cara = 0; + if (c == '1') + cara = 1; + if (c == '2') + cara = 2; + if (c == '3') + cara = 3; + if (c == '4') + cara = 4; + if (c == '5') + cara = 5; + if (c == '6') + cara = 6; + if (c == '7') + cara = 7; + + if (cara == 0 || cara == 2 || cara == 4 || cara == 6) + pos_ciego[0] = 1; + else + pos_ciego[0] = 132; + + if (cara == 0) + num_cara = dir_dibujo3; + else if (cara == 1) + num_cara = dir_dibujo3; + else if (cara == 2) + num_cara = dir_hare_dch; + else if (cara == 3) + num_cara = dir_hare_dch; + else if (cara == 4) + num_cara = dir_hare_fondo; + else if (cara == 5) + num_cara = dir_hare_fondo; + else { + num_cara = dir_hare_frente; + pos_ciego[5] = 146; + } + + copyRectClip( pos_ciego, num_cara, dir_zona_pantalla); + + if (con_voces == 0) + centra_texto(dicho, 310, 71); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + pause(2); + p++; + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } +} + +void DrasculaEngine::talk_hacker(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + color_abc(AMARILLO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + if (con_voces == 0) + centra_texto(dicho, 156, 170); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + key = 0; +} + +void DrasculaEngine::talk_lobo(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[9] = {52, 79, 106, 133, 160, 187, 214, 241, 268}; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + color_abc(ROJO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(8); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 136, 198, 81, 26, 24, dir_dibujo3, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 203, 78); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_mus(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[8] = { 16, 35, 54, 73, 92, 111, 130, 149}; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(7); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 156, 190, 64, 18, 24, dir_dibujo3, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 197, 64); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_pen(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[8] = {112, 138, 164, 190, 216, 242, 268, 294}; + int cara; + + int longitud; + longitud = strlen(dicho); + + flags[1] = 1; + + updateRoom(); + copyRect(44, 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(AMARILLO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(7); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyRect(x_talk[cara], 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); + + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 160, 105); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + flags[1] = 0; + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateRefresh_pre(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_pen2(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[5]={122, 148, 174, 200, 226}; + int cara; + + int longitud; + longitud = strlen(dicho); + + flags[1] = 1; + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(AMARILLO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(4); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 171, 173, 116, 25, 28, dir_dibujo3, dir_zona_pantalla); + + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 195, 107); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + flags[1] = 0; + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateRefresh_pre(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_taber2(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[6] = {1, 23, 45, 67, 89, 111}; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(MARRON); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(5); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 130, 151, 43, 21, 24, dir_dibujo3, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 132, 45); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_bj_cama(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[5] = {51, 101, 151, 201, 251}; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(4); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(65, 103, 65, 103, 49, 38, dir_dibujo1, dir_zona_pantalla); + copyRect(x_talk[cara], 105, 65, 103, 49, 38, dir_dibujo3, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 104, 102); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_htel(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + char *num_cara; + + int x_talk[3] = {1, 94, 187}; + int cara, pantalla; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(AMARILLO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(2); + pantalla = _rnd->getRandomNumber(2); + + if (cara == 0 && pantalla == 0) + num_cara = (char *)dir_dibujo3; + else if (pantalla == 1) + num_cara = (char *)dir_hare_frente; + else + num_cara = (char *)dir_hare_fondo; + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + copyBackground(x_talk[cara], 1, 45, 24, 92, 108, (byte *)num_cara, dir_zona_pantalla); + + if (con_voces == 0) + centra_texto(dicho, 90, 50); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_sinc(const char *dicho, const char *filename, const char *sincronia) { + int suma_1_pixel = 1; + int y_mask_talk = 170; + int x_talk_dch[6] = {1, 25, 49, 73, 97, 121}; + int x_talk_izq[6] = {145, 169, 193, 217, 241, 265}; + int p, cara = 0; + + int longitud; + longitud = strlen(dicho); + + buffer_teclado(); + + color_abc(AMARILLO); + + if (num_ejec == 1) { + if (factor_red[hare_y + alto_hare] == 100) + suma_1_pixel = 0; + } + + p = 0; + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + if (sincronia[p] == '0') + cara = 0; + if (sincronia[p] == '1') + cara = 1; + if (sincronia[p] == '2') + cara = 2; + if (sincronia[p] == '3') + cara = 3; + if (sincronia[p] == '4') + cara = 4; + if (sincronia[p] == '5') + cara = 5; + if (sincronia[p] == '6') + cara = 6; + if (sincronia[p] == '7') + cara = 7; + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + if (num_ejec == 2) + copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, ancho_hare, alto_talk - 1, dir_zona_pantalla, dir_dibujo3); + else + copyBackground(hare_x, hare_y, ANCHOBJ + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), dir_zona_pantalla, dir_dibujo3); + pon_hare(); + if (num_ejec == 2) { + if (alto_hare != 56) + copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, ancho_hare, alto_talk - 1, dir_dibujo3, dir_zona_pantalla); + } else + copyBackground(ANCHOBJ + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), dir_dibujo3, dir_zona_pantalla); + + if (sentido_hare == 0) { + if (num_ejec == 2) + copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 8, hare_y - 1, ancho_talk, alto_talk, dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_izq[cara], y_mask_talk, (int)(hare_x + (8.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + updateRefresh(); + } else if (sentido_hare == 1) { + if (num_ejec == 2) + copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, dir_hare_dch, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_dch[cara], y_mask_talk, (int)(hare_x + (12.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + updateRefresh(); + } else if (sentido_hare == 2) { + if (num_ejec == 2) + copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, dir_hare_frente, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_izq[cara], y_mask_talk, + (int)(suma_1_pixel + hare_x + (12.0f / 100) * factor_red[hare_y + alto_hare]), hare_y, + ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); + updateRefresh(); + } else if (sentido_hare == 3) { + if (num_ejec == 2) + copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 8, hare_y, ancho_talk, alto_talk, dir_hare_frente, dir_zona_pantalla); + else + reduce_hare_chico(x_talk_dch[cara], y_mask_talk, + (int)(suma_1_pixel + hare_x + (8.0f / 100) * factor_red[hare_y + alto_hare]), hare_y, + ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); + updateRefresh(); + } + + if (con_voces == 0) + centra_texto(dicho, hare_x, hare_y); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + p++; + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + if (num_ejec == 1 && music_status() == 0 && flags[11] == 0) + playmusic(musica_room); + if (num_ejec == 2 && music_status() == 0 && flags[11] == 0 && musica_room != 0) + playmusic(musica_room); +} + +void DrasculaEngine::talk_baul(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + int cara = 0, cara_antes; + int longitud; + + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + cara_antes = flags[19]; + + color_abc(MARRON); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + if (cara == 1) + cara = 0; + else + cara = 1; + + flags[19] = cara; + updateRoom(); + + if (con_voces == 0) + centra_texto(dicho, 263, 69); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(4); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + flags[19] = cara_antes; + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_igorpuerta(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1){ + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + updateRoom(); + if (con_voces == 0) + centra_texto(dicho, 87, 66); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_igor_sentado(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[4] = { 80, 102, 124, 146 }; + int cara; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1) { + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + cara = _rnd->getRandomNumber(3); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 109, 207, 92, 21, 23, dir_dibujo3, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 221, 102); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1) { + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +void DrasculaEngine::talk_igor_peluca(const char *dicho, const char *filename) { + int tiempou; + long tiempol; + + int x_talk[4] = {119, 158, 197, 236}; + int cara = 0; + + int longitud; + longitud = strlen(dicho); + + tiempol = _system->getMillis(); + tiempou = (unsigned int)tiempol / 2; + _rnd->setSeed(tiempou); + + buffer_teclado(); + + color_abc(BLANCO); + + if (hay_sb == 1){ + sku = new Common::File; + sku->open(filename); + if (!sku->isOpen()) { + error("no puedo abrir archivo de voz"); + } + ctvd_init(2); + ctvd_speaker(1); + ctvd_output(sku); + } + +bucless: + + _rnd->getRandomNumber(3); + + copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + + updateRefresh_pre(); + + copyBackground(x_talk[cara], 78, 199, 94, 38, 27, dir_dibujo3, dir_zona_pantalla); + pon_hare(); + updateRefresh(); + + if (con_voces == 0) + centra_texto(dicho, 221, 102); + + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + pause(3); + + int key = getscan(); + if (key != 0) + ctvd_stop(); + buffer_teclado(); + if (hay_sb == 1){ + if (LookForFree() != 0) + goto bucless; + delete sku; + sku = NULL; + ctvd_terminate(); + } else { + longitud = longitud - 2; + if (longitud > 0) + goto bucless; + } + + updateRoom(); + updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); +} + +} // End of namespace Drascula -- cgit v1.2.3