1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Исследование кода и исправление багов Rebel Moon Rising

Тема в разделе "Мастерская", создана пользователем WERTA, 1 мар 2011.

  1. WERTA ФанатЪ O-G

    WERTA

    Хелпер Переводчик

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.512
    Рассмотрим пример разбора кода и исправление косяков полной версии игры Rebel Moon Rising. Как это ни странно, но в рип-версии таких недочетов почему-то не наблюдается, другая компиляция-с, однако…
    Исходный файл: rmr.exe, SIZE=385 536 Bt, дата 18/04/1997, ENGLISH VERSION
    1. Проблема
    Если любое количество носимых игроком боеприпасов на максимуме (это 200=C8h, для всех), то лежащие боеприпасы на карте почему-то продолжают браться, а навара то нет, поскольку он обрезается по 200, этого необычного явления не наблюдалось в рип-версии.
    Я захотел устранить проблему
    a) Декомпиляция в самом простом дизассемблере WinDASM.
    б) Поиск текстовых строк в декомпилированном тексте rmr.alf : eax, 000000C8, ebx, 000000C8, ecx, 000000C8,… ax, 00C8, bx, 00C8…, cmp eax, 000000C8, cmp ebx, 000000C8…, cmp cx, 00C8… и т. п. где есть операция сравнения или присвоения по 200 (C8h).
    Небольшое отступление: Вообще ни дай Бог, чтобы числа, используемые для вывода различных игровых параметров, были кратны степени 2, обычно они кратны 10, 100, 5, что облегчает поиск. Такие числа особо уникальны в арифм. операциях сравнения, сложения. Именно так я и раскатал Alpha Storm, уцепившись только за число 999 (000003E7h)
    в) Проверка полученных результатов (смещения WinDASM и в IDA Pro совпадают)
    Код
    Создаем соотвествующую игровую ситуацию и сейвимся. Теперь правим байты.
    Вот первый ощутимый результат 4)
    Код:
    4) вариант 
    :0041D135 6681FBC800              cmp bx, 00C8
    :0041D135 6681FBC700              cmp bx, 00C7
    Для боеприпаса нет эффекта. 
    :0041D135 6681FBC800              cmp bx, 00C8
    :0041D135 6681FBC900              cmp bx, 00C9
    Для боеприпаса появляется надпись, когда его берешь при своих носимых 200 единицах.
    Далее изменил вот в этом месте
    :0041D1AA 66035D26                add bx, word ptr [ebp+26]
    :0041D1AA 662B5D26                sub bx, word ptr [ebp+26]
    
    И боеприпасы перестали прибавляться.
    Все, с этого места я начал исследовать код.
    г) Исследование кода.
    Здесь очень помогли наработки Vladimir 777 по исследованию формата сейвов и карт игры.
    Помучавшись немного в HEX-редакторе я интуитивно уже изменил байт с 1 на 0, в конце изучаемой процедуры. Поскольку сначала нужно вывести надпись, а затем уже после взятия предмета уничтожить объект на карте, так должно быть по нормальной логике.
    Проблема решена
    Проверил – все работает.
    Просто постоянно было удаление объекта, независимо от того нужен он или нет в данный момент.

    2. Проблема
    Гораздо интереснее, из разряда программистского ляпа. Когда берется батарейка к щиту и щит становится равен 200, то надпись о том, что взята батарейка не отображается. Это же и относится к супербатарее, поскольку она всегда дополняет щит до 200.

    Код уже частично понят. Дальше легче. Полностью быстро нашел место прибавления к щиту
    Код:
    :0041CEAD 03C8                    add ecx, eax
    меняем
    :0041CEAD 2BC8                    sub ecx, eax
    Щит стал убавляться при подборе батарейки
    
    Вся процедура подбора довольно небольшая


    Теперь комментарии
    Код:
    :0041CE88 8B742420                mov esi, dword ptr [esp+20] кладем смещение начала структуры информации об игроке
    :0041CE8C F6460201                test [esi+02], 01 че-то у него там проверяем (живой не живой может?) 
    :0041CE90 7473                    je 0041CF05 если че-то у него там равно 1 то прыгаем в конец 0041CF05 процедуры
    :0041CE92 668B463C                mov ax, word ptr [esi+3C] загружаем сколько сейчас щита
    :0041CE96 663DC800                cmp ax, 00C8 сравниваем с 200
    :0041CE9A 7D3B                    jge 0041CED7 если равно или больше то прыгаем как раз перед тем переходом который проверял необходимость вывода надписи
    :0041CE9C F6450704                test [ebp+07], 04 самое интересное это именно байт 07 структуры объекта на карте из сейва и его проверяют на 4
    :0041CEA0 7404                    je 0041CEA6 если равен 4 то перепрыгиваем через строку (не убираем объект с карты, за это и отвечает байт 7 в структуре записи объекта на карте)
    :0041CEA2 66BF0100                mov di, 0001 вроде это должно уничтожать потом объект на карте, я как раз такой же операнд  патчил в первой проблеме игры. И ниже edi нигде не задействован (проверил да это действительно уничтожение объекта).
    :0041CEA6 0FBF4D26                movsx ecx, word ptr [ebp+26] это байт 26 в структуре записи объекта на карте, сколько чего в объекте витаминов и патронов
    :0041CEAA - :0041CEB7 ну тут все понятно.
    
    Все, проверил, решена проблема.
    Прыгаем с :0041CE9A ниже сразу на 0041CF05 место начала выхода из процедуры
    ЭТО абсолютно безопасное место. А переход :0041CEE3 нопим, теперь при 200 тоже должно название темы отображаться, но мы сюда при 200 уже никогда не попадем, только когда до подбора было менее 200.
    Вот так и исправил эту программистскую ошибку.

    ВОТ ВКРАТЦЕ РЕЗУЛЬТАТЫ
    1. Проблема берущихся боеприпасов при подборе
    Код:
       :0041D1E4 66BF0100                mov di, 0001
       :0041D1E4 66BF0000                mov di, 0000
    
    2. Проблема не отображающейся надписи батарейки при подборе
    Код:
       :0041CE9A 7D3B                    jge 0041CED7
       :0041CE9A 7D69                    jge 0041CF05
    И еще 
       :0041CEE3 7D20                    jge 0041CF05
       :0041CEE3 9090                    nops
    
    А физические смещения в rmr.exe найдите сами по уникальным цепочкам, если хотите.
    Вот правленый rmr.exe
    http://ifolder.ru/22169355
     
    Последнее редактирование: 1 мар 2011
    Sneaksie, Sharp_ey, AxXxB и 9 другим нравится это.
  2.  
  3. kreol Старший офицер Чёрной Гвардии

    kreol

    Администратор

    Регистрация:
    2 июл 2007
    Сообщения:
    115.209
    WERTA, заранее приношу извинения за возможную обиду, но это точно все баги полной версии? Просто я раньше играл только в rip данной игры - и действительно не помню, чтобы там было что-то такое (и поэтому меня весьма удивила данная информация, за которую тебе, конечно же, громадное спасибо!). Может быть, стоит сделать на его основе (дабы было спокойнее) full-rip и затем делать русификатор уже именно для него?
     
  4. Vladimir 777

    Vladimir 777

    Хелпер

    Регистрация:
    22 мар 2010
    Сообщения:
    1.347
    kreol, я отвечу.

    Пока это неизвестно, но ничего другого я не замечал. Первый баг замечен мной, второй нашёл WERTA. После перевода Rebel Moon я планирую параллельное прохождение рипа и CD-версии Rebel Moon Rising именно для выяснения отличий и поиска багов. Пока из отличий замечено:
    В CD-версии 21 уровень, в рипе 17.
    В CD-версии есть возможность сетевой игры, два сетевых персонажа, некоторые объекты для сетевой игры и 21 сетевой уровень.
    Одинаковые карты в CD-версии и рипе немного различаются. Вот эти отличия я и хотел выявить в первую очередь. Вдруг на каком-либо уровне они столь велики, что можно будет говорить об отдельной карте.

    Я сначала эту идею и пропагандировал. Думал перенести в рип дополнительные четыре уровня и всё. Но не хочется уничтожать возможность сетевой игры. Да и найденные баги WERTA уже поправил.
     
    Последнее редактирование: 2 мар 2011
    Werecat13, WERTA и kreol нравится это.
  5. WERTA ФанатЪ O-G

    WERTA

    Хелпер Переводчик

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.512
    Rebel Moon Rising patcher by WERTA

    Вот сделал патч. Применим к любой языковой версии, поскольку оная один и тот же файл. По F3 проверьте при отключенной панели, они даже не удосужились в национальных версиях игры перевести SHIELD, AMMO...торопились?
    Проверяйте патч.(на полной версии конечно rmr.exe)
     

    Вложения:

    Последнее редактирование: 3 мар 2011
    compart, Чёрный Думер, funny22 и 4 другим нравится это.
  6. Werecat13 Gone fishing

    Werecat13

    Регистрация:
    8 янв 2007
    Сообщения:
    5.506
    Там вообще странненько как-то. CD-версия даже с другой скоростью работает, не говоря уже о том, что у неё другое количество врагов (это отражено как минимум в первом брифинге) и настройки вроде бы чутка отличаются.
     
    Vladimir 777, kreol и WERTA нравится это.
  7. WERTA ФанатЪ O-G

    WERTA

    Хелпер Переводчик

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.512
    У них карты различаются немного. В настройках по умолчанию стрейф на Alt, а бег на Shift (в рипе наоборот). Я тоже не пойму как коммерческий продукт вышел с такими ляпами в коде, а рип был без них. Рип явно собран из демки игры. А меньше уровней, так наверное по причине несоместимости с демкой некоторые пришлось выкинуть, это моя версия.
     
    Последнее редактирование: 2 мар 2011
  8. Vladimir 777

    Vladimir 777

    Хелпер

    Регистрация:
    22 мар 2010
    Сообщения:
    1.347
    Основные различия между версиями 1.0 и 1.10 Rebel Moon Rising.

    Поскольку рипы на сайте планируется постепенно заменять на полные версии я провёл сравнение версий 1.0 (рип на сайте, 17 уровней) и 1.10 (раздача, автор раздачи DeaDFausT).

    Преимущества 1.10

    В ней 21 уровень против 17 в 1.0. В 1.10 добавлены возможности голосового управления (на мой взгляд, бесполезнейшая вещь) и сетевой игры (21 сетевой уровень). Добавлена возможность управления панелью информации в нижней части экрана с помощью последовательных нажатий клавиши F3 (три состояния: панель, только текст, вообще ничего). Добавлена возможность управления яркостью изображения клавишами F11 (затемняет) и F12 (освещает). На мой взгляд – вредная функция. Если где-то в игре должна быть темнота – надо искать очки ночного видения, а не играться с кнопками. Добавлена возможность самоубийства персонажа нажатием клавиши F10. Загадочная функция, предназначенная, скорее всего, для сетевой игры. Увеличена скорость полёта вражеских выстрелов на самой низкой сложности (может и на средней с высокой, но там разница не так заметна).

    Недостатки 1.10

    Убрана сама концепция дверей и ключей трёх цветов. Их место занято двумя флагами для сетевой игры и «компьютером», похожим на осциллограф. Он применён на уровне №19, нечто типа квестового предмета.
    Допущена ошибка в файле плазменной винтовки WPN5.INI. Урон уменьшен с 75 до 45, тем самым, превратив и без того малоэффективное оружие в хлопушку, даром жрущую патроны. Это именно ошибка, а не намеренное изменение, так как и в новой версии файла справки указанный урон - 75.
    Кроме того имелись два бага: возможность подбирать патроны с полным боекомплектом (по сути, просто выброс их с карты) и отсутствие надписи о взятии батареи при сопутствующей зарядке щита до полной мощности. Это уже исправил WERTA.

    Просто отличия.

    В настройках по умолчанию стрейф на Alt, а бег на Shift (в 1.0 наоборот). В финальной картинке 1.10 появился текст «The end» и сообщение, что Rebel Moon Revolution должна появиться к Рождеству 1998 года. Учитывая, что 1.0 представлена на сайте в виде рипа, музыки в ней нет.

    Сравнительная таблица

    Карта пятого уровня 1.0

    Карта шестого уровня 1.10

    Карты уровней с минимальными отличиями прикреплять не стал, там не сразу и видно, какое помещение из квадратного стало восьмиугольным и т. д. Мелочи там сплошные.

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

    Руководствуясь вышеизложенной информацией предлагаю решить стоит ли сохранять на сайте рип (1.0) или заменить его полной версией (1.10). Лично мне хотелось бы как-то сохранить пятый уровень рипа.
    Ещё надо решить, стоит ли устранять замеченные недостатки карт и разбираться с расходом кислорода на тех картах, где замечены проблемы.
     
    Последнее редактирование модератором: 19 июл 2015
    Sharp_ey, Werecat13, WERTA и ещё 1-му нравится это.
  9. WERTA ФанатЪ O-G

    WERTA

    Хелпер Переводчик

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.512
    Вообще классно все написано.
    Vladimir 777 если ты скриншотишь из игры карту, я могу сделать алгоритм прорисовки ребер, все равно в редакторе это надо будет делать, чтоб не тратить время. Я помню, совершил давно подвиг - заскринил всю карту 14 уровня (Незавершенные субэстроны).
    Добавлю в версиях 1.0 и 1.06 ехе-шник один и тот же. Этот ехе-шник спас Rebel Moon (ключи еслиб не оставили...), и на нем будут основаны все последующие моды. Рип версию скрепя сердце надо убирать. Хотя она качественней. Да и путаница начинается с нумерацией уровней.
    С косяками разберемся по мере прохождения. Если что, у нас под рукой рип, под него все косячные параметры карты можно настроить. Я удивляюсь, че они все так коряво сделали то. Вроде добавлено мало чего, а код и карты пострадали.
     
    Последнее редактирование: 8 апр 2011
    Vladimir 777 нравится это.
  10. Vladimir 777

    Vladimir 777

    Хелпер

    Регистрация:
    22 мар 2010
    Сообщения:
    1.347
    С этим я уже закончил, собственно кроме приложенных только три уровня скриншотил. Так что алгоритм отрисовки можешь делать и потом.

    Я пришёл к тому же выводу. Из рипа жалко только пятый уровень. Впрочем, его можно добавить к планируемому моду и, таким образом, сохранить. Только, наверное, цели надо будет заменить. И в Rebel Moon и в Rebel Moon Rising они были. Ещё раз расстреливать те же машинки что-то не хочется.

    А чего ждать-то? Я уже прошёл, могу начинать делать правки. Плохо, что для устранения возможности прекращение потребления кислорода без взятия кислородного регенератора придётся городить "отсебятину" (менять стартовый запас кислорода, перетаскивать регенератор в другое место карты, имплантировать на карту двери и т. д.). Все остальные проблемы легко устранимы.

    Кстати, в виде чего мы будем выдавать правки: набор файлов с заменой оригинальных, патчер, изменения самого образа?

    Похоже, как обычно не успевали. Это ж прямо визитная карточка Fenris Wolf - опаздывать со сроками сдачи продукта. Кстати, основная масса косяков находится на тех картах, что появились в только в 1.10. Насчёт кода - не знаю, возможность подбирать боеприпасы с полным боекомплектом могла быть внесена намеренно, в расчёте на сетевую игру. Чтоб врагу патроны не достались. Но теперь актуальнее сингл, а там эта "инновация" очень неудобна.
     
    WERTA и kreol нравится это.
  11. Werecat13 Gone fishing

    Werecat13

    Регистрация:
    8 янв 2007
    Сообщения:
    5.506
    Образ лучше оставить родной. Для аутентичности. Просто выложить к нему неофициальный патч со списком изменений.
     
    Vladimir 777 нравится это.
  12. WERTA ФанатЪ O-G

    WERTA

    Хелпер Переводчик

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.512
    Это ты про Ammo Pack, так он действительно работает и в 1.0, а в предпоследнем 26 уровне RM он не работал по причине спешки, он в аутеничной ДОС-игре отображается, но не берется. А из под RMR 1.0 отображался как боеприпас инопланетного оружия. В общем это объект в OLS записи которого BYTE#2=01h, BYTE#24=0Fh. Этот Ammo Pack действительно увеличивает все боеприпасы до 200, кроме боеприпасов для инопланетного оружия (что в общем логично).
     
    Vladimir 777 нравится это.
  13. Vladimir 777

    Vladimir 777

    Хелпер

    Регистрация:
    22 мар 2010
    Сообщения:
    1.347
    WERTA, да нет, не про Ammo Pack. Я вчера подумал, что исправленный тобой баг (возможность подбирать боеприпасы, когда их запас равен 200) может быть не багом, а предназначенной для сетевой игры возможностью. Т. е. боеприпасов у нас по максимуму, но, чтоб они не доставались врагу, мы их "подбираем" (убираем с карты).
    Но эта мысль абсолютно неправильна, так как если бы это не являлось багом, подобная возможность была бы реализована и для батарей щита. И, вообще, это был бы верх нелогичности - совершенно неясно куда и как боец убирает с карты эти боеприпасы.
     
  14. WERTA ФанатЪ O-G

    WERTA

    Хелпер Переводчик

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.512
    К своему стыду совершенно не знаю специфики сетевой игры в 3D шутерах. Если подобные фишки реализованы в сетевых режимах других игр, то почему бы и нет, просто убираем и все. Нужно подтверждение этой фишки из других шутерных игр.
     
  15. Vladimir 777

    Vladimir 777

    Хелпер

    Регистрация:
    22 мар 2010
    Сообщения:
    1.347
    Да нет там этой "фишки", WERTA, это у меня приступ "неудержимого полёта мысли" был. Если бы изменение было намеренно внесено разработчиками, то то же самое было бы сделано для батарей щита. А этого нет.
    Так что, не беспокойся, твоя правка совершенно верная, это был баг. Не надо ничего убирать.
     
    WERTA нравится это.
  16. Vladimir 777

    Vladimir 777

    Хелпер

    Регистрация:
    22 мар 2010
    Сообщения:
    1.347
    Сделал патч для Rebel Moon Rising 1.10. На уровнях, где расхода кислорода не было, теперь есть. Сам по себе (изменение фазы игры) расход кислорода больше нигде не отключается. Ну, и мелочи всякие, типа заниженного урона оружия №7 и бесконечно берущихся предметов поправлены. Патч включает в себя правки ЕХЕ, которые ранее сделал WERTA.
    список изменений
    В архиве папка PatchRMR1.10. Содержимое папки надо скопировать в папку с Rebel Moon Rising, заменяя оригинальные файлы.
     

    Вложения:

    WERTA, Werecat13, Butz и 4 другим нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление