Skip to content

fix(skills): announce knockdown after the blow, not before it - #4198

Open
bylins wants to merge 1 commit into
masterfrom
fix/effect-message-before-damage
Open

bylins wants to merge 1 commit into
masterfrom
fix/effect-message-before-damage

Conversation

@bylins

@bylins bylins commented Nov 14, 2026

Copy link
Copy Markdown
Owner

Жалоба игрока: «сообщение приходит раньше чем пнул».

Германский рыцарь упал на землю!
Вы УЖАСНО пнули германского рыцаря, его аж скрючило от боли.

Могучий воевода упал на землю!
Ваш мощный пинок отправил могучего воеводу к праотцам.

Где

Пинок, kick.cpp. Ветка критической удачи меняла позицию жертвы и печатала $N упал$A на землю! до вызова dmg.Process. В самом сообщении нет ни слова о пинке, поэтому игрок видел следствие раньше причины, а при смертельном ударе — ещё и раньше сообщения о смерти.

Бросок, throw.cpp. То же самое: PerformShadowThrowSideAbilities печатает «Попадание копья повалило $n3 наземь», сажает жертву и вешает чары, и вызывался до damage.Process.

Как чинится

Образец взят из баша, bash.cpp:254 — там уже правильно:

damage = dmg.Process(ch, vict);
// Сам баш:
if (vict->GetPosition() > EPosition::kSit) {
    vict->SetPosition(EPosition::kSit);

Там же видно, зачем нужен возврат: отрицательное значение означает, что жертва убита (damage.cpp:973).

Пинок. Условие падения вычисляется до урона (множитель dam *= 2 остался на месте), применение и объявление перенесены после. Случай смерти отсекается самой проверкой позиции: у убитого kDead = 0, что меньше kSit = 6 — ровно как в баше.

Бросок. Вызов побочной способности перенесён после damage.Process и выполняется только при неотрицательном возврате, то есть на труп чары больше не вешаются.

Что это меняет в игре

  • Порядок строк: сперва удар, потом падение.
  • Если удар оказался смертельным, строки про падение больше не печатаются вовсе и эффект не применяется. Раньше в пинке садили на землю того, кто уже умирал, а в броске вешали молчание/оцепенение на труп.
  • Внутри пульса всё остальное без изменений: множители урона, шансы, длительности не трогались.

Проверено

  • Сборка build/ (release, с тестами) без предупреждений.
  • ./tests/tests — 872 проходят, 3 отключены давно (Vedun_*).
  • Просмотрены остальные умения, которые печатают сообщение рядом с Process: в disarm.cpp урон нулевой (fight::kZeroDmg), после него сообщений нет — порядок не нарушен.

🤖 Generated with Claude Code

Жалоба игрока: сообщение приходит раньше, чем пнул.

  Германский рыцарь упал на землю!
  Вы УЖАСНО пнули германского рыцаря, его аж скрючило от боли.

  Могучий воевода упал на землю!
  Ваш мощный пинок отправил могучего воеводу к праотцам.

Пинок (kick.cpp): ветка критической удачи меняла позицию жертвы и печатала
"$N упал$A на землю!" до того, как вызывался dmg.Process. В сообщении нет ни
слова о пинке, поэтому игрок видел следствие раньше причины, а при
смертельном ударе -- раньше сообщения о смерти.

Бросок (throw.cpp): то же самое. PerformShadowThrowSideAbilities печатает
"Попадание копья повалило $n3 наземь", сажает жертву и вешает чары, и
вызывался он до damage.Process.

Образец взят из баша (bash.cpp:254): сперва damage = dmg.Process(...), и
только потом SetPosition. Там же видно, зачем нужен возврат -- отрицательное
значение означает, что жертва убита (damage.cpp:973).

Пинок: условие падения вычисляется до урона (множитель dam *= 2 остался на
месте), а применение и объявление перенесены после. Случай смерти отсекается
проверкой позиции: у убитого kDead = 0, что меньше kSit = 6, -- так же, как
в баше.

Бросок: вызов побочной способности перенесен после damage.Process и
выполняется только при неотрицательном возврате, то есть на труп чары
больше не вешаются.

Сборка без предупреждений, 872 теста проходят (3 отключены давно).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant