UNPKG

@jtff/miztemplate-lib

Version:
542 lines (536 loc) 20.8 kB
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};