Загадка больших статсов в UFO: Enemy Unknown (1994)

в 13:17, , рубрики: openxcom, reverse engineering, дизассемблирование, игры, исследование программ
xcom stats

Большинство из нас, издавна игравших в старый добрый «UFO: Enemy Unknown», сталкивались (или по крайней мере знают) о случаях, когда статистика солдат залетает за 160 и устремляется в значения, которые переполняясь через 255, уходят в ноль.

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

В ходе исследования были проверены DOS версии 1.0, 1.2, 1.4, русская (переведенная), и Gold Edition. Т.е., буквально все имеющиеся.

Данный глюк наблюдался только в версии 1.0. Но, стоит отметить, что русифицированная версия была основана как раз на версии 1.0, поэтому получилось так, что наши многочисленные соотечественники сталкивались с этой ситуацией гораздо чаще, чем в остальном мире, т.к. она проскочила лишь мельком (патч 1.2 вышел достаточно быстро, буквально через месяц), а русификацию свежих версий уже никто не делал.

Фрагмент дизассемблированного кода geoscape.exe, отвечающий увеличения статсов по результату миссии (увеличение Time Units):

version 1.0

Смещения 2Ah и 35h относятся к соответственно Base TUs и TU Improvement

В версии 1.2 код уже выглядел слегка иначе:

version 1.2

Обратите внимание, ключевое тут — JZ/JLE.
JZ — переход, если результат нулевой (эквивалентный).
JLE — переход, если результат меньше или эквивалентен.

Получается, что изначально разработчики допустили ошибку новичка: сделали проверку на лимит без запаса, при том, что значение может прыгнуть на более, чем 1.

Т.е., в случае «TUs», рост ограничивался только если он точно попадал в 80.

Все, кто играли в обновленные или не русифицированные версии, с данным глюком уже не сталкивались.

Автор: Volutar

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js