Боевая стойка без меча: чит бессмертия ставил seq_74 не глядя на меч
Кида сталкивают с ряда 1 на ряд 2, страж падает за спину — Кид встаёт в боевую стойку без меча и перестаёт реагировать на клавиши. Оба симптома — один отказ: control() уходит в control_with_sword только при sword == 2, а для кадров стойки (158/170/171) среди обычных веток нет ни одной. Разворот к сопернику за спиной (SEQ_60 при char_opp_dist() < -4) живёт как раз внутри control_with_sword. Корень — наш чит, а не механика. hurt_by_sword перехватывался бессмертием в самом начале и безусловно ставил SEQ_74_HIT_BY_SWORD, а это анимация «получил удар В БОЕВОЙ СТОЙКЕ», её кадры 150..179 все с мечом. В оригинале (seg002) туда попадают только из ветки sword == 2; безоружного там убивают: «Being hurt when not in fighting pose means death», take_hp(100). Спецветка чита удалена целиком — она избыточна: под бессмертием pop_take_hp(1) и так возвращает 0, и обычный путь сам даёт seq_74 с сохранённым мечом. Осталось запретить читу действовать в безоружной ветке. Глушится вызов, а не pop_take_hp: тот общий с физикой (падения/пики/ чомперы), там бессмертие обязано работать при любом положении меча. Проверено в MAME: в бою удары урона не приносят, без меча — смерть с одного удара. Разбор и грабли метода — BUGS_CLOSED.md#bug-cheat-imm-1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -964,18 +964,27 @@ static const uint8_t REFRACTIMER[NUM_GUARD_SKILLS] =
|
||||
static void hurt_by_sword(void)
|
||||
{
|
||||
if (Char.alive >= 0) return;
|
||||
/* Чит бессмертия перекрывает и «безоружного закалывают насмерть»:
|
||||
* без этого Кид гибнет с одного удара мимо стойки, и чит бесполезен
|
||||
* ровно там, где нужен. Анимацию удара оставляем. */
|
||||
if (Char.charid == CHARID_0_KID && pop_immortal) {
|
||||
pop_char_set_seq(SEQ_74_HIT_BY_SWORD);
|
||||
Char.y = (uint8_t)pop_y_land[Char.curr_row + 1];
|
||||
Char.fall_y = 0;
|
||||
play_seq();
|
||||
return;
|
||||
}
|
||||
if (Char.sword != SWORD_2_DRAWN) {
|
||||
/* Удар мимо боевой стойки в оригинале СМЕРТЕЛЕН (seg002: «Being
|
||||
* hurt when not in fighting pose means death», take_hp(100)), и
|
||||
* чит бессмертия сюда НЕ распространяется — он работает только в
|
||||
* бою, то есть с мечом в руке.
|
||||
*
|
||||
* Раньше чит перехватывал hurt_by_sword целиком и безусловно ставил
|
||||
* SEQ_74_HIT_BY_SWORD. Но это анимация «получил удар В БОЕВОЙ
|
||||
* СТОЙКЕ»: её кадры (150..179) все с мечом, и Кид оказывался в них
|
||||
* при sword == 0. Диспетчер control() при sword != 2 в
|
||||
* control_with_sword не идёт, а среди обычных веток кадра 158/170/171
|
||||
* нет ни одной — управление зависало намертво: Кид стоял в боевой
|
||||
* стойке без меча и не разворачивался к сопернику (BUG-CHEAT-IMM-1).
|
||||
*
|
||||
* Ветку глушим на время вызова, а не правим pop_take_hp: тот общий
|
||||
* с физикой (падения/пики/чомперы), и там бессмертие обязано
|
||||
* работать при любом положении меча. */
|
||||
uint8_t imm = pop_immortal;
|
||||
pop_immortal = 0;
|
||||
pop_take_hp(100);
|
||||
pop_immortal = imm;
|
||||
pop_char_set_seq(SEQ_85_STABBED_TO_DEATH);
|
||||
} else if (Char.charid != CHARID_4_SKELETON && pop_take_hp(1)) {
|
||||
pop_char_set_seq(SEQ_85_STABBED_TO_DEATH); /* HP кончились */
|
||||
|
||||
Reference in New Issue
Block a user