Tomb Raider 1 en GNU/Linux – Destripando el juego Vol.2

Los archivos PHD en el juego Tomb Raider I son archivos que contienen los diferentes niveles así como información relativa a esos niveles.

El LEVEL1 de “Tomb Raider I” ocupa 2 Megas y algo. Y eso contiene un montonazo de texturas tal y como veremos dentro de un rato.

Antes de meternos “al turrón” es bueno nombrar que puedes bajarte los PHD originales desde aquí (estarán en el directorio DATA).

Existe una web en la que puedes cargar los archivos PHD de los niveles y jugarlo:

http://xproger.info/projects/OpenLara/

Y eso está muy bien. Pero no nos dice mucho sobre este tipo de archivos salvo que contienen el mapa, texturas y lo necesario para jugar el nivel con un engine adecuado.

 

Trabajando con el archivo LEVEL1.PHD

Para ir analizando que contenido tienen estos archivos es bueno saber en que posición se guarda la información.

Para ello voy a usar el archivo LEVEL1.PHD del Tomb Raider I .

Comenzamos !

 

Comprobar la versión (4 bytes)

Los primeros 4 bytes son para almacenar la versión.

Utilizando el comando dd vamos a poder visualizar desde el byte 0 hasta el 4. Así por ejemplo

$ dd skip=0 count=4 bs=1 status=none iflag=skip_bytes,count_bytes if=LEVEL1.PHD | hd | head -1

El resultado en Hexadecimal será: 20 00 00 00

Lo cual nos indica que la versión es 32 en decimal. En caso es que esto tampoco nos dice demasiado ya que lo mismo esos valores son interpretados y ofrecen otro número de versión.
Nos es de utilidad conocerlo no obstante para saber que los primeros 4 bytes son para la versión.

 

Comprobar el número de Tiles de texturas

Los siguiente 4 bytes son para almacenar el número de “TextTiles”. El número de tiles de texturas que contiene el LEVEL1.PHD.

Tiles son agrupaciones de texturas. Una traducción de tiles al castellano es “azulejos”. Nos quedamos con que tenemos grupos de texturas.

Ejemplo del primer tile que vamos a extraer:

Ejemplo del segundo tile que vamos a extraer:

¿Cuantos tiles tiene el LEVEL1.PHD? 11.

Y se que tiene 11 ya que los siguientes 4 bytes son para indicar eso. Con el comando dd lo podemos ver así:

$ dd skip=4 count=4 bs=1 status=none iflag=skip_bytes,count_bytes if=LEVEL1.PHD | hd | head -1

El valor resultante es 0B con lo que convertido de HEX a DEC tenemos 11.

Hemos de fijarnos que he puesto skip=4 y count=4. De esa forma saltamos los primeros 4 bytes del archivo (los referentes a versión) y obtenemos los 4 siguientes.

 

Extraer los tiles de texturas

Ciertamente esos grupos de texturas aunque están en el archivo no sabemos muy bien en que sitio ni posición. Bueno si lo sabemos.

Es lo que vamos a comentar ahora. Relájate un poco amigo/a/e que te noto en tensión.

Cada tile tendrá un máximo de 65536 bytes (son tiles de texturas con paletas de color de 8-bits).

Por tanto las posiciones si sabemos que existen 11 son las siguientes:

0-4 – La versión.
4-8 – Número de tiles.
8-65536 El primer tile

Sabemos que el primer tile ocupará 65536 bytes pero que comienza saltando 8 bytes iniciales.

El comando por tanto para extraerlo con dd es:

$ dd skip=8 count=65536 bs=1 status=none iflag=skip_bytes,count_bytes if=LEVEL1.PHD > /tmp/tile1-level1

Para sacar el contenido del tile 2:

$ dd skip=65544 count=65536 bs=1 status=none iflag=skip_bytes,count_bytes if=LEVEL1.PHD > /home/fanta/tile2-level1

Si nos fijamos count siempre será para extraer esto de 65536 pero skip (los bytes que saltamos para comenzar en esa posición) ya no es 8. Ahora skip es de (8+65536).

Para el tile3, tile4, … tile11 iremos variando skip y sumando 65536 cada vez. De esa forma deslizamos la ventana.

Y como no vamos a estar todo el rato pensando para eso vamos a crearnos un script que en base a un PHD dado saque el número de tiles y las extraiga numeradas. Un script en bash.

Vamos a ello !.

Script en bash para extraer las tiles de texturas de un PHD

#!/bin/bash

phdFile=$1
nTexTilesHex=$(dd skip=4 count=4 bs=1 status=none iflag=skip_bytes,count_bytes if=$phdFile | xxd -ps -l 1)
nTexTilesDec=$(echo $(( 16#$nTexTilesHex )))
echo "$nTexTilesDec Tiles de texturas en $phdFile"
skipBytes=8
echo "---"
for i in `seq 1 $nTexTilesDec`;
do
        echo "Sacando Tile $i /tmp/$phdFile.tile$i"
        dd skip=$skipBytes count=65536 bs=1 status=none iflag=skip_bytes,count_bytes if=$phdFile > /tmp/$phdFile.tile$i
        skipBytes=$(expr $skipBytes + 65536)
        echo "$skipBytes"
done

Y si quisiéramos hacer esto mismo pero con una herramienta gráfica pues esa es TBuilder 2.3.

Descargar Tbuilder desde aquí: TBuilder.v23.zip

Con wine se puede ejecutar esta herramienta e indicarle un PHD para que extraiga los tiles de texturas. Puedes luego convertirlo a otros formatos como por ejemplo BMP.

Y aunque al final la gente termina por usar esas herramientas (terminamos haciendo eso todo cristo) es bueno saber como funcionan. Sabiendo como funcionan podemos crear otras para línea de comandos, para otros sistemas operativos, etc…

Saludos cordiales.

próximo Publicación

Atrás Publicación

1 Comentario

  1. fanta 14 diciembre, 2018 — Autor de artículo

    Y olvidé añadir que lo que extraermos con el script en bash se puede convertir a png por ejemplo.

    convert -depth 8 -size 256×256+0 gray:LEVEL1.PHD.tile1 out.png

    Por ejemplo así en blanco y negro.

Dejar una contestacion

© 2019 [ MIERDA TV ]

Tema de Anders Norén