Jagged Alliance/EDT
Формат EDT является контейнером для различной текстовой информации. Каждое сообщение упаковано в текстовый кусок размером в 200, 320 символов или тандемом 30 + 240 байт (в зависимости от предназначения файла), при этом каждый символ «сдвинут» относительно алфавита на одну позицию влево в таблице ASCII (то есть B → A, D → C, 6 → 5 и так далее). Здесь есть исключение - пробел (и, возможно, символ переноса строки) не обрабатывается, а остается как есть.
Признаком окончания строки является символ 0x00, после него конец куска движком не рассматривается. В ранней версии JA остаток куска забивался буквами A, в CD-версии - случайными символами.
Файлы с EDT 30+240
Единственный файл, который представлен в данном формате, является файлом описания предметов инвентаря. Формат следующий: каждая нечетная запись имеет длину в 30 байт, в нее помещается название предмета; далее идет описание (каждая четная запись) длиной 240 байт.
Файлы с EDT 200
Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 200 символов. Примером таких контейнеров может быть DAYQUOTE.EDT, фразы наемников.
Файлы с EDT 320
Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 320 символов. Примером таких контейнеров может быть BIOQUOTE.EDT, биографии наемников.
Пример для извлечения текста
Пример программы на perl, которая извлекает сообщения из файла EDT:
#!/usr/bin/perl use warnings; use strict; use Getopt::Long; my $file; my $chunk_length; my $chunk; GetOptions( "file=s" => \$file, "length=i" => \$chunk_length ); if (!($file && $chunk_length)) { print "Usage: ./ja-decoder.pl --file <file> --length <200|320>\n"; exit; } open(FILE, "<", $file); # Читаем файл кусками по $chunk_length, до конца while(read(FILE, $chunk, $chunk_length)) { # Срезаем мусор в конце, терминатор - 0x00 (my $string, undef) = split(chr(0), $chunk); my @array = split ("", $string); foreach (@array) { # Исключение для пробела if ($_ eq " ") { next; } # "Сдвиг" буквы на одну позицию влево $_ = chr(ord($_) - 1); } $string = join("", @array); print "$string\n"; } close(FILE);
Файл NEWPROF.EDT
Файл NEWPROF.EDT является исключением во многих смыслах. Во-первых, в нем не кодируется текстовая информация с помощью сдвига. Во-вторых, помимо текстовой информации, в файле содержится информация о характеристиках наемников (основные характеристики, антипатии, пристрастия, зарплата и тому подобное). Формат этих характеристик пока не совсем ясен.
Текстовая же информация укладывается в формат EDT 10 + 30 + 50, где 10 - это кличка наемника, а 30 - полное имя, 50 - игровые характеристики.
Смещение | Длина, байт | Описание |
---|---|---|
0x00 | 10 | Кличка наемника |
0x0A | 30 | Полное имя наемника |
0x28 | 50 | Характеристики наемника |
Известные характеристики наемника
Смещение | Длина, байт | Описание |
---|---|---|
0 | 2 | Зарплата |
2 | 1 | Здоровье |
3 | 1 | ? |
4 | 1 | Выносливость |
5 | 1 | Точность |
6 | 1 | Мудрость |
7 | 1 | Взрывчатка? |
8 | 16 | ? |
24 | 1 | Медицина |
25 | 1 | Механика |
26 | 1 | Ловкость |
27 | 1 | Взрывчатка? |
28 | 1 | Уровень? |
29 | 21 | ? |
Ограничения формата
Как уже упоминалось, длина отдельного сообщения ограничена в соответствии с видом формата. Необходимо строго проверять, что итоговое сообщение не вышло за диапазон, иначе это может привести к непредсказуемым последствиям для игрока.