Files
MrMelbert e4f533111f Deafness is now solely tracked by trait (#95029)
## About The Pull Request

Deletes `can_hear`, replaces it with trait-checking deafness.

The only two non-trait sources of deafness (hardcrit and lacking ears)
were refactored into using the trait.

## Why It's Good For The Game

Many places inconsistently check for the deaf trait rather than use
can_hear which meant behavior was not consistent.
Some code would treat "do we lack ears?" as being deaf, some would not. 

This unifies all the behavior so being deaf means you're deaf
everywhere.

It also means we can now easily react to gaining and losing deafness via
signal, where before we could not react to it without hooking the trait,
organ remove, AND stat change. Which no one did, of course, because who
would ever think to do that?

## Changelog

🆑 Melbert
refactor: Refactored how deafness is tracked. Please report any weird
interactions with sounds, like messages or sfx being missing.
fix: Lacking ears and being in hard crit now consistently treats you as
"being deaf". This affects a few minor interactions like empath, the
jukebox, and sleeping.
/🆑
2026-02-05 20:19:56 -05:00

151 lines
5.3 KiB
Plaintext

/datum/preference/numeric/volume
abstract_type = /datum/preference/numeric/volume
minimum = 0
maximum = 100
/datum/preference/numeric/volume/create_default_value()
return maximum
/// Controls ambience volume
/datum/preference/numeric/volume/sound_ambience_volume
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_ambience_volume"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/numeric/volume/sound_ambience_volume/apply_to_client(client/client, value)
client.update_ambience_pref(value)
/datum/preference/toggle/sound_breathing
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_breathing"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/toggle/sound_breathing/apply_to_client_updated(client/client, value)
var/mob/living/carbon/carbon_mob = client.mob
if(istype(carbon_mob) && !value)
carbon_mob.breathing_loop.stop()
/// Controls hearing announcement sounds
/datum/preference/toggle/sound_announcements
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_announcements"
savefile_identifier = PREFERENCE_PLAYER
/// Controls hearing the combat mode sound
/datum/preference/toggle/sound_combatmode
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_combatmode"
savefile_identifier = PREFERENCE_PLAYER
/// Controls hearing instruments
/datum/preference/numeric/volume/sound_instruments
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_instruments"
savefile_identifier = PREFERENCE_PLAYER
/// Controls jukebox track volume
/datum/preference/numeric/volume/sound_jukebox
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_jukebox"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/numeric/volume/sound_jukebox/apply_to_client_updated(client/client, value)
var/mob/client_mob = client.mob
if(!isnull(client_mob))
SEND_SIGNAL(client_mob, COMSIG_MOB_JUKEBOX_PREFERENCE_APPLIED)
/datum/preference/choiced/sound_tts
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_tts"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/choiced/sound_tts/init_possible_values()
return list(TTS_SOUND_ENABLED, TTS_SOUND_BLIPS, TTS_SOUND_OFF)
/datum/preference/choiced/sound_tts/create_default_value()
return TTS_SOUND_ENABLED
/datum/preference/numeric/volume/sound_tts_volume
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_tts_volume"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/choiced/sound_achievement
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_achievement"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/choiced/sound_achievement/init_possible_values()
return list(CHEEVO_SOUND_PING, CHEEVO_SOUND_JINGLE, CHEEVO_SOUND_TADA, CHEEVO_SOUND_OFF)
/datum/preference/choiced/sound_achievement/create_default_value()
return CHEEVO_SOUND_PING
/datum/preference/choiced/sound_achievement/apply_to_client_updated(client/client, value)
var/sound/sound_to_send = LAZYACCESS(GLOB.achievement_sounds, value)
if(sound_to_send)
SEND_SOUND(client.mob, sound_to_send)
/// Controls hearing lobby music
/datum/preference/numeric/volume/sound_lobby_volume
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_lobby_volume"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/numeric/volume/sound_lobby_volume/apply_to_client_updated(client/client, value)
if (value && isnewplayer(client.mob))
client.playtitlemusic()
else
client.mob.stop_sound_channel(CHANNEL_LOBBYMUSIC)
/// Controls hearing admin music
/datum/preference/numeric/volume/sound_midi
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_midi"
savefile_identifier = PREFERENCE_PLAYER
/// Controls ship ambience volume
/datum/preference/numeric/volume/sound_ship_ambience_volume
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_ship_ambience_volume"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/numeric/volume/sound_ship_ambience_volume/apply_to_client_updated(client/client, value)
client.mob.refresh_looping_ambience()
/// Controls radio noise volume
/datum/preference/numeric/volume/sound_radio_noise
savefile_key = "sound_radio_noise"
savefile_identifier = PREFERENCE_PLAYER
/// Controls hearing AI VOX announcements
/datum/preference/numeric/volume/sound_ai_vox
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_ai_vox"
savefile_identifier = PREFERENCE_PLAYER
/// Choice of which ghost poll prompt to use
/datum/preference/choiced/sound_ghost_poll_prompt
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_ghost_poll_prompt"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/choiced/sound_ghost_poll_prompt/create_default_value()
return GHOST_POLL_PROMPT_1
/datum/preference/choiced/sound_ghost_poll_prompt/init_possible_values()
return list(GHOST_POLL_PROMPT_DISABLED, GHOST_POLL_PROMPT_1, GHOST_POLL_PROMPT_2)
/// Volume which ghost poll prompts are played at
/datum/preference/numeric/sound_ghost_poll_prompt_volume
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_ghost_poll_prompt_volume"
savefile_identifier = PREFERENCE_PLAYER
minimum = 0
maximum = 200
/// default value is max/2 because 100 1x modifier, while 200 is 2x
/datum/preference/numeric/sound_ghost_poll_prompt_volume/create_default_value()
return maximum/2