Author Id: 0 Author Name: Ray Laé Àlfori Post Content: Ruby/Sapphire: Cómo introducir retratos (portraits) en un script para que aparezcan durante el diálogo (nivel fácil) Antes de empezar Introducción Éste es un tema por el cual ya me han preguntado varias personas, y creo que sería interesante compartirlo con todos vosotros, ya que sin duda puede ser muy útil y atractivo en un hack. Se trata de algo bastante simple, una vez lo sabes, pero que de entrada puede no ocurrírsete (como me pasó a mí xD). En este tutorial os explicaré cómo podéis hacer que, dentro de un diálogo, aparezcan las caras de los distintos personajes y Pokémon que hablan. El resultado final sería algo así: [URL=youtube]http://www.youtube.com/watch?v=vJUt1Gsyshs[/URL] Este método está basado en un tutorial de Pokecommunity, gracias al cual se me ocurrió la idea: http://www.pokecommunity.com/showthread.php?t=168158 Simplemente he reducido un poco el proceso, quitando alguna cosa innecesaria, y os lo transmito a vosotros de forma más ordenada y completa (y en español ;p). En este tutorial usaré como ejemplo un retrato hecho por mí, y en las scans también veréis gráficos que estoy elaborando para mi hack (ya que como base he usado una ROM de prueba para dicho hack, para ahorrar tiempo [s]y dejaros con la intriga[/s]). No uséis ni los tiles, ni el retrato, por favor. Son para mi proyecto :p ¿Qué necesitaremos? [list] [*]Una ROM (nuestro hack) de base Ruby o Sapphire. No lo he probado con Emerald, FireRed o LeafGreen, porque trabajo con Ruby. Si alguien lo prueba, que me informe de los resultados xD [*]UnLZ-GBA o cualquier otro editor de gráficos comprimidos. [*]Rsball, incluido en el pack de Elitemap. [*]Free Space Finder (FSF) o un editor hexagesimal, para buscar espacios libres. [*]Advance Map 1.92 y XSE (aseguraos de que tenéis la última versión de XSE). [*]Un sprite (retrato) para insertar, indexado a 16 colores y de tamaño 64x64 px (como cualquier sprite de un Pokémon). [/list] Conocimientos previos "recomendados" para poder entender el tutorial [list] [*]Saber usar UnLZ-GBA. [*]Tener una idea básica de scripting y de cómo asignar un script a un mini usando Advance Map. [*]Saber indexar sprites. [*]Saber buscar espacio libre en la ROM. [*]Saber qué es una coordenada ;p[/list] Haced una COPIA DE SEGURIDAD de vuestra ROM cada vez que acabéis uno de los pasos mostrados en este tutorial. Primer paso: Insertar el retrato Nuestro retrato tendrá exactamente el mismo tamaño y las mismas características que un sprite de Pokémon normal: tendrá un tamaño 64x64 píxeles y estará indexado con una paleta de 16 colores (el primero de los cuales será el color de fondo). En mi caso, usaré este retrato como ejemplo: [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/1_ana_retrato_indexado.png[/IMG] Escogido e indexado el retrato, debemos buscar espacio libre en la ROM usando FSF o un editor hex. A continuación, abriremos nuestro hack con UnLZ-GBA e insertaremos el sprite en el espacio libre que hemos encontrado, y su paleta, en otro espacio libre. No olvidéis apuntaros los dos offsets en un documento de texto, porque más tarde volveremos a necesitarlos. [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/3a_unlz.png[/IMG] Ahora el retrato ya está insertado en la ROM =) Segundo paso: Asignar el retrato a un Pokémon Para hacer que el retrato se muestre en el juego usaremos un comando showpokepic. ¿Qué hace showpokepic? Pues hace que el juego muestre la imagen de un Pokémon, de esta manera: [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/2_ejemplo_showpokepic.png[/IMG] Nosotros aprovecharemos las características del showpokepic para mostrar retratos. Por ello, tendremos que hacer que nuestro retrato sea el sprite de un Pokémon, y así después podremos mostrarlo usando showpokepic, como si fuera un Pokémon más. Para no tener que "sacrificar" ninguno de los 386 Pokémon que trae el juego, podemos usar los 25 espacios libres que hay entre Celevi y Treecko para introducir hasta 25 retratos diferentes. También podemos sacrificar algún Pokémon, pero en ese caso tendríamos que hacer que no apareciera nunca en el juego (sería un poco raro encontrarse con una "cabeza flotante" de un personaje en medio de la hierba xD). En mi caso, asignaré mi retrato al primer Pokémon vacío de esos 25, el que sería el Pokémon número 252. Para asignar el retrato a un Pokémon, abriremos Rsball, cargaremos nuestra ROM (recordad que la ROM tiene que estar en la misma carpeta que Rsball) e iremos al Pokémon número 252. Hecho esto, en la parte de abajo, donde pone "Gestión de puntos de localización", copiaremos los dos offsets donde antes (con Unlz) hemos introducido el sprite y su paleta, y haremos click en "aplicar cambios de offset". [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/3b_rsball.png[/IMG] Ahora, el Pokémon número 252 tiene asignado nuestro retrato como sprite. Tercer y último paso: Usar el comando showpokepic en un sprite para mostrar el retrato El showpokepic Ahora viene la parte más importante. En un script, debemos introducir los siguientes comandos justo antes de la msgbox correspondiente, para que aparezca nuestro retrato: special 0x140 showpokepic 0xA 0xB 0xC hidebox 0x0 0x0 0x1D 0x13 Las letras que he puesto significan lo siguiente: (A): número hexagesimal del Pokémon del cual queremos mostrar su sprite. Podéis encontrar los números en la wiki de WAH, pero por si acaso, os pongo aquí los que corresponden a los 25 espacios vacíos: FC, FD, FE, FF, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 10A, 10B, 10C, 10D, 10E, 10F, 110, 111, 112, 113, 114. (B): coordenada X (posición horizontal en la que se mostrará el sprite) ( C ): coordenada Y (posición vertical en la que se mostrará el sprite) (D) i (E): posición en la que se "borrará" la caja de texto. (F) i (G): tamaño (ancho y altura respectivamente) que tendrá el "borrador" de la caja de texto. Bien, ahora toca explicar todo esto xD En primer lugar encontramos el comando "special 0x140". Este comando hará que nuestro showpokepic se muestre con los colores correctos. Si no lo usáramos, se vería de color negro y azul. Luego tenemos el "showpokepic" en sí, con tres indicadores: Pokémon a mostrar y sus dos coordenadas de posición. Finalmente tenemos un comando curioso, el "hidebox". ¿Os habéis fijado en la imagen de un Pikachu que he puesto antes? Ese Pikachu tiene un "borde", una caja de texto, a su alrededor. Lo que hace "hidebox" es borrar ese borde. Simplemente tenéis que poner los números adecuados en (D), (E), (F) y (G) para que el "hidebox" abarque lo suficiente como para borrar toda la caja. Lo más adecuado es usar los parámetros que salen en el ejemplo (hidebox 0x0 0x0 0x1D 0x13), ya que con ellos se tapa cualquier caja que pueda aparecer en la pantalla, de modo que el showpokepic puede hacerse en la posición que se quiera sin tener que modificar el hidebox (gracias a Rogy por esta última info ;p). Ejemplo de script Para que lo entendáis mejor, os pondré aquí un script de ejemplo (usando la última versión de XSE): [quote]'--------------- #dynamic 0x800000 #org @principal faceplayer call @cara [desde aquí llamamos el script, justo antes de la msgbox] msgbox @mensaje MSG_FACE hidepokepic end #org @cara special 0x140 showpokepic 0xFC 0x15 0x6 hidebox 0x0 0x0 0x1D 0x13 '--------- ' Strings '--------- #org @mensaje = Hola, Ana, ¡soy tu doble! :3[/quote] Os he indicado en negro el lugar donde está el showpokepic. Lo he puesto separado del script principal, en un offset a parte, y lo he "llamado" con un comando call. De esa manera, no gastamos espacio inútil poniendo una y otra vez los comandos, sino que los ponemos una sola vez y después sólo hace falta llamarlos desde el script principal. Recordad que después del showpokepic hay que poner un hidepokepic, porque si no la imagen se quedaría ahí incluso al terminar el script xD Acabando de pulir los detalles gráficos Una vez guardado ese script que os he puesto, y habiéndolo asignado a un mini usando Advance Map, el resultado sería este: [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/5_retrato_no_se_ve_bien.png[/IMG] Pero ¿qué ocurre? ¿Por qué sale ahí en medio ese interrogante? Pues el culpable es sin duda el "special 0x140": pero no podemos eliminarlo, es absolutamente necesario. ¿Qué hacemos, entonces? Hay más maneras de arreglarlo, pero basta, simplemente, con buscar la imagen del interrogante en UnLZ, guardarla, borrarla con Paint (dejando sólo el color de fondo) e introducirla así en el juego. De esa manera, la imagen del interrogante sigue apareciendo igual, pero no la vemos, porque es transparente. En UnLZ encontraréis, alrededor del número 200 en Ruby, dos imágenes del interrogante. Sólo tenéis que editar la primera (lo he probado y es esa la que aparece, no la segunda). Aquí tenemos el interrogante a editar: [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/6_editandointerrogante.png[/IMG] Entonces lo guardamos, lo borramos y lo volvemos a insertar, así: [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/6_editandointerrogante2.png[/IMG] El resultado sería, pues, el que os he mostrado al principio: [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/7-yasevebien.png[/IMG] Ya lo tenemos ^^ A veces puede que haya un pequeño error gráfico y que, durante una milésima de segundo, se vea un trozo del cuadro de texto (por la parte de arriba de la pantalla) antes de que el juego ejecute la orden de esconderlo. Pero se trata de algo menor, pasa pocas veces y apenas se nota. De todos modos, si alguien conoce una solución, que la diga xD Detalles finales y conclusión Este tutorial, por supuesto, podéis aplicarlo igualmente para mostrar la imagen de sprites de Pokémon. Si substituimos, en mi caso, el número FC por el número 3, nos saldría la imagen de un Venusaur: [IMG]http://i37.photobucket.com/albums/e51/RaykuRayquaza/8-venusaur.png[/IMG] También hay que tener en cuenta que, en mi script, he decidido que el sprite salga en la parte inferior derecha. Cambiando los números de (B) y ( C ), podemos hacer que el sprite aparezca donde queramos: más arriba, más abajo, etc. Pero si hacemos eso, también tendremos que cambiar el tamaño y la posición del hidebox para que tape bien la caja de texto. Espero que todo esto os haya sido útil ^^ Imagino que este método puede perfeccionarse aún más, pero éstas son las conclusiones a las que yo he llegado y creo que el sistema funciona bastante bien. Si tenéis alguna sugerencia o duda sobre el tutorial, no dudéis en planteármela aquí =) Cuando pueda también pondré este tutorial en la wiki. ¡Saludos y suerte! Ray Laé Àlfori (Rayku Rayquaza) PD: el tutorial ya está en WAH: http://wahackpokemon.com/wiki/C%C3%B3mo_introducir_retratos_(portraits)_en_un_script