Пункт 0: отсев кладки по окну fore-клипа; закрыт BUG-CHEAT-FIGHT-1
Три шага пункта 0 из docs/perf_backlog.md. 1. Ранний выход из wall_pattern_palace по окну fore-клипа: узор целиком лежит в x [xh*8, xh*8+32), y [dmy-59, dby], и если окно его не задевает — возврат до первой заливки. Замер: от входа в узор до конца всего прохода 6 055 тактов вместо ~60 000 на тайл. 2. Отсев КАЖДОГО декаля (wp_blit) по реальному габариту. pop_blit_b тоже отсеивает до маппинга страницы, но по заведомо большему 64x64 — куски кладки высотой 3..12 px он пропускал и платил полный atlas_image + gfx_w0_map (~9 760 тактов на блит), чтобы там обнаружить, что рисовать нечего. Размеры сняты из каталогов атласов и заданы верхней границей по группе. 3. То же для ПОДЗЕМЕЛЬЯ: ранний выход wall_pattern (габарит выше — левая марка уходит на dby+POP_YOFF-67) плюс wp_blit на RNDBLOCK, обоих разделителях и обеих марках. Замер (уровень 4, комната 18, Кид сдвигается читом ] по пикселю, skip выключен, шесть тайлов в fore-окне, три из них — дворцовая стена): тайл стены ~12 700 вместо 60 000-74 000, fore-проход целиком 70 681 вместо 171 693, работа за кадр 419 839, период 3 растровых кадра вместо 4. Уровень 1 (подземелье) проверен снимком — кладка, марки, разделители на месте. Остаток в проходе — пролог pop_char_fore 17 208 тактов (пункт 1 backlog'а). Отдельно записано: на ШВЕ пролог разбухает до 134 730, причина не разобрана. BUG-CHEAT-FIGHT-1 (заведён 2026-08-07) закрыт по своему же плану: ветка ROOMNAV после kid_init/pop_kid_hp_reset гасит состояние схватки (Kid.sword = SWORD_0_SHEATHED, holding_sword, offguard, guard_refrac). Меч в инвентаре не теряется. Это болезнь чита: в оригинале телепорта между комнатами нет и в режим боя без соперника попасть нечем. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
|
||||
| ID | что | тип | статус |
|
||||
|----|-----|-----|--------|
|
||||
| [BUG-CHEAT-FIGHT-1](#bug-cheat-fight-1) | `+`/`−` в бою с вынутым мечом → Кид теряет управление | Major (чит) | открыт |
|
||||
| ~~BUG-CHEAT-FIGHT-1~~ | `+`/`−` в бою с вынутым мечом → Кид теряет управление | Major (чит) | **ЗАКРЫТ 2026-08-10** — [bug_closed.md](bug_closed.md#bug-cheat-fight-1) |
|
||||
| [BUG-SPIKE-1](#bug-spike-1) | пики залипают выдвинутыми рядом с Кидом | **низкий** | маловоспроизводимый: ни сценарием, ни попиксельной подгонкой X не поднимается |
|
||||
| [BUG-CHOMP-JUMP-1](#bug-chomp-jump-1) | прыжок с места вплотную к чомперу: кадр с отступом назад | **низкий** | маловоспроизводимый: на повторе не поднялся; на пререлиз |
|
||||
| [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт |
|
||||
@@ -52,44 +52,6 @@
|
||||
|
||||
Ниже — то, что осталось открытым после прогона 2026-08-07.
|
||||
|
||||
<a id="bug-cheat-fight-1"></a>
|
||||
## BUG-CHEAT-FIGHT-1. Чит `+`/`−` в бою: Кид остаётся в режиме боя и теряет управление
|
||||
|
||||
**Наблюдение (пользователь, 2026-08-07).** Если нажать `+`/`−` (ROOMNAV,
|
||||
переход по комнатам) в момент, когда Кид вытащил меч для битвы, — в новой
|
||||
комнате Кид не управляется: нажатия стрелок игнорируются.
|
||||
|
||||
**Корень (прочитан по коду, сверен с seg005).** Чит ROOMNAV
|
||||
(`roomtest.c:576`) телепортирует и сбрасывает позу и HP —
|
||||
`enter_room()`, `kid_init(SEQ_STAND, …)`, `pop_kid_hp_reset()`, — но **не
|
||||
трогает состояние боя**: `Kid.sword` остаётся `SWORD_2_DRAWN`. Диспетчер
|
||||
`pop_control` (`pop_ctrl.c:578`) при вынутом мече уходит в
|
||||
`control_with_sword`, а там единственный выход из режима боя —
|
||||
|
||||
```c
|
||||
if (Char.frame == FRAME_171_STAND_WITH_SWORD) { /* seg005:987 */
|
||||
Char.sword = SWORD_0_SHEATHED;
|
||||
seqtbl_offset_char(SEQ_92_PUT_SWORD_AWAY);
|
||||
}
|
||||
```
|
||||
|
||||
Стража в новой комнате нет (`can_guard_see_kid` = 0), кадр после
|
||||
`kid_init(SEQ_STAND)` — обычная стойка, а не 171, поэтому не срабатывает ни
|
||||
`swordfight()`, ни ветка «убрать меч»: `control_with_sword` каждый кадр
|
||||
не делает НИЧЕГО, и ввод не доходит до движения. Заклинивание вечное.
|
||||
|
||||
Это баг **нашего чита**, а не порта: в оригинале телепорта между комнатами
|
||||
нет, и в режим боя без соперника попасть нечем.
|
||||
|
||||
**Как чинить.** В ветке ROOMNAV телепорт трактовать как выход из боя (то же
|
||||
самое, что делает `pop_start_level`): `Kid.sword = SWORD_0_SHEATHED`,
|
||||
`holding_sword = 0`, сбросить `offguard`/`guard_refrac` и состояние стража
|
||||
(`pop_guard_reset()` вызывается по входу в комнату — проверить, что он
|
||||
обнуляет `Opp`). Меч в инвентаре (`pop_have_sword`) при этом НЕ терять.
|
||||
Второй кандидат на ту же болезнь — чит `K` (убить стража) в момент, когда
|
||||
Кид в стойке с мечом, но не в кадре 171: там оригинал сам доводит до 171
|
||||
через `swordfight`, так что проверить сценарием, а не менять вслепую.
|
||||
|
||||
<a id="bug-spike-1"></a>
|
||||
## BUG-SPIKE-1. Пики залипают выдвинутыми — НИЗКИЙ ПРИОРИТЕТ, МАЛОВОСПРОИЗВОДИМ
|
||||
|
||||
@@ -310,7 +272,7 @@ Smoke-прогон уровня 3 (пользователь, 2026-08-05) дал
|
||||
- **ROOMNAV (`=`/`-`) — тоже наш чит**, которого в оригинале не было, как и
|
||||
`S`. Все они со временем съедутся в общий блок читов, разрешаемый в
|
||||
настройках; пока просто включены (`pop_cheats = 1` в `roomtest.c`).
|
||||
Известный баг этого чита — [BUG-CHEAT-FIGHT-1](#bug-cheat-fight-1).
|
||||
Известный баг этого чита закрыт — [BUG-CHEAT-FIGHT-1](bug_closed.md#bug-cheat-fight-1).
|
||||
- Комнаты **13, 18, 24 уровня 1 недостижимы** в обычной игре — это свойство
|
||||
данных уровня (разбор — «НЕ БАГИ» в [`bug_closed.md`](bug_closed.md));
|
||||
приоритет багов в них низкий. Аналогично 23/24 на уровне 3.
|
||||
|
||||
Reference in New Issue
Block a user