mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -04:00
dea0c3591d
Some parts need to be cleaned up/removed/streamlined after the CMake build can build the game on its own and compatibility with what the old makefile does is no longer needed.
150 lines
4.8 KiB
JavaScript
150 lines
4.8 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", "DE", "ES", "FR", "RU"];
|
|
let language_names = {"EN": "English", "DE": "Deutsch", "ES": "Español", "FR": "Français", "RU": "Русский язык"};
|
|
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);
|
|
}
|
|
}
|
|
|
|
if (!fs.existsSync(output)) {
|
|
fs.mkdirSync(output, { recursive: true });
|
|
}
|
|
|
|
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] + '",\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());
|