О бедном Arcanum замолвите слово / Хабр

О бедном Arcanum замолвите слово / Хабр Нумерология
gamedev, reverse-engineering, arcanum

О бедном Arcanum замолвите слово

— Arcanum — что? Arcanum — Арканум; — Да, Арканум. Как вы знаете, Гилберт Бейтс, брахман бицепсов. Баги, сломанные диалоги, неработающие квесты, триплексо игры. Arcanum!

Впечатляющая фотография.

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

Введение.

Недавно появилась новость о том, что издатель игр Sierra был приобретен компанией Microsoft. Это означает, что у нас с вами появилась потенциальная возможность увидеть официальный ремейк культовой игры 2001 года. В то же время, на мой взгляд, эта новость автоматически означает, что все, кроме Возможно, усилия по созданию альтернативных римейков, портов и ремастеров со стороны новых владельцев прекратятся. А может быть, и нет… В любом случае, сейчас подходящее время для создания своеобразной ретроспективы. Уместно вспомнить и обсудить, какую работу проделали разработчики игр «Тройки», как хранились игровые данные и стоит ли преследовать Вергилия. Вечеринка.

Несколько лет назад я познакомился с известными моддерами и фанатами игр серии The Arcanum: будучи поклонником Steamworks и Magick Obscura, я был удивлен тем, что формат игровых файлов был частично известен, хотя ему уже около 15 лет. Старый. На самом деле, работать с некоторыми файлами было довольно муторно: открываешь файл в hex-редакторе, вырезаешь n байт и меняешь цену. Если повезет, изменится характеристика NPC», и это было волшебно. На мой взгляд, это крайне непродуктивно.

На самом деле, формат бинарного файла был известен двум-трем пользователям этого форума, да и, наверное, всего Интернета. Первым и, пожалуй, единственным человеком, обладавшим полной информацией, был Crypton, моддер из Восточной Европы. Обладая полной информацией, он в течение нескольких лет предпринял две попытки создать альтернативы игровым движкам QT и WebGL, после чего исчез из журналов на месяцы и годы.

В своей последней попытке он создал аккаунт Patreon и уселся собирать деньги на три банана. Обещание поделиться исходным кодом он не выполнил и снова исчез из Infopole.

Это, пожалуй, главная проблема современного мод-сообщества. Абсолютная закрытость и нежелание делиться информацией… Надеясь (нет) на то, что с ними можно сделать небольшой гешефт. В результате сообщество сейчас страдает, так как ценность фанбазы ретро-игр уменьшается с каждым днем из-за естественной убыли фанбазы ретро-игр.

Ради интереса я решил заняться этой проблемой, и хотя я не могу сказать, что достиг больших успехов, у меня кое-что есть… Он представлен на хабре.

Тип файла.

Arcanum, как и большинство игр, имеет кучу двоичных форм для упаковки файлов, изображений и файлов данных. И очевидно, что большинство из них было направлено на уменьшение размера дистрибутива.

На мой взгляд, место для уменьшения еще есть, но там, где это было необходимо, львиная доля контента, блиставшего в бета-версии игры, была сокращена и помещена на тот же номер CD. Но, как мы все знаем, студии сталкиваются с экономическими трудностями и нехваткой времени… Поэтому хорошо, что игра вообще увидела свет.

Графика и сопутствующие файлы представлены в двух форматах

  • Art — собственно двоичный формат изображения тайлов.
  • Facwalk — форма комбинирования отдельных плиток для создания больших декораций, как на скриншоте выше.

Представляют интерес и другие, но практически неграфические бинарные файлы с расширениями:

  • MOB — файл данных с описанием свойств объектов на карте
  • SEC — файлы сектора тайловой карты размером 64×64.

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

*. Art.

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

Представьте, что вы попали в 1999 год и только «оторвались» от взаимодействия, чтобы создать «свой собственный луна-парк с блэкджеком и магией». Современные методы упаковки изображений еще не были изобретены, а о шейдерах вы слышали практически все. Поэтому Arcanum в целом основан на использовании цветовой палитры и исключении повторяющихся пикселей — метод сжатия без потери качества, не новый на тот момент. Это как старая добрая консоль.

В отличие от Fallout, игры в Arcanum изометричны, а не гексагональны. Отличаются и сетки игровых тайлов. В легендарном Fallout используется треугольная сетка, а в Arcanum — классическая изометрическая.

Иллюстрация картографического процессора

По сути, за «мясной» матч авторам пришлось заплатить содержанием. Если в гексагональной сетке для обозначения движения в тех же шести возможных направлениях требуется всего шесть наборов движущихся объектов, то в изометрической сетке — все восемь. Конечно, плитки, скорее всего, создавались с использованием примитивной 3D-модели, но это не экономит 25%.

Заголовок.

От текстов перейдем к структуре файлов.

Названия художественных файлов.

В начале каждого файла находится 36-байтовый заголовок, который содержит основные данные для правильного декодирования остальной части файла.

02 00 00 00 00 00 // Тип искусства: статика = 0x01, живность = 0x02, шрифт = 0x04 и т.д. 0F 00 00 00 00 00 // Частота кадров: неизвестно 08 00 00 00 00 // Количество направлений // Количество "направлений" в изометрической сетке. // всегда равно 8, возможно, интегрированная // информация о сетке. // игнорируется нами из-за отсутствия практической пользы. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // Однако цвета не имеют значения. Если палитра не используется, 00 00 00 00 00 00 //: каждое // движение "направлено".

Как известно, каждый художественный файл содержит несколько кадров, из которых игровая машина собирает дальнейшие анимации движения, выстрелов или смерти. Файл может содержать только определенные анимации, умноженные на количество направлений движения.

Общее количество кадров в каждом художественном файле можно легко подсчитать по очевидному виду [количество кадров] * [количество направлений].

После количества кадров идут интересные блоки данных с неопределенным содержимым. Это три блока по 32 байта каждый.

О бедном Arcanum замолвите слово / Хабр

Несмотря на то, что деепричастия связаны между собой, назначение первых и последних 32 байт определить не удалось. Средние 32 байта представляют собой набор из восьми 32-разрядных чисел, каждое из которых является суммой длин каждого отдельного кадра в направлении сетки. Это, а также тот факт, что арт с нулями в этой позиции был без проблем восстановлен из игры, позволяет предположить, что оставшиеся 64 байта представляют собой только служебную информацию.

[structlayout (layoutkind. seckinginal)] Public struct artheader< [MarshalAs(UnmanagedType.U4)] public ArtType Flags; [MarshalAs(UnmanagedType.U4)] public uint FrameRate; [MarshalAs(UnmanagedType.U4)] public uint DirectionCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public ArtColor[] BackColors; [MarshalAs(UnmanagedType.U4)] public uint ActionFrameNumber; [MarshalAs(UnmanagedType.U4)] public uint FrameCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint[] Unk0; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint[] Unk1; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint[] Unk2; >;

Цветовая палитра.

После заголовка располагаются от одного до четырех блоков цветовой палитры, количество которых зависит от числа ненулевых фонов в заголовке. Каждая отдельная палитра содержит четыре байта по 256 цветов, причем первый цвет в палитре является цветом фона. Фон представляет собой импровизированный альфа-канал, как если бы он был прозрачным.

Минимальное искусство. Заголовок обрезан, цвет фона 0xff0000 (красный)

Как видите, одна из функций (вопрос это сложно должна быть вызвана) заключается в том, что если в палитре 28 цветов, то в памяти остается 256. Остальное не нужно при нуле; частично покупается тем, что ART-файл упакован в файл, но при этом вообще не хранится ни одного байта оперативной памяти. На мой взгляд, в этот момент первым байтом идет количество цветов в палитре, а затем сама палитра.

Еще одна неожиданность — не все цвета в палитре используются. Вероятно, это результат постобработки после преобразования.

Кадровые блоки.

Сразу после заголовка идет раздел данных о размере каждого кадра: байты, высота, ширина, размер углубления и смещения.

Несмотря на кажущуюся простоту, здесь есть несколько белых пятен. Например, delta_x, delta_y. Назначение этих полей еще объясняется на профильном форуме.

 // Не проверено 00 00 00 00 00 00 00 00 00 // delta_x 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // delta_y 

Удобная загрузка пикселей

Таблица пикселей появляется непосредственно после информации. Каждый пиксель имеет размер байта и содержит номер одного из 256 цветов палитры.

Однако все не так просто. Для того чтобы не хранить повторяющиеся пиксели в чистом виде, в том числе и фоновые, используется небольшая хитрость. Пиксели складываются в неравномерные куски (или фрагменты), а размер и тип куска «зашифровывается» в первом байте. Старший бит определяет тип фрагмента, а семь младших битов — количество циклов чтения или повторения.

long originalframesize = frameinfo. height * frameinfo. width; byte [] unpackdump = new byte [originalframesize]; if (originalframesize == frameinfo. . size)< ms.Read(unpackDump, 0, unpackDump.Length); >Прочее.< using MemoryStream msUnpack = new MemoryStream(unpackDump); while (msUnpack.Position < originFrameSize) < int chunkInfo = ms.ReadByte(); int readOrRepeatCount = chunkInfo & 0x7F; bool isRepeat = (chunkInfo & 0x80) == 0; byte c = 0x00; for(int i = 0; i < readOrRepeatCount; i++) < if (!isRepeat || i == 0) < c = (byte) ms.ReadByte(); >msUnpack.WriteByte(c); > > >

После сохранения полученной таблицы в одной из требуемых форм вы получаете набор отдельных изображений.

О бедном Arcanum замолвите слово / Хабр

С помощью нескольких простых операций вы можете превратить их в Atlas или Moving GIF-дизайн. В зависимости от того, какую работу вам необходимо выполнить … Не забудьте применить сдвиг. Без этих мультипликаторов изображение будет дергаться из-за неравномерности размеров.

  • Gamedev.
  • Ретроград.
  • arcanum
Оцените статью