diff --git a/_maps/map_files/dun_manor/azure_forest.dmm b/_maps/map_files/dun_manor/azure_forest.dmm index eae68b960..3fa15eab8 100644 --- a/_maps/map_files/dun_manor/azure_forest.dmm +++ b/_maps/map_files/dun_manor/azure_forest.dmm @@ -547,6 +547,10 @@ /obj/machinery/light/rogue/wallfire/candle/blue, /turf/open/floor/rogue/hexstone, /area/rogue/under/town/basement) +"es" = ( +/obj/machinery/light/rogue/firebowl/stump, +/turf/open/floor/rogue/dirt/road, +/area/rogue/indoors/shelter/mountains) "ew" = ( /turf/open/transparent/openspace, /area/rogue/outdoors/woods) @@ -1080,7 +1084,7 @@ dir = 1 }, /turf/open/floor/rogue/cobblerock, -/area/rogue/outdoors/mountains) +/area/rogue/indoors/shelter/mountains) "jj" = ( /turf/open/water/sewer, /area/rogue/under/cave/dungeon1/gethsmane/inner) @@ -1160,6 +1164,9 @@ "jK" = ( /turf/closed/mineral/rogue/bedrock, /area/rogue/under/town/basement) +"jM" = ( +/turf/open/floor/rogue/cobblerock, +/area/rogue/indoors/shelter/mountains) "jQ" = ( /mob/living/carbon/human/species/skeleton/npc/no_equipment, /turf/open/floor/rogue/hexstone, @@ -1260,6 +1267,10 @@ icon_state = "vertw" }, /area/rogue/indoors) +"kt" = ( +/obj/structure/fluff/railing/wood, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/shelter/mountains) "ku" = ( /obj/effect/spawner/lootdrop/roguetown/dungeon/tools, /turf/open/floor/rogue/greenstone, @@ -1894,6 +1905,12 @@ /obj/structure/fermenting_barrel/random/beer, /turf/open/floor/rogue/blocks, /area/rogue/under/town/basement) +"pH" = ( +/obj/structure/fluff/railing/wood{ + dir = 1 + }, +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/shelter/mountains) "pL" = ( /obj/machinery/light/rogue/firebowl/stump, /turf/open/floor/rogue/dirt/road, @@ -3239,7 +3256,7 @@ dir = 1 }, /turf/open/floor/rogue/cobblerock, -/area/rogue/outdoors/mountains) +/area/rogue/indoors/shelter/mountains) "AY" = ( /obj/structure/stairs/stone{ dir = 1; @@ -3729,7 +3746,7 @@ dir = 1 }, /turf/open/floor/rogue/naturalstone, -/area/rogue/outdoors/mountains) +/area/rogue/indoors/shelter/mountains) "Fl" = ( /turf/closed/wall/mineral/rogue/tent{ dir = 1 @@ -3801,7 +3818,7 @@ "FM" = ( /obj/structure/far_travel, /turf/open/floor/rogue/cobblerock, -/area/rogue/outdoors/mountains) +/area/rogue/indoors/shelter/mountains) "FO" = ( /turf/closed/wall/mineral/rogue/wooddark/end, /area/rogue/indoors) @@ -3826,6 +3843,9 @@ /obj/effect/spawner/lootdrop/roguetown/sewers, /turf/open/floor/rogue/dirt/road, /area/rogue/indoors) +"Gh" = ( +/turf/open/floor/rogue/naturalstone, +/area/rogue/indoors/shelter/mountains) "Gi" = ( /turf/open/transparent/openspace, /area/rogue/under/town/basement) @@ -3892,6 +3912,9 @@ /obj/structure/fluff/alch, /turf/open/floor/rogue/greenstone, /area/rogue/under/town/basement) +"GO" = ( +/turf/open/floor/rogue/dirt/road, +/area/rogue/indoors/shelter/mountains) "GR" = ( /obj/item/grown/log/tree/small, /obj/item/grown/log/tree/stick, @@ -4694,6 +4717,9 @@ "Nb" = ( /turf/open/floor/rogue/ruinedwood/turned, /area/rogue/indoors/shelter/woods) +"Nc" = ( +/turf/open/floor/rogue/grass, +/area/rogue/indoors/shelter/mountains) "Ne" = ( /turf/open/water/cleanshallow, /area/rogue/under/cave) @@ -5126,6 +5152,12 @@ /obj/item/grown/log/tree/small, /turf/open/floor/rogue/dirt, /area/rogue/outdoors/woods) +"RA" = ( +/obj/structure/fluff/railing/wood{ + dir = 1 + }, +/turf/open/floor/rogue/grass, +/area/rogue/indoors/shelter/mountains) "RB" = ( /obj/structure/flora/newtree, /obj/structure/flora/newtree, @@ -5719,6 +5751,9 @@ /mob/living/simple_animal/hostile/retaliate/rogue/mudcrab, /turf/open/water/cleanshallow, /area/rogue/outdoors/woods) +"Wh" = ( +/turf/open/floor/rogue/dirt, +/area/rogue/indoors/shelter/mountains) "Wk" = ( /obj/structure/fluff/railing/fence{ dir = 1 @@ -6091,7 +6126,7 @@ name = "AZURE PEAK - EAST" }, /turf/open/floor/rogue/grass, -/area/rogue/outdoors/mountains) +/area/rogue/indoors/shelter/mountains) "ZM" = ( /obj/item/grown/log/tree, /obj/item/grown/log/tree/stick, @@ -81637,8 +81672,8 @@ rj GH GH GH -zu -HO +Nc +Gh gU gU gU @@ -81791,10 +81826,10 @@ rj rj rj rj -Ug +Wh GH -zu -Jx +Nc +jM Fk gU gU @@ -81948,10 +81983,10 @@ rj rj rj rj -dP -Jx -Jx -Jx +GO +jM +jM +jM AX FM gU @@ -82104,11 +82139,11 @@ rj rj rj rj -eH -Jx -Jx -Jx -Jx +kt +jM +jM +jM +jM jg FM gU @@ -82261,11 +82296,11 @@ rj rj rj rj -eH -Jx -Jx -Jx -Jx +kt +jM +jM +jM +jM AX FM gU @@ -82418,11 +82453,11 @@ rj rj rj rj -eH +kt ZL -Jx -Jx -HO +jM +jM +Gh Fk gU gU @@ -82576,11 +82611,11 @@ rj rj rj rj -dP -Jx -zu -Jx -HO +GO +jM +Nc +jM +Gh gU gU gU @@ -82732,12 +82767,12 @@ rj rj rj rj -zu -Jr -Jx -pL -zu -HO +Nc +RA +jM +es +Nc +Gh gU gU gU @@ -82889,10 +82924,10 @@ rj rj rj rj -Ug -Jr -Jx -Ug +Wh +RA +jM +Wh GH GH GH @@ -83046,10 +83081,10 @@ rj rj rj rj -dP -EB -Jx -dP +GO +pH +jM +GO GH GH GH @@ -83204,10 +83239,10 @@ rj rj rj rj -EB -Jx -Jx -zu +pH +jM +jM +Nc GH GH gU @@ -83362,9 +83397,9 @@ rj rj rj Ug -zu -Jx -zu +Nc +jM +Nc GH GH gU @@ -83520,8 +83555,8 @@ rj rj rj dP -Jx -Jx +jM +jM GH GH gU @@ -83678,8 +83713,8 @@ rj rj Ug Jr -Jx -zu +jM +Nc GH gU gU @@ -83835,8 +83870,8 @@ rj rj rj EB -Jx -Jx +jM +jM GH gU gU @@ -83993,7 +84028,7 @@ rj rj EB zu -Jx +jM GH gU gU @@ -84150,7 +84185,7 @@ rj rj Ug zu -Jx +jM GH gU gU diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 85b8b2bda..608f5e52d 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -6,22 +6,23 @@ #define CHANNEL_JUSTICAR_ARK 1020 #define CHANNEL_HEARTBEAT 1019 //sound channel for heartbeats #define CHANNEL_AMBIENCE 1018 -#define CHANNEL_BUZZ 1017 -#define CHANNEL_BICYCLE 1016 -#define CHANNEL_RAIN 1015 -#define CHANNEL_MUSIC 1014 -#define CHANNEL_CMUSIC 1013 -#define CHANNEL_IMSICK 1012 +#define CHANNEL_DRONING_AMBIENCE 1017 +#define CHANNEL_BUZZ 1016 +#define CHANNEL_BICYCLE 1015 +#define CHANNEL_RAIN 1014 +#define CHANNEL_MUSIC 1013 +#define CHANNEL_CMUSIC 1012 +#define CHANNEL_IMSICK 1011 //CIT CHANNELS - TRY NOT TO REGRESS -#define CHANNEL_PRED 1011 -#define CHANNEL_DIGEST 1010 -#define CHANNEL_PREYLOOP 1009 +#define CHANNEL_PRED 1010 +#define CHANNEL_DIGEST 109 +#define CHANNEL_PREYLOOP 1008 //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1008 +#define CHANNEL_HIGHEST_AVAILABLE 1007 #define SOUND_MINIMUM_PRESSURE 10 @@ -187,6 +188,41 @@ 'sound/ambience/noises/birds (6).ogg',\ 'sound/ambience/noises/birds (7).ogg') +//Ambient loops are subtle and long, more can easily be added/changed to an area. + +#define AMB_FOREST_LOOP_DAY list('modular_causticcove/sound/ambient/forest_ambience_day.ogg') +#define AMB_INDOORS_FOREST_LOOP_DAY list('modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_day.ogg') + +#define AMB_FOREST_LOOP_DAWN list('modular_causticcove/sound/ambient/forest_ambience_dawn.ogg') +#define AMB_INDOORS_FOREST_LOOP_DAWN list('modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dawn.ogg') + +#define AMB_FOREST_LOOP_DUSK list('modular_causticcove/sound/ambient/forest_ambience_dusk.ogg') +#define AMB_INDOORS_FOREST_LOOP_DUSK list('modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dusk.ogg') + +#define AMB_FOREST_LOOP_NIGHT list('modular_causticcove/sound/ambient/forest_ambience_night.ogg') +#define AMB_INDOORS_FOREST_LOOP_NIGHT list('modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_night.ogg') + +#define AMB_TOWN_LOOP_DAY list('modular_causticcove/sound/ambient/town_ambience_day.ogg') +#define AMB_INDOOR_TOWN_LOOP_DAY list('modular_causticcove/sound/ambient/indoor/town_indoor_ambience_day.ogg') + +#define AMB_TOWN_LOOP_NIGHT list('modular_causticcove/sound/ambient/town_ambience_night.ogg') +#define AMB_INDOOR_TOWN_LOOP_NIGHT list('modular_causticcove/sound/ambient/indoor/town_indoor_ambience_night.ogg') + +#define AMB_QUIET_LOOP list('modular_causticcove/sound/ambient/quiet_ambience.ogg') //A quiet place. Primarily for church/manor + +#define AMB_CAVE_LOOP list('modular_causticcove/sound/ambient/cave_ambience_normal.ogg') +#define AMB_CAVE_LOOP_OUTDOOR list('modular_causticcove/sound/ambient/outdoor/cave_ambience_outdoor.ogg') //Less reverb cuz outdoors +#define AMB_CAVE_LOOP_EVIL list('modular_causticcove/sound/ambient/cave_ambience_evil.ogg') //Mt. Decap type locations specifically +#define AMB_CAVE_LOOP_EVIL_OUTDOOR list('modular_causticcove/sound/ambient/outdoor/cave_ambience_evil_outdoor.ogg') //Mt. Decap type locations specifically + +//Used for locations with no specific audio, basements, some dungeons even, just... Under! +#define AMB_GENERAL_UNDER_LOOP list('modular_causticcove/sound/ambient/underground_general_ambience_loop.ogg') + +#define AMB_LAKE_LOOP list('modular_causticcove/sound/ambient/lake_ambience_loop.ogg') + +#define AMB_MANOR_LOOP_DAY list('modular_causticcove/sound/ambient/manor_ambience_loop.ogg') + +#define AMB_ARCANE_LOOP list('modular_causticcove/sound/ambient/arcane_ambience_loop.ogg') //For magical places and the likes. #define INTERACTION_SOUND_RANGE_MODIFIER 0 #define EQUIP_SOUND_VOLUME 100 diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 8485d7f92..c061b074b 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -205,6 +205,7 @@ for(var/client/C in GLOB.clients) if(C.mob) SSdroning.kill_droning(C) + SSdroning.kill_ambient_loop(C) C.mob.playsound_local(C.mob, 'sound/music/credits.ogg', 100, FALSE) if(isliving(C.mob) && C.ckey) key_list += C.ckey diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index e5d0a4873..94b830bb0 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -39,24 +39,28 @@ GLOBAL_VAR_INIT(dayspassed, FALSE) // testing("set [tod]") if(GLOB.todoverride) GLOB.tod = GLOB.todoverride - if((GLOB.tod != oldtod) && !GLOB.todoverride && (GLOB.dayspassed>1)) //weather check on tod changes + if((GLOB.tod != oldtod) && !GLOB.todoverride && (GLOB.dayspassed >= 0)) //weather check on tod changes if(!GLOB.forecast) switch(GLOB.tod) if("dawn") - if(prob(12)) + if(prob(18)) GLOB.forecast = "fog" - if(prob(13)) + if(prob(9)) GLOB.forecast = "rain" if("day") - if(prob(5)) + if(prob(4)) + GLOB.forecast = "fog" + if(prob(6)) GLOB.forecast = "rain" if("dusk") - if(prob(13)) + if(prob(6)) + GLOB.forecast = "fog" + if(prob(4)) GLOB.forecast = "rain" if("night") - if(prob(5)) + if(prob(9)) GLOB.forecast = "fog" - if(prob(21)) + if(prob(18)) GLOB.forecast = "rain" if(GLOB.forecast == "rain") var/foundnd @@ -64,12 +68,12 @@ GLOBAL_VAR_INIT(dayspassed, FALSE) foundnd = TRUE if(!foundnd) SSweather.run_weather(/datum/weather/rain, 1) - /* if(GLOB.forecast == "fog") + if(GLOB.forecast == "fog") var/foundnd for(var/datum/weather/fog/R in SSweather.curweathers) foundnd = TRUE if(!foundnd) - SSweather.run_weather(/datum/weather/fog, 1) */ + SSweather.run_weather(/datum/weather/fog, 1) else switch(GLOB.forecast) //end the weather now if("rain") diff --git a/code/controllers/subsystem/music_update.dm b/code/controllers/subsystem/music_update.dm index 7bb8bd9f2..a07f23d1e 100644 --- a/code/controllers/subsystem/music_update.dm +++ b/code/controllers/subsystem/music_update.dm @@ -10,6 +10,11 @@ SUBSYSTEM_DEF(ambience) ///Cache for sanic speed :D var/list/currentrun = list() + //Same as above but for droning ambience that lasts much longer + var/list/ambience_droning_listening_clients = list() + + var/list/currentdronerun = list() + /datum/controller/subsystem/ambience/fire(resumed) if(!resumed) currentrun = ambience_listening_clients.Copy() diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index f29673d14..becbb3f8a 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -79,6 +79,7 @@ SUBSYSTEM_DEF(nightshift) if(!cmode) SSdroning.play_area_sound(areal, src.client) SSdroning.play_loop(areal, src.client) + SSdroning.play_ambient_loop(areal, src.client) if(todd == "dawn") if(HAS_TRAIT(src, TRAIT_VAMP_DREAMS)) apply_status_effect(/datum/status_effect/debuff/vamp_dreams) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 4e8c8cb57..37f1141d2 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -86,6 +86,7 @@ SSdroning.kill_droning(owner.client) SSdroning.kill_loop(owner.client) SSdroning.kill_rain(owner.client) + SSdroning.kill_ambient_loop(owner.client) owner.set_typing_indicator(FALSE) if(iscarbon(owner)) //to avoid repeated istypes carbon_owner = owner @@ -96,6 +97,7 @@ if(human_owner && human_owner.client) SSdroning.play_area_sound(get_area(src), human_owner.client) SSdroning.play_loop(get_area(src), human_owner.client) + SSdroning.play_ambient_loop(get_area(src), human_owner.client) . = ..() /datum/status_effect/incapacitating/sleeping/Destroy() diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 7d921aabb..e167440df 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -28,7 +28,7 @@ var/impacted_z_levels = list() // The list of z-levels that this weather is actively affecting var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. - var/overlay_plane = BLACKNESS_PLANE + var/overlay_plane = WEATHER_PLANE var/aesthetic = FALSE //If the weather has no purpose other than looks var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather @@ -130,6 +130,7 @@ SEND_SOUND(M, sound(weather_sound)) addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration) + /datum/weather/proc/wind_down() if(stage >= WIND_DOWN_STAGE) return @@ -145,6 +146,7 @@ to_chat(M, end_message) if(end_sound) SEND_SOUND(M, sound(end_sound)) + addtimer(CALLBACK(src, PROC_REF(end)), end_duration) /datum/weather/proc/end() @@ -214,4 +216,18 @@ if(WIND_DOWN_STAGE) return end_overlay return ""*/ //thsi bugs out when rain falls then u set off a bomb - return weather_overlay \ No newline at end of file + return weather_overlay + +/datum/weather/process() + for(var/mob/living/carbon/M in GLOB.player_list) + var/area/A = get_area(M) + if(!istype(A, area_type)) + protected_weather_act(M) + else + unprotected_weather_act(M) + +/datum/weather/proc/protected_weather_act(mob/living/carbon/M) + return + +/datum/weather/proc/unprotected_weather_act(mob/living/carbon/M) + return diff --git a/code/datums/weather/weather_types/roguetown/fog.dm b/code/datums/weather/weather_types/roguetown/fog.dm index c1103ec1e..710089984 100644 --- a/code/datums/weather/weather_types/roguetown/fog.dm +++ b/code/datums/weather/weather_types/roguetown/fog.dm @@ -1,4 +1,4 @@ -/* /datum/weather/fog +/datum/weather/fog name = "fog" desc = "" @@ -6,11 +6,10 @@ telegraph_message = span_warning("The fog is coming.") telegraph_sound = 'sound/blank.ogg' weather_message = "" - weather_overlay = "rain1" weather_duration_lower = 5 MINUTES weather_duration_upper = 15 MINUTES weather_sound = 'sound/blank.ogg' - weather_alpha = 200 + weather_alpha = 155 probability = 3 @@ -27,8 +26,13 @@ /datum/weather/fog/process() + . = ..() #ifndef TESTSERVER if(GLOB.forecast != "fog") wind_down() return -#endif */ +#endif + +/datum/weather/fog/New(z_levels) + impacted_z_levels = GLOB.sky_z.Copy() + . = ..() diff --git a/code/datums/weather/weather_types/roguetown/rain.dm b/code/datums/weather/weather_types/roguetown/rain.dm index fd56e31fb..be69ae954 100644 --- a/code/datums/weather/weather_types/roguetown/rain.dm +++ b/code/datums/weather/weather_types/roguetown/rain.dm @@ -12,7 +12,7 @@ weather_duration_lower = 5 MINUTES weather_duration_upper = 12 MINUTES weather_sound = 'sound/blank.ogg' - weather_alpha = 200 + weather_alpha = 255 probability = 3 @@ -88,28 +88,61 @@ update_sight() /datum/weather/rain/process() + . = ..() #ifndef TESTSERVER if(GLOB.forecast != "rain") wind_down() return #endif + +/datum/weather/rain/unprotected_weather_act(mob/living/carbon/M) + //Wetness mechanics + var/threshold = M.get_covered_limbs() + if(!M.is_wet) + M.is_drying = FALSE + M.is_wet = TRUE + if(!istype(get_area(M), area_type)) //If in doors then don't wet again + spawn(rand(60, 80) * threshold) + switch(threshold) + if(0, 1) //No coverage/Basically none + M.apply_status_effect(/datum/status_effect/buff/wetness/drenched) + if(2, 3) + M.apply_status_effect(/datum/status_effect/buff/wetness/wet) + if(4, 5) + M.apply_status_effect(/datum/status_effect/buff/wetness/damp) + //if 6 or more you're good! + + if(world.time < lastlightning + 66 SECONDS) + return + lastlightning = world.time + for(M in GLOB.player_list) + M.playsound_local(M, pick('sound/ambience/noises/thunout (1).ogg','sound/ambience/noises/thunout (2).ogg','sound/ambience/noises/thunout (3).ogg','sound/ambience/noises/thunout (4).ogg'), 100, FALSE) + M.lightning_flashing = TRUE + M.update_sight() + addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, reset_lightning)), 1) + +/datum/weather/rain/protected_weather_act(mob/living/carbon/M) + //Weather drying + var/threshold = M.get_covered_limbs() + if(M.is_wet && !M.is_drying) + M.is_drying = TRUE //Anti loop spam and drying check + spawn(1800 / (threshold / 10)) //Stay protected for 3 minutes. Weather Threshold makes this faster. + if(!istype(get_area(M), area_type) && M.is_drying) + //Remove them ALL just in case. + M.remove_status_effect(/datum/status_effect/buff/wetness/damp) + M.remove_status_effect(/datum/status_effect/buff/wetness/wet) + M.remove_status_effect(/datum/status_effect/buff/wetness/drenched) + to_chat(M, "I feel dry again.") + M.is_wet = FALSE + M.is_drying = FALSE + else + M.is_drying = FALSE + if(world.time < lastlightning + 66 SECONDS) return lastlightning = world.time - for(var/mob/living/carbon/M in GLOB.player_list) - var/area/A = get_area(M) - if(istype(A, /area/rogue/outdoors)) - M.playsound_local(M, pick('sound/ambience/noises/thunout (1).ogg','sound/ambience/noises/thunout (2).ogg','sound/ambience/noises/thunout (3).ogg','sound/ambience/noises/thunout (4).ogg'), 100, FALSE) - M.lightning_flashing = TRUE - M.update_sight() - addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, reset_lightning)), 1) - continue - if(istype(A, /area/rogue/indoors)) - M.playsound_local(M, pick('sound/ambience/noises/thunin (1).ogg','sound/ambience/noises/thunin (2).ogg','sound/ambience/noises/thunin (3).ogg','sound/ambience/noises/thunin (4).ogg'), 100, FALSE) - continue -// testing("dolightingflash") -// for(var/obj/machinery/light/sun/L in GLOB.machines) -// L.lightningflash() + for(M in GLOB.player_list) + M.playsound_local(M, pick('sound/ambience/noises/thunin (1).ogg','sound/ambience/noises/thunin (2).ogg','sound/ambience/noises/thunin (3).ogg','sound/ambience/noises/thunin (4).ogg'), 100, FALSE) /datum/weather/rain/start() . = ..() @@ -126,3 +159,9 @@ var/mob/living/L = M if(L.client) SSdroning.kill_rain(L.client) + if(iscarbon(M)) //Dry us off. + var/mob/living/carbon/L = M + spawn(rand(30, 50)) + L.remove_status_effect(/datum/status_effect/buff/wetness/damp) + L.remove_status_effect(/datum/status_effect/buff/wetness/wet) + L.remove_status_effect(/datum/status_effect/buff/wetness/drenched) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2a9b7b805..5de63c352 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -68,6 +68,11 @@ var/list/ambientsounds = GENERIC var/list/ambientrain = null var/list/ambientnight = null + var/list/ambientdrone = list('sound/blank.ogg') //Just in case we really don't have something. + var/list/ambientdroneday = null + var/list/ambientdronenight = null + var/list/ambientdronedusk = null + var/list/ambientdronedawn = null var/min_ambience_cooldown = 70 SECONDS var/max_ambience_cooldown = 120 SECONDS @@ -76,6 +81,7 @@ var/we_looping_here = TRUE var/droning_sound_current = null + var/ambient_droning_sound_current = null var/droning_sound_dawn = null var/droning_sound = null var/droning_sound_dusk = null @@ -85,6 +91,7 @@ var/droning_wait = 0 var/droning_volume = 100 var/droning_channel = CHANNEL_BUZZ + var/ambient_channel = CHANNEL_DRONING_AMBIENCE var/droning_frequency = 0 var/list/spookysounds = null @@ -636,6 +643,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) //Ambience if combat mode is off SSdroning.area_entered(src, living_arrived.client) SSdroning.play_loop(src, living_arrived.client) + SSdroning.play_ambient_loop(src, living_arrived.client) var/found = FALSE for(var/datum/weather/rain/R in SSweather.curweathers) found = TRUE @@ -772,6 +780,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) SSdroning.area_entered(src, boarder.client) boarder.client.update_ambience_pref() SSdroning.play_loop(src, boarder.client) + SSdroning.play_ambient_loop(src, boarder.client) var/found = FALSE for(var/datum/weather/rain/R in SSweather.curweathers) found = TRUE @@ -783,6 +792,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(istype(boarder) && boarder.client) SSdroning.area_entered(src, boarder.client) SSdroning.play_loop(src, boarder.client) + SSdroning.play_ambient_loop(src, boarder.client) var/found = FALSE for(var/datum/weather/rain/R in SSweather.curweathers) found = TRUE diff --git a/code/game/area/roguetownareas.dm b/code/game/area/roguetownareas.dm index 32825a780..f7c8d6d3f 100644 --- a/code/game/area/roguetownareas.dm +++ b/code/game/area/roguetownareas.dm @@ -7,6 +7,10 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town icon_state = "rogue" has_gravity = STANDARD_GRAVITY ambientsounds = null + ambientdroneday = null + ambientdronedawn = null + ambientdronenight = null + ambientdronedusk = null always_unpowered = TRUE poweralm = FALSE power_environ = TRUE @@ -26,6 +30,10 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town /area/rogue/indoors name = "indoors rt" icon_state = "indoors" + ambientdroneday = AMB_INDOORS_FOREST_LOOP_DAY + ambientdronedawn = AMB_INDOORS_FOREST_LOOP_DAWN + ambientdronenight = AMB_INDOORS_FOREST_LOOP_NIGHT + ambientdronedusk = AMB_INDOORS_FOREST_LOOP_DUSK ambientrain = RAIN_IN ambientsounds = AMB_INGEN ambientnight = AMB_INGEN @@ -63,8 +71,11 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town name = "outdoors roguetown" icon_state = "outdoors" outdoors = TRUE + ambientdroneday = AMB_FOREST_LOOP_DAY + ambientdronedawn = AMB_FOREST_LOOP_DAWN + ambientdronenight = AMB_FOREST_LOOP_NIGHT + ambientdronedusk = AMB_FOREST_LOOP_DUSK ambientrain = RAIN_OUT -// ambientsounds = list('sound/ambience/wamb.ogg') ambientsounds = AMB_TOWNDAY ambientnight = AMB_TOWNNIGHT spookysounds = SPOOKY_CROWS @@ -121,12 +132,14 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town /mob/living/simple_animal/hostile/retaliate/rogue/bigrat = 30, /mob/living/carbon/human/species/skeleton/npc/ambush = 10, /mob/living/carbon/human/species/goblin/npc/ambush/hell = 20) + ambientdrone = AMB_CAVE_LOOP_EVIL droning_sound = 'sound/music/area/decap.ogg' droning_sound_dusk = null droning_sound_night = null first_time_text = "MOUNT DECAPITATION" ambush_times = list("night","dawn","dusk","day") converted_type = /area/rogue/indoors/shelter/mountains/decap + /area/rogue/indoors/shelter/mountains/decap icon_state = "decap" droning_sound = 'sound/music/area/decap.ogg' @@ -145,12 +158,17 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town /mob/living/simple_animal/hostile/retaliate/rogue/wolf = 30, /mob/living/carbon/human/species/skeleton/npc/ambush = 50) first_time_text = "AZURE BASIN" + ambientdroneday = AMB_TOWN_LOOP_DAY + ambientdronenight = AMB_TOWN_LOOP_NIGHT droning_sound = 'sound/music/area/field.ogg' droning_sound_dusk = 'sound/music/area/septimus.ogg' droning_sound_night = 'sound/music/area/sleeping.ogg' converted_type = /area/rogue/indoors/shelter/rtfield + /area/rogue/indoors/shelter/rtfield icon_state = "rtfield" + ambientdroneday = AMB_INDOOR_TOWN_LOOP_DAY + ambientdronenight = AMB_INDOOR_TOWN_LOOP_NIGHT droning_sound = 'sound/music/area/field.ogg' droning_sound_dusk = 'sound/music/area/septimus.ogg' droning_sound_night = 'sound/music/area/sleeping.ogg' @@ -275,6 +293,8 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town soundenv = 8 plane = INDOOR_PLANE converted_type = /area/rogue/outdoors/exposed + ambientdrone = AMB_GENERAL_UNDER_LOOP + /area/rogue/outdoors/exposed icon_state = "exposed" droning_sound = 'sound/music/area/towngen.ogg' @@ -284,6 +304,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town /area/rogue/under/cave name = "cave" icon_state = "cave" + ambientdrone = AMB_CAVE_LOOP ambientsounds = AMB_GENCAVE ambientnight = AMB_GENCAVE spookysounds = SPOOKY_CAVE @@ -300,16 +321,19 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town /mob/living/carbon/human/species/skeleton/npc/ambush = 10, /mob/living/simple_animal/hostile/retaliate/rogue/minotaur = 5) converted_type = /area/rogue/outdoors/caves + /area/rogue/outdoors/caves icon_state = "caves" droning_sound = 'sound/music/area/caves.ogg' droning_sound_dusk = null droning_sound_night = null + ambientdrone = AMB_CAVE_LOOP_OUTDOOR /area/rogue/under/cavewet name = "cavewet" icon_state = "cavewet" first_time_text = "The Undersea" + ambientdrone = AMB_CAVE_LOOP ambientsounds = AMB_CAVEWATER ambientnight = AMB_CAVEWATER spookysounds = SPOOKY_CAVE @@ -368,6 +392,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town ambientnight = AMB_CAVELAVA spookysounds = SPOOKY_CAVE spookynight = SPOOKY_CAVE + ambientdrone = AMB_CAVE_LOOP_EVIL ambush_times = list("night","dawn","dusk","day") ambush_types = list( /turf/open/floor/rogue/dirt) @@ -380,11 +405,13 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_dusk = null droning_sound_night = null converted_type = /area/rogue/outdoors/exposed/decap + /area/rogue/outdoors/exposed/decap icon_state = "decap" droning_sound = 'sound/music/area/decap.ogg' droning_sound_dusk = null droning_sound_night = null + ambientdrone = AMB_CAVE_LOOP_EVIL_OUTDOOR /area/rogue/under/lake name = "underground lake" @@ -393,6 +420,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town ambientnight = AMB_BEACH spookysounds = SPOOKY_CAVE spookynight = SPOOKY_GEN + ambientdrone = AMB_LAKE_LOOP /area/rogue/under/cave/dungeon1 name = "smalldungeon1" @@ -454,13 +482,16 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_night = 'sound/music/area/sleeping.ogg' converted_type = /area/rogue/outdoors/exposed/town town_area = TRUE - + ambientdroneday = AMB_INDOOR_TOWN_LOOP_DAY + ambientdronenight = AMB_INDOOR_TOWN_LOOP_NIGHT /area/rogue/outdoors/exposed/town icon_state = "town" droning_sound = 'sound/music/area/towngen.ogg' droning_sound_dusk = 'sound/music/area/septimus.ogg' droning_sound_night = 'sound/music/area/sleeping.ogg' + ambientdroneday = AMB_TOWN_LOOP_DAY + ambientdronenight = AMB_TOWN_LOOP_NIGHT /area/rogue/indoors/town/manor name = "Manor" @@ -470,6 +501,9 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_night = null converted_type = /area/rogue/outdoors/exposed/manorgarri first_time_text = "THE KEEP OF AZURE PEAK" + ambientdroneday = AMB_MANOR_LOOP_DAY + ambientdronenight = AMB_QUIET_LOOP + /area/rogue/outdoors/exposed/manorgarri icon_state = "manorgarri" droning_sound = 'sound/music/area/manorgarri.ogg' @@ -485,11 +519,14 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_dusk = null droning_sound_night = null converted_type = /area/rogue/outdoors/exposed/magiciantower + ambientdrone = AMB_ARCANE_LOOP + /area/rogue/outdoors/exposed/magiciantower icon_state = "magiciantower" droning_sound = 'sound/music/area/magiciantower.ogg' droning_sound_dusk = null droning_sound_night = null + ambientdrone = AMB_ARCANE_LOOP /area/rogue/indoors/town/shop name = "Shop" @@ -546,6 +583,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_dusk = null droning_sound_night = null converted_type = /area/rogue/outdoors/exposed/manorgarri + ambientdrone = AMB_QUIET_LOOP /area/rogue/indoors/town/tavern name = "tavern" @@ -569,11 +607,14 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_dusk = null droning_sound_night = null converted_type = /area/rogue/outdoors/exposed/church + ambientdrone = AMB_QUIET_LOOP + /area/rogue/outdoors/exposed/church icon_state = "church" droning_sound = 'sound/music/area/church.ogg' droning_sound_dusk = null droning_sound_night = null + ambientdrone = AMB_QUIET_LOOP /area/rogue/indoors/town/church/chapel icon_state = "chapel" @@ -596,6 +637,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town /area/rogue/indoors/town/vault name = "vault" icon_state = "vault" + ambientdrone = AMB_QUIET_LOOP /area/rogue/indoors/town/vault/can_craft_here() return FALSE @@ -624,6 +666,8 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town name = "outdoors" icon_state = "town" soundenv = 16 + ambientdroneday = AMB_TOWN_LOOP_DAY + ambientdronenight = AMB_TOWN_LOOP_NIGHT droning_sound = 'sound/music/area/townstreets.ogg' droning_sound_dusk = 'sound/music/area/septimus.ogg' droning_sound_night = 'sound/music/area/sleeping.ogg' @@ -633,6 +677,8 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town /area/rogue/indoors/shelter/town icon_state = "town" + ambientdroneday = AMB_INDOOR_TOWN_LOOP_DAY + ambientdronenight = AMB_INDOOR_TOWN_LOOP_NIGHT droning_sound = 'sound/music/area/townstreets.ogg' droning_sound_dusk = 'sound/music/area/septimus.ogg' droning_sound_night = 'sound/music/area/sleeping.ogg' @@ -647,6 +693,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_night = null converted_type = /area/rogue/indoors/shelter/town/sargoth first_time_text = "SARGOTH" + /area/rogue/indoors/shelter/town/sargoth icon_state = "sargoth" droning_sound = 'sound/music/area/sargoth.ogg' @@ -666,6 +713,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_night = 'sound/music/area/sleeping.ogg' soundenv = 17 converted_type = /area/rogue/indoors/shelter/town/roofs + /area/rogue/indoors/shelter/town/roofs icon_state = "roofs" droning_sound = 'sound/music/area/field.ogg' @@ -697,11 +745,14 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_dusk = null droning_sound_night = null converted_type = /area/rogue/outdoors/exposed/under/town + ambientdrone = AMB_QUIET_LOOP + /area/rogue/outdoors/exposed/under/town icon_state = "town" droning_sound = 'sound/music/area/catacombs.ogg' droning_sound_dusk = null droning_sound_night = null + ambientdrone = AMB_QUIET_LOOP /area/rogue/under/town/sewer name = "sewer" @@ -716,6 +767,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town ambientrain = RAIN_SEWER soundenv = 21 converted_type = /area/rogue/outdoors/exposed/under/sewer + /area/rogue/outdoors/exposed/under/sewer icon_state = "sewer" droning_sound = 'sound/music/area/sewers.ogg' @@ -751,6 +803,7 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_night = null soundenv = 5 converted_type = /area/rogue/outdoors/exposed/under/basement + /area/rogue/outdoors/exposed/under/basement icon_state = "basement" droning_sound = 'sound/music/area/catacombs.ogg' @@ -765,3 +818,4 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town droning_sound_dusk = null droning_sound_night = null first_time_text = "The Forest of Repentence" + ambientdrone = AMB_CAVE_LOOP_EVIL diff --git a/code/game/objects/effects/particles/weather.dm b/code/game/objects/effects/particles/weather.dm index 7ac12e76a..b23063b7a 100644 --- a/code/game/objects/effects/particles/weather.dm +++ b/code/game/objects/effects/particles/weather.dm @@ -1,17 +1,16 @@ /particles/rain icon = 'icons/roguetown/misc/particles.dmi' - icon_state = list("rain"=5, "rain2"=5, "drop"=1) -// icon_state = list("rain1"=5, "rain2"=6, "rain3"=5) + icon_state = list("rain"=5, "rain2"=5, "rainold"=3, "drop"=1) width = 928 height = 928 - count = 400 - spawning = 400 - lifespan = 10 + count = 2500 + spawning = 666 + lifespan = 15 fade = 0 // fadein = 0 position = generator("box", list(-928,-928,0), list(928,928,0)) // gravity = list(-1, -200) - velocity = list(0, -200) + velocity = list(0, -144) /obj/emitters // appearance_flags = PIXEL_SCALE @@ -22,27 +21,21 @@ /obj/emitters/weather/rain particles = new/particles/rain -// alpha = 190 + alpha = 255 /atom/movable/screen/weather/fog - alpha = 180 + alpha = 255 icon = 'icons/mob/screen_full.dmi' - icon_state = "phog1" + icon_state = "fog_smok" screen_loc = "1,1" mouse_opacity = 0 plane = WEATHER_PLANE /atom/movable/screen/weather/fog/New(client/C) . = ..() - var/mutable_appearance/MA = mutable_appearance(icon, "phog2") - MA.pixel_x = 480 + var/mutable_appearance/MA = mutable_appearance(icon, "impairedoverlay1") add_overlay(MA) - var/matrix/M = matrix() - M.Translate(-480,0) - animate(src, transform = M, time = 300, loop = -1) - animate(transform = null, time = 0) - // animate(MA, transform = null, time = 100, loop = -1) // animate(transform = MT, time = 0) // add_overlay(MA) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 4ade763b6..006e973da 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -92,6 +92,21 @@ prefs.save_preferences() mob.update_channel_volume(CHANNEL_AMBIENCE, prefs.mastervol) + +/client/verb/change_ambient_vol() + set category = "Options" + set name = "ChangeAmbientPower" + + if(prefs) + var/vol = input(usr, "Current volume power: [prefs.ambientvol]",, 100) as null|num + if(!vol) + if(vol != 0) + return + vol = min(vol, 100) + prefs.ambientvol = vol + prefs.save_preferences() + + mob.update_channel_volume(CHANNEL_DRONING_AMBIENCE, prefs.ambientvol) /* /client/verb/help_rpguide() set category = "Options" @@ -255,4 +270,4 @@ GLOBAL_LIST_INIT(ambience_files, list( for(var/music in GLOB.ambience_files) mob.playsound_local(mob, music, 0.1) - sleep(10) \ No newline at end of file + sleep(10) diff --git a/code/modules/antagonists/roguetown/villain/vampire.dm b/code/modules/antagonists/roguetown/villain/vampire.dm index d87a74ab5..6c84101a7 100644 --- a/code/modules/antagonists/roguetown/villain/vampire.dm +++ b/code/modules/antagonists/roguetown/villain/vampire.dm @@ -391,6 +391,7 @@ SSdroning.kill_rain(client) SSdroning.kill_loop(client) SSdroning.kill_droning(client) + SSdroning.kill_ambient_loop(client) client.move_delay = initial(client.move_delay) var/atom/movable/screen/gameover/hog/H = new() H.layer = SPLASHSCREEN_LAYER+0.1 diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm index 76d54b274..8bcb2acaa 100644 --- a/code/modules/antagonists/roguetown/villain/vampirelord.dm +++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm @@ -1121,6 +1121,7 @@ GLOBAL_LIST_EMPTY(vampire_objects) SSdroning.kill_rain(client) SSdroning.kill_loop(client) SSdroning.kill_droning(client) + SSdroning.kill_ambient_loop(client) stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now var/mob/dead/observer/rogue/arcaneeye/eye = new(src) // Transfer safety to observer spawning proc. SStgui.on_transfer(src, eye) // Transfer NanoUIs. diff --git a/code/modules/antagonists/roguetown/villain/werewolf/werewolf_transformation.dm b/code/modules/antagonists/roguetown/villain/werewolf/werewolf_transformation.dm index 991573f2b..6b876738a 100644 --- a/code/modules/antagonists/roguetown/villain/werewolf/werewolf_transformation.dm +++ b/code/modules/antagonists/roguetown/villain/werewolf/werewolf_transformation.dm @@ -73,6 +73,7 @@ cmode = FALSE if(client) SSdroning.play_area_sound(get_area(src), client) + SSdroning.play_ambient_loop(get_area(src), client) // stop_cmusic() src.fully_heal(FALSE) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index e610d432b..ce4a3b1a0 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -140,9 +140,12 @@ var/list/open_popups = list() var/loop_sound = FALSE + var/ambient_loop_sound = FALSE var/rain_sound = FALSE var/last_droning_sound + var/last_ambient_droning_sound var/sound/droning_sound + var/sound/ambient_sound /client/proc/update_weather(force) if(!mob) @@ -159,7 +162,12 @@ if(PMW && A) if(A.outdoors) PMW.filters = list() + for(var/W in current_weathers) + for(var/datum/weather/WE in SSweather.curweathers) + if(WE.type == W) + PMW.alpha = WE.weather_alpha else + PMW.alpha = 255 if(!PMW.filters || !islist(PMW.filters) || !PMW.filters.len) PMW.filters = filter(type="alpha", render_source = "*rainzone", flags = MASK_INVERSE) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index c84195ea0..f180755eb 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -561,6 +561,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) . = ..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening QDEL_NULL(droning_sound) last_droning_sound = null + last_ambient_droning_sound = null return QDEL_HINT_HARDDEL_NOW /client/proc/set_client_age_from_db(connectiontopic) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b598f9c86..52e5d4960 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -124,6 +124,7 @@ GLOBAL_LIST_EMPTY(chosen_names) var/musicvol = 50 var/mastervol = 50 + var/ambientvol = 33 var/anonymize = TRUE diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 52ff3a15e..aeae24ee3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -171,6 +171,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["sexable"] >> sexable S["shake"] >> shake S["mastervol"] >> mastervol + S["ambientvol"] >> ambientvol S["lastclass"] >> lastclass @@ -262,6 +263,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["shake"], shake) WRITE_FILE(S["lastclass"], lastclass) WRITE_FILE(S["mastervol"], mastervol) + WRITE_FILE(S["ambientvol"], ambientvol) WRITE_FILE(S["ooccolor"], ooccolor) WRITE_FILE(S["lastchangelog"], lastchangelog) WRITE_FILE(S["UI_style"], UI_style) diff --git a/code/modules/client/verbs/ghost.dm b/code/modules/client/verbs/ghost.dm index 66c5f1029..89aa28c31 100644 --- a/code/modules/client/verbs/ghost.dm +++ b/code/modules/client/verbs/ghost.dm @@ -44,6 +44,7 @@ GLOBAL_LIST_INIT(ghost_verbs, list( SSdroning.kill_rain(src.client) SSdroning.kill_loop(src.client) SSdroning.kill_droning(src.client) + SSdroning.kill_ambient_loop(src.client) remove_client_colour(/datum/client_colour/monochrome) if(!client) log_game("[key_name(usr)] AM failed due to disconnect.") diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d278758da..3403c9542 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -59,6 +59,10 @@ sellprice = 1 + + // These are related to weather conditions. + var/is_wet = FALSE + /obj/item var/blocking_behavior var/wetness = 0 diff --git a/code/modules/clothing/rogueclothes/quiver.dm b/code/modules/clothing/rogueclothes/quiver.dm index d2fce672a..a135d2657 100644 --- a/code/modules/clothing/rogueclothes/quiver.dm +++ b/code/modules/clothing/rogueclothes/quiver.dm @@ -245,7 +245,7 @@ else to_chat(loc, span_warning("Full!")) return -..() + ..() /obj/item/bulletpouch/attack_right(mob/user) if(bullets.len) @@ -265,4 +265,4 @@ if(bullets.len) icon_state = "pouch1" else - icon_state = "pouch0" \ No newline at end of file + icon_state = "pouch0" diff --git a/code/modules/droning/droning.dm b/code/modules/droning/droning.dm index aa78338b5..b1a7440f2 100644 --- a/code/modules/droning/droning.dm +++ b/code/modules/droning/droning.dm @@ -93,6 +93,7 @@ SUBSYSTEM_DEF(droning) //kill the previous droning sound kill_droning(dreamer) + kill_ambient_loop(dreamer) var/sound/combat_music = sound(pick(music), repeat = TRUE, wait = 0, channel = CHANNEL_BUZZ, volume = (dreamer?.prefs.musicvol)*1.2) SEND_SOUND(dreamer, combat_music) dreamer.droning_sound = combat_music @@ -202,3 +203,46 @@ SUBSYSTEM_DEF(droning) var/sound/loop_sound = sound(pick(rainsounds), repeat = TRUE, wait = 0, channel = CHANNEL_RAIN, volume = dreamer?.prefs.musicvol) SEND_SOUND(dreamer, loop_sound) dreamer.rain_sound = TRUE + +//Droning ambience. Similar to normal, but lasts longer for better soundscapes. +/datum/controller/subsystem/droning/proc/play_ambient_loop(area/area_entered, client/dreamer) + if(!area_entered || !dreamer) + return + //kill the previous looping + kill_ambient_loop(dreamer) + + if(dreamer?.prefs.ambientvol <= 0) + return + + if(GLOB.forecast == "rain") //The sound of rain drowns out everything else. + if(!istype(area_entered, /area/rogue/under))//These locations should have localized ambience or none to begin with. + return + + var/ambientloopsounds = null + if(area_entered.we_looping_here) + if(GLOB.tod == "night") + if(area_entered.ambientdronenight) + ambientloopsounds = area_entered.ambientdronenight + if(GLOB.tod == "dusk") + if(area_entered.ambientdronedusk) + ambientloopsounds = area_entered.ambientdronedusk + if(GLOB.tod == "dawn") + if(area_entered.ambientdronedawn) + ambientloopsounds = area_entered.ambientdronedawn + if(GLOB.tod == "day") + if(area_entered.ambientdroneday) + ambientloopsounds = area_entered.ambientdroneday + else //just in case + if(!ambientloopsounds) + ambientloopsounds = area_entered.ambientdrone + //log_admin("No droning ambient audio was found within [area_entered].") + + var/sound/ambient_loop_sound = sound(pick(ambientloopsounds), repeat = TRUE, wait = 0, channel = CHANNEL_MUSIC, volume = dreamer?.prefs.ambientvol) + SEND_SOUND(dreamer, ambient_loop_sound) + dreamer.ambient_loop_sound = TRUE + +/datum/controller/subsystem/droning/proc/kill_ambient_loop(client/victim) + if(!victim?.ambient_loop_sound) + return + victim?.mob.stop_sound_channel(CHANNEL_DRONING_AMBIENCE) + victim?.ambient_loop_sound = FALSE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ed3bf000f..e5790dc9b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -370,6 +370,7 @@ Works together with spawning an observer, noted above. SSdroning.kill_rain(client) SSdroning.kill_loop(client) SSdroning.kill_droning(client) + SSdroning.kill_ambient_loop(client) // var/S = sound('sound/ambience/creepywind.ogg', repeat = 1, wait = 0, volume = client.prefs.musicvol, channel = CHANNEL_MUSIC) // play_priomusic(S) var/mob/dead/observer/ghost // Transfer safety to observer spawning proc. @@ -404,6 +405,7 @@ Works together with spawning an observer, noted above. SSdroning.kill_rain(client) SSdroning.kill_loop(client) SSdroning.kill_droning(client) + SSdroning.kill_ambient_loop(client) var/mob/dead/observer/screye/ghost = new(src) // Transfer safety to observer spawning proc. ghost.ghostize_time = world.time SStgui.on_transfer(src, ghost) // Transfer NanoUIs. @@ -483,6 +485,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp SSdroning.kill_rain(src.client) SSdroning.kill_loop(src.client) SSdroning.kill_droning(src.client) + SSdroning.kill_ambient_loop(client) remove_client_colour(/datum/client_colour/monochrome) client.change_view(CONFIG_GET(string/default_view)) client?.verbs -= GLOB.ghost_verbs @@ -523,6 +526,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp SSdroning.kill_rain(src.client) SSdroning.kill_loop(src.client) SSdroning.kill_droning(src.client) + SSdroning.kill_ambient_loop(client) remove_client_colour(/datum/client_colour/monochrome) if(!client) log_game("[key_name(src)] AM failed due to disconnect.") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b1b0ba277..bcefed905 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -824,6 +824,18 @@ protection *= INVERSE(target_zones.len) return protection +//Returns a total count of covered limbs. +/mob/living/carbon/get_covered_limbs(list/target_zones = list(HANDS,CHEST,GROIN,LEGS,FEET,ARMS,HEAD)) + var/list/tally = list() + for(var/obj/item/I in get_equipped_items()) + for(var/zone in target_zones) + if(I.body_parts_covered & zone) + tally["[zone]"] = max(1, target_zones["[zone]"]) + var/protection = 0 + for(var/key in tally) + protection += tally[key] + return protection + /mob/living var/succumb_timer = 0 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 45854a151..ecef02350 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -92,3 +92,6 @@ /// Amount of remaining vitae that can be drained from this mob var/vitae_bank = 9000 + //For weather related things. + var/is_wet = FALSE + var/is_drying = FALSE diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 2155b3a40..7f4c228c7 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -35,6 +35,7 @@ if(client) SSdroning.kill_droning(client) + SSdroning.kill_ambient_loop(client) SSdroning.kill_loop(client) SSdroning.kill_rain(client) diff --git a/code/modules/mob/living/carbon/spirit/spirit.dm b/code/modules/mob/living/carbon/spirit/spirit.dm index 0b9f6ad56..d260ce1cf 100644 --- a/code/modules/mob/living/carbon/spirit/spirit.dm +++ b/code/modules/mob/living/carbon/spirit/spirit.dm @@ -139,6 +139,7 @@ SSdroning.kill_rain(src.client) SSdroning.kill_loop(src.client) SSdroning.kill_droning(src.client) + SSdroning.kill_ambient_loop(src.client) remove_client_colour(/datum/client_colour/monochrome) if(!client) log_game("[key_name(usr)] AM failed due to disconnect.") @@ -266,5 +267,6 @@ SSdroning.kill_rain(ghost.client) SSdroning.kill_loop(ghost.client) SSdroning.kill_droning(ghost.client) + SSdroning.kill_ambient_loop(ghost.client) ghost.remove_client_colour(/datum/client_colour/monochrome) ghost.returntolobby() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 8342f064d..982688937 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -4,6 +4,7 @@ death(TRUE) if(client) SSdroning.kill_droning(client) + SSdroning.kill_ambient_loop(client) playsound(src.loc, pick('sound/combat/gib (1).ogg','sound/combat/gib (2).ogg'), 200, FALSE, 3) if(!prev_lying) @@ -83,6 +84,7 @@ SSdroning.kill_rain(src.client) SSdroning.kill_loop(src.client) SSdroning.kill_droning(src.client) + SSdroning.kill_ambient_loop(src.client) src.playsound_local(src, 'sound/misc/deth.ogg', 100) set_drugginess(0) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ebc2f793a..557b8810a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1379,6 +1379,10 @@ /mob/living/proc/get_permeability_protection(list/target_zones) return 0 +//Finds how many limbs are covered. +/mob/living/proc/get_covered_limbs(list/target_zones) + return 0 + /mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ddf8c2fdd..629bb9391 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -569,12 +569,14 @@ if(cmode) playsound_local(src, 'sound/misc/comboff.ogg', 100) SSdroning.play_area_sound(get_area(src), client) + SSdroning.play_ambient_loop(get_area(src), client) cmode = FALSE if(client && HAS_TRAIT(src, TRAIT_SCREENSHAKE)) animate(client, pixel_y) else cmode = TRUE playsound_local(src, 'sound/misc/combon.ogg', 100) + SSdroning.kill_ambient_loop(client) if(L.cmode_music) SSdroning.play_combat_music(L.cmode_music, client) if(client && HAS_TRAIT(src, TRAIT_SCHIZO_AMBIENCE)) diff --git a/code/modules/reagents/reagent_containers/powderspice.dm b/code/modules/reagents/reagent_containers/powderspice.dm index 2e1d82f0c..0b85e1b1c 100644 --- a/code/modules/reagents/reagent_containers/powderspice.dm +++ b/code/modules/reagents/reagent_containers/powderspice.dm @@ -72,6 +72,7 @@ if(M.client) REMOVE_TRAIT(M, TRAIT_DRUQK, "based") SSdroning.play_area_sound(get_area(M), M.client) + SSdroning.play_ambient_loop(get_area(M), M.client) // if(M.client.screen && M.client.screen.len) /// var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in M.client.screen // PM.backdrop(M.client.mob) @@ -369,6 +370,7 @@ if(M.client) REMOVE_TRAIT(M, TRAIT_DRUQK, "based") SSdroning.play_area_sound(get_area(M), M.client) + SSdroning.play_ambient_loop(get_area(M), M.client) // if(M.client.screen && M.client.screen.len) /// var/atom/movable/screen/plane_master/game_world/PM = locate(/atom/movable/screen/plane_master/game_world) in M.client.screen // PM.backdrop(M.client.mob) diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 8ce02b335..16c2e4de9 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi index 2d34954ab..497c3b520 100644 Binary files a/icons/mob/screen_full.dmi and b/icons/mob/screen_full.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index d24c3d4d9..3e703e914 100644 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/modular_causticcove/code/__DEFINES/status_effects.dm b/modular_causticcove/code/__DEFINES/status_effects.dm index b0a8233db..bd2b4cfae 100644 --- a/modular_causticcove/code/__DEFINES/status_effects.dm +++ b/modular_causticcove/code/__DEFINES/status_effects.dm @@ -15,8 +15,18 @@ #define STATUS_EFFECT_ABYSSORS_BREW /datum/status_effect/buff/abyssorbrew // Free water movement at cost of speed, and strength, and untouched stam drain over water +#define STATUS_EFFECT_WETNESS /datum/staus_effect/buff/wetness //Groups them all up for weather system + +#define STATUS_EFFECT_WETNESS_1 /datum/status_effect/buff/wetness/damp + +#define STATUS_EFFECT_WETNESS_2 /datum/status_effect/buff/wetness/wet + +#define STATUS_EFFECT_WETNESS_3 /datum/status_effect/buff/wetness/drenched + + /************************************************************* *********************** MOBS ******************************* *************************************************************/ #define STATUS_EFFECT_INDUCED_INSANITY /datum/status_effect/buff/induced_insanity //Momentarily experiencing maniac levels of insanity. + diff --git a/modular_causticcove/code/datums/status_effects/rogue/causticbuff.dm b/modular_causticcove/code/datums/status_effects/rogue/causticbuff.dm index 570d078a1..063081e07 100644 --- a/modular_causticcove/code/datums/status_effects/rogue/causticbuff.dm +++ b/modular_causticcove/code/datums/status_effects/rogue/causticbuff.dm @@ -128,3 +128,40 @@ name = "Burning Fervor" desc = "" icon_state = "fire" + +///////////////// +//WEATHER BUFFS// +///////////////// + +/datum/status_effect/buff/wetness/damp + id = "wetness1" + alert_type = /atom/movable/screen/alert/status_effect/buff/wetness/damp + effectedstats = list("speed" = -1) + duration = INFINITY //Removed manually. + +/atom/movable/screen/alert/status_effect/buff/wetness/damp + name = "Damp" + desc = "I should dry off." + icon_state = "damp" + +/datum/status_effect/buff/wetness/wet + id = "wetness2" + alert_type = /atom/movable/screen/alert/status_effect/buff/wetness/wet + effectedstats = list("endurance" = -1, "speed" = -2) + duration = INFINITY //Removed manually. + +/atom/movable/screen/alert/status_effect/buff/wetness/wet + name = "Wet" + desc = "My clothes stick to me." + icon_state = "wet" + +/datum/status_effect/buff/wetness/drenched + id = "wetness3" + alert_type = /atom/movable/screen/alert/status_effect/buff/wetness/drenched + effectedstats = list("strength" = -1, "endurance" = -1, "speed" = -3) + duration = INFINITY //Removed manually. + +/atom/movable/screen/alert/status_effect/buff/wetness/drenched + name = "Drenched" + desc = "I'm weighed down by all this water!" + icon_state = "drenched" diff --git a/modular_causticcove/sound/ambient/arcane_ambience_loop.ogg b/modular_causticcove/sound/ambient/arcane_ambience_loop.ogg new file mode 100644 index 000000000..f1b837003 Binary files /dev/null and b/modular_causticcove/sound/ambient/arcane_ambience_loop.ogg differ diff --git a/modular_causticcove/sound/ambient/cave_ambience_evil.ogg b/modular_causticcove/sound/ambient/cave_ambience_evil.ogg new file mode 100644 index 000000000..9a2948f30 Binary files /dev/null and b/modular_causticcove/sound/ambient/cave_ambience_evil.ogg differ diff --git a/modular_causticcove/sound/ambient/cave_ambience_normal.ogg b/modular_causticcove/sound/ambient/cave_ambience_normal.ogg new file mode 100644 index 000000000..85432667f Binary files /dev/null and b/modular_causticcove/sound/ambient/cave_ambience_normal.ogg differ diff --git a/modular_causticcove/sound/ambient/forest_ambience_dawn.ogg b/modular_causticcove/sound/ambient/forest_ambience_dawn.ogg new file mode 100644 index 000000000..0f202156c Binary files /dev/null and b/modular_causticcove/sound/ambient/forest_ambience_dawn.ogg differ diff --git a/modular_causticcove/sound/ambient/forest_ambience_day.ogg b/modular_causticcove/sound/ambient/forest_ambience_day.ogg new file mode 100644 index 000000000..bb156ac66 Binary files /dev/null and b/modular_causticcove/sound/ambient/forest_ambience_day.ogg differ diff --git a/modular_causticcove/sound/ambient/forest_ambience_dusk.ogg b/modular_causticcove/sound/ambient/forest_ambience_dusk.ogg new file mode 100644 index 000000000..e34749cdb Binary files /dev/null and b/modular_causticcove/sound/ambient/forest_ambience_dusk.ogg differ diff --git a/modular_causticcove/sound/ambient/forest_ambience_night.ogg b/modular_causticcove/sound/ambient/forest_ambience_night.ogg new file mode 100644 index 000000000..be2667727 Binary files /dev/null and b/modular_causticcove/sound/ambient/forest_ambience_night.ogg differ diff --git a/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dawn.ogg b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dawn.ogg new file mode 100644 index 000000000..a2e219180 Binary files /dev/null and b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dawn.ogg differ diff --git a/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_day.ogg b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_day.ogg new file mode 100644 index 000000000..887a16ce7 Binary files /dev/null and b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_day.ogg differ diff --git a/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dusk.ogg b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dusk.ogg new file mode 100644 index 000000000..58c1b3954 Binary files /dev/null and b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_dusk.ogg differ diff --git a/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_night.ogg b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_night.ogg new file mode 100644 index 000000000..2d2e888b5 Binary files /dev/null and b/modular_causticcove/sound/ambient/indoor/forest_indoor_ambience_night.ogg differ diff --git a/modular_causticcove/sound/ambient/indoor/town_indoor_ambience_day.ogg b/modular_causticcove/sound/ambient/indoor/town_indoor_ambience_day.ogg new file mode 100644 index 000000000..d8c0e7591 Binary files /dev/null and b/modular_causticcove/sound/ambient/indoor/town_indoor_ambience_day.ogg differ diff --git a/modular_causticcove/sound/ambient/indoor/town_indoor_ambience_night.ogg b/modular_causticcove/sound/ambient/indoor/town_indoor_ambience_night.ogg new file mode 100644 index 000000000..952a736b7 Binary files /dev/null and b/modular_causticcove/sound/ambient/indoor/town_indoor_ambience_night.ogg differ diff --git a/modular_causticcove/sound/ambient/lake_ambience_loop.ogg b/modular_causticcove/sound/ambient/lake_ambience_loop.ogg new file mode 100644 index 000000000..7ee4e26da Binary files /dev/null and b/modular_causticcove/sound/ambient/lake_ambience_loop.ogg differ diff --git a/modular_causticcove/sound/ambient/manor_ambience_loop.ogg b/modular_causticcove/sound/ambient/manor_ambience_loop.ogg new file mode 100644 index 000000000..77bd8e747 Binary files /dev/null and b/modular_causticcove/sound/ambient/manor_ambience_loop.ogg differ diff --git a/modular_causticcove/sound/ambient/outdoor/cave_ambience_evil_outdoor.ogg b/modular_causticcove/sound/ambient/outdoor/cave_ambience_evil_outdoor.ogg new file mode 100644 index 000000000..418b83fc6 Binary files /dev/null and b/modular_causticcove/sound/ambient/outdoor/cave_ambience_evil_outdoor.ogg differ diff --git a/modular_causticcove/sound/ambient/outdoor/cave_ambience_outdoor.ogg b/modular_causticcove/sound/ambient/outdoor/cave_ambience_outdoor.ogg new file mode 100644 index 000000000..c8ae471a2 Binary files /dev/null and b/modular_causticcove/sound/ambient/outdoor/cave_ambience_outdoor.ogg differ diff --git a/modular_causticcove/sound/ambient/quiet_ambience.ogg b/modular_causticcove/sound/ambient/quiet_ambience.ogg new file mode 100644 index 000000000..47a1d7207 Binary files /dev/null and b/modular_causticcove/sound/ambient/quiet_ambience.ogg differ diff --git a/modular_causticcove/sound/ambient/town_ambience_day.ogg b/modular_causticcove/sound/ambient/town_ambience_day.ogg new file mode 100644 index 000000000..430dde949 Binary files /dev/null and b/modular_causticcove/sound/ambient/town_ambience_day.ogg differ diff --git a/modular_causticcove/sound/ambient/town_ambience_night.ogg b/modular_causticcove/sound/ambient/town_ambience_night.ogg new file mode 100644 index 000000000..b3c7211e2 Binary files /dev/null and b/modular_causticcove/sound/ambient/town_ambience_night.ogg differ diff --git a/modular_causticcove/sound/ambient/underground_general_ambience_loop.ogg b/modular_causticcove/sound/ambient/underground_general_ambience_loop.ogg new file mode 100644 index 000000000..bfacb709c Binary files /dev/null and b/modular_causticcove/sound/ambient/underground_general_ambience_loop.ogg differ