Jagged Alliance/EDT: различия между версиями
(Новая страница: «Формат '''EDT''' является контейнером для различной текстовой информации. Каждое сообщение …») |
|||
(не показано 5 промежуточных версий этого же участника) | |||
Строка 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 | ||
+ | |} | ||
==Пример для извлечения текста== | ==Пример для извлечения текста== | ||
Строка 57: | Строка 97: | ||
close(FILE); | close(FILE); | ||
</pre> | </pre> | ||
+ | |||
+ | == Файл NEWPROF.EDT == | ||
+ | Файл NEWPROF.EDT является исключением во многих смыслах. Во-первых, в нем не кодируется текстовая информация с помощью сдвига. Во-вторых, помимо текстовой информации, в файле содержится информация о характеристиках наемников (основные характеристики, антипатии, пристрастия, зарплата и тому подобное). Формат этих характеристик пока не совсем ясен. | ||
+ | |||
+ | Текстовая же информация укладывается в формат EDT 10 + 30 + 50, где 10 - это кличка наемника, а 30 - полное имя, 50 - игровые характеристики. | ||
+ | |||
+ | {| class=wikitable | ||
+ | ! Файл !! Количество записей | ||
+ | |- | ||
+ | | NEWPROF.EDT || 129 | ||
+ | |} | ||
+ | |||
+ | {|class=wikitable | ||
+ | ! Смещение !! Длина, байт !! Описание | ||
+ | |- | ||
+ | | 0x00 || 10 || Кличка наемника | ||
+ | |- | ||
+ | | 0x0A || 30 || Полное имя наемника | ||
+ | |- | ||
+ | | 0x28 || 50 || Характеристики наемника | ||
+ | |} | ||
+ | |||
+ | Известные характеристики наемника | ||
+ | {|class=wikitable | ||
+ | ! Смещение !! Длина, байт !! Описание | ||
+ | |- | ||
+ | | 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 || ? | ||
+ | |} | ||
==Ограничения формата== | ==Ограничения формата== | ||
Строка 62: | Строка 156: | ||
Как уже упоминалось, длина отдельного сообщения ограничена в соответствии с видом формата. Необходимо строго проверять, что итоговое сообщение не вышло за диапазон, иначе это может привести к непредсказуемым последствиям для игрока. | Как уже упоминалось, длина отдельного сообщения ограничена в соответствии с видом формата. Необходимо строго проверять, что итоговое сообщение не вышло за диапазон, иначе это может привести к непредсказуемым последствиям для игрока. | ||
− | [[Категория: | + | [[Категория:Форматы файлов]] |
Текущая версия на 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 | ? |
Ограничения формата
Как уже упоминалось, длина отдельного сообщения ограничена в соответствии с видом формата. Необходимо строго проверять, что итоговое сообщение не вышло за диапазон, иначе это может привести к непредсказуемым последствиям для игрока.