Mikelan98
WaH used to be a bigger place...
Abro este tema (no sé si hay algún tema abierto sobre esto hace años) porque, después de todo este tiempo, estoy consiguiendo resultados fructíferos sobre las investigaciones en estos archivos. Recordemos que los BDHCs eran aquellos archivos que permitían la movilidad del personaje a través del eje Z (es decir, subir escaleras, bajar un poco al entrar a un lago, elevarse al subir una montaña...).
Antes que nada, el archivo está dividido en 6 partes. Después de la firma del archivo (los primeros 4 bytes, es decir, la word BDHC) vienen seis halfwords (es decir, pares de bytes) con valores, del 00 00 al FF FF. Estos número indican la longitud de las 6 partes, a las que llamaremos P, Q, R, S, T, U.
La longitud de cada sección está determinada de la siguiente manera (en bytes)
1) - P * 8
2) - Q * 12
3) - R * 4
4) - S * 8
5) - T * 8
6) - U * 2
Es decir, podemos determinar que en la parte P, los elementos miden 8 bytes cada uno, mientras que en la Q miden 12 o en la R miden 4.
Aclarado esto, vamos con las investigaciones sobre cada parte:
Parte P
Establece las coordenadas de determinados puntos, con los que se construirán rectángulos o "placas" de diferentes alturas en la Parte S. La estructura de cada elemento es la siguiente:
00 00 XX XX 00 00 YY YY
Siendo XX XX las coordenadas en el eje X e YY YY las del eje YY. Hay que tener en cuenta que el origen de coordenadas está situado en el punto medio del mapa, no en una esquina. Esto significa que la esquina inferior derecha usará números positivos siempre, pero la esquina superior izquierda por el contrario deberá usar números negativos.
Refrescando un poco la memoria en hex, recordemos el llamado "complemento a 2": 0x0000-0x0001=0xFFFF / 0xFFFF+0x0001=0x0000. Es decir, que -1 es equivalente a FF FF, -2 a FE FF, y así sucesivamente (recordad que es little endian).
De este modo, el punto de la esquina superior izquierda sería:
00 00 F0 FF 00 00 F0 FF
Y el de la esquina inferior derecha:
00 00 10 00 00 00 10 00
Parte Q
Establece diferentes inclinaciones, para que puedan ser usadas más tarde por los rectángulos o "placas" que componen las diferentes alturas. Están determinadas por 3 variables (me imagino que será porque establece la inclinación en función del eje X, Y y Z). Os escribo a continuación las inclinaciones más usuales, si queréis conseguir otras inclinaciones, tendréis que experimientar:
Plano: 00 00 00 00 00 10 00 00 00 00 00 00
Escaleras hacia arriba: 00 00 00 00 50 0B 00 00 50 0B 00 00
Escaleras hacia la derecha: B0 F4 FF FF 50 0B 00 00 00 00 00 00
Escaleras hacia la izquierda: 50 0B 00 00 50 0B 00 00 00 00 00 00
En este archivo habrá que escribir todas las inclinaciones que se vayan a usar luego para las placas, no lo olvidéis.
Parte R
Establece las diferentes alturas que puede tener el personaje en los distintos rectángulos o "placas" de altura. La estructura de los elementos de esta parte es:
MM MM ZZ ZZ
ZZ ZZ se refiere a la altura en tiles totales, es decir; si el personaje por ejemplo está a una altura neutra, entonces ZZ ZZ = 00 00. Si subiésemos una escalera y ahora nos encontráramos en una altura +1, sería ZZ ZZ = FF FF (a mayor altitud, en vez de crecer, decrece). Si estuviesemos a una altura +5, sería FB FF. Y si por ejemplo estuviésemos a -2; 02 00.
MM MM mide, en vez de tiles completos, 65536-écimas de tile. Para no hablar raro ni complicar la cosa; MM MM = 00 80 si el personaje se encuentra en un lago (sería la mitad de un tile hacia abajo, o sea, -0.5 de altura) y MM MM = 00 00 si el personaje se encuentra en cualquier otro lugar.
Así, por ejemplo, si tenemos:
00 80 FF FF
significaría:
FF FF = Altura +1
00 80 = Altura -0.5
Altura total = +0.5
Para las placas inclinadas:
He creado unas formulitas, por inducción matemática, que se corresponden bien a la altura que deben tener las placas a las que vayamos a asignarle inclinación. Sólo he sacado las correspondientes a las escaleras hacia arriba, hacia la derecha y hacia la izquierda, pero me imagino que serán más que suficientes para vosotros:
Escaleras hacia arriba: f (y,h) = 0xB505 * (-y-h)
Escaleras hacia la derecha: f (x,h) = 0xB505 * (x-h+1)
Escaleras hacia la izquierda: f (x,h) = 0xB505 * (-x-h)
Donde:
La variable x es la posición de las escaleras en el eje X (el origen de coordenadas, el (0,0), sigue estando en el tile (17, 17) del mapa). Si la escalera tiene más de un tile de longitud, se toman las coordenadas del tile de la escalera que más bajo en el eje Z esté (o lo que es lo mismo, el tile por donde el personaje accede a ella).
La variable y es la posición de las escaleras en el eje Y (el origen de coordenadas lo mismo que antes).
La variable h es la altura a la que el personaje accede después de haber subido un tile de esa escalera (o lo que es lo mismo, la altura que tiene el personaje de la base de la escalera más 1).
Un ejemplo sencillito:
Tenemos una escalera hacia arriba, de 2x4 y que hace que el personaje vaya desde +1 a +5 en el eje Z, de las coordenadas (17,7) (esquina superior izquierda) a (18,10) (esquina inferior derecha). Pasando esas coordenadas a las que usan los bdhc: (0,-10) y (1,-7).
Ahora aplicamos la fórmula cogiendo como referencia en el eje Y el tile más bajo en el eje Z de la escalera, es decir, Y= -7 (tendréis que haceros una imagen mental de la escalera en vuestra cabeza). Usando la fórmula y sabiendo que y= -7 y que h=2 (la base de la escalera más 1):
f (-7, 2) = 0xB505 * (-(-7)-(2)) = 0xB505 * 5 = 0x00038919
Ordenándolo en little endian: 19 89 03 00
Es decir, que este debe ser el elemento, en la Parte R, que asigne la altura de dicha escalera.
Parte S
Enlaza los puntos de la Parte P para crear las "placas", y les asigna una altura de un elemento de la Parte R.
AA 00 BB 00 QQ 00 RR 00
AA sería el número (en hex) del elemento de la Parte P donde se encuentra el punto del rectángulo ubicado en la esquina superior izquierda.
BB sería el número (en hex) del elemento de la Parte P donde se encuentra el punto del rectángulo ubicado en la esquina inferior derecha.
QQ sería el número (en hex) del elemento de la Parte Q que establece la inclinación de dicha placa.
RR sería el número (en hex) del elemento de la Parte R que establece la altura de dicha placa.
Si en la Parte P, por ejemplo, tenemos esto:
00 00 F0 FF 00 00 F0 FF
00 00 10 00 00 00 10 00
Y en la parte R tenemos esto:
00 00 FE 00
00 00 01 00
En la parte S tenemos que escribir:
00 00 01 00 00 00 00 00
para que se nos cree una placa o rectángulo que abarque desde (-16, -16) hasta (16, 16) (es decir, todo el mapa) y establezca una altura en el eje Z de +2. Si por el contrario fuera:
00 00 01 00 00 00 01 00
Lo que se establecería sería, como antes un rectángulo que abarca todo el mapa, pero que establece una altura -1.
Parte T
Divide el mapa en franjas horizontales. Hay que dividirlo todo de forma que, si nos movemos en vertical (hacia arriba o hacia abajo) y con ello entramos/salimos de un lago, escalera o similares, tenemos también que estar entrando en una nueva franja. Es difícil de explicar, pero para que nos entendamos; el juego no puede detectar cuando entras o sales de una zona con altura diferente cuando te mueves verticalmente en una misma franja (horizontalmente no hay problema) por lo que hay que crear una nueva franja distinta. Como sé que es difícil de entenderlo, ahí va un dibujito:
Existe un elemento por cada franja que haya. La estructura de cada elemento de la Parte T es la siguiente:
00 00 YY YY NN NN UU UU
Donde YY YY es la línea del eje Y donde se situa el límite inferior de la franja. NN es el número de elementos de la Parte U que se cogen, y estos se empiezan a contar a partir del elemento número UU UU. No os preocupéis, que lo explico ahora más adelante.
Por ejemplo, un mapa donde existiesen dos franjas, una en la mitad superior y otra en la mitad inferior, sería:
00 00 00 00 NN NN UU UU
00 00 10 00 NN NN UU UU
Parte U
Constituye una serie de "lista" o enumeración de placas/rectángulos colindantes a la franja con la que está enlazado en la Parte T. Es decir, si estoy en la franja 00, la Parte T carga una serie de elementos de la Parte U donde están numeradas todas las placas en las que el jugador está o puede acceder, en dicha placa.
La estructura de los elementos de la Parte U es la siguiente:
SS 00
donde SS corresponde al número de placa de la Parte S. La Parte U está formada por muchísimos elementos de estos, y suelen estar divididos por zonas de modo que en la Parte T se carga el número de elementos que se van a tener en cuenta en esta parte para la franja en la que nos encontremos (NN NN) y el número por el que empezamos a contar (UU UU).
Por ejemplo, en la Parte U tenemos:
00 00
01 00
02 00
04 00
00 00
03 00
04 00
Y en la parte T tenemos:
00 00 YY YY 04 00 00 00
00 00 YY YY 03 00 04 00
Entonces, desde la primera franja, accedemos o podemos acceder a las placas 00, 01, 02 y 04, mientras que desde la segunda franja podemos acceder a las placas 00, 03 y 04. Ojo, recordad que son placas colindantes, es decir, las placas que pertenezcan a la franja y las que estén tocando sus límites aunque no pertenezcan a ella (es decir, aquellas placas cuya altura tiene que cargar el juego mientras se está en dicha franja).
Sé que todo esto es muy lioso, pero es lo que hay, estos archivos Game Freak los hizo así de complicados xD
Antes que nada, el archivo está dividido en 6 partes. Después de la firma del archivo (los primeros 4 bytes, es decir, la word BDHC) vienen seis halfwords (es decir, pares de bytes) con valores, del 00 00 al FF FF. Estos número indican la longitud de las 6 partes, a las que llamaremos P, Q, R, S, T, U.
La longitud de cada sección está determinada de la siguiente manera (en bytes)
1) - P * 8
2) - Q * 12
3) - R * 4
4) - S * 8
5) - T * 8
6) - U * 2
Es decir, podemos determinar que en la parte P, los elementos miden 8 bytes cada uno, mientras que en la Q miden 12 o en la R miden 4.
Aclarado esto, vamos con las investigaciones sobre cada parte:
Parte P
Establece las coordenadas de determinados puntos, con los que se construirán rectángulos o "placas" de diferentes alturas en la Parte S. La estructura de cada elemento es la siguiente:
00 00 XX XX 00 00 YY YY
Siendo XX XX las coordenadas en el eje X e YY YY las del eje YY. Hay que tener en cuenta que el origen de coordenadas está situado en el punto medio del mapa, no en una esquina. Esto significa que la esquina inferior derecha usará números positivos siempre, pero la esquina superior izquierda por el contrario deberá usar números negativos.
Refrescando un poco la memoria en hex, recordemos el llamado "complemento a 2": 0x0000-0x0001=0xFFFF / 0xFFFF+0x0001=0x0000. Es decir, que -1 es equivalente a FF FF, -2 a FE FF, y así sucesivamente (recordad que es little endian).
De este modo, el punto de la esquina superior izquierda sería:
00 00 F0 FF 00 00 F0 FF
Y el de la esquina inferior derecha:
00 00 10 00 00 00 10 00
Parte Q
Establece diferentes inclinaciones, para que puedan ser usadas más tarde por los rectángulos o "placas" que componen las diferentes alturas. Están determinadas por 3 variables (me imagino que será porque establece la inclinación en función del eje X, Y y Z). Os escribo a continuación las inclinaciones más usuales, si queréis conseguir otras inclinaciones, tendréis que experimientar:
Plano: 00 00 00 00 00 10 00 00 00 00 00 00
Escaleras hacia arriba: 00 00 00 00 50 0B 00 00 50 0B 00 00
Escaleras hacia la derecha: B0 F4 FF FF 50 0B 00 00 00 00 00 00
Escaleras hacia la izquierda: 50 0B 00 00 50 0B 00 00 00 00 00 00
En este archivo habrá que escribir todas las inclinaciones que se vayan a usar luego para las placas, no lo olvidéis.
Parte R
Establece las diferentes alturas que puede tener el personaje en los distintos rectángulos o "placas" de altura. La estructura de los elementos de esta parte es:
MM MM ZZ ZZ
ZZ ZZ se refiere a la altura en tiles totales, es decir; si el personaje por ejemplo está a una altura neutra, entonces ZZ ZZ = 00 00. Si subiésemos una escalera y ahora nos encontráramos en una altura +1, sería ZZ ZZ = FF FF (a mayor altitud, en vez de crecer, decrece). Si estuviesemos a una altura +5, sería FB FF. Y si por ejemplo estuviésemos a -2; 02 00.
MM MM mide, en vez de tiles completos, 65536-écimas de tile. Para no hablar raro ni complicar la cosa; MM MM = 00 80 si el personaje se encuentra en un lago (sería la mitad de un tile hacia abajo, o sea, -0.5 de altura) y MM MM = 00 00 si el personaje se encuentra en cualquier otro lugar.
Así, por ejemplo, si tenemos:
00 80 FF FF
significaría:
FF FF = Altura +1
00 80 = Altura -0.5
Altura total = +0.5
Para las placas inclinadas:
He creado unas formulitas, por inducción matemática, que se corresponden bien a la altura que deben tener las placas a las que vayamos a asignarle inclinación. Sólo he sacado las correspondientes a las escaleras hacia arriba, hacia la derecha y hacia la izquierda, pero me imagino que serán más que suficientes para vosotros:
Escaleras hacia arriba: f (y,h) = 0xB505 * (-y-h)
Escaleras hacia la derecha: f (x,h) = 0xB505 * (x-h+1)
Escaleras hacia la izquierda: f (x,h) = 0xB505 * (-x-h)
Donde:
La variable x es la posición de las escaleras en el eje X (el origen de coordenadas, el (0,0), sigue estando en el tile (17, 17) del mapa). Si la escalera tiene más de un tile de longitud, se toman las coordenadas del tile de la escalera que más bajo en el eje Z esté (o lo que es lo mismo, el tile por donde el personaje accede a ella).
La variable y es la posición de las escaleras en el eje Y (el origen de coordenadas lo mismo que antes).
La variable h es la altura a la que el personaje accede después de haber subido un tile de esa escalera (o lo que es lo mismo, la altura que tiene el personaje de la base de la escalera más 1).
Un ejemplo sencillito:
Tenemos una escalera hacia arriba, de 2x4 y que hace que el personaje vaya desde +1 a +5 en el eje Z, de las coordenadas (17,7) (esquina superior izquierda) a (18,10) (esquina inferior derecha). Pasando esas coordenadas a las que usan los bdhc: (0,-10) y (1,-7).
Ahora aplicamos la fórmula cogiendo como referencia en el eje Y el tile más bajo en el eje Z de la escalera, es decir, Y= -7 (tendréis que haceros una imagen mental de la escalera en vuestra cabeza). Usando la fórmula y sabiendo que y= -7 y que h=2 (la base de la escalera más 1):
f (-7, 2) = 0xB505 * (-(-7)-(2)) = 0xB505 * 5 = 0x00038919
Ordenándolo en little endian: 19 89 03 00
Es decir, que este debe ser el elemento, en la Parte R, que asigne la altura de dicha escalera.
Parte S
Enlaza los puntos de la Parte P para crear las "placas", y les asigna una altura de un elemento de la Parte R.
AA 00 BB 00 QQ 00 RR 00
AA sería el número (en hex) del elemento de la Parte P donde se encuentra el punto del rectángulo ubicado en la esquina superior izquierda.
BB sería el número (en hex) del elemento de la Parte P donde se encuentra el punto del rectángulo ubicado en la esquina inferior derecha.
QQ sería el número (en hex) del elemento de la Parte Q que establece la inclinación de dicha placa.
RR sería el número (en hex) del elemento de la Parte R que establece la altura de dicha placa.
Si en la Parte P, por ejemplo, tenemos esto:
00 00 F0 FF 00 00 F0 FF
00 00 10 00 00 00 10 00
Y en la parte R tenemos esto:
00 00 FE 00
00 00 01 00
En la parte S tenemos que escribir:
00 00 01 00 00 00 00 00
para que se nos cree una placa o rectángulo que abarque desde (-16, -16) hasta (16, 16) (es decir, todo el mapa) y establezca una altura en el eje Z de +2. Si por el contrario fuera:
00 00 01 00 00 00 01 00
Lo que se establecería sería, como antes un rectángulo que abarca todo el mapa, pero que establece una altura -1.
Parte T
Divide el mapa en franjas horizontales. Hay que dividirlo todo de forma que, si nos movemos en vertical (hacia arriba o hacia abajo) y con ello entramos/salimos de un lago, escalera o similares, tenemos también que estar entrando en una nueva franja. Es difícil de explicar, pero para que nos entendamos; el juego no puede detectar cuando entras o sales de una zona con altura diferente cuando te mueves verticalmente en una misma franja (horizontalmente no hay problema) por lo que hay que crear una nueva franja distinta. Como sé que es difícil de entenderlo, ahí va un dibujito:
Existe un elemento por cada franja que haya. La estructura de cada elemento de la Parte T es la siguiente:
00 00 YY YY NN NN UU UU
Donde YY YY es la línea del eje Y donde se situa el límite inferior de la franja. NN es el número de elementos de la Parte U que se cogen, y estos se empiezan a contar a partir del elemento número UU UU. No os preocupéis, que lo explico ahora más adelante.
Por ejemplo, un mapa donde existiesen dos franjas, una en la mitad superior y otra en la mitad inferior, sería:
00 00 00 00 NN NN UU UU
00 00 10 00 NN NN UU UU
Parte U
Constituye una serie de "lista" o enumeración de placas/rectángulos colindantes a la franja con la que está enlazado en la Parte T. Es decir, si estoy en la franja 00, la Parte T carga una serie de elementos de la Parte U donde están numeradas todas las placas en las que el jugador está o puede acceder, en dicha placa.
La estructura de los elementos de la Parte U es la siguiente:
SS 00
donde SS corresponde al número de placa de la Parte S. La Parte U está formada por muchísimos elementos de estos, y suelen estar divididos por zonas de modo que en la Parte T se carga el número de elementos que se van a tener en cuenta en esta parte para la franja en la que nos encontremos (NN NN) y el número por el que empezamos a contar (UU UU).
Por ejemplo, en la Parte U tenemos:
00 00
01 00
02 00
04 00
00 00
03 00
04 00
Y en la parte T tenemos:
00 00 YY YY 04 00 00 00
00 00 YY YY 03 00 04 00
Entonces, desde la primera franja, accedemos o podemos acceder a las placas 00, 01, 02 y 04, mientras que desde la segunda franja podemos acceder a las placas 00, 03 y 04. Ojo, recordad que son placas colindantes, es decir, las placas que pertenezcan a la franja y las que estén tocando sus límites aunque no pertenezcan a ella (es decir, aquellas placas cuya altura tiene que cargar el juego mientras se está en dicha franja).
Sé que todo esto es muy lioso, pero es lo que hay, estos archivos Game Freak los hizo así de complicados xD
Última edición: