mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 02:01:22 +00:00
Adds snowstorm sounds (#89463)
## About The Pull Request Unfortunately, the sound only plays when you're outside, under the storm. I would love for it to play when you're near a window or something, but that would vastly over-complicate things. Maybe later. https://github.com/user-attachments/assets/6ca4bdb8-b1da-4644-bb71-6ca18cf3daec ## Why It's Good For The Game Some free immersion. And in particular in the dark sometimes I don't notice a snowstorm is raging so it adds some nice feedback. ## Changelog 🆑 Melbert sound: Snowstorms now have sounds associated. /🆑
This commit is contained in:
@@ -11,9 +11,10 @@
|
|||||||
#define CHANNEL_CHARGED_SPELL 1015
|
#define CHANNEL_CHARGED_SPELL 1015
|
||||||
#define CHANNEL_ELEVATOR 1014
|
#define CHANNEL_ELEVATOR 1014
|
||||||
#define CHANNEL_ESCAPEMENU 1013
|
#define CHANNEL_ESCAPEMENU 1013
|
||||||
|
#define CHANNEL_WEATHER 1012
|
||||||
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
|
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
|
||||||
//KEEP IT UPDATED
|
//KEEP IT UPDATED
|
||||||
#define CHANNEL_HIGHEST_AVAILABLE 1012
|
#define CHANNEL_HIGHEST_AVAILABLE 1011
|
||||||
|
|
||||||
#define MAX_INSTRUMENT_CHANNELS (128 * 6)
|
#define MAX_INSTRUMENT_CHANNELS (128 * 6)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
//A reference to this list is passed into area sound managers, and it's modified in a manner that preserves that reference in ash_storm.dm
|
//A reference to this list is passed into area sound managers, and it's modified in a manner that preserves that reference in ash_storm.dm
|
||||||
GLOBAL_LIST_EMPTY(ash_storm_sounds)
|
GLOBAL_LIST_EMPTY(ash_storm_sounds)
|
||||||
|
/// Tracks where we should play snowstorm sounds for the area sound listener
|
||||||
|
GLOBAL_LIST_EMPTY(snowstorm_sounds)
|
||||||
|
|
||||||
#define STARTUP_STAGE 1
|
#define STARTUP_STAGE 1
|
||||||
#define MAIN_STAGE 2
|
#define MAIN_STAGE 2
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
///Allows you to set a theme for a set of areas without tying them to looping sounds explicitly
|
///Allows you to set a theme for a set of areas without tying them to looping sounds explicitly
|
||||||
/datum/component/area_sound_manager
|
/datum/component/area_sound_manager
|
||||||
|
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||||
///area -> looping sound type
|
///area -> looping sound type
|
||||||
var/list/area_to_looping_type = list()
|
var/list/area_to_looping_type = list()
|
||||||
///Current sound loop
|
///Current sound loop
|
||||||
|
|||||||
@@ -70,6 +70,7 @@
|
|||||||
user.reset_perspective(target)
|
user.reset_perspective(target)
|
||||||
|
|
||||||
target.AddElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds)
|
target.AddElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds)
|
||||||
|
target.AddElement(/datum/element/weather_listener, /datum/weather/snow_storm, ZTRAIT_SNOWSTORM, GLOB.snowstorm_sounds)
|
||||||
|
|
||||||
RegisterSignal(target, COMSIG_QDELETING, PROC_REF(end_possession))
|
RegisterSignal(target, COMSIG_QDELETING, PROC_REF(end_possession))
|
||||||
return TRUE
|
return TRUE
|
||||||
@@ -82,6 +83,7 @@
|
|||||||
var/mob/poltergeist = parent
|
var/mob/poltergeist = parent
|
||||||
|
|
||||||
possessed.RemoveElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds)
|
possessed.RemoveElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds)
|
||||||
|
possessed.RemoveElement(/datum/element/weather_listener, /datum/weather/snow_storm, ZTRAIT_SNOWSTORM, GLOB.snowstorm_sounds)
|
||||||
UnregisterSignal(possessed, COMSIG_QDELETING)
|
UnregisterSignal(possessed, COMSIG_QDELETING)
|
||||||
|
|
||||||
if(!isnull(stashed_name))
|
if(!isnull(stashed_name))
|
||||||
|
|||||||
@@ -28,6 +28,9 @@
|
|||||||
RegisterSignal(target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(handle_z_level_change), override = TRUE)
|
RegisterSignal(target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(handle_z_level_change), override = TRUE)
|
||||||
RegisterSignal(target, COMSIG_MOB_LOGOUT, PROC_REF(handle_logout), override = TRUE)
|
RegisterSignal(target, COMSIG_MOB_LOGOUT, PROC_REF(handle_logout), override = TRUE)
|
||||||
|
|
||||||
|
var/mob/target_mob = target
|
||||||
|
handle_z_level_change(target_mob, null, target_mob.loc)
|
||||||
|
|
||||||
/datum/element/weather_listener/Detach(datum/source)
|
/datum/element/weather_listener/Detach(datum/source)
|
||||||
. = ..()
|
. = ..()
|
||||||
UnregisterSignal(source, list(COMSIG_MOVABLE_Z_CHANGED, COMSIG_MOB_LOGOUT))
|
UnregisterSignal(source, list(COMSIG_MOVABLE_Z_CHANGED, COMSIG_MOB_LOGOUT))
|
||||||
|
|||||||
@@ -217,7 +217,10 @@
|
|||||||
if(start_sound && !skip_starting_sounds)
|
if(start_sound && !skip_starting_sounds)
|
||||||
play(start_sound, start_volume)
|
play(start_sound, start_volume)
|
||||||
start_wait = start_length
|
start_wait = start_length
|
||||||
timer_id = addtimer(CALLBACK(src, PROC_REF(start_sound_loop)), start_wait, TIMER_CLIENT_TIME | TIMER_DELETE_ME | TIMER_STOPPABLE, SSsound_loops)
|
if(start_wait)
|
||||||
|
timer_id = addtimer(CALLBACK(src, PROC_REF(start_sound_loop)), start_wait, TIMER_CLIENT_TIME | TIMER_DELETE_ME | TIMER_STOPPABLE, SSsound_loops)
|
||||||
|
else
|
||||||
|
start_sound_loop()
|
||||||
|
|
||||||
/// Stops sound playing on current channel, if specified
|
/// Stops sound playing on current channel, if specified
|
||||||
/datum/looping_sound/proc/stop_current()
|
/datum/looping_sound/proc/stop_current()
|
||||||
|
|||||||
@@ -51,3 +51,45 @@
|
|||||||
mid_length = 166.9 SECONDS // exact length of the music in ticks
|
mid_length = 166.9 SECONDS // exact length of the music in ticks
|
||||||
volume = 100
|
volume = 100
|
||||||
extra_range = 30
|
extra_range = 30
|
||||||
|
|
||||||
|
/datum/looping_sound/snowstorm
|
||||||
|
mid_sounds = list(
|
||||||
|
'sound/ambience/weather/snowstorm/snow1.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow2.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow3.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow4.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow5.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow6.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow7.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow8.ogg' = 1,
|
||||||
|
'sound/ambience/weather/snowstorm/snow9.ogg' = 1,
|
||||||
|
)
|
||||||
|
mid_length = 10 SECONDS
|
||||||
|
volume = 30
|
||||||
|
sound_channel = CHANNEL_WEATHER
|
||||||
|
/// Dynamically adjust the length of the sound to appropriate values
|
||||||
|
var/list/sound_to_length = list(
|
||||||
|
'sound/ambience/weather/snowstorm/snow1.ogg' = 11.3 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow2.ogg' = 9.7 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow3.ogg' = 9.7 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow4.ogg' = 7.3 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow5.ogg' = 7.3 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow6.ogg' = 8.8 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow7.ogg' = 11.6 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow8.ogg' = 11.6 SECONDS,
|
||||||
|
'sound/ambience/weather/snowstorm/snow9.ogg' = 7.3 SECONDS,
|
||||||
|
)
|
||||||
|
|
||||||
|
// hijacking sound loop code to run loops of varying length
|
||||||
|
// doing this because set_mid_length can't run DURING a soundloop, which means we can't variably adjust the length of the sound
|
||||||
|
/datum/looping_sound/snowstorm/start_sound_loop()
|
||||||
|
loop_started = TRUE
|
||||||
|
sound_loop()
|
||||||
|
|
||||||
|
/datum/looping_sound/snowstorm/sound_loop(start_time)
|
||||||
|
if(!loop_started)
|
||||||
|
return
|
||||||
|
var/picked_sound = get_sound()
|
||||||
|
play(picked_sound)
|
||||||
|
if(sound_to_length[picked_sound])
|
||||||
|
timer_id = addtimer(CALLBACK(src, PROC_REF(sound_loop)), sound_to_length[picked_sound], TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_DELETE_ME, SSsound_loops)
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
var/telegraph_duration = 30 SECONDS
|
var/telegraph_duration = 30 SECONDS
|
||||||
/// The sound file played to everyone on an affected z-level
|
/// The sound file played to everyone on an affected z-level
|
||||||
var/telegraph_sound
|
var/telegraph_sound
|
||||||
|
/// Volume of the telegraph sound
|
||||||
|
var/telegraph_sound_vol
|
||||||
/// The overlay applied to all tiles on the z-level
|
/// The overlay applied to all tiles on the z-level
|
||||||
var/telegraph_overlay
|
var/telegraph_overlay
|
||||||
|
|
||||||
@@ -42,6 +44,8 @@
|
|||||||
var/end_duration = 30 SECONDS
|
var/end_duration = 30 SECONDS
|
||||||
/// Sound that plays while weather is ending
|
/// Sound that plays while weather is ending
|
||||||
var/end_sound
|
var/end_sound
|
||||||
|
/// Volume of the sound that plays while weather is ending
|
||||||
|
var/end_sound_vol
|
||||||
/// Area overlay while weather is ending
|
/// Area overlay while weather is ending
|
||||||
var/end_overlay
|
var/end_overlay
|
||||||
|
|
||||||
@@ -122,7 +126,7 @@
|
|||||||
SSweather.processing |= src
|
SSweather.processing |= src
|
||||||
update_areas()
|
update_areas()
|
||||||
if(telegraph_duration)
|
if(telegraph_duration)
|
||||||
send_alert(telegraph_message, telegraph_sound)
|
send_alert(telegraph_message, telegraph_sound, telegraph_sound_vol)
|
||||||
addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration)
|
addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -157,7 +161,7 @@
|
|||||||
SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_WINDDOWN(type), src)
|
SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_WINDDOWN(type), src)
|
||||||
stage = WIND_DOWN_STAGE
|
stage = WIND_DOWN_STAGE
|
||||||
update_areas()
|
update_areas()
|
||||||
send_alert(end_message, end_sound)
|
send_alert(end_message, end_sound, end_sound_vol)
|
||||||
addtimer(CALLBACK(src, PROC_REF(end)), end_duration)
|
addtimer(CALLBACK(src, PROC_REF(end)), end_duration)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -178,7 +182,7 @@
|
|||||||
SEND_SIGNAL(impacted_area, COMSIG_WEATHER_ENDED_IN_AREA(type), src)
|
SEND_SIGNAL(impacted_area, COMSIG_WEATHER_ENDED_IN_AREA(type), src)
|
||||||
|
|
||||||
// handles sending all alerts
|
// handles sending all alerts
|
||||||
/datum/weather/proc/send_alert(alert_msg, alert_sfx)
|
/datum/weather/proc/send_alert(alert_msg, alert_sfx, alert_sfx_vol = 100)
|
||||||
for(var/z_level in impacted_z_levels)
|
for(var/z_level in impacted_z_levels)
|
||||||
for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level])
|
for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level])
|
||||||
if(!can_get_alert(player))
|
if(!can_get_alert(player))
|
||||||
@@ -186,7 +190,8 @@
|
|||||||
if(alert_msg)
|
if(alert_msg)
|
||||||
to_chat(player, alert_msg)
|
to_chat(player, alert_msg)
|
||||||
if(alert_sfx)
|
if(alert_sfx)
|
||||||
SEND_SOUND(player, sound(alert_sfx))
|
player.stop_sound_channel(CHANNEL_WEATHER)
|
||||||
|
SEND_SOUND(player, sound(alert_sfx, channel = CHANNEL_WEATHER, volume = alert_sfx_vol))
|
||||||
|
|
||||||
// the checks for if a mob should receive alerts, returns TRUE if can
|
// the checks for if a mob should receive alerts, returns TRUE if can
|
||||||
/datum/weather/proc/can_get_alert(mob/player)
|
/datum/weather/proc/can_get_alert(mob/player)
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
telegraph_message = span_warning("Drifting particles of snow begin to dust the surrounding area..")
|
telegraph_message = span_warning("Drifting particles of snow begin to dust the surrounding area..")
|
||||||
telegraph_duration = 30 SECONDS
|
telegraph_duration = 30 SECONDS
|
||||||
telegraph_overlay = "light_snow"
|
telegraph_overlay = "light_snow"
|
||||||
|
telegraph_sound = 'sound/ambience/weather/snowstorm/snow_start.ogg'
|
||||||
|
telegraph_sound_vol = /datum/looping_sound/snowstorm::volume + 10
|
||||||
|
|
||||||
weather_message = span_userdanger("<i>Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!</i>")
|
weather_message = span_userdanger("<i>Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!</i>")
|
||||||
weather_overlay = "snow_storm"
|
weather_overlay = "snow_storm"
|
||||||
@@ -15,6 +17,8 @@
|
|||||||
|
|
||||||
end_duration = 10 SECONDS
|
end_duration = 10 SECONDS
|
||||||
end_message = span_bolddanger("The snowfall dies down, it should be safe to go outside again.")
|
end_message = span_bolddanger("The snowfall dies down, it should be safe to go outside again.")
|
||||||
|
end_sound = 'sound/ambience/weather/snowstorm/snow_end.ogg'
|
||||||
|
end_sound_vol = /datum/looping_sound/snowstorm::volume + 10
|
||||||
|
|
||||||
area_type = /area
|
area_type = /area
|
||||||
protect_indoors = TRUE
|
protect_indoors = TRUE
|
||||||
@@ -32,13 +36,23 @@
|
|||||||
/datum/weather/snow_storm/weather_act(mob/living/living)
|
/datum/weather/snow_storm/weather_act(mob/living/living)
|
||||||
living.adjust_bodytemperature(-rand(cooling_lower, cooling_upper))
|
living.adjust_bodytemperature(-rand(cooling_lower, cooling_upper))
|
||||||
|
|
||||||
|
/datum/weather/snow_storm/start()
|
||||||
|
GLOB.snowstorm_sounds.Cut() // it's passed by ref
|
||||||
|
for(var/area/impacted_area as anything in impacted_areas)
|
||||||
|
GLOB.snowstorm_sounds[impacted_area] = /datum/looping_sound/snowstorm
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/datum/weather/snow_storm/end()
|
||||||
|
GLOB.snowstorm_sounds.Cut()
|
||||||
|
return ..()
|
||||||
|
|
||||||
// since snowstorm is on a station z level, add extra checks to not annoy everyone
|
// since snowstorm is on a station z level, add extra checks to not annoy everyone
|
||||||
/datum/weather/snow_storm/can_get_alert(mob/player)
|
/datum/weather/snow_storm/can_get_alert(mob/player)
|
||||||
if(!..())
|
if(!..())
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
if(!is_station_level(player.z))
|
if(!is_station_level(player.z))
|
||||||
return TRUE // bypass checks
|
return TRUE // bypass checks
|
||||||
|
|
||||||
if(isobserver(player))
|
if(isobserver(player))
|
||||||
return TRUE
|
return TRUE
|
||||||
@@ -49,7 +63,6 @@
|
|||||||
if(istype(get_area(player), /area/mine))
|
if(istype(get_area(player), /area/mine))
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
for(var/area/snow_area in impacted_areas)
|
for(var/area/snow_area in impacted_areas)
|
||||||
if(locate(snow_area) in view(player))
|
if(locate(snow_area) in view(player))
|
||||||
return TRUE
|
return TRUE
|
||||||
@@ -58,7 +71,7 @@
|
|||||||
|
|
||||||
///A storm that doesn't stop storming, and is a bit stronger
|
///A storm that doesn't stop storming, and is a bit stronger
|
||||||
/datum/weather/snow_storm/forever_storm
|
/datum/weather/snow_storm/forever_storm
|
||||||
telegraph_duration = 0
|
telegraph_duration = 0 SECONDS
|
||||||
perpetual = TRUE
|
perpetual = TRUE
|
||||||
|
|
||||||
probability = 0
|
probability = 0
|
||||||
|
|||||||
@@ -131,6 +131,7 @@
|
|||||||
client.init_verbs()
|
client.init_verbs()
|
||||||
|
|
||||||
AddElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds)
|
AddElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds)
|
||||||
|
AddElement(/datum/element/weather_listener, /datum/weather/snow_storm, ZTRAIT_SNOWSTORM, GLOB.snowstorm_sounds)
|
||||||
|
|
||||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGGED_IN, src)
|
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGGED_IN, src)
|
||||||
|
|
||||||
|
|||||||
13
sound/ambience/weather/snowstorm/attribution.txt
Normal file
13
sound/ambience/weather/snowstorm/attribution.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
snow1.ogg
|
||||||
|
snow2.ogg
|
||||||
|
snow3.ogg
|
||||||
|
snow4.ogg
|
||||||
|
snow5.ogg
|
||||||
|
snow6.ogg
|
||||||
|
snow7.ogg
|
||||||
|
snow8.ogg
|
||||||
|
snow9.ogg
|
||||||
|
snow_start.ogg
|
||||||
|
snow_end.ogg
|
||||||
|
} Wind at door howling 4.ogg by Bosk1 -- https://freesound.org/s/217186/ -- License: Attribution 4.0
|
||||||
BIN
sound/ambience/weather/snowstorm/snow1.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow1.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow2.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow2.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow3.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow3.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow4.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow4.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow5.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow5.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow6.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow6.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow7.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow7.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow8.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow8.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow9.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow9.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow_end.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow_end.ogg
Normal file
Binary file not shown.
BIN
sound/ambience/weather/snowstorm/snow_start.ogg
Normal file
BIN
sound/ambience/weather/snowstorm/snow_start.ogg
Normal file
Binary file not shown.
Reference in New Issue
Block a user