@bitmagic/cli 0.1.64-dev.1 → 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 +88 -1
- package/dist/commands/generate.js +400 -21
- 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/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/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 +125 -42
- 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
|
|
@@ -1048,29 +1114,29 @@ bitmagic forge --prompt "a ruined desert temple with a central courtyard"
|
|
|
1048
1114
|
|
|
1049
1115
|
This designs a scene, builds its geometry, bakes it to voxels and writes the finished level —
|
|
1050
1116
|
terrain, props, spawn points — into \`src/work/world.json\`. \`bitmagic levels list | add | rename
|
|
1051
|
-
| set-start | remove\` manages them afterwards (free, local
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
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.
|
|
1055
1127
|
|
|
1056
1128
|
Four things worth knowing:
|
|
1057
1129
|
|
|
1058
|
-
1. **It is slow.** A forge runs for many minutes — the level bake alone can take twenty.
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
the final step, and every failure says whether it did and whether
|
|
1069
|
-
\`bitmagic forge --resume <jobId>\` is worth it — which is twenty minutes you do not spend again.
|
|
1070
|
-
|
|
1071
|
-
Afterwards actually walk the level in the dev view — one that loads is not necessarily one you can
|
|
1072
|
-
move through. (You should already have \`bitmagic dev\` running; a forge takes twenty minutes, and
|
|
1073
|
-
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.
|
|
1074
1140
|
|
|
1075
1141
|
${renderCliUpdateSection(environment)}
|
|
1076
1142
|
`;
|
|
@@ -1152,6 +1218,7 @@ the engine, already wired** — and hand-building a worse version of it is the m
|
|
|
1152
1218
|
| Animals, snakes, fish, birds, dragons | Procedural creature systems | \`animal-instructions.md\`, \`snake-instructions.md\` |
|
|
1153
1219
|
| Score, timers, health bars, game-over and win screens | HUD + end-game systems | \`HUD_ELEMENTS.md\`, \`end-game.md\` |
|
|
1154
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\` |
|
|
1155
1222
|
| Collectibles, pickups, checkpoints, markers | Dedicated systems | \`collectible-objects.md\`, \`markers-system.md\` |
|
|
1156
1223
|
| Doors, locked doors and their keys | \`worldProfileData.doors[]\` + \`keyItems[]\` | \`doors-and-locks.md\` |
|
|
1157
1224
|
| Moving platforms, elevators, crushers, conveyors, spinners | \`mechanisms[]\` in world.json | \`moving-platforms.md\` |
|
|
@@ -1207,7 +1274,8 @@ player to move) either builds no player controller (the \`no-character\` templat
|
|
|
1207
1274
|
- Controls: every action as desktop key + phone button, bound in one call
|
|
1208
1275
|
- Engine systems: one line each, naming the doc — \`engine/agent-docs/…\`
|
|
1209
1276
|
- Assets to generate: name them. A skybox and the cover usually earn their place in slice 1.
|
|
1210
|
-
-
|
|
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)
|
|
1211
1279
|
|
|
1212
1280
|
## Deferred — the backlog
|
|
1213
1281
|
Numbered, roughly best-first. Everything the design implies that slice 1 does not do.
|
|
@@ -1244,7 +1312,10 @@ ${PLANNING_SKILL_REFERENCE_STEP4}4. \`bitmagic cover\` — **now**, not later. I
|
|
|
1244
1312
|
so it sets how long the human waits for slice 1. It belongs in slice 1 for a game that cannot be
|
|
1245
1313
|
played without its shape — skiing, racing on a real circuit, open-world driving, an enclosed dungeon
|
|
1246
1314
|
interior. For everything else the baseline's procedural voxel terrain is a fine slice-1 world and the
|
|
1247
|
-
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.
|
|
1248
1319
|
|
|
1249
1320
|
## Step 5 — hand it back
|
|
1250
1321
|
|
|
@@ -1339,6 +1410,7 @@ tier 2.
|
|
|
1339
1410
|
| HUD elements — bars, scores, counters, timers | \`HUD_ELEMENTS.md\` |
|
|
1340
1411
|
| HUD visual style and themes | \`HUD_STYLE_GUIDE.md\`, \`HUD_THEMES.md\` |
|
|
1341
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\` |
|
|
1342
1414
|
| Collectibles and interactables | \`collectible-objects.md\` |
|
|
1343
1415
|
| Placed scenery / \`environmentObjects\` — gameplay near props, harvesting, occupancy | \`environment-objects.md\` |
|
|
1344
1416
|
| Doors, locked gates, keycards | \`doors-and-locks.md\` |
|
|
@@ -1372,7 +1444,7 @@ tier 2.
|
|
|
1372
1444
|
| Multiple levels, level select, switching worlds at runtime | \`level-system.md\` |
|
|
1373
1445
|
| Skyboxes | \`skybox-system.md\` |
|
|
1374
1446
|
| Weather and snow | \`weather-snow.md\` |
|
|
1375
|
-
| 2D side-
|
|
1447
|
+
| 2D side-view games — the forged strip level, its \`worldForgerSideon\` contract, collect/respawn/goal wiring | \`sideon-forged-levels.md\` |
|
|
1376
1448
|
|
|
1377
1449
|
\`engine/agent-docs/samples/\` holds compile-checked reference implementations — a doc that cites
|
|
1378
1450
|
\`samples/raycast-ground-check\` means \`engine/agent-docs/samples/raycast-ground-check.ts\`, and it
|
|
@@ -1484,17 +1556,21 @@ clip, because it is solved locally rather than generated by a model.
|
|
|
1484
1556
|
|
|
1485
1557
|
\`model\` is the one to reach for when the game needs an object that does not exist yet — a new
|
|
1486
1558
|
asset from a sentence. It needs Chrome and a free port between 3000 and 3199, because only the
|
|
1487
|
-
engine can voxelize
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
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.
|
|
1491
1563
|
|
|
1492
1564
|
\`video\` makes a short clip for a cutscene. It is the one asset the game does not draw: the row it
|
|
1493
1565
|
writes is played as a fullscreen overlay by \`engine.playVideo("<asset id>")\`, which resolves when
|
|
1494
1566
|
the clip ends or the player skips it — so it belongs at a story beat, not in the world. Give it
|
|
1495
1567
|
\`--name\` and that name is what the code calls. A prompt alone generates in well under a minute;
|
|
1496
1568
|
\`--image <png>\` animates a still you already have (a cover, a reference) but takes a few minutes,
|
|
1497
|
-
and the clip comes back in the image's shape rather than 16:9.
|
|
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\`.
|
|
1498
1574
|
|
|
1499
1575
|
\`vehicle\` is the one that needs more than a prompt to be useful. It creates a NEW asset (it does
|
|
1500
1576
|
not upgrade an existing one), it needs Chrome and a free port between 3000 and 3199 because only
|
|
@@ -1575,8 +1651,8 @@ explicitly. You never need to guess whether a failed generation half-applied.
|
|
|
1575
1651
|
Not a generation, but the same registry: \`bitmagic assets add <file>\` uploads a \`.glb\`
|
|
1576
1652
|
(voxelized in a headless browser — Chrome and a free port in 3000–3199, like \`vehicle\`), a
|
|
1577
1653
|
\`.vxl\`, an image (\`.png/.jpg/.webp\`), audio (\`.opus/.ogg/.m4a/.mp3\`) or a config \`.json\`
|
|
1578
|
-
into \`assets[]\` and prints the id. \`--keep-glb\` registers a \`.glb\` as a polygon mesh instead
|
|
1579
|
-
\`--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
|
|
1580
1656
|
assets list\` shows what is there; \`bitmagic assets remove <id>\` takes one out of \`world.json\`
|
|
1581
1657
|
(the file stays in storage) and refuses while something in \`world.json\` still references it.
|
|
1582
1658
|
|
|
@@ -1720,7 +1796,8 @@ dimension gaining a point is worth 0.25 overall, and you are entitled to see it.
|
|
|
1720
1796
|
What it is **not** is a target. There is no score at which a game is done, and two things will not
|
|
1721
1797
|
move it however many rounds you spend:
|
|
1722
1798
|
|
|
1723
|
-
- **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
|
|
1724
1801
|
grades craft within that medium. If it is still calling your voxel characters blocky, that
|
|
1725
1802
|
heading is missing or empty — fix the document, not the game.
|
|
1726
1803
|
- **Matters of taste.** When the remaining findings are things a reasonable person could disagree
|
|
@@ -1751,8 +1828,17 @@ style or taste, say so to the creator and move on. That is a finished frame, not
|
|
|
1751
1828
|
* more to an image model than how the input mapping works — but nothing enforces them: the whole
|
|
1752
1829
|
* file is read as prose.
|
|
1753
1830
|
*/
|
|
1754
|
-
export function renderGameDesignMd(idea) {
|
|
1831
|
+
export function renderGameDesignMd(idea, artStyle) {
|
|
1755
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.`;
|
|
1756
1842
|
return `# Game design
|
|
1757
1843
|
|
|
1758
1844
|
${pitch
|
|
@@ -1775,10 +1861,7 @@ ${GAME_DESIGN_REFERENCE_HINT}
|
|
|
1775
1861
|
|
|
1776
1862
|
## Art direction
|
|
1777
1863
|
|
|
1778
|
-
|
|
1779
|
-
\`bitmagic judge\` reads THIS heading to know what is intentional: state it here and the judge
|
|
1780
|
-
grades craft within your style instead of reporting the style itself as a defect. Without it, a
|
|
1781
|
-
voxel game gets told its characters are blocky.
|
|
1864
|
+
${artDirection}
|
|
1782
1865
|
|
|
1783
1866
|
## Win / lose
|
|
1784
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":"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"}
|
|
@@ -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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unity-skill-files.js","sourceRoot":"","sources":["../../src/scaffold/unity-skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO
|
|
1
|
+
{"version":3,"file":"unity-skill-files.js","sourceRoot":"","sources":["../../src/scaffold/unity-skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+KR,CAAC;AACF,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDR,CAAC;AACF,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,6BAA6B;IAC3C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ER,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iCAAiC;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoER,CAAC;AACF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,sCAAsC;IACpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ToolBundle {
|
|
2
|
+
/** `assets/<name>` in the package. */
|
|
3
|
+
name: string;
|
|
4
|
+
/** Where the copy lands, relative to the project root. */
|
|
5
|
+
target: string;
|
|
6
|
+
/** Only files matching one of these extensions are copied (`null` = everything, recursively). */
|
|
7
|
+
extensions: readonly string[] | null;
|
|
8
|
+
/** The skill that uses it, for the listing. */
|
|
9
|
+
skill: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const TOOL_BUNDLES: readonly ToolBundle[];
|
|
12
|
+
/** `assets/` of this package, from both `dist/tools/` and `src/tools/`. */
|
|
13
|
+
export declare function packageAssetsDir(): string;
|
|
14
|
+
export declare function findBundle(name: string): ToolBundle;
|
|
15
|
+
export interface PlannedCopy {
|
|
16
|
+
from: string;
|
|
17
|
+
to: string;
|
|
18
|
+
}
|
|
19
|
+
/** Every file the install would write, relative paths resolved against `assetsDir` and `projectRoot`. */
|
|
20
|
+
export declare function planBundleCopy(bundle: ToolBundle, assetsDir: string, projectRoot: string): Promise<PlannedCopy[]>;
|
|
21
|
+
export declare function copyBundle(copies: readonly PlannedCopy[]): Promise<void>;
|