@jtff/miztemplate-lib
Version:
JTFF mission template library
542 lines (536 loc) • 20.8 kB
JavaScript
const fs = require('fs');
const path = require("path");
const prompt = require('prompt');
let _ = require('lodash');
const {getInstalledPathSync} = require("get-installed-path");
function createSkel(jtffci, env_mission) {
const workspacePath = [
jtffci.config.general.missionFolder,
"/",
path.parse(env_mission).name
].join("");
const destinationMizFilePath = [
workspacePath,
'/',
path.basename(env_mission)
].join("");
// create mission folder in jtffci.config.reneral.missionFolder folder
fs.mkdirSync(jtffci.config.general.missionFolder, { recursive: true });
if (fs.existsSync(workspacePath)) {
// if there is a specific mission folder (dist/env_mission), clean it
fs.rmSync(workspacePath,{ recursive: true });
}
// create a settings folder
fs.mkdirSync([
workspacePath,
"/settings"
].join(""),
{ recursive: true }
);
// create a src folder
fs.mkdirSync([
workspacePath,
"/.workspace/src"
].join(""),
{ recursive: true }
);
// create a lib folder
fs.mkdirSync([
workspacePath,
"/.workspace/lib"
].join(""),
{ recursive: true }
);
// create a resources folder
fs.mkdirSync([
workspacePath,
"/.workspace/resources/sounds"
].join(""),
{ recursive: true }
);
fs.mkdirSync([
workspacePath,
"/resources/radios"
].join(""),
{ recursive: true }
);
fs.mkdirSync([
workspacePath,
"/resources/sounds"
].join(""),
{ recursive: true }
);
fs.mkdirSync([
workspacePath,
"/resources/config"
].join(""),
{ recursive: true }
);
fs.mkdirSync([
workspacePath,
"/resources/kneeboards/common"
].join(""),
{ recursive: true }
);
return {workspacePath, destinationMizFilePath};
}
function injectScripts(jtffci, env_mission) {
const {workspacePath,destinationMizFilePath} = createSkel(jtffci, env_mission);
const prompt_properties = [
{
name: 'inject_tankers',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_tankers must be yes/y/o/oui or no/n/non',
default: 'n'
},
{
name: 'inject_airboss',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_airboss must be yes/y/o/oui or no/n/non',
default: 'n'
},
{
name: 'inject_awacs',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_awacs must be yes/y/o/oui or no/n/non',
default: 'n'
},
{
name: 'inject_atis',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_atis must be yes/y/o/oui or no/n/non',
default: 'n'
},
{
name: 'inject_A2A',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_A2A must be yes/y/o/oui or no/n/non',
default: 'n'
},
{
name: 'inject_Logistics',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_Logistics must be yes/y/o/oui or no/n/non',
default: 'n'
},
{
name: 'inject_A2G',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_A2G must be yes/y/o/oui or no/n/non',
default: 'n'
},
{
name: 'inject_mission',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_mission must be yes/y/o/oui or no/n/non',
default: 'y'
},
{
name: 'inject_radio_presets',
validator: /^y\b|n\b|o\b|yes\b|no\b|non\b|oui\b/i,
warning: 'inject_radio_presets must be yes/y/o/oui or no/n/non',
default: 'n'
}
];
prompt.start();
prompt.get(prompt_properties, async function (prompt_err, prompt_result) {
if (prompt_err) {
console.log(prompt_err);
return 1;
}
console.log('Command-line input received:');
console.log(' inject_tankers scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_tankers));
console.log(' inject_airboss scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_airboss));
console.log(' inject_awacs scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_awacs));
console.log(' inject_atis scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_atis));
console.log(' inject_A2A scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_A2A));
console.log(' inject_Logistics scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_Logistics));
console.log(' inject_A2G scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_A2G));
console.log(' inject_mission specific scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_mission));
console.log(' inject_radio_presets scripts: ' + (/^y\b|o\b|yes\b|oui\b/i).test(prompt_result.inject_radio_presets));
return await doInject(jtffci, env_mission, workspacePath, destinationMizFilePath, prompt_result);
});
}
async function doInject(ciObject, sourceMizFileName, workspacePath,destinationMizFilePath, promptResult) {
// open the miz input file for reading
const originalMizObject = await ciObject.mizlib.getZipObjectFromMizPath(sourceMizFileName);
// copie de l'objet pour modification
let mizObject = originalMizObject;
// Open the mission Object and mapResource Object for modification
const missionObject = await ciObject.mizlib.getMissionObjectFromZipObject(mizObject);
let mapResourceObject = await ciObject.mizlib.getMapResourceObjectFromZipObject(mizObject);
// prepare settings array
let settingsArray = [];
let scriptsArray = [];
let libsArray = [];
// insertion des librairies externes dans la file d'attente
libsArray.push({
folder: 'lib',
scriptTitle: 'SplashDamage',
scripts: ['Splash_Damage_main.lua'],
timing: 9,
color: '0x008000ff'
});
libsArray.push({
folder: 'lib',
scriptTitle: 'Moose',
scripts: ['Moose_.lua'],
timing: 10,
color: '0x008000ff'
});
libsArray.push({
folder: 'lib',
scriptTitle: 'Mist',
scripts: ['mist.lua'],
timing: 12,
color: '0x008000ff'
});
libsArray.push({
folder: 'lib',
scriptTitle: 'Skynet and Hound',
scripts: ['skynet-iads-compiled.lua', 'HoundElint.lua'],
timing: 15,
color: '0x008000ff'
});
// injection des fichiers son Généraux si repertoire resources/sounds/General present
await ciObject.mizlib.updateWorkspaceWithSingleSoundFolder(workspacePath, 'General');
await ciObject.mizlib.injectSingleSoundFolderIntoZipObject(mizObject,workspacePath, 'General', true);
// injection des fichiers son Misc si repertoire resources/sounds/Misc present
await ciObject.mizlib.updateWorkspaceWithSingleSoundFolder(workspacePath, 'Misc');
await ciObject.mizlib.injectSingleSoundFolderIntoZipObject(mizObject,workspacePath, 'Misc', true);
// injection des fichiers Config View si repertoire resources/config/View present
await ciObject.mizlib.updateWorkspaceWithSingleConfigFolder(workspacePath, 'config/View');
await ciObject.mizlib.injectSingleConfigFolderIntoZipObject(mizObject,workspacePath, 'config/View', true);
// insertion des Librairies JTFF dans la file d'attente
settingsArray.push(
{
file: "settings-funkman.lua",
},
{
file: "settings-global.lua",
},
);
libsArray.push({
folder: 'src',
scriptTitle: 'JTFF Libraries',
scripts: ['010-root_menus.lua', '020-mission_functions.lua'],
timing: 15,
color: '0xffff00ff'
});
libsArray.push({
folder: 'lib',
scriptTitle: 'FunkMan',
scripts: ['funkman.lua'],
timing: 16,
color: '0xffff00ff'
});
// traitement de la file d'attente des librairies (injection des triggers et des fichiers lua)
for ( libscript of libsArray) {
console.log(['adding library',libscript.scripts.join(' and '),'from',workspacePath + '/.workspace/' + libscript.folder, 'folder...'].join(' '));
let {tuple, zipObject} = await ciObject.mizlib.injectLuaScriptIntoZipObjectAndUpdateWorkspace(
workspacePath,
libscript.folder,
libscript.scripts,
libscript.scriptTitle + ' Load',
mizObject,
libscript.timing,
libscript.color,
true
);
missionObject['trig'] = tuple.tObject;
missionObject['trigrules'] = tuple.trObject;
mapResourceObject = _.merge(mapResourceObject,tuple.mrObject);
mizObject = zipObject;
// réintégration du fichier mission dans l'archive
await ciObject.mizlib.injectMissionObjectIntoZipObject(
mizObject,
{ mission: missionObject }
);
await ciObject.mizlib.injectMapResourceObjectIntoZipObject(
mizObject,
{ mapResource: mapResourceObject }
);
}
// injection de la gestion des Set_Clients dans la file d'attente
scriptsArray.push({
folder: 'src',
scriptTitle: 'Set clients',
scripts: ['110-set_clients.lua'],
timing: 21,
color: '0xff0000ff',
fromLibrary: true
});
// injection des Tankers et OndemandTankers dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_tankers)) {
settingsArray.push(
{
file: "settings-tankers.lua",
objectName: "TankersConfig"
},
{
file: "settings-ondemandtankers.lua",
objectName: "OnDemandTankersConfig"
},
);
scriptsArray.push({
folder: 'src',
scriptTitle: 'Tankers',
scripts: ['120-tankers.lua'],
timing: 22,
color: '0xff0000ff',
fromLibrary: true
});
}
// injection des Airboss et Pedros dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_airboss)) {
// injection des fichiers son Airboss
await ciObject.mizlib.updateWorkspaceWithSingleSoundFolder(workspacePath, 'AIRBOSS');
await ciObject.mizlib.injectSingleSoundFolderIntoZipObject(mizObject,workspacePath, 'AIRBOSS', true);
settingsArray.push(
{
file: "settings-airboss.lua",
objectName: "AirBossConfig"
}
);
scriptsArray.push({
folder: 'src',
scriptTitle: 'Airboss',
scripts: ['130-airboss.lua'],
timing: 23,
color: '0xff0000ff',
fromLibrary: true
});
}
// injection des AWACS et OnDemandAwacs dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_awacs)) {
settingsArray.push(
{
file: "settings-awacs.lua",
objectName: "AwacsConfig"
},
{
file: "settings-awacsondemand.lua",
objectName: "AwacsOnDemandConfig"
},
);
scriptsArray.push({
folder: 'src',
scriptTitle: 'Awacs',
scripts: ['150-awacs.lua'],
timing: 25,
color: '0xff0000ff',
fromLibrary: true
});
}
// injection des ATIS dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_atis)) {
// injection des fichiers son ATIS
await ciObject.mizlib.updateWorkspaceWithSingleSoundFolder(workspacePath, 'ATIS');
await ciObject.mizlib.injectSingleSoundFolderIntoZipObject(mizObject,workspacePath, 'ATIS', true);
settingsArray.push(
{
file: "settings-atis.lua",
objectName: "AtisConfig"
},
);
scriptsArray.push({
folder: 'src',
scriptTitle: 'ATIS',
scripts: ['160-atis.lua'],
timing: 26,
color: '0xff0000ff',
fromLibrary: true
});
}
// injection des scripts A2A dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_A2A)) {
settingsArray.push(
{
file: "settings-capzone.lua",
objectName: "TrainingCAPConfig"
},
{
file: "settings-capwarzone.lua",
objectName: "WarCAPConfig"
},
{
file: "settings-foxzone.lua",
objectName: "FoxRangesConfig"
},
{
file: "settings-RAT.lua",
objectName: "RATConfig"
},
{
file: "settings-intercept.lua",
objectName: "InterceptConfig"
},
{
file: "settings-qra.lua",
objectName: "QRAConfig"
},
);
scriptsArray.push({
folder: 'src',
scriptTitle: 'Air To Air',
scripts: ['170-cap_zone_training.lua', '172-cap_zone_war.lua', '173-fox_zone_training.lua', '174-qra-scenario.lua', '176-random_air_traffic.lua', '178-training-intercept.lua'],
timing: 27,
color: '0xff0000ff',
fromLibrary: true
});
}
// injection des CTLD dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_Logistics)) {
// injection des fichiers son CTLD
await ciObject.mizlib.updateWorkspaceWithSingleSoundFolder(workspacePath, 'CTLD CSAR');
await ciObject.mizlib.injectSingleSoundFolderIntoZipObject(mizObject,workspacePath, 'CTLD CSAR', true);
settingsArray.push(
{
file: "settings-logistics.lua",
objectName: "CTLDConfig"
},
);
scriptsArray.push({
folder: 'src',
scriptTitle: 'Logistics',
scripts: ['180-logistics.lua'],
timing: 28,
color: '0xff0000ff',
fromLibrary: true
});
}
// injection des scripts A2G dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_A2G)) {
// injection des fichiers son Range
await ciObject.mizlib.updateWorkspaceWithSingleSoundFolder(workspacePath, 'RANGE');
await ciObject.mizlib.injectSingleSoundFolderIntoZipObject(mizObject,workspacePath, 'RANGE', true);
settingsArray.push(
{
file: "settings-ranges.lua",
objectName: "RangeConfig"
},
{
file: "settings-sams.lua",
objectName: "SamsConfig"
},
{
file: "settings-training_ranges.lua",
objectName: "TrainingRangeConfig"
},
{
file: "settings-reapers.lua",
objectName: "OnDemandReapersConfig"
},
{
file: "settings-fac_ranges.lua",
objectName: "FACRangeConfig"
},
{
file: "settings-elint.lua",
objectName: "elintConfig"
},
{
file: "settings-skynet.lua",
objectName: "SkynetConfig"
},
);
scriptsArray.push({
folder: 'src',
scriptTitle: 'Air To Ground',
scripts: ['190-ranges.lua', '191-sams.lua', '193-training_ranges.lua', '195-reaper-ondemand.lua', '196-fac_ranges.lua', '197-elint-ondemand.lua', '199-skynet.lua'],
timing: 29,
color: '0xff0000ff',
fromLibrary: true
});
}
// injection du script spécifique de mission dans la file d'attente
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_mission)) {
scriptsArray.push({
folder: 'src',
scriptTitle: 'Mission specific',
scripts: ['200-mission.lua'],
timing: 30,
color: '0xff0000ff',
fromLibrary: false
});
}
// traitement de la file d'attente des scripts (injection des triggers et des fichiers lua)
for ( script of scriptsArray) {
console.log(['adding script',script.scripts.join(' and '),'from',workspacePath + '/' + script.folder, 'folder...'].join(' '));
let {tuple, zipObject} = await ciObject.mizlib.injectLuaScriptIntoZipObjectAndUpdateWorkspace(
workspacePath,
script.folder,
script.scripts,
script.scriptTitle,
mizObject,
script.timing,
script.color,
script.fromLibrary
);
missionObject['trig'] = tuple.tObject;
missionObject['trigrules'] = tuple.trObject;
mapResourceObject = _.merge(mapResourceObject,tuple.mrObject);
mizObject = zipObject;
// réintégration du fichier mission dans l'archive
await ciObject.mizlib.injectMissionObjectIntoZipObject(
mizObject,
{ mission: missionObject }
);
await ciObject.mizlib.injectMapResourceObjectIntoZipObject(
mizObject,
{ mapResource: mapResourceObject }
);
}
// injection des preset radio dans les avions humains
if ((/^y\b|o\b|yes\b|oui\b/i).test(promptResult.inject_radio_presets)) {
// injection des preset radio
fs.mkdirSync(workspacePath + '/resources/radios/' + missionObject.theatre,{recursive: true});
ciObject.mizlib.copyRecursiveSync(getInstalledPathSync('@jtff/miztemplate-lib',{local: true}) + '/resources/radios/' + missionObject.theatre,workspacePath + '/resources/radios/' + missionObject.theatre);
// fs.cpSync(getInstalledPathSync('@jtff/miztemplate-lib',{local: true}) + '/resources/radios/' + missionObject.theatre,workspacePath + '/resources/radios/' + missionObject.theatre,{recursive: true})
console.log(destinationMizFilePath + ": injecting radio presets declared in resources/radios/" + missionObject.theatre);
await ciObject.mizlib.injectRadioPresetsFromFolderIntoZipObject(mizObject, workspacePath + '/resources/radios/' + missionObject.theatre);
}
// traitement de la file d'attente des settings (injection des triggers et des fichiers lua)
if (settingsArray.length > 0) {
console.log(['adding settings files',settingsArray.map(a => a.file).join(' and '),'from',workspacePath + '/settings', 'folder...'].join(' '));
let {tuple, zipObject} = await ciObject.mizlib.injectLuaScriptIntoZipObjectAndUpdateWorkspace(
workspacePath,
'settings',
settingsArray.map(a => a.file),
'Mission Settings',
mizObject,
17,
'0xffff00ff',
false
);
missionObject['trig'] = tuple.tObject;
missionObject['trigrules'] = tuple.trObject;
mapResourceObject = _.merge(mapResourceObject,tuple.mrObject);
mizObject = zipObject;
// réintégration du fichier mission dans l'archive
await ciObject.mizlib.injectMissionObjectIntoZipObject(
mizObject,
{ mission: missionObject }
);
await ciObject.mizlib.injectMapResourceObjectIntoZipObject(
mizObject,
{ mapResource: mapResourceObject }
);
}
// creation du fichier miz dans l'espace de travail
// await fs.closeSync(fs.openSync(destinationMizFilePath, 'a'));
// On fait une sauvegarde dans le folder de destination
fs.writeFileSync(destinationMizFilePath, await mizObject.generateAsync({
type: 'nodebuffer',
streamFiles: true,
compression: "DEFLATE",
compressionOptions: {
level: 9
}
}));
// generation des outils CI JTFF
await ciObject.deployCIScriptsFromZipObjectIntoWorkspace(workspacePath, mizObject, sourceMizFileName);
console.log('...Done...');
return 0;
}
module.exports = {injectScripts,createSkel, doInject};