2022-05-19 21:26:54 -04:00
|
|
|
|
|
|
|
const fs = require('fs');
|
|
|
|
const path = require('path');
|
|
|
|
|
|
|
|
let output = '';
|
|
|
|
let inputs = [];
|
|
|
|
let definePrefix = '';
|
|
|
|
let lastCommand = '';
|
|
|
|
|
2023-10-14 09:13:13 -04:00
|
|
|
let outputLanguagesSourceFile = '';
|
|
|
|
let outputLanguagesHeader = '';
|
|
|
|
let allSounds = [];
|
|
|
|
let languages = [];
|
2023-10-15 06:42:55 -04:00
|
|
|
let languages_codes = ["EN", "FR", "DE", "RU", "ES"];
|
2023-11-13 04:37:36 -05:00
|
|
|
let language_names = {"EN": "English", "FR": "Français", "DE": "Deutsch", "RU": "Русский язык", "ES": "Español"};
|
2023-10-14 09:13:13 -04:00
|
|
|
let lookup = [];
|
|
|
|
languages.push("EN"); // Always included by default
|
|
|
|
|
2022-05-19 21:26:54 -04:00
|
|
|
for (let i = 2; i < process.argv.length; ++i) {
|
|
|
|
const arg = process.argv[i];
|
|
|
|
if (lastCommand) {
|
|
|
|
if (lastCommand == '-o') {
|
|
|
|
output = arg;
|
|
|
|
} else if (lastCommand == '-p') {
|
|
|
|
definePrefix = arg;
|
|
|
|
}
|
|
|
|
lastCommand = '';
|
|
|
|
} else if (arg[0] == '-') {
|
|
|
|
lastCommand = arg;
|
|
|
|
} else {
|
|
|
|
inputs.push(arg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-14 09:13:13 -04:00
|
|
|
outputLanguagesSourceFile = output + '/languages.c';
|
|
|
|
outputLanguagesHeader += output + '/languages.h';
|
|
|
|
output += '/clips.h';
|
|
|
|
|
2022-05-19 21:26:54 -04:00
|
|
|
inputs.push('TOTAL_COUNT');
|
|
|
|
|
|
|
|
const invalidCharactersRegex = /[^\w\d_]+/gm;
|
|
|
|
|
|
|
|
function formatSoundName(soundFilename, index) {
|
|
|
|
const extension = path.extname(soundFilename);
|
|
|
|
const lastPart = path.basename(soundFilename, extension);
|
|
|
|
const defineName = definePrefix + lastPart.replace(invalidCharactersRegex, '_').toUpperCase();
|
2023-10-14 09:13:13 -04:00
|
|
|
|
|
|
|
trackSoundLanguages(soundFilename, defineName, index);
|
2022-05-19 21:26:54 -04:00
|
|
|
return `#define ${defineName} ${index}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
function formatFile(outputFilename, soundFilenames) {
|
|
|
|
const defineName = outputFilename.replace(invalidCharactersRegex, '_').toUpperCase();
|
|
|
|
return `#ifndef ${defineName}
|
|
|
|
#define ${defineName}
|
|
|
|
|
|
|
|
${soundFilenames.map(formatSoundName).join('\n')}
|
|
|
|
|
|
|
|
#endif`
|
|
|
|
}
|
|
|
|
|
2023-10-14 09:13:13 -04:00
|
|
|
fs.writeFileSync(output, formatFile(output, inputs));
|
|
|
|
|
|
|
|
function trackSoundLanguages(soundFilename, defineName, index) {
|
|
|
|
languages_codes.forEach((language) => {
|
|
|
|
if (defineName.includes("_" + language + "_") && !languages.includes(language))
|
|
|
|
languages.push(language);
|
|
|
|
});
|
|
|
|
if (soundFilename != "TOTAL_COUNT")
|
|
|
|
allSounds.push({defineName: defineName, index: index});
|
|
|
|
}
|
|
|
|
|
|
|
|
function fillOverrideLookup() {
|
|
|
|
for (let language of languages) {
|
|
|
|
for (let overrideSound of allSounds) {
|
|
|
|
let baseSound = overrideSound;
|
|
|
|
let overrideName = overrideSound.defineName;
|
|
|
|
// check if current sound has base version of default language
|
|
|
|
if (overrideName.includes('_' + language + '_') && language != "EN") {
|
|
|
|
baseSound = allSounds.find(element => element.defineName == overrideName.replace('_' + language + '_', '_'));
|
|
|
|
}
|
|
|
|
lookup.push({language: language, baseIndex: baseSound.index, index: overrideSound.index, defineName: overrideSound.defineName});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function generateLanguagesHeader() {
|
|
|
|
|
|
|
|
let header = `#ifndef __LANGUAGES_H__
|
|
|
|
#define __LANGUAGES_H__
|
|
|
|
|
|
|
|
#define NUM_AUDIO_LANGUAGES ${languages.length}
|
|
|
|
|
|
|
|
extern char* AudioLanguages[];
|
|
|
|
extern int AudioLanguageValues[][${allSounds.length}];
|
|
|
|
|
|
|
|
`
|
|
|
|
header += 'enum AudioLanguagesKey\n{\n';
|
|
|
|
header += (languages.length > 0 ? '\tAUDIO_LANGUAGE_' + languages.join(',\n\tAUDIO_LANGUAGE_') + ',\n' : '');
|
|
|
|
header += '};\n';
|
|
|
|
header += '#endif';
|
|
|
|
|
|
|
|
return header;
|
|
|
|
}
|
|
|
|
|
|
|
|
function generateLanguagesSourceFile() {
|
|
|
|
fillOverrideLookup();
|
|
|
|
let sourcefile = '#include "languages.h"\n';
|
|
|
|
sourcefile += '\n';
|
|
|
|
|
|
|
|
sourcefile += 'char* AudioLanguages[] = \n{\n';
|
|
|
|
|
|
|
|
for (let language of languages) {
|
2023-11-12 13:34:42 -05:00
|
|
|
sourcefile += '\t"' + language_names[language] + '",\n';
|
2023-10-14 09:13:13 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
sourcefile += '};\n';
|
|
|
|
|
|
|
|
sourcefile += 'int AudioLanguageValues[][' + allSounds.length + '] = \n{\n';
|
|
|
|
|
|
|
|
for (let language of languages) {
|
2023-10-15 06:06:38 -04:00
|
|
|
if (language == "EN") continue; // save RAM
|
2023-10-14 09:13:13 -04:00
|
|
|
sourcefile += '\t//' + language + '\n\t{\n';
|
|
|
|
|
|
|
|
for (let baseSound of allSounds) {
|
|
|
|
let overrideSound = lookup.find(lookElement => lookElement.language == language && lookElement.baseIndex == baseSound.index && lookElement.baseIndex != lookElement.index);
|
|
|
|
if (overrideSound === undefined) overrideSound = baseSound; // no override, use default
|
|
|
|
sourcefile += '\t' + overrideSound.index + ', // ' + baseSound.defineName + ' ('+baseSound.index+') -> ' + overrideSound.defineName + ' ('+ overrideSound.index+')' + '\n';
|
|
|
|
}
|
|
|
|
sourcefile += '\t},\n';
|
|
|
|
}
|
|
|
|
sourcefile += '};';
|
|
|
|
return sourcefile;
|
|
|
|
}
|
|
|
|
|
2023-10-15 06:42:55 -04:00
|
|
|
// sort found languages in order of elements in language_codes
|
|
|
|
let temp = [...languages_codes];
|
|
|
|
languages = temp.filter(function(cItem) {
|
|
|
|
return languages.find(function(aItem) {
|
|
|
|
return cItem === aItem
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2023-10-14 09:13:13 -04:00
|
|
|
fs.writeFileSync(outputLanguagesHeader, generateLanguagesHeader());
|
2023-11-12 13:34:42 -05:00
|
|
|
fs.writeFileSync(outputLanguagesSourceFile, generateLanguagesSourceFile());
|