Jagged Alliance/EDT

Материал из Old-Games.RU Wiki
Перейти к навигации Перейти к поиску

Формат 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 - игровые характеристики.

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

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