All checks were successful
Build / build (push) Successful in 1m34s
Major changes: - Add LevelRegistry for managing default (JSON) and custom (localStorage) levels - Default levels now load from /public/levels/*.json files - Add 6 default level JSON files (rookie-training through final-challenge) - Implement version-based automatic cache invalidation - Add LevelVersionManager for tracking level updates - Add LevelStatsManager for performance tracking (completion rate, best time, etc.) - Add legacy migration tool for existing localStorage data - Update level selector UI with stats display and version badges - Add configurable orbit constraints per level (useOrbitConstraints flag) - Hide copy button in level selector UI (TODO: re-enable later) - Add extensive debug logging for velocity troubleshooting - Add cloud sync infrastructure interfaces (future-ready) Technical improvements: - Hybrid storage: immutable defaults from JSON, editable custom levels in localStorage - Automatic cache refresh when directory.json version changes - Cache API for offline support - Fresh start migration approach with export option - Level loading now initializes before router starts Physics configuration: - Add useOrbitConstraints flag to LevelConfig - Rookietraining.json uses constraints (velocities will create orbital motion) - Debug logging added to verify velocity application 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
251 lines
5.1 KiB
JSON
251 lines
5.1 KiB
JSON
{
|
|
"version": "1.0",
|
|
"difficulty": "pilot",
|
|
"timestamp": "2025-11-11T23:44:24.810Z",
|
|
"metadata": {
|
|
"author": "System",
|
|
"description": "Clear a path through moderate asteroid density to reach the stranded station.",
|
|
"estimatedTime": "5-8 minutes",
|
|
"type": "default"
|
|
},
|
|
"ship": {
|
|
"position": [
|
|
0,
|
|
1,
|
|
0
|
|
],
|
|
"rotation": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"linearVelocity": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"angularVelocity": [
|
|
0,
|
|
0,
|
|
0
|
|
]
|
|
},
|
|
"startBase": {
|
|
"position": [
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"baseGlbPath": "base.glb"
|
|
},
|
|
"sun": {
|
|
"position": [
|
|
0,
|
|
0,
|
|
400
|
|
],
|
|
"diameter": 50,
|
|
"intensity": 1000000
|
|
},
|
|
"planets": [],
|
|
"asteroids": [
|
|
{
|
|
"id": "asteroid-0",
|
|
"position": [
|
|
242.60734209985543,
|
|
-114.56996058926651,
|
|
5.575229357062
|
|
],
|
|
"scale": 15.53109319217301,
|
|
"linearVelocity": [
|
|
-17.167175139332553,
|
|
8.177863609194048,
|
|
-0.39450965492725215
|
|
],
|
|
"angularVelocity": [
|
|
-0.834980024785148,
|
|
0.9648009938830251,
|
|
0.8185653748494373
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-1",
|
|
"position": [
|
|
145.90971366777896,
|
|
42.273817290099984,
|
|
-244.80503221456152
|
|
],
|
|
"scale": 17.57678371034564,
|
|
"linearVelocity": [
|
|
-14.737555578618144,
|
|
-4.168846343154079,
|
|
24.72643991613985
|
|
],
|
|
"angularVelocity": [
|
|
0.575649251710729,
|
|
-0.8551046445434349,
|
|
-0.9477761112717422
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-2",
|
|
"position": [
|
|
195.05992969157123,
|
|
-111.0584087077698,
|
|
-22.40662780090249
|
|
],
|
|
"scale": 14.234090261353138,
|
|
"linearVelocity": [
|
|
-16.81570103491442,
|
|
9.660316715266058,
|
|
1.9316276535952197
|
|
],
|
|
"angularVelocity": [
|
|
0.8587973467645904,
|
|
0.25620436829463733,
|
|
-0.7705721105608303
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-3",
|
|
"position": [
|
|
-0.9357515100775112,
|
|
85.76554222686204,
|
|
249.4670613777975
|
|
],
|
|
"scale": 17.34408913479813,
|
|
"linearVelocity": [
|
|
0.07109432360434195,
|
|
-6.440116659897093,
|
|
-18.953420645560346
|
|
],
|
|
"angularVelocity": [
|
|
0.19650221972006143,
|
|
0.4226089665809898,
|
|
-0.9419176203015098
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-4",
|
|
"position": [
|
|
-254.14456477364413,
|
|
54.65967750105119,
|
|
82.65652287437858
|
|
],
|
|
"scale": 14.980803819380306,
|
|
"linearVelocity": [
|
|
22.372081486064396,
|
|
-4.723605553550473,
|
|
-7.2761676675924445
|
|
],
|
|
"angularVelocity": [
|
|
-0.22039903827783025,
|
|
0.03062354927084643,
|
|
0.3628209366655213
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-5",
|
|
"position": [
|
|
-257.7249224576784,
|
|
-112.97325792551102,
|
|
-92.25372143357285
|
|
],
|
|
"scale": 17.10484995348801,
|
|
"linearVelocity": [
|
|
17.764361846647077,
|
|
7.855903788127005,
|
|
6.358828139777149
|
|
],
|
|
"angularVelocity": [
|
|
-0.27982741337355455,
|
|
0.2465507084870353,
|
|
-0.8489416083688623
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-6",
|
|
"position": [
|
|
-61.74000302102928,
|
|
103.75532261403117,
|
|
-224.6843746923246
|
|
],
|
|
"scale": 14.438006716048399,
|
|
"linearVelocity": [
|
|
4.573571795825104,
|
|
-7.611901885044768,
|
|
16.644154013167135
|
|
],
|
|
"angularVelocity": [
|
|
-0.41949593751738457,
|
|
-0.5881266007071146,
|
|
0.2671577602439994
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-7",
|
|
"position": [
|
|
16.846663100767792,
|
|
72.36836836065181,
|
|
271.36235273889974
|
|
],
|
|
"scale": 18.93457175982751,
|
|
"linearVelocity": [
|
|
-1.2776861733199087,
|
|
-5.412726361379603,
|
|
-20.580688530433683
|
|
],
|
|
"angularVelocity": [
|
|
-0.5793176374486806,
|
|
0.8207961833131412,
|
|
-0.034658037798875885
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-8",
|
|
"position": [
|
|
129.11110725214024,
|
|
91.10691458736655,
|
|
205.0668479159754
|
|
],
|
|
"scale": 15.43421226033438,
|
|
"linearVelocity": [
|
|
-10.330594112594069,
|
|
-7.209743461671342,
|
|
-16.4080567261488
|
|
],
|
|
"angularVelocity": [
|
|
-0.572098306083443,
|
|
0.6581860817605101,
|
|
-0.7141435682550208
|
|
]
|
|
},
|
|
{
|
|
"id": "asteroid-9",
|
|
"position": [
|
|
-30.953057070289603,
|
|
225.21952155696817,
|
|
139.05608152400566
|
|
],
|
|
"scale": 14.151176153817078,
|
|
"linearVelocity": [
|
|
1.9861965590557589,
|
|
-14.387724003424648,
|
|
-8.922954201633985
|
|
],
|
|
"angularVelocity": [
|
|
0.7016416714654072,
|
|
-0.8069811132136699,
|
|
-0.16093262088047533
|
|
]
|
|
}
|
|
],
|
|
"difficultyConfig": {
|
|
"rockCount": 10,
|
|
"forceMultiplier": 1,
|
|
"rockSizeMin": 8,
|
|
"rockSizeMax": 20,
|
|
"distanceMin": 225,
|
|
"distanceMax": 300
|
|
}
|
|
} |