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

Кузнец, которого не было в комнате

В одной из тестовых партий герой стоял у колодца в деревне Гнилой Брод и говорил с травницей. Рядом, по мнению игры, был и кузнец. На самом деле кузнец работал у себя в кузнице — о нём просто упомянули в разговоре: «Староста, Прон. Кузнец».

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

Откуда взялся лишний человек

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

Правило простое и, как выяснилось, совершенно верное. Сломалось не оно.

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

Логика отработала ровно так, как задумано. Ошибка была в масштабе места.

Правило существовало. Проверки не было

Самое неприятное: нужное правило было записано. В трёх местах.

Оно было в проектном документе. Оно было в описании самой модели места — «локация это наименьшая ячейка, в которой осмысленно спрашивать „кто здесь“; крупный контейнер вроде города — это родитель, а не сцена». Оно было в описании инструмента, которым Мастер создаёт новые места, и там же был готовый параметр для указания родителя.

Ничто из этого не проверялось при выполнении. Правило было записано — и оставалось пожеланием.

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

Почему это не косметика

Если бы дело было только в списке имён на экране, мы бы поправили отображение и забыли.

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

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

Что поменяли

Правило стало проверкой:

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

Что мы из этого вынесли

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

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

Теперь всю деревню сценой сделать нельзя. Можно прийти к колодцу.