Registrarse

GEN IV | [¡TERMINADA!] Los archivos de terreno (BDHC)

Estado
Cerrado para nuevas respuestas.

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
 
Última edición:

DeadApolo

A'KERIA'S TRACES
Respuesta: GEN IV | [En proceso] Los *** archivos de terreno (BDHC)

Qué interesante que abras una investigación respecto a éste tema, estaré expectante de cómo avance... Lamento el hecho de no poder aportar nada a la investigación pero ¿dar ánimos igual vale?.

Bueno, me interesa particularmente ver cómo avanzará todo ésto, la mejor de las suertes.

Un abrazo y saluda atentamente

ApoloD - DeadApolo actualmente.​
 

Mikelan98

WaH used to be a bigger place...
Respuesta: GEN IV | [En proceso] Los *** archivos de terreno (BDHC)

Me llena de orgullo y satisfacción poder deciros, después de taaaaaaaantos años, que acabo de descubrir una serie de cosas y la investigación ahora está casi terminada :'D

Esta tade actualizo el post principal. Llevaba más de 3 años investigando estos putos archivos, y de momento sé a la (casi) perfección cómo funcionan excepto por las escaleras. La altura de los lagos, por ejemplo, ya no es ningún misterio. Veré si puedo crear un archivo desde 0 esta tarde.
 

SteelWing21_RH

Pájaro de acero
Respuesta: GEN IV | [¡CASI TERMINADA!] Los archivos de terreno (BDHC)

Baia baia, los famosos archivos de terreno...

Como no, Mikelan ayudando al progreso del NDS hacking.
A ver si estos tres años investigando dan sus frutos, estare esperando como cojines no eres miembro de honor

Suerte
 

KleinStudio

Un plato es un plato
Miembro del equipo
Webmaster
Respuesta: GEN IV | [¡CASI TERMINADA!] Los archivos de terreno (BDHC)

Llevo mucho tiempo viéndote comerte la cabeza con los archivos estos de terreno y no sabes lo que me alegro de ver que al fin los empiezas a entender.
Es algo mucho más importante de lo que parece porque una de las cosas "guays" de los juegos de DS de Pokémon es el hecho de tener diferentes alturas en los mapas y sobretodo notarlo al andar.
Estaría bien comprobar (cuando lo pruebes a fondo) si funciona también en las roms de la quinta generación, aunque supongo que debería.
 

Nitro T

Investigador de NDS
Respuesta: GEN IV | [¡CASI TERMINADA!] Los archivos de terreno (BDHC)

En la quinta generación no hay archivos de terreno, la altura va con bytes de permiso.
 

Mikelan98

WaH used to be a bigger place...
Respuesta: GEN IV | [¡CASI TERMINADA!] Los archivos de terreno (BDHC)

Creo que he conseguido resolver la Parte Q, que es la relativa a las escaleras, rampas y todo lo que tenga inclinación. Lo escribo en una horilla.

Y por cierto, si vais a copiar esta investigación en algún lado, no hace falta ni que diga que tendríais que darme los créditos. Todos los NDS hackers llevamos muchos años detrás de estos archivos, intentando saber cómo funcionan. Que lo copiés en otro foro sin mencionarme me dolería mucho, pero aún más me dolería que alguien se apropiara de la investigación y dijera que es suya.
 

Toni

Leyenda de WaH
Respuesta: GEN IV | [¡CASI TERMINADA!] Los archivos de terreno (BDHC)

Mikelan que curradón te estás metiendo. Me están dando ganas de ir a ds XD.
Te doy fuerza y apoyo para que sigas por este camino. Ánimos para el LP
 

Mikelan98

WaH used to be a bigger place...
Bueno, esto ya se ha acabado, la investigación ya está terminada. Me gustaría que @Nitro_T me dijese si los bdhcs de Diamante y Perla también funcionan así, porque no lo recuerdo bien y me da pereza investigarlo yo.

Yo voy a ver si convenzo a mi padre para que me haga una herramienta sencillita que permita editar y crear bdhcs, que todo esto es muy lioso para vosotros, supongo.

Por cierto, quiero mis 999999 HackPoints por esta investigación :C (?)
 
La inclinación en la parte Q por las escaleras hacia abajo es:
00 00 00 00 50 0B 00 00 B0 F4 FF FF

Y la formula por la parte R de las mismas es f(y) = 0xB505* (y)

También para hacer escaleras hacia la izquierda en mi mapa, la formula de la parte R que pones no me funcionò. En vez, usè esta (es igual a la tuya, pero con un signo menos delante de x):

f (x,h) = 0xB505 * (-x-h)

Espero que esta información pueda ser útil. :)
 
Estado
Cerrado para nuevas respuestas.
Arriba