• Nikitos's avatar
    CCD: быстрые тела не проскакивают стены ($.world.bullet, тег <bullet>)
    · c683d4d2
    Nikitos создал
    Первый пункт P2-хвоста из §12 и реальный дефект из §1.3: тело 8 px при 1200 px/с
    за шаг 1/60 проходит около 20 px и пролетает тонкую стену между подшагами. До
    сих пор обходом был только ручной castShape в кадре.
    
    * физика: def.isBullet в R2DBodyDesc, r2d_physics_set_bullet/is_bullet;
    * engine.setBullet(id, on) / engine.isBullet(id), опция `bullet: true` в createBody;
    * высокоуровневое API: $.world.bullet(узел, on), $.world.isBullet(узел),
      .bullet(on) у узла; тег <bullet> получает CCD по умолчанию;
    * флаг хранится на узле (bullet_on), поэтому пересозданное тело (после смены
      размера) сохраняет настройку.
    
    ЧЕСТНО О ПРОВЕРКЕ. Проверено: флаг доходит до Box2D (isBullet → true, включение
    и выключение на ходу работают, цепочка возвращает обёртку). НЕ проверено
    поведенчески: воспроизвести туннелирование на стенде не удалось — обе пули,
    с CCD и без, останавливались у стены (x ≈ 495) и на 3, и на 12, и на 60 кадрах.
    Поэтому в tests/agent/highlevel_ccd_test.py (10 проверок) стоит ровно то, что
    доказано, а необходимый следующий шаг записан в тесте, world.md и TASKS §1.3:
    стена 1–2 px и подшаг мельче 1/60.
    
    Попутно найдено: $('<bullet>', { bullet: false }) работал не так, как ожидается,
    только из-за отсутствия умолчания у тега — теперь умолчание явное и проверено;
    и выяснилось, что обёртка НЕ форвардит поля узла (bullet_on читается только
    через nodes[0]) — это документировано в core.md §5.
    
    Проверка: полный набор qjs, bsp, агентских тестов (включая новый ccd),
    doc_coverage и doc_claims зелёный.
    c683d4d2