Большинство из нас, издавна игравших в старый добрый «UFO: Enemy Unknown», сталкивались (или по крайней мере знают) о случаях, когда статистика солдат залетает за 160 и устремляется в значения, которые переполняясь через 255, уходят в ноль.
Хотелось прояснить ситуацию, почему такое происходило, и где именно такое происходило. Дабы поставить в этой истории точку.
В ходе исследования были проверены DOS версии 1.0, 1.2, 1.4, русская (переведенная), и Gold Edition. Т.е., буквально все имеющиеся.
Данный глюк наблюдался только в версии 1.0. Но, стоит отметить, что русифицированная версия была основана как раз на версии 1.0, поэтому получилось так, что наши многочисленные соотечественники сталкивались с этой ситуацией гораздо чаще, чем в остальном мире, т.к. она проскочила лишь мельком (патч 1.2 вышел достаточно быстро, буквально через месяц), а русификацию свежих версий уже никто не делал.
Фрагмент дизассемблированного кода geoscape.exe, отвечающий увеличения статсов по результату миссии (увеличение Time Units):
Смещения 2Ah и 35h относятся к соответственно Base TUs и TU Improvement
В версии 1.2 код уже выглядел слегка иначе:
Обратите внимание, ключевое тут — JZ/JLE.
JZ — переход, если результат нулевой (эквивалентный).
JLE — переход, если результат меньше или эквивалентен.
Получается, что изначально разработчики допустили ошибку новичка: сделали проверку на лимит без запаса, при том, что значение может прыгнуть на более, чем 1.
Т.е., в случае «TUs», рост ограничивался только если он точно попадал в 80.
Все, кто играли в обновленные или не русифицированные версии, с данным глюком уже не сталкивались.
Автор: Volutar