diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 5a0a82f8e54..da454378bde 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -82,7 +82,7 @@ SUBSYSTEM_DEF(weather) var/datum/weather/A for(var/V in processing) var/datum/weather/W = V - if((z in W.impacted_z_levels) && W.area_type == active_area.type) + if((z in W.impacted_z_levels) && W.area_type == active_area) A = W break return A diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 558669df3c6..018c865d2bb 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -30,13 +30,28 @@ var/datum/looping_sound/weak_outside_ashstorm/sound_wo = new(list(), FALSE, TRUE) var/datum/looping_sound/weak_inside_ashstorm/sound_wi = new(list(), FALSE, TRUE) -/datum/weather/ash_storm/telegraph() - . = ..() +/datum/weather/ash_storm/proc/is_shuttle_docked(shuttleId, dockId) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + var/obj/docking_port/stationary/S = M.get_docked() + + return S.id == dockId + +/datum/weather/ash_storm/proc/update_eligible_areas() var/list/inside_areas = list() var/list/outside_areas = list() var/list/eligible_areas = list() for(var/z in impacted_z_levels) eligible_areas += GLOB.space_manager.areas_in_z["[z]"] + + // Don't play storm audio to shuttles that are not at lavaland + var/miningShuttleDocked = is_shuttle_docked("mining", "mining_away") + if(!miningShuttleDocked) + eligible_areas -= get_areas(/area/shuttle/mining) + + var/laborShuttleDocked = is_shuttle_docked("laborcamp", "laborcamp_away") + if(!laborShuttleDocked) + eligible_areas -= get_areas(/area/shuttle/siberia) + for(var/i in 1 to eligible_areas.len) var/area/place = eligible_areas[i] if(place.outdoors) @@ -50,29 +65,46 @@ sound_wo.output_atoms = outside_areas sound_wi.output_atoms = inside_areas - sound_wo.start() - sound_wi.start() +/datum/weather/ash_storm/proc/update_audio() + switch(stage) + if(STARTUP_STAGE) + sound_wo.start() + sound_wi.start() + + if(MAIN_STAGE) + sound_wo.stop() + sound_wi.stop() + + sound_ao.start() + sound_ai.start() + + if(WIND_DOWN_STAGE) + sound_ao.stop() + sound_ai.stop() + + sound_wo.start() + sound_wi.start() + + if(END_STAGE) + sound_wo.stop() + sound_wi.stop() + +/datum/weather/ash_storm/telegraph() + . = ..() + update_eligible_areas() + update_audio() /datum/weather/ash_storm/start() . = ..() - sound_wo.stop() - sound_wi.stop() - - sound_ao.start() - sound_ai.start() + update_audio() /datum/weather/ash_storm/wind_down() . = ..() - sound_ao.stop() - sound_ai.stop() - - sound_wo.start() - sound_wi.start() + update_audio() /datum/weather/ash_storm/end() . = ..() - sound_wo.stop() - sound_wi.stop() + update_audio() /datum/weather/ash_storm/proc/is_ash_immune(atom/L) while(L && !isturf(L)) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index bc4f5517cc5..852f0c4a396 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -528,6 +528,14 @@ loc = S1.loc dir = S1.dir + //update mining and labor shuttle ash storm audio + if(id in list("mining", "laborcamp")) + var/mining_zlevel = level_name_to_num(MINING) + var/datum/weather/ash_storm/W = SSweather.get_weather(mining_zlevel, /area/lavaland/surface/outdoors) + if(W) + W.update_eligible_areas() + W.update_audio() + unlockPortDoors(S1)