Skip to content
  • Vladimir Zhukov's avatar
    Промах роняет комбо на секцию, а не обнуляет серию · b2b1e909
    Vladimir Zhukov authored
    
    
    Две ошибки на уровне из 50 нот стоили 26 % результата: точность 96 %, а
    медаль серебряная. Серия после обрыва набиралась заново от ×1, поэтому
    цена ошибки зависела не от точности, а от длины уровня — и тем сильнее,
    чем уровень короче. На первых уровнях золото доставалось только за
    безошибочный прогон.
    
    Сжатие множителя с ×5 до ×2 в прошлой правке решило задачу лишь
    наполовину: спред стал узким, но обрыв серии по-прежнему отбрасывал
    игрока в самое начало шкалы.
    
    Теперь промах откатывает комбо на одну секцию: недозаполненная секция и
    последняя полностью заполненная гаснут, комбо встаёт ровно на начало
    предыдущей ступени, множитель падает на один шаг. На первой ступени
    терять нечего — уходим в ноль, как и раньше.
    
    Пороги ступеней при этом сжаты с 0/4/9/15/22 до 0/3/7/12/18. Без этого
    правило не работает на уровнях 1-2: там всего 15 и 22 ноты, комбо не
    выбирается выше второй ступени, и «−1 секция» вырождается в «в ноль».
    ×2 набирается за 18 нот вместо 22 — разгон почти не короче.
    
    Точность, нужная для медали, по длине уровня:
    
               15 нот   50 нот   188 нот
      золото     93 %     94 %      91 %   (было 100 / 98 / 93)
      серебро    80 %     88 %      88 %
      бронза     60 %     76 %      79 %
    
    То есть медаль наконец зависит от точности, а не от того, какой уровень
    выбран. Пример из фидбека — 2 ошибки из 50 — даёт 91 % и золото вместо
    74 % и серебра.
    
    Детали:
    
    - Ветка промаха в applyNote возвращала захардкоженные tierAfter: 1 и
      multiplier: ×1. То же в handleTimeout: HUD показывал ×1 даже когда
      ступень оставалась. Теперь и то и другое считается от итогового комбо.
    - Условие lostTier выражено через факт падения ступени
      (tierAfter < tierBefore), а не через tierBefore > 1.
    - Подпись всплывашки «комбо сброшено» → «−1 ступень»: сброса больше нет.
    - Ступенчатая шкала в HUD правки не потребовала — она уже считает
      прогресс от начала ступени, поэтому секция гаснет целиком.
    - Живучесть не тронута.
    
    Весь блок «баланс» в scoring.test.ts прошёл без правок: инварианты про
    10 % ошибок, треть промахов, половину промахов и монотонность держатся.
    Добавлены тесты на demoteCombo, на то, что одна ошибка не лишает золота
    ни на одной длине уровня, и на независимость порога золота от длины —
    последний под старым правилом падал бы на 100 % для 15 нот. Новый
    Hud.test.tsx проверяет, что шкала гаснет ровно на одну секцию с любой
    ступени и что с ×2 множитель падает до ×1.75.
    
    Co-Authored-By: default avatarClaude Opus 5 (1M context) <noreply@anthropic.com>
    b2b1e909