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);
Ограничения формата
Как уже упоминалось, длина отдельного сообщения ограничена в соответствии с видом формата. Необходимо строго проверять, что итоговое сообщение не вышло за диапазон, иначе это может привести к непредсказуемым последствиям для игрока.