Registrarse

Añadir Tipo Hada

Annatar

A la luz del quinto día, mira al este
El objetivo es implementar el Tipo Hada. Es decir, habrá que declarar un nuevo tipo, insertar la imagen, sus efectividades... A si que iré explicando las cosas paso a paso.

Declarando un nuevo tipo

Antes de nada seguiremos los siguientes pasos para ir a la carpeta adecuada:

Código:
pokeruby>constants
y abriremos con el notepad el archivo llamado type_constants.inc. Una vez abierto veremos la siguiente información:

.set TYPE_NORMAL, 0x00
.set TYPE_FIGHTING, 0x01
.set TYPE_FLYING, 0x02
.set TYPE_POISON, 0x03
.set TYPE_GROUND, 0x04
.set TYPE_ROCK, 0x05
.set TYPE_BUG, 0x06
.set TYPE_GHOST, 0x07
.set TYPE_STEEL, 0x08
.set TYPE_MYSTERY, 0x09
.set TYPE_FIRE, 0x0a
.set TYPE_WATER, 0x0b
.set TYPE_GRASS, 0x0c
.set TYPE_ELECTRIC, 0x0d
.set TYPE_PSYCHIC, 0x0e
.set TYPE_ICE, 0x0f
.set TYPE_DRAGON, 0x10
.set TYPE_DARK, 0x11
Por lo tanto, siguiendo el mismo patrón pondremos .set TYPE_FAIRY, 0x12

De este modo ya tendremos creado el Tipo Hada

Editando tabla de tipos

Código:
pokeruby>data
y abriremos con el notepad el archivo type_effectivness.inc y si observáis detenidamente el archivo os daréis cuenta de lo siguiente:

0 => Inmune (x0)
5=> Poco eficaz (x0’5)
20 => Muy eficaz (x2)

Y que las efectividades de cada tipo respecto a los demás siguen el siguiente patrón, no se agrupan por cada tipo, sino que cada una de las efectividades es independiente, por así decirlo, es decir, el patrón es:

.byte TYPE_{tipo del movimiento}, TYPE_{tipo del pokemon que recibe el movimiento}, {0,5 o 20, depende de la efectividad}

Por lo tanto, para añadir el tipo hada poned lo siguiente en orden:

.byte TYPE_FAIRY, TYPE_FIGHT, 20 .byte TYPE_FAIRY, TYPE_POISON, 5 .byte TYPE_FAIRY, TYPE_STEEL, 5 .byte TYPE_FAIRY, TYPE_FIRE, 5 .byte TYPE_FAIRY, TYPE_DRAGON, 20 .byte TYPE_FAIRY, TYPE_DARK, 20 .byte TYPE_FIGHT, TYPE_FAIRY, 5 .byte TYPE_POISON, TYPE_FAIRY, 20 .byte TYPE_BUG, TYPE_FAIRY, 5 .byte TYPE_STEEL, TYPE_FAIRY, 20 .byte TYPE_DRAGON, TYPE_FAIRY, 0 .byte TYPE_DARK, TYPE_FAIRY, 5
Insertando icono

Código:
pokeruby>graphics>types
Centrémonos solo en los tipos, veremos que a cada cual se le asignan dos archivos, la paleta y la imagen. La imagen debe ir en formato.png y la paleta tiene el formato 4BPP.

También abrá que insertar la imagen en este otro directorio:

Código:
pokeruby>graphics-de>types
---------------------------------------------------------------------

He tenido un problema y es que no se como conseguir el archivo .4bpp de una imagen en .png, lo cual es esencial para añidr un nuevo tipo. Para sortear estre problema he copiado la imagen y el .4bpp del tipo ??? y he cambiado en nombre a ambos a fairy, edito el tipo de treecko para ver si funciona pero no se ve ningún cambio.

Es aquí donde pido vuestra ayuda para seguir adelante.
 
Hola, buen día, revisando el código también se utiliza el archivo : pokeruby > include > Pokémon.h
Entre la línea 102 y la 119 se usa:
#define type_
para cada uno de los tipos.
Espero sea de ayuda y puedas lograrlo, saludos :)
 
Última edición:

Laquin

Leyenda de WaH
mira, la imagen .4bpp es generada por gbagfx al compilar, asi que no deberia haber problema

Enviado desde mi SM-G531M mediante Tapatalk
No, o al menos no que yo sepa.

Intenté cambiar los tiles y tuve el mismo problema. Pero he aquí cosas que pude aprender:
-El archivo .4bpp guarda valores hexadecimales
-Cada valor corresponde a un píxel
-El valor dice cuál color de la paleta es.

Me he explicado muy mal: Si pone 34F3, será una imagen de cuatro píxeles (2x2 por ejemplo). Un píxel tendrá el color número 3 de la paleta, otro el número 4, otro el número 15 y otro el 3 de nuevo.

No sé el orden en que se guardan los valores. Si va en horizontal, vertical, por grupos de 8, de 16... Ni idea.

Espero haber ayudado. Estoy en el móvil, así que no puedo hacer mucho más. xD
 
Última edición:
Cada vez más se descubre algo nuevo del PokeRuby dan incluso ganas de empezar a romhackear.
La Base de Ruby gracias a toda la información que se esta descubriendo.
 
Última edición:

Annatar

A la luz del quinto día, mira al este
Re: Respuesta: Añadir Tipo Hada

No, o al menos no que yo sepa.

Intenté cambiar los tiles y tuve el mismo problema. Pero he aquí cosas que pude aprender:
-El archivo .4bpp guarda en forma de texto valores hexadecimales
-Cada valor corresponde a un píxel
-El valor díce el cuál color de la paleta es.

Me he explicado muy mal: Si pone 34F3, será una imagen de cuatro píxeles (2x2 por ejemplo). Un píxel tendrá el color número 3 de la paleta, otro el número 4, otro el número 15 y otro el 3 de nuevo.

No sé el orden en que se guardan los valores. Si va en horizontal, vertical, por grupos de 8, de 16... Ni idea.

Espero haber ayudado. Estoy en el móvil, así que no puedo hacer mucho más. xD
Entonces eso puedo investigarlo fácilmente viendo algunas de las que ya vienen en el pokeruby. A si que es un paso, pero parece que falta editar más cosas, voy a ir buscando a fondo.
 

Laquin

Leyenda de WaH
Seeh, por fin he conseguido averiguarlo.

A ver cómo explico yo esto ahora XD
Se ordenan en tiles de 8x8 píxeles, y cada byte(dos píxeles) está permutado.
Supongamos que tenemos esta imagen.
Código:
[IMG]https://whackahack.com/foro/img/28197/1605/13734.png[/IMG]
El blanco es 0
El negro es 1
El rojo es 2
El azul es 3
El verde es 4

Empezamos por arriba. Cojemos los dos primeros píxeles, blanco y negro, y les damos la vuelta: negro, blanco; es decir, 10.
Seguimos con el siguiente grupo de dos: negro blanco. Le damos la vuelta: blanco negro; es decir, 01.
Seguimos: Negro negro, se queda igual, 11.
Cuarto grupo de dos: Blanco blanco, se queda igua, 00.

Juntando todo nos queda 10011100.
Ahora que ya hemos hecho 8 píxeles, pasamos a la siguiente línea.
Rojo rojo - 22
Blanco rojo - Rojo blanco - 20
Negro blanco - Blanco negro - 01
Blanco negro - Negro blanco - 10
Juntamos con el primer grupo de 8 y nos queda 1001 1100 2220 0110

Siguiente, Azul negro - negro azul - 13
Azul blanco - blanco azul - 03
Azul negro - negro azul - 13
Azul blanco - blanco azul - 03

Todo junto nos queda
Código:
1001 1100 2220 0110 1303 1303
Las cinco siguiente líneas de 8 píxeles son todo blanco, así que todo el tile de 8x8 nos quedaría:
Código:
1001 1100 2220 0110 1303 1303 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Ahora, pasamos al tile de la derecha, en vez de seguir abajo. (Donde está el negro con forma de v)

Negro blanco - blanco negro - 01
Seguimos así con todo y nos queda:
Código:
0101 1000 1000 1220 3332 3230 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Juntamos con el primer tile:
Código:
1001 1100 2220 0110 1303 1303 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 1000 1000 1220 3332 3230 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Ahora que hemos llegado al tile que está más a la derecha, seguimos con los tiles de más abajo.

Las primeras cinco líneas son blancas:
Código:
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Seguimos con la sexta línea del primer tile de abajo:
Blanco blanco - 00
Verde blanco - blanco verde - 04
Verde blanco - blanco verde - 04
Blanco blanco - 00

Siguiente línea de 8 píxeles:
Blanco verde - Verde blanco - 40
Blanco verde - Verde blanco - 40
Blanco verde - Verde blanco - 40
Blanco blanco - 00

Última línea:
Verde blanco - blanco verde - 04
Blanco blanco - 00
Blanco blanco - 00
Verde blanco - blanco verde - 04

Tooodo el tile, con las líneas blancas del principio:
Código:
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0004 0400 4040 4000 0400 0004
Y quedaría el tile 8x8 de abajo a la derecha, os lo dejo como deberes (?)

Luego, se juntan todos los tiles, y ya tenemos todo el bitmap hecho.

Espero que se haya entendido. Ahora que sabemos esto, y que sabemos también que no vamos a andarnos así cada vez que insertemos un gráfico del estilo, o alguien hace una herramienta u otro la busca. xD

¡Saludos!
 
Última edición:

Annatar

A la luz del quinto día, mira al este
Visto lo cual, aunque no tengamos un programa para obtener tal archivo se puede, aunque sea tedioso el archivo a mano. Me imagino que creando en HxD un archivo y hacerlo manualmente y cambiando a posteriori la extensión del archivo servirá.

Aunque todavía falta por conocer la totalidad de los archivos a editar para poder implementar un nuevo tipo.
 

Lunos

Enfrentando a La Organización
mira, la imagen .4bpp es generada por gbagfx al compilar, asi que no deberia haber problema
No, o al menos no que yo sepa.
Pues lo cierto es que si, los archivos .4bpp son generados por el compilador a la hora de hacer una ROM.

Cierto es pero, que hay veces en que por X motivo, el sprite que pretendes usar no es compatible por A o por B con los proyectos de decompilación, dios vaya a saber por qué.

Algo que probé y que mas o menos funciona es:

1) Tomar el archivo .png indexado que seria nuestro sprite.
2) Ponerlo en la carpeta de Pngcrush
3) Hacer Shift + Click Derecho > Abrir ventana de comandos aqui
4) Escribir: pngcrush -ow -rem allb -reduce (Archivo).png y presionar Enter.
5) Luego a ese archivo lo tomás y lo ponés dentro de la carpeta de gbagfx.
6) Hacer Shift + Click Derecho > Abrir ventana de comandos aqui
7) Escribir: gbagfx (Archivo).png (Archivo).4bpp y presionar Enter.
8) Tomar los dos archivos y ponerlos donde lo necesites, renombrando los archivos de acuerdo al uso que quieras darle.
El sexto y septimo paso quizá sean innecesarios por eso, porque el compilador crea los archivos .4bpp por si solo, pero bueh, que mas da.
 

Laquin

Leyenda de WaH
Re: Respuesta: Añadir Tipo Hada

Pues lo cierto es que si, los archivos .4bpp son generados por el compilador a la hora de hacer una ROM.

Cierto es pero, que hay veces en que por X motivo, el sprite que pretendes usar no es compatible por A o por B con los proyectos de decompilación, dios vaya a saber por qué.

Algo que probé y que mas o menos funciona es:

1) Tomar el archivo .png indexado que seria nuestro sprite.
2) Ponerlo en la carpeta de Pngcrush
3) Hacer Shift + Click Derecho > Abrir ventana de comandos aqui
4) Escribir: pngcrush -ow -rem allb -reduce (Archivo).png y presionar Enter.
5) Luego a ese archivo lo tomás y lo ponés dentro de la carpeta de gbagfx.
6) Hacer Shift + Click Derecho > Abrir ventana de comandos aqui
7) Escribir: gbagfx (Archivo).png (Archivo).4bpp y presionar Enter.
8) Tomar los dos archivos y ponerlos donde lo necesites, renombrando los archivos de acuerdo al uso que quieras darle.
El sexto y septimo paso quizá sean innecesarios por eso, porque el compilador crea los archivos .4bpp por si solo, pero bueh, que mas da.
¿Hay que instalar el programa o algo? He descargado pngcrush_1_8_11_w64.exe, y suponía que sería el instalador. Pero cuando lo ejecuto, se abre una ventana de consola que se cierra en menos de un segundo, y lo mismo pasa si lo ejecuto como administrador.

He probado a poner pngcrush_1_8_11_w64.exe -ow -rem allb -reduce (Archivo).png (pues obviamente el programa pngcrush no existe), y simplemente me ha dado unos datos acerca de la imagen. No se ha creado ningún archivo aparte, y el archivo .png que he usado no se ha modificado, por lo que no entiendo a qué se quiere llegar haciendo esto.

Luego, en el paso de gbagfx, me ponía que faltaba cygwin1.dll, por lo que tampoco puede hacer nada, aunque no entiendo por qué pasa esto, pues al compilar la ROM no me dio ese error.

Lo he intentado con la imagen de los tiles, aunque no creo que eso tenga nada que ver. :(
 

Kaiser de Emperana

Called in hand
No hace falta instalar nada más para insertar imágenes. Las unicas restricciones para imágenes son:
  • Que tanto su, alto como su ancho sea un múltiplo de 8 pixeles. Ej: 64x64, 64x32, 16x8, etc.
  • Que esté indexada.
Es decir, las mismas restricciones del rom hacking.


Luego, para incluir la imagen en el juego la cosa es así:
Suponiendo que la imagen tenga la ruta "pokemon/icons/400.png" (me la acabo de inventar, seguro no se llama así), ustedes al incluir el archivo NO deben incluir el png, sino que le deben cambiar la extensión.
Si lo que ustedes están insertando es una imagen de 16 colores, lo que deben incluir es: "pokemon/icons/400.4bpp". Así gbagfx va a generar el archivo que ustedes necesitan en base al png.
En caso de que esten insertando una imagen de 256 colores lo que deben poner de extension es: .8bpp
Y en caso de que quieran la paleta de la imagen: .gbapal

Si quieren que la imagen o paleta sea comprimida, lo que deben hacer es agregarle también la extensión .lz, tal que:
  • .4bpp.lz
  • .8bpp.lz
  • .gbapal.lz

Y eso sería básicamente toda la ciencia, no se si lo dejé claro.
 

Lunos

Enfrentando a La Organización
Respuesta: Re: Respuesta: Añadir Tipo Hada

pngcrush es una aplicación que se usa mediante la consola de Windows. Yo expliqué como usar el comando en cuestión justo aqui.

1) Ponés el .png en la carpeta de pngcrush.
2) Shift + Click Derecho > Abrir ventana de comandos aqui
3) En ella, escribes: pngcrush -ow -rem allb -reduce (Archivo).png
4) Presionas el Enter, y tu archivo .png es modificado automaticamente. No se crea una copia de él.

Y obviamente, con "(Archivo)" te estoy diciendo que escribas el nombre del archivo en si.
No hace falta instalar nada más para insertar imágenes. Las unicas restricciones para imágenes son:
  • Que tanto su, alto como su ancho sea un múltiplo de 8 pixeles. Ej: 64x64, 64x32, 16x8, etc.
  • Que esté indexada.
Es decir, las mismas restricciones del rom hacking.
Si y no. Yo intenté hacer ese proceso sencillo a la hora de insertar iconos pokémon, y no funcionó un carajo.

Se que no viene mucho al caso, pero si te apetece dale el intento personalmente y me cuentas como te va. Quizá la forma en la que yo indexo imagenes no es la correcta o algo por el estilo.
Como a mi se me complicó con el tema de los iconos (como podés ver en el tema que enlacé ahi arriba) y parece que por aquí, a la gente se le complican los iconos de los tipos, yo asumo que el proceso que usé con el de los pokémon podria funcionar con el los tipos, es por eso que decidí participar.
 

Lunos

Enfrentando a La Organización
Investigación hecha por mi parte:
^ ¿Saben lo que noté? Que en pokeruby\graphics\types hay 3 archivos de paleta, como pasa con los iconos pokémon.
Yo usé la segunda, y en base a sus colores hice un icono personalizado.
En teoria, tiene que haber un archivo que maneje el indice de paleta usado por los iconos de los tipos.
Con eso ya tendriamos el icono funcionando, sin dudas.

EDITO: Busqué y nada, no pude encontrar un archivo equivalente :(

EDITO2: Lo mejor seria proseguir con la investigación y dejar el asunto con el sprite de lado, al menos de momento. Quizá los iconos de los tipos no necesitan un control de indices de paleta.

EDITO3: Creo que encontré otra pieza del rompecabezas.
{DexText_Terminator5, gTypeNames[TYPE_FAIRY]},
En el archivo pokeruby\src\pokedex.c, tras la Linea 1177.

EDITO4: Ah si, y como dijo Skhorus, tambien hay que definirlo en el archivo pokeruby\include\pokemon.h, tras la Linea 119.

Por cierto, @Turin Turambar, cometiste un pequeño error en el post principal. El tipo lucha no está definido como "TYPE_FIGHT", es "TYPE_FIGHTING".
Estoy hablando del archivo "pokeruby\data\type_effectiveness.inc".

Corregido ese error, creo que la ROM ya está compilando bien. Pase lo que pase, editaré el post de nuevo.

EDITO5: Pues parece funcionar.
El unico problema, o mas bien error, fue definir al Tipo Hada como el 0x12. Yo supongo que del 0x12 al 0x16 o asi, vienen los stats de los Concursos Pokémon. Necesitamos ponerlo como 0x17 o 0x18, tal y como pasa en el ROM Hacking por metodos binarios.


EDITO6: Ahora mismo, creo que hay 2 cosas principales por hacer:
-Descubrir como enlazar el Tipo Hada con su icono en pokeruby\graphics\types.
-Añadir una string referente al Tipo Hada para los tipos de los movimientos en batalla.

EDITO7: Okay, quizá haya encontrado algo relacionado con el segundo punto.
Resulta que el archivo pokeruby\data\text\type_names.inc tambien está relacionado a los tipos. Yo me acordé de este archivo porque lo traduje para mi Pokerubi. Creo que de alguna forma, hay que incluir al Tipo Hada en él.
Es para los tipos que aparecen en el modo busqueda de la Pokédex y para los tipos de los movimientos en batalla.

Hasta ahora tenemos:
1) Modificación a pokeruby\constants\type_constants.inc
2) Modificación a pokeruby\data\type_effectiveness.inc
3) Añadir el icono del Tipo Hada en pokeruby\graphics\types
4) Modificación a pokeruby\src\pokedex.c
5) Modificación a pokeruby\include\pokemon.h
6) Modificación a pokeruby\data\text\type_names.inc

EDITO8: Pues pude arreglar la string en batalla. Ya que los stats de concurso son contados como stats regulares, simplemente añadí lineas de relleno en pokeruby\data\text\type_names.inc, ajusté las definiciones del Tipo Hada correspondientemente y como que funcionó.

Basicamente:
type_constants.inc:
.set TYPE_DARK, 0x11
.set TYPE_WHATEVER, 0x12
.set TYPE_WHATEVER, 0x13
.set TYPE_FAIRY, 0x14

pokemon.h:
#define TYPE_DARK 0x11
#define TYPE_FAIRY 0x14

type_names.inc:
.string "SINIE.$", 7
.string "WHATE.$", 7
.string "WHATE.$", 7
.string "FAIRY$", 7

Resultado:


EDITO9: Lo probé, pero la tabla de efectividades(?) no andaba funcionando. Lo que hice fue mover la del Tipo Hada hacia arriba del 0xFE, y ahi funcionó lo mas tranqui.

Basicamente solo nos queda el icono, y lo habremos logrado.

EDITO10: Damas y Caballeros, lo hemos conseguido. El premio está en pokeruby\misc.mk
Esto lo encontró Shinny, un amigo mio. Nos pusimos a investigar, preguntar y probar, y él encontró el metodo.
Tenemos que irnos a la Linea 203 de misc.mk y ahi, veremos lo siguiente:
types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark
contest_types := cool beauty cute smart tough​
^
Esas lineas contienen, en orden de tipos, los nombres de los archivos que están en pokeruby\graphics\types.
Si queremos añadir el Tipo Hada, pues toca añadir "fairy" (correspondiente a los archivos fairy.png y fairy.4bpp) a la lista de tipos justo despues de "dark".

El problema, sin embargo, es el siguiente:
Si lo añadimos al Tipo Hada como el 0x12, todo parece funcionar de maravilla (a excepción de la paleta del icono), pero estaremos jodiendo el stat "Cool" usado por los Concursos Pokémon.
Si lo añadimos como un tipo nuevo (el 0x17), las cosas no parecen funcionar. El juego crashea en la pantalla de estadisticas pokémon.

Asi que... o tocaria toquetear los tipos de los Concursos Pokémon y trastear con sus ordenes, o tocaria arreglar el problema que ocurre añadiendolo como el tipo 0x17.

Oh bueno, aqui un videito.


Creo que lo dejaré aquí por hoy, que ya bastante progreso hemos hecho.

Pues EDITO11, me cago en la santa puta:
Shinny y yo nos estamos acercando.
Resulta que hay que cambiar el 18 que vemos en la Linea 2489 (SummaryScreen_DrawTypeIcon(gContestMoves[move].contestCategory) dependiendo del numero de tipos que vayamos a añadir. En este caso seria 19, pues solo queremos añadir 1 tipo, el Tipo Hada.
Ese 18 son los 18 tipos que hay en el juego por defecto (van del 0 al 17).

Con esto el tipo hada funciona completamente, el problema es que reemplaza a uno de los stats de los Concursos Pokémon :(
Si cambiamos a 19 el otro SummaryScreen_DrawTypeIcon(gContestMoves[move].contestCategory que está en la Linea 2455, el juego crashea.

Ahora si que si, me retiro a la cama que ya bastante se ha hecho.​
 
Última edición:

Lunos

Enfrentando a La Organización
Pues bueno, toca hacer un bump. Shinny practicamente lo logró.
Tipo Hada funcionando a la perfección en Pokeruby.

La busqueda por tipos de la pokédex es lo unico que no está funcionando correctamente, pero parece que planea intentar solucionarlo.

Lista de archivos modificados/añadidos:
1) pokeruby\constants\type_constants.inc
2) pokeruby\data\type_effectiveness.inc
3) pokeruby\graphics\types\fairy.png
4) pokeruby\misc.mk
5) pokeruby\include\pokemon.h
6) pokeruby\data\text\type_names.inc
7) pokeruby\src\pokemon_summary_screen.c
8) pokeruby\src\pokedex.c

~~|Modificaciones|~~
type_constants:
.set TYPE_DARK, 0x11
.set TYPE_FAIRY, 0x12
type_effectiveness:
.byte TYPE_FAIRY, TYPE_FIGHTING, 20
.byte TYPE_FAIRY, TYPE_POISON, 5
.byte TYPE_FAIRY, TYPE_STEEL, 5
.byte TYPE_FAIRY, TYPE_FIRE, 5
.byte TYPE_FAIRY, TYPE_DRAGON, 20
.byte TYPE_FAIRY, TYPE_DARK, 20
.byte TYPE_FIGHTING, TYPE_FAIRY, 5
.byte TYPE_POISON, TYPE_FAIRY, 20
.byte TYPE_BUG, TYPE_FAIRY, 5
.byte TYPE_STEEL, TYPE_FAIRY, 20
.byte TYPE_DRAGON, TYPE_FAIRY, 0
.byte TYPE_DARK, TYPE_FAIRY, 5​
^ Antes del 0xFE.

fairy.png:


misc.mk:
types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark fairy
pokemon.h:
#define TYPE_DARK 0x11
#define TYPE_FAIRY 0x12
type_names.inc:
.string "DARK$", 7
.string "FAIRY$", 7
pokemon_summary_screen.c:
Esto va en un spoiler porque acá vamos a toquetear varias cosillas.
1) Ctrl+F "struct CompressedSpriteSheet sUnknown_083C11B8" y vamos a cambiar el 0x1700 por un 0x1800.
0x1700 son 6 KBs pero en hexadecimal, 6 KBs corresponde al tamaño del archivo pokeruby\graphics\types\move_types.4bpp
Al añadir un nuevo icono de tipo, pasamos a tener 100 KBs mas, por lo que el 0x1700 se convierte en 0x1800.

2) En la Linea 200, tendremos una tabla que lucirá asi:
static const union AnimCmd sSpriteAnim_83C10A4[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10AC[] = { ANIMCMD_FRAME(8, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10B4[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10BC[] = { ANIMCMD_FRAME(24, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10C4[] = { ANIMCMD_FRAME(32, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10CC[] = { ANIMCMD_FRAME(40, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10D4[] = { ANIMCMD_FRAME(48, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10DC[] = { ANIMCMD_FRAME(56, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10E4[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10EC[] = { ANIMCMD_FRAME(72, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10F4[] = { ANIMCMD_FRAME(80, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C10FC[] = { ANIMCMD_FRAME(88, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C1104[] = { ANIMCMD_FRAME(96, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C110C[] = { ANIMCMD_FRAME(104, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C1114[] = { ANIMCMD_FRAME(112, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C111C[] = { ANIMCMD_FRAME(120, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C1124[] = { ANIMCMD_FRAME(128, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C112C[] = { ANIMCMD_FRAME(136, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C1134[] = { ANIMCMD_FRAME(144, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C113C[] = { ANIMCMD_FRAME(152, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C1144[] = { ANIMCMD_FRAME(160, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C114C[] = { ANIMCMD_FRAME(168, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_83C1154[] = { ANIMCMD_FRAME(176, 0), ANIMCMD_END, };​
Pues la vamos a reemplazar con esta:
static const union AnimCmd sSpriteAnim_NORMAL[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_FIGHTING[] = { ANIMCMD_FRAME(8, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_FLYING[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_POISON[] = { ANIMCMD_FRAME(24, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_GROUND[] = { ANIMCMD_FRAME(32, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_ROCK[] = { ANIMCMD_FRAME(40, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_BUG[] = { ANIMCMD_FRAME(48, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_GHOST[] = { ANIMCMD_FRAME(56, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_STEEL[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_MYSTERY[] = { ANIMCMD_FRAME(72, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_FIRE[] = { ANIMCMD_FRAME(80, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_WATER[] = { ANIMCMD_FRAME(88, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_GRASS[] = { ANIMCMD_FRAME(96, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_ELECTRIC[] = { ANIMCMD_FRAME(104, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_PSYCHIC[] = { ANIMCMD_FRAME(112, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_ICE[] = { ANIMCMD_FRAME(120, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_DRAGON[] = { ANIMCMD_FRAME(128, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_DARK[] = { ANIMCMD_FRAME(136, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_FAIRY[] = { ANIMCMD_FRAME(144, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_COOL[] = { ANIMCMD_FRAME(152, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_BEAUTY[] = { ANIMCMD_FRAME(160, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_CUTE[] = { ANIMCMD_FRAME(168, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_SMART[] = { ANIMCMD_FRAME(176, 0), ANIMCMD_END, };
static const union AnimCmd sSpriteAnim_TOUGH[] = { ANIMCMD_FRAME(184, 0), ANIMCMD_END, };​
3) Una linea de por medio mas abajo, tendremos esta:
static const union AnimCmd *const sSpriteAnimTable_83C115C[] = {
sSpriteAnim_83C10A4,
sSpriteAnim_83C10AC,
sSpriteAnim_83C10B4,
sSpriteAnim_83C10BC,
sSpriteAnim_83C10C4,
sSpriteAnim_83C10CC,
sSpriteAnim_83C10D4,
sSpriteAnim_83C10DC,
sSpriteAnim_83C10E4,
sSpriteAnim_83C10EC,
sSpriteAnim_83C10F4,
sSpriteAnim_83C10FC,
sSpriteAnim_83C1104,
sSpriteAnim_83C110C,
sSpriteAnim_83C1114,
sSpriteAnim_83C111C,
sSpriteAnim_83C1124,
sSpriteAnim_83C112C,
sSpriteAnim_83C1134,
sSpriteAnim_83C113C,
sSpriteAnim_83C1144,
sSpriteAnim_83C114C,
sSpriteAnim_83C1154,
};​
Y la reemplazaremos por esta:
static const union AnimCmd *const sSpriteAnimTable_83C115C[] = {
sSpriteAnim_NORMAL,
sSpriteAnim_FIGHTING,
sSpriteAnim_FLYING,
sSpriteAnim_POISON,
sSpriteAnim_GROUND,
sSpriteAnim_ROCK,
sSpriteAnim_BUG,
sSpriteAnim_GHOST,
sSpriteAnim_STEEL,
sSpriteAnim_MYSTERY,
sSpriteAnim_FIRE,
sSpriteAnim_WATER,
sSpriteAnim_GRASS,
sSpriteAnim_ELECTRIC,
sSpriteAnim_PSYCHIC,
sSpriteAnim_ICE,
sSpriteAnim_DRAGON,
sSpriteAnim_DARK,
sSpriteAnim_FAIRY,
sSpriteAnim_COOL,
sSpriteAnim_BEAUTY,
sSpriteAnim_CUTE,
sSpriteAnim_SMART,
sSpriteAnim_TOUGH,
};​
4) Ctrl+F "SummaryScreen_DrawTypeIcon(gContestMoves[move].contestCategory", habrán 2 resultados.
En ambas ocasiones notaremos un "18". Lo cambiaremos por un "19".

5) Ctrl+F "static const u8 sUnknown_PaletteNums", veremos una lista de los numeros de paleta usados por los iconos de los tipos.
Lo que haremos será añadir un 0xE, 5 Offsets/IDs desde el final para atras.

Basicamente de esto:
static const u8 sUnknown_PaletteNums[] = { 0xD, 0xD, 0xE, 0xE, 0xD, 0xD, 0xF, 0xE, 0xD, 0xF, 0xD, 0xE, 0xF, 0xD, 0xE, 0xE, 0xF, 0xD, 0xD, 0xE, 0xE, 0xF, 0xD };​
Pasaria a esto:
static const u8 sUnknown_PaletteNums[] = { 0xD, 0xD, 0xE, 0xE, 0xD, 0xD, 0xF, 0xE, 0xD, 0xF, 0xD, 0xE, 0xF, 0xD, 0xE, 0xE, 0xF, 0xD, 0xE, 0xD, 0xE, 0xE, 0xF, 0xD };​

pokedex.c:
Ctrl+F "UnknownStruct2 gUnknown_083B59C8" y añadimos una linea para el Tipo Hada, tal que asi:
{DexText_Terminator5, gTypeNames[TYPE_DARK]},
{DexText_Terminator5, gTypeNames[TYPE_FAIRY]},
Ctrl+F "static const struct UnknownStruct1 gUnknown_083B5A7C" y veremos esta tabla:
static const struct UnknownStruct1 gUnknown_083B5A7C[] =
{
{gUnknown_083B5910, 6, 7, 10},
{gUnknown_083B5968, 8, 9, 11},
{gUnknown_083B59C8, 10, 11, 18},
{gUnknown_083B59C8, 12, 13, 18},
{gUnknown_083B58D8, 4, 5, 6},
{gUnknown_083B58C0, 2, 3, 2},
};​
Pues simplemente reemplazamos esos 2 18 en las Lineas 5 y 6 por 2 19.

---------------------------------------------------------------------

Y si no me salté nada, el resultado deberia de ser el mismo que el que se puede apreciar en el video.

De nuevo, la gran mayoria de esta labor fue pura obra de Shinny, un miembro del Discord de PokeCommunity y algunos otros servidores de los que formo parte.
Él fue quien hizo los cambios pesados como pokemon_summary_screen.c y pokedex.c
Honestamente se siente genial formar parte de una especie de esfuerzo combinado como lo fue esta investigación.
Es casi como si ambas comunidades (la Inglesa y la Española) unieran fuerzas.

Si Shinny logra corregir el problema con el modo busqueda de la pokédex, naturalmente lo traeré hasta aquí.​
 

Tenma

Usuario de Oro
Hola buenas, he seguido el tuto y se ve todo perfecto PERO creo que he encontrado un bug: si entras en el menu del pokemon donde sale el tipo, habilidad, naturaleza etc y vas cambiando de pokemon arriba abajo arriba abajo etc entonces se bugean los graficos de las pokeballs y los graficos de los primeros tipos (normal, lucha...).

static const struct CompressedSpriteSheet sUnknown_083C11B8 = { gMoveTypes_Gfx, 0x1800, 30002 }; si cambias el 0x1800 por el 0x1700 entonces ya no me sale el bug pero luego se bugea los graficos de los concursos.

La verdad es que he tocado varias otras cosas en el pokeruby y puede que ese bug sea por otra cosa que haya tocado pero bueno por eso lo pongo aqui para que alguien mas pruebe si tambien le sale el bug.
 

Lunos

Enfrentando a La Organización
Hola buenas, he seguido el tuto y se ve todo perfecto PERO creo que he encontrado un bug: si entras en el menu del pokemon donde sale el tipo, habilidad, naturaleza etc y vas cambiando de pokemon arriba abajo arriba abajo etc entonces se bugean los graficos de las pokeballs y los graficos de los primeros tipos (normal, lucha...).

static const struct CompressedSpriteSheet sUnknown_083C11B8 = { gMoveTypes_Gfx, 0x1800, 30002 }; si cambias el 0x1800 por el 0x1700 entonces ya no me sale el bug pero luego se bugea los graficos de los concursos.

La verdad es que he tocado varias otras cosas en el pokeruby y puede que ese bug sea por otra cosa que haya tocado pero bueno por eso lo pongo aqui para que alguien mas pruebe si tambien le sale el bug.
Pues si, tienes razón. Otra cosa mas que arreglar.

ON: Hice un repositorio con los archivos relacionados a esta investigación para facil acceso.
https://github.com/LOuroboros/pokeruby_fairy
 

Ngidol

Caballero de Assembly (?)
Hola, traigo dos cosas.
Lo primero es que en la última versión de pokéruby con la que trabajé, hace como uno o dos commits atrás, los archivos ya habían cambiado lo suficiente como para que muchos de los puntos discutidos ya no sean aplicables. Lo que sí logré replicar el error de los glitches gráficos de los tipos normal, lucha y las pokéball peeeero, no conseguí que me mostrara mi ícono del tipo hada.

¿Qué es lo segundo que traigo? Pokéemerald.

Me puse a buscar con el buscador de VSCode que simplemente lo amo, la palabra "dark" y me apunté todas las localizaciones, al menos las primeras, que tendríamos que atacar de querer implementar el tipo hada (o los que queramos) en pokeemerald.
Cabe destacar que me estoy basando en el commit 4223bb6.

Ahora, la lista de localizaciones.

rom_8011dc0.s
gUnknown_082F029C
graphics_file_rules.mk
pes; línea 24
pokemon.h

graphics.h
líneas a partir de: 3775, ligadas a items.h, paletas.

id_script.txt, cerca de la línea 175, y la 499

battle_main.c
líneas a partir de la 344

battle_message.c, sobre la 1208

item_icon_table.h, sobre la 314

menu.c, sobre la 95

pokedex.c, sobre la 1111, tbn la 1137

pokemon_summary_screen.c, sobre la 808

pokemon.c, sobre la 2271

Al principio quise poner los nombres de las funciones o lugares, pero acabé poniendo el número de línea XD
 

Lunos

Enfrentando a La Organización
Re: Respuesta: Añadir Tipo Hada

Deberían mirar esto, DizzyEgg tiene insertado el tipo hada en su versión mejorada del battle engine de pokeemerald.

https://www.pokecommunity.com/showthread.php?t=417820
No lo mencioné porque en este tema se tocaba la inserción del tipo hada en Pokeruby, pero si, Egg ya insertó el tipo hada en Pokeemerald y ahi las cosas funcionan bien. Mismo proceso que describí algunos posts arriba, excepto que por algun motivo allí no se generan los problemas que si se generaban con Pokeruby. No tengo idea de porque pasa eso, pero.

Eso si, para sacar todos los cambios que se requieren desde ese repositorio, toca usar git grep a saco.
La lista de commits es un poco confusa y bastante desordenada.
De lo contrario, la lista de Jasón tiene pinta de estar bastante completa.
 

Ngidol

Caballero de Assembly (?)
Respuesta: Re: Respuesta: Añadir Tipo Hada

Deberían mirar esto, DizzyEgg tiene insertado el tipo hada en su versión mejorada del battle engine de pokeemerald.

https://www.pokecommunity.com/showthread.php?t=417820
No lo mencioné porque en este tema se tocaba la inserción del tipo hada en Pokeruby, pero si, Egg ya insertó el tipo hada en Pokeemerald y ahi las cosas funcionan bien. Mismo proceso que describí algunos posts arriba, excepto que por algun motivo allí no se generan los problemas que si se generaban con Pokeruby. No tengo idea de porque pasa eso, pero.

Eso si, para sacar todos los cambios que se requieren desde ese repositorio, toca usar git grep a saco.
La lista de commits es un poco confusa y bastante desordenada.
De lo contrario, la lista de Jasón tiene pinta de estar bastante completa.
Llevo desde ayer mirando ese fork y realmente, después de dos resets y eliminación de branches a saco (master incluído, seguido de un push forzoso) desaconsejo completamente su uso hasta que documente absolutamente todo o separe en branches independientes que consuman el repo de pret directamente.

Me preocupa que realmente no esté tan actualizado a los commits de pret, pues, por ejemplo, no he sido capaz de encontrar la tabla de tipos para añadir unas cuantas resistencias y actualizarla. Simplemente no sé cómo pero, simplemente "no está".
Para quitar las batallas dobles contra pokémon salvajes tuve que pedir ayuda Zvleon en discord.

EDIT: ya encontré la tabla de tipos, implementó un array de arrays con todas las combinaciones posibles. Pero sigo desaconsejando el uso de la engine de Dizzy hasta que haya más documentación (o creemos nosotros un post de investigaciones documendando todo).


PD: después de la primera vez, nunca me funcionó git grep :c
 
Arriba