← Дневник разработки

Двое мужиков и женщина без лица

В партии на боевом сервере из-за угла вышли двое мужиков. В состоянии игры появилась одна запись:

npc_watchers_men   descriptor = «двое мужиков из-за угла»

Один персонаж на двоих человек. Дальше всё, что игра умеет делать с персонажем, стало делаться с парой разом: один портрет на двоих, одно отношение к герою, одна шкала доверия. Умереть они тоже могли только вместе.

Женщина без лица

Почти сразу пришёл второй отчёт, с виду совсем про другое: в свежей партии у персонажа нет портрета. Женщина на крыльце, герой с ней разговаривает, картинки нет.

Первое подозрение — сломалась генерация изображений. Пошли смотреть логи.

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

Пустой лог и оказался ответом. Генерация не падала — её никто не просил.

Портрет рисуется по одному полю, appearance: одна-две строки про лицо, одежду, приметы. У женщины на крыльце это поле было пустым. Нет описания — не из чего собрать ключ картинки; нет ключа — нечего ставить в очередь. Персонаж остался без лица не потому, что рисовальщик не справился, а потому что заказ никто не оформил.

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

Что общего

В инструкции Мастеру написано и то, и другое. Толпу и «двоих» отдельной записью заводить нельзя. appearance при встрече лицом к лицу обязателен.

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

Куда возвращать отказ

Обычное место для таких проверок у нас — валидатор: он разбирает изменения мира, которые предложил Мастер, и отклоняет невозможные. Туда и просилось: увидел «двоих» — отклонил, увидел пустое описание — отклонил.

И это была бы ошибка хуже исходной.

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

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

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

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

Одно слово

Проверка на «толпу» смотрит только на первое слово описания. Это не экономия, а необходимость.

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

Первое слово несёт смысл: описание, которое начинается с «двое», «толпа», «отряд», — про многих. То, что начинается с «главарь», — про одного.

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

Что дальше

Обе проверки уже на боевом сервере. Что будет дальше, мы честно не знаем: Мастер может начать заводить по одному человеку из группы, как задумано, а может начать спорить с проверкой. Второе тоже увидим — переписанные ходы видно в логах.

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

А двое мужиков из-за угла так и останутся в старой партии одной записью. Чинить прошлые сохранения мы не стали.