diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 6f9496711f6..a16b3d8b868 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -306,6 +306,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// prevents xeno huggies implanting skeletons #define TRAIT_XENO_IMMUNE "xeno_immune" #define TRAIT_NAIVE "naive" +/// always detect storms on icebox +#define TRAIT_DETECT_STORM "detect_storm" #define TRAIT_PRIMITIVE "primitive" #define TRAIT_GUNFLIP "gunflip" /// Increases chance of getting special traumas, makes them harder to cure diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index deac74b8740..faee8a3e5e6 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -114,15 +114,7 @@ weather_duration = rand(weather_duration_lower, weather_duration_upper) SSweather.processing |= src update_areas() - for(var/z_level in impacted_z_levels) - for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) - var/turf/mob_turf = get_turf(player) - if(!mob_turf) - continue - if(telegraph_message) - to_chat(player, telegraph_message) - if(telegraph_sound) - SEND_SOUND(player, sound(telegraph_sound)) + send_alert(telegraph_message, telegraph_sound) addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration) /** @@ -138,15 +130,7 @@ SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_START(type)) stage = MAIN_STAGE update_areas() - for(var/z_level in impacted_z_levels) - for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) - var/turf/mob_turf = get_turf(player) - if(!mob_turf) - continue - if(weather_message) - to_chat(player, weather_message) - if(weather_sound) - SEND_SOUND(player, sound(weather_sound)) + send_alert(weather_message, weather_sound) if(!perpetual) addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration) @@ -163,15 +147,7 @@ SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_WINDDOWN(type)) stage = WIND_DOWN_STAGE update_areas() - for(var/z_level in impacted_z_levels) - for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) - var/turf/mob_turf = get_turf(player) - if(!mob_turf) - continue - if(end_message) - to_chat(player, end_message) - if(end_sound) - SEND_SOUND(player, sound(end_sound)) + send_alert(end_message, end_sound) addtimer(CALLBACK(src, PROC_REF(end)), end_duration) /** @@ -189,6 +165,22 @@ SSweather.processing -= src update_areas() +// handles sending all alerts +/datum/weather/proc/send_alert(alert_msg, alert_sfx) + for(var/z_level in impacted_z_levels) + for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) + if(!can_get_alert(player)) + continue + if(alert_msg) + to_chat(player, alert_msg) + if(alert_sfx) + SEND_SOUND(player, sound(alert_sfx)) + +// the checks for if a mob should recieve alerts, returns TRUE if can +/datum/weather/proc/can_get_alert(mob/player) + var/turf/mob_turf = get_turf(player) + return !isnull(mob_turf) + /** * Returns TRUE if the living mob can be affected by the weather * diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index db18fc5c9e2..03c9bf2aed6 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -27,3 +27,27 @@ /datum/weather/snow_storm/weather_act(mob/living/L) L.adjust_bodytemperature(-rand(5,15)) + +// since snowstorm is on a station z level, add extra checks to not annoy everyone +/datum/weather/snow_storm/can_get_alert(mob/player) + if(!..()) + return FALSE + + if(!is_station_level(player.z)) + return TRUE // bypass checks + + if(isobserver(player)) + return TRUE + + if(HAS_TRAIT(player, TRAIT_DETECT_STORM)) + return TRUE + + if(istype(get_area(player), /area/mine)) + return TRUE + + + for(var/area/snow_area in impacted_areas) + if(locate(snow_area) in view(player)) + return TRUE + + return FALSE diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 4cf3730bcda..0c5f5dc7c99 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -26,6 +26,14 @@ . = ..() RegisterSignal(src, COMSIG_TOOL_ATOM_ACTED_PRIMARY(tool_behaviour), PROC_REF(on_analyze)) +/obj/item/analyzer/equipped(mob/user, slot, initial) + . = ..() + ADD_TRAIT(user, TRAIT_DETECT_STORM, CLOTHING_TRAIT) + +/obj/item/analyzer/dropped(mob/user, silent) + . = ..() + REMOVE_TRAIT(user, TRAIT_DETECT_STORM, CLOTHING_TRAIT) + /obj/item/analyzer/examine(mob/user) . = ..() . += span_notice("Right-click [src] to open the gas reference.") diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 3a069bb32ba..f6b6791b0f6 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -17,6 +17,8 @@ paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_CAR + mind_traits = list(TRAIT_DETECT_STORM) + display_order = JOB_DISPLAY_ORDER_SHAFT_MINER bounty_types = CIV_JOB_MINE departments_list = list(