83 lines
3.5 KiB
JavaScript
83 lines
3.5 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* Resets the demo project to the state tools/e2e.mjs expects (the e2e run mutates it).
|
||
* Usage: PATH=/opt/node22/bin:$PATH node tools/seed-demo.mjs <projectId> [baseUrl]
|
||
*/
|
||
const projectId = process.argv[2];
|
||
const baseUrl = process.argv[3] ?? 'https://nockal.com/game-maker/';
|
||
if (!projectId) {
|
||
console.error('usage: node tools/seed-demo.mjs <projectId> [baseUrl]');
|
||
process.exit(2);
|
||
}
|
||
|
||
/**
|
||
* "Mover" behavior: ArrowRight moves the owner by speed × dt per frame (data flow through
|
||
* a variable and a Multiply node), ArrowLeft moves it by an inline −3 per frame.
|
||
*/
|
||
const moverGraph = {
|
||
nodes: [
|
||
{ id: 'n-right', type: 'OnKeyHeld', x: 0, y: 0, params: { key: 'ArrowRight' } },
|
||
{ id: 'n-owner', type: 'Owner', x: 0, y: 140, params: {} },
|
||
{ id: 'n-speed', type: 'GetVariable', x: 0, y: 220, params: { variable: 'speed' } },
|
||
{ id: 'n-mul', type: 'Multiply', x: 220, y: 180, params: {} },
|
||
{ id: 'n-move', type: 'Move', x: 440, y: 0, params: { dy: 0 } },
|
||
{ id: 'n-left', type: 'OnKeyHeld', x: 0, y: 340, params: { key: 'ArrowLeft' } },
|
||
{ id: 'n-move2', type: 'Move', x: 440, y: 340, params: { dx: -3, dy: 0 } },
|
||
],
|
||
edges: [
|
||
{ id: 'e1', from: { node: 'n-right', port: 'exec' }, to: { node: 'n-move', port: 'exec' } },
|
||
{ id: 'e2', from: { node: 'n-owner', port: 'object' }, to: { node: 'n-move', port: 'object' } },
|
||
{ id: 'e3', from: { node: 'n-speed', port: 'value' }, to: { node: 'n-mul', port: 'a' } },
|
||
{ id: 'e4', from: { node: 'n-right', port: 'dt' }, to: { node: 'n-mul', port: 'b' } },
|
||
{ id: 'e5', from: { node: 'n-mul', port: 'result' }, to: { node: 'n-move', port: 'dx' } },
|
||
{ id: 'e6', from: { node: 'n-left', port: 'exec' }, to: { node: 'n-move2', port: 'exec' } },
|
||
{ id: 'e7', from: { node: 'n-owner', port: 'object' }, to: { node: 'n-move2', port: 'object' } },
|
||
],
|
||
};
|
||
|
||
const project = {
|
||
formatVersion: 1,
|
||
id: projectId,
|
||
name: 'Demo project',
|
||
activeSceneId: 'scene1',
|
||
assets: [
|
||
{
|
||
id: 'scene1',
|
||
type: 'scene',
|
||
name: 'Level 1',
|
||
props: { backgroundColor: 0x22252c },
|
||
objects: [
|
||
{ id: 'o1', assetId: 'crate', name: '', position: { x: -150, y: 0, z: 0 }, overrides: {}, ownerId: '' },
|
||
{ id: 'o2', assetId: 'crate', name: 'Blue crate', position: { x: 120, y: -80, z: 0 }, overrides: { width: 140, color: 0x4488ff }, ownerId: '' },
|
||
{ id: 'o3', assetId: 'cam', name: '', position: { x: 0, y: 0, z: 0 }, overrides: {}, ownerId: '' },
|
||
{ id: 'o4', assetId: 'mover', name: '', position: { x: -150, y: 110, z: 0 }, overrides: {}, ownerId: 'o1' },
|
||
],
|
||
},
|
||
{ id: 'crate', type: 'sprite', name: 'Crate', props: { width: 100, height: 60, color: 0xe0553f } },
|
||
{ id: 'cam', type: 'camera', name: 'Main camera', props: { width: 640, height: 360, zoom: 1 } },
|
||
{
|
||
id: 'mover',
|
||
type: 'behavior',
|
||
name: 'Mover',
|
||
props: { speed: 200 },
|
||
variables: [{ key: 'speed', label: 'speed', kind: 'number', default: 0 }],
|
||
graph: moverGraph,
|
||
},
|
||
],
|
||
};
|
||
|
||
const url = `${baseUrl}api/index.php?r=projects/${projectId}`;
|
||
const current = await fetch(url);
|
||
if (!current.ok) {
|
||
console.error(`GET failed: ${current.status}`);
|
||
process.exit(1);
|
||
}
|
||
const { revision } = await current.json();
|
||
const res = await fetch(url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ revision, project }) });
|
||
const body = await res.json();
|
||
if (!res.ok) {
|
||
console.error('PUT failed', res.status, body);
|
||
process.exit(1);
|
||
}
|
||
console.log(`seeded ${projectId} → revision ${body.revision}`);
|