Немного о репутации / X Rebirth
X Rebirth
x-rebirth.x3tc.net
X Rebirth  
 

Форум X Rebirth:


    10.06 Вопросница по X-Rebirth
    17.01 X Rebirth Lost Sectors Mod
    17.04 Вопросница по скриптам и модам для X-Rebirth
    15.09 Собрание скриптов и модов для X Rebirth
    21.09 Технические проблемы X Rebirth
    13.09 Мод "Меню строительства кораблей" (релиз)
    29.08 Захват и абордаж в X-Rebirth
    04.02 Русский перевод X-Rebirth
    19.10 Патчи, фиксы, ченджлоги
    04.09 Планы, дела, с кем воюем, что имеем, сколько денег, часы игры и т.д.

Форумы X:


    14.05 X3: Farnham's Legacy
    20.04 Вопросница по чистой игре X3:TC
    15.04 Прохождение X3: Farnham's Legacy.
    12.04 ПОЗДРАВЛЯЛКИ
    09.04 Арес
    04.04 Мод X3AP "Горизонт открытий"
    29.03 ТрактирЪ "День дурака"
 

Немного о репутации


Автор: eliseeff

Cоответствие цифровых значений репутации в игре значениям, показываемым в игровом интерфейсе.



Попросили тут у меня консультацию по вопросу цифровых значений репутации в игре. Казалось бы, все просто: в игровых файлах достаточно четко сформулированы правила пересчета внутриигровых значений репутации в те, что показываются пользователю. Однако при пристальном рассмотрении вопросы полезли как червячки, в результате чего пришлось лезть глубже, чем предполагалось, а в итоге появилась эта статья.

Немного истории.



Ни для кого, наверное, не является секретом, что репутация внутри игры и значение, показываемое нам в интерфейсе - это разные величины, хотя и жестко связанные между собой. Внутриигровое значение линейно. Когда бы вы ни убили врага - вы всегда получите одинаковый прирост репутации. Выводимое же пользователю значение высчитывается из внутриигрового по логарифмической шкале. Что это значит? А то, что для того чтобы повысить показываемую вам репутацию с 10 до 20, вам придется повысить внутриигровую на значение, в 10 раз больше, чем когда вы поднимаете репутацию с 0 до 10. А с 20 до 30 - еще в 10 раз больше.

Это общепринятая практика, так было не только в "иксах", а чуть ли не в любой игре. Пусть и без логарифмической шкалы, но чем выше уровень - тем больше надо набрать очков до следующего. Так же было и в старых "иксах", только до третьих "иксов" внутриигровое значение имело достаточно большие, целые величины (от -1 000 000 до +1 000 000). Начиная же с X Rebirth внутриигровое значение изменяется от -1 до +1 и стало значением с плавающей точкой.

Вернемся к постхребтовым реалиям.



Итак, что нам пишут разработчики в игровых файлах? А пишут они вот что:

(+) самое начало файла libraries/factions.xml


Прежде всего определимся с терминами: uivalue - это значение репутации, которое мы видим в интерфейсе. Имеет целые значения от -30 до +30.  А вот relation - это внутриигровое значение репутации, которое мы в игре не видим, но игра работает только именно с ними. Значения - от -1 до +1, с плавающей точкой.

Итак, разработчики сообщают нам, что ими принято несколько жестко фиксированных значений соответствий между relation и uivalue. Между этими значениями соответствия рассчитываются либо линейно (на небольшом участке между -0.0032 и +0.0032), либо по приведенным ими формулам (во всем остальном диапазоне).

Ну, вроде бы и ясно все... Но это лишь на первый взгляд. До тех пор, пока мы не возьмем калькулятор и не посчитаем. Ну, со значениями 1, 0.1 и 0.01 вроде бы все просто: они даже под формулы ложатся идеально. Допустим, пересчитаем relation = 0.1 в uivalue.

Как там у них? uivalue = 10 * log10(relation * 1000)

Ну, подставляем:

uivalue = 10 * log10(0.1 * 1000) = 10 * log10(100) = 10 * 2 = 20

Сошлось, ура!

Погодите радоваться... На самом деле даже с этим значением мы потом обломаемся, но об этом позже.

А сейчас пока посчитаем для relation = 0.32. Егософты утверждают, что у нас должно получиться 25. Ну, считаем:

uivalue = 10 * log10(0.32 * 1000) = 10 * log10(320) = 10 * 2.5051499783199059760686944736225 = 25.051499783199059760686944736225

Ну, если приблизительно... - скажете вы?

А ну-ка, обратно посчитаем: из uivalue = 25 в relation. Опять же, по их формуле relation = 10^(uivalue / 10) / 1000

relation = 10^(25 / 10) / 1000 = 10^(2.5) / 1000 = 316.22776601683793319988935444327 / 1000 = 0.31622776601683793319988935444327

Оппа! Вот оно как, Михалыч!

Нет, "на глазок" - это, конечно, здорово, но что будет происходить между этими "фиксированными точками" и реальными? Когда "по формуле" одно значение, а "по точкам" - другое? Ведь "по формуле", например, 0.318 - это уже +25, а "по точкам" - еще нет... И как с этим бардаком разбирается игра?

И понял я, что надо проверять это на практике, прямо в игре.

С командами преобразований в скриптах очень бедно, я вам скажу. Что в MD/AI, что в lua. Единственное, что нашлось - это получение в MD uivalue из relation. Черный ящик. Как считает - черт его знает. Кинул число - она в тебя кинула другое. Сделал простенький цикл - и вычислил "реальные точки". Поскольку в сейвах больше шести значащих разрядов я никогда не встречал - значения искал с точностью именно до 6 значащих цифр.

Вот что получилось:

relationuivalue
0.99999830
0.79621329
0.63395628
0.50476527
0.40190126
0.3225
0.25358324
0.20095123
0.15924322
0.12619221
relationuivalue
0.099999820
0.079621319
0.063395618
0.050476517
0.040190116
0.03215
0.025358314
0.020095113
0.015924312
0.012619211
relationuivalue
0.0099999810
0.007962139
0.006339568
0.005047657
0.004019016
0.00325
0.002564
0.001923
0.001282
0.000641

Заключение.



Что мы видим в результате? А то, что действительность абсолютно не соответствует написанному разработчиками, за исключением пары мелочей. Достоверна информация о точках 0.32, 0.032 и 0.0032, а также о линейности преобразования на участке -0.0032 - +0.0032. Даже с 1, 0.1 и 0.01 - не соответствует действительности. Предваряя возможные вопросы: да, я пробовал прописать в сейве relation = 0.999998 и загрузить в игру. Она исправно написала мне +30...

Другие значения с "фирменными" формулами тоже не совпадают. Например, "по формуле" репа +28 соответствует значению 0,63095734448019324943436013662234. На самом деле в игре - 0.633956.

Вывод: информация в libraries/factions.xml не соответствует действительности, а лишь приблизительна. В реальности точный алгоритм пересчета другой и мне он неизвестен. Однако зная точные значения, приведенные в таблице, получить uivalue из relation (и наоборот) достаточно просто. Находим ближайшее значение по модулю (без знака) relation, равное или меньшее нашему - и смотрим, какому значению uivalue оно соответствует. При отрицательном исходном значении - добавляем минус. Пересчет в обратную сторону - тоже аналогично.



 * - Информация полностью применима к X4:Foundations.

Автор: eliseeff
Добавил(а): eliseeff
Создано: 12.07.2020
Изменено: 24.05.2021
Количество изменений: 7
Просмотров: 636

Оценка читателей: 0
Количество оценок: 0
Вы можете поставить оценку:
 1   2   3   4   5 

BBCode:
[url=https://x-rebirth.x3tc.net/nemnogo-o-reputacii_26100]Немного о репутации[/url]
При полном или частичном использовании материалов сайта активная (прямая) ссылка на x-rebirth.x3tc.net обязательна.
Внимание! На сайте строго запрещается затрагивать/обсуждать/ссылаться на всевозможные незаконные программы и способы, позволяющие обойти/взломать (и т.п.) защиту игры X Rebirth - т.н. крэки (crack, а также: nocd, nodvd и другие). Attention! On this site forbidden any discussions of crack programs for X Rebirth (any cracks, nocd, nodvd etc).