Боёвка двумя оружиями в D&D 5e: как репорт "кинжал не лезет во вторую руку" стал честной механикой

Бой двумя оружиями в D&D 5e - это бонусная атака вторым лёгким оружием после обычной атаки первым. В ИИ-мастере DnD эту механику починили 25 августа 2026 года: добавили отдельные слоты для рук, блокировку versatile-хвата и гард дубликатов, так что кинжал во второй руке теперь работает по правилам, а не по содержимому рюкзака.
Боёвка двумя оружиями в D&D 5e: как репорт “кинжал не лезет во вторую руку” стал честной механикой
Игрок написал в чат коротко: кинжал не хочет вставать во вторую руку. Всё, больше деталей не было - но этого хватило, чтобы вскрыть механику, которую ИИ-мастер DnD до того честно не умел: бой двумя оружиями по правилам 5e. Разбираемся, как должна работать боёвка двумя оружиями по правилам, что было не так у бота, и что изменилось за один рабочий день.
Как работает бой двумя оружиями в D&D 5e
Бой двумя оружиями (Two-Weapon Fighting) в D&D 5e - это возможность после обычной атаки основным оружием нанести бонусным действием ещё один удар оружием во второй руке. Условие одно: оба оружия - лёгкие (кинжал, скимитар, короткий меч, ручной топор), по одному в каждой руке. К урону от второй атаки модификатор характеристики не прибавляется, если он не отрицательный - плюс даёт только черта или боевой стиль владения двумя оружиями.
Звучит просто, но именно в этой простоте и была проблема бота: у него всё это держалось не на понятии “лёгкое оружие в каждой руке”, а на банальном переборе инвентаря.
Пример на пальцах: плут с двумя кинжалами атакует обычным действием - бросок на попадание, при удаче урон 1к4 плюс модификатор Ловкости. Дальше бонусным действием идёт вторая атака вторым кинжалом: снова 1к4, но уже без модификатора, если он не отрицательный. Итог - два броска на попадание за ход вместо одного, а не двойной урон: прирост скромнее, чем кажется на первый взгляд, и разменивается на стабильность, а не на разовый крит.
Бой двумя оружиями чаще берут плуты и следопыты - те, кому важна скрытная атака и лишний шанс попасть, а не один огромный удар двуручником. В соло-игре с ИИ-мастером это особенно заметно: тут нет соседа за столом, который на словах подскажет “а ты точно можешь ударить вторым кинжалом” - либо движок честно считает правила, либо билд персонажа просто не работает так, как задуман.
Почему бот не давал держать кинжал во второй руке
До фикса у персонажа был один жёсткий слот на оружие - main_hand, без пары под вторую руку. Бот сканировал инвентарь по ключевым словам вместо того, чтобы смотреть, что реально экипировано, и из-за этого мог посчитать бой двумя оружиями от кинжала, который просто лежал в рюкзаке, а не в руке. Урон от кинжала, который валяется в рюкзаке? Не бывает. А бот раньше мог его насчитать - и одновременно молча не пускал точно такой же кинжал в реальную вторую руку. Игроку из репорта не оставалось ничего: кнопка “Экипировать” просто отказывалась, и бой двумя оружиями оставался недоступен.
Разбор репорта показал, что дело не в конкретном кинжале, а в самой архитектуре слота: с одним оружием в основной руке бот вёл себя правильно, а вот второй экземпляр - что в основную руку, что во вторую - упирался в одно и то же поле main_hand. По сути весь бой двумя оружиями держался на переборе слов в описании инвентаря, а не на реальном состоянии слотов: движок искал в списке предметов что-то похожее на второе оружие, а не проверял, что конкретно надето в каждой руке.
Заодно вскрылся старый сосед этой же проблемы: до появления пары слотов на руки при пустом equipped бот тихо откатывался к “бою голыми руками” - 1к1 без бонусов силы. На бою это не всегда заметно сразу, а по факту урон падал почти до нуля.
Что изменили: слоты для рук, гард дубликатов и умная кнопка
Что было → что стало. Раньше - одно поле main_hand и перебор инвентаря по словам. Стало - пара слотов main_hand/off_hand, проверка validate_equip при экипировке и вторая атака бонусным действием, которая срабатывает автоматически по факту того, что реально надето, а не по содержимому рюкзака.
Отдельно почистили пограничные случаи. Во-первых, гард дубликатов: чтобы надеть два одинаковых кинжала, в инвентаре должен быть стак quantity >= 2 - иначе бот больше не даёт “раздвоить” один и тот же предмет. В интерфейсе такие стаки теперь помечены бейджем ×N, чтобы было видно с первого взгляда. Во-вторых, кнопка “Экипировать” на листе персонажа поумнела - сама решает, в какую руку положить лёгкое оружие, не заставляя игрока лишний раз тыкать в настройки.
Почему двуручный хват и кинжал во второй руке не совмещаются
Если оружие универсальное (versatile) - например, длинный меч - и его держат двумя руками ради лишнего кубика урона, вторая рука занята этим же оружием, и никакого кинжала в неё не влезет. Это не баг и не прихоть бота, а прямое следствие правил: универсальный хват в две руки требует обе руки, значит свободной под второе оружие не остаётся.
В боте это раньше было проверено криво или не проверено вовсе - теперь занятая вторым хватом рука честно блокирует off_hand-слот, так же, как за столом с живым мастером: нельзя одновременно рубить двуручным хватом и колоть кинжалом.
Тут есть и более тонкий момент из правил: за свой ход можно бесплатно взаимодействовать с одним предметом, и смена хвата формально попадает под это правило. То есть по книге персонаж в одном раунде вправе рубить длинным мечом двумя руками, а в следующем - перехватить его одной рукой и достать кинжал во вторую. Для бота это отдельная история за пределами текущего фикса - здесь чинили конфликт хватов “здесь и сейчас”, а не полный цикл смены оружия между раундами.
От репорта до прода: что заняло 3,5 часа
Прямой ответ: от репорта игрока до проверенного на проде фикса прошло около 3,5 часов - это бэкенд-логика слотов и боя, фронтенд с новой кнопкой, полный прогон юнит-тестов (6665 на бэке и 270 на фронте) и ручная проверка в реальном бою в тот же день.
6665 тестов на бэке гоняются не только под этот фикс - весь набор целиком при любом изменении боевого движка, чтобы правка одного слота не отвязала что-то на другом конце боя: скажем, инициативу или подсчёт хитов монстра. Отдельные 270 тестов фронта проверяют, что кнопка “Экипировать” и бейджи стаков не поехали визуально после правок интерфейса.
Для соло-проекта, где боевой движок нельзя сломать наполовину, это нормальный темп: чинить в лоб, гонять весь набор тестов, а не только новые, и проверять руками - не потому что тестам не доверяю, а потому что бой в D&D 5e - это ровно то место, где нюансы правил цепляются друг за друга, и один пропущенный кейс аукается в следующем. Кстати, паралич - тоже такой кейс: там механика ломалась тише, но чинилась по тому же принципу - сначала понять, что реально происходит в бою, потом чинить причину, а не симптом.
Бот - активная стройка, и такие вещи будут вылезать ещё не раз: 5e не маленький свод правил, и каждая непроверенная механика когда-нибудь встретится с игроком, который решит попробовать именно её. Приоритет тут не по красивому роадмапу, а по тому, что реально мешает играть прямо сейчас - конкретный репорт всегда обгонит абстрактный план. Кубики за игрока бот тоже не кидает сам - та же логика: доверять правилам, а не угадывать намерение игрока по тексту сообщения. А если где-то у монстров бой выглядит странно - там своя история, и цели у монстров в бою тоже не только “убить партию”.
Ребят, если наткнётесь на похожую нестыковку в бою - пишите в чат бота или в канал, разберём так же быстро, как в этот раз :)
Частые вопросы
Можно ли драться двумя одинаковыми кинжалами в D&D 5e?
Да, если оба кинжала лёгкие и по одному в каждой руке. В ИИ-мастере DnD для этого в инвентаре нужен стак из двух кинжалов (quantity ≥ 2) - иначе бот не даст экипировать вторую копию.
Добавляется ли модификатор силы или ловкости к урону от второго оружия?
Нет, если модификатор положительный - по правилам D&D 5e он прибавляется к бонусной атаке только при отрицательном значении, либо если у персонажа есть боевой стиль владения двумя оружиями.
Почему нельзя держать длинный меч двумя руками и кинжал одновременно?
Двуручный хват versatile-оружия занимает обе руки по правилам D&D 5e, поэтому свободной руки под второе оружие не остаётся - это не ограничение бота, а сама механика.
Как готовился материал: черновик собирает мой ИИ-конвейер по темам из практики таверны, факты сверяются с первоисточниками и правилами, финальную версию я читаю и правлю руками перед публикацией. Обложку тоже рисует нейросеть. Про кухню — на странице о проекте.