UNPKG

@fboes/aerofly-custom-missions

Version:

Builder for Aerofly FS4 Custom Missions Files

134 lines (114 loc) 4.89 kB
import { Convert, AeroflyVector3Float } from "../node/Convert.js"; import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js"; import { AeroflyNavRouteBase } from "./AeroflyNavRouteBase.js"; export class AeroflyNavRouteWaypoint extends AeroflyNavRouteBase { /** * @property {?number} navaidFrequency if the waypoint is a navaid, its frequency in Hz */ navaidFrequency: number | null; /** * @property {number | null} altitude in meter, null if not set */ altitude: number | null; /** * @property {boolean} flyOver if true, the waypoint is meant to be flown over, otherwise it can be used as a fly-by waypoint */ flyOver: boolean; /** * @param {string} identifier alphanumeric identifier, e.g. "SEA", "PDX", "RWY16L", "FIX1" * @param {number} longitude WGS84 * @param {number} latitude WGS84 * @param {object} [options] additional options for the waypoint * @param {?number} [options.navaidFrequency] if the waypoint is a navaid, its frequency in Hz * @param {number} [options.altitude] in meter * @param {?number} [options.altitude_ft] altitude in feet, will override altitude in meter if provided * @param {boolean} [options.flyOver] if true, the waypoint is meant to be flown over, otherwise it can be used as a fly-by waypoint * @param {?bigint} [options.uid] unique identifier for the waypoint, will be generated automatically if not provided */ constructor( public identifier: string, public longitude: number, public latitude: number, { navaidFrequency = null, navaidFrequency_khz = null, navaidFrequency_mhz = null, altitude = null, altitude_ft = null, flyOver = false, uid = null, }: Partial<AeroflyNavRouteWaypoint> = {}, ) { super("waypoint", identifier, longitude, latitude, { uid }); this.navaidFrequency = navaidFrequency; this.altitude = altitude; if (altitude_ft !== null) { this.altitude_ft = altitude_ft; } if (navaidFrequency_khz !== null) { this.navaidFrequency_khz = navaidFrequency_khz; } if (navaidFrequency_mhz !== null) { this.navaidFrequency_mhz = navaidFrequency_mhz; } this.flyOver = flyOver; } /** * @returns {number | null} altitude in feet, null if not set */ get altitude_ft(): number | null { return this.altitude !== null ? Convert.convertMeterToFeet(this.altitude) : null; } set altitude_ft(altitude_ft: number | null) { this.altitude = altitude_ft !== null ? Convert.convertFeetToMeter(altitude_ft) : null; } get navaidFrequency_khz(): number | null { return this.navaidFrequency ? this.navaidFrequency / 1000 : null; } set navaidFrequency_khz(navaidFrequency_khz: number | null) { this.navaidFrequency = navaidFrequency_khz !== null ? navaidFrequency_khz * 1000 : null; } get navaidFrequency_mhz(): number | null { return this.navaidFrequency ? this.navaidFrequency / 1000_000 : null; } set navaidFrequency_mhz(navaidFrequency_mhz: number | null) { this.navaidFrequency = navaidFrequency_mhz !== null ? navaidFrequency_mhz * 1000_000 : null; } /** * @returns {AeroflyVector3Float} to use in Aerofly FS4's `main.mcf` */ get position(): AeroflyVector3Float { return Convert.convertLonLatToVector(this.longitude, this.latitude, this.altitude || 0); } set position(position: AeroflyVector3Float) { const { longitude, latitude, altitude_meter } = Convert.convertVectorToLonLat(position); this.longitude = longitude; this.latitude = latitude; this.altitude = altitude_meter; } getElement(index: number = 0): AeroflyConfigurationNode { const element = super.getElement(index); if (this.navaidFrequency) { element.appendChild("float64", "NavaidFrequency", this.navaidFrequency); } element .appendChild( "vector2_float64", "Altitude", this.altitude !== null && this.altitude > 0 ? [this.altitude, this.altitude] : [-1001, 100001], `${this.altitude_ft !== null && this.altitude_ft > 0 ? Math.ceil(this.altitude_ft) + " ft" : "unrestricted"}`, ) .appendChild("bool", "FlyOver", this.flyOver); return element; } toJSON() { return { ...this, uid: this.uid !== null ? this.uid.toString() : null, altitude: undefined, altitude_ft: this.altitude_ft, navaidFrequency: undefined, navaidFrequency_khz: this.navaidFrequency_khz, }; } }