feat: deepen battle atmosphere and portrait eras
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user