fix(dg): let a sleeping player use commands near a "*" command trigger - #3783
Merged
Conversation
Спящий игрок не запускает command-триггеры -- но раньше команда при этом ещё и съедалась: триггер отвечал "Сделать это в ваших снах?" и возвращал 1, то есть "команду обработали". А compare_cmd для арглиста "*" совпадает с любой командой, и такие триггеры не редкость. Рядом с любым из них спящий не мог выполнить вообще ничего -- в том числе "проснуться": на каждую команду приходил один и тот же ответ, и выбраться можно было только реконнектом. Так это и поймал Мородей. Проверка позиции теперь просто пропускает триггер, а команду разбирает интерпретатор, у которого своя проверка минимальной позиции: "проснуться" исполняется, а всё, что спящему не положено, он и отсечёт сам. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH
kvirund
added a commit
that referenced
this pull request
Aug 27, 2026
Конфликт один, в command_wtrigger: мастер поменял поведение для спящего игрока (#3783 -- триггер не запускается, но команду у игрока не отбираем, continue вместо сообщения и return 1), а в ветке та же строка переведена со strn_cmp на utils::IsAbbr. Взято поведение мастера с вызовом из ветки.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Багрепорт от Мородея: лёг спать, а на
прос/проснутьсяполучал «Сделать это в ваших снах?». Помог только реконнект.Что происходит
Командные триггеры проверяются в
interpreter.cppдо поиска самой команды. Если триггер совпал, а игрок спит, движок отвечал и забирал команду себе:Достаточно, чтобы арглист триггера совпал с набранной командой. В мире такие есть, и совпадают они как раз с
проснуться— это командные триггеры комнат снов:проснутьсяпроснуться очнуться пробудиться выйти… проснуться проснуть просну прос пропроснутьсяУснув в такой комнате, игрок попадал в тупик: команду
проснутьсязабирал триггер, а сам триггер не запускался, потому что игрок спит. Всё остальное работало, но проснуться было нельзя — оставался только реконнект (при входе позиция восстанавливается). С самой командой при этом всё в порядке: у неё минимальная позицияkSleep, интерпретатор её пропускает — просто до интерпретатора дело не доходило.Триггер на
*(compare_cmdвозвращает истину для любой команды) запирал бы вообще всё, но таких в мире сейчас нет — проверил всеtriggers.yaml.Стамина к делу отношения не имеет, она только объясняет, почему он лёг спать.
Что сделано
Спящий игрок по-прежнему не запускает command-триггеры, но команду у него больше не отбирают: проверка позиции пропускает триггер (
continue), и команду разбирает интерпретатор со своей проверкой минимальной позиции.проснутьсяработает, а всё, что спящему не положено, интерпретатор отсечёт сам — своим же сообщением.Правка в трёх местах
dg_triggers.cpp:command_mtrigger,command_otrigger,command_wtrigger.О чём стоит знать
залезть), спящий игрок теперь получит «Чаво?» вместо «Сделать это в ваших снах?» — команды-то такой в таблице нет. Менее информативно, зато не запирает. Если хочется сохранить сообщение, можно отвечать только когда арглист не*, — скажи, переделаю.command_wtriggerпроверкаkFightтак же отвечает «Вы не можете это сделать в бою» и забирает команду, то есть триггер на*в комнате глушит любые команды в бою. Не трогал — это отдельное решение, там сообщение может быть намеренным.Проверено
Сборка чистая, 585 тестов зелёные, малый мир поднимается. Юнит-тестом не покрыть: нужен мир с триггером, спящий игрок и интерпретатор.
🤖 Generated with Claude Code
https://claude.ai/code/session_01XUwDWDnYdXrJdvjDVd36QH