• Nikitos's avatar
    Порт cel-графа из reanimation: $.cels — граф кадров для псевдо-3D
    · b880f35e
    Nikitos создал
    Первый блок псевдо-3D (docs/TASKS.md §12.13, §4). В audm-neko и в видео-примерах
    псевдо-3D персонаж — это ГРАФ, который по «водителям» решает, какой кадр
    показать; сам граф не хранит ни спрайтов, ни таймингов. Порт из
    aarthificial/reanimation (Runtime/Nodes, Runtime/Common).
    
    * узлы: switch (выбор ветки по водителю), anim (лист с кадрами), cel, override
      и termination; массив узлов и строка — краткие записи;
    * водители: точное значение по модулю, доля (percentage: 0..1 → индекс),
      автоинкремент (перебор кадров), водители узла (setDrivers) вливаются до
      выбора ветки — как nextState.Merge в оригинале;
    * зеркало (mirror), путь решения (trace), fps (граф решается не чаще кадра
      анимации), защита от замыканий в графе: при разборе повторный узел
      становится termination, при решении повторно посещённый пропускается;
    * библиотека графов, привязка к узлу ($.cels.attach/state/tick), save/load.
    
    Тесты нашли четыре настоящих ошибки:
    1) set() писал в «будущее» состояние, которое тут же терялось при обмене —
       водители игрока не действовали вовсе;
    2) цикл в определении вешал РАЗБОР (Maximum call stack size exceeded) —
       счётчик глубины не спасал, стек кончался раньше;
    3) одноимённые resolveNode в модуле — ошибка QuickJS «invalid redefinition of
       global identifier» (правило: имена уникальны на уровне модуля);
    4) водители узла подменялись ДО выбора, из-за чего ветка перебивала сама себя.
    
    Проверка: tests/js/cels_test.mjs (16 проверок), полный набор qjs и агентских
    тестов зелёный.
    b880f35e