Jagged Alliance/EDT
Формат EDT является контейнером для различной текстовой информации. Каждое сообщение упаковано в текстовый кусок размером в 200, 320 символов или тандемом 30 + 240 байт (в зависимости от предназначения файла), при этом каждый символ «сдвинут» относительно алфавита на одну позицию влево в таблице ASCII (то есть B → A, D → C, 6 → 5 и так далее). Здесь есть исключение - пробел (и, возможно, символ переноса строки) не обрабатывается, а остается как есть.
Признаком окончания строки является символ 0x00, после него конец куска движком не рассматривается. В ранней версии JA остаток куска забивался буквами A, в CD-версии - случайными символами.
Файлы с EDT 30+240
Единственный файл, который представлен в данном формате, является файлом описания предметов инвентаря. Формат следующий: каждая нечетная запись имеет длину в 30 байт, в нее помещается название предмета; далее идет описание (каждая четная запись) длиной 240 байт.
Файл | Количество записей |
---|---|
INVQUOTE.EDT | 272 |
Файлы с EDT 200
Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 200 символов. Примером таких контейнеров может быть DAYQUOTE.EDT, фразы наемников.
Файл | Количество записей |
---|---|
AIMQUOTE.EDT | 840 |
BREQUOTE.EDT | 31 |
INTQUOTE.EDT | 81 |
DAYQUOTE.EDT | 2112 |
JACQUOTE.EDT | 202 |
NATQUOTE.EDT | 60 |
PSTQUOTE.EDT | 900 |
QSTQUOTE.EDT | 101 |
SANQUOTE.EDT | 1 |
SIGQUOTE.EDT | 60 |
WALQUOTE.EDT | 122 |
Файлы с EDT 320
Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 320 символов. Примером таких контейнеров может быть BIOQUOTE.EDT, биографии наемников.
Файл | Количество записей |
---|---|
BIOQUOTE.EDT | 60 |
Пример для извлечения текста
Пример программы на 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 - игровые характеристики.
Файл | Количество записей |
---|---|
NEWPROF.EDT | 129 |
Смещение | Длина, байт | Описание |
---|---|---|
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 | ? |
Ограничения формата
Как уже упоминалось, длина отдельного сообщения ограничена в соответствии с видом формата. Необходимо строго проверять, что итоговое сообщение не вышло за диапазон, иначе это может привести к непредсказуемым последствиям для игрока.