portal64-still-alive/tools/generate_sound_ids.js

145 lines
4.7 KiB
JavaScript

const fs = require('fs');
const path = require('path');
let output = '';
let inputs = [];
let definePrefix = '';
let lastCommand = '';
let outputLanguagesSourceFile = '';
let outputLanguagesHeader = '';
let allSounds = [];
let languages = [];
let languages_codes = ["EN", "FR", "DE", "RU", "ES"];
let language_names = {"EN": "English", "FR": "French", "DE": "German", "RU": "Russian", "ES": "Spanish"};
let lookup = [];
languages.push("EN"); // Always included by default
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);
}
}
outputLanguagesSourceFile = output + '/languages.c';
outputLanguagesHeader += output + '/languages.h';
output += '/clips.h';
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();
trackSoundLanguages(soundFilename, defineName, index);
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`
}
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) {
sourcefile += '\t"' + language_names[language].toUpperCase() + '",\n';
}
sourcefile += '};\n';
sourcefile += 'int AudioLanguageValues[][' + allSounds.length + '] = \n{\n';
for (let language of languages) {
if (language == "EN") continue; // save RAM
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;
}
// 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
})
})
fs.writeFileSync(outputLanguagesHeader, generateLanguagesHeader());
fs.writeFileSync(outputLanguagesSourceFile, generateLanguagesSourceFile());