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