space-game/public/levels/rescue-mission.json
Michael Mainguy 244a25fff5
All checks were successful
Build / build (push) Successful in 1m34s
Implement hybrid level storage system with JSON-based defaults and configurable orbit constraints
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>
2025-11-11 18:40:01 -06:00

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
}
}