@bitmagic/cli 0.1.64-dev.0 → 0.1.64-dev.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -5
- package/assets/blender-level/README.md +25 -0
- package/assets/blender-level/audit.py +232 -0
- package/assets/blender-level/bmlevel/__init__.py +294 -0
- package/assets/blender-level/bmlevel/core.py +438 -0
- package/assets/blender-level/bmlevel/scene_bpy.py +186 -0
- package/assets/blender-level/bmlevel/scene_null.py +44 -0
- package/assets/blender-level/example_level.py +80 -0
- package/assets/blender-level/find_blender.py +62 -0
- package/assets/blender-level/review.py +117 -0
- package/assets/blender-level/sync_world.py +85 -0
- package/assets/blender-level/tests/test_core.py +189 -0
- package/dist/assets/keep-glb.d.ts +20 -0
- package/dist/assets/keep-glb.js +45 -0
- package/dist/assets/keep-glb.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/assets.d.ts +3 -0
- package/dist/commands/assets.js +33 -3
- package/dist/commands/assets.js.map +1 -1
- package/dist/commands/cover.js +7 -1
- package/dist/commands/cover.js.map +1 -1
- package/dist/commands/forge.js +70 -11
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/generate.d.ts +93 -0
- package/dist/commands/generate.js +491 -18
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.js +33 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/judge.d.ts +0 -11
- package/dist/commands/judge.js +15 -2
- package/dist/commands/judge.js.map +1 -1
- package/dist/commands/levels.d.ts +1 -1
- package/dist/commands/levels.js +14 -3
- package/dist/commands/levels.js.map +1 -1
- package/dist/commands/reference.js +5 -1
- package/dist/commands/reference.js.map +1 -1
- package/dist/commands/reset-account.js +2 -11
- package/dist/commands/reset-account.js.map +1 -1
- package/dist/commands/tools.d.ts +1 -0
- package/dist/commands/tools.js +73 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/trailer.js +18 -4
- package/dist/commands/trailer.js.map +1 -1
- package/dist/editor/asset-detail-panel.d.ts +8 -3
- package/dist/editor/asset-detail-panel.js +11 -1
- package/dist/editor/asset-detail-panel.js.map +1 -1
- package/dist/editor/hud-replay-page.js +317 -22
- package/dist/editor/hud-replay-page.js.map +1 -1
- package/dist/editor/shell-page.js +117 -7
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/forge/apply-modifications.js +70 -2
- package/dist/forge/apply-modifications.js.map +1 -1
- package/dist/forge/progress.d.ts +10 -0
- package/dist/forge/progress.js +7 -6
- package/dist/forge/progress.js.map +1 -1
- package/dist/forge/run-pipeline.d.ts +8 -0
- package/dist/forge/run-pipeline.js +37 -2
- package/dist/forge/run-pipeline.js.map +1 -1
- package/dist/forge/stream.d.ts +7 -1
- package/dist/forge/stream.js +5 -2
- package/dist/forge/stream.js.map +1 -1
- package/dist/forge/two-d-gate.d.ts +72 -0
- package/dist/forge/two-d-gate.js +198 -0
- package/dist/forge/two-d-gate.js.map +1 -0
- package/dist/generate/animation-from-video.d.ts +11 -3
- package/dist/generate/animation-from-video.js +12 -2
- package/dist/generate/animation-from-video.js.map +1 -1
- package/dist/generate/model.d.ts +11 -0
- package/dist/generate/model.js +41 -1
- package/dist/generate/model.js.map +1 -1
- package/dist/generate/prop.d.ts +9 -0
- package/dist/generate/prop.js +59 -9
- package/dist/generate/prop.js.map +1 -1
- package/dist/generate/video-review.d.ts +28 -0
- package/dist/generate/video-review.js +120 -0
- package/dist/generate/video-review.js.map +1 -0
- package/dist/generate/video.d.ts +52 -0
- package/dist/generate/video.js +177 -0
- package/dist/generate/video.js.map +1 -0
- package/dist/project/art-style.d.ts +34 -0
- package/dist/project/art-style.js +63 -0
- package/dist/project/art-style.js.map +1 -0
- package/dist/project/jobs.d.ts +1 -1
- package/dist/project/jobs.js.map +1 -1
- package/dist/prompt.d.ts +9 -0
- package/dist/prompt.js +36 -0
- package/dist/prompt.js.map +1 -0
- package/dist/publish/bundle.d.ts +12 -0
- package/dist/publish/bundle.js +32 -0
- package/dist/publish/bundle.js.map +1 -1
- package/dist/render/qr-png.d.ts +6 -3
- package/dist/render/qr-png.js +8 -8
- package/dist/render/qr-png.js.map +1 -1
- package/dist/scaffold/blender-level-skill-files.d.ts +26 -0
- package/dist/scaffold/blender-level-skill-files.js +570 -0
- package/dist/scaffold/blender-level-skill-files.js.map +1 -0
- package/dist/scaffold/claude-settings.js +2 -0
- package/dist/scaffold/claude-settings.js.map +1 -1
- package/dist/scaffold/project-files.d.ts +2 -1
- package/dist/scaffold/project-files.js +135 -43
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.d.ts +9 -0
- package/dist/scaffold/project.js +29 -3
- package/dist/scaffold/project.js.map +1 -1
- package/dist/scaffold/reference-guidance.d.ts +1 -1
- package/dist/scaffold/reference-guidance.js +2 -1
- package/dist/scaffold/reference-guidance.js.map +1 -1
- package/dist/scaffold/skill-files.js +3 -1
- package/dist/scaffold/skill-files.js.map +1 -1
- package/dist/scaffold/unity-skill-files.js +1 -2
- package/dist/scaffold/unity-skill-files.js.map +1 -1
- package/dist/tools/bundles.d.ts +21 -0
- package/dist/tools/bundles.js +67 -0
- package/dist/tools/bundles.js.map +1 -0
- package/dist/trailer/ffmpeg.d.ts +10 -0
- package/dist/trailer/ffmpeg.js +51 -6
- package/dist/trailer/ffmpeg.js.map +1 -1
- package/dist/trailer/hud-raster.d.ts +12 -12
- package/dist/trailer/hud-raster.js +85 -32
- package/dist/trailer/hud-raster.js.map +1 -1
- package/dist/trailer/hud-state.d.ts +75 -4
- package/dist/trailer/hud-state.js +132 -17
- package/dist/trailer/hud-state.js.map +1 -1
- package/dist/trailer/io.d.ts +2 -0
- package/dist/trailer/io.js +6 -1
- package/dist/trailer/io.js.map +1 -1
- package/dist/trailer/link.d.ts +1 -0
- package/dist/trailer/link.js +15 -0
- package/dist/trailer/link.js.map +1 -0
- package/dist/trailer/make.d.ts +2 -0
- package/dist/trailer/make.js +1 -0
- package/dist/trailer/make.js.map +1 -1
- package/dist/trailer/merge.js +32 -11
- package/dist/trailer/merge.js.map +1 -1
- package/dist/trailer/music-beats.js +4 -39
- package/dist/trailer/music-beats.js.map +1 -1
- package/dist/trailer/render.d.ts +2 -0
- package/dist/trailer/render.js +94 -48
- package/dist/trailer/render.js.map +1 -1
- package/dist/trailer/timeline-types.d.ts +19 -0
- package/dist/trailer/timeline-types.js +42 -2
- package/dist/trailer/timeline-types.js.map +1 -1
- package/dist/trailer/title-raster.js +2 -1
- package/dist/trailer/title-raster.js.map +1 -1
- package/dist/trailer/titles.js +6 -1
- package/dist/trailer/titles.js.map +1 -1
- package/dist/trailer/video-chain.d.ts +96 -8
- package/dist/trailer/video-chain.js +183 -0
- package/dist/trailer/video-chain.js.map +1 -1
- package/dist/verify/browser.js +4 -1
- package/dist/verify/browser.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FAVICON_LINK_ID } from '@bitmagic/asset-core/favicon';
|
|
2
|
+
import { describeArtStyle } from '@bitmagic/asset-core/art-style';
|
|
2
3
|
import { tsconfigPaths, importMapEntries, viteAliasEntries } from './aliases.js';
|
|
3
4
|
import { currentPortLane } from '../port-lane.js';
|
|
4
5
|
import { AGENTS_MD_REFERENCE_SECTION, GAME_DESIGN_REFERENCE_HINT, GENERATE_SKILL_REFERENCE_SECTION, PLANNING_SKILL_REFERENCE_STEP1, PLANNING_SKILL_REFERENCE_STEP4, } from './reference-guidance.js';
|
|
@@ -480,11 +481,71 @@ const stubCreatorHandlerPlugin = () => ({
|
|
|
480
481
|
});
|
|
481
482
|
`;
|
|
482
483
|
}
|
|
484
|
+
/**
|
|
485
|
+
* The build-time Rapier flavor selector, emitted into BOTH vendored configs.
|
|
486
|
+
*
|
|
487
|
+
* A bundle ships exactly one physics engine, never both: each `-compat` package
|
|
488
|
+
* embeds its full WASM, so the unused one is dead megabytes. Which one is the
|
|
489
|
+
* ENGINE'S call — the config runs `src/work/game.json` through the engine's own
|
|
490
|
+
* rule, `engine/engine/physics/PhysicsModeRule.ts` (vendored with the engine;
|
|
491
|
+
* Vite bundles the config with esbuild, which resolves the TypeScript import),
|
|
492
|
+
* so the bundle can never disagree with the world the engine boots. `bitmagic
|
|
493
|
+
* build/publish/ios` resolve the same rule ahead of time into
|
|
494
|
+
* BUNDLE_RAPIER_FLAVOR, which wins when set; an invalid value, or a game.json
|
|
495
|
+
* the config cannot read, fails the build. The stub is safe because no
|
|
496
|
+
* module-scope value usage of either Rapier import exists in the engine.
|
|
497
|
+
*/
|
|
498
|
+
function renderRapierFlavorBlock() {
|
|
499
|
+
return `// Single-Rapier-flavor builds: this bundle ships exactly one physics engine (each -compat package
|
|
500
|
+
// embeds its full WASM — the unused one is dead megabytes). The flavor is the game's EFFECTIVE
|
|
501
|
+
// physics mode: src/work/game.json run through the engine's own rule, the same function the engine
|
|
502
|
+
// applies at boot, so the bundle can never disagree with the world the game runs. bitmagic
|
|
503
|
+
// build/publish/ios resolve it ahead of time into BUNDLE_RAPIER_FLAVOR, which wins when set. There
|
|
504
|
+
// is no dual-flavor build: a game.json this config cannot read fails the build. The stub is safe:
|
|
505
|
+
// the engine has no module-scope value usage of either Rapier import, and only ever init()s the
|
|
506
|
+
// flavor it boots.
|
|
507
|
+
const RAPIER_PACKAGES = { '2d': '@dimforge/rapier2d-compat', '3d': '@dimforge/rapier3d-compat' };
|
|
508
|
+
function resolveRapierFlavor() {
|
|
509
|
+
const fromEnv = process.env.BUNDLE_RAPIER_FLAVOR || '';
|
|
510
|
+
if (fromEnv) {
|
|
511
|
+
if (fromEnv !== '2d' && fromEnv !== '3d') {
|
|
512
|
+
throw new Error("BUNDLE_RAPIER_FLAVOR must be '2d' or '3d' when set (got '" + fromEnv + "')");
|
|
513
|
+
}
|
|
514
|
+
return fromEnv;
|
|
515
|
+
}
|
|
516
|
+
let game;
|
|
517
|
+
try {
|
|
518
|
+
game = JSON.parse(fs.readFileSync('src/work/game.json', 'utf8'));
|
|
519
|
+
} catch (err) {
|
|
520
|
+
throw new Error('Cannot decide which physics engine to bundle: src/work/game.json is unreadable (' + err.message + ').');
|
|
521
|
+
}
|
|
522
|
+
const mode = game.physicsMode === '2d' || game.physicsMode === '3d' || game.physicsMode === 'none' ? game.physicsMode : undefined;
|
|
523
|
+
return rapierFlavorForPhysicsMode(effectivePhysicsMode(typeof game.gameGenre === 'string' ? game.gameGenre : '', mode, game.physics2d === true));
|
|
524
|
+
}
|
|
525
|
+
const rapierFlavor = resolveRapierFlavor();
|
|
526
|
+
const droppedRapier = RAPIER_PACKAGES[rapierFlavor === '2d' ? '3d' : '2d'];
|
|
527
|
+
// 'pre' is load-bearing: without it Vite's own resolver wins and the "dropped" package is
|
|
528
|
+
// INLINED from node_modules — WASM and all, ~2 MB heavier — with no error and no greppable
|
|
529
|
+
// package-name string. Same trap the creator-handler stub above documents.
|
|
530
|
+
const stubRapierPlugin = () => ({
|
|
531
|
+
name: 'stub-rapier-flavor',
|
|
532
|
+
enforce: 'pre',
|
|
533
|
+
resolveId(id) {
|
|
534
|
+
return id === droppedRapier ? '\\0rapier-flavor-stub' : null;
|
|
535
|
+
},
|
|
536
|
+
load(id) {
|
|
537
|
+
return id === '\\0rapier-flavor-stub' ? 'export default null;' : null;
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
`;
|
|
541
|
+
}
|
|
483
542
|
/** Rollup's `external` predicate, indented to sit inside the generated `rollupOptions` block. */
|
|
484
543
|
const PUBLISH_CONFIG_EXTERNAL_BLOCK = ` // Anything the CDN table resolves stays OUT of the bundle. Every other id — the 'engine/',
|
|
485
544
|
// 'core/', 'work/' aliases above included — is bundled, which is what a single published
|
|
486
|
-
// HTML file with no same-origin siblings requires.
|
|
487
|
-
external
|
|
545
|
+
// HTML file with no same-origin siblings requires. The one exception: a dropped Rapier
|
|
546
|
+
// flavor must NOT go external (an external import would still fetch it at runtime) — it
|
|
547
|
+
// falls through to stubRapierPlugin and vanishes from the bundle entirely.
|
|
548
|
+
external: (id) => id !== droppedRapier && cdnUrl(id) !== undefined,`;
|
|
488
549
|
/**
|
|
489
550
|
* The counterpart note in the `--single-file` config, where there is no `external` at all.
|
|
490
551
|
*
|
|
@@ -525,8 +586,12 @@ const PUBLISH_CONFIG_PATHS_BLOCK = ` // Rewrite each externalized import
|
|
|
525
586
|
*/
|
|
526
587
|
function renderPublishConfig(mode) {
|
|
527
588
|
const cdn = mode === 'cdn';
|
|
528
|
-
return `import
|
|
589
|
+
return `import fs from 'fs';
|
|
590
|
+
import { defineConfig } from 'vite';
|
|
529
591
|
import { viteSingleFile } from 'vite-plugin-singlefile';
|
|
592
|
+
// The engine's physics-mode rule, straight from the vendored engine source (see the Rapier
|
|
593
|
+
// flavor block below for why the bundle must use the engine's own rule and nothing else).
|
|
594
|
+
import { effectivePhysicsMode, rapierFlavorForPhysicsMode } from './engine/engine/physics/PhysicsModeRule.ts';
|
|
530
595
|
|
|
531
596
|
// Aliases mirror vite.config.js's, deliberately NOT wrapped in path.resolve(): every target here
|
|
532
597
|
// already starts with '/', which Vite resolves as project-root-relative in both serve and build
|
|
@@ -538,7 +603,8 @@ import { viteSingleFile } from 'vite-plugin-singlefile';
|
|
|
538
603
|
// since Rollup then just treats the unmatched id as an unresolved bare specifier and fails the
|
|
539
604
|
// build. Verified against a real \`vite build\` before trusting the plain-string form.
|
|
540
605
|
|
|
541
|
-
${cdn ? renderCdnModuleTable() : ''}${
|
|
606
|
+
${cdn ? renderCdnModuleTable() : ''}${renderRapierFlavorBlock()}
|
|
607
|
+
${renderCreatorHandlerStub()}
|
|
542
608
|
// Editing-only asset fields must not ship inside published game data: the
|
|
543
609
|
// source recording behind a video-to-motion clip is the creator's webcam
|
|
544
610
|
// footage. The list mirrors EDITING_ONLY_ASSET_FIELDS in @bitmagic/asset-core
|
|
@@ -603,7 +669,7 @@ ${cdn ? PUBLISH_CONFIG_PATHS_BLOCK : ''} // A licence obligation, not dec
|
|
|
603
669
|
},
|
|
604
670
|
},
|
|
605
671
|
},
|
|
606
|
-
plugins: [stubCreatorHandlerPlugin(), stripEditingOnlyWorldFieldsPlugin(), viteSingleFile()],
|
|
672
|
+
plugins: [stubCreatorHandlerPlugin(), stripEditingOnlyWorldFieldsPlugin(), stubRapierPlugin(), viteSingleFile()],
|
|
607
673
|
});
|
|
608
674
|
`;
|
|
609
675
|
}
|
|
@@ -749,7 +815,7 @@ If you are unsure whether one is already running, \`bitmagic reload\` says so an
|
|
|
749
815
|
itself: \`planning-a-game/\` (what to build first), \`finding-engine-apis/\` (engine docs),
|
|
750
816
|
\`generating-assets/\`, \`working-with-the-creator/\`, \`theming-the-hud/\`,
|
|
751
817
|
\`publishing-a-game/\`, \`judging-quality/\`, \`checking-usage/\`, \`making-a-trailer/\`,
|
|
752
|
-
\`converting-unity-levels/\`.${mirrorClause}
|
|
818
|
+
\`converting-unity-levels/\`, \`building-levels-in-blender/\`.${mirrorClause}
|
|
753
819
|
\`upgrade\` rewrites every copy, so edits to them are lost; skills you add yourself are never
|
|
754
820
|
touched.
|
|
755
821
|
- \`.claude/settings.json\` — **Claude Code only, and yours**: seeded with one Stop hook that runs
|
|
@@ -1016,6 +1082,7 @@ bitmagic generate image --name hero-portrait --prompt "..." [--width 512] [
|
|
|
1016
1082
|
bitmagic generate character --name guard --prompt "..." [--apply-to-player] [--no-library]
|
|
1017
1083
|
bitmagic generate animation --family gait --name LimpStride --based-on walk [--dial limpSide=right]
|
|
1018
1084
|
bitmagic generate animation --spec clip.json # melee and oneShot clips: a spec file
|
|
1085
|
+
bitmagic generate video --prompt "the castle gates swing open" [--duration 5] [--image cover.png]
|
|
1019
1086
|
bitmagic generate model --prompt "a mossy stone arch" [--height 3]
|
|
1020
1087
|
bitmagic generate vehicle --prompt "a rusty orange pickup" | --preset VAN
|
|
1021
1088
|
\`\`\`
|
|
@@ -1047,29 +1114,29 @@ bitmagic forge --prompt "a ruined desert temple with a central courtyard"
|
|
|
1047
1114
|
|
|
1048
1115
|
This designs a scene, builds its geometry, bakes it to voxels and writes the finished level —
|
|
1049
1116
|
terrain, props, spawn points — into \`src/work/world.json\`. \`bitmagic levels list | add | rename
|
|
1050
|
-
| set-start | remove\` manages them afterwards (free, local
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1117
|
+
| set-start | remove\` manages them afterwards (free, local; \`set-start\` picks the boot level). Add
|
|
1118
|
+
\`--city\`, \`--dungeon\`, \`--platformer\` or \`--freeform\` (at most one) for a different kind of
|
|
1119
|
+
place; omit them all for natural terrain. A place designed part by part — an interior, a station, a stylised set — can
|
|
1120
|
+
instead be built in Blender from a script: \`${PRIMARY_SKILLS_DIR}/building-levels-in-blender/SKILL.md\`,
|
|
1121
|
+
whose first section says when that path is yours (a frontier model, Blender installable).
|
|
1122
|
+
|
|
1123
|
+
**Art style is a declared switch.** \`"artStyle": "low-poly"\` in \`src/work/game.json\` (or
|
|
1124
|
+
\`bitmagic init --art-style low-poly\`) makes a Blender level a low-poly GAME: \`cover\`/\`reference\`
|
|
1125
|
+
prompt for low-poly, \`assets add\` and \`generate model|prop|character\` keep meshes instead of
|
|
1126
|
+
voxelizing, the engine drops its voxel lighting/bloom, \`judge\` knows the medium. Set it before the first cover.
|
|
1054
1127
|
|
|
1055
1128
|
Four things worth knowing:
|
|
1056
1129
|
|
|
1057
|
-
1. **It is slow.** A forge runs for many minutes — the level bake alone can take twenty.
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
the final step, and every failure says whether it did and whether
|
|
1068
|
-
\`bitmagic forge --resume <jobId>\` is worth it — which is twenty minutes you do not spend again.
|
|
1069
|
-
|
|
1070
|
-
Afterwards actually walk the level in the dev view — one that loads is not necessarily one you can
|
|
1071
|
-
move through. (You should already have \`bitmagic dev\` running; a forge takes twenty minutes, and
|
|
1072
|
-
its progress shows there.)
|
|
1130
|
+
1. **It is slow.** A forge runs for many minutes — the level bake alone can take twenty. Plan the
|
|
1131
|
+
run, start it, and do something else while it works; progress is printed throughout.
|
|
1132
|
+
2. **It needs Google Chrome installed.** The bake runs in a real headless browser (voxelizing is
|
|
1133
|
+
engine code). It serves the project itself — no \`bitmagic dev\` needed, no collision with one.
|
|
1134
|
+
3. **It rewrites large parts of \`world.json\`** (assets, objects, levels, spawns) — re-read it after.
|
|
1135
|
+
4. **Resume rather than re-run.** It prints a job id, \`world.json\` only changes on the final step,
|
|
1136
|
+
and every failure says whether \`bitmagic forge --resume <jobId>\` is worth it — twenty minutes saved.
|
|
1137
|
+
|
|
1138
|
+
Afterwards actually walk the level in the dev view (already running, with the forge's progress in
|
|
1139
|
+
it) — one that loads is not necessarily one you can move through.
|
|
1073
1140
|
|
|
1074
1141
|
${renderCliUpdateSection(environment)}
|
|
1075
1142
|
`;
|
|
@@ -1151,6 +1218,7 @@ the engine, already wired** — and hand-building a worse version of it is the m
|
|
|
1151
1218
|
| Animals, snakes, fish, birds, dragons | Procedural creature systems | \`animal-instructions.md\`, \`snake-instructions.md\` |
|
|
1152
1219
|
| Score, timers, health bars, game-over and win screens | HUD + end-game systems | \`HUD_ELEMENTS.md\`, \`end-game.md\` |
|
|
1153
1220
|
| A start screen — cover image, title, Play-button label | Start-screen system | \`START_SCREEN.md\` |
|
|
1221
|
+
| An opening cutscene or any full-screen video | \`engine.playVideo()\` fullscreen overlay | \`video-cutscenes.md\` |
|
|
1154
1222
|
| Collectibles, pickups, checkpoints, markers | Dedicated systems | \`collectible-objects.md\`, \`markers-system.md\` |
|
|
1155
1223
|
| Doors, locked doors and their keys | \`worldProfileData.doors[]\` + \`keyItems[]\` | \`doors-and-locks.md\` |
|
|
1156
1224
|
| Moving platforms, elevators, crushers, conveyors, spinners | \`mechanisms[]\` in world.json | \`moving-platforms.md\` |
|
|
@@ -1206,7 +1274,8 @@ player to move) either builds no player controller (the \`no-character\` templat
|
|
|
1206
1274
|
- Controls: every action as desktop key + phone button, bound in one call
|
|
1207
1275
|
- Engine systems: one line each, naming the doc — \`engine/agent-docs/…\`
|
|
1208
1276
|
- Assets to generate: name them. A skybox and the cover usually earn their place in slice 1.
|
|
1209
|
-
-
|
|
1277
|
+
- Art style: voxel (the default) or low-poly — \`artStyle\` in \`src/work/game.json\`; decided before the first cover
|
|
1278
|
+
- Level: procedural baseline terrain, unless the terrain IS the mechanic (forge — or Blender, if that skill's gate passes)
|
|
1210
1279
|
|
|
1211
1280
|
## Deferred — the backlog
|
|
1212
1281
|
Numbered, roughly best-first. Everything the design implies that slice 1 does not do.
|
|
@@ -1243,7 +1312,10 @@ ${PLANNING_SKILL_REFERENCE_STEP4}4. \`bitmagic cover\` — **now**, not later. I
|
|
|
1243
1312
|
so it sets how long the human waits for slice 1. It belongs in slice 1 for a game that cannot be
|
|
1244
1313
|
played without its shape — skiing, racing on a real circuit, open-world driving, an enclosed dungeon
|
|
1245
1314
|
interior. For everything else the baseline's procedural voxel terrain is a fine slice-1 world and the
|
|
1246
|
-
forge is backlog item 1, run once the loop is proven.
|
|
1315
|
+
forge is backlog item 1, run once the loop is proven. A designed place — an interior, a station, a
|
|
1316
|
+
stylised set the creator has a picture of — has a second route, building it in Blender from a
|
|
1317
|
+
script (\`${PRIMARY_SKILLS_DIR}/building-levels-in-blender/SKILL.md\`, gated on the model and on
|
|
1318
|
+
Blender being available). That route is a low-poly game: set \`artStyle: "low-poly"\` in game.json first.
|
|
1247
1319
|
|
|
1248
1320
|
## Step 5 — hand it back
|
|
1249
1321
|
|
|
@@ -1338,6 +1410,7 @@ tier 2.
|
|
|
1338
1410
|
| HUD elements — bars, scores, counters, timers | \`HUD_ELEMENTS.md\` |
|
|
1339
1411
|
| HUD visual style and themes | \`HUD_STYLE_GUIDE.md\`, \`HUD_THEMES.md\` |
|
|
1340
1412
|
| Start screen — cover image, title, Play-button label | \`START_SCREEN.md\` |
|
|
1413
|
+
| An opening cutscene or any full-screen video — \`engine.playVideo\` | \`video-cutscenes.md\` |
|
|
1341
1414
|
| Collectibles and interactables | \`collectible-objects.md\` |
|
|
1342
1415
|
| Placed scenery / \`environmentObjects\` — gameplay near props, harvesting, occupancy | \`environment-objects.md\` |
|
|
1343
1416
|
| Doors, locked gates, keycards | \`doors-and-locks.md\` |
|
|
@@ -1371,7 +1444,7 @@ tier 2.
|
|
|
1371
1444
|
| Multiple levels, level select, switching worlds at runtime | \`level-system.md\` |
|
|
1372
1445
|
| Skyboxes | \`skybox-system.md\` |
|
|
1373
1446
|
| Weather and snow | \`weather-snow.md\` |
|
|
1374
|
-
| 2D side-
|
|
1447
|
+
| 2D side-view games — the forged strip level, its \`worldForgerSideon\` contract, collect/respawn/goal wiring | \`sideon-forged-levels.md\` |
|
|
1375
1448
|
|
|
1376
1449
|
\`engine/agent-docs/samples/\` holds compile-checked reference implementations — a doc that cites
|
|
1377
1450
|
\`samples/raycast-ground-check\` means \`engine/agent-docs/samples/raycast-ground-check.ts\`, and it
|
|
@@ -1447,12 +1520,12 @@ you work. Re-read it before editing it.
|
|
|
1447
1520
|
export function renderGenerateSkill() {
|
|
1448
1521
|
return `---
|
|
1449
1522
|
name: generating-assets
|
|
1450
|
-
description: Use when this Bitmagic game needs a new skybox, 2D background, custom block type, sound effect, music track, image, character, animation or drivable vehicle, when a reference image of the world should steer how assets look, or when the creator has a model, sound, image or .vxl file of their own to add — anything that would otherwise require the web editor.
|
|
1523
|
+
description: Use when this Bitmagic game needs a new skybox, 2D background, custom block type, sound effect, music track, image, character, animation, video cutscene or drivable vehicle, when a reference image of the world should steer how assets look, or when the creator has a model, sound, image or .vxl file of their own to add — anything that would otherwise require the web editor.
|
|
1451
1524
|
---
|
|
1452
1525
|
|
|
1453
1526
|
# Generating game assets
|
|
1454
1527
|
|
|
1455
|
-
The \`bitmagic\` CLI generates content directly into this project.
|
|
1528
|
+
The \`bitmagic\` CLI generates content directly into this project. Eleven types work today:
|
|
1456
1529
|
|
|
1457
1530
|
| Command | Makes | Lands in |
|
|
1458
1531
|
|---|---|---|
|
|
@@ -1464,6 +1537,7 @@ The \`bitmagic\` CLI generates content directly into this project. Ten types wor
|
|
|
1464
1537
|
| \`bitmagic generate image --name <id> --prompt "..."\` | a 2D image | \`assets[]\` |
|
|
1465
1538
|
| \`bitmagic generate character --name <id> --prompt "..."\` | a rigged character (a close-enough ready-made one when the library has it, in seconds; \`--no-library\` always makes a new one) | \`assets[]\` |
|
|
1466
1539
|
| \`bitmagic generate animation --family gait ...\` or \`--spec <file>\` | an animation clip | \`assets[]\` |
|
|
1540
|
+
| \`bitmagic generate video --prompt "..." [--duration 5] [--image <png>]\` | a short 720p clip for a cutscene (billed per second) | \`assets[]\`, played with \`engine.playVideo("<id>")\` |
|
|
1467
1541
|
| \`bitmagic generate model --prompt "..."\` | a new 3D model | \`assets[]\` |
|
|
1468
1542
|
| \`bitmagic generate vehicle --prompt "..."\` | a drivable vehicle | \`assets[]\` |
|
|
1469
1543
|
|
|
@@ -1482,10 +1556,21 @@ clip, because it is solved locally rather than generated by a model.
|
|
|
1482
1556
|
|
|
1483
1557
|
\`model\` is the one to reach for when the game needs an object that does not exist yet — a new
|
|
1484
1558
|
asset from a sentence. It needs Chrome and a free port between 3000 and 3199, because only the
|
|
1485
|
-
engine can voxelize
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
placed.
|
|
1559
|
+
engine can voxelize (a low-poly project keeps the mesh instead — no browser). \`--height\` scales
|
|
1560
|
+
it (interiors fill solid below 6 m and stay hollow above, so a building is not baked as a solid
|
|
1561
|
+
block), and \`--name\` sets what game code places by. Do not confuse it with \`prop\`, which
|
|
1562
|
+
REPLACES an existing placeholder and changes every instance already placed.
|
|
1563
|
+
|
|
1564
|
+
\`video\` makes a short clip for a cutscene. It is the one asset the game does not draw: the row it
|
|
1565
|
+
writes is played as a fullscreen overlay by \`engine.playVideo("<asset id>")\`, which resolves when
|
|
1566
|
+
the clip ends or the player skips it — so it belongs at a story beat, not in the world. Give it
|
|
1567
|
+
\`--name\` and that name is what the code calls. A prompt alone generates in well under a minute;
|
|
1568
|
+
\`--image <png>\` animates a still you already have (a cover, a reference) but takes a few minutes,
|
|
1569
|
+
and the clip comes back in the image's shape rather than 16:9. The command leaves 8 frames of it
|
|
1570
|
+
tiled in \`.bitmagic/videos/<asset id>.png\` — READ that image before wiring the clip up, and read
|
|
1571
|
+
the line saying whether it has an audio track, because a silent cutscene needs a music bed under
|
|
1572
|
+
it. Call \`playVideo\` from the Play click or later, never before: without a prior user gesture the
|
|
1573
|
+
browser blocks autoplay and the clip silently does not run. See \`video-cutscenes.md\`.
|
|
1489
1574
|
|
|
1490
1575
|
\`vehicle\` is the one that needs more than a prompt to be useful. It creates a NEW asset (it does
|
|
1491
1576
|
not upgrade an existing one), it needs Chrome and a free port between 3000 and 3199 because only
|
|
@@ -1566,8 +1651,8 @@ explicitly. You never need to guess whether a failed generation half-applied.
|
|
|
1566
1651
|
Not a generation, but the same registry: \`bitmagic assets add <file>\` uploads a \`.glb\`
|
|
1567
1652
|
(voxelized in a headless browser — Chrome and a free port in 3000–3199, like \`vehicle\`), a
|
|
1568
1653
|
\`.vxl\`, an image (\`.png/.jpg/.webp\`), audio (\`.opus/.ogg/.m4a/.mp3\`) or a config \`.json\`
|
|
1569
|
-
into \`assets[]\` and prints the id. \`--keep-glb\` registers a \`.glb\` as a polygon mesh instead
|
|
1570
|
-
\`--voxel-size\`, \`--height
|
|
1654
|
+
into \`assets[]\` and prints the id. \`--keep-glb\` registers a \`.glb\` as a polygon mesh instead (a
|
|
1655
|
+
low-poly project's default); \`--voxel-size\`, \`--height\`, \`--hollow\` tune the bake. No sparks. \`bitmagic
|
|
1571
1656
|
assets list\` shows what is there; \`bitmagic assets remove <id>\` takes one out of \`world.json\`
|
|
1572
1657
|
(the file stays in storage) and refuses while something in \`world.json\` still references it.
|
|
1573
1658
|
|
|
@@ -1711,7 +1796,8 @@ dimension gaining a point is worth 0.25 overall, and you are entitled to see it.
|
|
|
1711
1796
|
What it is **not** is a target. There is no score at which a game is done, and two things will not
|
|
1712
1797
|
move it however many rounds you spend:
|
|
1713
1798
|
|
|
1714
|
-
- **Your art style.** Declare it under \`## Art direction\` in \`GAME-DESIGN.md\`
|
|
1799
|
+
- **Your art style.** Declare it under \`## Art direction\` in \`GAME-DESIGN.md\` (with \`artStyle\`
|
|
1800
|
+
in game.json as the fallback the judge reads when the heading is missing) and the judge
|
|
1715
1801
|
grades craft within that medium. If it is still calling your voxel characters blocky, that
|
|
1716
1802
|
heading is missing or empty — fix the document, not the game.
|
|
1717
1803
|
- **Matters of taste.** When the remaining findings are things a reasonable person could disagree
|
|
@@ -1742,8 +1828,17 @@ style or taste, say so to the creator and move on. That is a finished frame, not
|
|
|
1742
1828
|
* more to an image model than how the input mapping works — but nothing enforces them: the whole
|
|
1743
1829
|
* file is read as prose.
|
|
1744
1830
|
*/
|
|
1745
|
-
export function renderGameDesignMd(idea) {
|
|
1831
|
+
export function renderGameDesignMd(idea, artStyle) {
|
|
1746
1832
|
const pitch = idea?.trim();
|
|
1833
|
+
// Declared at init: the medium is known, so the heading the judge reads is written from the
|
|
1834
|
+
// start — the creator adds the palette and mood. Undeclared: the prompt text, exactly as before.
|
|
1835
|
+
const artDirection = artStyle === undefined
|
|
1836
|
+
? `The medium and style you chose, in a sentence or two — voxel, low-poly, flat colour, pixel art.
|
|
1837
|
+
\`bitmagic judge\` reads THIS heading to know what is intentional: state it here and the judge
|
|
1838
|
+
grades craft within your style instead of reporting the style itself as a defect. Without it, a
|
|
1839
|
+
voxel game gets told its characters are blocky.`
|
|
1840
|
+
: `${describeArtStyle(artStyle)} (declared as \`artStyle\` in \`src/work/game.json\`.) Add the
|
|
1841
|
+
palette, mood and the references you are drawing from; \`bitmagic judge\` reads this heading.`;
|
|
1747
1842
|
return `# Game design
|
|
1748
1843
|
|
|
1749
1844
|
${pitch
|
|
@@ -1766,10 +1861,7 @@ ${GAME_DESIGN_REFERENCE_HINT}
|
|
|
1766
1861
|
|
|
1767
1862
|
## Art direction
|
|
1768
1863
|
|
|
1769
|
-
|
|
1770
|
-
\`bitmagic judge\` reads THIS heading to know what is intentional: state it here and the judge
|
|
1771
|
-
grades craft within your style instead of reporting the style itself as a defect. Without it, a
|
|
1772
|
-
voxel game gets told its characters are blocky.
|
|
1864
|
+
${artDirection}
|
|
1773
1865
|
|
|
1774
1866
|
## Win / lose
|
|
1775
1867
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ArtStyle } from '@bitmagic/asset-core/art-style';
|
|
1
2
|
import { type ProjectMetadata, type SkillRenderer } from './project-files.js';
|
|
2
3
|
import { type AgentId } from './agent-targets.js';
|
|
3
4
|
export interface TemplateEntry {
|
|
@@ -172,6 +173,12 @@ export interface ScaffoldOptions {
|
|
|
172
173
|
projectName: string;
|
|
173
174
|
/** `bitmagic init --idea`, seeding GAME-DESIGN.md's Pitch. Absent leaves the skeleton empty. */
|
|
174
175
|
idea?: string;
|
|
176
|
+
/**
|
|
177
|
+
* `bitmagic init --art-style`: stamped into `src/work/game.json` and pre-filled under
|
|
178
|
+
* GAME-DESIGN.md's Art direction. Absent writes nothing, so a voxel project's game.json is the
|
|
179
|
+
* template's own — the field's absence means voxel everywhere it is read.
|
|
180
|
+
*/
|
|
181
|
+
artStyle?: ArtStyle;
|
|
175
182
|
}
|
|
176
183
|
/**
|
|
177
184
|
* Puts the platform's own code into the project: the vendored `engine/` tree and the service
|
|
@@ -189,6 +196,8 @@ export interface ProjectFileOptions {
|
|
|
189
196
|
projectName: string;
|
|
190
197
|
/** `bitmagic init --idea`, seeding GAME-DESIGN.md's Pitch. Ignored when `gameDesign` is 'keep'. */
|
|
191
198
|
idea?: string;
|
|
199
|
+
/** Pre-fills GAME-DESIGN.md's Art direction. Ignored when `gameDesign` is 'keep'. */
|
|
200
|
+
artStyle?: ArtStyle;
|
|
192
201
|
/**
|
|
193
202
|
* Whether to write GAME-DESIGN.md at all.
|
|
194
203
|
*
|
package/dist/scaffold/project.js
CHANGED
|
@@ -5,6 +5,7 @@ import { aliasSourceDir } from './aliases.js';
|
|
|
5
5
|
import { renderPackageJson, renderTsconfig, renderIndexHtml, renderViteConfig, renderVitePublishConfig, renderVitePublishStandaloneConfig, renderGitignore, renderBitmagicJson, renderAgentsMd, renderGameDesignMd, renderClaudeMd, renderJudgeSkill, renderThemingSkill, renderGenerateSkill, renderPlanningSkill, renderEngineApiSkill, renderUsageSkill, } from './project-files.js';
|
|
6
6
|
import { renderCreatorCollaborationSkill, renderPublishingSkill, renderKiroSteering, renderSkillsReadme, renderTrailerSkill, } from './skill-files.js';
|
|
7
7
|
import { renderUnityLevelsSkill, renderUnityLevelsTrapsReference, renderUnityLevelsFbxReference, renderUnityLevelsPhysicsReference, renderUnityLevelsVerificationReference, } from './unity-skill-files.js';
|
|
8
|
+
import { renderBlenderLevelsSkill, renderBlenderConventionsReference, renderBlenderAuditsReference, renderBlenderPassesReference, renderBlenderEngineHandoffReference, } from './blender-level-skill-files.js';
|
|
8
9
|
import { ALWAYS_AGENTS, dedupeAgents, skillDirsFor } from './agent-targets.js';
|
|
9
10
|
import { hashAgentsMd } from './agents-md.js';
|
|
10
11
|
import { CLAUDE_SETTINGS_FILE, renderClaudeSettings } from './claude-settings.js';
|
|
@@ -175,6 +176,11 @@ export const SHIPPED_SKILLS = [
|
|
|
175
176
|
['converting-unity-levels/references/fbx-conversion.md', renderUnityLevelsFbxReference],
|
|
176
177
|
['converting-unity-levels/references/physics-and-shadows.md', renderUnityLevelsPhysicsReference],
|
|
177
178
|
['converting-unity-levels/references/verification.md', renderUnityLevelsVerificationReference],
|
|
179
|
+
['building-levels-in-blender/SKILL.md', renderBlenderLevelsSkill],
|
|
180
|
+
['building-levels-in-blender/references/blender-conventions.md', renderBlenderConventionsReference],
|
|
181
|
+
['building-levels-in-blender/references/audits-and-review.md', renderBlenderAuditsReference],
|
|
182
|
+
['building-levels-in-blender/references/level-design-passes.md', renderBlenderPassesReference],
|
|
183
|
+
['building-levels-in-blender/references/engine-handoff.md', renderBlenderEngineHandoffReference],
|
|
178
184
|
];
|
|
179
185
|
/**
|
|
180
186
|
* Files a particular agent needs that are not skills, written only for a project that named it.
|
|
@@ -303,7 +309,7 @@ export function vendorEngine(extractedEngineDir, targetDir) {
|
|
|
303
309
|
* argued on that constant.
|
|
304
310
|
*/
|
|
305
311
|
export function writeProjectFiles(options) {
|
|
306
|
-
const { targetDir, metadata, projectName, idea, gameDesign = 'render' } = options;
|
|
312
|
+
const { targetDir, metadata, projectName, idea, artStyle, gameDesign = 'render' } = options;
|
|
307
313
|
// The project's own declaration, so `bitmagic.json` and the file set on disk cannot disagree.
|
|
308
314
|
const agents = metadata.agents ?? ALWAYS_AGENTS;
|
|
309
315
|
// Stamped as it is written, so a later `bitmagic upgrade` can tell whether the creator has
|
|
@@ -320,7 +326,7 @@ export function writeProjectFiles(options) {
|
|
|
320
326
|
// Creator-owned from here on (see PLATFORM_GENERATED_FILES): the agent rewrites it as the
|
|
321
327
|
// game takes shape, and `bitmagic cover` reads whatever it says at the time.
|
|
322
328
|
...(gameDesign === 'render'
|
|
323
|
-
? [['GAME-DESIGN.md', renderGameDesignMd(idea)]]
|
|
329
|
+
? [['GAME-DESIGN.md', renderGameDesignMd(idea, artStyle)]]
|
|
324
330
|
: []),
|
|
325
331
|
['CLAUDE.md', renderClaudeMd()],
|
|
326
332
|
['.gitignore', renderGitignore()],
|
|
@@ -334,7 +340,7 @@ export function writeProjectFiles(options) {
|
|
|
334
340
|
}
|
|
335
341
|
}
|
|
336
342
|
export function scaffoldProject(options) {
|
|
337
|
-
const { targetDir, extractedEngineDir, templatesDir, template, metadata, projectName, idea } = options;
|
|
343
|
+
const { targetDir, extractedEngineDir, templatesDir, template, metadata, projectName, idea, artStyle } = options;
|
|
338
344
|
vendorEngine(extractedEngineDir, targetDir);
|
|
339
345
|
// The game: the genre baseline, then the template overlaid on top. Contents are copied, not
|
|
340
346
|
// the directory itself — a nested src/work/<genre>/ would break every relative import in
|
|
@@ -355,11 +361,31 @@ export function scaffoldProject(options) {
|
|
|
355
361
|
if (fs.existsSync(overlayDir)) {
|
|
356
362
|
copyContents(overlayDir, srcDir);
|
|
357
363
|
}
|
|
364
|
+
if (artStyle !== undefined)
|
|
365
|
+
stampArtStyle(srcDir, artStyle);
|
|
358
366
|
writeProjectFiles({
|
|
359
367
|
targetDir,
|
|
360
368
|
metadata,
|
|
361
369
|
projectName,
|
|
362
370
|
...(idea !== undefined ? { idea } : {}),
|
|
371
|
+
...(artStyle !== undefined ? { artStyle } : {}),
|
|
363
372
|
});
|
|
364
373
|
}
|
|
374
|
+
/**
|
|
375
|
+
* Write `artStyle` into the copied template's game.json, beside the metadata the template
|
|
376
|
+
* carries. A re-serialize of the whole document rather than a text patch: the template's own
|
|
377
|
+
* formatting is two-space JSON already, so the file the creator sees is unchanged apart from the
|
|
378
|
+
* one added line.
|
|
379
|
+
*/
|
|
380
|
+
function stampArtStyle(srcDir, artStyle) {
|
|
381
|
+
const gamePath = path.join(srcDir, 'game.json');
|
|
382
|
+
if (!fs.existsSync(gamePath)) {
|
|
383
|
+
throw new CliError(`The template has no ${gamePath}, so --art-style has nowhere to be written.`);
|
|
384
|
+
}
|
|
385
|
+
const parsed = JSON.parse(fs.readFileSync(gamePath, 'utf-8'));
|
|
386
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
387
|
+
throw new CliError(`${gamePath} is not a JSON object, so --art-style cannot be written into it.`);
|
|
388
|
+
}
|
|
389
|
+
fs.writeFileSync(gamePath, `${JSON.stringify({ ...parsed, artStyle }, null, 2)}\n`);
|
|
390
|
+
}
|
|
365
391
|
//# sourceMappingURL=project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/scaffold/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/scaffold/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,iCAAiC,EACjC,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,+BAA+B,EAC/B,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAC/B,6BAA6B,EAC7B,iCAAiC,EACjC,sCAAsC,GACvC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,wBAAwB,EACxB,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,mCAAmC,GACpC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAelF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,aAAa,CAAC,CAAC;AAEhE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;CACP,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,YAAY,CAAC,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAEhF;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CAAC,kBAA0B;IACnE,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAChB,6BAA6B,GAAG,kBAAkB,MAAM,yCAAyC,CAClG,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,kBAA0B,EAAE,SAAiB;IACrF,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,sBAAsB,EAAE,GAAG,uBAAuB,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,kBAA0B,EAAE,IAAY;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,YAAoB,EAAE,QAAgB;IACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC/C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACjC,CAAC,4BAA4B,EAAE,mBAAmB,CAAC;IACnD,CAAC,0BAA0B,EAAE,mBAAmB,CAAC;IACjD,CAAC,8BAA8B,EAAE,oBAAoB,CAAC;IACtD,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IAC7C,CAAC,0BAA0B,EAAE,gBAAgB,CAAC;IAC9C,CAAC,0BAA0B,EAAE,kBAAkB,CAAC;IAChD,CAAC,2BAA2B,EAAE,kBAAkB,CAAC;IACjD,CAAC,4BAA4B,EAAE,qBAAqB,CAAC;IACrD,CAAC,mCAAmC,EAAE,+BAA+B,CAAC;IACtE,CAAC,kCAAkC,EAAE,sBAAsB,CAAC;IAC5D,CAAC,yDAAyD,EAAE,+BAA+B,CAAC;IAC5F,CAAC,sDAAsD,EAAE,6BAA6B,CAAC;IACvF,CAAC,2DAA2D,EAAE,iCAAiC,CAAC;IAChG,CAAC,oDAAoD,EAAE,sCAAsC,CAAC;IAC9F,CAAC,qCAAqC,EAAE,wBAAwB,CAAC;IACjE,CAAC,8DAA8D,EAAE,iCAAiC,CAAC;IACnG,CAAC,4DAA4D,EAAE,4BAA4B,CAAC;IAC5F,CAAC,8DAA8D,EAAE,4BAA4B,CAAC;IAC9F,CAAC,yDAAyD,EAAE,mCAAmC,CAAC;CACjG,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAA4D;IACjF,IAAI,EAAE,CAAC,CAAC,4BAA4B,EAAE,kBAAkB,CAAC,CAAC;CAC3D,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE,CAAC,eAAe,EAAE,cAAc,CAAC;IACjC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,CAAC,wBAAwB,EAAE,uBAAuB,CAAC;IACnD,CAAC,mCAAmC,EAAE,iCAAiC,CAAC;IACxE,CAAC,YAAY,EAAE,eAAe,CAAC;CAChC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAA6B,aAAa;IAE1C,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO;QACL,GAAG,qBAAqB;QACxB,GAAG,YAAY,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3F,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3B,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,EAA0B,EAAE,CAAC;YACrE,GAAG,GAAG,IAAI,YAAY,EAAE;YACxB,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;SAC5C,CAAC,CACH;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,8CAA8C,SAAS,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;IAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,WAAoB;IACxE,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAElD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,4FAA4F;QAC5F,6FAA6F;QAC7F,0DAA0D;QAC1D,OAAO,CACL,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,mBAAmB,CAAC;YACnD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YACpC,SAAS,CAAC,CAAC,CAAC,CACb,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAChB,qBAAqB,WAAW,2BAA2B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAoBD,wEAAwE;AACxE,SAAS,YAAY,CAAC,MAAc,EAAE,IAAY;IAChD,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,kBAA0B,EAAE,SAAiB;IACxE,0BAA0B,CAAC,kBAAkB,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,yBAAyB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IACzD,iBAAiB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAoBD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC5F,8FAA8F;IAC9F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,aAAa,CAAC;IAEhD,2FAA2F;IAC3F,iGAAiG;IACjG,mGAAmG;IACnG,kGAAkG;IAClG,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5E,MAAM,KAAK,GAA4B;QACrC,CAAC,cAAc,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAChD,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAoB,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7F,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC,WAAW,EAAE,QAAQ,CAAC;QACvB,0FAA0F;QAC1F,6EAA6E;QAC7E,GAAG,CAAC,UAAU,KAAK,QAAQ;YACzB,CAAC,CAAE,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAA6B;YACvF,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC;QAC/B,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC;QACjC,8FAA8F;QAC9F,+FAA+F;QAC/F,mCAAmC;QACnC,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;KAC/C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,gBAAgB,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAwB;IACtD,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEjH,YAAY,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAE5C,4FAA4F;IAC5F,yFAAyF;IACzF,6FAA6F;IAC7F,4EAA4E;IAC5E,EAAE;IACF,4FAA4F;IAC5F,8FAA8F;IAC9F,wFAAwF;IACxF,sCAAsC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,gDAAgD,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;IACzF,CAAC;IACD,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAClE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS;QAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE5D,iBAAiB,CAAC;QAChB,SAAS;QACT,QAAQ;QACR,WAAW;QACX,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,MAAc,EAAE,QAAkB;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,uBAAuB,QAAQ,6CAA6C,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,QAAQ,CAAC,GAAG,QAAQ,kEAAkE,CAAC,CAAC;IACpG,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAI,MAAkC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACnH,CAAC"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* markdown, so backticks are escaped exactly as project-files.ts escapes them.
|
|
10
10
|
*/
|
|
11
11
|
/** The `## Reference image` section of the scaffolded AGENTS.md, placed before the cover section. */
|
|
12
|
-
export declare const AGENTS_MD_REFERENCE_SECTION = "## Reference image \u2014 offer it when the idea has a strong setting\n\nWhen the idea names a **place or a look** \u2014 a tropical island, a neon city \u2014 offer to make a\nconcept image of the world before generating anything else:\n\n```\nbitmagic reference make # a candidate lands in .bitmagic/reference/\nbitmagic reference make --from <id> --prompt \"same island, but at dusk\"\nbitmagic reference accept <id> # the human's call, never yours\n```\n\
|
|
12
|
+
export declare const AGENTS_MD_REFERENCE_SECTION = "## Reference image \u2014 offer it when the idea has a strong setting\n\nWhen the idea names a **place or a look** \u2014 a tropical island, a neon city \u2014 offer to make a\nconcept image of the world before generating anything else:\n\n```\nbitmagic reference make # a candidate lands in .bitmagic/reference/\nbitmagic reference make --from <id> --prompt \"same island, but at dusk\"\nbitmagic reference accept <id> # the human's call, never yours\n```\n\nThe prompt follows game.json's `artStyle`, so declare the medium first. Show the human each image\nfile and let THEM iterate and accept. Once accepted, it is the default\nstyle reference for `generate skybox|background|block-type|image`, `bitmagic cover` and\n`bitmagic forge` (whose designer literally sees the picture) \u2014 one look across the whole game;\n`--no-reference` exempts a call, and a picture the human hands you for ONE request rides that\ncall as `--reference-image <file>` instead. Accepting prints a durable URL: paste it into\n`GAME-DESIGN.md`'s world/look section, since `.bitmagic/` is not committed and\n`bitmagic reference accept <url>` is how a fresh clone gets it back. Details are in\n`.agents/skills/generating-assets/SKILL.md`; skip the offer when the idea has no visual identity\nyet.\n\n";
|
|
13
13
|
/** The planning skill's step-1 paragraph on offering a reference image. */
|
|
14
14
|
export declare const PLANNING_SKILL_REFERENCE_STEP1 = "If the idea describes a **place** \u2014 an island, a city, a specific look \u2014 offer a reference image\nbefore anything else is generated: `bitmagic reference make`, show the human the file it prints,\niterate with `--from <id>`, and run `accept` only when they choose one. Every skybox, block,\ncover and forge after that inherits the accepted image, so it is worth settling first \u2014 and worth\nskipping when the idea has no visual identity yet.\n\n";
|
|
15
15
|
/** The planning skill's step-4 list entry (rendered between the design-doc and cover steps). */
|
|
@@ -21,7 +21,8 @@ bitmagic reference make --from <id> --prompt "same island, but at dusk"
|
|
|
21
21
|
bitmagic reference accept <id> # the human's call, never yours
|
|
22
22
|
\`\`\`
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
The prompt follows game.json's \`artStyle\`, so declare the medium first. Show the human each image
|
|
25
|
+
file and let THEM iterate and accept. Once accepted, it is the default
|
|
25
26
|
style reference for \`generate skybox|background|block-type|image\`, \`bitmagic cover\` and
|
|
26
27
|
\`bitmagic forge\` (whose designer literally sees the picture) — one look across the whole game;
|
|
27
28
|
\`--no-reference\` exempts a call, and a picture the human hands you for ONE request rides that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-guidance.js","sourceRoot":"","sources":["../../src/scaffold/reference-guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qGAAqG;AACrG,MAAM,CAAC,MAAM,2BAA2B,GAAG
|
|
1
|
+
{"version":3,"file":"reference-guidance.js","sourceRoot":"","sources":["../../src/scaffold/reference-guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,qGAAqG;AACrG,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;IAmBvC,kBAAkB;;;CAGrB,CAAC;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;CAM7C,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,8BAA8B,GAAG;;CAE7C,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B/C,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GACrC,6HAA6H,CAAC"}
|
|
@@ -77,7 +77,7 @@ ${alsoWritten}
|
|
|
77
77
|
|
|
78
78
|
\`planning-a-game/\`, \`finding-engine-apis/\`, \`generating-assets/\`, \`checking-usage/\`,
|
|
79
79
|
\`judging-quality/\`, \`theming-the-hud/\`, \`making-a-trailer/\`, \`publishing-a-game/\`,
|
|
80
|
-
\`working-with-the-creator/\`, \`converting-unity-levels/\` — and
|
|
80
|
+
\`working-with-the-creator/\`, \`converting-unity-levels/\`, \`building-levels-in-blender/\` — and
|
|
81
81
|
this README — are shipped by the Bitmagic CLI and **re-rendered by \`bitmagic upgrade\`**. They
|
|
82
82
|
describe what the CLI and the engine can do, so they have to stay current with both; edits to them
|
|
83
83
|
are lost on the next upgrade.
|
|
@@ -94,6 +94,7 @@ are lost on the next upgrade.
|
|
|
94
94
|
| \`publishing-a-game/\` | shipping the game to bitmagic.ai — the verify gate, public vs private, thumbnails, category tags, and every way \`bitmagic publish\` can refuse |
|
|
95
95
|
| \`working-with-the-creator/\` | they are editing alongside you — gizmo drags into \`world.json\`, a pasted frame from their game, \`.bitmagic/edit/events.jsonl\`, their phone |
|
|
96
96
|
| \`converting-unity-levels/\` | a creator wants a Unity scene or game ported, replicated or "brought over" — reusing its prefabs, FBX models and colliders — or a converted level has pieces rotated, mis-scaled, walls that do not collide, an empty corner |
|
|
97
|
+
| \`building-levels-in-blender/\` | a hand-designed low-poly world — an interior, a station, a stylised set, "not voxels", "in Blender" — built from a Python script into one GLB the engine's MeshLevel loads, and the \`artStyle: "low-poly"\` switch in game.json that makes the cover, asset and judge defaults follow; or such a level has walls you fall through, doors that do not open, z-fighting, an empty world after publish. Its first section says when the path is yours |
|
|
97
98
|
|
|
98
99
|
Every other directory here is yours. \`upgrade\` never opens a skill it does not ship, and never
|
|
99
100
|
deletes anything under a skills directory. Put project-specific guidance in a skill of your own, or
|
|
@@ -255,6 +256,7 @@ The creator talks; you edit \`trailer/shots.json\`, run \`bitmagic trailer make\
|
|
|
255
256
|
| "add a title at the start" | a \`title\`-style cue at \`at: 0\` for ~2.5 s, and make the first shot calm enough to read over |
|
|
256
257
|
| "different music", "more epic / chill" | \`--music-prompt\` with the new direction (spends sparks), or \`--music <file>\`; shots keep their beat counts and re-snap |
|
|
257
258
|
| "no HUD" / "show the HUD" | drop or add \`--ui\` (per shot: \`"ui": false\`) |
|
|
259
|
+
| "the HUD stutters" / "smoother HUD" | raise \`--ui-keyframe-rate\` on \`make\` or \`render\` (default 30/s; 0 = every change) |
|
|
258
260
|
| "shorter / longer" | \`--seconds N\` only matters for a fresh auto cut (\`--reset-shots\`); otherwise add or remove shots |
|
|
259
261
|
| "start over" | \`bitmagic trailer make --reset-shots\` |
|
|
260
262
|
| "use the other recording" | \`--recording <dir>\`; shots.json from another recording is kept beside a fresh cut |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-files.js","sourceRoot":"","sources":["../../src/scaffold/skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAsB;IAC7E,2FAA2F;IAC3F,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7F,6FAA6F;IAC7F,0EAA0E;IAC1E,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,8FAA8F;YAC9F,mEAAmE;YACnE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,iFAAiF,CAAC;IAExF,OAAO;;sBAEa,SAAS,SAAS,iBAAiB,CAAC,SAAS,CAAC;;;EAGlE,WAAW
|
|
1
|
+
{"version":3,"file":"skill-files.js","sourceRoot":"","sources":["../../src/scaffold/skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAsB;IAC7E,2FAA2F;IAC3F,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7F,6FAA6F;IAC7F,0EAA0E;IAC1E,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,8FAA8F;YAC9F,mEAAmE;YACnE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,iFAAiF,CAAC;IAExF,OAAO;;sBAEa,SAAS,SAAS,iBAAiB,CAAC,SAAS,CAAC;;;EAGlE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BZ,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuJR,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GR,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC"}
|
|
@@ -63,8 +63,7 @@ The conversion scripts ship inside the Bitmagic CLI package, under \`assets/unit
|
|
|
63
63
|
them into \`tools/\` of the game project once:
|
|
64
64
|
|
|
65
65
|
\`\`\`
|
|
66
|
-
|
|
67
|
-
mkdir -p tools && cp "$CLI_ROOT"/assets/unity-import/*.py "$CLI_ROOT"/assets/unity-import/*.json tools/
|
|
66
|
+
bitmagic tools install unity-import
|
|
68
67
|
\`\`\`
|
|
69
68
|
|
|
70
69
|
They need Python 3, Blender 4.x
|