Mais um blog inútil.

Junho 4, 2010

Lost Eden

Filed under: Coding,Serious Business,Useless — falso @ 1:11

Olá pessoal.

Eu há uns tempos, quando ainda estava de cama, lembrei-me de um granda jogo dos tempos do DOS, o Lost Eden. A história é sobre um mundo onde os humanos e os dinossauros coexistiam, e eram amigos (alguns), e era bem fixe para a altura!
O jogo era feito de animações em vídeo, género ficheiros FLC feitos no 3D Studio, e incluía altas musicas do grande compositor Stéphane Picq (eu tenho o CD original da banda sonora ;-).

Andei à procura nas internets a ver se alguém já tinha feito o reverse engineer ao jogo, e se já dava para jogar em SO actuais, mas pelos vistos não. A única maneira de o jogar é no DOSBox, mas fica uma beca com frame-skip.
Decidi então, mesmo sabendo que não ia fazer nada de jeito, tentar eu algo.

O jogo vem com alta ficheiro de 431MB chamado EDEN.DAT, fui então primeiro tentar descobrir qual é o conteúdo desse ficheiro.

Este site explica o seguinte:
The EDEN.DAT file begins with 2 bytes which might indicate the number of files contained in the GRAF. Following this number is a series of 25-byte records. Each record is laid out as follows:
bytes 0-11 filename: typically 8.3 DOS filenames, padded with zeroes
bytes 12-15 unknown
bytes 16-19 file size
bytes 20-23 absolute offset of file within GRAF
byte 24 unknown

Então meti mãos à obra, e fiz um script para extrair todos os ficheiros que estão no EDEN.DAT.

#!/opt/local/bin/python
# this script can never fail
import os
import struct

dat = open("EDEN.DAT", "rb")

dat.seek(0)
(total,) = struct.unpack("<H", dat.read(2))
print "O total de ficheiros e: %i" % total

# primeiro 0x2 - 2
# segundo 0x1b - 27
# terceiro 0x34 - 52

for info in range(0,total):
#for info in range(0,1000):
    start = 2+25*info
    
    dat.seek(start)
    filename = str.strip(dat.read(12),'\x00')
    if filename != "":
        print "Filename: %s" % filename
    
        dat.seek(start+16)
        (file_size,) = struct.unpack("<L", dat.read(4))
        print "Tamanho : %i bytes" % file_size
    
        dat.seek(start+20)
        (file_offset,) = struct.unpack("<L", dat.read(4))
        print "Offset: 0x%x" % file_offset
    
        destfn = os.path.join("rip/",filename)
        print "A escrever ficheiro %i: %s " % (info, repr(destfn))
        dat.seek(file_offset)
        dest = open(destfn, "wb")
        dest.write(dat.read(file_size))
        dest.close

dat.close

Consegui então extrair, montes de ficheiros VOC, que são todas as vozes e musicas do jogo, e também vários ficheiros mais ou menos grandes com a extensão HNM e com mais umas buscas nas internets descobri que o HNM é alta formato de video proprietário da já extinta CRYO Interactive Entertainment e que não há nenhum decoder ainda feito. Com essa informação fiquei triste e nunca mais toquei nisto, mas hoje liguei aqui o maczinho e vi aqui isto, e achei que era uma boa coisa para blogar, nem que seja para não perder o código. Espero que tenham gostado.

Fiquem bem, e joguem muito!

3 comentários a “Lost Eden”

  1. Armorfist diz:

    Pede ao Dcoder pra fazer o decoder

  2. mirage diz:

    Infelizmente nunca joguei a isto mas adorei a homenagem ao jogo.

  3. thread diz:

    Epah, que cena elite essa de extrair o DAT! A ver se continuas isso....

Leave a Reply for Armorfist

widgeon
widgeon
widgeon
widgeon