Merge branch 'master' of github.com:tgstation/tgstation into upstream-2026-06-23

This commit is contained in:
Roxy
2026-06-23 15:51:55 -04:00
1007 changed files with 40287 additions and 33507 deletions
+3
View File
@@ -79,6 +79,9 @@
//SOUND STUFF//
///////////////
/// Sound tokens currently playing for this client. Managed by /datum/sound_token and the soundtoken subsystem!! SOUND TOKENS 2026
var/list/datum/sound_token/sound_tokens = list()
////////////
//SECURITY//
////////////
+5
View File
@@ -646,15 +646,20 @@ GLOBAL_LIST_INIT(unrecommended_builds, list(
QDEL_LIST_ASSOC_VAL(char_render_holders)
sound_tokens = null
SSambience.remove_ambience_client(src)
SSmouse_entered.hovers -= src
SSping.currentrun -= src
SSsound_tokens.clients_needing_update -= src
SSsound_tokens.currentrun -= src
QDEL_NULL(view_size)
QDEL_NULL(void)
QDEL_NULL(tooltips)
QDEL_NULL(loot_panel)
QDEL_NULL(parallax_rock)
seen_messages = null
sound_tokens = null
Master.UpdateTickRate()
..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening
return QDEL_HINT_HARDDEL_NOW
@@ -6,6 +6,7 @@
action_delegations = list(
"play_voice" = PROC_REF(play_voice),
"play_voice_robot" = PROC_REF(play_voice_robot),
"play_blips" = PROC_REF(play_blips),
)
/datum/preference_middleware/tts/proc/play_voice(list/params, mob/user)
@@ -13,8 +14,14 @@
return TRUE
var/speaker = preferences.read_preference(/datum/preference/choiced/voice)
var/pitch = preferences.read_preference(/datum/preference/numeric/tts_voice_pitch)
var/blip_base = preferences.read_preference(/datum/preference/choiced/tts_blip_base)
if(blip_base == TTS_BLIPS_MASCULINE)
blip_base = "male"
else
blip_base = "female"
var/blip_number = preferences.read_preference(/datum/preference/numeric/tts_blip_number)
COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS)
INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Hello, this is my voice.", speaker = speaker, pitch = pitch, local = TRUE)
INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Hello, this is my voice.", speaker = speaker, pitch = pitch, local = TRUE, blip_base = blip_base, blip_number = blip_number)
return TRUE
/datum/preference_middleware/tts/proc/play_voice_robot(list/params, mob/user)
@@ -22,6 +29,27 @@
return TRUE
var/speaker = preferences.read_preference(/datum/preference/choiced/voice)
var/pitch = preferences.read_preference(/datum/preference/numeric/tts_voice_pitch)
var/blip_base = preferences.read_preference(/datum/preference/choiced/tts_blip_base)
if(blip_base == TTS_BLIPS_MASCULINE)
blip_base = "male"
else
blip_base = "female"
var/blip_number = preferences.read_preference(/datum/preference/numeric/tts_blip_number)
COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS)
INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, special_filters = TTS_FILTER_SILICON, local = TRUE)
INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, special_filters = TTS_FILTER_SILICON, local = TRUE, blip_base = blip_base, blip_number = blip_number)
return TRUE
/datum/preference_middleware/tts/proc/play_blips(list/params, mob/user)
if(!COOLDOWN_FINISHED(src, tts_test_cooldown))
return TRUE
var/speaker = preferences.read_preference(/datum/preference/choiced/voice)
var/pitch = preferences.read_preference(/datum/preference/numeric/tts_voice_pitch)
var/blip_base = preferences.read_preference(/datum/preference/choiced/tts_blip_base)
if(blip_base == TTS_BLIPS_MASCULINE)
blip_base = "male"
else
blip_base = "female"
var/blip_number = preferences.read_preference(/datum/preference/numeric/tts_blip_number)
COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS)
INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "You owe me 500 credits for your dorm room. GET TO WORK!", speaker = speaker, pitch = pitch, local = TRUE, force_blips = TRUE, blip_base = blip_base, blip_number = blip_number)
return TRUE
@@ -0,0 +1,15 @@
/// Whether or not to toggle ambient occlusion, the shadows around people
/datum/preference/toggle/particle_weather
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "particle_weather"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/toggle/particle_weather/apply_to_client(client/client, value)
for(var/atom/movable/screen/plane_master/rendering_plate/particle_weather/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(RENDER_PLANE_PARTICLE_WEATHER))
plane_master.update_state(client.mob)
for(var/atom/movable/screen/plane_master/weather/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(WEATHER_PLANE))
plane_master.update_state(client.mob)
for(var/atom/movable/screen/plane_master/weather/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(PARTICLE_WEATHER_PLANE))
plane_master.update_state(client.mob)
+35
View File
@@ -65,11 +65,46 @@
/datum/preference/choiced/sound_tts/create_default_value()
return TTS_SOUND_ENABLED
/datum/preference/choiced/sound_tts_radio
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_tts_radio"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/choiced/sound_tts_radio/init_possible_values()
return list(TTS_SOUND_ALL_RADIO, TTS_SOUND_DEPARTMENTAL_RADIO, TTS_SOUND_NO_RADIO)
/datum/preference/choiced/sound_tts_radio/create_default_value()
return TTS_SOUND_ALL_RADIO
/datum/preference/toggle/sound_tts_hear_self_radio
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_tts_hear_self_radio"
savefile_identifier = PREFERENCE_PLAYER
default_value = FALSE // turn this on at your own peril
/datum/preference/numeric/volume/sound_tts_volume
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_tts_volume"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/numeric/volume/sound_tts_volume/apply_to_client_updated(client/client, value)
var/mob/client_mob = client.mob
if(!isnull(client_mob))
SEND_SIGNAL(client_mob, COMSIG_MOB_TTS_VOLUME_PREFERENCE_APPLIED)
/datum/preference/numeric/volume/sound_tts_radio_volume
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_tts_radio_volume"
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/numeric/volume/sound_tts_radio_volume/apply_to_client_updated(client/client, value)
var/mob/client_mob = client.mob
if(!isnull(client_mob))
SEND_SIGNAL(client_mob, COMSIG_MOB_TTS_RADIO_VOLUME_PREFERENCE_APPLIED)
/datum/preference/numeric/volume/sound_tts_radio_volume/create_default_value()
return 75
/datum/preference/choiced/sound_achievement
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "sound_achievement"
+46
View File
@@ -46,3 +46,49 @@
/datum/preference/numeric/tts_voice_pitch/apply_to_human(mob/living/carbon/human/target, value)
if(SStts.tts_enabled && SStts.pitch_enabled)
target.pitch = value
/datum/preference/choiced/tts_blip_base
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "tts_blip_base"
category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
should_update_preview = FALSE
/datum/preference/choiced/tts_blip_base/is_accessible(datum/preferences/preferences)
if(!SStts.tts_enabled)
return FALSE
return ..()
/datum/preference/choiced/tts_blip_base/init_possible_values()
return list(TTS_BLIPS_MASCULINE, TTS_BLIPS_FEMININE)
/datum/preference/choiced/tts_blip_base/apply_to_human(mob/living/carbon/human/target, value)
if(SStts.tts_enabled)
if(value == TTS_BLIPS_MASCULINE)
target.blip_base = "male"
else
target.blip_base = "female"
else
target.blip_base = "male"
/datum/preference/choiced/tts_blip_base/create_default_value()
return pick(list("Masculine", "Feminine"))
/datum/preference/numeric/tts_blip_number
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "tts_blip_number"
category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
minimum = 1
maximum = 4
should_update_preview = FALSE
/datum/preference/numeric/tts_blip_number/is_accessible(datum/preferences/preferences)
if(!SStts.tts_enabled || !SStts.pitch_enabled)
return FALSE
return ..()
/datum/preference/numeric/tts_blip_number/create_default_value()
return rand(1, 4)
/datum/preference/numeric/tts_blip_number/apply_to_human(mob/living/carbon/human/target, value)
if(SStts.tts_enabled)
target.blip_number = value
+20 -5
View File
@@ -81,12 +81,27 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
if(CONFIG_GET(flag/enable_cross_server_ooc)) //SKYRAT EDIT ADDITION
send_ooc_to_other_server(ckey, msg) //SKYRAT EDIT ADDITION
if(prefs.unlock_content)
if(prefs.toggles & MEMBER_PUBLIC)
keyname = "<font color='[prefs.read_preference(/datum/preference/color/ooc_color) || GLOB.normal_ooc_colour]'>[icon2html('icons/ui/chat/member_content.dmi', world, "blag")][keyname]</font>"
var/list/key_tags
var/key_prefix = ""
var/visible_unlock = prefs.unlock_content && (prefs.toggles & MEMBER_PUBLIC)
// heart first lol
if(prefs.hearted)
var/datum/asset/spritesheet_batched/sheet = get_asset_datum(/datum/asset/spritesheet_batched/chat)
keyname = "[sheet.icon_tag("emoji-heart")][keyname]"
LAZYADD(key_tags, "emoji-heart")
if(visible_unlock)
LAZYADD(key_tags, "byond_member")
if(LAZYLEN(key_tags))
var/datum/asset/spritesheet_batched/chat/sheet = get_asset_datum(/datum/asset/spritesheet_batched/chat)
for(var/icon_name in key_tags)
key_prefix = "[key_prefix][sheet.icon_tag(icon_name)]"
key_prefix = "<span style='vertical-align: text-top; padding-right: 0.2em'>[key_prefix]</span>"
keyname = "[key_prefix][keyname]"
if(visible_unlock)
keyname = "<font color='[prefs.read_preference(/datum/preference/color/ooc_color) || GLOB.normal_ooc_colour]'>[keyname]</font>"
//The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url
for(var/client/receiver as anything in GLOB.clients)
if(!receiver.prefs) // Client being created or deleted. Despite all, this can be null.