TUNE-2: параметры стражей в CFG-файл (формат секций как у SDLPoP)

This commit is contained in:
2026-08-20 10:23:20 +03:00
parent 0ef8c4b60e
commit 47c26d1899
+45 -1
View File
@@ -230,8 +230,9 @@ fore-слоя, и клип (`clip_char`), и брызги; полоса HP и л
| # | Задача | Что | Блокирует |
|---|--------|-----|-----------|
| — | [DRAW-COST](#draw-cost) | **кадр уложился в бюджет 2026-08-09**: 470 964 -> 425 600 тактов, период цикла 4 растровых кадра -> **3**. Дальнейшее — запас, не срочность | плавность на ВСЕХ уровнях |
| | [L1-SPEED](#l1-speed) | игра на ~39 % быстрее оригинала | ощущение от ВСЕХ уровней; берётся в любой момент |
| | [L1-SPEED](#l1-speed) | **закрыта 2026-08-19** режимами скорости (NORMAL = 4/5 растров, как оригинал) | — |
| — | [TUNE-1](#tune-1) | параметры движка → cfg-файл (сейчас `pop_tune.h`) | отладка таймингов и моды; берётся по мере надобности |
| — | [TUNE-2](#tune-2) | параметры СТРАЖЕЙ (6 таблиц по 12 градаций мастерства + HP) → cfg-файл | подбор сложности боя без пересборки |
| — | [MEM](#mem-next) | следующий шаг разгрузки W1/W2 | берётся по факту нехватки места |
Сделанное — в [`TASKS_CLOSED.md`](TASKS_CLOSED.md): L4-MIRROR, L3-CHOMP,
@@ -1168,6 +1169,49 @@ HP/минуты, номера «особых» комнат и уровней (
**Оговорка по памяти.** Парсер и таблица параметров — холодный код,
исполняется один раз при старте: кандидат в банк, а не в резидент W1.
### <a id="tune-2"></a>TUNE-2. Параметры СТРАЖЕЙ — в CFG-файл
Частный, но самый востребованный срез [TUNE-1](#tune-1): сейчас весь ИИ
стража зашит константами, и чтобы попробовать «а если он будет блокировать
пореже» — надо пересобирать.
**Что настраивать.** Всё, что индексируется мастерством (12 градаций,
`NUM_GUARD_SKILLS`), — таблицы в `guards.c`:
| таблица | что решает | дефолт для навыка 4 |
|---|---|---:|
| `STRIKEPROB` | вероятность удара | 61 |
| `RESTRIKEPROB` | добить из своего парирования | 5 |
| `BLOCKPROB` | заблокировать замах | 200 |
| `IMPBLOCKPROB` | то же, когда Кид только что пробил блок | 100 |
| `ADVPROB` | наступать | 255 |
| `REFRACTIMER` | «отдышка» после ранения, кадров | 8 |
| `extrastrength` | надбавка HP (сейчас зашита как `skill == 4 ? 1 : 0`, `pop_guard_cold.c`) | 1 |
Плюс не зависящее от навыка: `tbl_guard_hp[16]` (`pop_level_cold.c`) — база
HP по уровню, и навык скелета (`SKEL_SKILL`) / тени (`SHADOW_SKILL`).
**Формат — как у SDLPoP**, чтобы правки переносились в обе стороны без
перевода: секции `[Skill 0]`..`[Skill 11]`, внутри `strikeprob=`,
`blockprob=` и т.д. (`options.c:439`, пример — `SDLPoP/SDLPoP.ini:562`).
Имена ключей брать ЕГО, регистр игнорировать.
**Чего НЕ делать.** Навык конкретного стража живёт в данных уровня
(`level.guards_skill[комната-1]`, читаем в `pop_level_guard`) — его в CFG
не тащим, иначе разъедется с файлами уровней. Переопределение «в комнате
N навык M» — отдельная надобность, если понадобится, то как явная секция
`[Level N]`, а не подмена данных.
**Зачем это стоит сделать.** Прогон 2026-08-20 (11/22, навык 4) дал
ощущение «страж тяжелее, чем в SDLPoP». Сверка кода расхождений не нашла
(протокол — в `../docs/impl_diff.md` и в ответе сессии: дистанция,
диспетчер, три ветки ИИ, шесть таблиц, `justblocked`, `check_hurting`,
`parry`, `swordfight`, порядок тиков, откат seq_74 = −10 — всё совпало
побайтно). Проверить такую гипотезу можно только подбором чисел на живом
прогоне, а для этого их надо крутить без пересборки.
**Оговорка по памяти** — та же, что в TUNE-1: парсер холодный, в банк.
### <a id="mem-next"></a>MEM. Следующий шаг разгрузки W1/W2
`pop_ctrl.c` уехал в банк 5 ([MEM-BANK5](TASKS_CLOSED.md#mem-bank5), куча