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.

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

P.S.: Покапавшись глубже, выяснилось, что русифицированная версия была гибридом, в которой GEOSCAPE.EXE был взят из версии 1.0, а BATTLESCAPE.EXE из 1.2. Просто боевая часть от 1.0 вылетала при появлении Криссалидов, и с этой версией игра была бы нежизнеспособна. Голлопы умышленно разделили игру на два разных EXE'шника (два разных игровых режима), взаимодействующих через файлы, для того чтобы игра уместилась в 640 килобайтах Conventional Memory, ну и из исторических соображений: изначально она задумывалась как просто пошаговая тактика, Laser Squad 2. Поэтому и такой гибрид оказался возможен.

Комментарии (7)


  1. pehat
    15.07.2015 19:33

    О, спасибо. А патчик не приложите?


    1. Volutar Автор
      15.07.2015 20:00

      Патчик для русифицированной багованной 1.0 версии?:) Это же история… Там эти глюки с переполнением на каждом шагу…
      Лучше уж или в оригинальную 1.4 играть (если DosBox не напрягает), или в OpenXcom.
      Ну или если прям такое острое желание играть в русифицированную в DosBox'е, то проще перерусифицировать 1.4. Но это сильно уже заморочиться надо.
      Кстати, в русифицированной Terror From the Deep подобных ошибок не было изначально.


      1. pehat
        15.07.2015 20:04
        +1

        Музыка Моцарта и картины Рембрандта – тоже история, однако это не помешало им занять свое место в истории. Мне казалось, что обычно результатом такого исследования становится патч, который лечит проблему. Но все равно спасибо за анализ.
        А Вы не знаете, нет ли какого-нибудь сообщества реверсеров, которые сильно заморачиваются и разбирают старые игры по кирпичикам?


        1. Volutar Автор
          15.07.2015 20:16

          Возможно, поэтому никто не пытается исправлять недостатки в картинах Рембрандта?

          Про сообщество ничего сказать не могу. Полагаю, что это занятие (реверс старых игрушек) — крайне indy занятие. Разбирать старые игры, мне кажется, есть смысл лишь для того, чтобы бережно перевоплощать их для современного железа и операционных систем, а не просто так вот для некоего виртуального музея (хотя для некоторых старых игр такие очевидно существуют). Все старые игры разные, у всех них свои поклонники… Едва ли для них всех найдётся одно «общее» место. Лично я сам занимался исключительно реверсом Ufo: Enemy Unknown и X-COM: Terror From the Deep, с целью помочь проекту OpenXcom, который я, собственно, и отрекомендовал как русифицированную и гораздо более удобную версию классики.


  1. Sergey-S-Kovalev
    15.07.2015 20:42

    Я чинил это руками через редактор DOS Navigator'а! Без модных ассемблеров, и hex редакторов! Без навыков программирования! Я побайтово сравнивал сохранения, что бы найти изменения и десятки раз загружал игру, что бы проверить откорректированные значения.
    У меня был 486SX2, 8 мегабайт SDRAM и 87 мегабайт на все про все на жестком диске.

    Самой большой ошибкой в то время было увеличить мощность плазменного оружия. Прозрение от собственной дурости приходило очень быстро.
    Только лазер, только земные технологии.


    1. Volutar Автор
      15.07.2015 21:08

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


  1. DoubleG
    16.07.2015 07:32
    -2

    Ого, а ты наш человек! Я вот думал, что Warboy1982 русский.