Бессмертие: два уровня вместо тумблера

1 — только бой: удары мечом не отнимают HP (ветка в hurt_by_sword).
2 — плюс мелкий урон: не проходят «минус деление» от падения с двух
    этажей и от падающей плиты (pop_take_hp гасит count < 100).
Мгновенная смерть остаётся на обоих: пики, чомпер, падение с трёх этажей
и удар вне боевой стойки приходят с count = 100.  В коде ровно два
значения урона, 1 и 100, поэтому граница точная, а не эвристическая.

Заодно ушёл костыль «снять бессмертие на время вызова take_hp(100)» в
hurt_by_sword — он был нужен только потому, что прежний чит глушил и
смертельный урон.

Клавиша I идёт по кругу 0 -> 1 -> 2 -> 0; в отладочной метке число
красных палочек = уровень.
This commit is contained in:
2026-08-20 10:08:52 +03:00
parent 10b920f156
commit 0ef8c4b60e
6 changed files with 33 additions and 11 deletions
+7 -6
View File
@@ -973,14 +973,15 @@ static void hurt_by_sword(void)
* нет ни одной — управление зависало намертво: Кид стоял в боевой
* стойке без меча и не разворачивался к сопернику (BUG-CHEAT-IMM-1).
*
* Ветку глушим на время вызова, а не правим pop_take_hp: тот общий
* с физикой (падения/пики/чомперы), и там бессмертие обязано
* работать при любом положении меча. */
uint8_t imm = pop_immortal;
pop_immortal = 0;
* Костыля «снять бессмертие на время вызова» здесь БОЛЬШЕ НЕТ:
* pop_take_hp гасит только урон меньше 100, а тут ровно 100. */
pop_take_hp(100);
pop_immortal = imm;
pop_char_set_seq(SEQ_85_STABBED_TO_DEATH);
} else if (Char.charid == CHARID_0_KID && pop_immortal) {
/* ЧИТ, уровень 1 и выше: в боевой стойке удары не отнимают HP.
* Кадр «получил удар» оставляем — иначе бой перестаёт читаться,
* да и оригинал на выживший удар ставит ровно его. */
pop_char_set_seq(SEQ_74_HIT_BY_SWORD);
} else if (Char.charid != CHARID_4_SKELETON && pop_take_hp(1)) {
pop_char_set_seq(SEQ_85_STABBED_TO_DEATH); /* HP кончились */
} else {