Физика в Knighttron

Сегодня я расскажу об основных причинах которые побудили меня использовать реалистичную физику Box2D в Knighttron.

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

Причина первая: лень

Причем тут лень — спросите вы? Все очень просто: физическая библиотека типа Box2D или Nape — это фактически уже готовый, стабильно работающий и отлаженный конструктор, симулирующий физический мир. Если не использовать сторонний физический движок, то придется писать свой, а это куча времени и сил. Мне очень не хотелось писать какую-то свою, оригинальну физику для игры, потому что и без этого было понятно, что работы будет много.

В случае с использованием стороннего физического движка проблема только одна: как использовать физический движок в столь нестандартной для него проекции? Физический то движок двумерный, а для этой игры обработка физики необходимах в разных плоскостях. Но к решению этого вопроса мы вернемся немного позже, а сейчас...

Причина вторая: красочность

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

Сейчас я немного вернусь к первой причине и расскажу о своей давнешней игре Santa Is Coming, где вид top-down как и в Knighttron.

В игре про Санту на поле выпадают конфеты, которые собирает персонаж, и выпадение конфет — это элементарная физика, которая хорошо работает для этой игры. ? мне не потребовалось много времени, чтобы её внедрить. ?значально я думал, что так же можно сделать и для Knighttron. Но как же тогда быть с разрушающимися объектами и врагами? Конечно, для врагов и объектов можно нарисовать анимации разрушения и смерти. Но это же скучно! Скучно смотреть каждый раз на одну и ту же анимацию разрушения, убивая 100500-го монстра. ? совсем другое дело, когда после смерти каждого врага или объекта мы получаем уникальную анимацию, разлетающиеся обломки и прочее, а если это еще зависит и от того, куда был произведен клик при нанесении последнего удара, то вообще красота! Я считаю, что наиважнейшая составляющая любой игры — это зрелещность и удовольствие от процесса. ? в случае с играми, где надо валить монстров, не важно РПГ это или шутер — должно быть удовольствие и удовлетворение от убийства врагов, так как большую часть времени игрок только и делает эту монотонную работу.

Да, игры типа РПГ могут компенсировать отсутствие зрелещности от убийств чем-то еще, благо в играх типа РПГ огромное количество разных составляющих. Но, «кашу маслом не испортишь!», а в случае с шутерами так и вовсе: зрелещные убийства — это острая необходимость.

Если внимательно рассмотреть любую игру, то можно увидеть, что все действия игрока — это однообразный набор действий: клини здесь, кликни там и если игра не достаточно хорошо и красочно реагирует на действия игрока, то игра превращается в унылую работу и игрок поспешит избавится от такой игры. Любая игра обязана превратить рутину, которую выполняет игрок, в яркий и незабываемый праздник.

Причина третья: потенциал

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

Разрушаемое окружение — возможность создавать какие-то постройки или завалы, которые можно разрушать, тем самым открывая доступ к каким-то вещам. Например поставить сундук с ценными вещами на груду ящиков и чтобы добраться до него — необходимо разворотить всю кучу. Так же эти постройки или завалы могут быть обрушены на врагов, чтобы завалить их насмерть. Возможность скатить тележку с наклонной плоскости и задавить ею врагов, стоящих у нее на пути. Безусловно это добавит немного разнообразия и свободы в геймплей, а самое главное тут удовольствие, и особенно в том случае, если игрок сам догадается использовать физическое окружение в свою пользу.

Динамический ландшафт — по настоящему динамический, а не то, что я раньше рассказывал! Что если во время игры начать двигать произвольные тайлы вверх и вниз, когда на них стоят груды ящиков или врагов? Получится настоящее и красивое землятресение! Можно динамически изменять положение тайлов, закрывая или открывая какие-то проходы. Например, поднимающаяся лестница из земли. В общем, тут сразу открывается невероятный простор для различных идей. А когда мы знаем, что при этом и все объекты, находящиеся на земле, будут корректно реагировать на все эти изменения — то это привносит еще больше разнообразия и удовольствия.

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

?значально я хотел реализовать возможность закидывать врагов предметами из инвентаря, но потом решил отложить реализацию этой возможности. Потому что переживал, ведь если яблоко будет наносить по 1 урону, то имея в арсенале 10 яблок — можно закидывать всех слизней до смерти за один ход (т.к. на бросок вещи не используются очки атаки). Но, в целом, это вполне достижимая возможность, просто надо немного поэкспериментировать и сбалансировать, а я торопился.

В общем, использование реалистичной физики открывает двери в реалистичный мир, где можно почти все. ? этих трех причин мне хватило, чтобы заморочиться использованием Box2D в игре. ? судя по всему оно того стоило!

Ложечка дегтя

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

Например, в моем случае самый яркий пример — это падение ценных вещей в воду или в пропасти. ?значально я не могу придумать как решить эту проблему так, чтобы игрок не чувствовал себя обманутым когда новый, только что выбитый крутой лут вдруг улетает в водоем. Сделать водоем плоскостью, чтобы не тонул? Будет странно выглядеть и все равно игрок не достанет его, потому что не может ходить по воде. Не давать вылетать за пределы проходимых тайлов — тогда они будут врезаться словно в невидимые стены.

А вот при использовании простой физической модели как в игре Santa Is Coming — с конфетами было все очень просто. Точка падения конфеты определялась строго заранее и конфета просто не могла упасть в пропасть или в непроходимую область. Так же в Санте нет бомб и конфеты ничего не может разбрасывать повторно уже после взрыва. Но если бы и были бомбы, то при повторном разбросе конфет они так же могли бы разлетаться только по проверенным клеткам, а с реалистичной физикой такое провернуть уже проблематично.

Хотя, если немного подумать, то в голову приходит решение: можно совместить простую физискую модель из санты с реалистичной физикой из Box2D! Проблема вроде бы решится, но вы наверное уже сами начали представлять какой тут нужно костыль сотворить, чтобы все вместе это работало хорошо!?

Так вот, после того, как стало понятно, что реалистичной физике в игре быть — остро встал вопрос о том, как её внедрить. В голове как обычно все выстраивается красиво и никаких проблемы не возникает, но когда дело дошло до реализации, то очень быстро начали возникать конфликты, а так же физический мир Box2D выкатил мне свои условия и ограничения на игру, и пришлось нам с физическим движком немного договариваться и уступать друг-другу. Но об этом я расскажу в следующей записи...

Другие записи из этой серии

  1. С чего все начиналось
  2. Ландшафтные приключения
  3. Анимация персонажей
  4. Поиск пути
  5. Физика в Knighttron
  6. Продолжение следует...

 

 

"удовлетворение от убийства" !-) дааааа

AlexKLS
15 Сентября 2015
— 13:24
#

Помню, в игре Lands of Lore была возможность бросаться любым предметом во врагов. Несмотря на то, что такой бросок отнимал мало жизней, он, помимо урона, блокировал врага на некоторое время, и он не мог атаковать тебя. Поэтому забрасывая его камнями и всем тем что под руку подвернётся можно было оттянуть удар, и дождаться когда удар персонажей восстановиться.

WeslomPo
15 Сентября 2015
— 13:34
#

?нтересненько!

SQUASH
15 Сентября 2015
— 16:26
#

Привет Антон!
Расскажи как ты делаешь анимацию смерти.

Yuriy
15 Сентября 2015
— 16:58
#

Ну не знаю даже. Вы говорите о реалистичности. О том, что вещи должны тонуть, и не должны биться о невидимую стенку, но при этом они разлетаются будто на дне сундука пружина стоит.
Можно ведь заранее не давать вещам импульс в сторону пропости или запрещенных ячеек.

Одинаковая анимация смерти? Думаю, что разработчики когда делают игры нехило накручивают себя. Особенно теорией. "Как будет интересно", "что надоедает" и прочее.
На деле же всё намного легче. Посмотрите к примеру на Diablo. Анимации смерти как под копирку у врага одного вида. По началу это делалось просто из-за техн. ограничений, дальше - оказалось, что это удачное решение (впрочем всё гениальное просто).
Таким образом отрабатывается момент "накопительства". Одинаковые враги, одинаковые смерти, одинаковый опыт с них. Эти вещи в голове складываются в "я убил целую пачку красных орков". ?грок может примерно представить эту величину. Когда же начинается рандом в анимациях, смертях, опыте и прочем, то у человека сбивается этот внутренний "счетчик". Ему уже трунднее сказать, что он убил кучу красных орков. Т.к. возможно там были и другие. А накопительство очень важно в играх связанных с RPG. Примеров можно много привести.

Еще есть такой момент, что одинаковость необходима чтобы мозг игрока в фоновом режиме понял что произошло, т.к. этот момент он уже видел. Например headshot в cs1.6. ?ли смерть врага в rpg играх. Это хороший ключ, который дает понимание буквально за первые доли секунд о том, что произошло и нужно переключаться на другое действие.

Отсюда же и построение групп монстров, где например 2 шамана и 5 обычных. ? это соотношение никогда не меняется. Т.к. человеку легче помнить, что сначала нужно убить 2-ух шаманов, а потом других. Это конечно немного другой пример, но всё равно подходит в качестве антипода для "зарандомить всё и вся".

Рандом в играх это вообще зло. Рандом это враг Опыта. Хоть игроки и ноют о том, что "всё заскриптовано" и тд. Но стоит сделать полный реализм в случайности, как игра становиться просто невыносимой. Всё же игра больше похожа на замок в который игрок вставляет ключ, крутит его и он открывается. Всё ради от удовольствия проворачивания и звука "ч-щелк" в конце. Вот и всё. Обидно когда ключ надо крутить то вправо, то влево. Да и звук открытия то настоящий, то электронный.

Todward
15 Сентября 2015
— 17:35
#

@Todward, а может Антон специально хотел обмануть ожидания игроков, привыкших к традиционным РПГ шаблонам. ?нди же!

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

Vik
15 Сентября 2015
— 21:34
#

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

Просто думая тут "расподание врага" сделано главным образом для удешевления прорисовки доп. анимаций смерти у каждого врага. А тема про "так создаётся неповторимые геймплейные моменты"- просто притянуть за уши уже после реализации.

Todward
15 Сентября 2015
— 22:39
#

@Todward,

> Вы говорите о реалистичности.

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

> но при этом они разлетаются будто на дне сундука пружина стоит.
Можно ведь заранее не давать вещам импульс в сторону пропости или запрещенных ячеек.


Это решает проблему только частично, так как по прежнему остаются взрывы и прочие непреодолимые силы которые могут влиять на физические объекты.

> Одинаковая анимация смерти? Думаю, что разработчики когда делают игры нехило накручивают себя. Особенно теорией. "Как будет интересно", "что надоедает" и прочее.

Я примерно понял что вы имеете в виду, но я считаю что анимация смерти не является важным атрибутом «накопительства» (триггером) для игрока, так как не несет никакой информационной нагрузки кроме удовлетворения и облегчения от убитого врага. С момента выхода Зомботрона я получил массу отзывов о том, что многие игроки перепроходили его по 10+ раз, а знаете почему? Потому что игра каждый раз протекает по разному, в ней важны все действия игрока, так как игрок своими действиями каждый раз запускает разные цепочки взаимодействия предметов на уровне и анимации смерти у варгов тут не на последнем месте, например: можно убить зомби так, что его, уже безизненное тело упадет на груду ящиков и обрушит их на других врагов. В Knighttron конечно нет такой зависимости, но визуально смотрится намного лучше.

Соглашусь пожалуй только с тем, что описываемое вами "накопительство" плохо работает в Knighttron, когда некоторые враги могут иметь разную экипировку и в итоге невозожно изучить и запомнить какой враг опаснее — вот это действительно в некотором роде проблема.

> Рандом в играх это вообще зло.

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

Ant.Karlov
15 Сентября 2015
— 22:54
#

@Vik, да, игра от части эксперементальная. В целом я считаю что она очень удалась по задумке, просто остались откровенно сырые моменты которые следовало бы доработать.

Признаюсь, мне очень приятно было читать дискуссии в комментариях на арморах о том как игру можно улучшить и доработать — это правда здорово когда игроки могут полноценно передать свои ощущения от игры и объяснить что именно их не устраивает. Раньше это было большой редкостью. По всей видимости различные EarlyAccess программы для игр сделали свое дело :)

Ant.Karlov
15 Сентября 2015
— 22:59
#

@Todward,

> Просто думая тут "расподание врага" сделано главным образом для удешевления прорисовки доп. анимаций смерти у каждого врага.

На базовый набор анимаций для одного персонажа/врага у меня уходило примерно 4-5 часов рабочего времени. Анимация смерти заняла бы +20-30 минут на объект, но она получилась бы всего одна и повторялась бы каждый раз. Возможность сделать реалистичные рэгдоллы в большей степени повлияла на решение использовать физ.библиотеку. Надеюсь, что прочитав следующую запись на эту тему, вы поймете, что нарисовать анимацию смерти для каждого врага было бы намного дешевле чем использовать физ.библиотеку.

Ant.Karlov
15 Сентября 2015
— 23:04
#

Наверное не так выразился. Рандом зло в играх подобного жанра. Он только годится для азартных моментов. Крафт, дроп, криты и прочее. Зомботрон совсем не тот пример. Там на рандоме всё и держится (как и в других экшен-играх).

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

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

Todward
16 Сентября 2015
— 02:31
#

Как пример взять гта5. Никто бы и не заметил новаторскую анимацию endorphin, если бы там не происходили совсем уж сумасшедшие падения, дтп и прочее.

Todward
16 Сентября 2015
— 02:38
#

Т.е. euphoria конечно же)

Todward
16 Сентября 2015
— 02:43
#

Box2D - медленный для флеш игр. Nape - в разы шустрее. ? к Nape есть примеры реализации Workers, чтоб физика считалась в фоном потоке.

Клевая статья, спасибо!

TheRabbit
17 Сентября 2015
— 11:38
#

Антон, расскажи, пожалуйста, как сделана анимация конфеты в Санте.
Т.е. есть точка... ? что с ней делаем дальше? =)))

XZX
17 Сентября 2015
— 15:54
#

@TheRabbit, да, Nape хорош, но я что-то к Box2D привык — у меня много инструментов заточенных под него, да и производительности вроде хватает для моих проектов, пока :)

Ant.Karlov
18 Сентября 2015
— 10:13
#

@XZX,

> Антон, расскажи, пожалуйста, как сделана анимация конфеты в Санте.

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

Если вы не играли в Santa Is Coming, то поиграть можно здесь...

Ant.Karlov
18 Сентября 2015
— 10:16
#

Антон, напиши о том что ты собираешь средства на Patreon на блогах gamedevblogs.ru
Серьезно, их читают и твои коллеги по цеху, и твои фанаты, кто-нибудь да присоединится))

GreenFest
18 Сентября 2015
— 13:07
#

Антон, я ошибся, как сделана физическая модель этой конфеты? По какой формуле движется, куда копать, я в физике не оч. :)

XZX
18 Сентября 2015
— 15:38
#

Блин, прикольно сделано! Это в игре куча коробок, и каждая падающая частичка, выбирает, сквозь какие проходит, а с какими соприкасается? Не догадался бы никогда так сделать, надо попробовать. Спасибо за посты, очень интересно читать. :)

forkandpie
18 Сентября 2015
— 17:16
#

Вот так и напрашивается 3d ландшафт (и возможно окружение) + 2d персонажи. Сколько бы проблем с окружением пропало, сколько бы возможностей открылось.(стрельба с луком и заклинания через препятствия например) Антон. Надеюсь ты доберешься до взрослых игр, сорвешь куш на благодарных фанатах и уедешь жить на собственный остров )

красаучык
20 Сентября 2015
— 10:12
#

@XZX, физика очень проста, при взрыве задаем произвольную скорость конфете. Скорость может быть задана случайными числами из заданного диапазона:

speedX = randomRangeInt(-5, 5);
speedY = randomRangeInt(-10, 10);

После чего отправляем конфету в полет:

candy.x += speedX;
candy.y += speedY;

Пока конфета летит, применяем модификаторы к скорости, например гравитацию и сопротивление с воздухом.

speedX *= 0.95; // Сопротивление, замедление.
speedY += 0.5; // Гравитация

Пока конфета в полете, следим за тем чтобы она не пролетела нужную позицию на полу:

if (candy.y >= floorY)
{
speedY *= -0.8; // Отскок от пола.
speedX *= 0.8; // Доп.замедление от трения при отскоке
}

Вот, собственно и вся физика для конфет. Если интересно посмотреть как это работает в действии, то дайте мне знать и я напишу небольшой наглядный пример с исходным кодом.

PS: Цифры в примерах абстрактные и вероятно их придется подгонять/менять чтобы получить более приемлемый результат.

Ant.Karlov
21 Сентября 2015
— 10:33
#

@forkandpie, в следующей записи про Knighttron постараюсь рассказать как именно это все работает :)

Ant.Karlov
21 Сентября 2015
— 10:42
#

@красаучык,

> Надеюсь ты доберешься до взрослых игр, сорвешь куш на благодарных фанатах

Knighttron — это как раз почти взрослая игра, просто платформа для нее не очень подходящая. Если её еще немного доделать то будет полноценный самостоятельный проект уже. Спасибо! :)

Ant.Karlov
21 Сентября 2015
— 10:44
#

@Ant.Karlov
Кстати, когда ты говорил о GPU в AntHill, ты имел ввиду использование OpenFL?
Вот например HaxeFlixel на нем, вроде ничего так выглядит.
p.s. Я все думаю мой Crimsonwood на мобилки тоже сделать, потому смотрю варианты.

nodoxi
21 Сентября 2015
— 22:33
#

@nodoxi, нет, я думаю о том, что если делать Anthill с аппаратной поддержкой, то это будет наверное стандартный флешовый GPU Molehill. В общем тоже самое что и Starling использует.

Ant.Karlov
23 Сентября 2015
— 10:36
#

А Happy Wheels ведь тоже создана с помощью Box2D?

Андрей Выдра
24 Сентября 2015
— 18:21
#

@Андрей Выдра,

> А Happy Wheels ведь тоже создана с помощью Box2D?

Да, скорее всего. Даже если и не на Box2D, то с использованием Nape. Но мне кажется что в этой игре используется Box2D. Можно посмотреть кредитсы этой игры, возможно там будет указано какую физическую библиотеку использует игра.

Ant.Karlov
25 Сентября 2015
— 10:36
#

@Todward
@Ant.Karlov
О рандоме. Всем геймдизайнерам остро необходимо периодически играть в настольные еврогеймы. Рандом это очень острый скальпель. То есть тонкий инструмент. Он бывает очень в тему, а бывает убивает игру. Зависит от реализации. Например перед игроком три одинаковые двери, за двумя из них его ждёт смерть. Такие игры бывают и это плохой рандом. ?ли генерация какрт в HoMM III. Это хороший радном.

Denis
28 Сентября 2015
— 10:06
#

@Denis, не уверен я по поводу необходимости игры в настольные РПГ. Так как это сильно на любителя и опыт от таких игр слишком узко-специализированный. Выше я уже писал что рандом должен быть сбалансирован индивидуально под каждую игру. Если не заниматься балансом рандома то, конечно, ничего хорошего из этого не получится.

?значально Knighttron планировался быть на 80% рандомной игрой. Но в итоге получилось так, что он на 80% хэндмэйд и только 20% рандома — это ради того, чтобы было интересно перепроходить игру повторно :)

Ant.Karlov
28 Сентября 2015
— 11:17
#

> Вот, собственно и вся физика для конфет. Если
> интересно посмотреть как это работает в
> действии, то дайте мне знать и я напишу
> небольшой наглядный пример с исходным кодом.

Если вас не затруднит. :)

XZX
28 Сентября 2015
— 15:51
#

@Ant.Karlov
Я с вами согласен. Только уточню, что я не имел в виду настольные РПГ. Еврогеймами называют настольные игры с простой, но затягивающей механикой основанной на базовой математике в сеттинге без насилия в основном для семейного досуга. Называют их так потому, что обычно они из Европы. Примерами могут служить "Каркассон", "Колонизаторы" и др. Я обращаю на них внимание потому, что правила их объясняются за пару минут а реиграбельность крайне высока. Происходит это благодаря рандому. При этом в "Каркассоне" рандом хороший, он только разнообразит партии, но не дает весомого преимущества игроку, в отличие от "Колонизаторов". Так происходит потому, что в первом, по итогам распределение будет ровнее чем во втором. Во-первых выборка длиннее, во-вторых влияние каждого случайного события на отдельного игрока ниже.
Я думаю это важно. Если есть рандом, то частый(!) и влияние каждого случайного события на игрока минимально. Хотя суммарное влияние может быть огромным и это не испортит игру.
Кроме рандома есть ещё одна важная тема. Разработчики игрового ПО часто не предают значения числам/игровым параметрам потому, что их считает не игрок, а компьютер. В результате ответная реакция игры на действие игрока становиться труднопрогнозируемой. Настольные еврогеймы учат геймдизайнера тому, что обратная связь должна быть предсказуема. Хорошей предсказуемостью обладает например тетрис. ?гроку не нужно проводить вычислений чтобы предвидеть результат падения фигуры.
Очень советую всем хотя бы посмотреть обзоры на эти игры с правилами.

Denis
28 Сентября 2015
— 21:39
#

@Ant.Karlov
Уважаемый Антон, можете ли вы в следующем обновлении Knighttron "добавить" немного физики - добавить возможность поднимать и бросать предметы вроде обломков и трупов врагов (для отвлечения внимания других врагов, а также просто для веселья) и передвигать большие объекты (бочки, ящики)?

DemonicWeed
10 Октября 2015
— 18:26
#

@Ant.Karlov, Физика лучшая, как и в ваших предыдуших играх. Сколько времени на это ушло! За физику 5++++++++

Лебединский Дмитрий
4 Ноября 2015
— 23:13
#