@fboes/aerofly-patterns
Version:
Landegerät - Create random custom missions for Aerofly FS 4.
165 lines (146 loc) • 4.61 kB
text/typescript
import * as path from "node:path";
import { fileURLToPath } from "node:url";
import { ConfigurationAbstract } from "../general/ConfigurationAbstract.js";
export class Configuration extends ConfigurationAbstract {
geoJsonFile: string;
environmentId: string;
aircraft: string;
livery: string;
numberOfMissions: number;
callsign: string;
icaoCode: string;
directoryMode: boolean;
noGuides: boolean;
isColdAndDark: boolean;
canTransfer: boolean;
withApproaches: boolean;
doNotGeneratePois: boolean;
constructor(args: string[]) {
super();
this._arguments = [
{
name: "GEOJSON_FILE",
description: "GeoJSON file containing possible mission locations.",
},
{ name: "AFS_AIRCRAFT_CODE", description: "Internal aircraft code in Aerofly FS 4.", default: "ec135" },
{ name: "AFS_LIVERY_CODE", description: "Internal livery code in Aerofly FS 4", default: "adac" },
];
this._options = {
"metar-icao": {
type: "string",
short: "m",
default: "",
description: "Use this ICAO station code to find weather reports",
example: "EHAM",
},
missions: {
type: "string",
default: "10",
description: "Number of missions in file.",
},
callsign: {
type: "string",
default: "MEDEVAC",
description: "Optional callsign, else default callsign will be used.",
},
"no-guides": {
type: "boolean",
default: false,
description: "Try to remove virtual guides from missions.",
},
"cold-dark": {
type: "boolean",
short: "c",
default: false,
description: "Start cold & dark.",
},
transfer: {
type: "boolean",
short: "t",
default: false,
description: "Mission types can also be transfers.",
},
approach: {
type: "boolean",
short: "a",
default: false,
description: "Add approach guides to flight plan.",
},
"no-poi": {
type: "boolean",
short: "p",
default: false,
description: "Do not generate POI files.",
},
directory: {
type: "boolean",
short: "d",
default: false,
description: "Create files in another directory instead of current directory.",
},
help: {
type: "boolean",
short: "h",
default: false,
description: "Will output the help.",
},
};
const { values, positionals } = this.parseArgs(args);
this.geoJsonFile =
positionals[0] ??
path.join(path.dirname(fileURLToPath(import.meta.url)), "../../../src/data/hems/san_francisco.geojson");
if (!path.isAbsolute(this.geoJsonFile)) {
this.geoJsonFile = path.join(process.cwd(), this.geoJsonFile);
}
/**
* @type {string} an identifier for the environment
*/
this.environmentId = path
.basename(this.geoJsonFile, path.extname(this.geoJsonFile))
.toLowerCase()
.replace(/[^a-z0-9_]/, "_");
/**
* @type {string} as in Aerofly Aircraft Codes
*/
this.aircraft = (positionals[1] ?? "ec135").toLowerCase().replace(/[^a-z0-9]/, "");
/**
* @type {string} as in Aerofly Aircraft Codes
*/
this.livery = (positionals[2] ?? (this.aircraft === "ec135" ? "adac" : "")).toLowerCase().replace(/[^a-z0-9]/, "");
this.numberOfMissions = Number(values["missions"]);
this.callsign = String(values["callsign"] ?? "")
.toUpperCase()
.replace(/[^A-Z0-9]/, "");
/**
* @type {string} use this instead of starting point from GeoJSON
*/
this.icaoCode = String(values["metar-icao"] ?? "")
.toUpperCase()
.replace(/[^A-Z0-9]/, "");
/**
* @type {boolean} if files should be created in subfolder
*/
this.directoryMode = Boolean(values["directory"]);
/**
* @type {boolean} if guides should be removed from missions
*/
this.noGuides = Boolean(values["no-guides"]);
/**
* @type {boolean} aircraft starts cold & dark
*/
this.isColdAndDark = Boolean(values["cold-dark"]);
/**
* @type {boolean} missions types can also be "transfer"
*/
this.canTransfer = Boolean(values["transfer"]);
/**
* @type {boolean} Add approach guides to flight plan.
*/
this.withApproaches = Boolean(values["approach"]);
/**
* @type {boolean} Do not generate POI files.
*/
this.doNotGeneratePois = Boolean(values["no-poi"]);
this.help = Boolean(values["help"]);
}
}