6 февраля 2023 6.02.23 56 39K

Max Payne 2 изнутри или записки мододела.

+83
Лучший блог недели
2000 ₽

Введение:

Вы когда-нибудь задумывались о том, как игра вообще устроена под капотом? Приходило ли вам в голову, что удар правой рукой и левой, с точки зрения игры, стрельба из разного оружия? Или может хотите узнать, как переключение кратности прицела может быть связано с использованием аптечки? Что ж, если заинтриговал, то прошу присаживаться. Сегодня я буду вашим проводником в мир нестандартных решений!

ЧАСТЬ 1: Швабры и потолок.

Начать хотелось бы со старой байки:

— Вася, у нас ядовитый газ потёк! В чем проблема?
— Не знаю, должно было все работать. Что–то в проекте менял?
— Немного, швабры вынес…
— Швабры потолок держали!
— Что??? Что, извините???
— Говорю, швабры потолок держали. Над ними цистерны с газом были. Очень тяжелые, пришлось в комнату снизу швабры напихать.

«Чужой код»

Данная цитата немного вырвана из контекста, но скоро вы поймете, какое отношение эта байка имеет к нашей теме. Видите ли, когда ты делаешь мод, ты ВСЕГДА работаешь с чужим кодом, так или иначе. У этого есть свои плюсы и свои минусы. Плюсы, разумеется, в том, что у тебя есть готовый фундамент. Не нужно писать с нуля самые базовые вещи, не нужно делать с нуля кучу моделей и анимаций, не нужно даже думать о том, как заставить все это работать. Все уже придумали за тебя. Минус же заключается в том, что за тебя все придумали не для твоих нужд, а для своих. Иными словами, фундамент пригоден для того, чтобы построить на нем обычную двухэтажку, а не для того, чтобы строить на нем частную виллу с подземным гаражом и бункером.

Вот тут-то начинается самое интересное. Наша задача не просто построить то, для чего фундамент не предназначался, а еще и сделать так, чтоб всё не развалилось от дуновения ветерка, да еще чтоб и комиссия потом, которая придет принимать наше строение, думала, что все в порядке и вообще всё так и задумано.

Remedy были так впечатлены Kung-Fu модом на первый Max Payne, что даже отдали дань уважения автору в сиквеле, в виде такой вот отсылочки.
Remedy были так впечатлены Kung-Fu модом на первый Max Payne, что даже отдали дань уважения автору в сиквеле, в виде такой вот отсылочки.

Возьмем для примера мод Kung-Fu Evolution на Max Payne 2. Задача у нас следующая: научить героя драться. Допустим, нам повезло, и все необходимые анимации у нас уже есть. Дело за «малым»: добавить их в игру и заставить персонажа их воспроизводить. Но как? У нас нет исходников движка, нет возможности добавить какие-то новые кнопки и функции, да и вообще, нет даже возможности делать «контакт» тушки игрока с вражеской — опасным.

Здесь-то на помощь и приходит СМЕКАЛОЧКА. В игре есть огнестрельное оружие, оно стреляет снарядами. Снаряды наносят урон, а значит нам надо заставить игру «думать», что мы «стреляем», когда деремся! И вот уже при ударе игрока ногой, из ноги вылетает «пуля», которая и наносит врагу урон. Только вот ведь незадача: пуля летит далеко, а значит, что пинком можно убить врага хоть с километра и это нам НЕ подходит! Снова лезем в код игры и обнаруживаем, что снаряд можно «взрывать» по истечении определенного времени. Проблема решена! Мы делаем «взрывающуюся» пулю, которая взрывается быстрее, чем успевает улететь слишком далеко, и вот уже наш герой отважно бьет всех встречных ногой с разворота!

Забавый факт: звук удара прикладом в игре, называется "выстрел ближний бой", а снаряд, вылетающий при ударе прикладом, и вовсе именуется "пуля ближний бой"!
Забавый факт: звук удара прикладом в игре, называется "выстрел ближний бой", а снаряд, вылетающий при ударе прикладом, и вовсе именуется "пуля ближний бой"!

Да, может и звучит странно, но в оригинальной игре, Макс бьет врагов прикладом ТОЧНО ТАКИМ ЖЕ СПОСОБОМ! То есть с точки зрения игры между выстрелом из оружия и ударом нет совершенно никакой разницы.
Однако, одного удара МАЛО! Нажимать одну кнопку, чтобы делать один и тот же удар, это не так уж и весело! Нам нужны серии ударов! Но как? У одного оружия не может быть РАЗНЫХ анимаций стрельбы! Что ж, значит, разные удары будут разным оружием, а чтобы выбирать каждый удар в меню оружия игроку не приходилось, нам нужно менять оружие НАСИЛЬНО. В конец анимации удара прописываем принудительную замену оружия на другое, и вот уже по нажатию одной кнопки мыши, герой делает целую серию ударов! Следом мы вспоминаем, что в игре еще есть перезарядка оружия, есть кувырки, которые тоже можно бы заменить чем-то «эдаким», и на выходе получаем вот это:

 

Слабо похоже на классический геймплей Макса Пейна, правда?

Сейчас я все описал максимально упрощенно, упустил целую кучу деталей, но думаю, основная суть ясна. Мы заставляем игру делать что-то, для чего она не предназначена, при помощи того, что в ней есть изначально. Иными словами, мы используем швабры, чтобы держать потолок.

ЧАСТЬ 2: Мечта об идеальной игре.

— А правда, что все журналисты мечтают написать роман?
— Нет, — солгал я.

Сергей Довлатов «Компромисс»

Я думаю, у всех была мечта об «идеальной игре». Спросите любого геймера, и он вам с радостью расскажет, что вот будь у него возможность, он бы ТАКУЮ игру сделал, что Нил Дракманн выбросился бы в окно от зависти, Винс Зампелла ушел в долгий запой, а Хидео Кодзима сказал, что уходит из игровой индустрии, поскольку лучшая игра на планете Земля уже создана.
Только вот, к сожалению или к счастью, такая возможность есть далеко не у каждого. Кто-то пробивается в индустрию с самых низов, чтобы однажды, возможно, стать новым Кори Барлогом, кто-то делает свою инди-игру по ночам после работы и надеется, что его проект не затеряется в тонне игр из стима, кто-то понимает, что в геймдеве ему делать нечего и решает сфокусироваться на критике игр всех вышеперечисленных, а кто-то уходит в моддинг.

Тут вы можете спросить: «Это что же? Все моддеры — это неудавшиеся игроделы?». И я отвечу: «Нет, потому что некоторые из них работают в геймдеве». Но это вовсе не значит, что мир делится исключительно на тех, кто попал в геймдев и неудачников, ведь «идеальная игра» — не обязательно новая игра! Очень часто люди хотят просто улучшить свою любимую игру, в конце концов, что может быть лучше, чем любимая игра, которая стала еще красочнее, разнообразнее и увлекательнее? К тому же, в процессе ковыряния любимой игры можно узнать о ней много всего интересного. Вот например, вы знали, что в Max Payne 2 урон от пули и её бронебойность — два разных понятия? Ладно, спрошу иначе, вы вообще знали, что во втором Максе Пейне есть механика брони? А она есть!

Казалось бы, враги в игре мрут как мухи, а, учитывая скорость перестрелок, ты в игре банально даже не заметишь, что попадание по бронежилету врага наносит ему меньше урона, чем попадание по рукам и ногам, и уж тем более не заметишь, что Беретта пробивает броню куда лучше, чем дробовик, но это было продумано и сделано. В такие моменты начинаешь еще больше ценить труд разработчиков, которые в кранчах нашли время, чтобы уделить этому внимание и не поскупились на мелочь, которую 99% игроков скорее всего даже не заметят.
Однако, используется эта фича игрой далеко не на полную катушку, а ведь стоит поиграться с параметрами, и начинаются чудеса! К примеру, поставим Беретте «BulletPenetration» на «1», а Дезерт Иглу на «0.15», и вот у нас уже парадоксальная, но реалистичная ситуация. Калибр 9мм пробивает броню куда охотнее, чем 0.50AE, в результате чего по «бронированным» врагам становится выгоднее стрелять из Беретты, чем из тяжелого Дигла. Мы всего заменой пары параметров уже изменили баланс и сделали игру более реалистичной, а я еще даже не про самые интересные особенности игры рассказал.

Еще немного изучив внутренности игры, можно выяснить, что, с её точки зрения, выпущенные игроком пули, отстрелянные гильзы и пустые магазины оружия — одно и тоже, т. е. снаряды. Падают такие «снаряды» благодаря параметру «GravityMultiplier». И к пулям этот параметр тоже можно применить…

Изменение этого параметра может запросто превратить игру в аналог Sniper Elite.
Изменение этого параметра может запросто превратить игру в аналог Sniper Elite.

А еще падающие пустые магазины, это, конечно, хорошо, но они неподвижны, словно их прикрутили к полу, увы. А вот подбираемое оружие обладает честной физикой… Что если отстрелянные магазины сделать «подбираемым объектом», только без возможности его поднять? И вот уже мы имеем пустые магазины, ведущие себя, согласно всем законам физики. В игре 2003 года выпуска!
К тому же, в отличии от обычных магазинов, количество «физических» будет неограниченным, и они по достижении лимита никуда не исчезнут.

От взрыва отстрелянные обоймы разлетелись в разные стороны, оригинал таким похвастать точно не мог.
От взрыва отстрелянные обоймы разлетелись в разные стороны, оригинал таким похвастать точно не мог.

ЧАСТЬ 3: Ладно, что еще я умею?

А я ещё и вышивать могу. и на машинке. тоже.

Кот Матроскин «Простоквашино»

Так что же еще можно сделать с любимой игрой? На самом деле почти что угодно, было бы желание и прямые руки, растущие из плеч. В ролике Невероятные конверсии Max Payne 2 уже приводили примеры, что можно сделать при наличии желания и свободного времени. Я же просто приведу еще несколько примеров того, как можно использовать на свою пользу то, что дала игра.

Santego Special Unit и камера.

Начнем с самого элементарного: вид от 1-го лица в моде Santego Special Unit. Да, на самом деле, это всё еще вид от 3-его лица, где изменили позицию камеры относительно игрока и подредактировали анимации, чтобы с новой камерой все смотрелось более-менее адекватно.

The Punisher-WarZone: CaseBox 01 и прицел с аптечкой.

Теперь задачка посложнее. Как-то раз при разработке The Punisher-WarZone: CaseBox 01 у меня отпала надобность в кнопке «обезболивающее», здоровье у игрока восстанавливалось автоматически, и нужда в аптечках пропала сама собой. Захотелось использовать освободившуюся кнопку для прицела с плеча. И действительно, по нажатию кнопки, включить приближение камеры очень просто. Вопрос остается один: как заставить камеру вернуться в исходное состояние на повторное нажатие?

Не знаю на что пришлось пойти авторам Resident Evil 4 ради такого прицеливания, а мне пришлось выдумывать целую многоходовочку с невидимым объектом!
Не знаю на что пришлось пойти авторам Resident Evil 4 ради такого прицеливания, а мне пришлось выдумывать целую многоходовочку с невидимым объектом!

Я не могу назначить на одно и тоже действие разные команды — в игре это просто так не работает. Но в какой-то момент меня осенило! Я могу назначить разные команды при попытке подобрать объект (оружие, коробку патронов и т. д.).
Если совсем коротко, то у подбираемого объекта есть три набора команд:
1 — когда мы подбираем объект в первый раз;
2 — когда мы просто подбираем объект;
3 — когда мы его НЕ можем подобрать.
Зависит текущий набор команд от количества патронов к оружию, к которому привязан объект (если у нас максимум патронов к пистолету, то мы не можем подобрать коробку патронов к пистолету, если патронов меньше максимума, то можем).
В результате теперь использование аптечки создает невидимый подбираемый объект, который привязан к неиспользуемому типу патронов. Если патронов у нас нет, то приближение сбрасывается, а если их максимум, то количество патронов обнуляется и запускается «таймер» с небольшой задержкой (ЭТО ВАЖНО), который включит приближение камеры. Таким образом, сначала происходит «сброс» камеры, а потом ее приближение.

Нарисовал в пеинте схему для наглядности.
Нарисовал в пеинте схему для наглядности.

Absent Grave и мирные зомби.

А помните мод Absent Grave? Герой выживает на арене, отбиваясь от кровожадных зомби… Только вот есть один нюанс. Зомби совершенно не кровожадные, скажу больше, они даже не хотят вредить нашему герою и вообще в этой ситуации ЖЕРТВЫ! Как так? Сейчас будем разбираться.

На самом деле они мирные и не хотят вредить герою, честно-честно!
На самом деле они мирные и не хотят вредить герою, честно-честно!

Дело в том, что AI в игре не умеет применять ближний бой. Он этому банально не научен. Поэтому автору Absent Grave, как и любому, кто хочет добавить в игру «ближних» врагов, приходится идти на хитрости. Помните, в начале мы разбирали пример с «пулей» для удара? Так вот. В таких модах игрок ВСЕГДА выпускает из себя «пули», которые взрываются рядом с ним, нанося окружающим маленький урон (меньше 1% здоровья). Анимация получения такого урона заменена на анимацию удара в ближнем бою, а AI врагов дана команда бежать на игрока. Иными словами, враги просто бегут на игрока и «атакуют» его, получая от него урон. Вот так история о суровом выживании среди агрессивной живой мертвечины превращается в историю о социопате, который вообще сам первый начал.

Транспорт, которого нет.

Я думаю, что любой, кто играл в Max Payne 2, наверняка вспомнит, что несколько раз за игру мы видели сцену, когда откуда-то выезжает фургон чистильщиков, и из него вылезают враги.

Тут фургон даже сбил несчастного бандита.
Тут фургон даже сбил несчастного бандита.

Так вот, а если я скажу вам, что никакого транспорта в игре на самом деле нет?
— Но как? — спросит любой игравший в игру. — Мы же лично его видели!
На самом деле все до гениального просто. Следите за руками:

Да, фургончик мало того, что для игры функционально ничем не отличается от взрывающейся бочки или пустой коробки, так еще и является частью карты! Кстати, танк из мода 7th Serpent: Crossfire сделан похожим образом. Он не «транспорт» (которого в игре, напоминаю, нет) и даже не вражеский NPC. С точки зрения игры, это просто часть уровня.

ЭПИЛОГ

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


Max Payne 2: The Fall of Max Payne

Платформы
PC | PS2 | XBOX | X360 | XONE | XBOXSX
Жанр
Дата выхода
14 октября 2003
2.9K
4.4
2 097 оценок
Моя оценка

Лучшие комментарии

Во время вращения (если включается синематик-камера) у игрока отбирают контроль, соответсвенно, в конец анимации камеры контроль возвращают. В итоге, катсцена прерывает синематик камеру вращения, и игра сразу воспроизводит код из конца вращения, и игроку возвращают контроль прямо во время катсцены. В начале этой катсцены Максу включают неуязвимость, а поскольку, катсценовая анимация Макса нормально не проигралась до конца, то неуязвимость ему не отключили. В итоге она работает до следующего триггера, который её отключит.

Спасибо за статью!

В тему «швабр» есть анекдот про мальчика, у которого гайка вместо пупка :)

Всегда пожалуйста. Давно хотел что-то такое написать, но руки никак не доходили.

Хорошая статья получилась, автору респект 🤗

На эту тему еще забавно, что почти все лифты в игре сделаны честно, но вот в части 1 главе 7, конечный лифт — две идентичные комнаты с телепортом игрока. Поэтому если в лифт запихать тушку врага, то в катсцене ее не будет.

Слушай, если ты так разбираешься во внутренностях игры, можешь помочь мне с одном вопросом? Вторая часть первая глава (это та, где Макс в парке бежит с Моной по лестнице, но она ломается и ты падаешь вниз, еще по ходу уровня Мона прикрывает). Есть одна там тема. В комнате со шприцом его можно активировать и спрыгнуть сразу на него вниз. Далее убить трех врагов, что бы во время перезарядки Макс перезарядился в замедленной анимации со вращением. Подходишь к двери почти вплотную и начинаешь перезаряжаться, зажимая клавишу движения по направлению к двери. И каким-то образом появляется возможность двигаться в катсцене. Более того, если дойти так в слепую до тригера финала уровня, где Макс прыгает в машину к уборщикам, то на следующие два уровня ты получаешь полную неуязвимость и бесконечные патроны. Вопрос — как это вообще работает по логике игры?)

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

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

По сути реализация зеркал в некоторых играх (например Duke Nukem) через копию помещения в зеркальном отражении, это тоже «швабра».

Есть желание написать еще про пару игр подобный блог?

Спасибо, приятно слышать.

Ну баланса ради можно поставить при этом иную анимацию урона (анимация урона тоже от наличия брони и снаряда зависит в игре) так что вот у тебя персонаж упал и долго поднимается, но дамага получил меньше, а вот, просто дернулся на месте, но получил больше дамага.

В других играх настолько не копался, так что вряд ли про них такое напишу.

Меня больше интересует с профессиональной точки зрения как делался Reverse Engineering и откуда взялись константы, сигнатуры функций и их содержимое, иерархия игровых сущностей и их смещений? Понятно, что чаще всего начинают со встроенного в игры скриптового языка, но интересен конкретно этот случай с Max Payne 2.

А может исходники Max Payne 2 были частично обнародованы?

Нет, не обнародованны. Большая часть кода находится прямо в текстовиках игры, еще часть находится в самих файлах уровней. И то и другое в RAS-архивах (их открывают RasMaker-ом, который когда-то даже на дисках с игрой был). Что за что отвечает проверялось на протяжении лет методом тыка. Режим разработчика и вовсе доступен «из коробки», достаточно запустить игру с параметров "-developerkeys".

Файлы с звуками АИ тебе трогать вообще не надо, как и войсэвенты. Тебе надо прописать новые материалы (один для моны и один для макса) в файле materials и эти материалы присвоить скину макса и моны. Потом добавить эти материалы в звук «Bullethit_Generic» в текстовике sounds\projectiles и туда уже вписать звук боли. Посмотри эти файлы в модах и поймешь как и что прописано.

Анимации female и male не равно одно и тоже.
У них разные скелеты, и копипаста нечего не даст, нужно именно анимации под женский скелет. И к слову, анимации у них разные, у Моны она сломаны местами, особенно заметно как она искривляет кисть левой руки когда бежит с двуручным оружием.

звуки менять так же, как и любые звуки в игре. А слайды в телике — это текстуры внутри уровня самого. Тут только сам уровень хексить.

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

П.С.: не мог бы ты мне напомнить как и где можно отредактировать (изменить или вставить новые) программы, которые идут в игре по телевизору, а то с этими звуками совсем позабыл.

Добрый вечер.

Действительно, AntiEvil, большое спасибо за ответ от знатока, вот только тогда остается вторая часть вопроса: интересно, каким образом можно заставить игру думать, что игрок является НПС и таким образом сделать так, чтобы при получении урона воспроизводились соответствующие звуки?

Подозреваю, что ответ кроется в редактировании файлов «AI.txt», «projectiles.txt» и «characters.txt». Однако как не пытался, эксперимент не удался (либо звуки не воспроизводятся, либо игра вообще не запускается с отчетом об ошибке).

При этом еще одной причиной возникновения вопроса являются мод Payne Evolution и сборка Updated Classic: Max Payne 2 (в них авторам каким-то образом удалось реализовать данную возможность, но как они это сделали не понятно).

Они задействованы, когда Макс или Мона являются НПС. У игрока звуков дамага в игре нет.

Требуем больше такого)
Очень интересно читать)
Надеюсь это пойдёт на материал для следующих роликов сайта

Читай также