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

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

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

Gothic.dat

HeDeDe

Участник форума
Регистрация
17 Авг 2009
Сообщения
203
Благодарности
79
Баллы
180
Приветстую.
У меня вдруг зачесались руки написать компилятор готических скриптов с нуля. В связи с этим у меня появился вопрос вопрос: есть ли кто-нибудь, кто знает структуру 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.172
Благодарности
6.153
Баллы
1.565
Приветстую.
У меня вдруг зачесались руки написать компилятор готических скриптов с нуля. В связи с этим у меня появился вопрос вопрос: есть ли кто-нибудь, кто знает структуру Gothic.dat?

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

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

Структуру таблицы символов удалось установить экспериментальным путём.
Код:
struct decl {
    int unk_0 = 1; // ?
    string name;
    int return_type;
    enum type_t {
        var_float = 0x401001;
        var_int = 0x402001;
        var_string = 0x403001;
        var_func = 0x405001;
        const_float = 0x411001;
        const_int = 0x412001;
        const_string = 0x413001;
        func_void = 0x415000,
        func_retn = 0x435000,
        func_retn_1 = 0x435001,
        func_retn_2 = 0x435002, //etc...
        func_builtin_void = 0x495000,
        func_builtin_retn = 0x4B5000,
        instance = 0x417000
        class_int = 0x442000;
    } type;
    int /*unk_2 = 0*/ file; // номер файла
    int line;
    int line_count;
    int offset;
    int size; // длина строкового значения?
    // ОК, длина строки в исходниках
    data value;
    int sep = -1; // странно, у ОДНОЙ из деклараций не равно -1
    // вместо FFFFFFFF — AB03
    // ОК, судя по всему, ссылка на класс
};

/*

data := int | float | char[] | code_offset;
// code_offset — количество байт от начала секции кода (func и instance)


type:
100 1001 0 101 000000000000
??? bmrc ? ttt ssssssssssss

где
b — функция движка
m — член класса
r — return
c — const
t — тип
s — количество аргументов/размер массива

enum type {
    void   = 0;
    int    = 1;
    float  = 2;
    string = 3;
    class  = 4;
    func   = 5;
    prototype = 6;
    instance  = 7;
}
*/

В самом конце — секция кода. Как я понял, Готика использует стековую виртуальную машину. Удалось распознать некоторые опкоды.

Код:
00 +  ADD
01 -  SUB
02 *  MUL
03 /  DIV
04 %  MOD
05 |  OR
06 &  AND
07 <  LESS
08 >  GREATER
09 =  SET_INT
0A [] ??
0B || OR_BOOL
0C && AND_BOOL
0D << LSHIFT
0E >> RSHIFT
0F <= LEQ
10 == EQUAL
12 => GEQ
13 +=
14 -=
15 *=
16 /=
3C RET
3D CALL         [ADDR]
3E CALL_BUILTIN [ADDR]
40 PUSHINT     [VALUE]
41 PUSHADR      [ADDR]
43 PUSHCLASS??  [ADDR]
46 SET_STRING
48 SET_FUNC??
49 SET_FLOAT
4A SET_CLASS??
4B JMP_FALSE
4C JMP
50 SET_FIELD??    [ADDR]
F5 PUSH_ARRAY?? [ADDR]
Ты бы лучше gothic.exe разобрал.
А по теме, оно тебе надо? читай https://worldofplayers.ru/threads/17989/unread

HeDeDe , если бубут какие либо предложения - скажи. Ты конечно проделал большую работу, но ИМХО бесполезную.
По этому читаю тему такой же. Возможно я не прав, но убедите меня в этом.
Не увижу нормальных доводов. Тему удалю.
Еще раз спасибо HeDeDe
 
Последнее редактирование модератором:

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
А по теме, оно тебе надо?
Не увижу нормальных доводов. Тему удалю.
На дикий беспредел в темах В2.0, по меркам правил этого форума, никто внимания не обращает. А тягу к познанию, что-то, что относится к Готике и модострою режут немедленно под корень. Странно это. Видно, что провозился человек не 3 часа, как заявил, а наверное все 30. Что плохого в том, что бы иметь все форматы файлов игры. Мне, например, очень интересно. Думаю, что не только мне.
ЗЫ Кстати, именно изучение форматов некоторых файлов позволило мне декомпилировать Готику версии 1.06l. До этого никто этого не смог сделать. Конечно, не велика сложность, но мне пришлось неделю потратить на изучение форматов нужных файлов. Если бы у меня были эти форматы, то я бы сэкономил неделю.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.172
Благодарности
6.153
Баллы
1.565
На дикий беспредел в темах В2.0, по меркам правил этого форума, никто внимания не обращает. А тягу к познанию, что-то, что относится к Готике и модострою режут немедленно под корень. Странно это. Видно, что провозился человек не 3 часа, как заявил, а наверное все 30. Что плохого в том, что бы иметь все форматы файлов игры. Мне, например, очень интересно. Думаю, что не только мне.
Я не спорю, и именно по этому я выражаю огромную благодарность за проделанную работу.
Я не спорю с твоим утверждением. Я лично, знаю все форматы ДАТов в готе, знаю что и как работает, знаю что и куда ссылается и т.д. Но что я не могу разобрать и поправить - дык это сам движок игры, т.е. gothic(2).exe и ему подобные.

На дикий беспредел в темах В2.0, по меркам правил этого форума, никто внимания не обращает. А тягу к познанию, что-то, что относится к Готике и модострою режут немедленно под корень. Странно это.
А по поводу возвращения, ну ты и сам знаешь, что за этим разделом у нас как такового модератора нет, и админы не всегда успеваю что-либо сделать.
А в разделе мордостроя есть я, злая наглая рожа... И не одна;)
 
Последнее редактирование модератором:

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
Я лично, знаю все форматы ДАТов в готе, знаю что и как работает, знаю что и куда ссылается и т.д.
Так может стоит поделиться этими знаниями, например, здесь на форуме.
Но что я не могу разобрать и поправить - дык это сам движок игры, т.е. gothic(2).exe и ему подобные.
Да, лет 10 понадобиться на подобное. Проще переписать, наверное. Или некоторые вещи исправлять с помощью SP, AST и им подобных.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.172
Благодарности
6.153
Баллы
1.565
Так может стоит поделиться этими знаниями, например, здесь на форуме.

Да, лет 10 понадобиться на подобное. Проще переписать, наверное. Или некоторые вещи исправлять с помощью SP, AST и им подобных.
Сам я уроки, к сожалению, писать не умею, могу только устно по рассказывать что и как. Но есть ведь и раздел уроков, да и на форуме у нас не малое количество мордостроителей, которые знают многое, и также не могут написать туторы... По этому я и прошу задавать вопросы, спрашивайте и вам обязательно ответят. Из скриптологов, знаю человек 7-8 на форуме, которые реально знают и разбираются. Текстурщики, тоже человек 5. А вот 3Д аниматоры-модельеры, их у нас мало и это плохо... вообще по пальцам перечесть 2-3 человека....
Так что спрашивайте, и мы постараемся вам помочь.)))

PS, как в рекламе сказал:D
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
о этого никто этого не смог сделать.
Да ?! А мне казалось что он декомпилируется нормально ? ::)

Так может стоит поделиться этими знаниями, например, здесь на форуме.
Может и можно было бы, но это не имеет смысла.

Да, лет 10 понадобиться на подобное.
У Вама как-раз столько и ушло на Дизасм движка.. решил повторить?! :D
Дорогу осилит идущий. *thumbs up*
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
Да ?! А мне казалось что он декомпилируется нормально ? ::)
Нет, не нормально (фраз в скриптах нет). Помнится мне мы уже об этом говорили.
Здесь https://worldofplayers.ru/threads/13198/page-243#post-803158
Может и можно было бы, но это не имеет смысла.
Говорит админ форума по модостроению в Готике. Слов нет... Если бы уже имеющиеся знания были более доступны, то желающих что то делать было бы больше.
У Вама как-раз столько и ушло на Дизасм движка.. решил повторить?! :D
:rolleyes: Нет, это не имеет смысла.
Сам я уроки, к сожалению, писать не умею, могу только устно по рассказывать что и как. Но есть ведь и раздел уроков
Я не про уроки по скриптам и моделированию. Я про форматы скомпилированных файлов.

ЗЫ А что касается HeDeDe, то ясно что компилировать можно и GS и игрой, но кто может ему запретить сделать свой компилятор? И, возможно, он будет лучше... Например, сможет компилировать и декомпилировать В2.0 *trollface*
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Я просто считаю, что хорошая программа должна быть одна. А мусор по ее мотивам пусть поляки клепают, они над этим делом уже лет 6 маяться, упертые.. :rolleyes:

Нет, это не имеет смысла.
А что тогда ? ;)

Например, сможет компилировать и декомпилировать В2.0 *trollface*
А-а.. Могу лишь пожелать удачи в начинании.. *right*
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
Я просто считаю, что хорошая программа должна быть одна. А мусор по ее мотивам пусть поляки клепают, они над этим делом уже лет 6 маяться, упертые.. :rolleyes:
Что то я уже ничего не пойму. Какая программа должна быть хорошей и над чем поляки мучаются?
некоторые вещи исправлять с помощью SP, AST и им подобных.
-
А-а.. Могу лишь пожелать удачи в начинании.. *right*
Присоединяюсь :)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.802
Баллы
995
Какая программа должна быть хорошей и над чем поляки мучаются?
Сурсер, он таковой и является.. а поляки и иже с ними пытаются родить гибрид на осьми колесах.. :D
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
t — тип, известны следующие типы: enum type { void = 0; int = 1; float = 2; string = 3; class = 4; func = 5; prototype = 6; instance = 7; }
float = 1;
int = 2;
Код:
class CCAMSYS
{
    var float bestrange;
...
    var int collision;
};

CCAMSYS.BESTRANGE
01 00 00 00
43 43 41 4D 53 59 53 2E 42 45 53 54 52 41 4E 47 45 0A
00 00 00 00
01 10 44 00 == 441001 == 010001000 001 000000000001 (FLOAT)
00 00 00 F1
10 00 00 0E
01 00 08 00
A9 00 00 00
17 00 00 E1
01 00 00 00

CCAMSYS.COLLISION
01 00 00 00
43 43 41 4D 53 59 53 2E 43 4F 4C 4C 49 53 49 4F 4E 0A
58 00 00 00
01 20 C4 00 == C42001 == 110001000 010 000000000001 (INT)
00 00 00 00
29 00 00 10
01 00 F0 11
89 03 00 0F
17 00 00 FF
01 00 00 00
 
Последнее редактирование:

HeDeDe

Участник форума
Регистрация
17 Авг 2009
Сообщения
203
Благодарности
79
Баллы
180
Упс, в форме ответа остался недописанный ответ…

Покопавшись в функциях движка, разобрался до конца с Gothic.dat. Массив в начале — это номера символов, отсортированные по их именам. В общем-то можно было догадаться и без ковыряния в движке, но я не догадался::).

А по теме, оно тебе надо?
ЗЫ А что касается HeDeDe, то ясно что компилировать можно и GS и игрой, но кто может ему запретить сделать свой компилятор? И, возможно, он будет лучше... Например, сможет компилировать и декомпилировать В2.0 *trollface*
Я начинал его писать для себя — он полностью написан с нуля мной, а следовательно я могу его использовать как захочу ;)

Декомпиляция в изначальные планы не входила — об этом буду думать, после того, как допишу компилятор.

Уже есть почти готовый парсер, сейчас он может прожевать скрипты, на выходе выдавая синтаксическое дерево.
(В общем-то он сейчас обрабатывает все скрипты, кроме Classed.d из GMDK. Пока что парсер не принимает объявление нескольких переменных в одном выражении "VAR INT guild,level;").

Писать с нуля. Сейчас сожалею, что не предложил свою помощь, когда были активны такие проекты.

Сурсер, он таковой и является.. а поляки и иже с ними пытаются родить гибрид на осьми колесах.. :D
Хмм… Стало любопытно, что они там слепить пытаются. :D

Да, действительно :)
 

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
Уже есть почти готовый парсер, сейчас он может прожевать скрипты, на выходе выдавая синтаксическое дерево.
Интересно в код заглянуть :{. Какие инструменты использовал?
Хмм… Стало любопытно, что они там слепить пытаются. :D
Аналогично.
 

HeDeDe

Участник форума
Регистрация
17 Авг 2009
Сообщения
203
Благодарности
79
Баллы
180

Gor

Участник форума
Регистрация
26 Дек 2009
Сообщения
977
Благодарности
543
Баллы
245
полностью разобрал формат
Вчера заглянул в икарус в файл zCParser_Rus.d и заулыбался. Там вся инфа по парсеру вообще и по символам в частности. Я так понял, что автор икаруса плотно общался с Нико, программером пираний, так что инфа достоверная. Да и это понятно, ведь сам икарус работает через парсер. Дополни свою информацию.
 

Вложения

  • zCParser_Rus.zip
    4,4 KB · Просмотры: 137

shilons

Участник форума
Регистрация
28 Авг 2022
Сообщения
11
Благодарности
2
Баллы
30
Решил отредачить текст НПС в Готике 2, скачал Gothic Source v3.14 Создал новый проект но не могу найти Gothic.dat
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
shilons, Gothic.dat находится в .mod-файле, который надо распаковать с помощью программы GothicVDFS. Находитcя по пути _work\tools\VDFS\
 

shilons

Участник форума
Регистрация
28 Авг 2022
Сообщения
11
Благодарности
2
Баллы
30
shilons, Gothic.dat находится в .mod-файле, который надо распаковать с помощью программы GothicVDFS. Находитcя по пути _work\tools\VDFS\
Это я уже понял. Но не поможет, попытался. Нужны исходники, а Мильтен, который переводил игру, и которому разрабы дали эти исходники, в сети был аж год назад
 
Сверху Снизу