"Офигенный" рассказ как я победила софтлок в Star Wars Jedi: Survivor и немного прифигела с "оптимизации" игры
Третьего дня играя в Star Wars Jedi: Survivor я получила софтлок в локации Поющие руины. Ворота на видео должны быть открыты. Из-за чего игра стала непроходимой.
А в игре один сейв на игру... Откатиться на более ранний сейв нельзя.¯\_(ツ)_/¯
И выбор стоит либо искать сейв после этого места в Интернета, либо проходить игру на YouTube. Так себе варианты...
А потом я внезапно вспомнила, что я немного программист. И всего то надо найти переменную в оперативке отвечающую за локацию актора игрока на уровне, изменить её на 10 метров в нужную сторону и всё: софтлок побеждён!
В общем, вооружившись Cheat Engine и Artmoney я нашла адреса памяти хранящие локацию игрока на уровне. Таких адресов оказалось 354...
Надо объяснить непрограммистам что объекты в видеоиграх хранят ссылки друг на друга в специальных переменных, указателях. И для расчёта состояния объекта, зависящего от локации игрока нет необходимости держать в этом объекте значение этой локации: хватит указателя.
Да, редко значение одной и той же переменной в ОЗУ может использоваться по несколько раз. Например когда объект отвечающий за UI копирует в своё поле значение здоровья игрока из соответствующего объекта, а не ссылается на него указателем. Но это случается редко.
Все кто не раз пользовался Artmoney знают эту особенность игр и не удивляются, когда пытаются найти в оперативке адрес здоровья или золота, а находят несколько адресов с повторяющимся значением.
Для каких целей надо каждый тик копировать локацию игрока в 353 объекта? В чём смысл? Программисты Respawn не знают про указатели и референсы в C++?
А потом кто-то удивляется плохой оптимизации этой игры.