@fboes/aerofly-custom-missions
Version:
Builder for Aerofly FS4 Custom Missions Files
87 lines (86 loc) • 3.99 kB
JavaScript
import { Convert } from "../node/Convert.js";
import { AeroflyNavRouteBase } from "./AeroflyNavRouteBase.js";
export class AeroflyNavRouteWaypoint extends AeroflyNavRouteBase {
/**
* @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(identifier, longitude, latitude, { navaidFrequency = null, navaidFrequency_khz = null, navaidFrequency_mhz = null, altitude = null, altitude_ft = null, flyOver = false, uid = null, } = {}) {
super("waypoint", identifier, longitude, latitude, { uid });
this.identifier = identifier;
this.longitude = longitude;
this.latitude = latitude;
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() {
return this.altitude !== null ? Convert.convertMeterToFeet(this.altitude) : null;
}
set altitude_ft(altitude_ft) {
this.altitude = altitude_ft !== null ? Convert.convertFeetToMeter(altitude_ft) : null;
}
get navaidFrequency_khz() {
return this.navaidFrequency ? this.navaidFrequency / 1000 : null;
}
set navaidFrequency_khz(navaidFrequency_khz) {
this.navaidFrequency = navaidFrequency_khz !== null ? navaidFrequency_khz * 1000 : null;
}
get navaidFrequency_mhz() {
return this.navaidFrequency ? this.navaidFrequency / 1000_000 : null;
}
set navaidFrequency_mhz(navaidFrequency_mhz) {
this.navaidFrequency = navaidFrequency_mhz !== null ? navaidFrequency_mhz * 1000_000 : null;
}
/**
* @returns {AeroflyVector3Float} to use in Aerofly FS4's `main.mcf`
*/
get position() {
return Convert.convertLonLatToVector(this.longitude, this.latitude, this.altitude || 0);
}
set position(position) {
const { longitude, latitude, altitude_meter } = Convert.convertVectorToLonLat(position);
this.longitude = longitude;
this.latitude = latitude;
this.altitude = altitude_meter;
}
getElement(index = 0) {
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,
};
}
}