@johnmorrisdotca/uchusen-rockets 0.2.2 → 0.4.0

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 (906) hide show
  1. package/CHANGELOG.md +55 -5
  2. package/LICENSES/ODbL-1.0.txt +540 -0
  3. package/NOTICE.md +56 -6
  4. package/README.md +288 -16
  5. package/dist/assets/apollo-soyuz-apollo-soyuz-apart.painted.svg +1 -0
  6. package/dist/assets/apollo-soyuz-apollo-soyuz-apart.svg +1 -0
  7. package/dist/assets/apollo-soyuz-apollo-soyuz-apart.thick.svg +1 -0
  8. package/dist/assets/apollo-soyuz-apollo-soyuz-csm.glb +0 -0
  9. package/dist/assets/apollo-soyuz-apollo-soyuz-csm.painted.svg +1 -0
  10. package/dist/assets/apollo-soyuz-apollo-soyuz-csm.svg +1 -0
  11. package/dist/assets/apollo-soyuz-apollo-soyuz-csm.thick.svg +1 -0
  12. package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.glb +0 -0
  13. package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.painted.svg +1 -0
  14. package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.svg +1 -0
  15. package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.thick.svg +1 -0
  16. package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.glb +0 -0
  17. package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.painted.svg +1 -0
  18. package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.svg +1 -0
  19. package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.thick.svg +1 -0
  20. package/dist/assets/apollo-soyuz-apollo-soyuz.glb +0 -0
  21. package/dist/assets/apollo-soyuz-apollo-soyuz.painted.svg +1 -0
  22. package/dist/assets/apollo-soyuz-apollo-soyuz.svg +1 -0
  23. package/dist/assets/apollo-soyuz-apollo-soyuz.thick.svg +1 -0
  24. package/dist/assets/dragon-cargo-dragon-2-apart.painted.svg +1 -0
  25. package/dist/assets/dragon-cargo-dragon-2-apart.svg +1 -0
  26. package/dist/assets/dragon-cargo-dragon-2-apart.thick.svg +1 -0
  27. package/dist/assets/dragon-cargo-dragon-2-capsule.glb +0 -0
  28. package/dist/assets/dragon-cargo-dragon-2-capsule.painted.svg +1 -0
  29. package/dist/assets/dragon-cargo-dragon-2-capsule.svg +1 -0
  30. package/dist/assets/dragon-cargo-dragon-2-capsule.thick.svg +1 -0
  31. package/dist/assets/dragon-cargo-dragon-2-trunk.glb +0 -0
  32. package/dist/assets/dragon-cargo-dragon-2-trunk.painted.svg +1 -0
  33. package/dist/assets/dragon-cargo-dragon-2-trunk.svg +1 -0
  34. package/dist/assets/dragon-cargo-dragon-2-trunk.thick.svg +1 -0
  35. package/dist/assets/dragon-cargo-dragon-2.glb +0 -0
  36. package/dist/assets/dragon-cargo-dragon-2.painted.svg +1 -0
  37. package/dist/assets/dragon-cargo-dragon-2.svg +1 -0
  38. package/dist/assets/dragon-cargo-dragon-2.thick.svg +1 -0
  39. package/dist/assets/dragon-crew-dragon-inside.glb +0 -0
  40. package/dist/assets/dragon-crew-dragon-inside.painted.svg +1 -0
  41. package/dist/assets/dragon-crew-dragon-inside.svg +1 -0
  42. package/dist/assets/dragon-crew-dragon-inside.thick.svg +1 -0
  43. package/dist/assets/dragon-dragon-1-apart.painted.svg +1 -1
  44. package/dist/assets/dragon-dragon-1-apart.svg +1 -1
  45. package/dist/assets/dragon-dragon-1-apart.thick.svg +1 -1
  46. package/dist/assets/dragon-dragon-1-capsule.painted.svg +1 -1
  47. package/dist/assets/dragon-dragon-1-capsule.svg +1 -1
  48. package/dist/assets/dragon-dragon-1-capsule.thick.svg +1 -1
  49. package/dist/assets/dragon-dragon-1-trunk.painted.svg +1 -1
  50. package/dist/assets/dragon-dragon-1-trunk.svg +1 -1
  51. package/dist/assets/dragon-dragon-1-trunk.thick.svg +1 -1
  52. package/dist/assets/dragon-dragon-1.painted.svg +1 -1
  53. package/dist/assets/dragon-dragon-1.svg +1 -1
  54. package/dist/assets/dragon-dragon-1.thick.svg +1 -1
  55. package/dist/assets/dragon-dragon-2-apart.painted.svg +1 -1
  56. package/dist/assets/dragon-dragon-2-apart.svg +1 -1
  57. package/dist/assets/dragon-dragon-2-apart.thick.svg +1 -1
  58. package/dist/assets/dragon-dragon-2-capsule.painted.svg +1 -1
  59. package/dist/assets/dragon-dragon-2-capsule.svg +1 -1
  60. package/dist/assets/dragon-dragon-2-capsule.thick.svg +1 -1
  61. package/dist/assets/dragon-dragon-2-trunk.painted.svg +1 -1
  62. package/dist/assets/dragon-dragon-2-trunk.svg +1 -1
  63. package/dist/assets/dragon-dragon-2-trunk.thick.svg +1 -1
  64. package/dist/assets/dragon-dragon-2.painted.svg +1 -1
  65. package/dist/assets/dragon-dragon-2.svg +1 -1
  66. package/dist/assets/dragon-dragon-2.thick.svg +1 -1
  67. package/dist/assets/droneship-asog-apart.painted.svg +1 -0
  68. package/dist/assets/droneship-asog-apart.svg +1 -0
  69. package/dist/assets/droneship-asog-apart.thick.svg +1 -0
  70. package/dist/assets/droneship-asog-deck.glb +0 -0
  71. package/dist/assets/droneship-asog-deck.painted.svg +1 -0
  72. package/dist/assets/droneship-asog-deck.svg +1 -0
  73. package/dist/assets/droneship-asog-deck.thick.svg +1 -0
  74. package/dist/assets/droneship-asog-landed.glb +0 -0
  75. package/dist/assets/droneship-asog-landed.painted.svg +1 -0
  76. package/dist/assets/droneship-asog-landed.svg +1 -0
  77. package/dist/assets/droneship-asog-landed.thick.svg +1 -0
  78. package/dist/assets/droneship-asog.glb +0 -0
  79. package/dist/assets/droneship-asog.painted.svg +1 -0
  80. package/dist/assets/droneship-asog.svg +1 -0
  81. package/dist/assets/droneship-asog.thick.svg +1 -0
  82. package/dist/assets/droneship-jrti-apart.painted.svg +1 -0
  83. package/dist/assets/droneship-jrti-apart.svg +1 -0
  84. package/dist/assets/droneship-jrti-apart.thick.svg +1 -0
  85. package/dist/assets/droneship-jrti-deck.glb +0 -0
  86. package/dist/assets/droneship-jrti-deck.painted.svg +1 -0
  87. package/dist/assets/droneship-jrti-deck.svg +1 -0
  88. package/dist/assets/droneship-jrti-deck.thick.svg +1 -0
  89. package/dist/assets/droneship-jrti-landed.glb +0 -0
  90. package/dist/assets/droneship-jrti-landed.painted.svg +1 -0
  91. package/dist/assets/droneship-jrti-landed.svg +1 -0
  92. package/dist/assets/droneship-jrti-landed.thick.svg +1 -0
  93. package/dist/assets/droneship-jrti.glb +0 -0
  94. package/dist/assets/droneship-jrti.painted.svg +1 -0
  95. package/dist/assets/droneship-jrti.svg +1 -0
  96. package/dist/assets/droneship-jrti.thick.svg +1 -0
  97. package/dist/assets/droneship-ocisly-apart.painted.svg +1 -0
  98. package/dist/assets/droneship-ocisly-apart.svg +1 -0
  99. package/dist/assets/droneship-ocisly-apart.thick.svg +1 -0
  100. package/dist/assets/droneship-ocisly-deck.glb +0 -0
  101. package/dist/assets/droneship-ocisly-deck.painted.svg +1 -0
  102. package/dist/assets/droneship-ocisly-deck.svg +1 -0
  103. package/dist/assets/droneship-ocisly-deck.thick.svg +1 -0
  104. package/dist/assets/droneship-ocisly-landed.glb +0 -0
  105. package/dist/assets/droneship-ocisly-landed.painted.svg +1 -0
  106. package/dist/assets/droneship-ocisly-landed.svg +1 -0
  107. package/dist/assets/droneship-ocisly-landed.thick.svg +1 -0
  108. package/dist/assets/droneship-ocisly.glb +0 -0
  109. package/dist/assets/droneship-ocisly.painted.svg +1 -0
  110. package/dist/assets/droneship-ocisly.svg +1 -0
  111. package/dist/assets/droneship-ocisly.thick.svg +1 -0
  112. package/dist/assets/electron-electron-adapter.glb +0 -0
  113. package/dist/assets/electron-electron-adapter.painted.svg +1 -0
  114. package/dist/assets/electron-electron-adapter.svg +1 -0
  115. package/dist/assets/electron-electron-adapter.thick.svg +1 -0
  116. package/dist/assets/electron-electron-apart.painted.svg +1 -0
  117. package/dist/assets/electron-electron-apart.svg +1 -0
  118. package/dist/assets/electron-electron-apart.thick.svg +1 -0
  119. package/dist/assets/electron-electron-fairing.glb +0 -0
  120. package/dist/assets/electron-electron-fairing.painted.svg +1 -0
  121. package/dist/assets/electron-electron-fairing.svg +1 -0
  122. package/dist/assets/electron-electron-fairing.thick.svg +1 -0
  123. package/dist/assets/electron-electron-first-stage.glb +0 -0
  124. package/dist/assets/electron-electron-first-stage.painted.svg +1 -0
  125. package/dist/assets/electron-electron-first-stage.svg +1 -0
  126. package/dist/assets/electron-electron-first-stage.thick.svg +1 -0
  127. package/dist/assets/electron-electron-second-stage.glb +0 -0
  128. package/dist/assets/electron-electron-second-stage.painted.svg +1 -0
  129. package/dist/assets/electron-electron-second-stage.svg +1 -0
  130. package/dist/assets/electron-electron-second-stage.thick.svg +1 -0
  131. package/dist/assets/electron-electron.glb +0 -0
  132. package/dist/assets/electron-electron.painted.svg +1 -0
  133. package/dist/assets/electron-electron.svg +1 -0
  134. package/dist/assets/electron-electron.thick.svg +1 -0
  135. package/dist/assets/falcon-1-falcon-1-apart.painted.svg +1 -0
  136. package/dist/assets/falcon-1-falcon-1-apart.svg +1 -0
  137. package/dist/assets/falcon-1-falcon-1-apart.thick.svg +1 -0
  138. package/dist/assets/falcon-1-falcon-1-fairing.glb +0 -0
  139. package/dist/assets/falcon-1-falcon-1-fairing.painted.svg +1 -0
  140. package/dist/assets/falcon-1-falcon-1-fairing.svg +1 -0
  141. package/dist/assets/falcon-1-falcon-1-fairing.thick.svg +1 -0
  142. package/dist/assets/falcon-1-falcon-1-first-stage.glb +0 -0
  143. package/dist/assets/falcon-1-falcon-1-first-stage.painted.svg +1 -0
  144. package/dist/assets/falcon-1-falcon-1-first-stage.svg +1 -0
  145. package/dist/assets/falcon-1-falcon-1-first-stage.thick.svg +1 -0
  146. package/dist/assets/falcon-1-falcon-1-second-stage.glb +0 -0
  147. package/dist/assets/falcon-1-falcon-1-second-stage.painted.svg +1 -0
  148. package/dist/assets/falcon-1-falcon-1-second-stage.svg +1 -0
  149. package/dist/assets/falcon-1-falcon-1-second-stage.thick.svg +1 -0
  150. package/dist/assets/falcon-1-falcon-1.glb +0 -0
  151. package/dist/assets/falcon-1-falcon-1.painted.svg +1 -0
  152. package/dist/assets/falcon-1-falcon-1.svg +1 -0
  153. package/dist/assets/falcon-1-falcon-1.thick.svg +1 -0
  154. package/dist/assets/falcon-1-falcon-1e-apart.painted.svg +1 -0
  155. package/dist/assets/falcon-1-falcon-1e-apart.svg +1 -0
  156. package/dist/assets/falcon-1-falcon-1e-apart.thick.svg +1 -0
  157. package/dist/assets/falcon-1-falcon-1e-fairing.glb +0 -0
  158. package/dist/assets/falcon-1-falcon-1e-fairing.painted.svg +1 -0
  159. package/dist/assets/falcon-1-falcon-1e-fairing.svg +1 -0
  160. package/dist/assets/falcon-1-falcon-1e-fairing.thick.svg +1 -0
  161. package/dist/assets/falcon-1-falcon-1e-first-stage.glb +0 -0
  162. package/dist/assets/falcon-1-falcon-1e-first-stage.painted.svg +1 -0
  163. package/dist/assets/falcon-1-falcon-1e-first-stage.svg +1 -0
  164. package/dist/assets/falcon-1-falcon-1e-first-stage.thick.svg +1 -0
  165. package/dist/assets/falcon-1-falcon-1e-second-stage.glb +0 -0
  166. package/dist/assets/falcon-1-falcon-1e-second-stage.painted.svg +1 -0
  167. package/dist/assets/falcon-1-falcon-1e-second-stage.svg +1 -0
  168. package/dist/assets/falcon-1-falcon-1e-second-stage.thick.svg +1 -0
  169. package/dist/assets/falcon-1-falcon-1e.glb +0 -0
  170. package/dist/assets/falcon-1-falcon-1e.painted.svg +1 -0
  171. package/dist/assets/falcon-1-falcon-1e.svg +1 -0
  172. package/dist/assets/falcon-1-falcon-1e.thick.svg +1 -0
  173. package/dist/assets/falcon-9-block-5-apart.painted.svg +1 -1
  174. package/dist/assets/falcon-9-block-5-apart.svg +1 -1
  175. package/dist/assets/falcon-9-block-5-apart.thick.svg +1 -1
  176. package/dist/assets/falcon-9-block-5-dragon-2-apart.painted.svg +1 -1
  177. package/dist/assets/falcon-9-block-5-dragon-2-apart.svg +1 -1
  178. package/dist/assets/falcon-9-block-5-dragon-2-apart.thick.svg +1 -1
  179. package/dist/assets/falcon-9-block-5-dragon-2-capsule.painted.svg +1 -1
  180. package/dist/assets/falcon-9-block-5-dragon-2-capsule.svg +1 -1
  181. package/dist/assets/falcon-9-block-5-dragon-2-capsule.thick.svg +1 -1
  182. package/dist/assets/falcon-9-block-5-dragon-2-first-stage.painted.svg +1 -1
  183. package/dist/assets/falcon-9-block-5-dragon-2-first-stage.svg +1 -1
  184. package/dist/assets/falcon-9-block-5-dragon-2-first-stage.thick.svg +1 -1
  185. package/dist/assets/falcon-9-block-5-dragon-2-second-stage.painted.svg +1 -1
  186. package/dist/assets/falcon-9-block-5-dragon-2-second-stage.svg +1 -1
  187. package/dist/assets/falcon-9-block-5-dragon-2-second-stage.thick.svg +1 -1
  188. package/dist/assets/falcon-9-block-5-dragon-2-trunk.painted.svg +1 -1
  189. package/dist/assets/falcon-9-block-5-dragon-2-trunk.svg +1 -1
  190. package/dist/assets/falcon-9-block-5-dragon-2-trunk.thick.svg +1 -1
  191. package/dist/assets/falcon-9-block-5-dragon-2.painted.svg +1 -1
  192. package/dist/assets/falcon-9-block-5-dragon-2.svg +1 -1
  193. package/dist/assets/falcon-9-block-5-dragon-2.thick.svg +1 -1
  194. package/dist/assets/falcon-9-block-5-fairing.painted.svg +1 -1
  195. package/dist/assets/falcon-9-block-5-fairing.svg +1 -1
  196. package/dist/assets/falcon-9-block-5-fairing.thick.svg +1 -1
  197. package/dist/assets/falcon-9-block-5-first-stage.painted.svg +1 -1
  198. package/dist/assets/falcon-9-block-5-first-stage.svg +1 -1
  199. package/dist/assets/falcon-9-block-5-first-stage.thick.svg +1 -1
  200. package/dist/assets/falcon-9-block-5-second-stage.painted.svg +1 -1
  201. package/dist/assets/falcon-9-block-5-second-stage.svg +1 -1
  202. package/dist/assets/falcon-9-block-5-second-stage.thick.svg +1 -1
  203. package/dist/assets/falcon-9-block-5.painted.svg +1 -1
  204. package/dist/assets/falcon-9-block-5.svg +1 -1
  205. package/dist/assets/falcon-9-block-5.thick.svg +1 -1
  206. package/dist/assets/falcon-9-ft-apart.painted.svg +1 -1
  207. package/dist/assets/falcon-9-ft-apart.svg +1 -1
  208. package/dist/assets/falcon-9-ft-apart.thick.svg +1 -1
  209. package/dist/assets/falcon-9-ft-fairing.painted.svg +1 -1
  210. package/dist/assets/falcon-9-ft-fairing.svg +1 -1
  211. package/dist/assets/falcon-9-ft-fairing.thick.svg +1 -1
  212. package/dist/assets/falcon-9-ft-first-stage.painted.svg +1 -1
  213. package/dist/assets/falcon-9-ft-first-stage.svg +1 -1
  214. package/dist/assets/falcon-9-ft-first-stage.thick.svg +1 -1
  215. package/dist/assets/falcon-9-ft-second-stage.painted.svg +1 -1
  216. package/dist/assets/falcon-9-ft-second-stage.svg +1 -1
  217. package/dist/assets/falcon-9-ft-second-stage.thick.svg +1 -1
  218. package/dist/assets/falcon-9-ft.painted.svg +1 -1
  219. package/dist/assets/falcon-9-ft.svg +1 -1
  220. package/dist/assets/falcon-9-ft.thick.svg +1 -1
  221. package/dist/assets/falcon-9-v1.0-apart.painted.svg +1 -1
  222. package/dist/assets/falcon-9-v1.0-apart.svg +1 -1
  223. package/dist/assets/falcon-9-v1.0-apart.thick.svg +1 -1
  224. package/dist/assets/falcon-9-v1.0-fairing.painted.svg +1 -1
  225. package/dist/assets/falcon-9-v1.0-fairing.svg +1 -1
  226. package/dist/assets/falcon-9-v1.0-fairing.thick.svg +1 -1
  227. package/dist/assets/falcon-9-v1.0-first-stage.painted.svg +1 -1
  228. package/dist/assets/falcon-9-v1.0-first-stage.svg +1 -1
  229. package/dist/assets/falcon-9-v1.0-first-stage.thick.svg +1 -1
  230. package/dist/assets/falcon-9-v1.0-second-stage.painted.svg +1 -1
  231. package/dist/assets/falcon-9-v1.0-second-stage.svg +1 -1
  232. package/dist/assets/falcon-9-v1.0-second-stage.thick.svg +1 -1
  233. package/dist/assets/falcon-9-v1.0.painted.svg +1 -1
  234. package/dist/assets/falcon-9-v1.0.svg +1 -1
  235. package/dist/assets/falcon-9-v1.0.thick.svg +1 -1
  236. package/dist/assets/falcon-9-v1.1-apart.painted.svg +1 -1
  237. package/dist/assets/falcon-9-v1.1-apart.svg +1 -1
  238. package/dist/assets/falcon-9-v1.1-apart.thick.svg +1 -1
  239. package/dist/assets/falcon-9-v1.1-fairing.painted.svg +1 -1
  240. package/dist/assets/falcon-9-v1.1-fairing.svg +1 -1
  241. package/dist/assets/falcon-9-v1.1-fairing.thick.svg +1 -1
  242. package/dist/assets/falcon-9-v1.1-first-stage.painted.svg +1 -1
  243. package/dist/assets/falcon-9-v1.1-first-stage.svg +1 -1
  244. package/dist/assets/falcon-9-v1.1-first-stage.thick.svg +1 -1
  245. package/dist/assets/falcon-9-v1.1-second-stage.painted.svg +1 -1
  246. package/dist/assets/falcon-9-v1.1-second-stage.svg +1 -1
  247. package/dist/assets/falcon-9-v1.1-second-stage.thick.svg +1 -1
  248. package/dist/assets/falcon-9-v1.1.painted.svg +1 -1
  249. package/dist/assets/falcon-9-v1.1.svg +1 -1
  250. package/dist/assets/falcon-9-v1.1.thick.svg +1 -1
  251. package/dist/assets/falcon-heavy-falcon-heavy-apart.painted.svg +1 -1
  252. package/dist/assets/falcon-heavy-falcon-heavy-apart.svg +1 -1
  253. package/dist/assets/falcon-heavy-falcon-heavy-apart.thick.svg +1 -1
  254. package/dist/assets/falcon-heavy-falcon-heavy-centre.painted.svg +1 -1
  255. package/dist/assets/falcon-heavy-falcon-heavy-centre.svg +1 -1
  256. package/dist/assets/falcon-heavy-falcon-heavy-centre.thick.svg +1 -1
  257. package/dist/assets/falcon-heavy-falcon-heavy-side-left.painted.svg +1 -1
  258. package/dist/assets/falcon-heavy-falcon-heavy-side-left.svg +1 -1
  259. package/dist/assets/falcon-heavy-falcon-heavy-side-left.thick.svg +1 -1
  260. package/dist/assets/falcon-heavy-falcon-heavy-side-right.painted.svg +1 -1
  261. package/dist/assets/falcon-heavy-falcon-heavy-side-right.svg +1 -1
  262. package/dist/assets/falcon-heavy-falcon-heavy-side-right.thick.svg +1 -1
  263. package/dist/assets/falcon-heavy-falcon-heavy.painted.svg +1 -1
  264. package/dist/assets/falcon-heavy-falcon-heavy.svg +1 -1
  265. package/dist/assets/falcon-heavy-falcon-heavy.thick.svg +1 -1
  266. package/dist/assets/gemini-gemini-adapter.glb +0 -0
  267. package/dist/assets/gemini-gemini-adapter.painted.svg +1 -0
  268. package/dist/assets/gemini-gemini-adapter.svg +1 -0
  269. package/dist/assets/gemini-gemini-adapter.thick.svg +1 -0
  270. package/dist/assets/gemini-gemini-apart.painted.svg +1 -0
  271. package/dist/assets/gemini-gemini-apart.svg +1 -0
  272. package/dist/assets/gemini-gemini-apart.thick.svg +1 -0
  273. package/dist/assets/gemini-gemini-capsule.glb +0 -0
  274. package/dist/assets/gemini-gemini-capsule.painted.svg +1 -0
  275. package/dist/assets/gemini-gemini-capsule.svg +1 -0
  276. package/dist/assets/gemini-gemini-capsule.thick.svg +1 -0
  277. package/dist/assets/gemini-gemini.glb +0 -0
  278. package/dist/assets/gemini-gemini.painted.svg +1 -0
  279. package/dist/assets/gemini-gemini.svg +1 -0
  280. package/dist/assets/gemini-gemini.thick.svg +1 -0
  281. package/dist/assets/grasshopper-grasshopper.painted.svg +1 -1
  282. package/dist/assets/grasshopper-grasshopper.svg +1 -1
  283. package/dist/assets/grasshopper-grasshopper.thick.svg +1 -1
  284. package/dist/assets/hubble-hubble.glb +0 -0
  285. package/dist/assets/hubble-hubble.painted.svg +1 -0
  286. package/dist/assets/hubble-hubble.svg +1 -0
  287. package/dist/assets/hubble-hubble.thick.svg +1 -0
  288. package/dist/assets/iss-iss.glb +0 -0
  289. package/dist/assets/iss-iss.painted.svg +1 -0
  290. package/dist/assets/iss-iss.svg +1 -0
  291. package/dist/assets/iss-iss.thick.svg +1 -0
  292. package/dist/assets/jupiter-c-jupiter-c.glb +0 -0
  293. package/dist/assets/jupiter-c-jupiter-c.painted.svg +1 -0
  294. package/dist/assets/jupiter-c-jupiter-c.svg +1 -0
  295. package/dist/assets/jupiter-c-jupiter-c.thick.svg +1 -0
  296. package/dist/assets/landing-zone-lz-1-apart.painted.svg +1 -0
  297. package/dist/assets/landing-zone-lz-1-apart.svg +1 -0
  298. package/dist/assets/landing-zone-lz-1-apart.thick.svg +1 -0
  299. package/dist/assets/landing-zone-lz-1-landed.glb +0 -0
  300. package/dist/assets/landing-zone-lz-1-landed.painted.svg +1 -0
  301. package/dist/assets/landing-zone-lz-1-landed.svg +1 -0
  302. package/dist/assets/landing-zone-lz-1-landed.thick.svg +1 -0
  303. package/dist/assets/landing-zone-lz-1-pad.glb +0 -0
  304. package/dist/assets/landing-zone-lz-1-pad.painted.svg +1 -0
  305. package/dist/assets/landing-zone-lz-1-pad.svg +1 -0
  306. package/dist/assets/landing-zone-lz-1-pad.thick.svg +1 -0
  307. package/dist/assets/landing-zone-lz-1.glb +0 -0
  308. package/dist/assets/landing-zone-lz-1.painted.svg +1 -0
  309. package/dist/assets/landing-zone-lz-1.svg +1 -0
  310. package/dist/assets/landing-zone-lz-1.thick.svg +1 -0
  311. package/dist/assets/landing-zone-lz-4-apart.painted.svg +1 -0
  312. package/dist/assets/landing-zone-lz-4-apart.svg +1 -0
  313. package/dist/assets/landing-zone-lz-4-apart.thick.svg +1 -0
  314. package/dist/assets/landing-zone-lz-4-landed.glb +0 -0
  315. package/dist/assets/landing-zone-lz-4-landed.painted.svg +1 -0
  316. package/dist/assets/landing-zone-lz-4-landed.svg +1 -0
  317. package/dist/assets/landing-zone-lz-4-landed.thick.svg +1 -0
  318. package/dist/assets/landing-zone-lz-4-pad.glb +0 -0
  319. package/dist/assets/landing-zone-lz-4-pad.painted.svg +1 -0
  320. package/dist/assets/landing-zone-lz-4-pad.svg +1 -0
  321. package/dist/assets/landing-zone-lz-4-pad.thick.svg +1 -0
  322. package/dist/assets/landing-zone-lz-4.glb +0 -0
  323. package/dist/assets/landing-zone-lz-4.painted.svg +1 -0
  324. package/dist/assets/landing-zone-lz-4.svg +1 -0
  325. package/dist/assets/landing-zone-lz-4.thick.svg +1 -0
  326. package/dist/assets/launch-tower-catch-apart.painted.svg +1 -0
  327. package/dist/assets/launch-tower-catch-apart.svg +1 -0
  328. package/dist/assets/launch-tower-catch-apart.thick.svg +1 -0
  329. package/dist/assets/launch-tower-catch-arms.glb +0 -0
  330. package/dist/assets/launch-tower-catch-arms.painted.svg +1 -0
  331. package/dist/assets/launch-tower-catch-arms.svg +1 -0
  332. package/dist/assets/launch-tower-catch-arms.thick.svg +1 -0
  333. package/dist/assets/launch-tower-catch-booster.glb +0 -0
  334. package/dist/assets/launch-tower-catch-booster.painted.svg +1 -0
  335. package/dist/assets/launch-tower-catch-booster.svg +1 -0
  336. package/dist/assets/launch-tower-catch-booster.thick.svg +1 -0
  337. package/dist/assets/launch-tower-catch-mount.glb +0 -0
  338. package/dist/assets/launch-tower-catch-mount.painted.svg +1 -0
  339. package/dist/assets/launch-tower-catch-mount.svg +1 -0
  340. package/dist/assets/launch-tower-catch-mount.thick.svg +1 -0
  341. package/dist/assets/launch-tower-catch-tower.glb +0 -0
  342. package/dist/assets/launch-tower-catch-tower.painted.svg +1 -0
  343. package/dist/assets/launch-tower-catch-tower.svg +1 -0
  344. package/dist/assets/launch-tower-catch-tower.thick.svg +1 -0
  345. package/dist/assets/launch-tower-catch.glb +0 -0
  346. package/dist/assets/launch-tower-catch.painted.svg +1 -0
  347. package/dist/assets/launch-tower-catch.svg +1 -0
  348. package/dist/assets/launch-tower-catch.thick.svg +1 -0
  349. package/dist/assets/launch-tower-stack-apart.painted.svg +1 -0
  350. package/dist/assets/launch-tower-stack-apart.svg +1 -0
  351. package/dist/assets/launch-tower-stack-apart.thick.svg +1 -0
  352. package/dist/assets/launch-tower-stack-arms.glb +0 -0
  353. package/dist/assets/launch-tower-stack-arms.painted.svg +1 -0
  354. package/dist/assets/launch-tower-stack-arms.svg +1 -0
  355. package/dist/assets/launch-tower-stack-arms.thick.svg +1 -0
  356. package/dist/assets/launch-tower-stack-booster.glb +0 -0
  357. package/dist/assets/launch-tower-stack-booster.painted.svg +1 -0
  358. package/dist/assets/launch-tower-stack-booster.svg +1 -0
  359. package/dist/assets/launch-tower-stack-booster.thick.svg +1 -0
  360. package/dist/assets/launch-tower-stack-mount.glb +0 -0
  361. package/dist/assets/launch-tower-stack-mount.painted.svg +1 -0
  362. package/dist/assets/launch-tower-stack-mount.svg +1 -0
  363. package/dist/assets/launch-tower-stack-mount.thick.svg +1 -0
  364. package/dist/assets/launch-tower-stack-ship.glb +0 -0
  365. package/dist/assets/launch-tower-stack-ship.painted.svg +1 -0
  366. package/dist/assets/launch-tower-stack-ship.svg +1 -0
  367. package/dist/assets/launch-tower-stack-ship.thick.svg +1 -0
  368. package/dist/assets/launch-tower-stack-tower.glb +0 -0
  369. package/dist/assets/launch-tower-stack-tower.painted.svg +1 -0
  370. package/dist/assets/launch-tower-stack-tower.svg +1 -0
  371. package/dist/assets/launch-tower-stack-tower.thick.svg +1 -0
  372. package/dist/assets/launch-tower-stack.glb +0 -0
  373. package/dist/assets/launch-tower-stack.painted.svg +1 -0
  374. package/dist/assets/launch-tower-stack.svg +1 -0
  375. package/dist/assets/launch-tower-stack.thick.svg +1 -0
  376. package/dist/assets/launch-tower-tower-apart.painted.svg +1 -0
  377. package/dist/assets/launch-tower-tower-apart.svg +1 -0
  378. package/dist/assets/launch-tower-tower-apart.thick.svg +1 -0
  379. package/dist/assets/launch-tower-tower-arms.glb +0 -0
  380. package/dist/assets/launch-tower-tower-arms.painted.svg +1 -0
  381. package/dist/assets/launch-tower-tower-arms.svg +1 -0
  382. package/dist/assets/launch-tower-tower-arms.thick.svg +1 -0
  383. package/dist/assets/launch-tower-tower-mount.glb +0 -0
  384. package/dist/assets/launch-tower-tower-mount.painted.svg +1 -0
  385. package/dist/assets/launch-tower-tower-mount.svg +1 -0
  386. package/dist/assets/launch-tower-tower-mount.thick.svg +1 -0
  387. package/dist/assets/launch-tower-tower-tower.glb +0 -0
  388. package/dist/assets/launch-tower-tower-tower.painted.svg +1 -0
  389. package/dist/assets/launch-tower-tower-tower.svg +1 -0
  390. package/dist/assets/launch-tower-tower-tower.thick.svg +1 -0
  391. package/dist/assets/launch-tower-tower.glb +0 -0
  392. package/dist/assets/launch-tower-tower.painted.svg +1 -0
  393. package/dist/assets/launch-tower-tower.svg +1 -0
  394. package/dist/assets/launch-tower-tower.thick.svg +1 -0
  395. package/dist/assets/lunar-module-lunar-module-apart.painted.svg +1 -0
  396. package/dist/assets/lunar-module-lunar-module-apart.svg +1 -0
  397. package/dist/assets/lunar-module-lunar-module-apart.thick.svg +1 -0
  398. package/dist/assets/lunar-module-lunar-module-ascent.glb +0 -0
  399. package/dist/assets/lunar-module-lunar-module-ascent.painted.svg +1 -0
  400. package/dist/assets/lunar-module-lunar-module-ascent.svg +1 -0
  401. package/dist/assets/lunar-module-lunar-module-ascent.thick.svg +1 -0
  402. package/dist/assets/lunar-module-lunar-module-descent.glb +0 -0
  403. package/dist/assets/lunar-module-lunar-module-descent.painted.svg +1 -0
  404. package/dist/assets/lunar-module-lunar-module-descent.svg +1 -0
  405. package/dist/assets/lunar-module-lunar-module-descent.thick.svg +1 -0
  406. package/dist/assets/lunar-module-lunar-module.glb +0 -0
  407. package/dist/assets/lunar-module-lunar-module.painted.svg +1 -0
  408. package/dist/assets/lunar-module-lunar-module.svg +1 -0
  409. package/dist/assets/lunar-module-lunar-module.thick.svg +1 -0
  410. package/dist/assets/mercury-friendship-7.glb +0 -0
  411. package/dist/assets/mercury-friendship-7.painted.svg +1 -0
  412. package/dist/assets/mercury-friendship-7.svg +1 -0
  413. package/dist/assets/mercury-friendship-7.thick.svg +1 -0
  414. package/dist/assets/models/apollo-soyuz-csm.glb +0 -0
  415. package/dist/assets/models/apollo-soyuz-docking-module.glb +0 -0
  416. package/dist/assets/models/apollo-soyuz-soyuz.glb +0 -0
  417. package/dist/assets/models/gemini-adapter.glb +0 -0
  418. package/dist/assets/models/gemini-capsule.glb +0 -0
  419. package/dist/assets/models/hubble-telescope.glb +0 -0
  420. package/dist/assets/models/iss-station.glb +0 -0
  421. package/dist/assets/models/jupiter-c-vehicle.glb +0 -0
  422. package/dist/assets/models/lunar-module-ascent.glb +0 -0
  423. package/dist/assets/models/lunar-module-descent.glb +0 -0
  424. package/dist/assets/models/mercury-capsule.glb +0 -0
  425. package/dist/assets/models/space-shuttle-discovery-orbiter.glb +0 -0
  426. package/dist/assets/models/space-shuttle-stack-external-tank.glb +0 -0
  427. package/dist/assets/models/space-shuttle-stack-orbiter.glb +0 -0
  428. package/dist/assets/models/space-shuttle-stack-srb.glb +0 -0
  429. package/dist/assets/new-glenn-7x2-apart.painted.svg +1 -0
  430. package/dist/assets/new-glenn-7x2-apart.svg +1 -0
  431. package/dist/assets/new-glenn-7x2-apart.thick.svg +1 -0
  432. package/dist/assets/new-glenn-7x2-fairing.glb +0 -0
  433. package/dist/assets/new-glenn-7x2-fairing.painted.svg +1 -0
  434. package/dist/assets/new-glenn-7x2-fairing.svg +1 -0
  435. package/dist/assets/new-glenn-7x2-fairing.thick.svg +1 -0
  436. package/dist/assets/new-glenn-7x2-first-stage.glb +0 -0
  437. package/dist/assets/new-glenn-7x2-first-stage.painted.svg +1 -0
  438. package/dist/assets/new-glenn-7x2-first-stage.svg +1 -0
  439. package/dist/assets/new-glenn-7x2-first-stage.thick.svg +1 -0
  440. package/dist/assets/new-glenn-7x2-second-stage.glb +0 -0
  441. package/dist/assets/new-glenn-7x2-second-stage.painted.svg +1 -0
  442. package/dist/assets/new-glenn-7x2-second-stage.svg +1 -0
  443. package/dist/assets/new-glenn-7x2-second-stage.thick.svg +1 -0
  444. package/dist/assets/new-glenn-7x2.glb +0 -0
  445. package/dist/assets/new-glenn-7x2.painted.svg +1 -0
  446. package/dist/assets/new-glenn-7x2.svg +1 -0
  447. package/dist/assets/new-glenn-7x2.thick.svg +1 -0
  448. package/dist/assets/parts/flap-aft.painted.svg +1 -1
  449. package/dist/assets/parts/flap-aft.svg +1 -1
  450. package/dist/assets/parts/flap-aft.thick.svg +1 -1
  451. package/dist/assets/parts/flap-forward.painted.svg +1 -1
  452. package/dist/assets/parts/flap-forward.svg +1 -1
  453. package/dist/assets/parts/flap-forward.thick.svg +1 -1
  454. package/dist/assets/parts/grid-fin-four.painted.svg +1 -1
  455. package/dist/assets/parts/grid-fin-four.svg +1 -1
  456. package/dist/assets/parts/grid-fin-four.thick.svg +1 -1
  457. package/dist/assets/parts/grid-fin-three.painted.svg +1 -1
  458. package/dist/assets/parts/grid-fin-three.svg +1 -1
  459. package/dist/assets/parts/grid-fin-three.thick.svg +1 -1
  460. package/dist/assets/parts/merlin-sea-level.painted.svg +1 -1
  461. package/dist/assets/parts/merlin-sea-level.svg +1 -1
  462. package/dist/assets/parts/merlin-sea-level.thick.svg +1 -1
  463. package/dist/assets/parts/raptor-sea-level.painted.svg +1 -1
  464. package/dist/assets/parts/raptor-sea-level.svg +1 -1
  465. package/dist/assets/parts/raptor-sea-level.thick.svg +1 -1
  466. package/dist/assets/parts/raptor-vacuum.painted.svg +1 -1
  467. package/dist/assets/parts/raptor-vacuum.svg +1 -1
  468. package/dist/assets/parts/raptor-vacuum.thick.svg +1 -1
  469. package/dist/assets/saturn-v-saturn-v-adapter.glb +0 -0
  470. package/dist/assets/saturn-v-saturn-v-adapter.painted.svg +1 -0
  471. package/dist/assets/saturn-v-saturn-v-adapter.svg +1 -0
  472. package/dist/assets/saturn-v-saturn-v-adapter.thick.svg +1 -0
  473. package/dist/assets/saturn-v-saturn-v-apart.painted.svg +1 -0
  474. package/dist/assets/saturn-v-saturn-v-apart.svg +1 -0
  475. package/dist/assets/saturn-v-saturn-v-apart.thick.svg +1 -0
  476. package/dist/assets/saturn-v-saturn-v-capsule.glb +0 -0
  477. package/dist/assets/saturn-v-saturn-v-capsule.painted.svg +1 -0
  478. package/dist/assets/saturn-v-saturn-v-capsule.svg +1 -0
  479. package/dist/assets/saturn-v-saturn-v-capsule.thick.svg +1 -0
  480. package/dist/assets/saturn-v-saturn-v-escape-tower.glb +0 -0
  481. package/dist/assets/saturn-v-saturn-v-escape-tower.painted.svg +1 -0
  482. package/dist/assets/saturn-v-saturn-v-escape-tower.svg +1 -0
  483. package/dist/assets/saturn-v-saturn-v-escape-tower.thick.svg +1 -0
  484. package/dist/assets/saturn-v-saturn-v-first-stage.glb +0 -0
  485. package/dist/assets/saturn-v-saturn-v-first-stage.painted.svg +1 -0
  486. package/dist/assets/saturn-v-saturn-v-first-stage.svg +1 -0
  487. package/dist/assets/saturn-v-saturn-v-first-stage.thick.svg +1 -0
  488. package/dist/assets/saturn-v-saturn-v-second-stage.glb +0 -0
  489. package/dist/assets/saturn-v-saturn-v-second-stage.painted.svg +1 -0
  490. package/dist/assets/saturn-v-saturn-v-second-stage.svg +1 -0
  491. package/dist/assets/saturn-v-saturn-v-second-stage.thick.svg +1 -0
  492. package/dist/assets/saturn-v-saturn-v-service-module.glb +0 -0
  493. package/dist/assets/saturn-v-saturn-v-service-module.painted.svg +1 -0
  494. package/dist/assets/saturn-v-saturn-v-service-module.svg +1 -0
  495. package/dist/assets/saturn-v-saturn-v-service-module.thick.svg +1 -0
  496. package/dist/assets/saturn-v-saturn-v-third-stage.glb +0 -0
  497. package/dist/assets/saturn-v-saturn-v-third-stage.painted.svg +1 -0
  498. package/dist/assets/saturn-v-saturn-v-third-stage.svg +1 -0
  499. package/dist/assets/saturn-v-saturn-v-third-stage.thick.svg +1 -0
  500. package/dist/assets/saturn-v-saturn-v.glb +0 -0
  501. package/dist/assets/saturn-v-saturn-v.painted.svg +1 -0
  502. package/dist/assets/saturn-v-saturn-v.svg +1 -0
  503. package/dist/assets/saturn-v-saturn-v.thick.svg +1 -0
  504. package/dist/assets/sls-block-1-apart.painted.svg +1 -0
  505. package/dist/assets/sls-block-1-apart.svg +1 -0
  506. package/dist/assets/sls-block-1-apart.thick.svg +1 -0
  507. package/dist/assets/sls-block-1-capsule.glb +0 -0
  508. package/dist/assets/sls-block-1-capsule.painted.svg +1 -0
  509. package/dist/assets/sls-block-1-capsule.svg +1 -0
  510. package/dist/assets/sls-block-1-capsule.thick.svg +1 -0
  511. package/dist/assets/sls-block-1-escape-tower.glb +0 -0
  512. package/dist/assets/sls-block-1-escape-tower.painted.svg +1 -0
  513. package/dist/assets/sls-block-1-escape-tower.svg +1 -0
  514. package/dist/assets/sls-block-1-escape-tower.thick.svg +1 -0
  515. package/dist/assets/sls-block-1-first-stage.glb +0 -0
  516. package/dist/assets/sls-block-1-first-stage.painted.svg +1 -0
  517. package/dist/assets/sls-block-1-first-stage.svg +1 -0
  518. package/dist/assets/sls-block-1-first-stage.thick.svg +1 -0
  519. package/dist/assets/sls-block-1-service-module.glb +0 -0
  520. package/dist/assets/sls-block-1-service-module.painted.svg +1 -0
  521. package/dist/assets/sls-block-1-service-module.svg +1 -0
  522. package/dist/assets/sls-block-1-service-module.thick.svg +1 -0
  523. package/dist/assets/sls-block-1-srb-left.glb +0 -0
  524. package/dist/assets/sls-block-1-srb-left.painted.svg +1 -0
  525. package/dist/assets/sls-block-1-srb-left.svg +1 -0
  526. package/dist/assets/sls-block-1-srb-left.thick.svg +1 -0
  527. package/dist/assets/sls-block-1-srb-right.glb +0 -0
  528. package/dist/assets/sls-block-1-srb-right.painted.svg +1 -0
  529. package/dist/assets/sls-block-1-srb-right.svg +1 -0
  530. package/dist/assets/sls-block-1-srb-right.thick.svg +1 -0
  531. package/dist/assets/sls-block-1-upper-stage.glb +0 -0
  532. package/dist/assets/sls-block-1-upper-stage.painted.svg +1 -0
  533. package/dist/assets/sls-block-1-upper-stage.svg +1 -0
  534. package/dist/assets/sls-block-1-upper-stage.thick.svg +1 -0
  535. package/dist/assets/sls-block-1.glb +0 -0
  536. package/dist/assets/sls-block-1.painted.svg +1 -0
  537. package/dist/assets/sls-block-1.svg +1 -0
  538. package/dist/assets/sls-block-1.thick.svg +1 -0
  539. package/dist/assets/soyuz-soyuz-2-apart.painted.svg +1 -0
  540. package/dist/assets/soyuz-soyuz-2-apart.svg +1 -0
  541. package/dist/assets/soyuz-soyuz-2-apart.thick.svg +1 -0
  542. package/dist/assets/soyuz-soyuz-2-booster-1.glb +0 -0
  543. package/dist/assets/soyuz-soyuz-2-booster-1.painted.svg +1 -0
  544. package/dist/assets/soyuz-soyuz-2-booster-1.svg +1 -0
  545. package/dist/assets/soyuz-soyuz-2-booster-1.thick.svg +1 -0
  546. package/dist/assets/soyuz-soyuz-2-booster-2.glb +0 -0
  547. package/dist/assets/soyuz-soyuz-2-booster-2.painted.svg +1 -0
  548. package/dist/assets/soyuz-soyuz-2-booster-2.svg +1 -0
  549. package/dist/assets/soyuz-soyuz-2-booster-2.thick.svg +1 -0
  550. package/dist/assets/soyuz-soyuz-2-booster-3.glb +0 -0
  551. package/dist/assets/soyuz-soyuz-2-booster-3.painted.svg +1 -0
  552. package/dist/assets/soyuz-soyuz-2-booster-3.svg +1 -0
  553. package/dist/assets/soyuz-soyuz-2-booster-3.thick.svg +1 -0
  554. package/dist/assets/soyuz-soyuz-2-booster-4.glb +0 -0
  555. package/dist/assets/soyuz-soyuz-2-booster-4.painted.svg +1 -0
  556. package/dist/assets/soyuz-soyuz-2-booster-4.svg +1 -0
  557. package/dist/assets/soyuz-soyuz-2-booster-4.thick.svg +1 -0
  558. package/dist/assets/soyuz-soyuz-2-fairing.glb +0 -0
  559. package/dist/assets/soyuz-soyuz-2-fairing.painted.svg +1 -0
  560. package/dist/assets/soyuz-soyuz-2-fairing.svg +1 -0
  561. package/dist/assets/soyuz-soyuz-2-fairing.thick.svg +1 -0
  562. package/dist/assets/soyuz-soyuz-2-first-stage.glb +0 -0
  563. package/dist/assets/soyuz-soyuz-2-first-stage.painted.svg +1 -0
  564. package/dist/assets/soyuz-soyuz-2-first-stage.svg +1 -0
  565. package/dist/assets/soyuz-soyuz-2-first-stage.thick.svg +1 -0
  566. package/dist/assets/soyuz-soyuz-2-third-stage.glb +0 -0
  567. package/dist/assets/soyuz-soyuz-2-third-stage.painted.svg +1 -0
  568. package/dist/assets/soyuz-soyuz-2-third-stage.svg +1 -0
  569. package/dist/assets/soyuz-soyuz-2-third-stage.thick.svg +1 -0
  570. package/dist/assets/soyuz-soyuz-2.glb +0 -0
  571. package/dist/assets/soyuz-soyuz-2.painted.svg +1 -0
  572. package/dist/assets/soyuz-soyuz-2.svg +1 -0
  573. package/dist/assets/soyuz-soyuz-2.thick.svg +1 -0
  574. package/dist/assets/space-shuttle-discovery.glb +0 -0
  575. package/dist/assets/space-shuttle-discovery.painted.svg +1 -0
  576. package/dist/assets/space-shuttle-discovery.svg +1 -0
  577. package/dist/assets/space-shuttle-discovery.thick.svg +1 -0
  578. package/dist/assets/space-shuttle-stack-apart.painted.svg +1 -0
  579. package/dist/assets/space-shuttle-stack-apart.svg +1 -0
  580. package/dist/assets/space-shuttle-stack-apart.thick.svg +1 -0
  581. package/dist/assets/space-shuttle-stack-external-tank.glb +0 -0
  582. package/dist/assets/space-shuttle-stack-external-tank.painted.svg +1 -0
  583. package/dist/assets/space-shuttle-stack-external-tank.svg +1 -0
  584. package/dist/assets/space-shuttle-stack-external-tank.thick.svg +1 -0
  585. package/dist/assets/space-shuttle-stack-orbiter.glb +0 -0
  586. package/dist/assets/space-shuttle-stack-orbiter.painted.svg +1 -0
  587. package/dist/assets/space-shuttle-stack-orbiter.svg +1 -0
  588. package/dist/assets/space-shuttle-stack-orbiter.thick.svg +1 -0
  589. package/dist/assets/space-shuttle-stack-srb-left.glb +0 -0
  590. package/dist/assets/space-shuttle-stack-srb-left.painted.svg +1 -0
  591. package/dist/assets/space-shuttle-stack-srb-left.svg +1 -0
  592. package/dist/assets/space-shuttle-stack-srb-left.thick.svg +1 -0
  593. package/dist/assets/space-shuttle-stack-srb-right.glb +0 -0
  594. package/dist/assets/space-shuttle-stack-srb-right.painted.svg +1 -0
  595. package/dist/assets/space-shuttle-stack-srb-right.svg +1 -0
  596. package/dist/assets/space-shuttle-stack-srb-right.thick.svg +1 -0
  597. package/dist/assets/space-shuttle-stack.glb +0 -0
  598. package/dist/assets/space-shuttle-stack.painted.svg +1 -0
  599. package/dist/assets/space-shuttle-stack.svg +1 -0
  600. package/dist/assets/space-shuttle-stack.thick.svg +1 -0
  601. package/dist/assets/starbase-build-site-apart.painted.svg +1 -0
  602. package/dist/assets/starbase-build-site-apart.svg +1 -0
  603. package/dist/assets/starbase-build-site-apart.thick.svg +1 -0
  604. package/dist/assets/starbase-build-site-garden.glb +0 -0
  605. package/dist/assets/starbase-build-site-garden.painted.svg +1 -0
  606. package/dist/assets/starbase-build-site-garden.svg +1 -0
  607. package/dist/assets/starbase-build-site-garden.thick.svg +1 -0
  608. package/dist/assets/starbase-build-site-ground.glb +0 -0
  609. package/dist/assets/starbase-build-site-ground.painted.svg +1 -0
  610. package/dist/assets/starbase-build-site-ground.svg +1 -0
  611. package/dist/assets/starbase-build-site-ground.thick.svg +1 -0
  612. package/dist/assets/starbase-build-site-mega-bays.glb +0 -0
  613. package/dist/assets/starbase-build-site-mega-bays.painted.svg +1 -0
  614. package/dist/assets/starbase-build-site-mega-bays.svg +1 -0
  615. package/dist/assets/starbase-build-site-mega-bays.thick.svg +1 -0
  616. package/dist/assets/starbase-build-site-sign.glb +0 -0
  617. package/dist/assets/starbase-build-site-sign.painted.svg +1 -0
  618. package/dist/assets/starbase-build-site-sign.svg +1 -0
  619. package/dist/assets/starbase-build-site-sign.thick.svg +1 -0
  620. package/dist/assets/starbase-build-site-starfactory.glb +0 -0
  621. package/dist/assets/starbase-build-site-starfactory.painted.svg +1 -0
  622. package/dist/assets/starbase-build-site-starfactory.svg +1 -0
  623. package/dist/assets/starbase-build-site-starfactory.thick.svg +1 -0
  624. package/dist/assets/starbase-build-site.glb +0 -0
  625. package/dist/assets/starbase-build-site.painted.svg +1 -0
  626. package/dist/assets/starbase-build-site.svg +1 -0
  627. package/dist/assets/starbase-build-site.thick.svg +1 -0
  628. package/dist/assets/starbase-city-apart.painted.svg +1 -0
  629. package/dist/assets/starbase-city-apart.svg +1 -0
  630. package/dist/assets/starbase-city-apart.thick.svg +1 -0
  631. package/dist/assets/starbase-city-garden.glb +0 -0
  632. package/dist/assets/starbase-city-garden.painted.svg +1 -0
  633. package/dist/assets/starbase-city-garden.svg +1 -0
  634. package/dist/assets/starbase-city-garden.thick.svg +1 -0
  635. package/dist/assets/starbase-city-ground.glb +0 -0
  636. package/dist/assets/starbase-city-ground.painted.svg +1 -0
  637. package/dist/assets/starbase-city-ground.svg +1 -0
  638. package/dist/assets/starbase-city-ground.thick.svg +1 -0
  639. package/dist/assets/starbase-city-mega-bays.glb +0 -0
  640. package/dist/assets/starbase-city-mega-bays.painted.svg +1 -0
  641. package/dist/assets/starbase-city-mega-bays.svg +1 -0
  642. package/dist/assets/starbase-city-mega-bays.thick.svg +1 -0
  643. package/dist/assets/starbase-city-on-pad.glb +0 -0
  644. package/dist/assets/starbase-city-on-pad.painted.svg +1 -0
  645. package/dist/assets/starbase-city-on-pad.svg +1 -0
  646. package/dist/assets/starbase-city-on-pad.thick.svg +1 -0
  647. package/dist/assets/starbase-city-pads.glb +0 -0
  648. package/dist/assets/starbase-city-pads.painted.svg +1 -0
  649. package/dist/assets/starbase-city-pads.svg +1 -0
  650. package/dist/assets/starbase-city-pads.thick.svg +1 -0
  651. package/dist/assets/starbase-city-sign.glb +0 -0
  652. package/dist/assets/starbase-city-sign.painted.svg +1 -0
  653. package/dist/assets/starbase-city-sign.svg +1 -0
  654. package/dist/assets/starbase-city-sign.thick.svg +1 -0
  655. package/dist/assets/starbase-city-starfactory.glb +0 -0
  656. package/dist/assets/starbase-city-starfactory.painted.svg +1 -0
  657. package/dist/assets/starbase-city-starfactory.svg +1 -0
  658. package/dist/assets/starbase-city-starfactory.thick.svg +1 -0
  659. package/dist/assets/starbase-city-tank-farm.glb +0 -0
  660. package/dist/assets/starbase-city-tank-farm.painted.svg +1 -0
  661. package/dist/assets/starbase-city-tank-farm.svg +1 -0
  662. package/dist/assets/starbase-city-tank-farm.thick.svg +1 -0
  663. package/dist/assets/starbase-city-village.glb +0 -0
  664. package/dist/assets/starbase-city-village.painted.svg +1 -0
  665. package/dist/assets/starbase-city-village.svg +1 -0
  666. package/dist/assets/starbase-city-village.thick.svg +1 -0
  667. package/dist/assets/starbase-city.glb +0 -0
  668. package/dist/assets/starbase-city.painted.svg +1 -0
  669. package/dist/assets/starbase-city.svg +1 -0
  670. package/dist/assets/starbase-city.thick.svg +1 -0
  671. package/dist/assets/starbase-launch-site-apart.painted.svg +1 -0
  672. package/dist/assets/starbase-launch-site-apart.svg +1 -0
  673. package/dist/assets/starbase-launch-site-apart.thick.svg +1 -0
  674. package/dist/assets/starbase-launch-site-ground.glb +0 -0
  675. package/dist/assets/starbase-launch-site-ground.painted.svg +1 -0
  676. package/dist/assets/starbase-launch-site-ground.svg +1 -0
  677. package/dist/assets/starbase-launch-site-ground.thick.svg +1 -0
  678. package/dist/assets/starbase-launch-site-on-pad.glb +0 -0
  679. package/dist/assets/starbase-launch-site-on-pad.painted.svg +1 -0
  680. package/dist/assets/starbase-launch-site-on-pad.svg +1 -0
  681. package/dist/assets/starbase-launch-site-on-pad.thick.svg +1 -0
  682. package/dist/assets/starbase-launch-site-pads.glb +0 -0
  683. package/dist/assets/starbase-launch-site-pads.painted.svg +1 -0
  684. package/dist/assets/starbase-launch-site-pads.svg +1 -0
  685. package/dist/assets/starbase-launch-site-pads.thick.svg +1 -0
  686. package/dist/assets/starbase-launch-site-tank-farm.glb +0 -0
  687. package/dist/assets/starbase-launch-site-tank-farm.painted.svg +1 -0
  688. package/dist/assets/starbase-launch-site-tank-farm.svg +1 -0
  689. package/dist/assets/starbase-launch-site-tank-farm.thick.svg +1 -0
  690. package/dist/assets/starbase-launch-site.glb +0 -0
  691. package/dist/assets/starbase-launch-site.painted.svg +1 -0
  692. package/dist/assets/starbase-launch-site.svg +1 -0
  693. package/dist/assets/starbase-launch-site.thick.svg +1 -0
  694. package/dist/assets/starship-2019.painted.svg +1 -1
  695. package/dist/assets/starship-2019.svg +1 -1
  696. package/dist/assets/starship-2019.thick.svg +1 -1
  697. package/dist/assets/starship-v1-apart.painted.svg +1 -1
  698. package/dist/assets/starship-v1-apart.svg +1 -1
  699. package/dist/assets/starship-v1-apart.thick.svg +1 -1
  700. package/dist/assets/starship-v1-booster.painted.svg +1 -1
  701. package/dist/assets/starship-v1-booster.svg +1 -1
  702. package/dist/assets/starship-v1-booster.thick.svg +1 -1
  703. package/dist/assets/starship-v1-flight1-apart.painted.svg +1 -1
  704. package/dist/assets/starship-v1-flight1-apart.svg +1 -1
  705. package/dist/assets/starship-v1-flight1-apart.thick.svg +1 -1
  706. package/dist/assets/starship-v1-flight1-booster.painted.svg +1 -1
  707. package/dist/assets/starship-v1-flight1-booster.svg +1 -1
  708. package/dist/assets/starship-v1-flight1-booster.thick.svg +1 -1
  709. package/dist/assets/starship-v1-flight1-ship.painted.svg +1 -1
  710. package/dist/assets/starship-v1-flight1-ship.svg +1 -1
  711. package/dist/assets/starship-v1-flight1-ship.thick.svg +1 -1
  712. package/dist/assets/starship-v1-flight1.painted.svg +1 -1
  713. package/dist/assets/starship-v1-flight1.svg +1 -1
  714. package/dist/assets/starship-v1-flight1.thick.svg +1 -1
  715. package/dist/assets/starship-v1-ship.painted.svg +1 -1
  716. package/dist/assets/starship-v1-ship.svg +1 -1
  717. package/dist/assets/starship-v1-ship.thick.svg +1 -1
  718. package/dist/assets/starship-v1.painted.svg +1 -1
  719. package/dist/assets/starship-v1.svg +1 -1
  720. package/dist/assets/starship-v1.thick.svg +1 -1
  721. package/dist/assets/starship-v2-apart.painted.svg +1 -1
  722. package/dist/assets/starship-v2-apart.svg +1 -1
  723. package/dist/assets/starship-v2-apart.thick.svg +1 -1
  724. package/dist/assets/starship-v2-booster.painted.svg +1 -1
  725. package/dist/assets/starship-v2-booster.svg +1 -1
  726. package/dist/assets/starship-v2-booster.thick.svg +1 -1
  727. package/dist/assets/starship-v2-ship.painted.svg +1 -1
  728. package/dist/assets/starship-v2-ship.svg +1 -1
  729. package/dist/assets/starship-v2-ship.thick.svg +1 -1
  730. package/dist/assets/starship-v2.painted.svg +1 -1
  731. package/dist/assets/starship-v2.svg +1 -1
  732. package/dist/assets/starship-v2.thick.svg +1 -1
  733. package/dist/assets/starship-v3-apart.painted.svg +1 -1
  734. package/dist/assets/starship-v3-apart.svg +1 -1
  735. package/dist/assets/starship-v3-apart.thick.svg +1 -1
  736. package/dist/assets/starship-v3-booster.painted.svg +1 -1
  737. package/dist/assets/starship-v3-booster.svg +1 -1
  738. package/dist/assets/starship-v3-booster.thick.svg +1 -1
  739. package/dist/assets/starship-v3-ship.painted.svg +1 -1
  740. package/dist/assets/starship-v3-ship.svg +1 -1
  741. package/dist/assets/starship-v3-ship.thick.svg +1 -1
  742. package/dist/assets/starship-v3.painted.svg +1 -1
  743. package/dist/assets/starship-v3.svg +1 -1
  744. package/dist/assets/starship-v3.thick.svg +1 -1
  745. package/dist/assets/starship-v4-apart.painted.svg +1 -1
  746. package/dist/assets/starship-v4-apart.svg +1 -1
  747. package/dist/assets/starship-v4-apart.thick.svg +1 -1
  748. package/dist/assets/starship-v4-booster.painted.svg +1 -1
  749. package/dist/assets/starship-v4-booster.svg +1 -1
  750. package/dist/assets/starship-v4-booster.thick.svg +1 -1
  751. package/dist/assets/starship-v4-ship.painted.svg +1 -1
  752. package/dist/assets/starship-v4-ship.svg +1 -1
  753. package/dist/assets/starship-v4-ship.thick.svg +1 -1
  754. package/dist/assets/starship-v4.painted.svg +1 -1
  755. package/dist/assets/starship-v4.svg +1 -1
  756. package/dist/assets/starship-v4.thick.svg +1 -1
  757. package/dist/attrs.d.ts +93 -0
  758. package/dist/attrs.js +86 -0
  759. package/dist/build/glb.d.ts +25 -0
  760. package/dist/build/glb.js +14 -0
  761. package/dist/build/index.d.ts +96 -6
  762. package/dist/build/index.js +83 -8
  763. package/dist/build/lineup.d.ts +56 -2
  764. package/dist/build/lineup.js +37 -6
  765. package/dist/builder.d.ts +68 -0
  766. package/dist/builder.js +116 -0
  767. package/dist/crossfade.d.ts +44 -2
  768. package/dist/crossfade.js +44 -2
  769. package/dist/data/apollosoyuz.d.ts +6 -0
  770. package/dist/data/apollosoyuz.js +28 -0
  771. package/dist/data/credits.d.ts +63 -2
  772. package/dist/data/credits.js +52 -2
  773. package/dist/data/dragon.js +35 -0
  774. package/dist/data/electron.d.ts +2 -0
  775. package/dist/data/electron.js +23 -0
  776. package/dist/data/falcon.js +2 -2
  777. package/dist/data/falcon1.d.ts +4 -0
  778. package/dist/data/falcon1.js +51 -0
  779. package/dist/data/flight-log.d.ts +50 -0
  780. package/dist/data/flight-log.js +44 -0
  781. package/dist/data/flights.d.ts +101 -0
  782. package/dist/data/flights.js +187 -0
  783. package/dist/data/gemini.d.ts +3 -0
  784. package/dist/data/gemini.js +22 -0
  785. package/dist/data/hubble.d.ts +3 -0
  786. package/dist/data/hubble.js +23 -0
  787. package/dist/data/iss.d.ts +5 -0
  788. package/dist/data/iss.js +25 -0
  789. package/dist/data/jupiterc.d.ts +3 -0
  790. package/dist/data/jupiterc.js +22 -0
  791. package/dist/data/landing.d.ts +3 -0
  792. package/dist/data/landing.js +51 -0
  793. package/dist/data/lunarmodule.d.ts +4 -0
  794. package/dist/data/lunarmodule.js +27 -0
  795. package/dist/data/makers.d.ts +37 -0
  796. package/dist/data/makers.js +39 -0
  797. package/dist/data/mercury.d.ts +3 -0
  798. package/dist/data/mercury.js +22 -0
  799. package/dist/data/newglenn.d.ts +2 -0
  800. package/dist/data/newglenn.js +23 -0
  801. package/dist/data/saturn.d.ts +2 -0
  802. package/dist/data/saturn.js +32 -0
  803. package/dist/data/shuttle.d.ts +5 -0
  804. package/dist/data/shuttle.js +52 -0
  805. package/dist/data/sls.d.ts +4 -0
  806. package/dist/data/sls.js +36 -0
  807. package/dist/data/sources.d.ts +380 -2
  808. package/dist/data/sources.js +55 -1
  809. package/dist/data/soyuz.d.ts +3 -0
  810. package/dist/data/soyuz.js +33 -0
  811. package/dist/data/starbase.d.ts +2 -0
  812. package/dist/data/starbase.js +30 -0
  813. package/dist/data/tower.d.ts +3 -0
  814. package/dist/data/tower.js +26 -0
  815. package/dist/data/types.d.ts +88 -2
  816. package/dist/data/types.js +26 -1
  817. package/dist/draw/plume.d.ts +8 -0
  818. package/dist/draw/plume.js +71 -0
  819. package/dist/draw/svg.d.ts +1 -1
  820. package/dist/draw/svg.js +3 -3
  821. package/dist/element/ground.d.ts +15 -0
  822. package/dist/element/ground.js +95 -0
  823. package/dist/element/plumes.d.ts +38 -0
  824. package/dist/element/plumes.js +208 -0
  825. package/dist/element/scene.d.ts +39 -5
  826. package/dist/element/scene.js +250 -7
  827. package/dist/element.d.ts +111 -4
  828. package/dist/element.js +251 -16
  829. package/dist/embed.d.ts +131 -0
  830. package/dist/embed.js +218 -0
  831. package/dist/engines.d.ts +126 -0
  832. package/dist/engines.js +150 -0
  833. package/dist/fit.d.ts +70 -0
  834. package/dist/fit.js +17 -3
  835. package/dist/flight.d.ts +192 -0
  836. package/dist/flight.js +237 -0
  837. package/dist/flightbar.d.ts +34 -0
  838. package/dist/flightbar.js +188 -0
  839. package/dist/framing.d.ts +182 -8
  840. package/dist/framing.js +127 -6
  841. package/dist/index.d.ts +17 -0
  842. package/dist/index.js +9 -0
  843. package/dist/layout.d.ts +65 -1
  844. package/dist/layout.js +44 -2
  845. package/dist/looks.d.ts +65 -2
  846. package/dist/looks.js +44 -1
  847. package/dist/model/apollosoyuz.d.ts +2 -0
  848. package/dist/model/apollosoyuz.js +46 -0
  849. package/dist/model/dragoninside.d.ts +2 -0
  850. package/dist/model/dragoninside.js +67 -0
  851. package/dist/model/electron.d.ts +2 -0
  852. package/dist/model/electron.js +35 -0
  853. package/dist/model/falcon.d.ts +2 -0
  854. package/dist/model/falcon.js +4 -0
  855. package/dist/model/falcon1.d.ts +2 -0
  856. package/dist/model/falcon1.js +53 -0
  857. package/dist/model/gemini.d.ts +2 -0
  858. package/dist/model/gemini.js +28 -0
  859. package/dist/model/hubble.d.ts +2 -0
  860. package/dist/model/hubble.js +28 -0
  861. package/dist/model/iss.d.ts +2 -0
  862. package/dist/model/iss.js +32 -0
  863. package/dist/model/jupiterc.d.ts +2 -0
  864. package/dist/model/jupiterc.js +24 -0
  865. package/dist/model/kit.d.ts +36 -0
  866. package/dist/model/kit.js +95 -0
  867. package/dist/model/landing.d.ts +3 -0
  868. package/dist/model/landing.js +81 -0
  869. package/dist/model/lunarmodule.d.ts +2 -0
  870. package/dist/model/lunarmodule.js +43 -0
  871. package/dist/model/materials.d.ts +74 -0
  872. package/dist/model/materials.js +17 -0
  873. package/dist/model/mercury.d.ts +2 -0
  874. package/dist/model/mercury.js +19 -0
  875. package/dist/model/newglenn.d.ts +2 -0
  876. package/dist/model/newglenn.js +43 -0
  877. package/dist/model/pieces.d.ts +2 -0
  878. package/dist/model/pieces.js +2 -2
  879. package/dist/model/registry.d.ts +22 -0
  880. package/dist/model/registry.js +85 -0
  881. package/dist/model/saturn.d.ts +2 -0
  882. package/dist/model/saturn.js +122 -0
  883. package/dist/model/shuttle.d.ts +2 -0
  884. package/dist/model/shuttle.js +111 -0
  885. package/dist/model/sls.d.ts +2 -0
  886. package/dist/model/sls.js +83 -0
  887. package/dist/model/soyuz.d.ts +2 -0
  888. package/dist/model/soyuz.js +75 -0
  889. package/dist/model/stacks.d.ts +39 -0
  890. package/dist/model/stacks.js +1 -0
  891. package/dist/model/starbase.d.ts +2 -0
  892. package/dist/model/starbase.js +108 -0
  893. package/dist/model/tower.d.ts +6 -0
  894. package/dist/model/tower.js +89 -0
  895. package/dist/parts.d.ts +36 -3
  896. package/dist/pixels.d.ts +44 -4
  897. package/dist/pixels.js +44 -4
  898. package/dist/react.d.ts +38 -6
  899. package/dist/react.js +13 -0
  900. package/dist/rockets.d.ts +96 -3
  901. package/dist/rockets.js +136 -9
  902. package/dist/spin.d.ts +66 -0
  903. package/dist/spin.js +44 -0
  904. package/dist/tilt.d.ts +48 -4
  905. package/dist/tilt.js +26 -4
  906. package/package.json +99 -19
@@ -3,12 +3,38 @@ import { type Angle, type Vec3, type ViewName } from "../framing.ts";
3
3
  import { type LookName } from "../looks.ts";
4
4
  import { type PartMesh, type Bounds, type Piece } from "../model/pieces.ts";
5
5
  import type { PartRecord } from "../parts.ts";
6
+ import { type LitBell } from "../engines.ts";
6
7
  import { type Glb, toGlb } from "./glb.ts";
7
- /** Raised when a description does not fit: its report says why. */
8
+ /**
9
+ * Raised by `build` when a description does not fit. Its `report` says why, in the same words `check` gives.
10
+ *
11
+ * @param report The report of the fit check that failed.
12
+ * @example
13
+ * ```ts
14
+ * import { build, FitError } from "@johnmorrisdotca/uchusen-rockets/build";
15
+ *
16
+ * try {
17
+ * build({ rocket: "starship", variant: "v3", parts: { booster: "starship-v3-ship" } });
18
+ * } catch (error) {
19
+ * if (error instanceof FitError) console.log(error.report.issues[0]?.message);
20
+ * }
21
+ * ```
22
+ */
8
23
  export declare class FitError extends Error {
9
24
  readonly report: FitReport;
10
25
  constructor(report: FitReport);
11
26
  }
27
+ /**
28
+ * One part of a built rocket: its slot, its record, the pieces it is made of, its mesh and its bounds in metres.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { build, type BuiltPart } from "@johnmorrisdotca/uchusen-rockets/build";
33
+ *
34
+ * const first: BuiltPart | undefined = build({ rocket: "falcon-9", variant: "block-5" }).parts[0];
35
+ * console.log(first?.slot, first?.record.name);
36
+ * ```
37
+ */
12
38
  export interface BuiltPart {
13
39
  slot: string;
14
40
  record: PartRecord;
@@ -16,37 +42,101 @@ export interface BuiltPart {
16
42
  mesh: PartMesh;
17
43
  bounds: Bounds;
18
44
  }
45
+ /**
46
+ * What a drawing is asked for: the look, the view, what to show and whether the engines are lit. Anything left out takes its default.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * import { build, type SvgOptions } from "@johnmorrisdotca/uchusen-rockets/build";
51
+ *
52
+ * const options: SvgOptions = { look: "thick", view: "below", show: "booster" };
53
+ * console.log(build({ rocket: "starship", variant: "v3" }).svg(options).startsWith("<svg"));
54
+ * ```
55
+ */
19
56
  export interface SvgOptions {
20
57
  look?: LookName;
21
58
  view?: ViewName | Angle;
22
59
  show?: string;
60
+ /** A flame at each engine that is showing, or as many as a count names for each part. The length is a picture, not a measured flame. Left out, the drawing is unchanged. */
61
+ engines?: boolean | Readonly<Record<string, number>>;
23
62
  }
63
+ /**
64
+ * A rocket built from a description: the fit report, its parts, and the ways to ask for its size, where each part stands, its lit engines, a `.glb` file and a drawing.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * import { build, type Built } from "@johnmorrisdotca/uchusen-rockets/build";
69
+ *
70
+ * const rocket: Built = build({ rocket: "starship", variant: "v3" });
71
+ * console.log(rocket.shows.join(", "));
72
+ * console.log(rocket.boundsOf("together").max);
73
+ * ```
74
+ */
24
75
  export interface Built {
25
76
  report: FitReport;
26
77
  parts: readonly BuiltPart[];
27
78
  /** What can be shown: together, apart and each part. */
28
79
  shows: readonly string[];
29
- /** The bounds of a choice of what to show, in metres. */
30
- boundsOf(show?: string): Bounds;
80
+ /** The bounds of a choice of what to show, in metres, and with `lit` the flames of its engines at full thrust. */
81
+ boundsOf(show?: string, lit?: boolean): Bounds;
31
82
  /** Where each part stands for a choice of what to show. */
32
83
  placesOf(show?: string): {
33
84
  slot: string;
34
85
  at: Vec3;
35
86
  shown: boolean;
36
87
  }[];
88
+ /** The engines alight at full thrust for a choice of what to show: those the drawing has, of the parts whose engines a source tells of. */
89
+ flamesOf(show?: string): LitBell[];
37
90
  /** The .glb file's bytes: every part stacked, each its own node to move. */
38
91
  glb(): Glb;
39
92
  /** The drawing, in a look, from an angle. */
40
93
  svg(options?: SvgOptions): string;
41
94
  }
42
- /** What a drawing draws of a part: in a stack, what nests inside the part below is out of sight. */
95
+ /**
96
+ * What a drawing draws of a part: in a stack, what nests inside the part below is out of sight.
97
+ *
98
+ * @param part A built part: its record and its pieces.
99
+ * @param together True when the part stands in a stack, false when it is shown alone.
100
+ * @returns The pieces to draw. In a stack, what nests inside the part below is left out.
101
+ * @example
102
+ * ```ts
103
+ * import { build, drawnPieces } from "@johnmorrisdotca/uchusen-rockets/build";
104
+ *
105
+ * const [first] = build({ rocket: "falcon-9", variant: "block-5" }).parts;
106
+ * if (first) console.log(drawnPieces(first, true).length, drawnPieces(first, false).length);
107
+ * ```
108
+ */
43
109
  export declare function drawnPieces(part: {
44
110
  record: PartRecord;
45
111
  pieces: readonly Piece[];
46
112
  }, together: boolean): readonly Piece[];
47
- /** A rocket from a description. Throws FitError when it does not go together. */
113
+ /**
114
+ * A rocket from a description. Throws FitError when it does not go together.
115
+ *
116
+ * @param description The rocket, its variant and any other part in a slot.
117
+ * @returns The built rocket. It throws a `FitError` when the description does not go together.
118
+ * @example
119
+ * ```ts
120
+ * import { build } from "@johnmorrisdotca/uchusen-rockets/build";
121
+ *
122
+ * const rocket = build({ rocket: "falcon-heavy" });
123
+ * console.log(rocket.report.label, rocket.glb().bytes.length > 1000);
124
+ * ```
125
+ */
48
126
  export declare function build(description: Description): Built;
49
- /** One part on its own, by its id. */
127
+ /**
128
+ * One part on its own, by its id.
129
+ *
130
+ * @param id A part's id, as `PART_ENTRIES` lists it.
131
+ * @returns The part's record and bounds, a function for its `.glb` and one for its drawing. It throws for an id that is not a part.
132
+ * @example
133
+ * ```ts
134
+ * import { buildPart } from "@johnmorrisdotca/uchusen-rockets/build";
135
+ *
136
+ * const raptor = buildPart("raptor-vacuum");
137
+ * console.log(raptor.record.name, raptor.bounds.max);
138
+ * ```
139
+ */
50
140
  export declare function buildPart(id: string): {
51
141
  record: PartRecord;
52
142
  bounds: Bounds;
@@ -5,9 +5,25 @@ import { cleanShow, placesFor, showsOf } from "../layout.js";
5
5
  import { DEFAULT_LOOK } from "../looks.js";
6
6
  import { boundsOf, meshOf } from "../model/pieces.js";
7
7
  import { partEntry } from "../model/registry.js";
8
+ import { plumeMarkup } from "../draw/plume.js";
8
9
  import { defsOf, drawPart, perspective } from "../draw/svg.js";
10
+ import { bellsOf, litBells, pickBells, plumeLength } from "../engines.js";
9
11
  import { toGlb } from "./glb.js";
10
- /** Raised when a description does not fit: its report says why. */
12
+ /**
13
+ * Raised by `build` when a description does not fit. Its `report` says why, in the same words `check` gives.
14
+ *
15
+ * @param report The report of the fit check that failed.
16
+ * @example
17
+ * ```ts
18
+ * import { build, FitError } from "@johnmorrisdotca/uchusen-rockets/build";
19
+ *
20
+ * try {
21
+ * build({ rocket: "starship", variant: "v3", parts: { booster: "starship-v3-ship" } });
22
+ * } catch (error) {
23
+ * if (error instanceof FitError) console.log(error.report.issues[0]?.message);
24
+ * }
25
+ * ```
26
+ */
11
27
  export class FitError extends Error {
12
28
  report;
13
29
  constructor(report) {
@@ -47,7 +63,15 @@ function assembled(report) {
47
63
  });
48
64
  const slots = parts.map((part) => part.slot);
49
65
  const placesOf = (show) => placesFor(report.parts, cleanShow(show, slots), (part) => widthOf(part.id));
50
- const boundsOfShow = (show) => {
66
+ const flamesOf = (show) => {
67
+ const places = placesOf(show);
68
+ return litBells(places.map((place) => {
69
+ const part = parts.find((p) => p.slot === place.slot);
70
+ const told = report.variant?.facts.engines[part.slot]?.value;
71
+ return { slot: part.slot, atY: place.at[1], shown: place.shown, pieces: part.pieces, beside: place.at[0] !== 0 || place.at[2] !== 0, dark: told === null || told === undefined };
72
+ }), !show || show === "together");
73
+ };
74
+ const boundsOfShow = (show, lit = false) => {
51
75
  const min = [Infinity, Infinity, Infinity];
52
76
  const max = [-Infinity, -Infinity, -Infinity];
53
77
  for (const place of placesOf(show)) {
@@ -59,6 +83,11 @@ function assembled(report) {
59
83
  max[c] = Math.max(max[c], bounds.max[c] + place.at[c]);
60
84
  }
61
85
  }
86
+ if (lit)
87
+ for (const bell of flamesOf(show)) {
88
+ const place = placesOf(show).find((one) => one.slot === bell.slot);
89
+ min[1] = Math.min(min[1], (place?.at[1] ?? 0) + bell.y - plumeLength(bell.exit));
90
+ }
62
91
  return { min, max };
63
92
  };
64
93
  return {
@@ -67,11 +96,13 @@ function assembled(report) {
67
96
  shows: showsOf(slots),
68
97
  boundsOf: boundsOfShow,
69
98
  placesOf,
99
+ flamesOf,
70
100
  glb: () => toGlb(parts.map((part) => ({ name: part.slot, mesh: part.mesh, at: placesOf("together").find((place) => place.slot === part.slot)?.at ?? [0, 0, 0] }))),
71
- svg: ({ look = DEFAULT_LOOK, view = DEFAULT_VIEW, show } = {}) => {
101
+ svg: ({ look = DEFAULT_LOOK, view = DEFAULT_VIEW, show, engines = false } = {}) => {
72
102
  const angle = typeof view === "string" ? VIEWS[cleanView(view)] : view;
73
103
  const places = placesOf(show).filter((place) => place.shown);
74
- const cam = perspective(boundsOfShow(show), angle);
104
+ // a flame drawn at full thrust is held in the picture; a count of engines is the timeline's, which has its own room
105
+ const cam = perspective(boundsOfShow(show, engines === true), angle);
75
106
  const ordered = places
76
107
  .map((place) => {
77
108
  const part = parts.find((p) => p.slot === place.slot);
@@ -80,25 +111,69 @@ function assembled(report) {
80
111
  })
81
112
  .sort((a, b) => b.depth - a.depth);
82
113
  const together = !show || show === "together";
83
- return wrap(ordered.map(({ place, part }) => drawPart(drawnPieces(part, together), place.at, cam, look)).join(""), look, PICTURE_W, PICTURE_H, report.label);
114
+ const flames = typeof engines === "object"
115
+ ? parts.flatMap((part) => pickBells(bellsOf(part.pieces), engines[part.slot] ?? 0).map((bell) => ({ ...bell, slot: part.slot })))
116
+ : engines
117
+ ? flamesOf(show).filter((bell) => places.some((place) => place.slot === bell.slot))
118
+ : [];
119
+ return wrap(ordered
120
+ .map(({ place, part }) => drawPart(drawnPieces(part, together), place.at, cam, look) + plumeMarkup(flames.filter((bell) => bell.slot === place.slot), place.at, cam, look, part.slot))
121
+ .join(""), look, PICTURE_W, PICTURE_H, report.label);
84
122
  },
85
123
  };
86
124
  }
87
- /** What a drawing draws of a part: in a stack, what nests inside the part below is out of sight. */
125
+ /**
126
+ * What a drawing draws of a part: in a stack, what nests inside the part below is out of sight.
127
+ *
128
+ * @param part A built part: its record and its pieces.
129
+ * @param together True when the part stands in a stack, false when it is shown alone.
130
+ * @returns The pieces to draw. In a stack, what nests inside the part below is left out.
131
+ * @example
132
+ * ```ts
133
+ * import { build, drawnPieces } from "@johnmorrisdotca/uchusen-rockets/build";
134
+ *
135
+ * const [first] = build({ rocket: "falcon-9", variant: "block-5" }).parts;
136
+ * if (first) console.log(drawnPieces(first, true).length, drawnPieces(first, false).length);
137
+ * ```
138
+ */
88
139
  export function drawnPieces(part, together) {
89
140
  const joint = part.record.joints.bottom?.y ?? 0;
90
141
  if (!together || joint <= 0)
91
142
  return part.pieces;
92
143
  return part.pieces.filter((piece) => !(piece.kind === "lathe" && piece.under && Math.max(...piece.profile.map(([, y]) => y)) <= joint + 0.01));
93
144
  }
94
- /** A rocket from a description. Throws FitError when it does not go together. */
145
+ /**
146
+ * A rocket from a description. Throws FitError when it does not go together.
147
+ *
148
+ * @param description The rocket, its variant and any other part in a slot.
149
+ * @returns The built rocket. It throws a `FitError` when the description does not go together.
150
+ * @example
151
+ * ```ts
152
+ * import { build } from "@johnmorrisdotca/uchusen-rockets/build";
153
+ *
154
+ * const rocket = build({ rocket: "falcon-heavy" });
155
+ * console.log(rocket.report.label, rocket.glb().bytes.length > 1000);
156
+ * ```
157
+ */
95
158
  export function build(description) {
96
159
  const report = check(description);
97
160
  if (!report.ok)
98
161
  throw new FitError(report);
99
162
  return assembled(report);
100
163
  }
101
- /** One part on its own, by its id. */
164
+ /**
165
+ * One part on its own, by its id.
166
+ *
167
+ * @param id A part's id, as `PART_ENTRIES` lists it.
168
+ * @returns The part's record and bounds, a function for its `.glb` and one for its drawing. It throws for an id that is not a part.
169
+ * @example
170
+ * ```ts
171
+ * import { buildPart } from "@johnmorrisdotca/uchusen-rockets/build";
172
+ *
173
+ * const raptor = buildPart("raptor-vacuum");
174
+ * console.log(raptor.record.name, raptor.bounds.max);
175
+ * ```
176
+ */
102
177
  export function buildPart(id) {
103
178
  const entry = partEntry(id);
104
179
  if (!entry)
@@ -1,6 +1,15 @@
1
1
  import { type ViewName } from "../framing.ts";
2
2
  import { type LookName } from "../looks.ts";
3
- /** Comparison shapes: plain round sizes, for scale, not facts about anything. */
3
+ /**
4
+ * Comparison shapes: plain round sizes, for scale, not facts about anything.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { COMPARES } from "@johnmorrisdotca/uchusen-rockets/build";
9
+ *
10
+ * console.log(COMPARES.person.height, COMPARES.building.height);
11
+ * ```
12
+ */
4
13
  export declare const COMPARES: {
5
14
  readonly person: {
6
15
  readonly name: "A person, 1.8 m";
@@ -13,13 +22,46 @@ export declare const COMPARES: {
13
22
  readonly width: 18;
14
23
  };
15
24
  };
25
+ /**
26
+ * The name of a comparison shape that can stand in a lineup: `person` or `building`.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import type { CompareId } from "@johnmorrisdotca/uchusen-rockets/build";
31
+ *
32
+ * const id: CompareId = "person";
33
+ * console.log(id);
34
+ * ```
35
+ */
16
36
  export type CompareId = keyof typeof COMPARES;
37
+ /**
38
+ * One thing standing in a lineup: its key (`starship:v3` or a comparison's name), its label and its height in metres.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { lineupSvg, type LineupItem } from "@johnmorrisdotca/uchusen-rockets/build";
43
+ *
44
+ * const items: LineupItem[] = lineupSvg({ items: ["starship:v3", "person"], unit: 3 }).items;
45
+ * console.log(items.map((item) => item.label));
46
+ * ```
47
+ */
17
48
  export interface LineupItem {
18
49
  /** "starship:v3" or a comparison's name. */
19
50
  key: string;
20
51
  label: string;
21
52
  height: number;
22
53
  }
54
+ /**
55
+ * What a lineup is asked for: the items by key, how many pixels make a metre, and optionally the look, the view, what to show, a ruler and labels.
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * import { lineupSvg, type LineupOptions } from "@johnmorrisdotca/uchusen-rockets/build";
60
+ *
61
+ * const options: LineupOptions = { items: ["starship:v2", "starship:v3", "building"], unit: 3, ruler: true, labels: true };
62
+ * console.log(lineupSvg(options).width);
63
+ * ```
64
+ */
23
65
  export interface LineupOptions {
24
66
  /** "starship:v1,starship:v3,person,building". */
25
67
  items: readonly string[];
@@ -31,7 +73,19 @@ export interface LineupOptions {
31
73
  ruler?: boolean;
32
74
  labels?: boolean;
33
75
  }
34
- /** The whole picture as SVG text. Unknown items are left out. */
76
+ /**
77
+ * The whole picture as SVG text. Unknown items are left out.
78
+ *
79
+ * @param options The items and how they are drawn.
80
+ * @returns The picture as SVG text, the items it holds, and its width and height.
81
+ * @example
82
+ * ```ts
83
+ * import { lineupSvg } from "@johnmorrisdotca/uchusen-rockets/build";
84
+ *
85
+ * const picture = lineupSvg({ items: ["falcon-9:block-5", "falcon-heavy:falcon-heavy", "person"], unit: 4, ruler: true });
86
+ * console.log(picture.items.length, picture.svg.startsWith("<svg"));
87
+ * ```
88
+ */
35
89
  export declare function lineupSvg(options: LineupOptions): {
36
90
  svg: string;
37
91
  items: LineupItem[];
@@ -4,14 +4,31 @@ import { check } from "../fit.js";
4
4
  import { axesOf, cleanView, directionOf, VIEWS } from "../framing.js";
5
5
  import { DEFAULT_LOOK, LOOKS } from "../looks.js";
6
6
  import { defsOf, drawPart, orthographic } from "../draw/svg.js";
7
+ import { MATERIALS } from "../model/materials.js";
7
8
  import { variantOf } from "../rockets.js";
8
- /** Comparison shapes: plain round sizes, for scale, not facts about anything. */
9
+ /**
10
+ * Comparison shapes: plain round sizes, for scale, not facts about anything.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { COMPARES } from "@johnmorrisdotca/uchusen-rockets/build";
15
+ *
16
+ * console.log(COMPARES.person.height, COMPARES.building.height);
17
+ * ```
18
+ */
9
19
  export const COMPARES = {
10
20
  person: { name: "A person, 1.8 m", height: 1.8, width: 0.5 },
11
21
  building: { name: "A ten-storey building, 30 m", height: 30, width: 18 },
12
22
  };
13
23
  const xmlText = (text) => text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
14
24
  const n = (v) => (Math.round(v * 10) / 10).toString();
25
+ /** A rocket painted black all over vanishes on the dark ground of a lineup, so it takes the line look's colour for its outline. Only the lines change: its shape and its figures stay. */
26
+ const edgeOf = (built, look) => {
27
+ if (look !== "painted")
28
+ return undefined;
29
+ const hulls = built.parts.flatMap((part) => part.pieces).filter((piece) => piece.kind === "lathe" && piece.body);
30
+ return hulls.length && hulls.every((piece) => piece.kind === "lathe" && MATERIALS[piece.material].fill === "dark") ? LOOKS.line.line : undefined;
31
+ };
15
32
  function comparison(id, x, base, unit, line, fill) {
16
33
  const { height, width } = COMPARES[id];
17
34
  const h = height * unit;
@@ -25,7 +42,19 @@ function comparison(id, x, base, unit, line, fill) {
25
42
  floors += `M${n(x)} ${n(base - (h * i) / 10)}h${n(w)}`;
26
43
  return `<rect x="${n(x)}" y="${n(base - h)}" width="${n(w)}" height="${n(h)}" fill="${fill}" stroke="${line}" stroke-width=".9"/><path d="${floors}" stroke="${line}" stroke-width=".35" opacity=".6"/>`;
27
44
  }
28
- /** The whole picture as SVG text. Unknown items are left out. */
45
+ /**
46
+ * The whole picture as SVG text. Unknown items are left out.
47
+ *
48
+ * @param options The items and how they are drawn.
49
+ * @returns The picture as SVG text, the items it holds, and its width and height.
50
+ * @example
51
+ * ```ts
52
+ * import { lineupSvg } from "@johnmorrisdotca/uchusen-rockets/build";
53
+ *
54
+ * const picture = lineupSvg({ items: ["falcon-9:block-5", "falcon-heavy:falcon-heavy", "person"], unit: 4, ruler: true });
55
+ * console.log(picture.items.length, picture.svg.startsWith("<svg"));
56
+ * ```
57
+ */
29
58
  export function lineupSvg(options) {
30
59
  const { items, unit, look = DEFAULT_LOOK, view = "front", ruler = true, labels = true } = options;
31
60
  const angle = VIEWS[cleanView(view)];
@@ -67,14 +96,16 @@ export function lineupSvg(options) {
67
96
  body.push(comparison(item.compare, cx - (COMPARES[item.compare].width * unit) / 2, base, unit, line, "url(#metal)"));
68
97
  else if (item.built) {
69
98
  const show = options.show && item.built.shows.includes(options.show) ? options.show : item.built.shows[0];
70
- const cam = orthographic(angle, unit, cx, base);
99
+ const faced = cleanView(view) === "front" ? variantOf(item.key.split(":")[0], item.key.split(":")[1])?.lineupView : undefined;
100
+ const facing = faced ? VIEWS[faced] : angle;
101
+ const cam = orthographic(facing, unit, cx, base);
71
102
  const places = item.built.placesOf(show).filter((place) => place.shown);
72
- const { right, forward } = axesOf(directionOf(angle));
73
- void right;
103
+ const { forward } = axesOf(directionOf(facing));
104
+ const edge = edgeOf(item.built, look);
74
105
  for (const place of places.sort((a, b) => b.at[0] * forward[0] + b.at[2] * forward[2] - a.at[0] * forward[0] - a.at[2] * forward[2])) {
75
106
  const part = item.built.parts.find((p) => p.slot === place.slot);
76
107
  if (part)
77
- body.push(drawPart(drawnPieces(part, show === "together"), place.at, cam, look, 0.7));
108
+ body.push(drawPart(drawnPieces(part, show === "together"), place.at, cam, look, 0.7, edge));
78
109
  }
79
110
  }
80
111
  if (labels) {
@@ -0,0 +1,68 @@
1
+ import { type Description, type FitReport } from "./fit.ts";
2
+ /**
3
+ * One part a row of the builder offers: its id, its name and the rocket it comes from.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { builderState, type BuilderOption } from "@johnmorrisdotca/uchusen-rockets";
8
+ *
9
+ * const first: BuilderOption | undefined = builderState().rows[0]?.options[0];
10
+ * console.log(first);
11
+ * ```
12
+ */
13
+ export interface BuilderOption {
14
+ id: string;
15
+ name: string;
16
+ /** Which rocket it comes from, to group a long list. */
17
+ rocket: string;
18
+ }
19
+ /**
20
+ * One row of the builder, from the bottom: what it chooses, the parts it offers, the one chosen, and whether the builder made the choice because only one part fits.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import { builderState, type BuilderRow } from "@johnmorrisdotca/uchusen-rockets";
25
+ *
26
+ * const row: BuilderRow | undefined = builderState().rows[0];
27
+ * console.log(row?.label, row?.chosen, row?.auto);
28
+ * ```
29
+ */
30
+ export interface BuilderRow {
31
+ /** What this row chooses. */
32
+ label: string;
33
+ options: readonly BuilderOption[];
34
+ chosen: string;
35
+ /** One answer only: the builder made the choice. */
36
+ auto: boolean;
37
+ }
38
+ /**
39
+ * What the builder shows for a set of picks: its rows, the description they make and the fit report for it.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { builderState, type BuilderState } from "@johnmorrisdotca/uchusen-rockets";
44
+ *
45
+ * const state: BuilderState = builderState();
46
+ * console.log(state.rows.length, state.report.ok);
47
+ * ```
48
+ */
49
+ export interface BuilderState {
50
+ rows: readonly BuilderRow[];
51
+ description: Description;
52
+ report: FitReport;
53
+ }
54
+ /**
55
+ * The rows for these picks, from the bottom. A pick that is not offered, for a change lower down or a hostile value, gives way to the part that belongs with what is below, or else the first that fits.
56
+ *
57
+ * @param picks The part ids chosen so far, row by row from the bottom. Leave it out to start.
58
+ * @returns The rows to show, the description they make and its fit report.
59
+ * @example
60
+ * ```ts
61
+ * import { builderState } from "@johnmorrisdotca/uchusen-rockets";
62
+ *
63
+ * const start = builderState();
64
+ * const next = builderState([start.rows[0]?.chosen ?? ""]);
65
+ * console.log(next.description, next.report.label);
66
+ * ```
67
+ */
68
+ export declare function builderState(picks?: readonly string[]): BuilderState;
@@ -0,0 +1,116 @@
1
+ // What the part builder offers. A rocket from parts of every rocket, row by row from the bottom: each row offers only what fits on the row below, a row with one answer is answered for the reader, and a change lower down carries what still fits and makes a fresh choice for the rest. So the builder can never reach a rocket that does not go together, and `check` still has the last word. Everything comes from `ROCKETS` and `PART_ENTRIES`, so a new rocket is offered with no change here. Pure.
2
+ import { check, JOINT_TOLERANCE } from "./fit.js";
3
+ import { partEntry, PART_ENTRIES } from "./model/registry.js";
4
+ import { partIdOf, ROCKETS, SLOT_NAMES } from "./rockets.js";
5
+ function framesOf() {
6
+ const frames = [];
7
+ for (const rocket of Object.values(ROCKETS))
8
+ for (const variant of rocket.variants) {
9
+ const homes = variant.slots.map((slot) => partEntry(partIdOf(variant.rocket, variant.id, slot))?.record);
10
+ if (homes.every(Boolean))
11
+ frames.push({ rocket: rocket.id, variant: variant.id, slots: variant.slots, homes: homes });
12
+ }
13
+ return frames;
14
+ }
15
+ /** A part can stand in a slot when it is the same kind of part and joins the same ways as the slot's own. */
16
+ const sameShape = (part, home) => part.kind === home.kind && Boolean(part.joints.top) === Boolean(home.joints.top) && Boolean(part.joints.bottom) === Boolean(home.joints.bottom) && part.strapOn?.x === home.strapOn?.x && part.strapOn?.z === home.strapOn?.z;
17
+ /** It sits on what is below it. */
18
+ const fitsOn = (part, below) => {
19
+ if (!below)
20
+ return true;
21
+ const { top } = below.joints;
22
+ const { bottom } = part.joints;
23
+ return Boolean(top && bottom && top.kind === bottom.kind && Math.abs(top.diameter - bottom.diameter) <= JOINT_TOLERANCE);
24
+ };
25
+ const REAL_PARTS = () => PART_ENTRIES.map(({ record }) => record).filter((record) => record.trueTo.length > 0);
26
+ const optionOf = (part) => ({ id: part.id, name: part.name, rocket: ROCKETS[part.rocket]?.name ?? part.rocket });
27
+ /**
28
+ * The rows for these picks, from the bottom. A pick that is not offered, for a change lower down or a hostile value, gives way to the part that belongs with what is below, or else the first that fits.
29
+ *
30
+ * @param picks The part ids chosen so far, row by row from the bottom. Leave it out to start.
31
+ * @returns The rows to show, the description they make and its fit report.
32
+ * @example
33
+ * ```ts
34
+ * import { builderState } from "@johnmorrisdotca/uchusen-rockets";
35
+ *
36
+ * const start = builderState();
37
+ * const next = builderState([start.rows[0]?.chosen ?? ""]);
38
+ * console.log(next.description, next.report.label);
39
+ * ```
40
+ */
41
+ export function builderState(picks = []) {
42
+ const every = framesOf();
43
+ const parts = REAL_PARTS();
44
+ const rows = [];
45
+ const chosen = [];
46
+ // Only what can still be finished is offered: nothing on any row leads to a rocket with a part missing.
47
+ const known = new Map();
48
+ const finishes = (frame, row, below, foot) => {
49
+ if (row >= frame.slots.length)
50
+ return true;
51
+ const key = `${frame.rocket}/${frame.variant}/${row}/${below?.id}/${foot.id}`;
52
+ let answer = known.get(key);
53
+ if (answer === undefined) {
54
+ answer = fitting(frame, row, below, foot).length > 0;
55
+ known.set(key, answer);
56
+ }
57
+ return answer;
58
+ };
59
+ const fitting = (frame, row, below, foot) => {
60
+ const home = frame.homes[row];
61
+ // a part placed rather than stacked has no joint to mix at: it stands where its own variant puts it, by its own foot
62
+ if (home.strapOn)
63
+ return frame.homes[0].id === foot.id && finishes(frame, row + 1, below, foot) ? [home] : [];
64
+ return parts.filter((part) => sameShape(part, home) && fitsOn(part, below) && finishes(frame, row + 1, part, foot));
65
+ };
66
+ let alive = every;
67
+ for (let row = 0; alive.some((frame) => frame.slots.length > row); row++) {
68
+ // what a part sits on is the last one stacked: one placed beside the stack, a side booster or an orbiter, holds nothing up
69
+ const below = chosen.findLast((part) => !part.strapOn);
70
+ const candidates = (frame) => {
71
+ if (row >= frame.slots.length)
72
+ return [];
73
+ // the bottom row offers each rocket's own foot: what stands on it is what mixes
74
+ if (row === 0)
75
+ return [frame.homes[0]];
76
+ return fitting(frame, row, below, chosen[0]);
77
+ };
78
+ const offered = new Map();
79
+ for (const frame of alive)
80
+ for (const part of candidates(frame))
81
+ offered.set(part.id, part);
82
+ if (offered.size === 0)
83
+ break;
84
+ const options = [...offered.values()];
85
+ const asked = picks[row];
86
+ const pick = (asked !== undefined && offered.get(asked)) ||
87
+ // the next part of the real vehicle that everything so far belongs to, when there is one
88
+ alive.flatMap((frame) => (frame.slots.length > row && chosen.every((part, i) => frame.homes[i].id === part.id) ? [frame.homes[row]] : [])).find((part) => offered.has(part.id)) ||
89
+ // the part that flew with what is below it, when there is one
90
+ (below && options.find((part) => part.rocket === below.rocket && part.trueTo.some((id) => below.trueTo.includes(id)))) ||
91
+ options[0];
92
+ chosen.push(pick);
93
+ // the bottom row's own frames share one foot by shape; above it a frame stays while it can take the pick
94
+ alive = row === 0 ? every.filter((frame) => sameShape(pick, frame.homes[0])) : alive.filter((frame) => candidates(frame).some((part) => part.id === pick.id));
95
+ const slots = [...new Set(alive.filter((frame) => row < frame.slots.length).map((frame) => frame.slots[row]))];
96
+ rows.push({ label: slots.map((slot) => SLOT_NAMES[slot] ?? slot).join(" or "), options: options.map(optionOf), chosen: pick.id, auto: options.length === 1 });
97
+ // a real vehicle whole: nothing goes on top of it, even where a longer one shares its shape so far
98
+ if (alive.some((frame) => frame.slots.length === chosen.length && frame.homes.every((home, i) => home.id === chosen[i].id)))
99
+ break;
100
+ }
101
+ const whole = alive.filter((frame) => frame.slots.length === chosen.length);
102
+ const chosenSlot = (description) => whole.find((frame) => frame.rocket === description.rocket && frame.variant === description.variant)?.slots[0] ?? "";
103
+ const described = whole.map((frame) => {
104
+ const named = Object.fromEntries(frame.slots.flatMap((slot, i) => (frame.homes[i].id === chosen[i].id ? [] : [[slot, chosen[i].id]])));
105
+ return { rocket: frame.rocket, variant: frame.variant, ...(Object.keys(named).length > 0 ? { parts: named } : {}) };
106
+ });
107
+ // the name of a real vehicle where these parts are one; a custom build otherwise, and it says so
108
+ // and, of those, the version it has most parts of, so a custom build is said the plainest way
109
+ const swapped = (description) => Object.keys(description.parts ?? {});
110
+ const reports = described
111
+ // a tie goes to the version of the bottom part: it is the one the reader chose first
112
+ .sort((a, b) => swapped(a).length - swapped(b).length || Number(swapped(a).includes(chosenSlot(a))) - Number(swapped(b).includes(chosenSlot(b))))
113
+ .map((description) => ({ description, report: check(description) }));
114
+ const best = reports.find(({ report }) => report.ok && !report.custom) ?? reports.find(({ report }) => report.ok) ?? reports[0];
115
+ return { rows, description: best.description, report: best.report };
116
+ }