@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.
- package/CHANGELOG.md +55 -5
- package/LICENSES/ODbL-1.0.txt +540 -0
- package/NOTICE.md +56 -6
- package/README.md +288 -16
- package/dist/assets/apollo-soyuz-apollo-soyuz-apart.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-apart.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-apart.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-apart.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-apart.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-apart.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.glb +0 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.glb +0 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2.glb +0 -0
- package/dist/assets/dragon-cargo-dragon-2.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2.thick.svg +1 -0
- package/dist/assets/dragon-crew-dragon-inside.glb +0 -0
- package/dist/assets/dragon-crew-dragon-inside.painted.svg +1 -0
- package/dist/assets/dragon-crew-dragon-inside.svg +1 -0
- package/dist/assets/dragon-crew-dragon-inside.thick.svg +1 -0
- package/dist/assets/dragon-dragon-1-apart.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1-apart.svg +1 -1
- package/dist/assets/dragon-dragon-1-apart.thick.svg +1 -1
- package/dist/assets/dragon-dragon-1-capsule.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1-capsule.svg +1 -1
- package/dist/assets/dragon-dragon-1-capsule.thick.svg +1 -1
- package/dist/assets/dragon-dragon-1-trunk.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1-trunk.svg +1 -1
- package/dist/assets/dragon-dragon-1-trunk.thick.svg +1 -1
- package/dist/assets/dragon-dragon-1.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1.svg +1 -1
- package/dist/assets/dragon-dragon-1.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2-apart.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2-apart.svg +1 -1
- package/dist/assets/dragon-dragon-2-apart.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2-capsule.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2-capsule.svg +1 -1
- package/dist/assets/dragon-dragon-2-capsule.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2-trunk.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2-trunk.svg +1 -1
- package/dist/assets/dragon-dragon-2-trunk.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2.svg +1 -1
- package/dist/assets/dragon-dragon-2.thick.svg +1 -1
- package/dist/assets/droneship-asog-apart.painted.svg +1 -0
- package/dist/assets/droneship-asog-apart.svg +1 -0
- package/dist/assets/droneship-asog-apart.thick.svg +1 -0
- package/dist/assets/droneship-asog-deck.glb +0 -0
- package/dist/assets/droneship-asog-deck.painted.svg +1 -0
- package/dist/assets/droneship-asog-deck.svg +1 -0
- package/dist/assets/droneship-asog-deck.thick.svg +1 -0
- package/dist/assets/droneship-asog-landed.glb +0 -0
- package/dist/assets/droneship-asog-landed.painted.svg +1 -0
- package/dist/assets/droneship-asog-landed.svg +1 -0
- package/dist/assets/droneship-asog-landed.thick.svg +1 -0
- package/dist/assets/droneship-asog.glb +0 -0
- package/dist/assets/droneship-asog.painted.svg +1 -0
- package/dist/assets/droneship-asog.svg +1 -0
- package/dist/assets/droneship-asog.thick.svg +1 -0
- package/dist/assets/droneship-jrti-apart.painted.svg +1 -0
- package/dist/assets/droneship-jrti-apart.svg +1 -0
- package/dist/assets/droneship-jrti-apart.thick.svg +1 -0
- package/dist/assets/droneship-jrti-deck.glb +0 -0
- package/dist/assets/droneship-jrti-deck.painted.svg +1 -0
- package/dist/assets/droneship-jrti-deck.svg +1 -0
- package/dist/assets/droneship-jrti-deck.thick.svg +1 -0
- package/dist/assets/droneship-jrti-landed.glb +0 -0
- package/dist/assets/droneship-jrti-landed.painted.svg +1 -0
- package/dist/assets/droneship-jrti-landed.svg +1 -0
- package/dist/assets/droneship-jrti-landed.thick.svg +1 -0
- package/dist/assets/droneship-jrti.glb +0 -0
- package/dist/assets/droneship-jrti.painted.svg +1 -0
- package/dist/assets/droneship-jrti.svg +1 -0
- package/dist/assets/droneship-jrti.thick.svg +1 -0
- package/dist/assets/droneship-ocisly-apart.painted.svg +1 -0
- package/dist/assets/droneship-ocisly-apart.svg +1 -0
- package/dist/assets/droneship-ocisly-apart.thick.svg +1 -0
- package/dist/assets/droneship-ocisly-deck.glb +0 -0
- package/dist/assets/droneship-ocisly-deck.painted.svg +1 -0
- package/dist/assets/droneship-ocisly-deck.svg +1 -0
- package/dist/assets/droneship-ocisly-deck.thick.svg +1 -0
- package/dist/assets/droneship-ocisly-landed.glb +0 -0
- package/dist/assets/droneship-ocisly-landed.painted.svg +1 -0
- package/dist/assets/droneship-ocisly-landed.svg +1 -0
- package/dist/assets/droneship-ocisly-landed.thick.svg +1 -0
- package/dist/assets/droneship-ocisly.glb +0 -0
- package/dist/assets/droneship-ocisly.painted.svg +1 -0
- package/dist/assets/droneship-ocisly.svg +1 -0
- package/dist/assets/droneship-ocisly.thick.svg +1 -0
- package/dist/assets/electron-electron-adapter.glb +0 -0
- package/dist/assets/electron-electron-adapter.painted.svg +1 -0
- package/dist/assets/electron-electron-adapter.svg +1 -0
- package/dist/assets/electron-electron-adapter.thick.svg +1 -0
- package/dist/assets/electron-electron-apart.painted.svg +1 -0
- package/dist/assets/electron-electron-apart.svg +1 -0
- package/dist/assets/electron-electron-apart.thick.svg +1 -0
- package/dist/assets/electron-electron-fairing.glb +0 -0
- package/dist/assets/electron-electron-fairing.painted.svg +1 -0
- package/dist/assets/electron-electron-fairing.svg +1 -0
- package/dist/assets/electron-electron-fairing.thick.svg +1 -0
- package/dist/assets/electron-electron-first-stage.glb +0 -0
- package/dist/assets/electron-electron-first-stage.painted.svg +1 -0
- package/dist/assets/electron-electron-first-stage.svg +1 -0
- package/dist/assets/electron-electron-first-stage.thick.svg +1 -0
- package/dist/assets/electron-electron-second-stage.glb +0 -0
- package/dist/assets/electron-electron-second-stage.painted.svg +1 -0
- package/dist/assets/electron-electron-second-stage.svg +1 -0
- package/dist/assets/electron-electron-second-stage.thick.svg +1 -0
- package/dist/assets/electron-electron.glb +0 -0
- package/dist/assets/electron-electron.painted.svg +1 -0
- package/dist/assets/electron-electron.svg +1 -0
- package/dist/assets/electron-electron.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-apart.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-apart.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-apart.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-fairing.glb +0 -0
- package/dist/assets/falcon-1-falcon-1-fairing.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-fairing.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-fairing.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1.glb +0 -0
- package/dist/assets/falcon-1-falcon-1.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1.svg +1 -0
- package/dist/assets/falcon-1-falcon-1.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-apart.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-apart.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-apart.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e.thick.svg +1 -0
- package/dist/assets/falcon-9-block-5-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-apart.svg +1 -1
- package/dist/assets/falcon-9-block-5-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-apart.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-capsule.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-capsule.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-capsule.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-first-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-second-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-trunk.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-trunk.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-trunk.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-fairing.svg +1 -1
- package/dist/assets/falcon-9-block-5-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-first-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-second-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5.svg +1 -1
- package/dist/assets/falcon-9-block-5.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-apart.svg +1 -1
- package/dist/assets/falcon-9-ft-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-fairing.svg +1 -1
- package/dist/assets/falcon-9-ft-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-first-stage.svg +1 -1
- package/dist/assets/falcon-9-ft-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-second-stage.svg +1 -1
- package/dist/assets/falcon-9-ft-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-ft.painted.svg +1 -1
- package/dist/assets/falcon-9-ft.svg +1 -1
- package/dist/assets/falcon-9-ft.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-apart.svg +1 -1
- package/dist/assets/falcon-9-v1.0-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-fairing.svg +1 -1
- package/dist/assets/falcon-9-v1.0-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-first-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.0-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-second-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.0-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0.svg +1 -1
- package/dist/assets/falcon-9-v1.0.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-apart.svg +1 -1
- package/dist/assets/falcon-9-v1.1-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-fairing.svg +1 -1
- package/dist/assets/falcon-9-v1.1-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-first-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.1-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-second-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.1-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1.svg +1 -1
- package/dist/assets/falcon-9-v1.1.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-apart.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-apart.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-apart.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-centre.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-centre.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-centre.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-left.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-left.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-left.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-right.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-right.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-right.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy.thick.svg +1 -1
- package/dist/assets/gemini-gemini-adapter.glb +0 -0
- package/dist/assets/gemini-gemini-adapter.painted.svg +1 -0
- package/dist/assets/gemini-gemini-adapter.svg +1 -0
- package/dist/assets/gemini-gemini-adapter.thick.svg +1 -0
- package/dist/assets/gemini-gemini-apart.painted.svg +1 -0
- package/dist/assets/gemini-gemini-apart.svg +1 -0
- package/dist/assets/gemini-gemini-apart.thick.svg +1 -0
- package/dist/assets/gemini-gemini-capsule.glb +0 -0
- package/dist/assets/gemini-gemini-capsule.painted.svg +1 -0
- package/dist/assets/gemini-gemini-capsule.svg +1 -0
- package/dist/assets/gemini-gemini-capsule.thick.svg +1 -0
- package/dist/assets/gemini-gemini.glb +0 -0
- package/dist/assets/gemini-gemini.painted.svg +1 -0
- package/dist/assets/gemini-gemini.svg +1 -0
- package/dist/assets/gemini-gemini.thick.svg +1 -0
- package/dist/assets/grasshopper-grasshopper.painted.svg +1 -1
- package/dist/assets/grasshopper-grasshopper.svg +1 -1
- package/dist/assets/grasshopper-grasshopper.thick.svg +1 -1
- package/dist/assets/hubble-hubble.glb +0 -0
- package/dist/assets/hubble-hubble.painted.svg +1 -0
- package/dist/assets/hubble-hubble.svg +1 -0
- package/dist/assets/hubble-hubble.thick.svg +1 -0
- package/dist/assets/iss-iss.glb +0 -0
- package/dist/assets/iss-iss.painted.svg +1 -0
- package/dist/assets/iss-iss.svg +1 -0
- package/dist/assets/iss-iss.thick.svg +1 -0
- package/dist/assets/jupiter-c-jupiter-c.glb +0 -0
- package/dist/assets/jupiter-c-jupiter-c.painted.svg +1 -0
- package/dist/assets/jupiter-c-jupiter-c.svg +1 -0
- package/dist/assets/jupiter-c-jupiter-c.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1-apart.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1-apart.svg +1 -0
- package/dist/assets/landing-zone-lz-1-apart.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1-landed.glb +0 -0
- package/dist/assets/landing-zone-lz-1-landed.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1-landed.svg +1 -0
- package/dist/assets/landing-zone-lz-1-landed.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1-pad.glb +0 -0
- package/dist/assets/landing-zone-lz-1-pad.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1-pad.svg +1 -0
- package/dist/assets/landing-zone-lz-1-pad.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1.glb +0 -0
- package/dist/assets/landing-zone-lz-1.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1.svg +1 -0
- package/dist/assets/landing-zone-lz-1.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4-apart.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4-apart.svg +1 -0
- package/dist/assets/landing-zone-lz-4-apart.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4-landed.glb +0 -0
- package/dist/assets/landing-zone-lz-4-landed.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4-landed.svg +1 -0
- package/dist/assets/landing-zone-lz-4-landed.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4-pad.glb +0 -0
- package/dist/assets/landing-zone-lz-4-pad.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4-pad.svg +1 -0
- package/dist/assets/landing-zone-lz-4-pad.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4.glb +0 -0
- package/dist/assets/landing-zone-lz-4.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4.svg +1 -0
- package/dist/assets/landing-zone-lz-4.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-apart.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-apart.svg +1 -0
- package/dist/assets/launch-tower-catch-apart.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-arms.glb +0 -0
- package/dist/assets/launch-tower-catch-arms.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-arms.svg +1 -0
- package/dist/assets/launch-tower-catch-arms.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-booster.glb +0 -0
- package/dist/assets/launch-tower-catch-booster.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-booster.svg +1 -0
- package/dist/assets/launch-tower-catch-booster.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-mount.glb +0 -0
- package/dist/assets/launch-tower-catch-mount.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-mount.svg +1 -0
- package/dist/assets/launch-tower-catch-mount.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-tower.glb +0 -0
- package/dist/assets/launch-tower-catch-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-tower.svg +1 -0
- package/dist/assets/launch-tower-catch-tower.thick.svg +1 -0
- package/dist/assets/launch-tower-catch.glb +0 -0
- package/dist/assets/launch-tower-catch.painted.svg +1 -0
- package/dist/assets/launch-tower-catch.svg +1 -0
- package/dist/assets/launch-tower-catch.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-apart.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-apart.svg +1 -0
- package/dist/assets/launch-tower-stack-apart.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-arms.glb +0 -0
- package/dist/assets/launch-tower-stack-arms.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-arms.svg +1 -0
- package/dist/assets/launch-tower-stack-arms.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-booster.glb +0 -0
- package/dist/assets/launch-tower-stack-booster.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-booster.svg +1 -0
- package/dist/assets/launch-tower-stack-booster.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-mount.glb +0 -0
- package/dist/assets/launch-tower-stack-mount.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-mount.svg +1 -0
- package/dist/assets/launch-tower-stack-mount.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-ship.glb +0 -0
- package/dist/assets/launch-tower-stack-ship.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-ship.svg +1 -0
- package/dist/assets/launch-tower-stack-ship.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-tower.glb +0 -0
- package/dist/assets/launch-tower-stack-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-tower.svg +1 -0
- package/dist/assets/launch-tower-stack-tower.thick.svg +1 -0
- package/dist/assets/launch-tower-stack.glb +0 -0
- package/dist/assets/launch-tower-stack.painted.svg +1 -0
- package/dist/assets/launch-tower-stack.svg +1 -0
- package/dist/assets/launch-tower-stack.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-apart.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-apart.svg +1 -0
- package/dist/assets/launch-tower-tower-apart.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-arms.glb +0 -0
- package/dist/assets/launch-tower-tower-arms.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-arms.svg +1 -0
- package/dist/assets/launch-tower-tower-arms.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-mount.glb +0 -0
- package/dist/assets/launch-tower-tower-mount.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-mount.svg +1 -0
- package/dist/assets/launch-tower-tower-mount.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-tower.glb +0 -0
- package/dist/assets/launch-tower-tower-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-tower.svg +1 -0
- package/dist/assets/launch-tower-tower-tower.thick.svg +1 -0
- package/dist/assets/launch-tower-tower.glb +0 -0
- package/dist/assets/launch-tower-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-tower.svg +1 -0
- package/dist/assets/launch-tower-tower.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-apart.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-apart.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-apart.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-ascent.glb +0 -0
- package/dist/assets/lunar-module-lunar-module-ascent.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-ascent.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-ascent.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-descent.glb +0 -0
- package/dist/assets/lunar-module-lunar-module-descent.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-descent.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-descent.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module.glb +0 -0
- package/dist/assets/lunar-module-lunar-module.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module.svg +1 -0
- package/dist/assets/lunar-module-lunar-module.thick.svg +1 -0
- package/dist/assets/mercury-friendship-7.glb +0 -0
- package/dist/assets/mercury-friendship-7.painted.svg +1 -0
- package/dist/assets/mercury-friendship-7.svg +1 -0
- package/dist/assets/mercury-friendship-7.thick.svg +1 -0
- package/dist/assets/models/apollo-soyuz-csm.glb +0 -0
- package/dist/assets/models/apollo-soyuz-docking-module.glb +0 -0
- package/dist/assets/models/apollo-soyuz-soyuz.glb +0 -0
- package/dist/assets/models/gemini-adapter.glb +0 -0
- package/dist/assets/models/gemini-capsule.glb +0 -0
- package/dist/assets/models/hubble-telescope.glb +0 -0
- package/dist/assets/models/iss-station.glb +0 -0
- package/dist/assets/models/jupiter-c-vehicle.glb +0 -0
- package/dist/assets/models/lunar-module-ascent.glb +0 -0
- package/dist/assets/models/lunar-module-descent.glb +0 -0
- package/dist/assets/models/mercury-capsule.glb +0 -0
- package/dist/assets/models/space-shuttle-discovery-orbiter.glb +0 -0
- package/dist/assets/models/space-shuttle-stack-external-tank.glb +0 -0
- package/dist/assets/models/space-shuttle-stack-orbiter.glb +0 -0
- package/dist/assets/models/space-shuttle-stack-srb.glb +0 -0
- package/dist/assets/new-glenn-7x2-apart.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-apart.svg +1 -0
- package/dist/assets/new-glenn-7x2-apart.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2-fairing.glb +0 -0
- package/dist/assets/new-glenn-7x2-fairing.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-fairing.svg +1 -0
- package/dist/assets/new-glenn-7x2-fairing.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2-first-stage.glb +0 -0
- package/dist/assets/new-glenn-7x2-first-stage.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-first-stage.svg +1 -0
- package/dist/assets/new-glenn-7x2-first-stage.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2-second-stage.glb +0 -0
- package/dist/assets/new-glenn-7x2-second-stage.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-second-stage.svg +1 -0
- package/dist/assets/new-glenn-7x2-second-stage.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2.glb +0 -0
- package/dist/assets/new-glenn-7x2.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2.svg +1 -0
- package/dist/assets/new-glenn-7x2.thick.svg +1 -0
- package/dist/assets/parts/flap-aft.painted.svg +1 -1
- package/dist/assets/parts/flap-aft.svg +1 -1
- package/dist/assets/parts/flap-aft.thick.svg +1 -1
- package/dist/assets/parts/flap-forward.painted.svg +1 -1
- package/dist/assets/parts/flap-forward.svg +1 -1
- package/dist/assets/parts/flap-forward.thick.svg +1 -1
- package/dist/assets/parts/grid-fin-four.painted.svg +1 -1
- package/dist/assets/parts/grid-fin-four.svg +1 -1
- package/dist/assets/parts/grid-fin-four.thick.svg +1 -1
- package/dist/assets/parts/grid-fin-three.painted.svg +1 -1
- package/dist/assets/parts/grid-fin-three.svg +1 -1
- package/dist/assets/parts/grid-fin-three.thick.svg +1 -1
- package/dist/assets/parts/merlin-sea-level.painted.svg +1 -1
- package/dist/assets/parts/merlin-sea-level.svg +1 -1
- package/dist/assets/parts/merlin-sea-level.thick.svg +1 -1
- package/dist/assets/parts/raptor-sea-level.painted.svg +1 -1
- package/dist/assets/parts/raptor-sea-level.svg +1 -1
- package/dist/assets/parts/raptor-sea-level.thick.svg +1 -1
- package/dist/assets/parts/raptor-vacuum.painted.svg +1 -1
- package/dist/assets/parts/raptor-vacuum.svg +1 -1
- package/dist/assets/parts/raptor-vacuum.thick.svg +1 -1
- package/dist/assets/saturn-v-saturn-v-adapter.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-adapter.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-adapter.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-adapter.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-apart.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-apart.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-apart.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-capsule.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-capsule.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-capsule.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-capsule.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-service-module.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-service-module.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-service-module.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-service-module.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v.glb +0 -0
- package/dist/assets/saturn-v-saturn-v.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v.svg +1 -0
- package/dist/assets/saturn-v-saturn-v.thick.svg +1 -0
- package/dist/assets/sls-block-1-apart.painted.svg +1 -0
- package/dist/assets/sls-block-1-apart.svg +1 -0
- package/dist/assets/sls-block-1-apart.thick.svg +1 -0
- package/dist/assets/sls-block-1-capsule.glb +0 -0
- package/dist/assets/sls-block-1-capsule.painted.svg +1 -0
- package/dist/assets/sls-block-1-capsule.svg +1 -0
- package/dist/assets/sls-block-1-capsule.thick.svg +1 -0
- package/dist/assets/sls-block-1-escape-tower.glb +0 -0
- package/dist/assets/sls-block-1-escape-tower.painted.svg +1 -0
- package/dist/assets/sls-block-1-escape-tower.svg +1 -0
- package/dist/assets/sls-block-1-escape-tower.thick.svg +1 -0
- package/dist/assets/sls-block-1-first-stage.glb +0 -0
- package/dist/assets/sls-block-1-first-stage.painted.svg +1 -0
- package/dist/assets/sls-block-1-first-stage.svg +1 -0
- package/dist/assets/sls-block-1-first-stage.thick.svg +1 -0
- package/dist/assets/sls-block-1-service-module.glb +0 -0
- package/dist/assets/sls-block-1-service-module.painted.svg +1 -0
- package/dist/assets/sls-block-1-service-module.svg +1 -0
- package/dist/assets/sls-block-1-service-module.thick.svg +1 -0
- package/dist/assets/sls-block-1-srb-left.glb +0 -0
- package/dist/assets/sls-block-1-srb-left.painted.svg +1 -0
- package/dist/assets/sls-block-1-srb-left.svg +1 -0
- package/dist/assets/sls-block-1-srb-left.thick.svg +1 -0
- package/dist/assets/sls-block-1-srb-right.glb +0 -0
- package/dist/assets/sls-block-1-srb-right.painted.svg +1 -0
- package/dist/assets/sls-block-1-srb-right.svg +1 -0
- package/dist/assets/sls-block-1-srb-right.thick.svg +1 -0
- package/dist/assets/sls-block-1-upper-stage.glb +0 -0
- package/dist/assets/sls-block-1-upper-stage.painted.svg +1 -0
- package/dist/assets/sls-block-1-upper-stage.svg +1 -0
- package/dist/assets/sls-block-1-upper-stage.thick.svg +1 -0
- package/dist/assets/sls-block-1.glb +0 -0
- package/dist/assets/sls-block-1.painted.svg +1 -0
- package/dist/assets/sls-block-1.svg +1 -0
- package/dist/assets/sls-block-1.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-apart.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-apart.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-apart.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-fairing.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-fairing.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-fairing.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-fairing.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2.glb +0 -0
- package/dist/assets/soyuz-soyuz-2.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2.svg +1 -0
- package/dist/assets/soyuz-soyuz-2.thick.svg +1 -0
- package/dist/assets/space-shuttle-discovery.glb +0 -0
- package/dist/assets/space-shuttle-discovery.painted.svg +1 -0
- package/dist/assets/space-shuttle-discovery.svg +1 -0
- package/dist/assets/space-shuttle-discovery.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-apart.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-apart.svg +1 -0
- package/dist/assets/space-shuttle-stack-apart.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-external-tank.glb +0 -0
- package/dist/assets/space-shuttle-stack-external-tank.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-external-tank.svg +1 -0
- package/dist/assets/space-shuttle-stack-external-tank.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-orbiter.glb +0 -0
- package/dist/assets/space-shuttle-stack-orbiter.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-orbiter.svg +1 -0
- package/dist/assets/space-shuttle-stack-orbiter.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-left.glb +0 -0
- package/dist/assets/space-shuttle-stack-srb-left.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-left.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-left.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-right.glb +0 -0
- package/dist/assets/space-shuttle-stack-srb-right.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-right.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-right.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack.glb +0 -0
- package/dist/assets/space-shuttle-stack.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack.svg +1 -0
- package/dist/assets/space-shuttle-stack.thick.svg +1 -0
- package/dist/assets/starbase-build-site-apart.painted.svg +1 -0
- package/dist/assets/starbase-build-site-apart.svg +1 -0
- package/dist/assets/starbase-build-site-apart.thick.svg +1 -0
- package/dist/assets/starbase-build-site-garden.glb +0 -0
- package/dist/assets/starbase-build-site-garden.painted.svg +1 -0
- package/dist/assets/starbase-build-site-garden.svg +1 -0
- package/dist/assets/starbase-build-site-garden.thick.svg +1 -0
- package/dist/assets/starbase-build-site-ground.glb +0 -0
- package/dist/assets/starbase-build-site-ground.painted.svg +1 -0
- package/dist/assets/starbase-build-site-ground.svg +1 -0
- package/dist/assets/starbase-build-site-ground.thick.svg +1 -0
- package/dist/assets/starbase-build-site-mega-bays.glb +0 -0
- package/dist/assets/starbase-build-site-mega-bays.painted.svg +1 -0
- package/dist/assets/starbase-build-site-mega-bays.svg +1 -0
- package/dist/assets/starbase-build-site-mega-bays.thick.svg +1 -0
- package/dist/assets/starbase-build-site-sign.glb +0 -0
- package/dist/assets/starbase-build-site-sign.painted.svg +1 -0
- package/dist/assets/starbase-build-site-sign.svg +1 -0
- package/dist/assets/starbase-build-site-sign.thick.svg +1 -0
- package/dist/assets/starbase-build-site-starfactory.glb +0 -0
- package/dist/assets/starbase-build-site-starfactory.painted.svg +1 -0
- package/dist/assets/starbase-build-site-starfactory.svg +1 -0
- package/dist/assets/starbase-build-site-starfactory.thick.svg +1 -0
- package/dist/assets/starbase-build-site.glb +0 -0
- package/dist/assets/starbase-build-site.painted.svg +1 -0
- package/dist/assets/starbase-build-site.svg +1 -0
- package/dist/assets/starbase-build-site.thick.svg +1 -0
- package/dist/assets/starbase-city-apart.painted.svg +1 -0
- package/dist/assets/starbase-city-apart.svg +1 -0
- package/dist/assets/starbase-city-apart.thick.svg +1 -0
- package/dist/assets/starbase-city-garden.glb +0 -0
- package/dist/assets/starbase-city-garden.painted.svg +1 -0
- package/dist/assets/starbase-city-garden.svg +1 -0
- package/dist/assets/starbase-city-garden.thick.svg +1 -0
- package/dist/assets/starbase-city-ground.glb +0 -0
- package/dist/assets/starbase-city-ground.painted.svg +1 -0
- package/dist/assets/starbase-city-ground.svg +1 -0
- package/dist/assets/starbase-city-ground.thick.svg +1 -0
- package/dist/assets/starbase-city-mega-bays.glb +0 -0
- package/dist/assets/starbase-city-mega-bays.painted.svg +1 -0
- package/dist/assets/starbase-city-mega-bays.svg +1 -0
- package/dist/assets/starbase-city-mega-bays.thick.svg +1 -0
- package/dist/assets/starbase-city-on-pad.glb +0 -0
- package/dist/assets/starbase-city-on-pad.painted.svg +1 -0
- package/dist/assets/starbase-city-on-pad.svg +1 -0
- package/dist/assets/starbase-city-on-pad.thick.svg +1 -0
- package/dist/assets/starbase-city-pads.glb +0 -0
- package/dist/assets/starbase-city-pads.painted.svg +1 -0
- package/dist/assets/starbase-city-pads.svg +1 -0
- package/dist/assets/starbase-city-pads.thick.svg +1 -0
- package/dist/assets/starbase-city-sign.glb +0 -0
- package/dist/assets/starbase-city-sign.painted.svg +1 -0
- package/dist/assets/starbase-city-sign.svg +1 -0
- package/dist/assets/starbase-city-sign.thick.svg +1 -0
- package/dist/assets/starbase-city-starfactory.glb +0 -0
- package/dist/assets/starbase-city-starfactory.painted.svg +1 -0
- package/dist/assets/starbase-city-starfactory.svg +1 -0
- package/dist/assets/starbase-city-starfactory.thick.svg +1 -0
- package/dist/assets/starbase-city-tank-farm.glb +0 -0
- package/dist/assets/starbase-city-tank-farm.painted.svg +1 -0
- package/dist/assets/starbase-city-tank-farm.svg +1 -0
- package/dist/assets/starbase-city-tank-farm.thick.svg +1 -0
- package/dist/assets/starbase-city-village.glb +0 -0
- package/dist/assets/starbase-city-village.painted.svg +1 -0
- package/dist/assets/starbase-city-village.svg +1 -0
- package/dist/assets/starbase-city-village.thick.svg +1 -0
- package/dist/assets/starbase-city.glb +0 -0
- package/dist/assets/starbase-city.painted.svg +1 -0
- package/dist/assets/starbase-city.svg +1 -0
- package/dist/assets/starbase-city.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-apart.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-apart.svg +1 -0
- package/dist/assets/starbase-launch-site-apart.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-ground.glb +0 -0
- package/dist/assets/starbase-launch-site-ground.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-ground.svg +1 -0
- package/dist/assets/starbase-launch-site-ground.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-on-pad.glb +0 -0
- package/dist/assets/starbase-launch-site-on-pad.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-on-pad.svg +1 -0
- package/dist/assets/starbase-launch-site-on-pad.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-pads.glb +0 -0
- package/dist/assets/starbase-launch-site-pads.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-pads.svg +1 -0
- package/dist/assets/starbase-launch-site-pads.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-tank-farm.glb +0 -0
- package/dist/assets/starbase-launch-site-tank-farm.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-tank-farm.svg +1 -0
- package/dist/assets/starbase-launch-site-tank-farm.thick.svg +1 -0
- package/dist/assets/starbase-launch-site.glb +0 -0
- package/dist/assets/starbase-launch-site.painted.svg +1 -0
- package/dist/assets/starbase-launch-site.svg +1 -0
- package/dist/assets/starbase-launch-site.thick.svg +1 -0
- package/dist/assets/starship-2019.painted.svg +1 -1
- package/dist/assets/starship-2019.svg +1 -1
- package/dist/assets/starship-2019.thick.svg +1 -1
- package/dist/assets/starship-v1-apart.painted.svg +1 -1
- package/dist/assets/starship-v1-apart.svg +1 -1
- package/dist/assets/starship-v1-apart.thick.svg +1 -1
- package/dist/assets/starship-v1-booster.painted.svg +1 -1
- package/dist/assets/starship-v1-booster.svg +1 -1
- package/dist/assets/starship-v1-booster.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1-apart.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1-apart.svg +1 -1
- package/dist/assets/starship-v1-flight1-apart.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1-booster.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1-booster.svg +1 -1
- package/dist/assets/starship-v1-flight1-booster.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1-ship.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1-ship.svg +1 -1
- package/dist/assets/starship-v1-flight1-ship.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1.svg +1 -1
- package/dist/assets/starship-v1-flight1.thick.svg +1 -1
- package/dist/assets/starship-v1-ship.painted.svg +1 -1
- package/dist/assets/starship-v1-ship.svg +1 -1
- package/dist/assets/starship-v1-ship.thick.svg +1 -1
- package/dist/assets/starship-v1.painted.svg +1 -1
- package/dist/assets/starship-v1.svg +1 -1
- package/dist/assets/starship-v1.thick.svg +1 -1
- package/dist/assets/starship-v2-apart.painted.svg +1 -1
- package/dist/assets/starship-v2-apart.svg +1 -1
- package/dist/assets/starship-v2-apart.thick.svg +1 -1
- package/dist/assets/starship-v2-booster.painted.svg +1 -1
- package/dist/assets/starship-v2-booster.svg +1 -1
- package/dist/assets/starship-v2-booster.thick.svg +1 -1
- package/dist/assets/starship-v2-ship.painted.svg +1 -1
- package/dist/assets/starship-v2-ship.svg +1 -1
- package/dist/assets/starship-v2-ship.thick.svg +1 -1
- package/dist/assets/starship-v2.painted.svg +1 -1
- package/dist/assets/starship-v2.svg +1 -1
- package/dist/assets/starship-v2.thick.svg +1 -1
- package/dist/assets/starship-v3-apart.painted.svg +1 -1
- package/dist/assets/starship-v3-apart.svg +1 -1
- package/dist/assets/starship-v3-apart.thick.svg +1 -1
- package/dist/assets/starship-v3-booster.painted.svg +1 -1
- package/dist/assets/starship-v3-booster.svg +1 -1
- package/dist/assets/starship-v3-booster.thick.svg +1 -1
- package/dist/assets/starship-v3-ship.painted.svg +1 -1
- package/dist/assets/starship-v3-ship.svg +1 -1
- package/dist/assets/starship-v3-ship.thick.svg +1 -1
- package/dist/assets/starship-v3.painted.svg +1 -1
- package/dist/assets/starship-v3.svg +1 -1
- package/dist/assets/starship-v3.thick.svg +1 -1
- package/dist/assets/starship-v4-apart.painted.svg +1 -1
- package/dist/assets/starship-v4-apart.svg +1 -1
- package/dist/assets/starship-v4-apart.thick.svg +1 -1
- package/dist/assets/starship-v4-booster.painted.svg +1 -1
- package/dist/assets/starship-v4-booster.svg +1 -1
- package/dist/assets/starship-v4-booster.thick.svg +1 -1
- package/dist/assets/starship-v4-ship.painted.svg +1 -1
- package/dist/assets/starship-v4-ship.svg +1 -1
- package/dist/assets/starship-v4-ship.thick.svg +1 -1
- package/dist/assets/starship-v4.painted.svg +1 -1
- package/dist/assets/starship-v4.svg +1 -1
- package/dist/assets/starship-v4.thick.svg +1 -1
- package/dist/attrs.d.ts +93 -0
- package/dist/attrs.js +86 -0
- package/dist/build/glb.d.ts +25 -0
- package/dist/build/glb.js +14 -0
- package/dist/build/index.d.ts +96 -6
- package/dist/build/index.js +83 -8
- package/dist/build/lineup.d.ts +56 -2
- package/dist/build/lineup.js +37 -6
- package/dist/builder.d.ts +68 -0
- package/dist/builder.js +116 -0
- package/dist/crossfade.d.ts +44 -2
- package/dist/crossfade.js +44 -2
- package/dist/data/apollosoyuz.d.ts +6 -0
- package/dist/data/apollosoyuz.js +28 -0
- package/dist/data/credits.d.ts +63 -2
- package/dist/data/credits.js +52 -2
- package/dist/data/dragon.js +35 -0
- package/dist/data/electron.d.ts +2 -0
- package/dist/data/electron.js +23 -0
- package/dist/data/falcon.js +2 -2
- package/dist/data/falcon1.d.ts +4 -0
- package/dist/data/falcon1.js +51 -0
- package/dist/data/flight-log.d.ts +50 -0
- package/dist/data/flight-log.js +44 -0
- package/dist/data/flights.d.ts +101 -0
- package/dist/data/flights.js +187 -0
- package/dist/data/gemini.d.ts +3 -0
- package/dist/data/gemini.js +22 -0
- package/dist/data/hubble.d.ts +3 -0
- package/dist/data/hubble.js +23 -0
- package/dist/data/iss.d.ts +5 -0
- package/dist/data/iss.js +25 -0
- package/dist/data/jupiterc.d.ts +3 -0
- package/dist/data/jupiterc.js +22 -0
- package/dist/data/landing.d.ts +3 -0
- package/dist/data/landing.js +51 -0
- package/dist/data/lunarmodule.d.ts +4 -0
- package/dist/data/lunarmodule.js +27 -0
- package/dist/data/makers.d.ts +37 -0
- package/dist/data/makers.js +39 -0
- package/dist/data/mercury.d.ts +3 -0
- package/dist/data/mercury.js +22 -0
- package/dist/data/newglenn.d.ts +2 -0
- package/dist/data/newglenn.js +23 -0
- package/dist/data/saturn.d.ts +2 -0
- package/dist/data/saturn.js +32 -0
- package/dist/data/shuttle.d.ts +5 -0
- package/dist/data/shuttle.js +52 -0
- package/dist/data/sls.d.ts +4 -0
- package/dist/data/sls.js +36 -0
- package/dist/data/sources.d.ts +380 -2
- package/dist/data/sources.js +55 -1
- package/dist/data/soyuz.d.ts +3 -0
- package/dist/data/soyuz.js +33 -0
- package/dist/data/starbase.d.ts +2 -0
- package/dist/data/starbase.js +30 -0
- package/dist/data/tower.d.ts +3 -0
- package/dist/data/tower.js +26 -0
- package/dist/data/types.d.ts +88 -2
- package/dist/data/types.js +26 -1
- package/dist/draw/plume.d.ts +8 -0
- package/dist/draw/plume.js +71 -0
- package/dist/draw/svg.d.ts +1 -1
- package/dist/draw/svg.js +3 -3
- package/dist/element/ground.d.ts +15 -0
- package/dist/element/ground.js +95 -0
- package/dist/element/plumes.d.ts +38 -0
- package/dist/element/plumes.js +208 -0
- package/dist/element/scene.d.ts +39 -5
- package/dist/element/scene.js +250 -7
- package/dist/element.d.ts +111 -4
- package/dist/element.js +251 -16
- package/dist/embed.d.ts +131 -0
- package/dist/embed.js +218 -0
- package/dist/engines.d.ts +126 -0
- package/dist/engines.js +150 -0
- package/dist/fit.d.ts +70 -0
- package/dist/fit.js +17 -3
- package/dist/flight.d.ts +192 -0
- package/dist/flight.js +237 -0
- package/dist/flightbar.d.ts +34 -0
- package/dist/flightbar.js +188 -0
- package/dist/framing.d.ts +182 -8
- package/dist/framing.js +127 -6
- package/dist/index.d.ts +17 -0
- package/dist/index.js +9 -0
- package/dist/layout.d.ts +65 -1
- package/dist/layout.js +44 -2
- package/dist/looks.d.ts +65 -2
- package/dist/looks.js +44 -1
- package/dist/model/apollosoyuz.d.ts +2 -0
- package/dist/model/apollosoyuz.js +46 -0
- package/dist/model/dragoninside.d.ts +2 -0
- package/dist/model/dragoninside.js +67 -0
- package/dist/model/electron.d.ts +2 -0
- package/dist/model/electron.js +35 -0
- package/dist/model/falcon.d.ts +2 -0
- package/dist/model/falcon.js +4 -0
- package/dist/model/falcon1.d.ts +2 -0
- package/dist/model/falcon1.js +53 -0
- package/dist/model/gemini.d.ts +2 -0
- package/dist/model/gemini.js +28 -0
- package/dist/model/hubble.d.ts +2 -0
- package/dist/model/hubble.js +28 -0
- package/dist/model/iss.d.ts +2 -0
- package/dist/model/iss.js +32 -0
- package/dist/model/jupiterc.d.ts +2 -0
- package/dist/model/jupiterc.js +24 -0
- package/dist/model/kit.d.ts +36 -0
- package/dist/model/kit.js +95 -0
- package/dist/model/landing.d.ts +3 -0
- package/dist/model/landing.js +81 -0
- package/dist/model/lunarmodule.d.ts +2 -0
- package/dist/model/lunarmodule.js +43 -0
- package/dist/model/materials.d.ts +74 -0
- package/dist/model/materials.js +17 -0
- package/dist/model/mercury.d.ts +2 -0
- package/dist/model/mercury.js +19 -0
- package/dist/model/newglenn.d.ts +2 -0
- package/dist/model/newglenn.js +43 -0
- package/dist/model/pieces.d.ts +2 -0
- package/dist/model/pieces.js +2 -2
- package/dist/model/registry.d.ts +22 -0
- package/dist/model/registry.js +85 -0
- package/dist/model/saturn.d.ts +2 -0
- package/dist/model/saturn.js +122 -0
- package/dist/model/shuttle.d.ts +2 -0
- package/dist/model/shuttle.js +111 -0
- package/dist/model/sls.d.ts +2 -0
- package/dist/model/sls.js +83 -0
- package/dist/model/soyuz.d.ts +2 -0
- package/dist/model/soyuz.js +75 -0
- package/dist/model/stacks.d.ts +39 -0
- package/dist/model/stacks.js +1 -0
- package/dist/model/starbase.d.ts +2 -0
- package/dist/model/starbase.js +108 -0
- package/dist/model/tower.d.ts +6 -0
- package/dist/model/tower.js +89 -0
- package/dist/parts.d.ts +36 -3
- package/dist/pixels.d.ts +44 -4
- package/dist/pixels.js +44 -4
- package/dist/react.d.ts +38 -6
- package/dist/react.js +13 -0
- package/dist/rockets.d.ts +96 -3
- package/dist/rockets.js +136 -9
- package/dist/spin.d.ts +66 -0
- package/dist/spin.js +44 -0
- package/dist/tilt.d.ts +48 -4
- package/dist/tilt.js +26 -4
- package/package.json +99 -19
package/dist/build/index.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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;
|
package/dist/build/index.js
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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)
|
package/dist/build/lineup.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { type ViewName } from "../framing.ts";
|
|
2
2
|
import { type LookName } from "../looks.ts";
|
|
3
|
-
/**
|
|
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
|
-
/**
|
|
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[];
|
package/dist/build/lineup.js
CHANGED
|
@@ -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
|
-
/**
|
|
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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
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
|
-
/**
|
|
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
|
|
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 {
|
|
73
|
-
|
|
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;
|
package/dist/builder.js
ADDED
|
@@ -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
|
+
}
|