1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Внутренности Alien Legacy

Тема в разделе "Мастерская", создана пользователем tkzv, 9 май 2018.

Метки:
  1. tkzv

    tkzv

    Регистрация:
    9 май 2018
    Сообщения:
    103
    Стало интересно, что внутри у игры Alien Legacy ( Alien Legacy (1994, DOS, скриншоты) ). Кое-что выяснил простым разглядыванием файлов, дальше занялся дизассемблированием. Можно сюда выкладывать ресурсы игры с комментариями? Пока — краткое описание файлов на CD:

    DAT/*TXT.DAT, DAT/GOODADV.DAT — большая часть текстов из игры, ~500 килобайт:
    DAT/ASTROTXT.DAT — астрономические находки
    DAT/BIOLTXT.DAT — биологические находки
    DAT/CHATTXT.DAT — монологи советников, если к ним обратиться
    DAT/CHEMTXT.DAT — химические находки
    DAT/CLUETXT.DAT — артефакты, в основном, колоний "Тантала"
    DAT/ELECTXT.DAT — находки по электронике
    DAT/GEOTXT.DAT — геологические находки
    DAT/GOODADV.DAT — что говорят советники по клавише "Advice"
    DAT/LIBTXT.DAT — заголовки в библиотеке в PDA
    DAT/LOGTXT.DAT — краткие задания в LOG в PDA
    DAT/MATHTXT.DAT — математические находки
    DAT/PHYSTXT.DAT — физические находки
    DAT/QUEUETXT.DAT — сообщения от советников, появляющиеся в виде зелёных лампочек
    DAT/RPTTXT.DAT — история (2011-2150), отчёты о планетах, о нападениях животных, письмо Джохансон
    DAT/TECHTXT.DAT — тексты к изобретениям

    DAT/EXPPAL.DAT — палитры: заголовок 1208 (302*4) байт, 140 палитр по 768 байт; все расшифрованные на сегодня изображения используют палитру 10

    DAT/STARFLD.DAT — звёздное небо: битмап 256х256х1 байт, палитра 10

    *.DVF, MISC/INTRO.DVF — озвучка к интро и сообщениям; ещё не расшифровал формат заголовков, но файлы можно проигрывать как "сырой" PCM, 11 кГц, 8 бит без знака, и шум от служебной информации практически не мешает.
    ADVICE.DVF — озвучка к ADVTXT.DAT
    CHAT.DVF — озвучка к CHATTXT.DAT
    POPUP.DVF — озвучка к текстам из экзешников RESOURCE/RESOURCE.*
    QUEUE.DVF — озвучка к QUEUETXT.DAT
    MISC/INTRO.DVF — озвучка вступительного видео

    MISC/AL.EXE — собственно основной экзешник, ~40 килобайт текстов.

    RESOURCE/RESOURCE.??? — 72 экзешника, подгружаемых по частям. Насколько я могу судить, именно там закодированы все параллельные сюжетные линии и побочные квесты. ~50 килобайт текстов.

    VOC/D4X??.VOC — короткие звуковые эффекты в формате Creative Voice File, 58 штук

    XMI/M3*.XMI — MIDI-музыка в формате XMI, 68 штук.

    PLANET/PLANET.0?? — 26 карт планет, включая "Sporeship"

    ANIM.0??, CINEMA.0??, VIDEO.0?? — анимация в слегка модифицированном формате Autodesk Animator FLIC. "Магические числа" 0xAF11 (FLI) и 0xAF12 (FLC) заменены соответственно на 0xAF13 и 0xAF14, в некоторых файлах есть нестандартный чанк 20274 (0x4f32). У ANIM.010 и CINEMA.007 первый кадр рисуется полностью чёрным, остальные кадры-дельты нормальные. Все остальные файлы проигрываются нормально.
    ANIM.000-001 — анимация к интерфейсу карты Меркатора
    ANIM.002-022 — мостик "Калипсо"
    ANIM.023-027 — фоны при общении с советниками.
    ANIM.098 — "над игрой работали", различается в CD- и флоппи-версиях.
    ANIM.099 — портреты авторов, только в версии на дискетах.
    CINEMA.000 — интро, различается в CD- и флоппи-версиях.
    CINEMA.001-027 — катсцены; 15 и 23-27 — только на CD.
    CINEMA.099 — эмблема Ybarra Productions, только на дискетах.
    VIDEO.000-008 — анимированные портреты советников
    VIDEO.009-025 — анимированные портреты губернаторов планет
    VIDEO.025-039 — вращающиеся планеты
    VIDEO.040 — эмпиант

    SMAPIMAG.DAT — спрайты вращающихся планет и звезды для Starmap, палитра 10. 60х50: 14 планет по 15 кадров + звезда 8 кадров, 30х25: столько же, 15х13: столько же, 30х18: 5 кадров взрыва.

    Инсталляторы, конфигураторы, ридми:
    DIG/ — драйверы аудио
    MDI/ — драйверы MIDI
    INSTALL.EXE
    INSTALL.HLP
    INSTALL.SCR
    INSTALL.TXT
    README
    README.BAT
    RESOURCE.CFG
    MISC/AILDRVR.LST
    MISC/SAMPLE.AD
    MISC/SAMPLE.OPL
    MISC/SETSOUND.EXE

    Файлы, назначение которых я ещё не выяснил:
    DAT/DELTA.DAT
    DAT/INST.DAT
    DAT/MSHPCMBT.DAT
    DAT/OSITCMBT.DAT
    DAT/PERSPCTV.DAT
    DAT/PROD.DAT
    DAT/PSITCMBT.DAT
    DAT/ROTATEL.DAT
    DAT/SENTCMBT.DAT
    DAT/SHADE.DAT
    DAT/TECH.DAT
    DAT/TRIG.DAT
    DAT/VHCLCMBT.DAT
    DAT/VHCL.DAT
    MISC/CAMPAIGN.SCN
    MISC/MAIN.YSU
    EXPIMAGE.DAT
    MIDIDIGI.WVL
     
    Последнее редактирование: 13 май 2018
    Joe11th, Neitan, ZaRR и 9 другим нравится это.
  2.  
  3. tkzv

    tkzv

    Регистрация:
    9 май 2018
    Сообщения:
    103
    Интро

    Интерфейс в режиме карты Меркатора

    Фон позади советников

    Список работавших над игрой

    --- добавлено 9 май 2018, предыдущее сообщение размещено: 9 май 2018 ---

    Анимация на мостике "Калипсо"

    --- добавлено 9 май 2018 ---

    Анимированные портреты

    Небесные тела, из справочника

    --- добавлено 9 май 2018 ---

    Архивные кадры



    Взрыв звезды

    Война с эмпиантами


    Противометеоритная пушка

    Исследование Гаммы-1:

    Прочие катсцены

    Катсцены, которые я ни к чему не могу отнести
    --- добавлено 10 май 2018 ---
     
    Последнее редактирование: 19 май 2018
    Sneaksie, kirik-82, hardcorenexus и 7 другим нравится это.
  4. Дарк Шнайдер Недопустимо инфантилен

    Дарк Шнайдер

    Регистрация:
    18 окт 2004
    Сообщения:
    21.870
  5. tkzv

    tkzv

    Регистрация:
    9 май 2018
    Сообщения:
    103
    Анимация из SMAPIMAG.DAT. В порядке Гермес-Рея-Прометей-Гея-Арес-Зевс-Гера-Геба-Кронос-Посейдон-Тефис-Гадес-Гамма-другие астероиды-Бета Резца:

    Большие:

    Средние:

    Малые:

    Какой-то взрыв:
    explosion.gif

    STARFLD.DAT:
    starfld.dat.png

    В AL-txt-dat.7z — тексты из файлов *TXT.DAT и GOODADV.DAT
     

    Вложения:

    • al-txt-dat.7z
      Размер файла:
      131,4 КБ
      Просмотров:
      38
    Последнее редактирование: 10 май 2018
  6. tkzv

    tkzv

    Регистрация:
    9 май 2018
    Сообщения:
    103
    Конвертер для анимации SMAPIMAG.DAT на питоне:
    Код:
    #!/usr/bin/python3
    
    def SavePPM( start, paletteStart, w, h, name):
        outFile = open( name, 'wb' )
        header = bytes( 'P6\n' + str(w) + ' ' + str(h) + '\n' + '255\n' , 'ascii' )
        outFile.write( header )
        spriteSize = w*h
        outBM = bytearray()
        for pixel in range( start, start + spriteSize ):
            colour = allFile[pixel]
            st = paletteStart + colour*3
            outBM += palettes[ st : st + 3]
        outFile.write( outBM )
        outFile.close()
    
    def saveAllSpritesForBody( offset, spritesTotal, w, h, namePrefix, palStart ):
        for imageN in range (0,spritesTotal):
            name = namePrefix + 's' + str(imageN).rjust(2,'0') + '.ppm'
            st = offset + imageN*w*h
            SavePPM( st, palStart, w, h, name )
    
    def saveAllSpritesForAllPlanets( blockOffset, planetsTotal, spritesTotal, w, h, namePrefix, palStart ):
        for planetN in range(0,planetsTotal):
            curOffset = blockOffset + planetN * spritesTotal * w * h
            saveAllSpritesForBody( curOffset, spritesTotal, w, h, namePrefix + str(planetN).rjust(2,'0'), palStart )
    
    # Location of SMAPIMAG.DAT and EXPPAL.DAT goes here
    allFile = open( '../SMAPIMAG.DAT', 'rb' ).read()
    palettes = open( '../DAT/EXPPAL.DAT', mode='rb' ).read()
    palHeaderSize = 1208
    palN = 10 # Starmap
    palStart = palHeaderSize + palN*256*3
    
    planetsTotal = 14
    spritesTotal = 15
    starSpritesTotal = 8
    # 60x50 sprites, 14 planets x 15 frames, 1 star x 8 frames
    saveAllSpritesForAllPlanets( 0, planetsTotal, spritesTotal, 60, 50, 'fs-p', palStart)
    offsetStar = planetsTotal*spritesTotal*60*50
    saveAllSpritesForBody( offsetStar, starSpritesTotal, 60, 50, 'fs-star-', palStart)
    offsetHalf = offsetStar + starSpritesTotal*60*50
    # 30x25 sprites, 14 planets x 15 frames, 1 star x 8 frames
    saveAllSpritesForAllPlanets( offsetHalf, planetsTotal, spritesTotal, 30, 25, 'hs-p', palStart)
    offsetHalfStar = offsetHalf + planetsTotal*spritesTotal*30*25
    saveAllSpritesForBody( offsetHalfStar, starSpritesTotal, 30, 25, 'hs-star-', palStart)
    # 15x13 sprites, 14 planets x 15 frames, 1 star x 8 frames
    offsetQuarter = offsetHalfStar + starSpritesTotal*30*25
    saveAllSpritesForAllPlanets( offsetQuarter, planetsTotal, spritesTotal, 15, 13, 'qs-p', palStart)
    offsetQuarterStar = offsetQuarter + planetsTotal*spritesTotal*15*13
    saveAllSpritesForBody( offsetQuarterStar, starSpritesTotal, 15, 13, 'qs-star-', palStart)
    # 30x18 explosion, 5 frames
    offsetTail = offsetQuarterStar + starSpritesTotal*15*13
    saveAllSpritesForBody( offsetTail, 5, 30, 18, 'explosion-', palStart)
    
    Перед запуском надо в строках 28 и 29 заменить пути к SMAPIMAG.DAT и EXPPAL.DAT.
    Скрипт читает блоки байт, соответствующие кадрам, и сохраняет их в формате 24-битных PPM (читается ImageMagic и IrfanView). Формат имён (f-полноразмерный, h-половинный, q-четвертной):
    для планет: {f|h|q}s-p{00-13}-s{00-14}.ppm;
    для звезды: {f|h|q}s-star-s{00-07}.ppm;
    для взрыва: explosion-s{00-04}.ppm
    Например, fs-p00-s00.ppm — 0-й спрайт для 0-й планеты (Гермеса) 60х50, а qs-star-s05.ppm — 5-й спрайт для Беты Резца 15x13.
    Далее конвертировал каждый в GIF convert-ом из ImageMagic и склеивал gifcicle.

    Формат SMAPIMAG.DAT:
    Просто битмапы без какой-либо служебной информации. 8 бит на пиксель, палитра 10 из EXPPAL.DAT.
    Вначале идут 14 блоков по 15 спрайтов 60x50 — планеты.
    Затем 8 спрайтов 60x50 — звезда.
    Затем 14 блоков по 15 спрайтов 30x25 — планеты.
    Затем 8 спрайтов 30x25 — звезда.
    Затем 14 блоков по 15 спрайтов 15x13 — планеты.
    Затем 8 спрайтов 15x13 — звезда.
    Затем 5 спрайтов 30x18 — взрыв.


    Формат EXPPAL.DAT:
    Подробно не анализировал.
    00000-00001: 2-байтное целое, 0x012c=300
    00002-00003: 2 байта непонятного назначения: 04 00
    00008-004b7: 301 4-байтное целое. Первые 13 равны 0, последние 13 равны 0, предыдущие 20 равны 0x01a400=107520, что равно общей длине палитр в файле.
    004b8-1a8b7: 140 палитр по 768 байт. Каждая палитра — 256 троек R G B.


    Формат *TXT.DAT:
    0000-0001: RecNum, число записей, 2-байтное целое.
    0002-0003: 2 байта непонятного назначения.
    0004-RecNum*4+7: RecNum+1 4-байтное целое. Смещения текстовых строк относительно конца оглавления. 0-й элемент равен 0, последний равен суммарному размеру всех строк, то есть указывает за конец файла.
    от RecNum*4+8 до конца: Текстовые строки, оканчивающиеся байтом 0x00. Строка может быть пустой, то есть состоять только из байта 0x00.


    Конвертер для *TXT.DAT на питоне:
    Код:
    #!/usr/bin/python
    from sys import argv
    
    # print decimal or hexadecimal offsets
    hexout = True
    
    for fileName in argv[1:]:
        print(fileName)
        try:
            allFile=open(fileName, mode='rb' ).read()
            print('Read: ', len(allFile))
            numEntries=int.from_bytes(allFile[0:2],byteorder='little')
            unknown2b =int.from_bytes(allFile[2:4],byteorder='little')
            print('Number of entries: ', numEntries )
            print('Unknown 2-byte number: ', unknown2b )
            listStart = 4*(numEntries+2)
            for entry in range(1,numEntries+1):
                entryStart=int.from_bytes(allFile[ entry*4   : entry   *4+3],byteorder='little')+listStart
                entryNext =int.from_bytes(allFile[(entry+1)*4:(entry+1)*4+3],byteorder='little')+listStart
                if hexout:
                    print( hex(entry-1) + ' ( ' + hex(entryStart-1) + ' - ' + hex(entryNext-2) + ' )' )
                else:
                    print( entry, ' (', entryStart, '-', entryNext-1, ')' )
                print( allFile[entryStart:entryNext] )
            if entryNext<len(allFile):
                print('Remaining tail (', entryNext, '-', len(allFile), '):')
                print( allFile[entryNext:] )
        except:
            print('Cannot process file ', fileName, ' as *TXT.DAT')
        print('\n')
    Берёт имена файлов из командной строки, для каждого читает оглавление и в соответствии с ним выводит текстовые строки. В случае ошибок сигнализирует, что формат неверен.

    Конвертер для FLIC-ов на питоне:
    Код:
    #!/usr/bin/python3
    from sys import argv
    
    for fileName in argv[1:]:
        allFile = bytearray(open(fileName, mode='rb').read())
        print(fileName)
        if allFile[4:6] == b'\x14\xaf':
            allFile[4] =  0x12
            newFile = open( fileName+'.flc', mode='wb')
            newFile.write(allFile)
        elif allFile[4:6] == b'\x13\xaf':
            allFile[4] =  0x11
            newFile = open( fileName+'.fli', mode='wb')
            newFile.write(allFile)
    Берёт имена из командной строки, проверяет наличие нужных "магических чисел", если находит — меняет на соответствующие стандартные и сохраняет в новый файл, добавив расширение ".fli" или ".flc".
    Далее конвертировал: ffmpeg -i infile outfile
    --- добавлено 11 май 2018, предыдущее сообщение размещено: 11 май 2018 ---

    Формат DVF:
    Окончательно не разобрался.
    0000-0003: RN, число записей, 4-битное целое.
    0004-RN*4+3: Смещения записей относительно начала файла, 4-битные целые. Могут быть равны 0.

    От RN*4+4 до конца идут записи.
    В начале каждой — заголовок из 3 списков адресов переменной длины. Каждый список имеет вид:
    00: N, число адресов, 4-битное целое. Встречал значения 0, 1, 2, 4.
    04, ..., 4*N+4: адреса, N 4-битных целых. Если N=0, адресов нет, и пустой список состоит из 4-байтного 0x00000000.
    В начале записи таких списков 3, а в глубине я встречал такие списки парами и поодиночке. Каждый адрес указывает либо на начало другого списка, либо на блок данных.

    Блок данных начинается с 4-байтного размера. За ним — собственно данные — несжатый 8-битный сырой PCM без знака (тишине соответствует 0x80).
    Ничего похожего на частоту дискретизации в файле я не нашёл, но с частотой 11 кГц звучит неотличимо от игры.

    Можно написать программу, которая обойдёт эти деревья, и выяснить, весь ли файл окажется охвачен, или есть неиспользуемые области. Но этого я ещё не делал.

    Зачем нужна такая сложная структура? Пока могу только предполагать. Многие события могут происходить в нескольких вариантах. Их может докладывать мужчина или женщина. Последствия катастрофы могут быть лёгкими или тяжёлыми. И т.д. Видимо, формат позволяет выбирать на лету из нескольких ветвлений. Выглядит излишне усложнённым, похоже закладывались под более сложное дерево выбора, которое ни разу не употребили.
     
    Последнее редактирование: 12 май 2018
    Neitan, bckpkol, Gamerun и 2 другим нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление