Newer
Older
rpg / apps / game / src / data / sfxSpecs.ts
/**
 * Sfx на спек-синтезе: ключ → SoundSpec (компилирует движок, WAV не нужен).
 * Формулы совпадают с бывшими генераторами tools/audio/gen.mjs дословно —
 * парити-тест sfxSpecs.test.ts сверяет renderSpec с функциями gen.mjs.
 */
import type { AudioManager, PlayOptions, SoundSpec } from '@rpg/engine';

/** Реестр спек-звуков (ключи валидируются тем же validate-тестом, что и WAV). */
export const SPEC_SFX: Record<string, SoundSpec> = {
    // Бывший sfx/bell_hit.wav (bellHit): 4 партиала + клик, normalize 0.7.
    'sfx/bell_hit': { kind: 'chime', dur: 0.35, freq: 520, power: 5, seed: 1, peak: 0.7 },
    // Бывший sfx/whoosh.wav (whoosh): воздух «0 → 1 → 0», normalize 0.4.
    'sfx/whoosh': { kind: 'scrape', dur: 0.7, low: 200, high: 2400, seed: 160, swell: true, peak: 0.4 }
};

/**
 * Единая точка проигрывания sfx по ключу: спек-звук — через playSpec
 * (движок компилирует сам), файловый — через play. Все play-сайты игры
 * зовут этот хелпер, а не audio.play напрямую.
 */
export function playSfx(audio: AudioManager, key: string, opts?: number | PlayOptions): void {
    const spec = SPEC_SFX[key];
    if (spec) void audio.playSpec(key, spec, opts);
    else void audio.play(key, opts);
}