-
Notifications
You must be signed in to change notification settings - Fork 20
/
lastqm.txt
197 lines (186 loc) · 12.5 KB
/
lastqm.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
Вообще эта расшифровка формата, точно работает только в последней версии *.qm,
В остальных возникают ошибки (в папке Game квесты с 24 параметрами, в папке Example я не разобрался).
Легче просто открыть последним ТГЕ и сохранить заново.
ПРИМЕЧАНИЕ:
1. ЕСЛИ ВЫ ВСТРЕЧАЕТЕ ВЫРАЖЕНИЕ "ПРИМЕЧАЕМ БАЙТ" ИЛИ ВРОДЕ ЭТОГО, ЭТО ЗНАЧИТ ЧТО СЛЕДУЮЩИЕ СМЕЩЕНИЯ ПОЙДУТ ОТНОСИТЕЛЬНО ПРИМЕЧАЕМОГО БАЙТА. (примечаемый байт-последний считанный нами байт).
2- "ПЕРЕПРЫГИВАЕМ ТЕКСТ" ОЗНАЧАЕТ, ЧТО К ТЕКУЩЕЙ ПЕРЕМЕННОЙ, ХРАНЯЩЕЙ В СЕБЕ ПОЗИЦИЮ БАЙТА (ЭТО ЕСЛИ ПРОГУ ПИШЕМ) ДОБАВЛЯЕМ ДЛИНУ ТЕКСТА * 2, И, КОНЕЧНО, ЗАНОСИМ ЭТОТ ТЕКСТ КУДА НАДО (ЕСЛИ НАДО)
3- Чтобы задать несколько рас, которые дают квест (или возможные расы игрока) нужно просто просуммировать нужные расы, например: пеленги и люди = 06
Номера байт в dec:
[1..4] D3 35 3A 42
[5..8] 00 00 00 00 Наверное эти байты указывают на версию файла qm. Они такие почти в любом квесте (а где не такие там можно легко переконвертить)
9 - Раса, дающая квест (00-никто,01-малоки,02-пеленги,04-люди,08-фэй,10-гаальцы)
10-Когда квест считать выполненным (00-после прибытия, 01-сразу-же)
15-На чьей планете выполняется квест (00-нигде,01-малоки,02-пеленги,04-люди,08-фэй,10-гаальцы,40-незаселенная)
20-Статус игрока (01-торговец,02-пират,04-воин)
25-Раса игрока (та же нумерация как и у байта 9)
[26-29]-отношение к игроку. Само число в первом байте. если 27-29=FF FF FF то число равно {0 минус число}, если 00 00 00 - {0 плюс число}
[50-53]-Проходимость переходов по умолчанию (0-безконеч, остальное-число)
[54-57]-Сложность квеста в процентах
38,42-Размер зерна сетки верх,низ (0A,08 - самый крупный; 0F,0C - крупный; 16,12 - средний; 1E,18 - мелкий)
ПОСЛЕ 57 БАЙТА НАЧИНАЕТСЯ ПЕРВЫЙ ПАРАМЕТР. ДАЛЕЕ УКАЗЫВАЕТСЯ СМЕЩЕНИЕ ОТНОСИТЕЛЬНО 57-БАЙТА
НЕ ЗАБЫВАЕМ ЧТО ФОРМАТ ТЕКСТА - ЮНИКОД, => НА 1 СИМВОЛ УХОДИТ 2 БАЙТА
ПРОБЕЛ В ТЕКСТЕ - 2 БАЙТА: 20 00
АБЗАЦ - 4 БАЙТА: 0D 00 0A 00
______________________________________________________________________
СМЕЩЕНИЯ 1:
[1-4]-Минимальное значение параметра
[5-8]-Максимальное значение параметра
[9-12]-Среднее значение с округлением в меньшую: (min+max)\2 (не всегда ср.знач, не знаю зачем, при изменении в hex-редакторе ничего не происходит)
13-Тип параметра (00-Обычный, 01-Провальный, 02-Успешный, 03-Смертельный)
18-Показывать-ли параметр при нуле: (00-Не показывать, 01-Показывать)
19-Критическим является: (00-Максимум ,01-Минимум)
20-Активен-ли параметр, т.е есть ли слева от его галка (01-активен, 00-нет)
21-Сколько у параметра строк вывода в игре (по диапазонам)
25-Является ли параметр деньгами игрока (00-нет, 01-да)
[30-33]- Длина рабочего названия параметра
Далее - само рабочее название параметра в unicode. Чтобы узнать где оно заканчивается, умножаем число, заключенное в байтах [30-33] на 2. Приметьте номер получившегося байта. Теперь я буду вести смещение относительно его.
_________________________________________________________________-
СМЕЩЕНИЯ 2:
[1-4]-Диапазон "от" первой строки вывода значений параметра по диапазонам
[5-8]-Диапазон "до" первой строки вывода значений параметра по диапазонам
[9-12]-Я не имею понятия, за что отвечают эти байты (они равны 01 00 00 00), потому пропускаем
[13-16]- длина первой строки вывода значений параметра по диапазонам
Перепрыгиваем через этот текст, предварительно высчитав его длину. Относительно полученного байта будем вести отсчет в любом из следующих случаев.
Байт 21 (по смещению относительно 57 байта) сказал нам сколько у параметра строк вывода в игре по диапазонам.
Проверяем, сколько же их, если еще не проверили. Если эта была не последняя строка, то дуем на СМЕЩЕНИЯ 2, и повторяем. Иначе:
________________________________________________________________
СМЕЩЕНИЯ 3:
[1-4]-равны 01 00 00 00. Не знаю почему, поменяй их, и ТГЕ вылетает с ошибкой.
[5-8]-указывает на длину "сообщения, выводимого при достижении параметром критического значения".
ЕСЛИ эти байты равны 00 00 00 00, то этого текста нет (параметр имеет тип "обычный", впрочем даже в этом случае текст есть, он стандартный). В ЭТОМ СЛУЧАЕ следующие 4 байта будут 01 00 00 00 (не знаю почему). Далее смотри СЛЕДУЮЩИЕ 4
ИНАЧЕ это длина текста достижения параметром своего крит. значения. В ТАКОМ СЛУЧАЕ перескакиваем через текст. следующие 4 байта будут 01 00 00 00 (не знаю почему). Далее смотри СЛЕДУЮЩИЕ 4
________________________________________________________________
СЛЕДУЮЩИЕ 4:
Следующие 4 укажут на длину стартового значения параметра + 2 (т.к оно записано как текст в формате unicode и расположено между "[" и "]"). Почему не просто 4 байта? Оно ведь может являться еще и формулой, например: [1..100], 20 mod [1..3]
Примечаем номер байта, который является последней буквой стартового значения (не забываем что это юникод и после нашего 5D идет 00). Разбор параметра закончен. Дуем на СМЕЩЕНИЯ 1. И так вплоть до 48 параметра
После 48 параметра начинаются...
________________________________________________________________
СТРОКОВЫЕ ПОДСТАНОВКИ:
ПРИМЕЧЕННЫЙ НАМИ В ПОСЛЕДНЕМ ПАРАМЕТРЕ БАЙТ ОСТАЕТСЯ В СИЛЕ. ОТНОСИТЕЛЬНО ЕГО МЫ ВЕДЕМ ДАЛЬНЕЙШЕЕ СМЕЩЕНИЕ. ЕСЛИ ВМЕСТО КАКОЙ-ЛИБО СТРОКОВОЙ ПОДСТАНОВКИ СТОИТ ПУСТАЯ СТРОКА, ТО ВМЕСТО ПУСТОЙ СТРОКИ БУДЕТ КАКОЙ-ТО ЛЕВЫЙ ЮНИКОД. ПРОСТО НЕ СТАВЬТЕ ПУСТЫЕ СТРОКИ! (К ТОМУ-ЖЕ ЭТО НИКОГДА И НЕ НАДО)
[1..4]-01 00 00 00 (я наверное надоел вам своим "почему-не знаю" потому рискну сделать предположение: - это какой-то флаг :))))
[5..8]-длина строковой подстановки "<ToStar>"
После сама подстановка. А ПОСЛЕ ЕЕ ИДУТ 8 БАЙТ НА ДВЕ ЛЕВЫХ ПЕРЕМЕННЫХ, И 36 БАЙТ ЛЕВОГО ЮНИКОДА (КАЖЕТСЯ, ОНИ СВЯЗАНЫ С <PARSEC> И <ARTEFACT>, ЕСТЬ 2 ТАКИЕ НЕУПОМЯНУТЫЕ СТРОКОВЫЕ ПОДСТАНОВКИ.). КОРОЧЕ ПРИМЕТИЛИ БАЙТИК (СТАРОЕ ЗНАЧЕНИЕ + 44)
[1..4]-01 00 00 00 (???)
[5..8]-длина строковой подстановки "<ToPlanet>"
Перепрыгиваем через текст.
[1..4]-01 00 00 00 (???)
[5..8]-Длина "<Date>"
Перепрыгиваем через текст.
[5..8]-Длина "<Money>"
Перепрыгиваем через текст.
[5..8]-Длина "<FromPlanet>"
Перепрыгиваем через текст.
[5..8]-Длина "<FromStar>"
Перепрыгиваем через текст.
[5..8]-Длина "<Ranger>"
Перепрыгиваем через текст
ПРИМЕЧАЕМ БАЙТ
[1..4]-Общее количество локаций в квесте
[5..8]-Общее количество переходов в квесте
[9..13]-01 00 00 00 (???)
ПРИМЕЧАЕМ БАЙТ
[1..4]-Длина текста поздравления (в правительстве).
Перепрыгиваем через текст + еще 4 байта (01 00 00 00 ;-)) Примечаем байт
[1..4]-Длина текста задания в правительстве
Добавляем к счетчику 8
Примечаем байт
ВСЕ, ЗАГОЛОВОК ФАЙЛА РАЗОБРАН!
______________________________________________________________
ЛОКАЦИЯ
ПРИМЕЧЕННЫЙ БАЙТ ОСТАЕТСЯ В СИЛЕ
Номера байт в dec:
[1..4] - прошел один день (01-да, 00-нет)
[5..8] - Координата - x локации (как-то связана с размером зерна сетки, как именно, предстоит выяснить тому, кто будет писать программу)
[9..13] - Координата - y локации (тоже)
[14..17] - Номер локации
18 - Тип локации (00-обычная, 01-стартовая)
19 - Тоже тип (00-обычная, 01-успешная)
20 - И еще тип (00-обычная, 01-смертельная)
21 - Рейнджер погибает? (если локация провальная, и байт= 01 то да, если 00 - то нет)
22 - Еще один тип (00-обычная, 01-пустая)
ПРИМЕЧАЕМ БАЙТ
______________________________________________________
СМЕЩЕНИЯ 5:
Добавяем к примеченному числу 12 (не знаю, зачем эти байты, в редакторе ничего не меняется)
ПРИМЕЧАЕМ БАЙТ
[1..4]-Число, добавляемое к параметру №1 (если отриц. то вычитаемое)
5 - Отображение параметра (00-не трогать, 01-показать, 02-скрыть)
10 - Поставлена ли точка в "проценты" (01-да,00-нет; К параметру добавиться число процентов заключенное в [35..38])
11 - Поставлена ли точка в "значение" (01-да, 00-нет; параметр примет значение, заключенное в [35..38], значение в 44 игнорируется, но редактор их так и так в ноль поставит)
12 - Поставлена ли точка в "выражение" (01-да, 00-нет; параметр примет значение в результате выполнения формулы, значения в [1..4], 10,11 игнорируются)
[13..16] - 01 00 00 00(наш любимый флаг)
[17..20]-Длина математического выражения (если длина - 0, то его попросту нету, и нужно преобразовывать параметр, в зависимости от байтов [1..4],10,11). Заливаем формулу куда нужно, перепрыгиваем через текст (если формулы нету то не перепрыгиваем) и добавляем к полученному числу 14.
Далее идет левый текст (повторяет сообщения о достижении критического значения параметром), в случае ели это критический параметр, в остальных случаях нулевой длинны (но 4 байта, указывающие длину все равно есть).
ПРИМЕЧАЕМ БАЙТ
Дуем на СМЕЩЕНИЯ 5. И повторяем так до 48 параме(тра
______________________________________________________________
СМЕЩЕНИЯ 6
ПРИМЕЧЕННЫЙ БАЙТ ПОСЛЕ ПОСЛЕДНЕГО ПАРАМЕТРА В СИЛЕ
[1..4]-01 00 00 00
[5..8]-Длина первого текста локации
Далее идет первый текст локации. Перепрыгивам через него и примечаем байт
[1..4]-01 00 00 00
[5..8]-Длина второго текста локации (если длина-ноль то его нету, и следующие 4 байта 01 00 00 00 ("флаг" следующего текста))
Перепрыгиваем через текст и примечаем байт
[1..4]-01 00 00 00
[5..8]-Длина третьего текста локации
И так до десяти.
ПРИМЕЧАЕМ ПОСЛЕДНИЙ БАЙТ ТЕКСТА
_____________________________________________________________
СМЕЩЕНИЯ 7
1 - Как выбирать текст локации (01-По формуле, 00-По порядку)
[2..5]-Понятия не имею
[6..9]-01 00 00 00 (изменение в 0 приводит к out of memory, что-то новенькое)
[10..13]-Длина чего-то такого, о чем я понятия не имею (текст наверно юникод, я наполовину забивал его нулями, но в редакторе нигде никаких изменений)
Перепрыгиваем через этот текст и примечаем байт.
[1..4]-01 00 00 00 (no comments)
[5..8]-Длина еще одного текста (он повторяет первое описание локации, при изменении - ничего), назначение которого мне не ясно
Перепрыгиваем через текст. Если 00 00 00 00, то текста этого нет. ПРИМЕЧАЕМ БАЙТ
[1..4]-01 00 00 00 при изменении на ноль вылет с out of memory.
[5..8]-Длина формулы выбора текста локации (если 00 00 00 00, то формулы нет.)
Перепрыгиваем текст, если он есть. ПРИМЕЧАЕМ БАЙТ
Дуем на ЛОКАЦИЯ. Байты [1..4],[5..8] что находятся после строковой подстановки <Ranger> cказали сколько в квесте локаций. Поэтому дуем на ЛОКАЦИЯ пока не разберем все локации (если это надо, возможно принцип программы будет другой). Т.е фишка в том что сперва идут все локации, а только затем все переходы.
ПЕРЕХОДЫ
Итак, мы разобрали все локации (если это нужно). Последний примеченный байт (тот что после формулы выбора текста последней локации) остается в силе
[1..8]-Приоритет перехода (там какие-то формулы используются для высчитывания реального приоритета, например приоритет 1 это 00 00 00 00 00 00 F0 3F.)
(Эти 8 байт занимает число в плавающей запятой (float или double (в зависимости от компилятора))
[9..12]-Прошел ли при переходе один день (01 00 00 00 - да, 00 00 00 00 - нет)
[13..16]-Номер перехода (P1, P5, P100)
[17..20]-Из какой локации выходит переход (номер локации)
[21..24]-В какую локацию ведет переход
25-Влият на цвет перехода, но только если не 00 (не влияет на его тип, например был белый, стал синий, но по-прежнему остался "переходом с описанием")
26-Всегда ли показывать? (01-Да, 00-нет)
[27..30]-Проходимость перехода (00 00 00 00 - безконечно, иначе - число)
[31..34]-Порядок показа (от 00, до 09)
ПРИМЕЧАЕМ 34-БАЙТ: ДАЛЬШЕ ПОЙДУТ ИЗМЕНЕНИЯ ПАРАМЕТРОВ
СМЕЩЕНИЯ 8
[1..4]-при изменении - ничего
[5..8]-Параметр 1 необходимо иметь в диапазоне от: "значение"...
[9..12]-...в диапазоне до "значение"
[13..16]-Число, прибавляемое к параметру (по аналогии с локациями, но тут все несколько в другом порядке, поэтому распишу)
[17-20] Отображения параметра
21-неизв
22-проценты
23-значение
24-выражение
[25-26]-01 00 00 00
[27-31]-Математическое выражение(длинна + текст)
ПРИМЕЧАЕМ БАЙТ
[1-4] Количество чисел в принимает значение
5 - 01 - Принимает значение, 00-не принимает значение
[6-…] Числа в принимает значение (к-во в [1-4])
ПРИМЕЧАЕМ БАЙТ
[1-4] Количество чисел в кратно значение
5 - 01 - кратно значение, 00-не кратно значение
[6-…] Числа в кратно значение (к-во в [1-4])
ПРОПУСКАЕМ 4 БАЙТА
Далее идет левый текст (повторяет сообщения о достижении критического значения параметром), в случае ели это критический параметр, в остальных случаях нулевой длинны (но 4 байта, указывающие длину все равно есть).
, И ДУЕМ НА СМЕЩЕНИЯ 8. Так до 48-параметра
Разобрали все 48 параметров, отступили еще 8 байт и приметили байт?
[1..4] - 01 00 00 00 (флаг)
[5..8] - длина логического условия для совершения перехода (если нули, то нету условия, примечаем байт) перепрыгиваем через текст и примечаем байт
[1..4] - 01 00 00 00
[5..8]- длина "вопроса для совершения перехода" (если нули то нет текста, переход пустой, примечаем байт). перепрыгиваем через текст и примечаем байт
[1..4] - 01 00 00 00
[5..8] - Длина "описания перехода" (если нули то нет текста, примечаем байт) перепрыгиваем через текст и примечаем байт
ДУЕМ НА ПЕРЕХОДЫ (короче дальше идут все переходы, но! Считывать их всех может не надо, как и локации, зависит от принципа действия проги)