-
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