• Nikitos's avatar
    Порт оружия и баллистики из audm-neko: $.weapons
    · c9341736
    Nikitos создал
    Шестой блок порта (docs/TASKS.md §12.10, §6.6). В audm-neko стволы жили в одной
    базе (WeaponDB.DB), а состояние — в BaseWeaponV2: магазин, темп, перезарядка по
    стилю, отдача, разброс и навесное, которое меняет характеристики.
    
    * база стволов и навесного с загрузкой из JSON; поля ствола: урон, темп, магазин,
      перезарядка, разброс, отдача, падение урона, пробитие, дробь, режимы огня,
      стиль перезарядки, слоты;
    * ствол в руках: fire() с причиной отказа (cooldown / reloading / empty /
      single), reload()/cancelReload(), tick() для темпа, перезарядки и остывания
      отдачи и перегрева, cycleMode(), save()/load2();
    * навесное: множители и добавки, слоты, замена с возвратом прежнего мода,
      пересчёт характеристик; магазин — МНОЖИТЕЛЬ (ammo 1.5 из 30 даёт 45), дробь —
      добавка;
    * перезарядка дробовика — по одному патрону со своим таймером: прежняя версия
      пыталась дополнить остаток в том же кадре, и при длинном кадре патроны
      терялись, при коротком — не заряжались вовсе;
    * баллистика: затухание урона по расстоянию с полом 40%, пробитие снимает класс
      брони (результат идёт в $.combat.hit), разброс от перегрева;
    * $.weapons.give(узел, id)/of/fire/tickAll — ствол в руках узла.
    
    Тест нашёл настоящий баг: db.get() искал только стволы, поэтому навесное не
    находилось и не устанавливалось (attach всегда отвечал «нет навесного»).
    
    Проверка: tests/js/weapons_test.mjs (22 проверки: темп, режимы, магазин,
    перезарядка по патрону, навесное, затухание, пробитие, сейв), полный набор qjs
    и агентских тестов зелёный.
    c9341736