Я заставил UMK3 на Sega играть саму в себя. И устроил первый ИИ-турнир

В Ultimate Mortal Kombat 3 есть особенность, на которую обычно мало кто обращает внимания.
Если оставить игру без действий, через некоторое время запускается демонстрация в самом начале игры где — CPU сражается с CPU. У них всегда третий решающий раунд на демонстрации.
То есть разработчики ещё в 1995 году предусмотрели ситуацию, когда компьютеру приходится драться против компьютера. Не знаю осознанно ли это они сделали?
Но что будет, если дать этому штатному ИИ не просто один демонстрационный бой, а полноценную игру?
Я решил проверить.
Оказывается, в игре есть флаг, определяющий, кто управляет персонажем — игрок или CPU. Идея эксперимента довольно простая: выбираем персонажа за игрока, перед началом боя меняем этот флаг с игрока на CPU — и получаем полноценный бой ИИ против ИИ или даже прохождение башни.
Мало того что мы можем менять этот флаг, у нас еще есть доступ и к подмене ID персонажа, где мы можем выбрать абсолютно любого для наших противостояний.
И дальше началось то, чего я сам не ожидал.
Первое, что я сделал, — запустил обычную башню и заставил обоих бойцов управляться компьютером.
На первый взгляд ничего особенного: два персонажа просто начинают драться друг с другом.
Но разница с обычной демонстрацией огромная.
В демо-режиме игра контролирует небольшой заранее предусмотренный сценарий, как правило это один раунд из боя.
А здесь я уже нахожусь внутри настоящего игрового режима.
Есть башня.
Есть выбранный персонаж.
Есть последовательность противников.
Есть победы и поражения.
И игра должна каким-то образом продолжать всё это, хотя изначально человек вообще не нажимает кнопки во время боя.
Я выбрал Shang Tsung через рандом и первый в башне нас ждал Ermac
Разумеется, управляет им уже не человек.
CPU против CPU.
Ermac выигрывает бой.
И здесь произошло самое интересное: игра действительно засчитала победу и продолжила башню.
Более того, Ermac занял место игрока, а его иконка появилась в соответствующем слоте на башне. Произошла подмена слотов игроков между P1 и P2.
То есть игра не просто позволила двум ботам подраться.
Она продолжила воспринимать происходящее как нормальное прохождение башни.
Следующим соперником стала Mileena.
И вот здесь эксперимент набирал обороты.
В UMK3 есть персонаж, который особенно интересен для подобных экспериментов — Chameleon.
Он существует в коде игры, но в обычном выборе персонажей его нет.
Я решил подменить ID персонажа и посмотреть, сможет ли CPU играть за него. Кстати про Chameleon я писал уже статью, можно изучить подробнее откуда он и как выбрать.
Chameleon появился в бою против Mileena и начал нормально сражаться.
И это уже было довольно забавно: компьютер получил персонажа, которого обычный игрок на этом этапе просто не может выбрать, и самостоятельно отправился проходить башню.
Chameleon кстати даже победил.
Следующий эксперимент был ещё интереснее.
Я выставил Jade против Motaro — первого босса.
И произошло то, чего от эксперимента хотелось больше всего:
Расчет был, что Jade начнет спамить спешлами, а Motaro как раз к ним имеет иммунитет. Поэтому обычными ударами Jade удалось одержать победу.
После этого игра отправила её дальше, к Shao Kahn финальный босс.
А вот здесь наш CPU уже не справился.
Shao Kahn оказался сильнее. Ведь он получает меньше урона, плюс сам наносит больше урона. Но самое интересное произошло далее, как в случае Shang Tsung против Ermac.
Shao Kahn после победы занял слот игрока P2 и башня пошла еще выше, где были бесконечные Kano, кстати такого в детстве эффекта можно было добиться, через второй джойстик, когда пропускаешь соперника, через кнопку старт.
Раз Shao Kahn самый сильный боец в игре, нужно его поставить против самого себя.
Я вернулся в башню и поставил Shao Kahn против Shao Kahn.
Наш находился в слоте P2, второй был выбран как противник.
И они действительно начали драться.
Победил Shao Kahn, только наш.
А после завершения боя произошёл небольшой визуальный хаос: два Shao Kahn фактически исчезли из игры с довольно забавным глитчем.
Именно такие моменты особенно хорошо показывают, что за обычными ограничениями выбора персонажей скрывается совсем другая внутренняя логика игры.
Здесь я уже решил проверить не сам бой, а то, что происходит после победы.
Я сам победил Shao Kahn за Motaro и посмотрел, куда игра отправит меня дальше. Аналогично и было с Shao Kahn.
Оказалось, что для некоторых боссов разработчики предусмотрели отдельное поведение.
После победы можно попытаться перейти к биографии персонажа.
Но у Motaro и Shao Kahn полноценной биографии в этом месте нет.
Игра просто отправляет игрока дальше — в одну из встроенных мини-игр, Galaxy.
То есть даже здесь хорошо видно, насколько специфически разработчики собирали структуру UMK3: стандартные персонажи имеют полноценные финальные экраны и биографии, а боссы работают по другому сценарию.
Напомню что даже у Chameleon, которого забыли в коде, есть заглушка с биографией в конце игры.
После башни я решил проверить ещё один режим.
В UMK3 есть режим с восемью участниками, где персонажи последовательно сражаются в небольшом встроенном турнире.
Я набрал разных бойцов и сделал так, чтобы в матчах участвовал CPU против CPU.
Получился полноценный турнир, в котором компьютер играет против самого себя до одной победы.
Никакого человека.
Никаких ручных комбинаций.
Только штатный ИИ игры.
И в финале получился бой:
Sub-Zero против Reptile, там получился эпичный камбэк.
Можно сказать, я провёл небольшой турнир искусственного интеллекта внутри игры, которая вышла задолго до появления современного термина «ИИ-киберспорт».
И самое интересное — игра сама смогла провести турнир до конца, потому что её внутренняя логика продолжала считать эти бои обычными матчами. Какого Вам теперь осознавать, что это было в нашей любимой игре 1995 года, до того как это стало мейнстримом?
На этом я решил проверить ещё один режим, где необходимо последовательно противостоять сразу нескольким бойцам, после прохождения башни.
Я снова начал экспериментировать с подменой персонажа ID.
И на одном из этапов вместо нормального Motaro появился довольно необычный спрайт — фактически его «кукольная» версия без нормальной анимации.
Выглядело так, будто игра загрузила нужного персонажа, но не смогла корректно обработать его состояние. Причем визуально это напомнило мультик Робоцып, кто смотрел?
Уже во втором раунде всё стало нормально — вероятно, из-за того, что после раунда игра сбрасывает часть состояний в памяти игры.
Получился ещё один небольшой пример того, как игра реагирует, когда заставить её работать не совсем так, как предполагали разработчики.
После эксперимента стало хорошо видно, что ИИ UMK3 работает довольно просто: он ориентируется прежде всего на расстояние до противника — ближняя, средняя и дальняя дистанции — и в зависимости от ситуации выбирает действие.
CPU в основном использует обычные удары, редко применяет специальные приёмы и практически не выполняет полноценные комбинации. Он не обучается и не меняет стратегию после поражения — просто следует заложенным разработчиками скриптам.
Эксперимент показал, что UMK3 действительно способна во многом играть сама в себя: CPU может проходить башню, сражаться с боссами, использовать персонажей, недоступных обычным способом, и даже участвовать в полноценном турнире CPU против CPU.
Именно это и было самым интересным — убрав человека, можно увидеть, как на самом деле работает игровой ИИ, созданный ещё в 1995 году.
Полное видео эксперимента со всеми боями, странными ситуациями и найденными багами тут
Спасибо за внимание! Подписывайтесь и оставляйте свои комментарии.
Стоит ли продолжать подобные эксперименты со старыми ретро-играми — находить их скрытую логику, разбираться, как они устроены изнутри, и показывать то, чего обычный игрок никогда не увидит? Вам было бы интересно такое исследование в будущем или в какой-то конкретной игре?