feat: strengthen semantic battle feedback
This commit is contained in:
@@ -20,6 +20,7 @@ const requiredTacticalCueKeys = [
|
||||
'objective-failure'
|
||||
];
|
||||
const requiredNarrativeCueKeys = ['story-page-turn'];
|
||||
const requiredSemanticFeedbackCueKeys = ['recovery-cue', 'reward-reveal', 'burn-tick'];
|
||||
const requiredBattleSceneAudioMethods = [
|
||||
'playSoundscape',
|
||||
'playAllyTurnCue',
|
||||
@@ -64,6 +65,23 @@ const narrativeSourceRecord = {
|
||||
'high-pass and low-pass filtered'
|
||||
]
|
||||
};
|
||||
const semanticFeedbackSourceRecords = [
|
||||
{
|
||||
projectFile: 'src/assets/audio/sfx/recovery-cue.mp3',
|
||||
source: 'https://pixabay.com/sound-effects/film-special-effects-holy-healing-spell-533279/',
|
||||
requiredDocumentation: ['Holy Healing Spell', 'Coghezzi', 'approximately 1.9 seconds']
|
||||
},
|
||||
{
|
||||
projectFile: 'src/assets/audio/sfx/reward-reveal.mp3',
|
||||
source: 'https://pixabay.com/sound-effects/film-special-effects-reward-chime-144757/',
|
||||
requiredDocumentation: ['Reward Chime', 'Universfield', '1.4 seconds']
|
||||
},
|
||||
{
|
||||
projectFile: 'src/assets/audio/sfx/burn-tick.mp3',
|
||||
source: 'https://pixabay.com/sound-effects/film-special-effects-electronic-element-burn-spark-1-248606/',
|
||||
requiredDocumentation: ['Electronic element burn spark 1', 'FxProSound', '0.7 seconds']
|
||||
}
|
||||
];
|
||||
|
||||
const server = await createServer({
|
||||
logLevel: 'error',
|
||||
@@ -85,8 +103,10 @@ try {
|
||||
validateRequiredTrackKeys(errors, 'battlefield ambience', ambienceTracks, requiredBattlefieldAmbienceKeys);
|
||||
validateRequiredTrackKeys(errors, 'tactical cue', effectTracks, requiredTacticalCueKeys);
|
||||
validateRequiredTrackKeys(errors, 'narrative cue', effectTracks, requiredNarrativeCueKeys);
|
||||
validateRequiredTrackKeys(errors, 'semantic feedback cue', effectTracks, requiredSemanticFeedbackCueKeys);
|
||||
validateBattlefieldSourceDocumentation(errors);
|
||||
validateNarrativeSourceDocumentation(errors);
|
||||
validateSemanticFeedbackSourceDocumentation(errors);
|
||||
validateBattleSceneAudioIntegration(errors);
|
||||
validateEffectPools(errors, effectPools, effectTracks);
|
||||
validateEffectPoolRegistration(errors, effectPools);
|
||||
@@ -177,6 +197,39 @@ function validateNarrativeSourceDocumentation(errors) {
|
||||
});
|
||||
}
|
||||
|
||||
function validateSemanticFeedbackSourceDocumentation(errors) {
|
||||
const docs = readFileSync(join('docs', 'audio-sources.md'), 'utf8');
|
||||
const sectionHeading = '## Semantic Feedback Cues';
|
||||
const sectionStart = docs.indexOf(sectionHeading);
|
||||
if (sectionStart < 0) {
|
||||
errors.push('docs/audio-sources.md must include the Semantic Feedback Cues section');
|
||||
return;
|
||||
}
|
||||
const nextSectionStart = docs.indexOf('\n## ', sectionStart + sectionHeading.length);
|
||||
const semanticDocs = docs.slice(sectionStart, nextSectionStart < 0 ? docs.length : nextSectionStart);
|
||||
if (!semanticDocs.includes('2026-07-22')) {
|
||||
errors.push('docs/audio-sources.md must record the 2026-07-22 semantic feedback download date');
|
||||
}
|
||||
['48 kHz stereo MP3', 'silence-trimmed', 'fade-in/out', 'high-pass and low-pass filtered'].forEach((detail) => {
|
||||
if (!semanticDocs.includes(detail)) {
|
||||
errors.push(`docs/audio-sources.md is missing semantic feedback processing detail "${detail}"`);
|
||||
}
|
||||
});
|
||||
semanticFeedbackSourceRecords.forEach(({ projectFile, source, requiredDocumentation }) => {
|
||||
if (!semanticDocs.includes(projectFile)) {
|
||||
errors.push(`docs/audio-sources.md is missing semantic feedback file "${projectFile}"`);
|
||||
}
|
||||
if (!semanticDocs.includes(source)) {
|
||||
errors.push(`docs/audio-sources.md is missing Pixabay source "${source}"`);
|
||||
}
|
||||
requiredDocumentation.forEach((detail) => {
|
||||
if (!semanticDocs.includes(detail)) {
|
||||
errors.push(`docs/audio-sources.md is missing semantic feedback detail "${detail}"`);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function validateBattleSceneAudioIntegration(errors) {
|
||||
const path = join('src', 'game', 'scenes', 'BattleScene.ts');
|
||||
const source = readFileSync(path, 'utf8');
|
||||
|
||||
Reference in New Issue
Block a user