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