Jagged Alliance/EDT: различия между версиями
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
− | Формат '''EDT''' является контейнером для различной текстовой информации. Каждое сообщение упаковано в текстовый кусок размером в 200, 320 символов или тандемом 30 + 240 байт (в зависимости от предназначения файла), при этом каждый символ «сдвинут» относительно алфавита на одну позицию влево в таблице ASCII (то есть B → A, D → C, 6 → 5 и так далее). Здесь есть исключение - пробел (и, возможно, символ переноса строки) не обрабатывается, а остается как есть. | + | Формат '''EDT''' является контейнером для различной текстовой информации. Каждое сообщение упаковано в текстовый кусок размером в 200, 320 символов или тандемом 30 + 240 байт (в зависимости от предназначения файла), при этом каждый символ «сдвинут» относительно алфавита на одну позицию влево в таблице ASCII (то есть B → A, D → C, 6 → 5 и так далее). Здесь есть исключение - пробел (и, возможно, символ переноса строки) не обрабатывается, а остается как есть. В немецкой версии некоторые поля не кодируются вовсе - это сделано для того, чтобы решить некоторые проблемы движка при отображении названий предметов. |
Признаком окончания строки является символ 0x00, после него конец куска движком не рассматривается. В ранней версии JA остаток куска забивался буквами A, в CD-версии - случайными символами. | Признаком окончания строки является символ 0x00, после него конец куска движком не рассматривается. В ранней версии JA остаток куска забивался буквами A, в CD-версии - случайными символами. | ||
Строка 6: | Строка 6: | ||
Единственный файл, который представлен в данном формате, является файлом описания предметов инвентаря. Формат следующий: каждая нечетная запись имеет длину в 30 байт, в нее помещается название предмета; далее идет описание (каждая четная запись) длиной 240 байт. | Единственный файл, который представлен в данном формате, является файлом описания предметов инвентаря. Формат следующий: каждая нечетная запись имеет длину в 30 байт, в нее помещается название предмета; далее идет описание (каждая четная запись) длиной 240 байт. | ||
+ | |||
+ | В немецкой версии нечетные записи по 30 байт не кодируются сдвигом номера символа в таблице ASCII. | ||
+ | |||
+ | {| class=wikitable | ||
+ | ! Файл !! Количество записей | ||
+ | |- | ||
+ | | INVQUOTE.EDT || 272 | ||
+ | |} | ||
==Файлы с EDT 200== | ==Файлы с EDT 200== | ||
Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 200 символов. Примером таких контейнеров может быть DAYQUOTE.EDT, фразы наемников. | Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 200 символов. Примером таких контейнеров может быть DAYQUOTE.EDT, фразы наемников. | ||
+ | |||
+ | {| class=wikitable | ||
+ | ! Файл !! Количество записей | ||
+ | |- | ||
+ | | 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== | ==Файлы с EDT 320== | ||
Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 320 символов. Примером таких контейнеров может быть BIOQUOTE.EDT, биографии наемников. | Для данных файлов должна осуществляться проверка, что итоговое сообщение не превышает 320 символов. Примером таких контейнеров может быть BIOQUOTE.EDT, биографии наемников. | ||
+ | |||
+ | {| class=wikitable | ||
+ | ! Файл !! Количество записей | ||
+ | |- | ||
+ | | BIOQUOTE.EDT || 60 | ||
+ | |} | ||
==Пример для извлечения текста== | ==Пример для извлечения текста== | ||
Строка 62: | Строка 102: | ||
Текстовая же информация укладывается в формат EDT 10 + 30 + 50, где 10 - это кличка наемника, а 30 - полное имя, 50 - игровые характеристики. | Текстовая же информация укладывается в формат EDT 10 + 30 + 50, где 10 - это кличка наемника, а 30 - полное имя, 50 - игровые характеристики. | ||
+ | |||
+ | {| class=wikitable | ||
+ | ! Файл !! Количество записей | ||
+ | |- | ||
+ | | NEWPROF.EDT || 129 | ||
+ | |} | ||
{|class=wikitable | {|class=wikitable | ||
Строка 89: | Строка 135: | ||
| 6 || 1 || Мудрость | | 6 || 1 || Мудрость | ||
|- | |- | ||
− | | 7 || 1 || | + | | 7 || 1 || ? |
|- | |- | ||
| 8 || 16 || ? | | 8 || 16 || ? | ||
Строка 99: | Строка 145: | ||
| 26 || 1 || Ловкость | | 26 || 1 || Ловкость | ||
|- | |- | ||
− | | 27 || 1 || Взрывчатка | + | | 27 || 1 || Взрывчатка |
|- | |- | ||
− | |28 || 1 || Уровень | + | |28 || 1 || Уровень |
|- | |- | ||
| 29 || 21 || ? | | 29 || 21 || ? |
Текущая версия на 10:26, 27 августа 2017
Формат 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 | ? |
Ограничения формата
Как уже упоминалось, длина отдельного сообщения ограничена в соответствии с видом формата. Необходимо строго проверять, что итоговое сообщение не вышло за диапазон, иначе это может привести к непредсказуемым последствиям для игрока.