feat: strengthen semantic battle feedback

This commit is contained in:
2026-07-22 12:57:42 +09:00
parent 9d767e864c
commit d3af88c2a9
14 changed files with 803 additions and 34 deletions

View File

@@ -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');