An UnDAAD’ed game o’hacker

Corría septiembre de 2014, cuando por razones que no vienen a cuento (y sobre todo porque no me acuerdo) contacté con un antiguo miembro del foro del CAAD, de nombre Morgul, y estuvimos hablando de unas cuantas cosas. Entre ellas surgió un tema, y es que aunque había ya un UnQuill y un UnPAWS, nadie había hecho aún un UnDAAD, y Morgul me confesó que eso no era del todo correcto.

Poco después me enviaba un fichero llamado undaad.c, que aunque entonces compilé y tuve algún problema, después otros intereses me llevaron a dejarlo abandonado en una carpeta de mi PC.

Morgul se había currado a pelo la decodificación de gran parte de las bases de datos de las aventuras de AD, y aunque la decodificación era incompleta, conseguía extraer la mayor parte de los datos de las tres primeras aventuras (Aventura Original, El Jabato y Cozumel). Sin embargo faltaba por descubrir algunas cosas, y el sistema daba problemas con las tres aventuras posteriores (Aventura Espacial, Los Templos Sagrados y Chichen Itza).

Y entonces se publicó el DAAD…

Al leer su documentación, observé que la información del manual era suficiente para aclarar algunos puntos que no estaban claros, y lo que es mejor, el propio compilador de DAAD podría servir para generar aventuras que después podrían pasarse por undaad con la ventaja de saber exactamente qué esperábamos encontrar en ellas.

Tras un par de días metiendo mano al código, haciendo pruebas con las seis aventuras de AD (sacando los ficheros DDB de las versiones para PC), y con una aventura de pruebas que yo mismo compilaba, puedo decir que, salvo bugs no detectados, tengo la primera versión de UnDAAD (el cual, porque yo no puedo tocar algo cuyo nombre empiece por “Un” y no cambiarle el lenguaje de programación, ahora es un script de php, en lugar de un programa en C).

Algunas curiosidades encontradas por el camino:

  • DAAD fue evolucionando según se hicieron aventuras de AD. La Aventura Original, El Jabato y La Diosa de Cozumel no soportan atributos extra de objetos (solo contenedor y prenda como en PAW), mientras que el resto sí que los soporta. Esto implica un cambio en la cabecera de los ficheros DDB para hacer hueco al vector que apunta a la tabla de dichos atributos.
  • De Cozumel en adelante, los vectores de 16 bits de la cabecera son big-endian, mientras que en la Original y Jabato son little-endian. No se si se debe a un cambio en las máquinas de desarrollo (¿quiza usaban Amiga o ST al principio y PC al final?), pero desde luego el interprete de cada aventura debe conocer eso, o como UnDAAD, detectarlo, para poder ejecutar el juego.
  • El DAAD actual llega hasta los 128 condactos, pero las primeras aventuras no tienen tantos. Es más los condactos COPYFF, COPYFO, COPYOF Y COPYOO fueron movidos de sitio (y de opcode) a partir de la Aventura Espacial, probablemente para situarlos junto al nuevo condacto COPYBF y los condactos internos que no se desvelan en el manual, pero que sospecho que tienen que ver con que este tipo de condactos en realidad son casi el mismo pero pasando distintos datos. Este cambio de posición, hace que haya que detectar bien de que tipo de tabla de condactos se trata, o la decodificación sería incorrecta.
  • No es posible añadir ni un solo condacto más a DAAD, porque ya tiene 128, es decir, usa 7 bits, y el octavo bit se usa para marcar que el primer parámetro del condacto es con indirección. DAAD permite indirección solo en el primer parámetro, de la misma manera que ya adiviné en su día que podría habersele añadido a PAW (ver http://foro.caad.es/viewtopic.php?f=18&t=5449&p=66251&#p66251)
  • En general, las tres primeras aventuras están hechas con un DAAD que a nivel lenguaje es muy PAW, salvo por la indirección. Las tres últimas incorporan los nuevos condactos y atributos de objeto, consiguiendo más potencia. Sin embargo no queda claro por qué el cambio a big-endian no coincide con el cambio de versión de DAAD
  • El compilador de DAAD, cuando se le pide que comprima los textos, solamente comprime los textos de localidades, aunque la documentación dice que lo hace en todos menos las descripciones de objetos. Aunque es poco posible sacar mucho jugo a los mensajes del sistema, podría habersele sacado algo de jugo a los mensajes de usuario, y quizá el Enano Maluva podría habernos lanzado su majestuosa hacha, o su oxidada hacha, en lugar de simplemente su hacha.
  • El compilador de DAAD tiene un bug y no comprueba si puede escribir el fichero DDB. Si por lo que sea tenemos el fichero DDB abierto (yo lo tenia abierto muchas veces con un editor hexadecimal) dice que compila y genera el nuevo fichero pero no es verdad. Supongo que pasará lo mismo si se protege contra escritura.

Con permiso de Morgul, sin cuya ayuda esto nunca se habría hecho (la mayor parte del mérito es suyo) este extractor de bases ha sido publicado en GitHub.

Además, aunque las fuentes de las aventuras de AD están casi todas, y con comentarios que es mejor, en “los discos del DAAD”, en este enlace tenéis las mismas extraídas con undaad de la versión PC, lo cual os asegura que sean los fuentes que de verdad se publicaron.

Mi próximo objetivo es mejorar este undaad, para que el código generado sea compilable por DAAD, porque ahora mismo produce varios errores debido a la distinta codificación de los archivos, que da problemas con letras acentuadas, eñe, etc. (un clásico vamos).