feat: deepen battle atmosphere and portrait eras

This commit is contained in:
2026-07-21 23:32:34 +09:00
parent f39de4f47d
commit 3a41f8b671
20 changed files with 1471 additions and 58 deletions

View File

@@ -11,6 +11,44 @@ const sourceFilesToScan = [
'src/game/scenes/StoryScene.ts',
'src/game/scenes/TitleScene.ts'
];
const requiredBattlefieldAmbienceKeys = ['battle-rain', 'battle-fire'];
const requiredTacticalCueKeys = [
'ally-turn',
'enemy-turn',
'operation-alert',
'objective-success',
'objective-failure'
];
const requiredBattleSceneAudioMethods = [
'playSoundscape',
'playAllyTurnCue',
'playEnemyTurnCue',
'playOperationAlert',
'playObjectiveAchieved',
'playObjectiveFailed'
];
const battlefieldSourceRecords = [
{
projectFile: 'src/assets/audio/ambience/battle-rain.mp3',
source: 'https://pixabay.com/sound-effects/nature-gentle-midday-rain-499668/'
},
{
projectFile: 'src/assets/audio/ambience/battle-fire.mp3',
source: 'https://pixabay.com/sound-effects/film-special-effects-fire-sounds-405444/'
},
...['ally-turn', 'enemy-turn', 'operation-alert'].map((key) => ({
projectFile: `src/assets/audio/sfx/${key}.mp3`,
source: 'https://pixabay.com/sound-effects/musical-ancient-war-drums-463214/'
})),
{
projectFile: 'src/assets/audio/sfx/objective-success.mp3',
source: 'https://pixabay.com/sound-effects/film-special-effects-level-complete-143022/'
},
{
projectFile: 'src/assets/audio/sfx/objective-failure.mp3',
source: 'https://pixabay.com/sound-effects/film-special-effects-failure-1-89170/'
}
];
const server = await createServer({
logLevel: 'error',
@@ -29,6 +67,10 @@ try {
validateTrackMap(errors, 'music', musicTracks, 'bgm');
validateTrackMap(errors, 'ambience', ambienceTracks, 'ambience');
validateTrackMap(errors, 'effect', effectTracks, 'sfx');
validateRequiredTrackKeys(errors, 'battlefield ambience', ambienceTracks, requiredBattlefieldAmbienceKeys);
validateRequiredTrackKeys(errors, 'tactical cue', effectTracks, requiredTacticalCueKeys);
validateBattlefieldSourceDocumentation(errors);
validateBattleSceneAudioIntegration(errors);
validateEffectPools(errors, effectPools, effectTracks);
validateEffectPoolRegistration(errors, effectPools);
validateAudioDirectoryCoverage(errors, musicTracks, ambienceTracks, effectTracks);
@@ -77,6 +119,43 @@ function validateEffectPools(errors, effectPools, effectTracks) {
});
}
function validateRequiredTrackKeys(errors, label, tracks, requiredKeys) {
requiredKeys.forEach((key) => {
if (!(key in tracks)) {
errors.push(`required ${label} track "${key}" is not registered`);
}
});
}
function validateBattlefieldSourceDocumentation(errors) {
const docs = readFileSync(join('docs', 'audio-sources.md'), 'utf8');
if (!docs.includes('2026-07-21')) {
errors.push('docs/audio-sources.md must record the 2026-07-21 battlefield audio download date');
}
if (!docs.includes('https://pixabay.com/service/license-summary/')) {
errors.push('docs/audio-sources.md must link the Pixabay Content License summary');
}
battlefieldSourceRecords.forEach(({ projectFile, source }) => {
if (!docs.includes(projectFile)) {
errors.push(`docs/audio-sources.md is missing battlefield audio file "${projectFile}"`);
}
if (!docs.includes(source)) {
errors.push(`docs/audio-sources.md is missing Pixabay source "${source}"`);
}
});
}
function validateBattleSceneAudioIntegration(errors) {
const path = join('src', 'game', 'scenes', 'BattleScene.ts');
const source = readFileSync(path, 'utf8');
requiredBattleSceneAudioMethods.forEach((method) => {
const pattern = new RegExp(`\\bsoundDirector\\.${method}\\s*\\(`);
if (!pattern.test(source)) {
errors.push(`${path} must call soundDirector.${method}()`);
}
});
}
function validateEffectPoolRegistration(errors, effectPools) {
if (Object.keys(effectPools).length === 0) {
return;