Перейти к содержимому

Как эволюционирует искусственный интеллект в Total War и как мы остановим Скайнет

Интервью провела сотрудница Creative Assembly Элла МакКоннелл.

Total War без компьютерных оппонентов, против которых можно, собственно, вести тотальную войну, был бы совсем иной игрой. Мультиплеер дарит много удовольствия, но ведь не всегда под рукой есть товарищ, готовый стать орочьей грушей для битья в 2 часа ночи после нескольких кружек пива. Тут-то и приходит на помощь искусственный интеллект.

Мы поговорили с Тимом Гослингом, одним из ведущих специалистов по ИИ в Creative Assembly, и он рассказал нам про цели и развитие искусственного интеллекта в играх серии Total War. Когда ИИ должен быть сильным противником, когда – забавным, а когда – угрозой для всего человечества?

CA: Привет, Тим! Для начала не мог бы тпредставиться?

Tim Gosling: Привет! Я доктор (доктор философии, или Ph.D. – учёная степень в Британии и других странах, примерно соответствующая кандидату наук в России – прим. ред.) Тим Гослинг, технический директор по ИИ для игр Total War. Я руковожу командой, которая занимается разработкой искусственного интеллекта ботов как в режиме кампании, так и в тактических боях Total War. Я пришёл в Creative Assembly в 2006 году: тогда я работал над новым ИИ для режима кампании в Empire: Total War. Так что я этим делом давно занимаюсь!

Сперва позвольте мне подчеркнуть, сколько усилий мы прикладываем, чтобы развивать искусственный интеллект для Total War. Для этой серии игр требуются надёжные системы ИИ, и я рад работать в команде умелых и преданных своему делу программистов, дизайнеров и тестировщиков, которые могут обеспечивать Total War такими системами. Они делают потрясающую работу вопреки всем трудностям.

Что ты подразумеваешь под термином «искусственный интеллект» в контексте Total War?

«Искусственный интеллект» может означать разные вещи для разных людей, но в контексте Total War я подразумеваю ИИ, который играет в игру так же, как игрок-человек. То есть я говорю о некой форме поведенческого ИИ.

Здесь речь идёт о поведенческом подходе к проблеме ИИ, который подразумевает разделение системы ИИ на несколько автономных программ поведения, которые включаются в зависимости от тех или иных условий среды— прим. ред.

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

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

Расскажи, как ИИ работает в кампании Total War: что и как он делает?

Сперва надо сказать, что это очень трудная задача для ИИ. В стандартной кампании Total War очень много разных функционирующих компонентов и взаимосвязанных систем. Мы часто говорим о коэффициенте ветвления, то есть о всех возможных вариантах действия игрока в определённый момент времени (если говорить чуть проще, то это количество возможных ходов игрока из той или иной позиции/на том или ином ходу— прим. ред.) Даже на старте кампании со всеми имеющимися в игре системами и взаимосвязями число этих вариантов может быть колоссальным!

Коэффициент ветвления у нас в играх гораздо выше, чем, скажем, в шахматах или го. Пару лет назад специалисты по ИИ, вооружившись кучей специализированного ПО, наконец смогли победить самых сильных игроков в го с помощью системы AlphaGo. Это было большим достижением, потому что у них это получилось раньше, чем кто-либо рассчитывал. В го игроки ходят поочерёдно чёрными и белыми фишками на поле размером 19 на 19 линий и прекрасно видят ходы друг друга (задача игрока — окружить фишки противника и не дать ему окружить свои — прим. ред.) Звучит довольно просто, но игра знаменита своей стратегической глубиной, множеством тонкостей и необходимостью долговременного планирования (в нашей команде есть игроки в го).

Давайте сравним с обычной кампанией Total War. В ней могут быть
миллионы позиций, сотни поселений, армий (разных составов),
агентов, десятки активных фракций, между которыми построены различные дипломатические отношения и которые могут делать множество действий за один ход. И всё это может быть скрыто в тумане, могут быть неизвестны расположения определённых элементов и результаты некоторых действий. Хотя расположение армий друг относительно друга в Total War играет несколько меньшую роль, чем расположение фишек в го, с точки зрения вычислений ИИ должен брать его в расчёт. А возможных вариантов расположения в кампании чрезвычайно много, и это лишь варианты дислокаций армий!

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

Как же нам удаётся решать эти невероятно комплексные проблемы своевременно, сохраняя индивидуальность ИИ и предоставляя игрокам челлендж? Мы действуем методом «разделяй и властвуй»!

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

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

Итак, для постройки зданий мы используем метод шаблонов, и используем метод подробного поиска для того, чтобы вычислять куда и каким образом перемещать войска. Отдельные подсистемы реагируют на то, что происходит в игре, но их конкретная реакция регулируется контрольными данными, настроенными членами нашей команды. Наши дизайнеры ИИ способны сформировать различные «ИИ-личности», настроенные таким образом, чтобы подсистемы действовали по-разному в зависимости от «ИИ-личности» и игрового контекста. Это сложная задача, от которой зависит общее впечатление от кампании и конкретных фракций-ботов.

В отличие от ИИ, над которыми работают в рамках соревнований или научных исследований, у нашего ИИ главная задача не победить, а развлекать. ИИ, по сути, не может победить. Это могут делать только игроки-люди, а задача ИИ – сделать путь к победе игрока увлекательным. Даже если бот сможет побороть игрока (ИИ не может победить, но игроки могут проиграть), это тоже может быть интересно.

Из-за этого нам приходится прибегать решениям, которые могут выглядеть довольно оригинально. В целом, ИИ нельзя быть на уровне очень умелого игрока-человека, как из-за вычислительных ограничений, так и из-за того, что некоторые типы логики очень трудны для систем ИИ (в этой области ведутся интенсивные исследования). Однако есть ситуации, когда боты могут с лёгкостью обыграть игрока, ведь некоторые задачи требуют анализа, с которым компьютер справляется лучше человека. В таких раздражающих случаях, когда игрок не может обыграть ИИ, мы намеренно позволяем ИИ делать ошибки, что он казался немного «человечнее». Это работает как в кампании, так и в тактических боях, мы к этому ещё вернёмся чуть позже.

С технической точки зрения, есть необходимость поддерживать баланс между эффективностью, распределением доступной памяти, временем, которое ИИ тратит на игровой ход, и т.д. Одной из крупнейших побед для нашей команды был переход на 64-битную систему, что позволило нам использовать гораздо больше доступной памяти на ускорение обработки данных. Также нам сильно помогает большой кэш для приблизительного расчёта расстояний.

Многоядерные процессоры, как ни странно, не особо повлияли на нашу работу – в некотором объёме они позволяют делать обработку данных параллельно, что нам помогало, но множество взаимодействий, с которыми мы имеем дело, по своей природе линейны, из-за польза нескольких ядер для нас довольно ограничена. Однако мы постоянно работаем над улучшением работы ИИ и добиваемся в этом успехов, как можно заметить в сокращенном времени ожидания хода ИИ в обновлении Shadow and Blade для Warhammer II.

А что насчёт ИИ боёв? Чем он отличается от ИИ кампании?

У ИИ боёв (как и у ИИ кампании) главная задача в том, чтобы играть как человек. Для это ИИ управляет своими доступными отрядами и старается победить (ИИ боёв имеет реальный шанс на победу!). Движения отдельных солдат в отрядах не контролируются ИИ и считаются элементом симулированного окружения.

Задачи ИИ тактических боёв отличаются от задач ИИ кампании. Вместо того, чтобы множество фракций боролись за власть в пошаговом режиме на одной большой карте со множеством элементов, здесь ситуация более «скованная». Однако теперь действие происходит в реальном времени, и необходимо брать в расчёт такие вещи, как позиции отрядов, их типы, их состояние и их умения, не говоря уже про местность и т.п. Чтобы адекватно играть в таких условиях, необходимо владеть как тактическим пониманием обстановки, так и стратегическим. Как я и говорил, у ИИ кампании есть множество возможностей выбора. То же самое верно и для ИИ тактических боёв, хотя это и не настолько очевидно. Вдобавок, появляется необходимость учитывать такой фактор, как выбор подходящего момента для действия.

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

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

Поэтому ИИ боёв разительно отличается от ИИ кампании. Большое внимание уделяется распределению процессов принятия решений на разные стратегические и тактические уровни, от крупных стратегических решений до отдельных выборов (например, что конкретно должны делать отряды при столкновении с врагом). Уровни делят крупные стратегические решения на конкретные задачи и группируют отряды таким образом, чтобы задачи выполнить. Есть и дополнительные подсистемы, выполняющие специфические функции (на подобии тех, что есть в кампании). Они могут отвечать, например, за специальные способности и использование осадных орудий.

Можно провести и другие параллели, например, с проблемами вроде распределения ресурсов. Назначение задач отдельному отряду в бою отличается от назначения задач целой армии на глобальной карте, хотя и есть очень важные сходства и возможности для «обмена знаниями». Есть множество других специфичных проблем, например, поддержание боевого порядка на открытой местности или соблюдение ботом баланса между наиболее целесообразными и внешне аутентичными действиями. Эти элементы коммуникации и использования элементов геймплея с помощью учитывания позиций отрядов наиболее выражены в ИИ боёв (и системах ниже ИИ по иерархии), нежели в ИИ кампании.

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

Как происходило развитие ИИ с момента вашего прихода в CA?

Первой игрой, над которой я работал, была Empire: Total War, поэтому не являюсь экспертом по ИИ более ранних игр. В Empire мы работали с чистого листа, и одной из главных задач для нас было обособление ИИ от остальных элементов игры. В предыдущих играх системы ИИ находились в параллели с другими элементами геймплея – что было довольно эффективно, но создавало море проблем при необходимости внести изменения (из-за зависимостей между системами). Это не страшно при работе небольшой командой разработчиков над играми с более скромными базами исходных кодов, но чем амбициознее проект, тем менее надёжной становится эта система. Empire был очень амбициозным проектом.

Это разделение позволило отдельным командам работать независимо с меньшим риском помешать друг другу. Хотя, конечно, налаженная коммуникация между командами по-прежнему необходима. Мы до сих пор придерживаемся этой практики, и этот подход приносит плоды.

С тех пор системы ИИ стали гораздо сложнее, как и сами игры, и наше понимание того, каким должен быть игровой ИИ, тоже стало более комплексным.

Я бы мог рассказать о множество изменений, но для ИИ кампании самым большим нововведением со времён Empire стало использование метода поиска по дереву Монте-Карло (MCTS, Monte-Carlo Tree Search — это алгоритм принятия решений, задача которого — просчитать возможные ходы и найти наиболее выигрышный — прим. ред.) вместе с системой задач по перемещению войск и агентов в Rome 2. Прототип этого нововведения понадобился для дополнения Shogun 2 – Fall of The Samurai, в котором геймплей на земле и на море стал куда более связанным.

При разработке Rome 2 мы развили эту тему и создали новую Систему Управления Задачами (TMS, Task Management System), которая стала базой, вокруг которой был разработан более эффективный метод управления перемещениями по глобальной карте. В этот период были также добавлены новые системы, а прежние – улучшены, и это были очень серьёзные изменения. Помимо чисто технических нововведений, мы хотели также дать больше возможностей дизайнерам, чтобы им было проще настраивать стиль игры ИИ. Поэтому много усилий ушло на разработку методов для «самовыражения», вдобавок к традиционным способам, которое мы использует для решения задач, связанных с ИИ.

Это привело к разработке системы «Личности ИИ», позволяющей нам задавать наборы данных для управления ИИ на разных уровнях решения задач, в зависимости от важности задач в каждой игре. Для Warhammer III мы создали новую систему, предоставляющую много возможностей для дизайнеров, и позволяющую нам более эффективно взаимодействовать с некоторыми нововведениями. В дальнейшем мы планируем предоставлять ещё больше возможностей для наших дизайнеров, попутно развивая доступные технические решения и добавляя новые.

ИИ боёв также пришлось адаптироваться к новым изменениям в игровом процессе. В Empire, например, появились морские бои, для которых было необходимо написать отдельную вариацию ИИ. Кроме того, как я уже говорил ранее, более сложные по конструкции поселения нуждаются в дополнительных уровнях систем поддержки, чтобы ИИ понимал своё окружение и мог реагировать соответствующе.

В случае с поселениями я говорю не только о навигации, но и, например, следующих вещах: «Стоит ли оборонять стены крепости? Если да, то когда их стоит покинуть?» и так далее. Подобные вещи делают ИИ гораздо более многогранным. Опять же, особые сложности появились и при добавлении артобстрелов с моря, что только усугубилось с введением магии и летающих существ в Warhammer.

Летающие юниты представляют собой дополнительную проблему, поскольку их тип движения отличается от того, с которым система сталкивалась ранее, и ей нужно взаимодействовать с ними по-новому. Ранее упомянутые стены внезапно могут стать не настолько важными, ведь теперь их можно просто перелететь! Это даёт новые тактические возможности.

Итак, добавление, удаление или изменение какого-либо элемента геймплея не происходит в изоляции, оно связано с тем, как этот элемент взаимодействует с другими элементами. Это сложно с точки зрения геймплея, и отследить, как эти изменения отразятся на действиях ИИ, тоже довольно сложно.

Что вызывает наибольшие трудности при разработке ИИ для игр серии Total War?

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

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

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

Бывали ли ситуации, когда поведение ИИ выглядело глупо, но на самом деле он принимал мудрые решения?

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

Также ИИ нередко намеренно совершает ошибки, но их очевидность зависит от опыта игрока. Обычно это делается, чтобы развлечь игрока. К примеру, дальность перемещения — штука, в которой ИИ кампании хорош, потому что точно знает, как далеко все могут двигаться, поэтому он может ставить свои войска как раз за пределами радиуса атаки войск противника. Это один из немногих случаев, в которых ИИ может переиграть человека, и это очень раздражает игроков.

Чтобы полностью избавиться от этой проблемы, нам пришлось добавить фактор погрешности, чтобы ИИ иногда делал ошибки и позволял игроку этим пользоваться. Такое решение получило позитивный отклик от игроков, хотя для ИИ это не самое разумное решение (кроме того, мы всей командой, как правило, болеем за ИИ, поэтому нас самих немного печалит такое решение, пускай оно и является верным).

Похожая проблема была в Three Kingdoms, когда ИИ во время сражения мог идеально противодействовать стрельбе из луков, используя правильно подобранные боевые порядки. А является ли это проблемой? Ну, да, если вы хотите, чтобы игрокам казалось, что они принимают верные тактические решения, при этом не делая ИИ совсем беспомощным. Поэтому мы сделали так, чтобы на более низкой сложности ИИ не защищался от стрел активно, что дало игрокам испытать ощущение «Ура, я застал его врасплох!»

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

Бывали ли у вас какие-то особо забавные закулисные случаи, когда получалось добиться от ИИ нужного результата?

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

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

Надо сказать, что наша команда – те еще весельчаки. Однажды каждый решил на выходных испечь пирог для коллег, больше никому об этом не сказав! Не самое полезное для здоровья начало недели, зато вкусное! А ещё у нас репутация весьма хорошо вооружённой команды, хотя наше вооружение — это всего-навсего пара бластеров Nerf на человека да топор, который нам подарили. Мечи и доспехи мы обычно храним дома (для сотрудников компании, специализирующейся на создании исторических игр, иметь такое вполне нормально, не правда ли?). Ещё мы частенько использует цитаты из научной фантастики в сообщениях об ошибках, чтобы привлечь внимание людей, и это отлично работает!

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

Какие области ИИ в играх интересуют вас наиболее всего в плане того, как их можно использовать в играх Total War?

Мне кажется, что сейчас очень интересный этап развития ИИ: всё больше людей понимают его огромный потенциал, при этом не только в играх. Очевидно, что я предвзят, но мне кажется, что ИИ – ключевой рубеж для игровой индустрии. Качество графики в играх постоянно улучшается, от чего они теперь выглядят великолепно, но я думал, что следующий шаг – развитие того, как игровые элементы ведут себя во время игры. Нам хочется правдоподобных персонажей, которые разумно реагируют на различные ситуации. Какими методам мы может воспользоваться, чтобы добиться этого?

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

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

Спасибо, что уделили нам время! Хотите что-нибудь сказать напоследок?

Всего пожалуйста, было очень приятно рассказать о наших системах ИИ!

Кроме того, если кто-то из читателей заинтересован в ИИ и играх, мы постоянно в поиске новых сотрудников, так что следите за нашей страницей для соискателей!

Оригинал на английском языке

Подписаться
Уведомление о
0 комментариев
Inline Feedbacks
Показать все комментарии