Registrarse

Investigación sobre las regiones de pokeruby

Estado
Cerrado para nuevas respuestas.

Kaktus

Miembro insignia
Miembro insignia
¡¡Hola buenas!!

Mientras investigaba sobre como crear un menú nuevo y personalizado por los frondosos códigos de pokeruby, me topé con esta grandiosa maravilla.

Hasta el momento, sólo he descubierto lo que hacen una pequeña parte de ellas, pero que sin duda, dan mucho juego.

He creado este post para empezar compartiendo mis conocimientos sobre ellos, ya que no es algo fácil de descubrir, y tras tirarme toda una tarde investigando, logré llegar a ciertas conclusiones respecto a dichas regiones, que creo que pueden dar un empujón a los demás a investigar sobre ellas y a digerirlas con mayor facilidad.

Así que, no me demoro más, empiezo a explicar como funciona cada una y a dejar ejemplos prácticos.

Regiones estudiadas hasta la fecha:
Código:
REG_WININ = 0x3F; //Solapa de color negro lo exterior al rectángulo generado (no recomiendo usarlo)
REG_WINOUT = 0xFF; //Hace que el rectángulo se genere tal y como lo indicamos
REG_WIN0H = 0; //Posiciones respectivas (Horizontal) Se suele usar con un WIN_RANGE
REG_WIN0V = 0; //Posiciones respectivas (Vertical) Se suele usar con un WIN_RANGE
REG_BLDCNT = 0xFE; // Determina si el color del rectángulo es blanco o negro, y que capas solapa.
REG_BLDY = 0xB; // Indica cuanta opacidad tiene el rectángulo. (0x0 = invisible, 0xF = color sólido)
REG_BLDALPHA = 0; //Sin cambios aparentes
Bien, tras soltar aquí todos estos comandos sin explicar a que están enfocados y tras quizás, confundiros bastante, paso a explicar qué hace cada uno.

Para empezar, estos comandos son capaces de crear rectángulos con opacidad (o sin ella si así se desea) tanto de color negro como de color blanco, además, podemos elegir que BG's queremos que solape y que BG's queremos que no solape. Para que me entendáis mejor, con un poco de ingenio se pueden hacer cosas como estas:





Es cuestión de echarle imaginación. Pero dejando esto de lado, vamos a lo que nos importa, que es entender como funciona esto.

Para empezar, tenemos "REG_WIN0V" y "REG_WIN0H", las que como bien he dicho antes, definen las respectivas posiciones del rectángulo/forma rectangular generada. Estas dos, pueden ser usadas como un valor entero, tal que así:

Código:
REG_WIN0H = 64;
REG_WIN0V = 24;
O mediante rangos, que es como yo lo voy a explicar ya que da infinidad de posibilidades, y al fin y al cabo es mucho más útil.

Se declararía algo así:

Código:
REG_WIN0H = WIN_RANGE(labelLeft, labelRight);
REG_WIN0V = WIN_RANGE(labelTop, labelBottom);
Como bien imagino y espero que sabréis, "labelLeft, labelRight, labelTop y labelBottom" son variables, que tendremos que definir y darles un valor con anterioridad. (Y para evitar confusiones, lo haremos todo en el orden que lo he hecho yo)

Por tanto, el código quedaría algo así:

Código:
u8 labelLeft;
u8 labelRight;
u8 labelTop;
u8 labelBottom;

labelLeft = 130; //Empuja un rectángulo a color desde left
labelRight = 110; //Empuja espacio vacío desde left
labelTop = 90; //Empuja un rectángulo desde top
labelBottom = 70; //Empuja espacio vacío desde top

REG_WIN0H = WIN_RANGE(labelLeft, labelRight);
REG_WIN0V = WIN_RANGE(labelTop, labelBottom);
Ahí veis que os he dejado unas anotaciones, en los respectivos label que explican más o menos que hace cada uno, aunque pueda parecer que son usados como coordenadas. Dependiendo de los demás comandos, se verá una cosa u otra, pero para que os hagáis una idea, esos valores, son los usados en la primera imagen de las anteriores.

Aquí os dejo el código tal cuál estaba por si a caso alguien quiere comprobarlo por si mismo, y vea el resto de los parámetros que esto requiere:

Código:
u8 labelLeft;
u8 labelRight;
u8 labelTop;
u8 labelBottom;

labelLeft = 130;
labelRight = 110;
labelTop = 90;
labelBottom = 70;

REG_WINOUT = 0xFF;
REG_BLDCNT = 0x8E;
REG_BLDY = 0x7;

REG_WIN0H = WIN_RANGE(labelLeft, labelRight);
REG_WIN0V = WIN_RANGE(labelTop, labelBottom);

He de decir, que podríamos invertir la forma rectangular creada, cambiando:

Código:
REG_WINOUT = 0xFF;
Por:

Código:
REG_WININ = 0x3F;
REG_WINOUT = 0x1F;
Esa es la forma que he encontrado de invertirlo sin que de problemas, pero no recomiendo cambiar mucho los parámetros cuando usemos "REG_WININ y REG_WINOUT" a la vez, ya que suele dar muchos problemas. Yo recomiendo usar tan sólo "REG_WININ = 0xFF" o en caso de querer invertir como bien he dicho, usar esto de aquí arriba.

Ahora, una de mis funciones favoritas, el "REG_BLDCNT", esta sin duda es la que más tiempo me ha llevado investigar, ya que he tenido que investigar sus bytes uno a uno para comprobar que hacían, así que os dejo por aquí la tabla:

Código:
REG_BLDCNT:

//BLANCOS (0x80 a 0xBF) (Rectángulos de color blanco)

	0x80: Queda bajo todas las capas (Queda invisible)
	0x81: Queda bajo todas las capas (Queda invisible)
	0x82: Se funde SOLO con el BG1
	0x83: Se funde SOLO con el BG1
	0x84: Se funde SOLO con el BG2
	0x85: Se funde SOLO con el BG2
	0x86: Se funde SOLO con el BG2 y el BG1
	0x87: Se funde SOLO con el BG2 y el BG1
	0x88: Se funde con el BG3
	0x89: Se funde con el BG3
	0x8A: Se funde con el BG2 y BG3
	0x8B: Se funde con el BG2 y BG3
	0x8C: Se funde con el BG1, BG2 y BG3
	0x8D: Se funde con el BG1, BG2 y BG3
	0x8E: Se funde con el BG0, BG1, BG2, BG3 y queda bajo los sprites
	0x8F: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0x90: Se funde con el BG0 y los sprites
	0x91: Se funde con el BG0 y los sprites
	0x92: Se funde con el BG0, BG1 y los sprites
	0x93: Se funde con el BG0, BG1 y los sprites
	0x94: Se funde con el BG2 y los sprites
	0x95: Se funde con el BG2 y los sprites
	0x96: Se funde con el BG1, BG2 y los sprites
	0x97: Se funde con el BG1, BG2 y los sprites
	0x98: Se funde con el BG3 y los sprites
	0x99: Se funde con el BG3 y los sprites
	0x9A: Se funde con el BG1, BG3 y los sprites
	0x9B: Se funde con el BG1, BG3 y los sprites
	0x9C: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0x9D: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0x9E: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0x9F: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xA0: Queda bajo todas las capas (Queda invisible)
	0xA1: Queda bajo todas las capas (Queda invisible)
	0xA2: Se funde SOLO con el BG1
	0xA3: Se funde SOLO con el BG1
	0xA4: Se funde SOLO con el BG2
	0xA5: Se funde SOLO con el BG2
	0xA6: Se funde SOLO con el BG2 y el BG1
	0xA7: Se funde SOLO con el BG2 y el BG1
	0xA8: Se funde con el BG3
	0xA9: Se funde con el BG3
	0xAA: Se funde con el BG2 y BG3
	0xAB: Se funde con el BG2 y BG3
	0xAC: Se funde con el BG1, BG2 y BG3
	0xAD: Se funde con el BG1, BG2 y BG3
	0xAE: Se funde con el BG0, BG1, BG2, BG3 y queda bajo los sprites
	0xAF: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xB0: Se funde con el BG0 y los sprites
	0xB1: Se funde con el BG0 y los sprites
	0xB2: Se funde con el BG0, BG1 y los sprites
	0xB3: Se funde con el BG0, BG1 y los sprites
	0xB4: Se funde con el BG2 y los sprites
	0xB5: Se funde con el BG2 y los sprites
	0xB6: Se funde con el BG1, BG2 y los sprites
	0xB7: Se funde con el BG1, BG2 y los sprites
	0xB8: Se funde con el BG3 y los sprites
	0xB9: Se funde con el BG3 y los sprites
	0xBA: Se funde con el BG1, BG3 y los sprites
	0xBB: Se funde con el BG1, BG3 y los sprites
	0xBC: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0xBD: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0xBE: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xBF: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	

//NEGROS (0xC0 a 0xFF) (A partir de aquí, los rectángulos son de color negro)
	
	0xC0: Queda bajo todas las capas (Queda invisible)
	0xC1: Queda bajo todas las capas (Queda invisible)
	0xC2: Se funde SOLO con el BG1
	0xC3: Se funde SOLO con el BG1
	0xC4: Se funde SOLO con el BG2
	0xC5: Se funde SOLO con el BG2
	0xC6: Se funde SOLO con el BG2 y el BG1
	0xC7: Se funde SOLO con el BG2 y el BG1
	0xC8: Se funde con el BG3
	0xC9: Se funde con el BG3
	0xCA: Se funde con el BG2 y BG3
	0xCB: Se funde con el BG2 y BG3
	0xCC: Se funde con el BG1, BG2 y BG3
	0xCD: Se funde con el BG1, BG2 y BG3
	0xCE: Se funde con el BG0, BG1, BG2, BG3 y queda bajo los sprites
	0xCF: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xD0: Se funde con el BG0 y los sprites
	0xD1: Se funde con el BG0 y los sprites
	0xD2: Se funde con el BG0, BG1 y los sprites
	0xD3: Se funde con el BG0, BG1 y los sprites
	0xD4: Se funde con el BG2 y los sprites
	0xD5: Se funde con el BG2 y los sprites
	0xD6: Se funde con el BG1, BG2 y los sprites
	0xD7: Se funde con el BG1, BG2 y los sprites
	0xD8: Se funde con el BG3 y los sprites
	0xD9: Se funde con el BG3 y los sprites
	0xDA: Se funde con el BG1, BG3 y los sprites
	0xDB: Se funde con el BG1, BG3 y los sprites
	0xDC: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0xDD: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0xDE: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xDF: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xE0: Queda bajo todas las capas (Queda invisible)
	0xE1: Queda bajo todas las capas (Queda invisible)
	0xE2: Se funde SOLO con el BG1
	0xE3: Se funde SOLO con el BG1
	0xE4: Se funde SOLO con el BG2
	0xE5: Se funde SOLO con el BG2
	0xE6: Se funde SOLO con el BG2 y el BG1
	0xE7: Se funde SOLO con el BG2 y el BG1
	0xE8: Se funde con el BG3
	0xE9: Se funde con el BG3
	0xEA: Se funde con el BG2 y BG3
	0xEB: Se funde con el BG2 y BG3
	0xEC: Se funde con el BG1, BG2 y BG3
	0xED: Se funde con el BG1, BG2 y BG3
	0xEE: Se funde con el BG0, BG1, BG2, BG3 y queda bajo los sprites
	0xEF: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xF0: Se funde con el BG0 y los sprites
	0xF1: Se funde con el BG0 y los sprites
	0xF2: Se funde con el BG0, BG1 y los sprites
	0xF3: Se funde con el BG0, BG1 y los sprites
	0xF4: Se funde con el BG2 y los sprites
	0xF5: Se funde con el BG2 y los sprites
	0xF6: Se funde con el BG1, BG2 y los sprites
	0xF7: Se funde con el BG1, BG2 y los sprites
	0xF8: Se funde con el BG3 y los sprites
	0xF9: Se funde con el BG3 y los sprites
	0xFA: Se funde con el BG1, BG3 y los sprites
	0xFB: Se funde con el BG1, BG3 y los sprites
	0xFC: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0xFD: Se funde con el BG2, BG3 y los sprites (Parecido a la niebla)
	0xFE: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites
	0xFF: Se funde con el BG0, BG1, BG2, BG3 y queda sobre los sprites

Por si no entendéis muy bien lo de los BG's, básicamente, son las diferentes capas en las que se encuentran los tiles, siendo por ejemplo los tiles de pasto que se encuentran en el BG2 y BG3, o los tiles de la copa de un arbol, en la que nostros quedamos bajo de ella, que se encuentra en el BG1. Podéis comprobarlo vosotros mismos con VBA > Tools > Map Viewer...

Sin duda, un comando muy útil, ahora, pasamos con los dos últimos, pero no por ello menos importantes:

Código:
REG_BLDY = 0xB;
REG_BLDALPHA = 0;
Con "REG_BLDY" controlaremos la opacidad que tendrá nuestro rectángulo, siendo así 0x0 un rectángulo invisible, y 0xF un color totalmente sólido y sin transparencias.

Por último, REG_BLDALPHA, que significa "Alpha Blending", no sé muy bien como usarlo, si alguien quiere investigarlo, aquí tiene algo de información al respecto

Si vosotros también queréis investigar regiones pero no sabéis por donde empezar, es tan fácil como ir a nuestro querido mintty.exe, conocido por otros como cygwin, y escribiremos en el directorio de pokeruby

Código:
git grep "REG_"
Así, nos devolverá todo aquello que haya escrito en cualquier archivo de pokeruby que contenga los carácteres "REG_"

¡Eso es todo, espero ver que os animáis con esto! :)

Si por casualidad se os ocurren descripciones mejores para "REG_WININ" y "REG_WINOUT" (entendiendo lo que hacen) y la queréis compartir, serán bien recibidas, pero llevo un rato pensando y no se me ocurre nada mejor.

INVESTIGADORES

@InmortalKaktus: REG_WININ, REG_WINOUT, REG_WIN0H, REG_WIN0V, REG_BLDCNT, REG_BLDY
@L!no the Maelstrom : REG_BLDALPHA
 
Última edición:

L!no

GBA Developer
Re: Investigación sobre los registros de pokeruby

Primero, lo que tu llamas "registros" no son registros, son regiones.
los registros son estos:
Código:
#include "global.h"

int main(void) {
	r0 = 1; //registro 0
	r1 = 1; //registro 1
	r2 = 1; //registro 2
	r3 = 1; //registro 3
	r4 = 1; //registro 4
	r5 = 1; //registro 5
}

Segundo, REG_BLDALPHA es la region que controla el alpha blending

Tercero, es una investigacion muy interesante, ahora mismo voy a meterle mano
 
Última edición:

Dragonite

But where's your heart
Me sirvió, un parche para traducir pokeruby había hecho un desmadre con el menú de opciones y no lograba dar con los parámetros que modificaban el ancho de las sombras.

Se agradece, 10/10.
 
Estado
Cerrado para nuevas respuestas.
Arriba