@fboes/aerofly-custom-missions
Version:
Builder for Aerofly FS4 Custom Missions Files
115 lines (100 loc) • 4.01 kB
text/typescript
import { AeroflyConfigurationNode } from "../node/AeroflyConfigurationNode.js";
/**
* @class Represents the wind settings for a mission in Aerofly FS4.
*/
export class AeroflySettingsWind {
/**
* @property {number} speed_kts in knots
*/
speed_kts: number;
/**
* @property {number} directionInDegree in degree
*/
directionInDegree: number;
/**
* @property {number} gust_kts in knots
*/
gust_kts: number;
/**
* @property {number} temperature_celsius in degree Celsius, e.g. 14 for 14°C
*/
temperature_celsius: number;
/**
* @param {number} speed_kts in knots
* @param {number} directionInDegree in degree
* @param {number} gust_kts in knots
* @param {number} temperature_celsius in degree Celsius, e.g. 14 for 14°C
*/
constructor(speed_kts: number, directionInDegree: number, gust_kts: number = 0, temperature_celsius: number = 14) {
this.speed_kts = speed_kts;
this.directionInDegree = directionInDegree;
this.gust_kts = gust_kts;
this.temperature_celsius = temperature_celsius;
}
/**
* @param {number} strength normalized strength value [0,1]
* @param {number} directionInDegree in degree
* @param {number} turbulence normalized turbulence value [0,1]
* @param {number} thermalActivity normalized thermal activity value [0,1]
* @returns {AeroflySettingsWind} a new instance of AeroflySettingsWind with the specified normalized values
*/
static createWithNormalizedValues(
strength: number,
directionInDegree: number,
turbulence: number = 0,
thermalActivity: number = 0,
): AeroflySettingsWind {
const wind = new AeroflySettingsWind(0, directionInDegree);
wind.strength = strength;
wind.turbulence = turbulence;
wind.thermalActivity = thermalActivity;
return wind;
}
/**
* @returns {number} the normalized strength value [0,1] for this wind, where 0 means no wind and 1 means 80 kts or more
*/
get strength(): number {
return Math.sqrt(this.speed_kts / 8 + 0.25) - 0.5;
}
set strength(strength: number) {
this.speed_kts = Math.max(0, (strength + 0.5) ** 2 - 0.25) * 8;
}
/**
* @returns {number} the normalized turbulence value [0,1] for this wind, where 0 means no turbulence and 1 means very strong turbulence (80 kts wind + 20 kts gusts)
*/
get turbulence(): number {
return Math.min(1, this.speed_kts / 80 + this.gust_kts / 20);
}
set turbulence(turbulence: number) {
const totalWindEffect = turbulence * 80;
this.speed_kts = Math.min(this.speed_kts, totalWindEffect);
this.gust_kts = Math.min(this.gust_kts, (totalWindEffect - this.speed_kts) * 20);
}
/**
* @returns {number} the normalized thermal activity value [0,1] for this wind, where 0 means no thermal activity and 1 means very strong thermal activity (30°C or more)
*/
get thermalActivity(): number {
return (this.temperature_celsius - 5) / 25;
}
set thermalActivity(thermalActivity: number) {
this.temperature_celsius = thermalActivity * 25 + 5;
}
getElement(): AeroflyConfigurationNode {
return new AeroflyConfigurationNode("tmsettings_wind", "wind")
.appendChild("float64", "strength", this.strength, `${Math.ceil(this.speed_kts)} kts`)
.appendChild("float64", "direction_in_degree", this.directionInDegree)
.appendChild("float64", "turbulence", this.turbulence, `${Math.ceil(this.gust_kts)} kts gusts`)
.appendChild(
"float64",
"thermal_activity",
this.thermalActivity,
`${Math.round(this.temperature_celsius)}°C`,
);
}
/**
* @returns {string} to use in Aerofly FS4's `main.mcf`
*/
toString(): string {
return this.getElement().toString();
}
}