← Все записи

Отряд4 мин чтения

Лица и имена: солдаты со всего мира

Как бойцы Terminal Leave получили страну, происхождение, имя и портрет, которые сходятся друг с другом, — и как игра заговорила на двух языках.

... к тому времени у бойцов были позывные, звания и навыки, но не было главного: они не выглядели и не звались как люди. В карточке стояли позывной и цифры, на месте лица — заглушка. Следующий шаг (проект тогда назывался UOR) это изменил, и заодно игра научилась говорить на двух языках. Обе задачи оказались связаны сильнее, чем я ожидал.

С чего начинается боец

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

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

В третьей версии порядок обратный: сначала происхождение, потом всё остальное. Теперь у каждого бойца одна цепочка, и каждое звено зависит от предыдущего:

  1. Происхождение. Их десять: славянское, западноевропейское, средиземноморское, скандинавское, ближневосточное, южноазиатское, восточноазиатское, юго-восточноазиатское, африканское, латиноамериканское. У каждого свой вес — как часто оно встречается среди рекрутов. Население в весах по-прежнему учитывается, но сглаженно, поэтому большие страны больше не вытесняют остальные.
  2. Страна внутри происхождения. У каждой группы свой список стран со своими весами. Одна страна может входить в несколько групп: в многонациональной стране живут люди разного происхождения, и два бойца из Франции не обязаны выглядеть одинаково.
  3. Пол. Женщины в пуле рекрутов есть, но встречаются реже мужчин.
  4. Имя и фамилия — из набора этой страны. Наборов на сегодня почти две сотни, по одному на страну, и в них только настоящие имена: от двух-трёх десятков до сотни с лишним на список.
  5. Портрет — из тех, что подходят по происхождению и полу.

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

Вся цепочка идёт от одного seed, как и остальная генерация в игре: тот же seed даёт того же человека. Портрет и имя при этом в бою ни на что не влияют. Симуляция их не читает, и детерминизм боя от них не зависит.

Фамилии

Во многих языках фамилия зависит от пола: Иванов и Иванова. Сначала я хотел выводить женскую форму правилом — добавить окончание, и всё. Правило ломается на первом же исключении, а исключений в фамилиях больше, чем правил. Русская фамилия на «-ых» не меняется вовсе. Польская меняется только у части: Kowalski становится Kowalska, а Nowak остаётся Nowak. Литовская меняет не одну букву, а весь хвост: Kazlauskas — Kazlauskaitė. В Исландии вместо фамилии отчество, и у дочери оно другое: не «-son», а «-dóttir».

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

Портреты

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

Портрет показывается везде, где есть боец: в досье, в экипировке, на экране найма, на мемориале и в бою, на панели выбранного солдата.

Два языка

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

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

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

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

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

Зачем всё это

Можно было оставить «Боец 1» и «Боец 2» и заниматься механикой. Но постоянные солдаты — одна из опор игры, и она не работает без лица. Потерять «Бойца 4» не жалко. Потерять человека с именем, с которым прошёл десять боёв, — другое дело.

Подробнее о том, что происходит с бойцами дальше, — в статье «У каждого солдата есть лицо».