9641-R_|_Gráficos_|_Cómo_introducir_retratos_(portraits)_en_un_script_(nivel_fácil)
#0
Ray Laé Àlfori 0
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í:


http://www.youtube.com/watch?v=vJUt1Gsyshs


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 y dejaros con la intriga). No uséis ni los tiles, ni el retrato, por favor. Son para mi proyecto :p


¿Qué necesitaremos?



Conocimientos previos "recomendados" para poder entender el tutorial



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:





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.




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:





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".




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):

'---------------
#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



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:




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:




Entonces lo guardamos, lo borramos y lo volvemos a insertar, así:



El resultado sería, pues, el que os he mostrado al principio:




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:





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