EDMC (Elite Dangerous Market Connector) plugin that guides exobiology genetic sampling — it remembers where each sample was taken and tells you, on an in-game overlay, how far you've travelled, how much further you need to go for genetic diversity, and which way to walk.
The shippable plugin lives in ExoSampleNavigator/ — see its
README for what it does, requirements, and install steps.
ed-exo-navigator/
├── ExoSampleNavigator/ # the plugin users drop into EDMC's plugins/ folder
│ ├── load.py # EDMC entry points (__version__ lives here)
│ ├── exonav_core.py # pure logic: haversine, genus table, sampling state machine
│ ├── exonav_overlay.py # resilient EDMCOverlay wrapper (text + vector arrow)
│ ├── README.md
│ └── LICENSE
├── package.py # builds dist/ExoSampleNavigator-v<version>.zip
├── smoke_test.py # stubs EDMC and drives a full sampling run locally
├── .github/workflows/ # test (compile + self-test) and release (tag -> zip) CI
├── CHANGELOG.md
└── README.md
- Pure-logic self-test (no EDMC needed):
python ExoSampleNavigator/exonav_core.py
- Full smoke test (stubs EDMC modules, imports
load.py, drives a Log→Sample→Analyse run; needs a display for tkinter):python smoke_test.py
- Compile-check everything (what CI runs):
python -m compileall -q .
__version__ in ExoSampleNavigator/load.py is the single source
of truth; the git tag must match it.
python package.py # -> dist/ExoSampleNavigator-v<version>.zip
# or, automated:
git tag v1.0.0 && git push origin main --tags # release.yml builds + publishes the zipScanOrganic(the sample event) has no coordinates, so positions come from the latestStatus.jsonfix cached indashboard_entryand attached when the event fires.- Distances are great-circle (haversine) on a sphere of radius
PlanetRadius(from Status.json). - Helper modules use the
exonav_prefix and top-level imports because EDMC puts every plugin on one sharedsys.path— generic names likeoverlay.pywould collide with other plugins. - The overlay is treated as optional: lazy import, reconnect on failure, and an in-window text fallback so the plugin still works without EDMCOverlay.
MIT — see LICENSE.
