feat: refine exploration presentation and audio flow

This commit is contained in:
2026-07-28 05:00:24 +09:00
parent 1773bffbf2
commit 495f98372c
20 changed files with 2295 additions and 354 deletions

View File

@@ -1,4 +1,8 @@
import type { AmbienceTrackKey, MusicTrackKey } from '../audio/audioAssets';
import {
musicTrackIntegratedLoudnessLufs,
type AmbienceTrackKey,
type MusicTrackKey
} from '../audio/audioAssets';
import type { CampSkinId } from './campSkins';
export type CampMusicGroupId = 'rally' | 'wayfarer' | 'grand-strategy' | 'frontier';
@@ -117,3 +121,41 @@ export function getCampSoundscape(skinId: CampSkinId): CampSoundscape {
ambience: campAmbienceDefinitions[mapping.ambienceId]
};
}
export function campMusicVolumeForTrackKey(
trackKey: string,
fallbackVolume = 0.2
) {
return Object.values(campMusicGroups).find(
(definition) => definition.trackKey === trackKey
)?.volume ?? fallbackVolume;
}
export function musicVolumeMatchedToCampTrack(
trackKey: MusicTrackKey,
referenceTrackKey: CampMusicTrackKey = 'camp-rally',
fallbackVolume = campMusicVolumeForTrackKey(referenceTrackKey)
) {
const trackLoudness = musicTrackIntegratedLoudnessLufs[trackKey];
const referenceLoudness =
musicTrackIntegratedLoudnessLufs[referenceTrackKey];
const referenceVolume = campMusicVolumeForTrackKey(
referenceTrackKey,
fallbackVolume
);
if (
!Number.isFinite(trackLoudness) ||
!Number.isFinite(referenceLoudness) ||
!Number.isFinite(referenceVolume) ||
referenceVolume <= 0
) {
return fallbackVolume;
}
const matchedVolume =
referenceVolume *
10 ** ((referenceLoudness - trackLoudness) / 20);
return Math.round(
Math.min(1, Math.max(0.01, matchedVolume)) * 1000
) / 1000;
}