Двое мужиков и женщина без лица
В партии на боевом сервере из-за угла вышли двое мужиков. В состоянии игры появилась одна запись:
npc_watchers_men descriptor = «двое мужиков из-за угла»
Один персонаж на двоих человек. Дальше всё, что игра умеет делать с персонажем, стало делаться с парой разом: один портрет на двоих, одно отношение к герою, одна шкала доверия. Умереть они тоже могли только вместе.
Женщина без лица
Почти сразу пришёл второй отчёт, с виду совсем про другое: в свежей партии у персонажа нет портрета. Женщина на крыльце, герой с ней разговаривает, картинки нет.
Первое подозрение — сломалась генерация изображений. Пошли смотреть логи.
А там пусто. Ни одной ошибки: запросы отвечают как надо, кэш пополняется, последняя картинка нарисована несколько минут назад.
Пустой лог и оказался ответом. Генерация не падала — её никто не просил.
Портрет рисуется по одному полю, appearance: одна-две строки про лицо, одежду, приметы. У женщины на крыльце это поле было пустым. Нет описания — не из чего собрать ключ картинки; нет ключа — нечего ставить в очередь. Персонаж остался без лица не потому, что рисовальщик не справился, а потому что заказ никто не оформил.
Отдельно полезное наблюдение: мы специально пишем в лог каждую неудачу генерации. Поэтому пустой лог здесь — это не «ничего не видно», а полноценный вывод. Если бы ошибки не записывались, та же пустота ничего бы не значила, и вечер ушёл бы на поиски несуществующей поломки.
Что общего
В инструкции Мастеру написано и то, и другое. Толпу и «двоих» отдельной записью заводить нельзя. appearance при встрече лицом к лицу обязателен.
Ни то, ни другое ничем не проверялось. Про эту болезнь мы уже писали в разборе про кузнеца: пока правило никто не проверяет на выходе, оно остаётся пожеланием. Повторяться не будем — на этот раз интереснее оказался следующий вопрос.
Куда возвращать отказ
Обычное место для таких проверок у нас — валидатор: он разбирает изменения мира, которые предложил Мастер, и отклоняет невозможные. Туда и просилось: увидел «двоих» — отклонил, увидел пустое описание — отклонил.
И это была бы ошибка хуже исходной.
Отклонённое изменение просто выбрасывается. Текст хода при этом уже написан и уже показан игроку. Значит, женщина на крыльце осталась бы в тексте — и не попала бы в мир. Мастер продолжил бы с ней разговаривать, а игра считала бы, что рядом никого нет.
Персонаж без картинки — мелкая неприятность. Персонаж, которого видит игрок и не видит игра, — это та самая рассинхронизация текста и состояния, с которой мы боремся всё это время. Меняли бы царапину на перелом.
Поэтому отказ подняли на уровень выше — в описание самого хода. Разница в том, кто узнаёт об ошибке. Отклонение в валидаторе никому ничего не сообщает. Ошибка в разборе хода возвращается Мастеру вместе с объяснением, и он переписывает ход целиком — уже с одним человеком вместо двоих и с описанием лица.
Правило, которое из этого следует, простое: отказ не должен обходиться дороже самой ошибки. Прежде чем что-то запрещать, стоит посмотреть, что останется на месте запрещённого.
Одно слово
Проверка на «толпу» смотрит только на первое слово описания. Это не экономия, а необходимость.
«Главарь банды» — совершенно законный персонаж: один человек, названный через группу, которой он верховодит. Он и в наших же примерах приведён как образец хорошего описания. Проверка, которая ищет слово «банда» где угодно в строке, вычеркнула бы его.
Первое слово несёт смысл: описание, которое начинается с «двое», «толпа», «отряд», — про многих. То, что начинается с «главарь», — про одного.
Список слов там короткий и заведомо неполный. Разбирать русскую морфологию всерьёз ради этого не стоит: пропустить редкий случай не страшно, а вот запретить живого персонажа — страшно.
Что дальше
Обе проверки уже на боевом сервере. Что будет дальше, мы честно не знаем: Мастер может начать заводить по одному человеку из группы, как задумано, а может начать спорить с проверкой. Второе тоже увидим — переписанные ходы видно в логах.
Заодно проверили на живом сервере то, из-за чего всё это чуть не сломалось иначе: «главарь банды» по-прежнему заводится без возражений. Один человек, названный через свою банду, — законный персонаж, и проверка обязана его пропускать.
А двое мужиков из-за угла так и останутся в старой партии одной записью. Чинить прошлые сохранения мы не стали.