Registrarse

[Otros] Buenas prácticas de uso de AGIXP

Pum

GBCero
NOTA: Aquí no se explicará paso a paso como insertar sprites con AGIXP, eso se puede ver Aquí y Aquí

Programas que se usarán:

La comunidad de hackers GBC siempre suele tener problemas con la misma herramienta, AGIXP. Y con razón, la herramienta nos proporciona una utilidad enorme, permitiendo cambiar sprites, tiles, etc. Pero a cambio de una cantidad de bugs importante, en este tutorial intentaré explicar como usar AGIXP y dejarlo todo como tiene que estar. Y más importante, no malgastar el espacio.

Insertar sprites de un Pokémon nuevo es una tarea que gasta mucho espacio en la ROM, ya que cada sprite de 56x56 nos ocupará aproximadamente 512 bytes. Debido a esto, la inserción de sprites es algo que siempre se hace al final del todo, cuando nuestro hack ya tiene el resto de cambios agregados.

Entonces, cuando estamos en esa etapa, o cuando estamos metiendo los sprites en un Rom limpio para crear un parche ips, es crucial documentar la localización de cada sprite nuevo en el ROM. Antes de continuar, es importante saber realizar una Inserción correcta de Sprites y Tiles con AGIXP. Antes de seguir leyendo recomiendo leerse ese tutorial.

Tras eso, ya sabemos que debemos insertar los sprites de un Pokémon en una zona completamente libre, con un ejemplo listemos los pasos a seguir:

  1. Escojemos Bank donde se insertarán nuestros sprites. En el tutorial antes mencionado se usa el bank 6F (0x1BC000), en nuestro ejemplo usaremos el bank 74 (0x1D0000). El bank se calcula dividiendo el Offset entre 4000.

  2. Queremos substituir un pokemon por otro, de forma que insertaremos nuestro sprite y borraremos el antiguo. Antes de insertar nuestro sprite debemos revisar una cosa: El byte número 18 de la zona donde estan guardados los datos de los stats del antiguo pokemon. Este byte representa el tamaño del sprite del Pokémon y puede tener los siguientes valores: 55, 66 o 77. 55 significa que el sprite tiene de dimensiones 40x40; 66 -> 48x48 y 77 -> 56x56.
    El valor de este byte debe coincidir con el sprite que nosotros insertaremos, si queremos substituir un pokemon por otro. Siguiendo nuestro ejemplo, imaginémonos que hemos creado un frontsprite de Gliscor de 56x56, y queremos substituirlo por el sprite de Ledyba (que es 40x40). Lo que tenemos que hacer es ir a nuestro editor de Hex, ir a la dirección 0x51B0B, y llegaremos a el listado de stats de pokémon.
    Como podemos observar, en 0x51B0B hay un '01', que representa el pokemon Nº 1 : Bulbasaur. Como cada Pokémon tiene 32 bytes asignados para los stats, podemos bajar dos líneas y veremos un '02' , bajamos otras dos y veremos un '03', etc... Ledyba, el pokémon que queremos substituir, es el número 165, A5 en Hexadecimal, entonces bajamos hasta encontrar A5, que en nuestro caso se encuentra en 0x52F8B. Vamos al 18º byte y cambiamos el 55 por un 77.

    Otra forma de acceder al offset del byte Nº 18 de nuestro Pokémon sería con la siguiente fórmula:

    Código:
    (0x20 * ID del pokemon) + 51AFC
    De esta forma calcularíamos el offset del 18º byte de cualquier pokemon solo calculándolo con su ID (en hexadecimal).
    Siguiendo nuestro ejemplo, Ledyba está en la posición A5, entonces:
    Código:
    (0x20 * A5) + 51AFC = 52F9C
    Y ahí esta nuestro byte.

    Pulsamos F5 en Gold finger y:



  3. Insertamos nuestro primer frontsprite en 0X1D0000, hacemos como se explica en el tutorial y en el offset ponemos &H1D0000, tras insertarse, abrimos Pgp Changer, abrimos nuestra Rom y ponemos Ledyba en el buscador (donde pone bulbasaur) y le damos a la flecha hacia abajo. Podremos visualizar nuestro sprite y ver si se muestra correctamente. (NOTA: Si cambiamos el nombre de Ledyba a Gliscor, habrá que buscar Gliscor).

  4. Si se muestra correctamente, en nuestro documento donde apuntamos los cambios de la Rom, apuntaríamos que el frontsprite de Gliscor está en 0x1D0000.

  5. Ahora abrimos la herramienta Free Space Finder, se usará tal y como se usa en el tutorial antes mencionado, la cantidad de espacio necesaria es 200, se empieza a buscar en 1D0000 y el espacio libre se representa con '00'.

    Como nosotros vamos a insertar al principio de un bank, tenemos 16383 bytes completamente disponibles (Si el bank está completamente libre).
    Asegúrese de que inserta en un bank con espacio suficiente, si necesita más espacio que el que le puede proporcionar un solo bank entonces calcule lo siguiente:
    Código:
    0x4000 * (Bank+1)
    Bank es el valor de bank donde empezamos a insertar (74 en nuestro caso). El resultado de la operación de arriba nos dirá donde comienza el siguiente bank. Con ese resultado calculado, simplemente inserte sus sprites hasta que Free Space Finder le dé un offset cuya diferencia entre el valor calculado y dicho offset sea 200 o menos. Si esto sucede, inserte en la primera posición del siguiente Bank en vez de donde Free Space Finder le dice.

    En nuestro ejemplo, el resultado da 1D4000; si insertamos muchos sprites y al calcular el espacio libre para el siguiente sprite Free Space Finder nos dice que el siguiente offset es 1D3F23, no podemos usar este valor, ya que el siguiente bank (75) comienza en 1D4000, y 1D4000 - 1D3F23 da DD, que es menor que 200. Entonces le decimos a AGIXP que inserte en 1D4000, y documentamos eso.

    Esto es así porque un sprite se leerá incorrectamente si una parte está en un Bank y otra parte está en otro Bank.

  6. Ahora buscamos el espacio libre para nuestro siguiente sprite, en este caso el backsprite de Gliscor, en nuestro caso nos dice que 1D01FA (nuestro sprite ocupó 1FA bytes (506 en decimal)).

  7. Todos los backsprites son siempre 48x48, no tenemos que editar ningún byte para esto, pero sí hay una cosa que debemos asegurarnos está correctamente: Ambos sprites tienen el mismo orden en la paleta.
    Para comprobar si esto es así, abrimos otra instancia de AGIXP en la cual abrimos nuestro frontsprite de nuevo y comparamos los dos de esta forma:


    Hay dos problemas, el orden la paleta no es correcto, y los dos colores son distintos en cada sprite (9C8BEC vs 9C8BEE y 414154 vs 414152.

    El segundo problema lo podemos ignorar, ya que el juego usará la paleta del último sprite insertado al mismo Pokémon (en nuestro caso usará la paleta del backsprite) y ambas son casi iguales. Pero el primer problema es grave, si insertamos nuestro backsprite así tal cual, éste se verá correctamente, pero en el frontsprite que insertamos antes se invertirán los colores. Solucionar esto es simple, en la ventana de AGIXP que tiene abierto nuestro backsprite reordenamos los colores clickando en cada uno para que estén en el mismo orden.

  8. Tras arreglar eso, insertamos el backsprite donde Free Space Finder nos dijo (en nuestro caso 0x1D01FA), e , igual que antes, comprobamos su correcta inserción y visualización.

  9. Si se insertó correctamente, anotamos el offset donde se insertó nuestro backsprite. Debería de quedar algo así:
    Código:
    Offsets de Nuevos sprites:
    
    1D0000 : Frontsprite Gliscor
    1D01FA : Backsprite Gliscor
  10. Ahora nos falta cambiar la paleta del shiny. No necesitan insertar el sprite de gliscor Shiny, pero se puede hacer para cambiar la paleta, pero si hacen esto SIEMPRE inserten el sprite shiny en el MISMO offset donde insertaron su contraparte No-Shiny. Por ejemplo si quiero insertar el frontsprite shiny de Gliscor, voy a AGIXP y lo inserto en 1D0000. En AGIXP deberé haber marcado que el sprite es Shiny y por supuesto eliminar el sprite antiguo. No recomiendo hacer esto si tuvieron que arreglar el orden de la paleta.
    Una mejor forma de hacer esto es con PGP Changer, simplemente reabrimos el ROM y vamos a nuestro sprite de Gliscor. Clickeamos sobre los dos cuadrados con color de abajo y los cambiamos usando el editor RGB que está a la derecha.


  11. Por último nos falta arreglar un bug que AGIXP deja en los stats de los Pokémon. ¿Recuerdan como tuvimos que cambiar el byte Nº 18 según la resolución de nuestro sprite? Pues en realidad AGIXP lo hace él solo, el problema es que inserta ese valor en el byte incorrecto, específicamente en el byte Nº 7. Este byte representa el stat de Defensa Especial del pokemon, y en nuestro caso habrá hecho que Ledyba (o Gliscor si ya habíamos cambiado los stats) tenga 119 de Defensa especial (77 en Hexadecimal). Solucionar esto es simple, memorizamos el offset donde estábamos, reabrimos la Rom para no eliminar los cambios hechos y ponemos el valor correspondiente en el byte mencionado.

  12. Para insertar un nuevo Pokémon, repetiríamos todo, usando Free Space finder desde el principio y que busque.

En resumen, los siguientes aspectos se han tocado en esta pared de texto:

1.- Documentación y localización

2.- Inserción correcta de un Frontsprite y un Backsprite juntos

3.- Arreglo de bytes cambiados por AGIXP incorrectamente

4.- Inserción de shinyes de forma eficiente

5.- Asegurarnos de no insertar el mismo sprite en dos banks distintos al mismo tiempo

Si creen que algún aspecto de este tutorial necesita ser cambiado, comente abajo dando sus razones.
 
Última edición:

Aguiar

Colega de los colegas
Miembro del equipo
Staff
Respuesta: GBC | Gráficos | Buenas prácticas de uso de AGIXP.

No creo que lo vaya a utilizar, pero si algún día me paso a GBC me será de gran utilidad.
Está muy bien explicado, muy bien redactado... buah, una maravilla en la que has depositado tiempito rico.

Gracias por aportar!
 
  • Me gusta
Reacciones : Pum

Chamber

Miembro insignia
Miembro insignia
Respuesta: GBC | Gráficos | Buenas prácticas de uso de AGIXP.

Mu buen tutorial, se entiende todo a la perfección solo que yo le agregaría algunas imágenes mas a algunos ejemplos.

Comprender que agixp es una herramienta exacta, mas no automatica ayuda al buen desarrollo de un proyecto GBC.

Como consejo puedo sugerir que agregues formulas a los ejemplos de busqueda de bytes, por ejemplo:

Código:
(0x20 * ID del pokemon) + 51AFC

51AFC = 51B1C + 18decimal - 32decimal ; tamaño de los datos de cada pokemon
Así fácilmente podemos encontrar los datos usando la calculadora.

Sobre el FEF hay que tener cuidado, sobre todo los novatos. Nunca he usado esa herramienta pero se me ocurre que se puede confundir el espacio libre en el borde de 2 bancos, lo que ocacionario problemas al leer el sprite. Yo en mi metodo de insercion uso el buscador de Agixp, inserto la direccion de inicio (en este caso &H1D0000) y dejo que Agixp haga el resto, asi el programa automaticamente cambia de banco si no hay suficiente espacio.

Creo que de momento es todo, gracias por el tutorial.
 
  • Me gusta
Reacciones : Pum

Pum

GBCero
Respuesta: GBC | Gráficos | Buenas prácticas de uso de AGIXP.

Gracias, agregué gran parte de lo que comentaste pero respecto a las imágenes, agregué una de Gold finger pero nada más. Las imagénes de la inserción de sprites en AGIXP y del uso de Free Space Finder se pueden ver en el otro tutorial, y PGP ya tiene una imagen que muestra la paleta.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: GBC | Gráficos | Buenas prácticas de uso de AGIXP

Hombre, lo del bug de tamaño en la defensa especial no lo sabía, creí que era mi rom la bugesda, ahora ya se porque la defensa especial de los pokes de mi hack era incorrecta, Gracias por el tuto hombre!!!
 
  • Me gusta
Reacciones : Pum
Arriba