157 lines
4.8 KiB
TypeScript
157 lines
4.8 KiB
TypeScript
import * as gulp from "gulp";
|
|
import * as gulpReplace from "gulp-replace";
|
|
import * as gulpPbo from "gulp-armapbo";
|
|
import * as gulpModify from "gulp-modify-file";
|
|
import * as gulpZip from "gulp-zip";
|
|
import * as vinylPaths from "vinyl-paths";
|
|
import * as del from "del";
|
|
|
|
import { resolve } from "path";
|
|
|
|
import { MissionPaths } from "./src";
|
|
import { Preset, FolderStructureInfo } from "./src";
|
|
|
|
|
|
const presets: Preset[] = require('./_presets.json');
|
|
|
|
/**
|
|
* Mission folders configuration
|
|
*/
|
|
const paths: FolderStructureInfo = {
|
|
frameworkFolder: resolve('..', 'Missionframework'),
|
|
missionsFolder: resolve('..', 'Missionbasefiles'),
|
|
workDir: resolve("./build")
|
|
};
|
|
|
|
|
|
/**
|
|
* Create gulp tasks
|
|
*/
|
|
let taskNames: string[] = [];
|
|
let taskNamesPbo: string[] = [];
|
|
let taskNamesZip: string[] = [];
|
|
|
|
for (let preset of presets) {
|
|
const mission = new MissionPaths(preset, paths);
|
|
const taskName = [preset.missionName, preset.map].join('.');
|
|
|
|
|
|
taskNames.push('mission_' + taskName);
|
|
|
|
gulp.task('mission_' + taskName, gulp.series(
|
|
/** Copy mission framework to output dir */
|
|
function frameworkCopy () {
|
|
return gulp.src(mission.getFrameworkPath().concat('/**/*'))
|
|
.pipe(gulp.dest(mission.getOutputDir()));
|
|
},
|
|
|
|
/** Copy mission.sqm to output dir */
|
|
function missionSqmCopy () {
|
|
return gulp.src(mission.getMissionSqmPath())
|
|
.pipe(gulp.dest(mission.getOutputDir()));
|
|
},
|
|
|
|
/** Replace variables values in configuration file */
|
|
function configReplace () {
|
|
let src = gulp.src(mission.getMissionConfigFilePath());
|
|
|
|
const variables = Object.getOwnPropertyNames(preset.variables);
|
|
for (let variable of variables) {
|
|
// https://regex101.com/r/YknC8r/1
|
|
const regex = new RegExp(`(${variable} += +)(?:\\d+|".+")`, 'ig');
|
|
const value = JSON.stringify(preset.variables[variable]);
|
|
|
|
// replace variable value
|
|
src = src.pipe(gulpReplace(regex, `$1${value}`));
|
|
}
|
|
|
|
return src.pipe(gulp.dest(mission.getOutputDir()));
|
|
},
|
|
|
|
/** Replace values in stringtable */
|
|
function stringTableReplace () {
|
|
// I know, replacing XML with regex... :|
|
|
// https://regex101.com/r/TSfish/2
|
|
const versionRegex = /<Key ID="STR_MISSION_VERSION">\s*<Original>(?<version>.+)<\/Original>/;
|
|
const nameRegex = /(<Key ID="STR_MISSION_TITLE">\s*<Original>)(?<name>.+)(<\/Original>)/;
|
|
|
|
return gulp.src(mission.getFrameworkPath().concat('/stringtable.xml'))
|
|
.pipe(gulpModify((content: string) => {
|
|
const version: string = content.match(versionRegex)['groups']['version'];
|
|
|
|
return content.replace(nameRegex, `$1CTI 34 KP Liberation ${preset.mapDisplay || preset.map} ${version}$3`);
|
|
}))
|
|
.pipe(gulp.dest(mission.getOutputDir(), { overwrite: true, }))
|
|
;
|
|
}
|
|
));
|
|
|
|
/**
|
|
* Pack PBOs
|
|
*/
|
|
taskNamesPbo.push('pack_' + taskName);
|
|
|
|
gulp.task('pack_' + taskName, () => {
|
|
return gulp.src(mission.getOutputDir() + '/**/*')
|
|
.pipe(gulpPbo({
|
|
fileName: mission.getFullName() + '.pbo',
|
|
progress: false,
|
|
verbose: false,
|
|
// Do not compress (SLOW)
|
|
compress: true ? [] : [
|
|
'**/*.sqf',
|
|
'mission.sqm',
|
|
'description.ext'
|
|
]
|
|
}))
|
|
.pipe(gulp.dest(mission.getWorkDir() + '/pbo'));
|
|
});
|
|
|
|
/**
|
|
* Create ZIP files
|
|
*/
|
|
taskNamesZip.push('zip_' + taskName);
|
|
|
|
gulp.task('zip_' + taskName, () => {
|
|
return gulp.src([
|
|
resolve('..', './userconfig/**/*'),
|
|
resolve('..', 'LICENSE.md'),
|
|
resolve('..', 'README.md')
|
|
], {
|
|
base: resolve('..') // Change base dir to have correct relative paths in ZIP
|
|
})
|
|
.pipe(
|
|
gulp.src(
|
|
resolve(mission.getWorkDir(), 'pbo', mission.getFullName() + '.pbo'), {
|
|
base: resolve(mission.getWorkDir(), 'pbo') // Change base dir to have correct relative paths in ZIP
|
|
})
|
|
)
|
|
.pipe(gulpZip(
|
|
mission.getFullName() + '.zip'
|
|
))
|
|
.pipe(gulp.dest(mission.getWorkDir()))
|
|
});
|
|
|
|
|
|
}
|
|
|
|
// Main tasks
|
|
gulp.task('clean', () => {
|
|
return gulp.src(paths.workDir)
|
|
.pipe(vinylPaths(del));
|
|
});
|
|
|
|
gulp.task('build', gulp.series(taskNames));
|
|
|
|
gulp.task('pbo', gulp.series(taskNamesPbo));
|
|
|
|
gulp.task('zip', gulp.series(taskNamesZip));
|
|
|
|
gulp.task('default',
|
|
gulp.series(
|
|
gulp.task('build'),
|
|
gulp.task('pbo'),
|
|
gulp.task('zip'),
|
|
)
|
|
);
|