Repository navigation
Conversation
Флаги незаметности в бою снимает сам affect_total по GET_ENEMY, а возвращала их после боя защёлка kEafInvisible: SetFighting запоминал "на входе в бой инвиз был", stop_fighting ставил флаг обратно. Безусловно, без оглядки на источник, отчего из трёх случаев правильно работал один. Инвиз с вещи, надетой до боя, возвращался верно. Инвиз от заклинания возвращался тоже -- хотя Appear снёс аффект на первом уроне, и персонаж выходил из боя невидимым без источника, до первого попутного пересчёта. А надетый или наложенный посреди боя не возвращался вовсе: защёлку взводит только вход в бой, так что живой аффект оставался с опущенным флагом до следующего affect_total -- то есть до перенадевания вещи. Теперь флаги возвращает тот же пересчёт, который их подавлял: он поднимает их из живых источников и не возвращает снятое заклинанием, потому что узла уже нет. GET_ENEMY на этот момент пуст, подавлять нечего. Пересчёт зовём для игрока и для чармиса. Обычному мобу он не нужен: его незаметность заново поднимает мобий пульс в mobile_activity по ENpcFlag::kInvis -- и делает это уже после проверки на GetEnemy, то есть вне боя. Чармису этого мало: пульс вернёт только прототипный флаг, а наложенную или надетую на него незаметность вернуть больше нечем. Защёлка kEafInvisible больше не нужна, бит убран. Closes #4091 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Закрывает #4091.
Как было
Флаги незаметности в бою снимает сам
affect_totalпоGET_ENEMY(affect_data.cpp:1340), а возвращала их после боя защёлка:Защёлка запоминала только «на входе в бой инвиз был» и ставила флаг обратно безусловно, без оглядки на источник. Из трёх случаев верно работал один:
Appearснёс аффект на первом уроне, и персонаж выходит из боя невидимым без источника — до первого попутного пересчётаaffect_total, то есть до перенадевания вещиПериодического пересчёта, который раньше это подчищал, в хербите давно нет, и в
stop_fightingего тоже не было — я проверил все 67 вызововaffect_total: это события (надеть/снять, еда,set, наложение аффекта, смерть на арене), ни одного в раунде боя.Как стало
Флаги возвращает тот же пересчёт, который их подавлял:
Он поднимает флаги из живых источников — вещь и живой аффект вернёт, снятое заклинанием не вернёт, потому что узла уже нет.
GET_ENEMYна этот момент уже обнулён выше, так что подавлять нечего.Пересчёт только для игрока и чармиса. Обычному мобу он не нужен: незаметность ему заново поднимает мобий пульс в
mobile_activityпоENpcFlag::kInvis, причём уже после проверкиif (ch->GetEnemy() || ch->get_wait() > 0) continue;, то есть вне боя. Чармису этого мало — пульс вернёт только прототипный флаг, а наложенную или надетую на него незаметность вернуть больше нечем.Это не возврат периодического пересчёта: один вызов на выход из боя, не чаще, чем сейчас на надевание вещи.
Условие тут не для красоты. Исторически полный пересчёт звался из
reset_affects— через неё проходит каждый умирающий, — и на АОЕ это означало столько пересчётов, сколько трупов за раунд. Оттуда его и убрали. Условие!ch->IsNpc() || IsCharmice(ch)держит нас в стороне от того же самого: массовая смерть мобов доaffect_totalне доходит вовсе, пересчёт получают только игрок и его чармисы. Убрать условие — вернуться в ту же историю через другую дверь.За шагом боя есть чем следить: гистограмма
heartbeat.step.durationс меткойstep="Violence performing"(в Prometheusheartbeat_step_duration_*). База до правки — 0.639 мс в среднем за полчаса. Квантили по ней считать бесполезно, границы бакетов заданы в секундах; смотреть надо среднее иheartbeat_missed_pulses_total.Защёлка
kEafInvisibleстала не нужна — бит убран, комментарий про максимум плоскости поправлен наkEafFirstPoison.Проверка
Сборка
-Dbuild_profile=release -Dbuild_tests=trueбез предупреждений,./tests/tests— 796 passed, 3 skipped (те же, что и до правки).🤖 Generated with Claude Code