space-game/public/levels/the-gauntlet.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

1011 lines
22 KiB
JSON

{
"version": "1.0",
"difficulty": "commander",
"timestamp": "2025-11-11T23:44:24.811Z",
"metadata": {
"author": "System",
"description": "Face maximum asteroid density in this ultimate test of piloting skill.",
"estimatedTime": "12-18 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": [
-17.69249542924826,
84.01947133429799,
-123.59996053766258
],
"scale": 2.4822349460013755,
"linearVelocity": [
2.845566885340348,
-13.3524103149862,
19.87916041249419
],
"angularVelocity": [
0.8143534066313953,
-0.9359364839346735,
-0.15178405063615052
]
},
{
"id": "asteroid-1",
"position": [
63.984810857938065,
-138.19039359552377,
-202.0837448202854
],
"scale": 5.228607391030508,
"linearVelocity": [
-6.032111857562759,
13.122052130942931,
19.05126759001586
],
"angularVelocity": [
0.2456343615499761,
0.1546807786434896,
-0.06339276268092364
]
},
{
"id": "asteroid-2",
"position": [
58.01904127898412,
12.138119094999812,
-89.25164583877536
],
"scale": 2.122806567381292,
"linearVelocity": [
-12.904402645940184,
-2.477303491265637,
19.8510549179584
],
"angularVelocity": [
-0.315477510780648,
0.02605341030097108,
-0.04781611527650309
]
},
{
"id": "asteroid-3",
"position": [
-3.732596323717469,
76.9212787972044,
147.8376940162343
],
"scale": 6.78767682745117,
"linearVelocity": [
0.7265875337501956,
-14.778842911542565,
-28.778098721264893
],
"angularVelocity": [
-0.4582822008501273,
-0.2731815124326724,
-0.2799393493128326
]
},
{
"id": "asteroid-4",
"position": [
-70.25248112139637,
87.4446903013746,
-95.37109606717652
],
"scale": 7.803845112745136,
"linearVelocity": [
9.61425791082154,
-11.83020918709425,
13.051813974272738
],
"angularVelocity": [
0.055110327764350764,
-0.6960566876366734,
-0.8174703803698806
]
},
{
"id": "asteroid-5",
"position": [
11.97154351290052,
98.06453089645528,
4.68809691635772
],
"scale": 7.176428304060899,
"linearVelocity": [
-4.171955178580714,
-33.82595334457933,
-1.6337517536323216
],
"angularVelocity": [
0.23365116005857356,
0.5640501772631668,
0.380708669667587
]
},
{
"id": "asteroid-6",
"position": [
192.37623868871566,
7.9067941678296645,
-21.647149999117644
],
"scale": 4.21988390215245,
"linearVelocity": [
-34.82926406114048,
-1.2504587860070007,
3.9191654261956965
],
"angularVelocity": [
-0.43528131155696936,
-0.48368793148659917,
0.30910126660666526
]
},
{
"id": "asteroid-7",
"position": [
-139.1698118565668,
119.36628762878482,
20.619259081159424
],
"scale": 5.992358222092905,
"linearVelocity": [
24.112121849216546,
-20.50776897712679,
-3.572427675032611
],
"angularVelocity": [
0.9670925025584953,
-0.5364352737758646,
-0.6370220343457231
]
},
{
"id": "asteroid-8",
"position": [
-173.62607217490572,
-86.82244180359253,
101.53714690010123
],
"scale": 4.975600066657989,
"linearVelocity": [
24.74684826064222,
12.517294286328381,
-14.47204521579052
],
"angularVelocity": [
-0.5500147661394417,
-0.47775772035399955,
0.03624248493864268
]
},
{
"id": "asteroid-9",
"position": [
-63.293770039525235,
-47.57236815138559,
98.44978727432182
],
"scale": 5.510187826488146,
"linearVelocity": [
9.905149561744375,
7.601325862042018,
-15.406885490706511
],
"angularVelocity": [
0.5442896673614208,
0.43278299885548366,
0.7177786018517671
]
},
{
"id": "asteroid-10",
"position": [
-71.2443552209747,
-34.37394745718009,
-68.45790898149781
],
"scale": 7.44414316374618,
"linearVelocity": [
22.576899560179744,
11.209787165744586,
21.693891823168332
],
"angularVelocity": [
0.13705844930855315,
-0.13957278878608026,
0.26051553985494236
]
},
{
"id": "asteroid-11",
"position": [
-56.20618420585617,
-15.20992678120928,
-139.64412229223393
],
"scale": 6.434561181339902,
"linearVelocity": [
8.652854911371863,
2.495493094639771,
21.49799611009127
],
"angularVelocity": [
0.8922275295480073,
0.6441672013569177,
-0.973381248154531
]
},
{
"id": "asteroid-12",
"position": [
158.00061717993069,
173.40530582047103,
38.190864206116224
],
"scale": 5.89053699178403,
"linearVelocity": [
-16.584321359082637,
-18.096290044750486,
-4.008652474148492
],
"angularVelocity": [
-0.7389906029437507,
0.9265514774815395,
0.10079559226610701
]
},
{
"id": "asteroid-13",
"position": [
-30.737732165559482,
-141.9978338257131,
15.420078915248526
],
"scale": 5.690047523897615,
"linearVelocity": [
6.065184245710226,
28.21640205005727,
-3.042697463841066
],
"angularVelocity": [
0.5323319786110039,
0.8524845445090516,
0.10932007875597138
]
},
{
"id": "asteroid-14",
"position": [
24.94305070017472,
-43.22339758140768,
151.6095306638
],
"scale": 6.439033819547129,
"linearVelocity": [
-4.14729642136399,
7.353051586775,
-25.208210155394
],
"angularVelocity": [
0.948963427047024,
0.8769281695424223,
0.7749395170021645
]
},
{
"id": "asteroid-15",
"position": [
-61.34653750296117,
57.83255237146782,
58.733804843372
],
"scale": 7.411803898691092,
"linearVelocity": [
22.97698052737865,
-21.286294260656696,
-21.998397059000684
],
"angularVelocity": [
0.6675307209862567,
0.7227585311395863,
0.4420673115212401
]
},
{
"id": "asteroid-16",
"position": [
-37.25553642113452,
-120.70527387944571,
-29.057404814029024
],
"scale": 3.957316655611956,
"linearVelocity": [
7.64786110383856,
24.983804278459164,
5.964938836033984
],
"angularVelocity": [
-0.04990733621183585,
0.3213807487954159,
-0.8249357279008502
]
},
{
"id": "asteroid-17",
"position": [
71.36053456154347,
8.83029677144011,
-108.83855840217205
],
"scale": 5.567689704136111,
"linearVelocity": [
-11.387757399705226,
-1.249563509420639,
17.368523182077134
],
"angularVelocity": [
-0.5490182185036208,
0.589669916681197,
-0.26754100712868967
]
},
{
"id": "asteroid-18",
"position": [
151.50847074392675,
-32.3088798925633,
-223.19448362007165
],
"scale": 6.147415631174571,
"linearVelocity": [
-21.168241669017547,
4.653801967823788,
31.18396446919878
],
"angularVelocity": [
0.2864696744974964,
-0.860383920390162,
0.6688593336459294
]
},
{
"id": "asteroid-19",
"position": [
88.38850855034818,
-32.730221403976486,
33.93741577999266
],
"scale": 2.1495196617499763,
"linearVelocity": [
-20.73873035762759,
7.914173211800297,
-7.9627875437569084
],
"angularVelocity": [
0.22754232478381997,
-0.9600606731676464,
0.6534324396607265
]
},
{
"id": "asteroid-20",
"position": [
56.37728488635036,
-29.080058276579333,
-77.87984657632342
],
"scale": 2.4777429301381644,
"linearVelocity": [
-16.094136490163834,
8.587014513225695,
22.232515864484874
],
"angularVelocity": [
0.23648856922553918,
-0.24451219338047414,
-0.4916351438552491
]
},
{
"id": "asteroid-21",
"position": [
-83.83737035611433,
197.27711918145468,
-71.82003184115236
],
"scale": 5.306332890246562,
"linearVelocity": [
10.686368295690732,
-25.018551687400784,
9.154572811655648
],
"angularVelocity": [
-0.27317436709975684,
-0.9075865316791374,
-0.463661891894926
]
},
{
"id": "asteroid-22",
"position": [
-184.93009099932914,
-61.22619022984281,
-25.31363639383512
],
"scale": 3.82591176887556,
"linearVelocity": [
22.593389394352748,
7.602335232696162,
3.0926326859107585
],
"angularVelocity": [
-0.13800594943626754,
0.9820620198254972,
0.1337952639500295
]
},
{
"id": "asteroid-23",
"position": [
-18.61656598851856,
-84.19062453265941,
-58.98293196690726
],
"scale": 7.723567853426068,
"linearVelocity": [
6.8848169020073025,
31.505372797364377,
21.813189778724862
],
"angularVelocity": [
0.2806886814321876,
-0.4707224077534278,
-0.44679626206260403
]
},
{
"id": "asteroid-24",
"position": [
9.982756900828752,
25.34550777883981,
174.81546294680126
],
"scale": 2.455463837118164,
"linearVelocity": [
-1.6261348854825026,
-3.9657461257691686,
-28.4764545148813
],
"angularVelocity": [
-0.9878231501802839,
0.8081769020759859,
0.24139320114361373
]
},
{
"id": "asteroid-25",
"position": [
85.97584014127001,
-18.36845444516715,
21.612173734719885
],
"scale": 5.200751604722696,
"linearVelocity": [
-22.65310271608842,
5.103242809576686,
-5.694422883522937
],
"angularVelocity": [
0.04200987896597841,
-0.8139341666224849,
-0.8442424523018222
]
},
{
"id": "asteroid-26",
"position": [
-18.147362404732576,
-33.93349782485802,
151.56104370220478
],
"scale": 4.243443960009571,
"linearVelocity": [
3.265456212855867,
6.285971755279474,
-27.272059748760906
],
"angularVelocity": [
-0.9702775053582617,
-0.0842554503357511,
-0.48239393091993543
]
},
{
"id": "asteroid-27",
"position": [
29.463279081142502,
48.53435203022517,
85.93203549166978
],
"scale": 3.9736714501265165,
"linearVelocity": [
-6.591719688806077,
-10.634699664940493,
-19.22528340072518
],
"angularVelocity": [
0.1477134041440542,
-0.23021176712254787,
-0.95912886657212
]
},
{
"id": "asteroid-28",
"position": [
94.67472208601781,
-51.36902431340063,
-53.53649012698429
],
"scale": 5.342814120388171,
"linearVelocity": [
-30.25486417960931,
16.735382823527623,
17.10846572090565
],
"angularVelocity": [
-0.3292193104731016,
0.2629761827218311,
-0.6373224611402581
]
},
{
"id": "asteroid-29",
"position": [
-77.35700658518722,
-60.2156008204566,
223.39272030439184
],
"scale": 7.113926085337681,
"linearVelocity": [
9.08840529211956,
7.192007744563502,
-26.24563269779095
],
"angularVelocity": [
0.976229994021721,
0.7425192253135258,
-0.05865398467785443
]
},
{
"id": "asteroid-30",
"position": [
-160.62129847807205,
24.303991026780103,
203.6372247402815
],
"scale": 3.994871375933545,
"linearVelocity": [
22.590016365454648,
-3.277507675902893,
-28.639839691787444
],
"angularVelocity": [
0.7986524886593211,
0.07017578002987568,
-0.0729810964221147
]
},
{
"id": "asteroid-31",
"position": [
-9.08559224648419,
181.30147536657145,
-65.27599666295716
],
"scale": 3.7137853466561155,
"linearVelocity": [
1.6203577064663106,
-32.15562367005,
11.641559666187014
],
"angularVelocity": [
-0.913824435854449,
0.7434377869132911,
-0.3756865004293357
]
},
{
"id": "asteroid-32",
"position": [
189.70316470878717,
-120.09762092122276,
-48.846624927282996
],
"scale": 7.290759721105586,
"linearVelocity": [
-17.654927556800274,
11.270079378733827,
4.545963299079479
],
"angularVelocity": [
0.6799807993971965,
-0.32327184736549164,
-0.6290207664318799
]
},
{
"id": "asteroid-33",
"position": [
112.00956904768304,
45.47325562421672,
-34.48590875224766
],
"scale": 4.539281693950024,
"linearVelocity": [
-31.818327298474443,
-12.633426014501019,
9.796340984020938
],
"angularVelocity": [
-0.2769563462314655,
0.8569603881562071,
0.7552183434271313
]
},
{
"id": "asteroid-34",
"position": [
-12.92900057099983,
-104.55940293102228,
193.01515476341243
],
"scale": 2.4522034888431365,
"linearVelocity": [
1.2259576345202725,
10.009385892437988,
-18.30214186014367
],
"angularVelocity": [
0.6319179106392157,
0.14889390927145296,
0.5096284177561161
]
},
{
"id": "asteroid-35",
"position": [
30.9222953424653,
-59.73614452377679,
-134.86589893545482
],
"scale": 7.648205531976861,
"linearVelocity": [
-5.166396423389132,
10.147597271253181,
22.532955273227252
],
"angularVelocity": [
-0.57447229513755,
0.6167301423531786,
0.7608483078864228
]
},
{
"id": "asteroid-36",
"position": [
21.299271624744744,
-3.076528760779656,
-187.03355737593918
],
"scale": 3.3849895586031855,
"linearVelocity": [
-2.3142869908978425,
0.4429380330608524,
20.3222596679603
],
"angularVelocity": [
0.4434594058024679,
0.47601891376021976,
-0.9614706032298672
]
},
{
"id": "asteroid-37",
"position": [
-52.06555713074758,
-88.13082194012654,
31.362300959863596
],
"scale": 2.9814249862342095,
"linearVelocity": [
13.065846441362154,
22.367370999941603,
-7.870366341424741
],
"angularVelocity": [
-0.606088525759358,
0.9760190676080001,
0.21614631003206553
]
},
{
"id": "asteroid-38",
"position": [
111.74847001971337,
-46.593396030727135,
10.30299345327331
],
"scale": 3.598715227421736,
"linearVelocity": [
-34.39046566898009,
14.646813974062974,
-3.170734620169892
],
"angularVelocity": [
0.7823563333916792,
-0.09667218106455566,
-0.9863725693621945
]
},
{
"id": "asteroid-39",
"position": [
41.12549753059419,
-110.62600144734095,
105.70294096797092
],
"scale": 7.5286295816877296,
"linearVelocity": [
-6.739925253367709,
18.294025635257128,
-17.32331434179661
],
"angularVelocity": [
0.5358451540291913,
-0.7670842268163174,
0.25075136997588343
]
},
{
"id": "asteroid-40",
"position": [
-7.827104533179446,
-87.80034531298853,
118.49863381522742
],
"scale": 4.367977717291674,
"linearVelocity": [
1.1285331197920545,
12.80347417232854,
-17.085453802706855
],
"angularVelocity": [
0.671389974972818,
-0.8615181772964595,
0.9359448435887807
]
},
{
"id": "asteroid-41",
"position": [
-46.80007443244874,
57.97210772086458,
-68.82780636383549
],
"scale": 2.6345865049108226,
"linearVelocity": [
9.802870739378262,
-11.933532467853123,
14.416859315758417
],
"angularVelocity": [
0.11529862932130674,
0.6289048901581462,
0.9755210004518591
]
},
{
"id": "asteroid-42",
"position": [
-8.773048719467749,
137.24607560181138,
29.92007746932852
],
"scale": 7.585496577115003,
"linearVelocity": [
1.8364536523717736,
-28.52025688687242,
-6.263140363721625
],
"angularVelocity": [
0.2568883436338276,
-0.027537736570946603,
-0.9997001024251122
]
},
{
"id": "asteroid-43",
"position": [
-208.06420264890895,
168.58332269368364,
49.3390009623257
],
"scale": 3.3155579748642157,
"linearVelocity": [
16.422079076340587,
-13.227006578327453,
-3.8942257487617167
],
"angularVelocity": [
-0.4077385864933505,
0.10523125455460924,
0.0787742851613662
]
},
{
"id": "asteroid-44",
"position": [
163.5341103753907,
-93.24071573475678,
-66.1228090099442
],
"scale": 7.530524133877911,
"linearVelocity": [
-22.923549091767324,
13.21028174874324,
9.268827493821192
],
"angularVelocity": [
-0.2853973502864995,
-0.38391699859347783,
-0.34145325244527625
]
},
{
"id": "asteroid-45",
"position": [
58.44320381412548,
-6.663309996939115,
-139.77007327892716
],
"scale": 7.917462811120764,
"linearVelocity": [
-13.35627744708985,
1.7513292872804096,
31.942257708025082
],
"angularVelocity": [
-0.3035227337109796,
0.8110502901756704,
0.5622879202093074
]
},
{
"id": "asteroid-46",
"position": [
-84.86130981337153,
125.7707536063935,
58.50666852856773
],
"scale": 7.254098545673697,
"linearVelocity": [
14.05511634361984,
-20.665100056500204,
-9.690140711415802
],
"angularVelocity": [
0.5789240503925863,
0.17764258688605983,
-0.5170086906715832
]
},
{
"id": "asteroid-47",
"position": [
109.12027526940211,
-16.2972369891638,
246.64273224066662
],
"scale": 4.76488074279656,
"linearVelocity": [
-14.89890865321594,
2.3617054962364326,
-33.67575391980061
],
"angularVelocity": [
0.8551827640601197,
-0.11165941443379568,
-0.2282173651835886
]
},
{
"id": "asteroid-48",
"position": [
-161.30786116434385,
-67.30060287410612,
77.8187790616285
],
"scale": 6.009585306352164,
"linearVelocity": [
22.19472054425371,
9.39763742977407,
-10.707265237421959
],
"angularVelocity": [
0.8522694373709983,
-0.8360825443501181,
0.9106879359934164
]
},
{
"id": "asteroid-49",
"position": [
114.48412297912911,
-8.05214097126244,
5.591726826980028
],
"scale": 5.07128964153552,
"linearVelocity": [
-36.747157200067484,
2.9055596410411777,
-1.7948345970063413
],
"angularVelocity": [
-0.14332341199825072,
0.572781384427409,
0.6469944623807775
]
}
],
"difficultyConfig": {
"rockCount": 50,
"forceMultiplier": 1.3,
"rockSizeMin": 2,
"rockSizeMax": 8,
"distanceMin": 90,
"distanceMax": 280
}
}