Принцип нумерации сборок

Материал из S.T.A.L.K.E.R. Wiki
Перейти к: навигация, поиск
Принцип нумерации сборок
NODATA anim.gif
Изображение отсутствует
ИграСборки
S.T.A.L.K.E.R.: Тень Чернобыля
СложностьСредняя

При компиляции библиотеки xrCore.dll движка X-Ray, в неё записывается дата компиляции. Именно на её основе при запуске и рассчитывается номер сборки. Номер и дату компиляции мы видим в самом начале лог-файла.

Используемый в сборках алгоритм, имеет один существенный недостаток: если месяц компиляции лежит в интервале от января до июня включительно, номера сборок за, например, 19 января и 19 мая, одинаковы, что создаёт путаницу. Позднее, алгоритм был скорректирован.

Алгоритм старого метода[править | править код]

Используется во всех сборках ТЧ, а также в финальной версии ТЧ до версии 1.0001.

days = {0, 0, 0, 0, 0, 0, 0, 31, 62, 92, 123, 153} // число дней с начала июля
0 <= m <= 11
num = 365*(y - 1999) + days[m] + d;

Пояснения[править | править код]

Строка days = {0, 0, 0, 0, 0, 0, 0, 31, 62, 92, 123, 153} означает, что задаётся массив (группа элементов), элементы которого — число дней с начала июля; отрицательные числа заменяются нулями. Именно из-за такой структуры массива, номера сборок не уникальны.

Конкретный элемент из такого массива можно «вытащить» путём обращения к нему через порядковый номер (индекс). Обратите внимание, в программировании счёт начинается с нуля, поэтому первый элемент массива days имеет индекс 0 (ноль).

Строка 0 <= m <= 11 означает, что для переменной m, означающей номер месяца, задаётся интервал возможных значений, в данном случае от 0 до 11.

Дальше, собственно, идёт формула для расчёта номера. Переменная y — текущий год; d — текущий день. Конструкция days[m] означает, что происходит обращение в массив days, и из него извлекается элемент с номером m, где m — номер текущего месяца.

Алгоритм нового метода[править | править код]

Используется в единственной сборке ЧН, а также в финальных версиях ТЧ, начиная с версии 1.0002; и всех версиях ЧН и ЗП.

days = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 303, 334, 365} // число дней с начала года
0 <= m <= 11
num = 365*(y - 1999) - 31 + days[m] + d

Принцип аналогичен.

Невозможные номера[править | править код]

На старом алгоритме расчёта номера сборки, некоторые номера невозможно получить. Ниже указаны граничные сборки и не охватываемые алгоритмом интервалы, до 2007 года включительно. В 2007 году алгоритм был заменён на новый, который «невозможных» номеров не имеет.

Граничные сборки[править | править код]

'xrCore' build 184, Dec 31 1999
'xrCore' build 366, Jan 1 2000
'xrCore' build 549, Dec 31 2000
'xrCore' build 731, Jan 1 2001
'xrCore' build 914, Dec 31 2001
'xrCore' build 1096, Jan 1 2002
'xrCore' build 1279, Dec 31 2002
'xrCore' build 1461, Jan 1 2003
'xrCore' build 1644, Dec 31 2003
'xrCore' build 1826, Jan 1 2004
'xrCore' build 2009, Dec 31 2004
'xrCore' build 2191, Jan 1 2005
'xrCore' build 2374, Dec 31 2005
'xrCore' build 2556, Jan 1 2006
'xrCore' build 2739, Dec 31 2006
'xrCore' build 2921, Jan 1 2007
'xrCore' build 3104, Dec 31 2007 

Интервалы неохвата[править | править код]

185 - 365
550 - 730
915 - 1095
1280 - 1460
1645 - 1825
2010 - 2190
2375 - 2555
2740 - 2920

Дата в библиотеке[править | править код]

НЕ актуально для сборок финальной версии Чистого Неба и выше

Для того чтобы узнать номер сборки, необязательно её запускать. Как уже было сказано выше, дата компиляции записывается в библиотеке xrCore.dll. Поэтому, её можно прочитать если просматривать библиотеку при помощи HEX-редактора.

Практика показала, что дата компиляции находится примерно в середине файла. Но искать «вручную» нужное место достаточно сложно, поэтому гораздо проще вести поиск по какому-нибудь ключевому слову. Известно, что строка, выводимая в лог, имеет вид 'xrCore' build 1935, Oct 18 2004.

Название библиотеки искать бессмысленно — оно встречается десятки раз в строках вида P:\xrCore\LocatorAPI.cpp. Слово build также встречается несколько раз, например так: $build_copy$. Значит, надо что-то другое. Можно предположить, что где-то недалеко от даты компиляции должен быть массив с начальными буквами английских названий месяцев. Именно его мы и попробуем найти, используя как ключевое слово три начальные буквы английского названия любого месяца[1].

Для примера, будет произведён поиск по ключевому слову Apr (байты 41 70 72). Файл используется от одной очень известной сборки.

Итак, найдено первое включение нашего ключевого слова. Видим строку Dec Nov Oct Sep Aug Jul Jun May Apr Mar Feb Jan, в которой все трёхбуквенные сочетания разделены нулевым байтом.

Тот самый массив найден. А это означает, что мы почти на месте. Несколько дальше, проскользнут слова build и xrCore. Именно их мы видим в логе. А дальше расположена искомая дата: Oct 18 2004 (байты 4F 63 74 20 31 38 20 32 30 30 34).

Попробуем рассчитать номер сборки.

Для начала надо определить алгоритм. Практика показала, что смена алгоритма произошла где-то между 22 марта и 27 апреля 2007 года, поэтому если год младше 2007 — можно смело использовать старый алгоритм. В этот интервал попадают все сборки, кроме 3120.

В нашем случае номер года — 2004, поэтому алгоритм явно старый. Порядковый номер месяца октября — десятый. В массиве, указанном в описании старого алгоритма, видно что десятый элемент (число дней с начала июля) равен 92.

Итого, подставляем в формулу и получаем: 365 × (2004 - 1999) + 92 + 18 = 1935

Иногда может быть так, что библиотека ядра не одна. Например, в 1935 сборке есть xrCore.dll и xrCoreB.dll. Собственно, практика показала что xrCore.dll используется для игры, а xrCoreB.dll предназначена для SDK.

Примечания[править | править код]

  1. ^ Искать по буквам May не рекомендуется — это английское слово, встречающееся несколько раз.