• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

Gothic.dat

HeDeDe

Участник форума
Регистрация
17 Авг 2009
Сообщения
203
Благодарности
79
Баллы
180
  • Первое сообщение
  • #1
Приветстую.
У меня вдруг зачесались руки написать компилятор готических скриптов с нуля. В связи с этим у меня появился вопрос вопрос: есть ли кто-нибудь, кто знает структуру Gothic.dat?

Попытался расковырять Gothic.dat, но осталось несколько непонятных моментов.

Что я выяснил 3 часа ковыряния Gothic.dat:
Для чего массив в начале файла — не ясно. Сначала думал, что он связан с таблицей символов, но никакой корреляции найти не удалось.

EDIT: полностью разобрал формат
Код:
Первый байт — tree_version. Во второй Готике это 0x32.
Gothic.dat состоит из двух секций — таблицы символов и байткода.

Таблица символов состоит из двух массивов: первый массив — это номера символов, отсортированные по именам символов (используется std::string::compare), и начинается с числа символов в таблицы. Все значения имеют размер 4 байта.

Записи во втором массиве имеют следующий формат:

struct Symbol {
    /*
     * 1, если имя символа присутствует,
     * 0, если оно пустое
     */
    int has_name;
    /*
     * Имя символа (Например: "C_NPC", "B_GiveXP", "KDF_404_XARDAS")
     * Заканчивается переносом строки (\n).
     */
    string name;
    /*
     * Для переменных класса: Смещение внутри класса
     * Для instance: указатель на объект
     * Для функций: тип возвращаемого значения
     */
    int offset;
    /*
     * Тип символа, размер массива, флаги
     * (описаны ниже)
     */
    uint16 type;
    uint16 flags;
    // номер файла в .src
    int file;
    int line;
    int line_count;
    int pos;
    // длина строки в исходниках
    int size;
};

Далее записывается значение, это может быть:
- int
- float
- char[] — строковое значение, заканчивающееся переносом строки ('\n')
- указатель на функцию или переменную движка
- количество байт от начала секции кода — для func и instance

После этого значения записывается номер символа класса или функции (если это член класса, инстанция или локальная переменная, в противном случае записывается -1).


flags имеет седующую структуру:
1 00 1001 0 101 0000'0000'0000
a ?? emrc ? ttt ssssssssssss

a — как-то связан с выделением памяти
e — external — функция движка
m — член класса
r — return
c — const

t — тип, известны следующие типы:
enum type {
    void   = 0;
    float  = 1;
    int    = 2;
    string = 3;
    class  = 4;
    func   = 5;
    prototype = 6;
    instance  = 7;
}

s — количество аргументов/размер массива/количество членов класса

Обязательно присутствует символ "\xffINSTANCE_HELP".


В самом конце — секция кода. Готика использует стековую виртуальную машину. В начале секции — её длина, далее идут опкоды (каждый — 1 байт, но некоторые могут иметь 4-байтовый аргумент, исключение — PUSH_ARRAY_VAR — имеет 2 аргумента, 4-байтовый адрес и 1-байтовый индекс массива).

Существуют следующие опкоды:

Арифметические операции:
Берутся два значения со стека (A, B), в стек записывается A @ B
00 +  ADD
01 -  SUB
02 *  MUL
03 /  DIV
04 %  MOD
05 |  OR
06 &  AND
0D << LSHIFT
0E >> RSHIFT

Операции сравнения:
Аналогичны арифметическим. В стек записывается 1 если верно, 0 если нет.
07 <  LESS
08 >  GREATER
0F <= LEQ
10 == EQUAL
11 != NEQ
12 => GEQ

Логические операции:
0B || OR_BOOL
0C && AND_BOOL

Унарные операции:
1E + // берет значение со стека и кладет обратно
1F -
20 !
21 ~

Работа со стеком:
«Кладут» значение своего аргумента (следующего за инструкцией) в стек.
40 PUSHINT        [VALUE]
41 PUSHADR        [ADDR]
43 PUSHINSTANCE   [ADDR]
F5 PUSH_ARRAY_VAR [ADDR][INDEX] // индекс всего 1 байт

Операции присвоения:
Берет 2 значения со стека (A, B) и присваивает A = B
09 SET_INT
46 SET_STRING
47 SET_STRING_REF
48 SET_FUNC
49 SET_FLOAT
4A SET_INSTANCE

Арифметические операции с присвоением
13 +=
14 -=
15 *=
16 /=

Функции
3C RET
3D CALL         [ADDR]
3E CALL_BUILTIN [ADDR]

Ветвление:
4B JMP_FALSE // берет значение со стека, и переходит по адресу, если оно равно 0
4C JMP

50 SET_CURRENT_INSTANCE
 
Последнее редактирование:

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.174
Благодарности
6.153
Баллы
1.565
shilons, у Вали нет gothic.dat, у этого мода свой ДАТ файл, только как называется - не помню, вроде velaja.dat
и Gothic Source v3.14 тебе не поможет - будет вылетать с ошибками на этом моде. Возьми версию 3.15, возможно он не будет вылетать.
MW 7, из консоли в игре декомпилировать :eek: ?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
валя, - эт велайя чтоль ?! *lupa*
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.847
Благодарности
5.274
Баллы
910
Это извращение, GS не поможет, поможет только EGMT.

Пора уже забыть про какие-то махинации, все нормально переводится через EGMT.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.922
Благодарности
926
Баллы
275
@MW 7, из консоли в игре декомпилировать :eek: ?

в начале августа Slavemaster добавил fulldecompile для MarvinHelper

Union_MarvinHelper:
- Реализована история команд для Г1
- Добавлена команда fulldecompile
- Добавлена команда set option
- Добавлена команда play audio3d
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.007
Благодарности
516
Баллы
350
MEG@VOLT, Я вот чисто по фану протестил на Велаи, и да, из игры все прекрасно пережевалось и даже не подавилось Икарусом. Правда скрипты разваливаются на настолько мелкие файлы, что каждый!!! instanse диалога это отдельный файл. Почти 10к файлов. Собрать такое обратно в кучу будет ой какой веселой задачей. Правда вариантов не то чтобы много
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.174
Благодарности
6.153
Баллы
1.565
MEG@VOLT, Я вот чисто по фану протестил на Велаи, и да, из игры все прекрасно пережевалось и даже не подавилось Икарусом. Правда скрипты разваливаются на настолько мелкие файлы, что каждый!!! instanse диалога это отдельный файл. Почти 10к файлов. Собрать такое обратно в кучу будет ой какой веселой задачей. Правда вариантов не то чтобы много
А если не только Валю. Допустим в оригинале, диалоги тоже будут каждый по кусочкам?
Slavemaster суммон...
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.007
Благодарности
516
Баллы
350
MEG@VOLT, Ага. Тоже просто разваливает на кусочки. Скорее всего компиляция игрой, если засунуть все в один файл , будет удачна. Но серьезно...Такими темпами скоро модить игру будут прямо из игры...
1661793485639.png
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.174
Благодарности
6.153
Баллы
1.565

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.039
Благодарности
1.814
Баллы
240
Lorddemonik, MarvinHelper каждую функцию компилит в отдельный файл. Цель декомпиляции - посмотреть отдельные функции, а не полный реверс мода.

Для перевода используйте EGMT.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.174
Благодарности
6.153
Баллы
1.565
Тоже просто разваливает на кусочки.
OFFTOP

в виндовой командной строке:
copy *.d dialogs.d
этой командой все D файлы сольются в один dialogs.d, и после этого все остальные файлы можно грохнуть))

 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
MEG@VOLT, те сошьется все в виде каши ?! :)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
где-то я уже видел подобные аццкие датники ))
 

Lorddemonik

★★★★★
Редактор раздела
Регистрация
17 Дек 2011
Сообщения
1.007
Благодарности
516
Баллы
350

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.922
Благодарности
926
Баллы
275
Собрать такое обратно в кучу будет ой какой веселой задачей.
зачем тебе всё собирать? необходимое отредактируй , положи в папку авторан, а потом через консоль скомпилируй новый датник.
 
Сверху Снизу