Что это
Это сервер для многопользовательской игры Red Dead Redemption 2. Технически он работает на RedM, так называется режим, который позволяет играть в эту игру вместе с другими людьми на своём сервере. Я взялся собрать на нём маленький город, где жители не стоят декорациями, а живут.
Владелец проекта сформулировал это так: игроки делают что хотят, грабят, торгуют, помогают, охотятся, а мир на это отвечает. Лавочник запоминает грабителя. Шериф усиливает патрули. На голову вешают награду. В основе игры лежит четыре шага: игрок что-то сделал, мир это запомнил, мир изменился, мир предложил новую историю.
Зачем это нужно
В обычной игре город сделан из картона. Ударь торговца, отойди, вернись через минуту, и он встретит тебя как ни в чём не бывало. Мне хотелось проверить обратное: что будет, если у каждого жителя есть имя, работа, расписание и память о том, что с ним сделали.
В описании замысла есть принцип, который я взял за главный. Игрок не центр вселенной, а ещё один обитатель жестокого и равнодушного мира. Вернувшись в город через две игровые недели, он должен удивиться, как всё изменилось без него.
Как устроено
Свои ресурсы проекта разбиты на десять частей. Одна отвечает за общую память и часы, другая за самих жителей, третья за реакцию города и закон, четвёртая за слухи и встречи на дорогах. Есть ещё лавки, доска объявлений, городская власть, работы для игрока и отряды игроков. Всё это я посчитал: около 27 тысяч строк кода. Части не вызывают друг друга напрямую, а обмениваются короткими сообщениями о фактах вроде «убит человек» или «ограблена лавка». Сообщение только сообщает факт, а как на него реагировать, решает получатель.
Игровые сутки длятся четыре часа реального времени. Именных жителей в городе восемнадцать, у каждого есть место, распорядок и свои привычки. Кроме расписания у них есть потребности вроде голода, усталости и нужды в деньгах, а также черты характера.
Память устроена так. Для каждой пары «человек и человек» или «человек и игрок» хранятся четыре числа: доверие, симпатия, страх и вражда. Числа записываются в базу и переживают перезапуск сервера, а со временем понемногу тают. Свидетель преступления, и сама жертва тоже, запоминает игрока: у него сдвигаются страх и симпатия. Если коротко, NPC помнят, кто их ударил. Отдельно есть общая слава игрока, одна шкала на весь мир. Она привязана к персонажу, и выйти из игры и зайти снова, чтобы сбросить дурную славу, не получится.
Один урок стоил мне дороже остальных. Сначала я задавал жителям координаты вручную, и почти каждая жалоба владельца сводилась к одному: человек стоит «под горой» или «на крыше». В комментарии к коду сохранилась одна такая жалоба: кузнец в порядке, а женщина стоит в поле. Теперь место у карты спрашивают, а не придумывают. Разработчики игры расставили по городу сценарные точки: стул, скамья, стойка бара, наковальня. Я снял такую карту с помощью специального инструмента, и в ней 366 точек 32 видов. Из 1811 названий сценариев, которые ходят по сообществу, на карте Валентайна подтвердились только 33. Остальные придуманы, и назначать их без проверки бессмысленно.
Ещё одно решение: фигурки людей создаёт компьютер игрока, а не сервер. Когда их создавал сервер, их не видел никто. Сервер остался мозгом: решает, кому кого показать, и ведёт расписание, а показывает всё компьютер игрока.
Что уже работает
- Именные жители Валентайна живут по распорядку, работают, ходят в салун, разговаривают друг с другом.
- Убитого именного жителя заменяет заранее заведённый преемник. Тот человека не воскрешает: это новый человек, игрока он не знает. Если убили шерифа, город остаётся без закона на несколько игровых суток.
- Вендетта. Если убить именного жителя, его близкие запоминают убийцу: у них растут вражда и страх. Кто оказался рядом, бросает дела и бежит на место. Месть держится пять игровых суток, и при встрече дело кончается дракой.
- Закон: уровни розыска, шериф, тюрьма. Срок в тюрьме теперь отсчитывает сервер, после того как игрока однажды навсегда заперли в камере из-за сбоя.
- Ограбление лавки: касса настоящая, за один налёт уносят не больше 60 долларов, чтобы не разорить лавку сразу. Пустая касса порождает слух, что лавка задолжала.
- Городская власть. Мэр принимает одно решение в сутки и объявляет его вслух. В казну идёт налог с лавки.
- Охота по-настоящему: убить зверя, принести, разделать и продать. Есть и первая замкнутая цепочка производства, с дровами.
- Доска объявлений у здания шерифа: заявки от жителей создаются раз в игровой час, всего шесть шаблонов.
- Слухи и встречи на дорогах за городом.
- Если сервер лежал, время не пропадает: игровые часы догоняются, но не больше чем на трое суток.
Что пока не работает
Здесь я хочу быть честным. Часть из этого я не проверил в игре, а значит, не могу за это ручаться.
- Ограбление лавки и покерный стол написаны и запущены, но вживую их никто не опробовал. Покер я не писал сам, а поставил чужой открытый ресурс и чуть подправил его, чтобы он вообще запускался.
- Модели некоторых жителей, мэра и надгробий подобраны вслепую, по спискам из сообщества. Проверить их можно специальной панелью, но эта проверка ещё не сделана.
- В README «Фундамент» до сих пор значится как ожидающий живого теста игроков. Публичный тест в плане стоит последним пунктом, а записей о том, что он был, в документах нет.
- Награда за голову на доске объявлений пока только слова. Мэр её объявляет, но это никак не связано с настоящей охотой на преступника. Для этого нужно решение владельца: что вообще значит «поймать виновного».
- Вендетта между самими жителями, ссора, драка, погоня, разыгрывается, но не сохраняется при перезапуске сервера. Погоня это не преследование шаг за шагом, а поездка к известной точке.
- Уровень розыска игрока, судя по заметке в коде, живёт только в памяти сервера и не записывается в базу.
- Дальние окраины города, такие как ферма, роща и рудник, не сняты на карту, и про них мы не знаем, есть ли там мебель. Нужен игрок, который пройдёт там с инструментом.
- Только один город. Другие города по плану идут позже.
- Большая часть того, что описано в замысле, в коде отсутствует. Ни эпидемий, ни лесных пожаров, ни караванов, ни забастовок я в нём не нашёл. Сам документ замысла честно называет себя тем, куда мы идём, а не тем, что делается завтра.
- Мозг жителей устроен проще, чем в проектном документе, на который я ориентировался. Выбор занятия идёт через набор расписаний с приоритетами, поверх которых добавлены потребности, черты и небольшой случайный шум. Отдельной потребности в развлечении нет.
Что дальше
Проект на паузе. Ждёт возврата к разработке.