Jagged Alliance/EDT

Материал из Old-Games.RU Wiki
Версия от 10:26, 27 августа 2017; Winterheart (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Формат EDT является контейнером для различной текстовой информации. Каждое сообщение упаковано в текстовый кусок размером в 200, 320 символов или тандемом 30 + 240 байт (в зависимости от предназначения файла), при этом каждый символ «сдвинут» относительно алфавита на одну позицию влево в таблице ASCII (то есть B → A, D → C, 6 → 5 и так далее). Здесь есть исключение - пробел (и, возможно, символ переноса строки) не обрабатывается, а остается как есть. В немецкой версии некоторые поля не кодируются вовсе - это сделано для того, чтобы решить некоторые проблемы движка при отображении названий предметов.

Признаком окончания строки является символ 0x00, после него конец куска движком не рассматривается. В ранней версии JA остаток куска забивался буквами A, в CD-версии - случайными символами.

Файлы с EDT 30+240

Единственный файл, который представлен в данном формате, является файлом описания предметов инвентаря. Формат следующий: каждая нечетная запись имеет длину в 30 байт, в нее помещается название предмета; далее идет описание (каждая четная запись) длиной 240 байт.

В немецкой версии нечетные записи по 30 байт не кодируются сдвигом номера символа в таблице ASCII.

Файл Количество записей
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 ?

Ограничения формата

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