#pragma once

#include "sound.qh"

#ifdef SVQC
void soundat(entity e, vector o, float chan, string samp, float vol, float _atten);

void stopsoundto(float _dest, entity e, float chan);

void soundtoat(float _dest, entity e, vector o, float chan, string samp, float vol, float _atten, float _pitch);

bool sound_allowed(int dest, entity e);

float spamsound(entity e, float chan, Sound samp, float vol, float _atten);

void play2(entity e, string filename);

void play2all(string samp);

void play2team(float t, string filename);

void soundto(float dest, entity e, float chan, string samp, float vol, float atten, float _pitch);

void stopsound(entity e, float chan);
#endif

REGISTRY(Sounds, BITS(9))
REGISTER_REGISTRY(Sounds)

#define SOUND(name, path) \
    string SND_##name##_get() { return path; } \
    REGISTER(Sounds, SND, name, m_id, NEW(Sound, SND_##name##_get))

/** @deprecated Used in places where a string is required for legacy reasons, prefer using SND_id constants instead */
#define SND(id) Sound_fixpath(SND_##id)

PRECACHE(Sounds) {
    FOREACH(Sounds, true, it.sound_precache(it));
}

SOUND(Null, "misc/null");
REGISTRY_DEFINE_GET(Sounds, SND_Null)
#include "all.inc"
#include "all.qc"
