dsh-math-calculator 2.0.0 → 2.1.1

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +52 -10
  3. package/dsh.plugin.json +15 -8
  4. package/lib/awareness.js +16 -13
  5. package/lib/body-catalog.js +488 -0
  6. package/lib/body-scaling.js +288 -0
  7. package/lib/body-taxonomy.js +719 -0
  8. package/lib/detector.js +361 -16
  9. package/lib/empirical-decomposition.js +321 -0
  10. package/lib/format.js +113 -5
  11. package/lib/formula-library-generic.js +226 -0
  12. package/lib/formulas.js +71 -13
  13. package/lib/index.js +623 -77
  14. package/lib/ops/bodies-op.js +368 -0
  15. package/lib/ops/shared.js +64 -4
  16. package/lib/ops/workspace-op.js +19 -1
  17. package/lib/ops/world-op.js +22 -0
  18. package/lib/playbook.js +6 -1
  19. package/lib/precision-report.js +80 -0
  20. package/lib/result-cache.js +144 -0
  21. package/lib/types/awareness.d.ts +10 -4
  22. package/lib/types/body-catalog.d.ts +156 -0
  23. package/lib/types/body-scaling.d.ts +123 -0
  24. package/lib/types/body-taxonomy.d.ts +95 -0
  25. package/lib/types/detector.d.ts +18 -0
  26. package/lib/types/empirical-decomposition.d.ts +107 -0
  27. package/lib/types/format.d.ts +33 -4
  28. package/lib/types/formula-library-generic.d.ts +37 -0
  29. package/lib/types/formulas.d.ts +35 -7
  30. package/lib/types/index.d.ts +16 -0
  31. package/lib/types/ops/bodies-op.d.ts +35 -0
  32. package/lib/types/ops/shared.d.ts +94 -3
  33. package/lib/types/precision-report.d.ts +59 -0
  34. package/lib/types/result-cache.d.ts +78 -0
  35. package/lib/types/workspace.d.ts +24 -0
  36. package/lib/types/world.d.ts +8 -0
  37. package/lib/workspace.js +22 -0
  38. package/lib/world.js +38 -3
  39. package/package.json +1 -1
  40. package/src/awareness.ts +16 -13
  41. package/src/body-catalog.ts +619 -0
  42. package/src/body-scaling.ts +357 -0
  43. package/src/body-taxonomy.ts +806 -0
  44. package/src/detector.ts +403 -15
  45. package/src/empirical-decomposition.ts +411 -0
  46. package/src/format.ts +123 -5
  47. package/src/formula-library-generic.ts +242 -0
  48. package/src/formulas.ts +79 -13
  49. package/src/index.ts +652 -64
  50. package/src/ops/bodies-op.ts +415 -0
  51. package/src/ops/shared.ts +141 -4
  52. package/src/ops/workspace-op.ts +21 -1
  53. package/src/ops/world-op.ts +22 -0
  54. package/src/playbook.ts +6 -1
  55. package/src/precision-report.ts +87 -0
  56. package/src/result-cache.ts +157 -0
  57. package/src/workspace.ts +34 -0
  58. package/src/world.ts +51 -4
@@ -0,0 +1,719 @@
1
+ /**
2
+ * 天体类型学:从已观测到纯理论预言,按「科幻创作会遇到什么」来分类。
3
+ *
4
+ * ## 为什么不能只收太阳系
5
+ *
6
+ * 太阳系只有 8 颗行星、1 颗恒星,而科幻创作要的是「一整个宇宙的可能性空间」:
7
+ * 流浪行星、热木星、超级地球、中子星、黑洞、白矮星、褐矮星、戴森球……
8
+ * 这些在太阳系里一个都没有,但作者天天要用。
9
+ *
10
+ * ## 三类条目,可信度天差地别
11
+ *
12
+ * | 类别 | 例 | 依据 | 本文件怎么处理 |
13
+ * |---|---|---|---|
14
+ * | **已观测** | 热木星、超级地球、潮汐锁定行星 | 凌星/径向速度/直接成像 | 给观测值或严格推算 |
15
+ * | **理论预言** | 中子星、黑洞、白矮星、褐星 | 广义相对论/恒星演化模型 | 给理论值 + 标注「未直接观测」 |
16
+ * | **纯思辨** | 戴森球、伯纳德星、质量 1e15 kg 的「行星」 | 没有观测也没有严格理论 | 给量纲约束 + 明确标「思辨」 |
17
+ *
18
+ * ⚠️ 最容易误导作者的做法:把三类混在一起给数字,不标注来源。
19
+ * 于是「中子星表面重力 1e11 g」和「戴森球厚 1 公里」看起来一样权威——
20
+ * 前者是物理必然,后者只是某人拍脑袋。所以每条都必须带 `evidence`。
21
+ *
22
+ * ## 「预言的一个一个加」怎么理解
23
+ *
24
+ * 这里的「预言」指**理论预言**(theoretical prediction),不是占星术。
25
+ * 每类都写清:哪些参数由物理锁死(改不了)、哪些由形成历史决定(可以编)。
26
+ *
27
+ * @module dsh-math-calculator/body-taxonomy
28
+ */
29
+ /**
30
+ * 天体类型总表。
31
+ *
32
+ * 按「创作时先想到什么」排序:恒星残骸最震撼,人工结构最极端,纯思辨放最后。
33
+ */
34
+ export const BODY_TYPES = [
35
+ // ══════════════════════════════════════════════════════════════
36
+ // 一、恒星残骸(科幻里最常用、物理最锁死的一批)
37
+ // ══════════════════════════════════════════════════════════════
38
+ {
39
+ id: 'white-dwarf',
40
+ name: '白矮星',
41
+ nameEn: 'White dwarf',
42
+ family: 'stellar-remnant',
43
+ evidence: 'observed',
44
+ basis: '已观测上千颗(如天狼星 B)。电子简并压支撑,钱德拉塞卡极限 1.44 M☉。',
45
+ perception: '一颗地球大小、却有一个太阳质量的死星。表面重力是地球的十万倍,温度先高后冷。',
46
+ massKg: 1.0 * 1.989e30,
47
+ radiusKm: 6300,
48
+ gravityG: 1.0e5,
49
+ tempK: 10000,
50
+ // 1 M☉ / 6300 km → 1.9e9 kg/m³(一立方米近两千吨)
51
+ densityKgM3: 1.9e9,
52
+ lockedBy: '电子简并压:质量超过 1.44 M☉ 就撑不住(会坍缩成中子星)。半径与质量反相关:质量越大反而越小。',
53
+ freeToAuthor: '温度(刚形成时 10 万 K,冷却到几千 K 要几十亿年)、磁场、是否有伴星、表面成分(氢/氦/碳/氧)。',
54
+ pitfall: '常见错误是给白矮星「正常大小」——它的半径只有地球量级(约 6000 km),不是木星量级。',
55
+ narrativeUse: '「死去的太阳」视觉符号;双星系统中的强紫外伴星;未来文明的遗迹。',
56
+ constantDependence: 'first-principles',
57
+ },
58
+ {
59
+ id: 'neutron-star',
60
+ name: '中子星',
61
+ nameEn: 'Neutron star',
62
+ family: 'stellar-remnant',
63
+ evidence: 'observed',
64
+ basis: '已观测(脉冲星)。中子简并压支撑,半径几乎固定。',
65
+ perception: '直径只有 20 公里,却有一点四个太阳的质量。一茶匙物质重十亿吨。',
66
+ massKg: 1.4 * 1.989e30,
67
+ radiusKm: 11,
68
+ gravityG: 1.6e11,
69
+ tempK: 6e5,
70
+ densityKgM3: 5.0e17,
71
+ lockedBy: '中子简并压 + 引力平衡:半径被状态方程锁死在 10—13 km(质量 1.2—2 M☉ 范围)。' +
72
+ '逃逸速度约 0.4c —— 理论上接近光速。自转可以到每秒 700 转(毫秒脉冲星)。',
73
+ freeToAuthor: '磁场(可强可弱,磁星达 1e15 高斯)、自转周期、是否有伴星、是否在吸积。',
74
+ pitfall: '「中子星表面」是个危险说法——它的「表面」重力场强到原子核会被压成面条状(核意面)。' +
75
+ '任何「站在中子星上」的描写都需要先解决潮汐力把人撕碎的问题(潮汐力 ∝ 1/r³,在 11 km 尺度上是致命的)。',
76
+ narrativeUse: '极端计时基准(脉冲星 = 宇宙钟);引力波源;导航信标;「一茶匙十亿吨」的震撼感。',
77
+ constantDependence: 'first-principles',
78
+ },
79
+ {
80
+ id: 'black-hole-stellar',
81
+ name: '恒星级黑洞',
82
+ nameEn: 'Stellar-mass black hole',
83
+ family: 'stellar-remnant',
84
+ evidence: 'observed',
85
+ basis: '已观测(LIGO 引力波、X 射线双星)。史瓦西半径 r_s = 2GM/c²。',
86
+ perception: '一个「没有表面」的引力陷阱。10 太阳质量的黑洞事件视界只有 30 公里。',
87
+ massKg: 10 * 1.989e30,
88
+ radiusKm: 29.5,
89
+ tempK: 6e-9,
90
+ lockedBy: '事件视界由质量唯一决定:r_s = 2GM/c² ≈ 2.95 km × (M/M☉)。' +
91
+ '除质量、自转、电荷外**没有任何其他可区分性质**(无毛定理)。',
92
+ freeToAuthor: '自转(Kerr 参数,影响能层与喷流)、是否吸积(决定亮不亮)、吸积盘倾角、伴星。',
93
+ pitfall: '「黑洞会把整个星系吸进去」是错的——在同样距离上,用 10 M☉ 黑洞替换太阳,' +
94
+ '行星轨道完全不变(引力只取决于质量,不是「黑洞」这个身份)。' +
95
+ '真正的危险只在视界附近。',
96
+ narrativeUse: '不可逆的边界(叙事上的「越过就不能回头」);时间膨胀;引力透镜;信息悖论。',
97
+ constantDependence: 'first-principles',
98
+ },
99
+ {
100
+ id: 'black-hole-supermassive',
101
+ name: '超大质量黑洞',
102
+ nameEn: 'Supermassive black hole',
103
+ family: 'stellar-remnant',
104
+ evidence: 'observed',
105
+ basis: '已观测(银心 Sgr A* 约 4e6 M☉、M87* 约 6.5e9 M☉,均有直接成像)。',
106
+ perception: '星系中心的巨兽。质量是太阳的百万到百亿倍,事件视界可以比整个太阳系还大。',
107
+ massKg: 4e6 * 1.989e30,
108
+ radiusKm: 1.18e7,
109
+ tempK: 1e-14,
110
+ lockedBy: '同样遵守 r_s = 2GM/c²。4e6 M☉ 对应视界半径约 1.2e7 km(约 0.08 AU)。',
111
+ freeToAuthor: '自转、吸积率(决定类星体多亮)、是否有喷流、与宿主星系的关系。',
112
+ pitfall: '平均密度随质量增大而**降低**:超大质量黑洞的平均密度可以比水还低。' +
113
+ '「黑洞 = 极高密度」只在恒星级成立。',
114
+ narrativeUse: '星系级威胁;类星体的能量源;「银河中心有东西」的设定;时间尺度极大。',
115
+ constantDependence: 'first-principles',
116
+ },
117
+ {
118
+ id: 'brown-dwarf',
119
+ name: '褐矮星',
120
+ nameEn: 'Brown dwarf',
121
+ family: 'stellar-remnant',
122
+ evidence: 'observed',
123
+ basis: '已观测数百颗。质量 13—80 木星质量,不够点燃氢聚变,但能短暂烧氘。',
124
+ perception: '「失败的恒星」。像恒星一样形成,但太轻了,只能暗红地熬着。',
125
+ massKg: 50 * 1.898e27,
126
+ radiusKm: 70000,
127
+ gravityG: 150,
128
+ tempK: 1000,
129
+ densityKgM3: 8e3,
130
+ lockedBy: '质量上限约 80 M_J(再重就能点燃氢)。半径几乎与质量无关(简并态,都约木星大小)。',
131
+ freeToAuthor: '温度(13—80 M_J 对应 500—2800 K)、是否有行星、大气云层(可观测到 L/T/Y 光谱型)。',
132
+ pitfall: '褐矮星的半径与木星接近,但质量可以是木星的 50 倍——「看大小猜质量」会大错。',
133
+ narrativeUse: '「没当上太阳」的悲剧感;可作为流浪行星的暗弱光源;红外观测的挑战。',
134
+ constantDependence: 'first-principles',
135
+ },
136
+ // ══════════════════════════════════════════════════════════════
137
+ // 二、恒星类型(补齐主序之外的演化阶段)
138
+ // ══════════════════════════════════════════════════════════════
139
+ {
140
+ id: 'red-giant',
141
+ name: '红巨星',
142
+ nameEn: 'Red giant',
143
+ family: 'star',
144
+ evidence: 'observed',
145
+ basis: '已观测(如大角星、毕宿五)。主序星耗尽核心氢后膨胀。',
146
+ perception: '一颗膨胀了几十倍的垂死恒星。表面温度反而降低,但总亮度暴增。',
147
+ massKg: 1.1 * 1.989e30,
148
+ radiusKm: 1e8,
149
+ gravityG: 0.001,
150
+ tempK: 3500,
151
+ lockedBy: '半径膨胀是氢壳层燃烧的必然结果。太阳在约 50 亿年后进入此阶段,半径会到达地球轨道附近。',
152
+ freeToAuthor: '具体半径(10—200 R☉)、是否脉动(米拉变星)、是否已抛出行星状星云。',
153
+ pitfall: '红巨星的宜居带极远(几十 AU),但寿命只剩几亿年——不够演化出复杂生命。',
154
+ narrativeUse: '「太阳要死了」的末世设定;母星膨胀吞没内行星;文明的迁徙。',
155
+ constantDependence: 'scaled',
156
+ },
157
+ {
158
+ id: 'pulsar',
159
+ name: '脉冲星',
160
+ nameEn: 'Pulsar',
161
+ family: 'stellar-remnant',
162
+ evidence: 'observed',
163
+ basis: '已观测(1967 年首次发现)。快速自转的中子星,磁极扫过视线产生脉冲。',
164
+ perception: '宇宙里最准的钟。每秒可能脉冲几百次,精度堪比原子钟。',
165
+ massKg: 1.4 * 1.989e30,
166
+ radiusKm: 11,
167
+ gravityG: 1.6e11,
168
+ tempK: 1e6,
169
+ densityKgM3: 5e17,
170
+ lockedBy: '脉冲周期 = 自转周期,精度受自转减慢率限制。周期范围 1.4 ms — 8.5 s。',
171
+ freeToAuthor: '自转周期、磁场强度、是否在双星中、是否有伴星行星(已发现多例)。',
172
+ pitfall: '「脉冲星行星」是真实存在的(PSR B1257+12),但辐射环境极端,宜居性存疑。',
173
+ narrativeUse: '星际导航信标;精确计时;「宇宙灯塔」的意象。',
174
+ constantDependence: 'first-principles',
175
+ },
176
+ {
177
+ id: 'magnetar',
178
+ name: '磁星',
179
+ nameEn: 'Magnetar',
180
+ family: 'stellar-remnant',
181
+ evidence: 'observed',
182
+ basis: '已观测数十颗。磁场强度 1e14—1e15 高斯(地球磁场约 0.5 高斯)。',
183
+ perception: '磁场强到能在几百公里外抹掉你的银行卡、撕裂分子键。',
184
+ massKg: 1.4 * 1.989e30,
185
+ radiusKm: 11,
186
+ gravityG: 1.6e11,
187
+ tempK: 1e7,
188
+ densityKgM3: 5e17,
189
+ lockedBy: '磁场强度上限由能量平衡决定(约 1e15 高斯)。超过则星体被自身磁场撕裂。',
190
+ freeToAuthor: '磁场具体强度、是否处于活跃期(会爆发 X 射线/伽马射线)。',
191
+ pitfall: '在 1000 km 距离上,磁场的能量密度足以把水分子撕开——' +
192
+ '「磁星附近的行星」需要极强的设定辩护。',
193
+ narrativeUse: '极端环境;毁灭性爆发(2004 年那次磁星爆发影响了半个银河的无线电);「磁场风暴」的视觉效果。',
194
+ constantDependence: 'first-principles',
195
+ },
196
+ // ══════════════════════════════════════════════════════════════
197
+ // 三、行星类型(科幻最常见的舞台)
198
+ // ══════════════════════════════════════════════════════════════
199
+ {
200
+ id: 'hot-jupiter',
201
+ name: '热木星',
202
+ nameEn: 'Hot Jupiter',
203
+ family: 'planet',
204
+ evidence: 'observed',
205
+ basis: '已观测数百颗(如 51 Pegasi b,1995 年首个被发现)。离恒星极近的气态巨行星。',
206
+ perception: '一个被恒星烤到发胀的巨行星。轨道周期只有几天,大气在沸腾逃逸。',
207
+ massKg: 1.0 * 1.898e27,
208
+ radiusKm: 100000,
209
+ gravityG: 2.5,
210
+ tempK: 1500,
211
+ densityKgM3: 400,
212
+ lockedBy: '轨道周期 1—10 天;平衡温度 1000—3000 K。这么大的行星不可能在近轨道形成,必须是被迁移过来的。',
213
+ freeToAuthor: '是否有逆行星轨道(已观测到)、大气成分、是否有伴星、是否正在失大气。',
214
+ pitfall: '热木星没有「表面」,且被潮汐锁定——昼侧与夜侧温差可达 1000 K。',
215
+ narrativeUse: '「随时会蒸发」的世界;极端昼夜温差;被恒星锁定的一面永远面向火焰。',
216
+ constantDependence: 'calibrated',
217
+ },
218
+ {
219
+ id: 'rogue-planet',
220
+ name: '流浪行星',
221
+ nameEn: 'Rogue planet / Free-floating planet',
222
+ family: 'planet',
223
+ evidence: 'observed',
224
+ basis: '已观测数十颗(微引力透镜、直接成像)。不绕恒星的自由漂浮行星。',
225
+ perception: '一个没有太阳的世界。天永远是黑的,唯一的热来自行星内部。',
226
+ massKg: 1.0 * 5.972e24,
227
+ radiusKm: 6371,
228
+ gravityG: 1.0,
229
+ tempK: 50,
230
+ densityKgM3: 5500,
231
+ lockedBy: '没有恒星光,表面温度只取决于内部热与残存放射性。数亿年后降到与宇宙微波背景相当(约 3 K)。',
232
+ freeToAuthor: '内部热源(潮汐加热、放射性)、是否有卫星、是否有大气(氢气可保温)、是否有地下海洋。',
233
+ pitfall: '「流浪行星上能住人」需要强设定:地表温度接近 3 K,光合作用完全不可能。' +
234
+ '地下海洋(靠潮汐或放射热)是唯一现实路径。',
235
+ narrativeUse: '「没有太阳的世界」;黑暗中的文明;星际旅行的中转站;孤独感最强的舞台。',
236
+ constantDependence: 'first-principles',
237
+ },
238
+ {
239
+ id: 'tidally-locked-planet',
240
+ name: '潮汐锁定行星',
241
+ nameEn: 'Tidally locked planet',
242
+ family: 'planet',
243
+ evidence: 'observed',
244
+ basis: '理论必然(潮汐演化),已间接支持(如 TRAPPIST-1 系统)。',
245
+ perception: '一面永远白昼、一面永远黑夜。分界线上是永恒的黄昏。',
246
+ massKg: 1.0 * 5.972e24,
247
+ radiusKm: 6371,
248
+ gravityG: 1.0,
249
+ tempK: 280,
250
+ densityKgM3: 5500,
251
+ lockedBy: '潮汐锁定时间尺度 ∝ a⁶ —— 轨道越近锁定越快。红矮星宜居带内(a < 0.1 AU)' +
252
+ '的行星在几亿年内必然锁定。',
253
+ freeToAuthor: '昼夜侧温差(取决于大气环流与海洋热输送)、是否有多行星、是否有共振。',
254
+ pitfall: '「一面永昼一面永夜」不等于「昼侧烤焦、夜侧冰封」——厚大气可以把热输运过去。' +
255
+ '但这也意味着强风与永久性风暴。',
256
+ narrativeUse: '「黄昏带」文明;永昼与永夜的社会分化;气象极端。',
257
+ constantDependence: 'first-principles',
258
+ },
259
+ {
260
+ id: 'super-earth',
261
+ name: '超级地球',
262
+ nameEn: 'Super-Earth',
263
+ family: 'planet',
264
+ evidence: 'observed',
265
+ basis: '已观测数十颗(如 55 Cancri e、Kepler-20b)。质量 1—10 地球质量。',
266
+ perception: '一个比地球更大更重的岩石世界。重力 1.5—3 g,人类会被压得站不直。',
267
+ massKg: 5 * 5.972e24,
268
+ radiusKm: 12742,
269
+ gravityG: 1.7,
270
+ tempK: 280,
271
+ densityKgM3: 6000,
272
+ lockedBy: '重力 g ∝ M/R。质量 5 M⊕、半径 1.6 R⊕ 对应 2 g。',
273
+ freeToAuthor: '大气成分、是否有海洋、自转、磁场。',
274
+ pitfall: '超级地球的逃逸速度高(约 1.5—2 倍地球),会保留更厚的氢氦包层——' +
275
+ '「超级地球」很容易变成「迷你海王星」,不是理想宜居地。',
276
+ narrativeUse: '重力更大的世界;生物形态矮壮;航天更难(逃逸速度高)。',
277
+ constantDependence: 'first-principles',
278
+ },
279
+ {
280
+ id: 'ocean-planet',
281
+ name: '海洋行星',
282
+ nameEn: 'Ocean planet / Water world',
283
+ family: 'planet',
284
+ evidence: 'theoretical',
285
+ basis: '理论预言,尚未确认。整颗行星被全球性海洋覆盖,无陆地。',
286
+ perception: '一个没有陆地的世界。除了浮岛与冰盖,脚下永远是水。',
287
+ massKg: 3 * 5.972e24,
288
+ radiusKm: 15000,
289
+ gravityG: 1.2,
290
+ tempK: 300,
291
+ densityKgM3: 3000,
292
+ lockedBy: '水占比高 → 密度低(约 3000 kg/m³),重力低于同质量岩石行星。',
293
+ freeToAuthor: '水深(几十到几百公里)、是否有海底热泉、冰盖厚度、洋流。',
294
+ pitfall: '深海洋行星(水深 > 100 km)会在底部形成高压冰层(冰 VII),' +
295
+ '与岩石地幔隔绝——这会影响物质循环,进而影响生命。',
296
+ narrativeUse: '水世界文明(如你的 Pearl Moon、Chandria IV);无陆地社会的设定;航海社会。',
297
+ constantDependence: 'first-principles',
298
+ },
299
+ // ══════════════════════════════════════════════════════════════
300
+ // 四、天体力学/星系级结构(科幻里写「宏大」时绕不开)
301
+ // ══════════════════════════════════════════════════════════════
302
+ {
303
+ id: 'globular-cluster',
304
+ name: '球状星团',
305
+ nameEn: 'Globular cluster',
306
+ family: 'exotic',
307
+ evidence: 'observed',
308
+ basis: '已观测(银河系内约 150 个)。上万颗恒星紧密聚集,年龄极老。',
309
+ perception: '夜空里一万颗星的密集球团。中心区域的星间距只有几十个 AU。',
310
+ massKg: 1e54,
311
+ radiusKm: 1e14,
312
+ tempK: 0,
313
+ densityKgM3: 1e3,
314
+ lockedBy: '引力束缚系统,尺度 10—100 光年,恒星密度是太阳附近的 100—1000 倍。',
315
+ freeToAuthor: '天体数量、金属丰度(通常极低)、是否已耗尽星际气体、是否有中心黑洞。',
316
+ pitfall: '球状星团里没有行星——恒星密度太高,行星轨道会被扰动掉。',
317
+ narrativeUse: '「恒星的都市」;古老文明;密集星空的视觉奇观。',
318
+ constantDependence: 'first-principles',
319
+ },
320
+ {
321
+ id: 'dyson-sphere',
322
+ name: '戴森球',
323
+ nameEn: 'Dyson sphere',
324
+ family: 'artificial',
325
+ evidence: 'speculative',
326
+ basis: '纯理论构想(1960 年 Dyson 提出)。包围整颗恒星收集能源。',
327
+ perception: '一颗被包裹起来的恒星。你可能看不到它,只看到红外余热。',
328
+ massKg: 1e27,
329
+ radiusKm: 1.5e8,
330
+ tempK: 300,
331
+ lockedBy: '材料强度是致命瓶颈:在 1 AU 处,任何结构承受的离心/重力载荷远超已知材料极限。' +
332
+ '「刚性球壳」不可能——只能是无人居住的「戴森云」(大量独立轨道单元)。',
333
+ freeToAuthor: '云还是壳、收集效率、是否可居住、是否透明(可透光部分)、是否有内圈热管理。',
334
+ pitfall: '刚性戴森球在物理上会自毁(内部应力),真正可行的是戴森云(百万个独立环或卫星)。' +
335
+ '而且从外部观测时,它表现为「红外过剩的恒星」,不是「黑洞」。',
336
+ narrativeUse: 'II 型文明的标志;恒星光被遮住的星系;「红外观测发现异常」的侦探情节。',
337
+ constantDependence: 'contingent',
338
+ },
339
+ // ══════════════════════════════════════════════════════════════
340
+ // 五、纯思辨(科幻里最自由、也最需要标注「思辨」的一批)
341
+ // ══════════════════════════════════════════════════════════════
342
+ {
343
+ id: 'curtain-world',
344
+ name: '帘幕类天体',
345
+ nameEn: 'Curtain body / Strange matter star',
346
+ family: 'exotic',
347
+ evidence: 'speculative',
348
+ basis: '纯理论假设。奇异物质或奇异夸克星,只在极端假设下存在。',
349
+ perception: '一个可能连本身都不是常规物质的星体。',
350
+ freeToAuthor: '几乎一切——但正因为几乎一切都能编,更需要作者自己定规则并保持一致。',
351
+ pitfall: '「奇异物质能转化一切正常物质」这类设定一旦引入,就瓦解了整个世界的物理基础——要非常谨慎。',
352
+ narrativeUse: '宇宙级威胁;不可理解的物理;「碰到就同化」的恐怖感。',
353
+ constantDependence: 'contingent',
354
+ },
355
+ // ══════════════════════════════════════════════════════════════
356
+ // 六、更多恒星演化阶段(补齐「恒星一生」链条)
357
+ // ══════════════════════════════════════════════════════════════
358
+ {
359
+ id: 'main-sequence-star',
360
+ name: '主序星',
361
+ nameEn: 'Main-sequence star',
362
+ family: 'star',
363
+ evidence: 'observed',
364
+ basis: '我们的太阳就是。核心稳定氢聚变,占恒星一生 90% 时间。',
365
+ perception: '一颗稳定的普通恒星。亮度缓慢增长,可以安稳几十亿年。',
366
+ massKg: 1.989e30,
367
+ radiusKm: 695700,
368
+ gravityG: 274,
369
+ tempK: 5778,
370
+ densityKgM3: 1410,
371
+ lockedBy: '质光关系 L ∝ M^3.5—4(粗略)。质量决定光度、半径、寿命、有效温度——' +
372
+ '一旦质量定了,其余基本锁定。',
373
+ freeToAuthor: '具体质量(0.08—100 M☉)、金属丰度、自转、双星关系、演化年龄。',
374
+ pitfall: '「主序星」是演化的一个阶段,不是类型。太阳 50 亿年后就不在主序了。',
375
+ narrativeUse: '最常见、最适合「有人居住」的恒星;作者的世界几乎都绕主序星。',
376
+ constantDependence: 'scaled',
377
+ },
378
+ {
379
+ id: 'blue-supergiant',
380
+ name: '蓝超巨星',
381
+ nameEn: 'Blue supergiant',
382
+ family: 'star',
383
+ evidence: 'observed',
384
+ basis: '已观测(如参宿七、海山二)。质量 20—100 M☉,寿命只有几百万年。',
385
+ perception: '一颗亮到能照亮整个星系旋臂的年轻巨兽,寿命却短得来不及演化出文明。',
386
+ massKg: 30 * 1.989e30,
387
+ radiusKm: 3e7,
388
+ gravityG: 70,
389
+ tempK: 15000,
390
+ densityKgM3: 5e-3,
391
+ lockedBy: '寿命 ∝ M^-2.5:30 M☉ 只有约 600 万年。大质量星的「短暂」是物理决定的。',
392
+ freeToAuthor: '质量、是否脉动、是否在双星、是否即将超新星爆发。',
393
+ pitfall: '大质量星会吹出强星风,把周围行星大气剥离,宜居带也极远(几十到几百 AU)。' +
394
+ '「围绕蓝超巨星的行星」需要极强的设定辩护。',
395
+ narrativeUse: '壮丽但致命的恒星;「即将爆发」的倒计时;星际文明的避难所。',
396
+ constantDependence: 'scaled',
397
+ },
398
+ {
399
+ id: 'wolf-rayet',
400
+ name: '沃尔夫-拉叶星',
401
+ nameEn: 'Wolf-Rayet star',
402
+ family: 'star',
403
+ evidence: 'observed',
404
+ basis: '已观测(如天社一)。大质量恒星抛掉外层,核心暴露。',
405
+ perception: '一颗剥了皮的恒星。极亮、极热,星风猛烈,寿命只有几十万年。',
406
+ massKg: 20 * 1.989e30,
407
+ radiusKm: 5e6,
408
+ gravityG: 5000,
409
+ tempK: 80000,
410
+ densityKgM3: 1e-2,
411
+ lockedBy: '核心暴露 → 表面温度 5 万—20 万 K,紫外辐射极强。寿命以十万年计。',
412
+ freeToAuthor: '是否正走向超新星、是否有伴星、星风强度。',
413
+ pitfall: '紫外辐射强度是太阳的几千倍——附近任何行星的大气都会被电离剥离。',
414
+ narrativeUse: '「宇宙熔炉」;超新星前夜;极端辐射环境。',
415
+ constantDependence: 'scaled',
416
+ },
417
+ {
418
+ id: 'red-dwarf',
419
+ name: '红矮星',
420
+ nameEn: 'Red dwarf',
421
+ family: 'star',
422
+ evidence: 'observed',
423
+ basis: '银河系最常见的恒星(约占 75%)。质量 0.08—0.5 M☉。',
424
+ perception: '小而暗的红光。寿命几千亿年,但八卦的耀斑狂暴。',
425
+ massKg: 0.3 * 1.989e30,
426
+ radiusKm: 2.1e5,
427
+ gravityG: 380,
428
+ tempK: 3300,
429
+ densityKgM3: 2e4,
430
+ lockedBy: '寿命 ∝ M^-2.5:0.3 M☉ 可活约 2000 亿年。宜居带极近(0.1—0.3 AU)。',
431
+ freeToAuthor: '耀斑频率、是否为「安静型」、是否有行星系统。',
432
+ pitfall: '绝大多数红矮星有强烈耀斑(米拉变星之外),会剥离行星大气。' +
433
+ '但也有一些安静型(如比邻星相对温和),后者更适合生命。',
434
+ narrativeUse: '最可能的「有生命」恒星类型;长寿宇宙文明;暗弱的恒星环境。',
435
+ constantDependence: 'scaled',
436
+ },
437
+ // ══════════════════════════════════════════════════════════════
438
+ // 七、更多行星类型(科幻创作核心)
439
+ // ══════════════════════════════════════════════════════════════
440
+ {
441
+ id: 'gas-giant',
442
+ name: '气态巨行星',
443
+ nameEn: 'Gas giant',
444
+ family: 'planet',
445
+ evidence: 'observed',
446
+ basis: '已观测(木星、土星及数百颗系外)。主要由氢氦组成,无固体表面。',
447
+ perception: '一颗巨大的、没有地面的世界。猛烈的风暴带、永远的压力深渊。',
448
+ massKg: 1.898e27,
449
+ radiusKm: 7e4,
450
+ gravityG: 2.5,
451
+ tempK: 165,
452
+ densityKgM3: 1326,
453
+ lockedBy: '没有固体表面——『表面』只是 1 atm 等压面。半径与质量关系被简并态锁死。',
454
+ freeToAuthor: '大气成分、云层结构、是否有环、磁层、卫星系统。',
455
+ pitfall: '气态巨行星的半径与质量关系近似「质量越大越致密」——超过约 2 木星质量后' +
456
+ '半径不再增加(简并态)。「一百倍木星大小的气态巨行星」是不存在的。',
457
+ narrativeUse: '悬浮城市;风暴带中的世界;星际殖民的经典目标。',
458
+ constantDependence: 'first-principles',
459
+ },
460
+ {
461
+ id: 'ice-giant',
462
+ name: '冰巨星',
463
+ nameEn: 'Ice giant',
464
+ family: 'planet',
465
+ evidence: 'observed',
466
+ basis: '已观测(天王星、海王星)。主要由冰物质(水、氨、甲烷)组成。',
467
+ perception: '一颗蓝绿色的行星。没有明显的表面,大气平静却极度寒冷。',
468
+ massKg: 5e26,
469
+ radiusKm: 2.5e4,
470
+ gravityG: 1.1,
471
+ tempK: 60,
472
+ densityKgM3: 1300,
473
+ lockedBy: '密度与半径范围被形成条件锁定(10—20 地球质量是典型区间)。',
474
+ freeToAuthor: '轴倾角(天王星近 98°)、是否有环、内部热、大气颜色。',
475
+ pitfall: '冰巨星的「冰」不是水冰,而是超临界流体(水、氨、甲烷混合物)。' +
476
+ '天王星自转轴几乎躺着——这会让季节极端(每个极区连续 42 年白昼)。',
477
+ narrativeUse: '极端季节(轴倾角近 90°);蓝绿色世界的视觉特色;寒冷但可能宜居的卫星。',
478
+ constantDependence: 'first-principles',
479
+ },
480
+ {
481
+ id: 'super-jupiter',
482
+ name: '超级木星',
483
+ nameEn: 'Super-Jupiter',
484
+ family: 'planet',
485
+ evidence: 'observed',
486
+ basis: '已观测多颗(质量 2—13 木星质量)。',
487
+ perception: '一个「超大的木星」。可能接近褐矮星,能短暂烧氘。',
488
+ massKg: 5 * 1.898e27,
489
+ radiusKm: 8e4,
490
+ gravityG: 12,
491
+ tempK: 1000,
492
+ densityKgM3: 1200,
493
+ lockedBy: '质量界限:超过 13 M_J 开始烧氘(成为褐矮星),超过 80 M_J 点燃氢。',
494
+ freeToAuthor: '轨道、是否有环、温度、是否有超强磁场(可达地球的百倍)。',
495
+ pitfall: '超级木星的磁场可以极强(某些观测到数千倍地球磁场),强烈的辐射带会摧毁卫星上的电子设备。',
496
+ narrativeUse: '巨型气态行星;极端风暴;辐射带的死亡地带。',
497
+ constantDependence: 'first-principles',
498
+ },
499
+ {
500
+ id: 'icy-moon',
501
+ name: '冰卫(冰质卫星)',
502
+ nameEn: 'Icy moon',
503
+ family: 'planet',
504
+ evidence: 'observed',
505
+ basis: '已观测(木卫二、土卫二、土卫六)。冰壳下有液态海洋。',
506
+ perception: '一个冰封的卫星。表面零下上百度,冰层下却有全球性海洋。',
507
+ massKg: 4.8e22,
508
+ radiusKm: 1600,
509
+ gravityG: 0.13,
510
+ tempK: 100,
511
+ densityKgM3: 1900,
512
+ lockedBy: '温度由日照与潮汐加热决定。冰壳厚度可在几十到几百公里。',
513
+ freeToAuthor: '海洋深度、是否有热泉、冰壳裂缝、是否有大气、潮汐加热强度。',
514
+ pitfall: '「冰下海洋」是生命的主要候选,但陆上生命所需的阳光不可达——' +
515
+ '需要化学能(海底热泉)支撑,这会引起完全不同类型的生态系统。',
516
+ narrativeUse: '地外生命候选;深海文明;冰上世界(如你的 Landunder)。',
517
+ constantDependence: 'calibrated',
518
+ },
519
+ {
520
+ id: 'chthonian-planet',
521
+ name: '地狱行星',
522
+ nameEn: 'Chthonian planet / Lava planet',
523
+ family: 'planet',
524
+ evidence: 'theoretical',
525
+ basis: '理论预言,可能已间接观测。大气被恒星剥离,只剩岩石核心。',
526
+ perception: '一颗被恒星烤干的行星。昼侧是熔岩海,夜侧可能冻结岩石。',
527
+ massKg: 3 * 5.972e24,
528
+ radiusKm: 12000,
529
+ gravityG: 1.3,
530
+ tempK: 2000,
531
+ densityKgM3: 8000,
532
+ lockedBy: '高温 + 无大气 → 表面温度由辐照与热辐射平衡决定(可达 2000—3000 K)。',
533
+ freeToAuthor: '轨道、是否仍有残余大气、是否有金属蒸汽、冷却速率。',
534
+ pitfall: '熔岩行星的「岩石蒸汽大气」会产生复杂大气(硅酸盐云),' +
535
+ '不是「真空」——写这类世界时大气科学是关键。',
536
+ narrativeUse: '地狱景观;「被烤干的同胞」;恒星活动的破坏力。',
537
+ constantDependence: 'calibrated',
538
+ },
539
+ // ══════════════════════════════════════════════════════════════
540
+ // 八、小天体(写「毁灭」与「资源」时用)
541
+ // ══════════════════════════════════════════════════════════════
542
+ {
543
+ id: 'asteroid-belt',
544
+ name: '小行星带',
545
+ nameEn: 'Asteroid belt',
546
+ family: 'small-body',
547
+ evidence: 'observed',
548
+ basis: '已观测(太阳系小行星带,约 1 亿颗 > 1 km)。',
549
+ perception: '无数碎石组成的海洋。看似密集,实际间距是几百万公里。',
550
+ massKg: 2.4e21,
551
+ radiusKm: 4e8,
552
+ tempK: 170,
553
+ lockedBy: '总质量只有月球的约 3%。之间距极大——「穿越小行星带」不会撞得像电影里那样。',
554
+ freeToAuthor: '形成历史、是否有开采价值、是否有大天体藏在其中。',
555
+ pitfall: '小行星带极其空旷:探测器穿越几乎不会撞上东西。' +
556
+ '「密集的碎石带」是电影错觉。',
557
+ narrativeUse: '资源开采;海盗藏身处;撞击威胁(需要特别大的个体)。',
558
+ constantDependence: 'first-principles',
559
+ },
560
+ {
561
+ id: 'comet',
562
+ name: '彗星',
563
+ nameEn: 'Comet',
564
+ family: 'small-body',
565
+ evidence: 'observed',
566
+ basis: '已观测(如哈雷彗星)。冰与尘埃的混合体,近太阳时升华出彗尾。',
567
+ perception: '一颗拖着长长光尾的雪球。未靠近太阳时只是一个暗弱的小点。',
568
+ massKg: 1e15,
569
+ radiusKm: 10,
570
+ tempK: 200,
571
+ lockedBy: '彗尾只在近太阳时出现(升华温度约 150—200 K);' +
572
+ '彗核很小(几公里到几十公里),但彗尾可以长到 1 AU。',
573
+ freeToAuthor: '轨道、成分(冰与有机物)、是否有生命前体分子。',
574
+ pitfall: '彗尾与彗核完全不是一回事——彗尾非常稀薄(比实验室真空还稀),' +
575
+ '「彗尾吞噬行星」是错的。彗星真正的威胁是彗核撞击。',
576
+ narrativeUse: '预兆与灾变(历史原型:十字军时代的彗星);「生命的种子」(彗星带来有机物);太空探险目标。',
577
+ constantDependence: 'calibrated',
578
+ },
579
+ {
580
+ id: 'kuiper-belt',
581
+ name: '柯伊伯带',
582
+ nameEn: 'Kuiper belt',
583
+ family: 'small-body',
584
+ evidence: 'observed',
585
+ basis: '已观测(冥王星、妊神星等)。海王星轨道外的冰质天体带。',
586
+ perception: '太阳系边缘的黑暗冰坟场。天体极小,温度 40 K 上下。',
587
+ massKg: 1e23,
588
+ radiusKm: 1e10,
589
+ tempK: 45,
590
+ lockedBy: '温度接近 40 K(很冷但比真空高几十倍),驱动挥发物(甲烷、氨)冻结。',
591
+ freeToAuthor: '天体数量、是否有大天体、是否有星际天体经过。',
592
+ pitfall: '天体密度极低(「带」其实非常空旷),「密集的冰质地带」是错觉。',
593
+ narrativeUse: '文明的边缘;被困的星际探测器;对「太阳系全景」的兴趣。',
594
+ constantDependence: 'first-principles',
595
+ },
596
+ {
597
+ id: 'oort-cloud',
598
+ name: '奥尔特云',
599
+ nameEn: 'Oort cloud',
600
+ family: 'small-body',
601
+ evidence: 'theoretical',
602
+ basis: '理论预言(长周期彗星的来源,尚未直接观测)。包围太阳系的冰质球壳。',
603
+ perception: '太阳系最外面的边界。数千亿颗冰质天体,延伸到数万 AU。',
604
+ massKg: 1.9e22,
605
+ radiusKm: 1e13,
606
+ tempK: 5,
607
+ lockedBy: '只有约 5 K(宇宙微波背景加一点),天体间距上亿公里。',
608
+ freeToAuthor: '天体总数、是否有大天体、是否受临近恒星扰动。',
609
+ pitfall: '奥尔特云的存在是间接推断的(长周期彗星来源),没有被直接观测。',
610
+ narrativeUse: '「太阳系的尽头」;长周期彗星(如 NEOWISE)的家;文明的孤岛。',
611
+ constantDependence: 'first-principles',
612
+ },
613
+ // ══════════════════════════════════════════════════════════════
614
+ // 九、星系级结构(写「宏大」时绕不开)
615
+ // ══════════════════════════════════════════════════════════════
616
+ {
617
+ id: 'spiral-galaxy',
618
+ name: '旋涡星系',
619
+ nameEn: 'Spiral galaxy',
620
+ family: 'exotic',
621
+ evidence: 'observed',
622
+ basis: '已观测(银河系、仙女座)。有旋臂的盘状星系,中心常有超大质量黑洞。',
623
+ perception: '一个扁平旋转的盘的星海。旋臂里堆着年轻的亮星与气体。',
624
+ massKg: 1.5e42,
625
+ radiusKm: 5e17,
626
+ tempK: 0,
627
+ densityKgM3: 1e-22,
628
+ lockedBy: '直径约 10 万光年。旋转周期 2—3 亿年(太阳绕银心一次)。',
629
+ freeToAuthor: '旋臂数量、中心黑洞质量、是否有棒、伴星系、星系际关系。',
630
+ pitfall: '星系不是「均匀的星海」——恒星集中在盘与旋臂,星系际空间极空。' +
631
+ '太阳系在猎户臂的稀薄区域。',
632
+ narrativeUse: '「星系文明」;星图尺度;旋臂间的旅行。',
633
+ constantDependence: 'first-principles',
634
+ },
635
+ {
636
+ id: 'open-cluster',
637
+ name: '疏散星团',
638
+ nameEn: 'Open cluster',
639
+ family: 'exotic',
640
+ evidence: 'observed',
641
+ basis: '已观测(昂星团、毕星团)。上百到上万颗年轻恒星松散聚集。',
642
+ perception: '夜空中的一团亮点(如昂星团)。恒星年轻、松散、终会散开。',
643
+ massKg: 1e34,
644
+ radiusKm: 1e14,
645
+ tempK: 0,
646
+ densityKgM3: 1e-20,
647
+ lockedBy: '寿命只有几亿年(潮汐力与内引力会把它拆散)。',
648
+ freeToAuthor: '恒星数量、年龄、是否有行星、是否将形成双星。',
649
+ pitfall: '疏散星团会散开,所以它不是「永久结构」——写「星团文明」有寿命上限。',
650
+ narrativeUse: '年轻的星空场景;「星光灿烂的夜晚」;常见的科幻星图。',
651
+ constantDependence: 'first-principles',
652
+ },
653
+ {
654
+ id: 'planetary-nebula',
655
+ name: '行星状星云',
656
+ nameEn: 'Planetary nebula',
657
+ family: 'star',
658
+ evidence: 'observed',
659
+ basis: '已观测(如环状星云)。小质量恒星临终时抛出的发光气体壳。',
660
+ perception: '一颗恒星死后留下的彩色光壳。中心有一颗白矮星。',
661
+ massKg: 1e30,
662
+ radiusKm: 1e13,
663
+ tempK: 10000,
664
+ densityKgM3: 1e-12,
665
+ lockedBy: '只持续几万年就消散。颜色取决于气体成分(O 绿、N 红)。',
666
+ freeToAuthor: '形状(多为环、蝶形)、中心星温度、是否有伴星、是否为对称。',
667
+ pitfall: '「行星状」是历史误称——它与行星无关,只是早期望远镜看像行星圆盘。',
668
+ narrativeUse: '壮丽的「恒星遗容」;「暮年恒星」叙事;色彩缤纷的天文背景。',
669
+ constantDependence: 'scaled',
670
+ },
671
+ ];
672
+ /** 按族分组。 */
673
+ export function typesByFamily(family) {
674
+ return BODY_TYPES.filter(function (type) { return type.family === family; });
675
+ }
676
+ /** 按证据等级分组。 */
677
+ export function typesByEvidence(evidence) {
678
+ return BODY_TYPES.filter(function (type) { return type.evidence === evidence; });
679
+ }
680
+ /** 族的显示顺序。 */
681
+ export const FAMILY_ORDER = [
682
+ 'stellar-remnant',
683
+ 'star',
684
+ 'planet',
685
+ 'small-body',
686
+ 'exotic',
687
+ 'artificial',
688
+ ];
689
+ /** 族的中文名。 */
690
+ export const FAMILY_LABEL = {
691
+ 'stellar-remnant': '恒星残骸',
692
+ star: '恒星',
693
+ planet: '行星',
694
+ 'small-body': '小天体',
695
+ exotic: '宏大结构 / 理论天体',
696
+ artificial: '人工结构',
697
+ };
698
+ /** 证据等级的中文名与说明。 */
699
+ export const EVIDENCE_LABEL = {
700
+ observed: '已观测(有观测证据)',
701
+ theoretical: '理论预言(物理必然但未直接观测)',
702
+ speculative: '纯思辨(既无观测也无严格理论)',
703
+ };
704
+ /**
705
+ * 按名字或名字片段查类型。
706
+ *
707
+ * @param query - 中文名/英文名/id 片段
708
+ * @returns 匹配的类型;没有返回 undefined
709
+ */
710
+ export function findBodyType(query) {
711
+ const text = query.trim().toLowerCase();
712
+ if (text === '')
713
+ return undefined;
714
+ return BODY_TYPES.find(function (type) {
715
+ return type.id.toLowerCase() === text ||
716
+ type.name.includes(query) ||
717
+ type.nameEn.toLowerCase().includes(text);
718
+ });
719
+ }