@
feat(quantik-game): фаза 3 — граф-уровни (движение по f(x)) + зоны Новый тип уровня: Квантик едет по кривой y=f(x), которую игрок собирает слайдерами коэффициентов, проходя сквозь зоны-препятствия. Движок (аддитивно): plot.runner → env-поля curve.runX/runY/runDone (f компилится 1 раз, питает И кривую, И бегунок-героя, без само-ссылки); type zone (forbidden/target/collect) → булево env-поле zone.hit. Грамматика выражений ЗАКРЫТА — никаких inzone()-предикатов, только именованные env-поля (модель t/tries из Ф0), без eval. Глава-созвездие functions из 5 уровней (луч/синус/парабола/модуль/экспонента), разблокировка 9/11/13/ 15/17 (цепочка проходима). validateSpec принимает zone+runner. Все 5 уровней независимо проверены на движке (2★ достижимы). npm test 253/8 baseline; custom-sims 26/26; lint:routes 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> @
This commit is contained in:
@@ -28,6 +28,7 @@ const MAX_POINTS = 1000; // точек в polyline/path/points
|
||||
const OBJECT_TYPES = new Set([
|
||||
'point', 'segment', 'vector', 'circle', 'rect',
|
||||
'polyline', 'path', 'label', 'plot', 'readout',
|
||||
'zone', // Квантик Ф3: зона-препятствие/цель/сбор (граф-уровни)
|
||||
]);
|
||||
|
||||
const STATUSES = new Set(['draft', 'published']);
|
||||
@@ -189,6 +190,14 @@ function validateSpec(spec) {
|
||||
out.drag.param = sanitizeText(o.drag.param, 60);
|
||||
if (o.drag.paramY !== undefined) out.drag.paramY = sanitizeText(o.drag.paramY, 60);
|
||||
}
|
||||
|
||||
// zone{} — track = id отслеживаемой точки (Квантик Ф3): санитизируем как id.
|
||||
if (type === 'zone' && o.track !== undefined) out.track = sanitizeText(o.track, 60);
|
||||
|
||||
// runner{} на plot (Квантик Ф3): duration — число/выражение (длина).
|
||||
if (o.runner && typeof o.runner === 'object' && !Array.isArray(o.runner)) {
|
||||
if (o.runner.duration !== undefined) checkExpr(o.runner.duration, `objects[${i}].runner.duration`, errs);
|
||||
}
|
||||
return out;
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user