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