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

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

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

[Игры] Программные уязвимости в тайваньской игре Colonial Project (殖民計劃), RTS, 1996, T-Time Technology.

Тема в разделе "Кладезь мудрости", создана пользователем WERTA, 28 авг 2023.

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

    WERTA

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

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.887
    upload_2023-8-28_21-0-10.png
    Предисловие
    Автор этих строк знаком с этой RTS-игрой вот уже четверть века. Всё это время примерно раз в год всегда проходил ее почти «по-чесноку», без читов и ухищрений. Занимаясь переводом игры в 2011 г., не раз находил в чайна-нете описания «хитрых тактик», использующих прорехи в программном коде игры. Вот решил сегодня немного обобщить. Понятно, что во многих других RTS-ках того времени есть программные прорехи и баги. Поэтому подобный анализ будет полезен для сравнения с другими играми жанра RTS. Дабы не пугать читателя непонятной письменностью, описание уязвимостей игры делаю на примере русской версии, которая доступна на нашем сайте: Colonial Project (1996, DOS, файлы)

    1. Тактика «Подчини себе врага»
    В игре по задумке можно выделять и танки противника, чтобы посмотреть по ним информацию: уровень «прокачки» брони, вооружения, меткость и пр. Но управлять вы ими не можете, поскольку кнопки с командами управления не выводится, в отличие от танков вооруженных сил вашей колонии. Если выделить любой танчик врага, а потом быстро нажать кнопку «Повтор» (в китайском оригинале было – “Repeat”) под портретами докладов специалистов из различных служб, а потом нажать по появившемуся портрету последнего докладчика, то управление вражеским танком полностью переходит под ваш контроль! Будут доступны все команды, как будто этот танк на вашей стороне. Главное, чтобы в геймплее до этого появилось хотя бы одно такое сообщение: от военных, из администрации, от разведчиков...

    В самом начале миссии нужно пойти своими танками на штаб врага. Встретите там несколько машин противника (они будут недовольны…). Главное для вас – увидеть эти танки, и быстро выделив их по одному, поставить на службу своим интересам, либо просто уничтожить их. Обычно при перехвате управления советуют просто уничтожать такой танк (команда «Слом»), поскольку это происходит очень быстро и вам не нужно тратить время на раздумья. Но можно ведь и задать машине цель, например: вражеский штаб, завод, электростанция. Тут есть много очень интересных нюансов. Когда такой «танчик-перебежчик» начинает стрелять по сооружениям врага (по некогда своим), то пушечки-турели не воспринимают его как врага. Зато другие танчики быстро всё понимают (!), и начинают уничтожать предателя!!! Поэтому лучше, чтобы предатель в самом начале игры остался один-единственный в стане врага. Тогда его уже не уничтожат (пушечки его не трогают). Задать ему цель – Штаб. Примерно за пару месяцев он будет выстрел за выстрелом медленно вести свою подрывную работу. Нужно, правда, за ним ещё следить и отвлекать его от «основной работы» – профилактически уничтожать возводимые танковые заводы противника. А то, если появятся несколько «правильных» танков, они быстро уничтожат нашего одинокого «агента». И ещё. Несмотря на то, что вражеский танк вам подконтролен, он всё равно будет разрушать ваши строения и стрелять по вашим танкам, если неожиданно окажется вблизи них.

    Еще момент: как только ваш «внедрённый агент» разрушит, к примеру, электростанцию, то он для вас пропадёт из виду. Дело в том, что территория врага – это обычно невидимая территория для вас. Когда танчик-предатель стреляет, он на такой территории виден только «мельканиями» – периодически (в момент выстрела), а между выстрелами он пропадает из виду. И другие «правильные» танки, которые стреляют в предателя, аналогично становится на мгновение видимыми. Так вот, если за таким «перебежчиком» не следить, то после выполнения поставленной вами задачи он исчезнет из виду, и всё. Но это не беда. Посылаете к врагу свои несколько танчиков, они вскроют обстановку, сделав видимым любой танк поблизости. Но тут есть риски попасть под пушечки противника. А можно в такой ситуации просто ставить свои цистерны прямо у штаба врага. Танки будут сразу пытаться их уничтожить – так вы и увидите их «мерцающими».

    Сразу предостерегу насчет ещё одной изящной вариации этой же тактики. Допустим, ваш засланный лазутчик действительно будет «долбить» по штабу, пока эффективность управления развивающейся колонией имперцев не упадет ниже «плинтуса» – параметр «КПД» у всех объектов станет равным 0. Это постепенно вызовет даже сбои в добыче нефти, выработке электроэнергии. Колония будет полностью парализована. В таком случае, даже сам танчик уже не сможет ехать без нефти, а будет только стрелять на месте. Допустим, вы его после его «благородной» работы вовремя утилизировали, а штаб с разрушениями более 50% остался стоять на месте, и колония врага стоит без строительства и какого либо развития. Вы думаете, это конец, а вам теперь обеспечено процветание? Вот и нет! В игре этот момент почему-то программно предусмотрен (в отличие от всех описываемых тут «уязвимостей»…). Так вот, если в течение нескольких месяцев в колонии врага всё будет обездвижено, то Империя посчитает эту колонию бесперспективной. А это равносильно ситуации разрушения штаба (как если бы вы непосредственно разрушили штаб). Тогда часто будет прилетать вражеский десант. А это уже совсем другой расклад сил против вашей почти еще отсутствующей или хиленькой армии в начале игры. Кто играл в эту игру, тот знает, что после разрушения штаба противника раз в месяц над картой пролетает десантный звездолет Империи и сбрасывает в случайном месте карты свой танковый отряд. И в этой ситуации будет то же самое. ПОЭТОМУ... Сразу нельзя резко парализовывать штаб врага нанесением повреждений путём использования одного засланного «предателя». Все равно колония имперцев должна немного «дышать» – строиться, пока вы не построите оборонительные пушечки и много танчиков.

    ПРИЧИНЫ: очевидно, что при возврате в интерфейс отображения информации о выделенном танке не всегда выполняется проверка танков на «свой-чужой», поэтому остаётся доступ к кнопкам с командами.

    ЛЕЧЕНИЕ: найти место возврата к отображению интерфейса информации о выделенном танке и вставить дополнительное условие, не позволяющее вывести кнопки с командами управления, если танк «чужой».
    upload_2023-8-28_20-33-21.png
    Рис. 1. Всё, он полностью ВАШ!

    upload_2023-8-28_20-33-41.png
    Рис. 2. А наш-то "казачок" уже работает, пока остальных мы отправили на слом

    2. Тактика «Удушение в зародыше»
    В самом начале высадки имперцы строят свой штаб. Если начать его обхватывать своими коммуникациями, то развитие врага будет резко замедлено. Да-да, в этой игре вы можете возводить свои коммуникации (дороги или трубопроводы) где угодно. Это, безусловно, программный изъян.

    Вершина этой тактики – полная и перманентная остановка стройки любых объектов после высадки врага на планету. Дело в том, что враг строит свои объекты максимально выверено по отношению к количеству добываемой руды, так сказать на пределе возможностей по добыче. И если наступит момент, когда не хватает руды для постройки объектов в колонии, то рост колонии дальше уже невозможен! Это бывает в ситуации, когда имперцы впервые сооружают сразу несколько больших зданий и вместе с этим начали возведение самого первого своего крупноразмерного рудного комбината вблизи месторождения руды. Если постоянно перерубать своими коммуникациями коммуникации врага к этому комбинату, то его стройка будет постоянно останавливаться для восстановления связи. На восстановление постоянно «перерубаемой» вами связи, у противника уходит день. И вот тут возникнет ситуация, когда на строительство самого комбината уже не хватает остатков руды. Вот тут всё строительство перманентно останавливается. Это очень тонкий момент в начале любой миссии и его нужно суметь поймать. По крайней мере, автору этих строк подобное один раз удалось...

    ПРИЧИНЫ: возможность начинать строить объекты, дороги и трубопроводы абсолютно где угодно в игре.

    ЛЕЧЕНИЕ: жестко ставить условие в коде – строить любые объекты, трубопроводы и дороги строго на видимых (обозреваемых со своих объектов) в момент начала постройки клетках карты, ведь это ещё и абсолютно логично. Хочешь строить далеко – ставь в обозреваемой зоне какой-нибудь склад, затем веди до него коммуникацию. После постройки склада потом ставь следующий склад снова в поле видимости предыдущего, и снова веди до него линию связи и т.д. Так и до дальнего месторождения руды доползёшь. Склады, цистерны, дороги и трубопроводы всегда стóят очень мало денег.

    upload_2023-8-28_20-30-42.png
    Рис. 3. Сразу же опоясываем штаб врага своими коммуникациями - это замедлит его развитие

    upload_2023-8-28_20-30-32.png
    Рис. 4. Постоянно срываем добычу жизненно важной руды своими дешевыми цистернами

    3. Тактика «Непрерывная торговля»

    По замыслу в игре, космопорт нужен всегда только один. Звездолет прилетает в начале нечетных месяцев. Но в игре почему-то оставлена возможность построить аж до 8 космопортов. Но это не самая главная проблема.

    Тактика следующая: в момент прилета звездолета нужно в один заход сразу продавать накопившиеся излишки. А затем неожиданно разрушить космопорт (у любого выделенного вашего объекта всегда жёлтым горит кнопка «Снос»). Звездолет взлетит, но вверху надпись «БОРТ ПРИБЫЛ» – не погаснет. Вот это и дает возможность длительное время торговать далее (до прилета следующего борта), особенно если у вас уже сооружены запасные космопорты. Так можно «поднять» много «бабок». Не забываем возводить новые космопорты взамен разрушенных.

    Полная аналогия этой ситуации бывает и в случаях, когда прорвавшиеся вражеские танки наводят «шороху» в вашей колонии. Стреляют по космопорту, и прилетевший звездолёт вынужденно улетает, раньше окончания срока посадки. Но не смотря на то, что разрушение космопорта танками это медленный процесс, звездолет быстро улетает уже примерно после нескольких попаданий по космопорту. Но надпись «БОРТ ПРИБЫЛ» и тут не сменяется на «БОРТ ОТБЫЛ». А торговля ресурсами возможна именно тогда, когда в программном коде выставлен флаг «БОРТ ПРИБЫЛ».

    А в самом начале миссии, когда по деньгам можно построить только один космопорт, тактика немного меняется: в момент прилёта борта продаём излишки, разрушаем космопорт, звездолет сразу же улетает, и сразу же возводим новый космопорт. Новый строится примерно полтора месяца. До следующего прилёта звездолета проходит два месяца. Поэтому после завершения постройки очередного космопорта мы уже намного раньше (на две недели) начнем продавать «в никуда» все свои накопленные излишки, получая вполне реальную прибыль (флаг-то "БОРТ ПРИБЫЛ" до сих пор не снят).

    Но если вы дадите улететь звездолету в положенный срок, то тактика уже не сработает: флаг «БОРТ ПРИБЫЛ» в обычном порядке будет снят, и торговать будет уже невозможно до следующего прилёта корабля.

    ПРИЧИНЫ: очевидно, при разрушении того космопорта, на котором приземлился звездолёт, не снимается флаг «БОРТ ПРИБЫЛ». Также в ситуации экстренного отлета звездолета раньше срока должен сниматься флаг «БОРТ ПРИБЫЛ». Скорее всего, этот флаг выставляется/снимается только при условии наличия звездолета на причале и только в период с 1-го по 11-ое число каждого нечетного месяца у самого верхнего края карты, или с 5-го по 15-ое – у самого нижнего края карты, соответственно.

    ЛЕЧЕНИЕ:
    1. Космопорт должен быть всегда один. Это можно ограничить в коде игры. Поиск места – «целочисленное сравнение с числом 8».
    2. В таком случае, при разрушении единственного космопорта без каких-либо лишних проверок условий необходимо мгновенно снимать флаг «БОРТ ПРИБЫЛ», даже не анализируя, остался ли звездолет на причале или нет.
    3. В ситуации экстренного отлета также должен сниматься флаг «БОРТ ПРИБЫЛ».

    upload_2023-8-28_20-28-30.png
    Рис. 5. Вот сейчас нужно снести космопорт

    upload_2023-8-28_20-28-1.png
    Рис. 6. Борт экстренно улетел, а клоуны... так и не стерли жёлтую надпись...

    4. Тактика «Милости просим»
    Автор этих строк в предисловии к статье написал «почти по-чесноку». Это касается именно этой тактики. Кстати, она не упоминается в чайна-нетах, поскольку «почти честная»…

    Если ваша колония по количеству звёзд усовершенствований на танковых заводах и на самих танках сопоставима с армией противника, то периодические вторжения в стан врага группами по 12 танков (максимальное количество в ударной группе, которой можно более-менее успевать управлять) малоэффективны. Противник всегда успевает построить как новые танки, так и восстановить гражданские объекты, взамен разрушенных вами. Вам же тоже нужно время на постройку новых машин либо ремонт своих повреждённых в бою танков. А при отсутствии дорог вывести из длительного боя все танки в ремонт практически невозможно без потерь.

    И только массированный удар несколькими группами, при постоянной подпитке из резерва начинает ощутимо ломать инфраструктуру врага: уничтоженные заводы, электростанции, прекратившаяся добыча ресурсов, – заметно поубавляет «прыти» у танков противника. А потом уже можно будет разрушить его штаб.

    Но для этого нужны хорошие подъездные пути. Поэтому… перед массированным вторжением строим дорогу. Это должна быть очень широкая дорога, клеток в шесть шириной, начинающаяся от ваших оборонительных укреплений (пушечки), рядом с которыми стоят танковые (ограничение – не более 8 в игре) и ремонтные заводы (так же – не более 8). Но проблема в том, что в реальной жизни вам никто вблизи колонии врага не даст «невозбранно» строить любые дороги. А в этой игре такое – да завсегда пожалуйста. Поэтому – вот он, ещё один, не вполне честный приём. Повторюсь, при равном уровне военного развития, разрушить штаб противника, не строя дорог прямо к нему «домой», очень сложно, затратно по времени и ресурсам.

    ПРИЧИНЫ: Эта тактика полностью аналогична по своим программным причинам выше приведённой тактике №2.

    ЛЕЧЕНИЕ: жестко ставить условие в коде – строить трубопроводы и дороги только на видимых в момент начала постройки клетках карты. Так хотя бы логика не нарушается. Хочешь провести дорогу клеток на пять ближе к колонии имперцев – потеряй пару танков, которые будут под вражеским огнём «присматривать» за постройкой (пока танк стоит «живой», то видимость обеспечивается).

    upload_2023-8-28_20-25-57.png
    Рис. 7. Вот такой широкой должна быть дорога прямо "в гости" к врагу

    Не факт, что хотя бы одно «проблемное» место даже удастся найти в коде и «пролечить», но подробно рассказать об этом фанатам старых стратежек – вполне стоило…

    WERTA, 2023/08/28
     
    Последнее редактирование: 30 авг 2023
    Кишмиш, Corak, TheMadLynx и 5 другим нравится это.
  2. Редрум2

    Редрум2

    Регистрация:
    12 янв 2018
    Сообщения:
    996
    Хитрости всегда хороши, когда приходишь к ним спустя какое-то время.
    Я как-то в 2010 году, сидя на работе, обнаружил режим бога в дюна 3 (windows version).Сначала было обнаружение последних уровней.
    А видео где? Чтобы понять что за игра.
     
    WERTA нравится это.
  3. WERTA ФанатЪ O-G

    WERTA

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

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.887
    Последнее редактирование: 6 сен 2023
    Редрум2 нравится это.
  4. WERTA ФанатЪ O-G

    WERTA

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

    Регистрация:
    12 ноя 2006
    Сообщения:
    8.887
    Начнем устранение уязвимостей по мере их «омерзительности», которая не позволяет гарантированно честно пройти игру.

    1. Проблема №1 – самая гадкая из программных прорех игре «Управление вражеской техникой» – УСТРАНЕНА
    Место клика по портрету легко найти в коде по области, где воспринимается клик. Это область экрана (01DEh, 0098h, 0274h, 0132h).
    upload_2023-9-23_10-17-50.png
    Таких кликов обрабатывается всего три в разных местах кода. Наше место в коде aps0.exe (436 623 Bt)
    Код:
    aps0.exe (436 623 Bt)
    cseg01:000146ED                 cmp     eax, 132h
    cseg01:000146F2                 jl      short loc_146F9   <- окончание проверки прямоугольника
    cseg01:000146F4
    cseg01:000146F4 loc_146F4:                              ; CODE XREF: sub_13B91:loc_146E3 j
    cseg01:000146F4                 jmp     loc_14826
    cseg01:000146F9 ; ---------------------------------------------------------------------------
    cseg01:000146F9
    cseg01:000146F9 loc_146F9:                              ; CODE XREF: sub_13B91+B61 j
    cseg01:000146F9                 mov     eax, dword_95F36+2
    cseg01:000146FE                 sar     eax, 10h
    cseg01:00014701                 cmp     eax, 8
    cseg01:00014704                 jnz     short loc_1471C
    cseg01:00014706                 mov     edx, dword_6BD46+2
    cseg01:0001470C                 sar     edx, 10h
    cseg01:0001470F                 mov     eax, dword_6BD46
    cseg01:00014714                 sar     eax, 10h
    cseg01:00014717                 call    sub_30530
    cseg01:0001471C
    cseg01:0001471C loc_1471C:                              ; CODE XREF: sub_13B91+B73 j
    cseg01:0001471C                 mov     eax, dword_95F36+2
    cseg01:00014721                 sar     eax, 10h
    cseg01:00014724                 cmp     eax, 5
    cseg01:00014727                 jnz     loc_1479E
    cseg01:0001472D                 mov     eax, dword_6FABA+2
    cseg01:00014732                 sar     eax, 10h
    cseg01:00014735                 cmp     eax, 1
    cseg01:00014738                 jnz     short loc_14747 <- ВОТ ЭТОТ ПЕРЕХОД!!!
    cseg01:0001473A                 mov     eax, dword_95F36+2
    cseg01:0001473F                 sar     eax, 10h
    cseg01:00014742                 cmp     eax, 3
    cseg01:00014745                 jnz     short loc_14749
    cseg01:00014747
    cseg01:00014747 loc_14747:                              ; CODE XREF: sub_13B91+BA7 j
    cseg01:00014747                 jmp     short loc_1475C
    
    Переход
    cseg01:00014738 jnz short loc_14747
    нужно сделать просто безусловным
    Патч в aps0.exe (436 623 Bt)
    0001A138: EB 0D вместо 75 0D

    После патча при клике на портрет выводится информация об объектах и о выделенных отдельных танках (своих). Этот патч отключает только вывод информации об отдельном танке, который до этого был выделен из группы танков. В этой игре различается:
    - один танк, выделенный непосредственно на карте;
    - один танк, выделенный из группы танков в том же окне справа.
    Так вот, вражеский танк (который можно выделить только на карте, поскольку выделить группу вражеских танков в игре невозможно) ошибочно считается в этом месте кода за «один танк, выделенный из группы танков». Поэтому он и выводился с управлением. Патч отсекает этот вывод.

    ПОБОЧКА: «Наш» танк, выделенный из ударной группы мышкой, не будет выводиться в таком варианте патча. Но это и не проблема. Обычно эта функция (выделение своего танка из группы) была нужна исключительно для того чтобы перед вторжением к врагу визуально быстро убирать из группы «раненый» танк, только на основании отображаемой полоски-индикатора повреждений, а уж смотреть его свойства после выделения его из группы – ни разу не возникало необходимости. Потом уже этот «раненый» танк (остальные уходят в бой, а он остается дома) легко можно направить в ремонт. Редкий пример, когда "ПОБОЧКУ" мало кто заметит вообще.

    2. Проблема №2 – «Невозбранная торговля» – ЧАСТИЧНО УСТРАНЕНА
    Почему в игре космопортов можно делать 8 – непонятно. Я всегда строил только один, и этого всегда хватало сполна. И чисто логически изначально созданная связка в игре «всегда один звездолет = нужен только один космопорт» не должна нарушаться. Короче, я нашел место, где задается максимальное число объектов. Это один байт после каждой надписи названия объекта в строковых ресурсах.
    Код:
    aps0.exe (436 623 Bt)
    00065742: 08 ->01
    
    Но проблема все равно частично осталась. Теперь можно разрушить один космопорт во время стоянки звездолета, он улетит, но флаг «SHIP ARRIVED» не будет снят. После завершения постройки нового космпорта торговля будет возобновлена при вызове диалога «ТОРГОВАТЬ», независимо от наличия звездолета на причале.

    Я легко нашел место в коде проверки двух условий при открытии диалога «ТОРГОВАТЬ»

    Код:
    aps0.exe (436 623 Bt)
    cseg01:00031E99                 cmp     word_82D04, 0 <- наличие комопорта?
    cseg01:00031EA1                 jnz     short loc_31EC0
    cseg01:00031EA3                 mov     edx, 1
    cseg01:00031EA8                 mov     eax, 1
    cseg01:00031EAD                 call    sub_1340F <- вывод “BUILD SPACEPORT”
    cseg01:00031EB2                 mov     [ebp+var_4], eax
    cseg01:00031EB5                 mov     eax, [ebp+var_4]
    cseg01:00031EB8                 mov     [ebp+var_14], eax
    cseg01:00031EBB                 jmp     loc_32200
    cseg01:00031EC0 ; ---------------------------------------------------------------------------
    cseg01:00031EC0
    cseg01:00031EC0 loc_31EC0:                              ; CODE XREF: sub_31E73+2E j
    cseg01:00031EC0                 cmp     word_905AE, 0 <- сел ли звездолет?
    cseg01:00031EC8                 jnz     short loc_31EE4
    cseg01:00031ECA                 mov     edx, 1
    cseg01:00031ECF                 xor     eax, eax
    cseg01:00031ED1                 call    sub_1340F <- вывод “SHIP HASN’T ARRIVED YET”
    cseg01:00031ED6                 mov     [ebp+var_4], eax
    cseg01:00031ED9                 mov     eax, [ebp+var_4]
    cseg01:00031EDC                 mov     [ebp+var_14], eax
    cseg01:00031EDF                 jmp     loc_32200
    
    ПЛАН:
    Однако место явного задания 0 или 1 в переменные word_905AE и word_82D04 я так и не нашел текстовым поиском. Ещё большая проблема в том, что в DOS-ных программах такое явное задание переменных (абсолютная адресация) дополнительно прописывается в специальной таблице адресов до начала исполняемого кода. На любом месте в коде в такие переменные невозможно что-либо записать (они просто не подтверждены в таблице). Нужно искать аналогичное абсолютное обращение к какой-либо переменной, менять ее адрес и в коде, и в таблице адресов. Простым изменением кода (как это сделано выше) эта проблема не решается. Процедуры в коде aps0.exe плотно прилегают друг у другу. Неиспользуемых участков очень мало и они совсем короткие. Я попробую следующий вариант:

    Я нашел место, где выполняется сравнение числа объектов с максимально возможным их количеством.
    Код:
    aps0.exe (436 623 Bt)
    cseg01:0001F848                 cmp     ax, word_65B42[edx]
    cseg01:0001F84F                 jge     short loc_1F85B <-ВОТ ОНО!!!
    cseg01:0001F851                 cmp     word ptr dword_8792A+2, 0
    cseg01:0001F859                 jg      short loc_1F873
    cseg01:0001F85B
    cseg01:0001F85B loc_1F85B:                              ; CODE XREF: sub_1F7FD+52 j
    cseg01:0001F85B                 cmp     word ptr [ebp+var_3C], 0
    cseg01:0001F860                 jnz     short loc_1F867
    cseg01:0001F862                 call    sub_2336A <-процедура
    cseg01:0001F867
    cseg01:0001F867 loc_1F867:                              ; CODE XREF: sub_1F7FD+63 j
    cseg01:0001F867                 mov     [ebp+var_38], 0FFFFFFFFh
    cseg01:0001F86E                 jmp     loc_1FD35
    
    Строим любой объект. Наш космопорт всегда один, это и есть максимум. В таком случае будет срабатывать процедура call sub_2336A. Условие проверки [ebp+var_3C]=0 перед ней почему-то всегда пускает к ней. Вместо этой процедуры вызову дальнюю неиспользуемую, в которой есть явное обращение к переменной с абс. адресацией. А потом из дальней вызову sub_2336A. Стек трогать не буду, регистры трогать не буду. Флаги не изменятся, поскольку не будет никаких сравнений. Не обещаю, что что-то получится…

    ПОБОЧКА
    Не проверял на практике, но теория такая. Если предлагаемый патч заработает, то возможно срабатывание алгоритма в следующей ситуации редкого сочетания условий. Допустим, вы строите последний склад руды, которых в игре можно иметь только 40, а незадолго до этого момента совершил посадку звездолет. Тогда с этим патчем флаг SHIP ARRIVED будет сброшен, и при нажатии на кнопку «Торговать» загорится сообщение SHIP HASN’T ARRIVED YET. Т.е. формула подобной редкой ситуации такова: «период нахождения звездолета на причале» AND «момент новой постройки» AND «число объектов в этот момент=MAX». Но обычно звездолета очень сильно ждут, сразу как он прилетит начинают торговать. Потом к концу срока посадки через 10 дней также продают что накопилось с момента первых торгов. А построить что-либо хочется уже потом, когда будет ясен итоговый баланс торговли. А еще имперцы всегда нападают аккурат к прилету вашего торгового судна. У них судно прилетает по четным месяцам, у нас - по нечетным. Поэтому, по целому ряду причин в моменты прилета торгового звездолета начинать что-то строить ну просто бывает некогда.



    3. Проблема №3 – «Строюсь, где захочу» – НЕ УСТРАНЕНА
    Здесь даже места не нашел сравнения клетки с ландшафтом карты при строительстве объекта. Пока только план.

    ПЛАН:
    (пока это голая теория)
    В игре область видимости может частично и немного захватывать склоны и возвышенные участки (особенно это характерно для машинки БРДМ), но на 99% соотношение «высоко=невидимо» все же соблюдается. Строить там, где «высоко» - невозможно - это жестко прописано в коде. Можно при продвижении техники изменить условие задания видимости "видимо только там, где ровно". Круги заливки видимости от каждого объекта и от каждой машинки берутся из circle.bin и складываются с массивом карты через OR. На возвышенностях и склонах нужно попытаться патчем задавать всегда «видимость равна 0». Потом нужно найти сравнение «если возвышенность, то строить нельзя». Предполагаю, что склон, возвышенность и видимость заданы кодом одного байта. Скорее всего вообще битами. Затем можно будет менять алгоритм «строить нельзя не там, где высоко», а «там, где не видно». Скорее всего, свойства ландшафта для каждой клетки карты: месторождение, склон, возвышенность, камни, лес и видимость, - все лежат в памяти в одном массиве 100х100.
     

    Вложения:

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