@kayahr/ed-journal
Version:
Typescript library to read/watch the player journal of Frontier's game Elite Dangerous
167 lines (166 loc) • 7.09 kB
TypeScript
import { type JournalEvent } from "../../JournalEvent.ts";
import type { BodyType } from "../types/BodyType.ts";
import type { ID } from "../types/ID.ts";
import type { PlanetClass } from "../types/PlanetClass.ts";
import type { StarType } from "../types/StarType.ts";
/**
* The scan type.
*
* - `AutoScan`: Automatic scan of nearby bodies after jumping into a system.
* - `Basic`: A basic scan in older game versions, when no Detailed Surface Scanner was installed.
* - `Detailed`: Normal scan made with Full Spectrum System Scanner or in older game versions a scan made with the Detailed Surface Scanner installed.
* - `NavBeaconDetail`: Data learned by scanning a nav beacon.
*/
export type ScanType = "AutoScan" | "Basic" | "Detailed" | "NavBeaconDetail";
/** The ring class (Icy, Metallic, Metal Rich or Rocky). */
export type RingClass = "eRingClass_Icy" | "eRingClass_Metalic" | "eRingClass_MetalRich" | "eRingClass_Rocky";
/** A ring of a planet, moon or star. */
export interface Ring {
/** The ring name. */
Name: string;
/** The ring class. */
RingClass: RingClass;
/** The mass in mega tons. */
MassMT: number;
/** The inner ring radius in meters. */
InnerRad: number;
/** The outer ring radius in meters. */
OuterRad: number;
}
/** The resource reserve level. */
export type ReserveLevel = "PristineResources" | "LowResources" | "DepletedResources" | "MajorResources" | "CommonResources";
/** General scan data for every type of scanned body. */
export interface ScanBody extends JournalEvent<"Scan"> {
/** The scan type. Missing in older journals. Maybe it is safe to assume a missing scan type is an auto scan. */
ScanType?: ScanType;
/** Star system name. May not be set in older journals and must be taken from previous events (like {@link FSDJump} which always set a system name. */
StarSystem?: string;
/** The system ID. Not set in older journals. */
SystemAddress?: ID;
/** The planet name. */
BodyName: string;
/** The ID of the planet. Not set in older journals. */
BodyID?: ID;
/** The distance of the planet to the arrival star in light seconds. */
DistanceFromArrivalLS: number;
/** Set to true if planet has been discovered by someone already. */
WasDiscovered?: boolean;
/** Set to true if planet has been mapped by someone already. */
WasMapped?: boolean;
/** Set to true if someone already set foot on this body. */
WasFootfalled?: boolean;
/** Array of BodyType:BodyID pairs describing the body hierarchy from direct parent to root. */
Parents?: Array<{
[K in BodyType]: Record<K, number> & Partial<Record<Exclude<BodyType, K>, never>>;
}[BodyType]>;
/** The semi major axis in meters. Not set in basic scans. */
SemiMajorAxis?: number;
/** Orbital eccentricity. Not set in older journal versions. */
Eccentricity?: number;
/** Orbital inclination in degrees. Not set in older journal versions. */
OrbitalInclination?: number;
/** Argument of periapsis in degrees. Not set in older journal versions. */
Periapsis?: number;
/** Orbital period in seconds. Not set in older journal versions. */
OrbitalPeriod?: number;
/** Ascending node in degrees. Not set in older journal versions. */
AscendingNode?: number;
/** Mean anomaly in degrees. Not set in older journal versions. */
MeanAnomaly?: number;
/** Axial tilt (in degrees) if rotating. Not set in basic scans. */
AxialTilt?: number;
/** The rings around the body. Not set in basic scans or when there are no rings. */
Rings?: Ring[];
}
/** Scan of a body which is not a star, planet or moon. */
export interface ScanOther extends ScanBody {
PlanetClass?: never;
StarType?: never;
}
/**
* Scan of a star. Can be recognized by the existence of a `StarType` property.
*/
export interface ScanStar extends ScanBody {
PlanetClass?: never;
/** Stellar classification. */
StarType: StarType;
/** Star's heat classification (0-9). Not set in older journal versions. */
Subclass?: number;
/** Mass as multiple of Sol's mass. */
StellarMass: number;
/** The radius of the star in meters. */
Radius: number;
/** The absolute magnitude. */
AbsoluteMagnitude: number;
/** Rotation period in seconds. */
RotationPeriod: number;
SurfaceTemperature: number;
/** The star luminosity. Not set in older journal versions. */
Luminosity?: string;
/** Age in millions of years. */
Age_MY: number;
}
/**
* Scan of a planet or moon. Can be recognized by the existence of a `PlanetClass` property.
*/
export interface ScanPlanet extends ScanBody {
StarType?: never;
/** The radius in meters. */
Radius: number;
/** Rotation period in seconds. */
RotationPeriod: number;
/** The surface temperature in Kelvin. Missing in basic scans. */
SurfaceTemperature?: number;
/** True if planet/moon is tidally locked. Not set in basic scans. */
TidalLock?: boolean;
/** The Terraform state. Not set in basic scans. */
TerraformState?: string;
/** The planet class. */
PlanetClass: PlanetClass;
/** The atmosphere. Not set in basic scans. Empty if no atmosphere. */
Atmosphere?: string;
/** The atmosphere type. Not set in basic scans or no atmosphere is present. */
AtmosphereType?: string;
/** The atmosphere composition. Not set in basic scans or no atmosphere is present. */
AtmosphereComposition?: Array<{
/** Element name (Like Hydrogen, Helium, ...) */
Name: string;
/** The quantity in percent. */
Percent: number;
}>;
/** The volcanism like for example 'minor nitrogen magma volcanism'. Empty string if none. Not set in basic scans. */
Volcanism?: string;
/** The surface gravity measured in m/s². */
SurfaceGravity: number;
/** The surface pressure in kPa. Not set in basic scans. */
SurfacePressure?: number;
/** True if ships can land on the planet/moon. Not set in basic scans. */
Landable?: boolean;
/** List of raw materials which can be gathered on the planet/moon. Not set if none. */
Materials?: Array<{
/** The material name like "tungsten". */
Name: string;
/** The quantity in percent. */
Percent: number;
}>;
/** The composition of the planet/moon. Not set in basic scans or when planet/moon is not solid. */
Composition?: {
/** Quantity of ice in percent. */
Ice: number;
/** Quantity of metal in percent. */
Metal: number;
/** Quantity of rock in percent. */
Rock: number;
};
/** The resource reserve level. */
ReserveLevel?: ReserveLevel;
/** Earth masses. */
MassEM: number;
}
/**
* Written on basic or detailed discovery scan of a star, planet, moon or ring.
*
* This is also generated when scanning a navigation beacon in a populated system, to record info
* about all the bodies in the system
*/
export type Scan = ScanStar | ScanPlanet | ScanOther;