From 0c295af6e7a172b9f3feb0429ecc28433023bdf7 Mon Sep 17 00:00:00 2001 From: Cameron Lennox Date: Wed, 8 Apr 2026 12:07:02 -0400 Subject: [PATCH] Some more radiation fixes (#19378) * Some more rad fixes * Minor fix * fixes vox ghost goggles --- code/datums/components/geiger_sound.dm | 39 ++++++++++++++++-- code/game/objects/items/devices/geiger.dm | 17 +++++++- .../objects/items/ghost_hunting/weapons.dm | 11 +++++ code/modules/events/radiation_storm.dm | 23 ++++------- icons/inventory/eyes/mob_vox.dmi | Bin 25004 -> 25071 bytes 5 files changed, 70 insertions(+), 20 deletions(-) diff --git a/code/datums/components/geiger_sound.dm b/code/datums/components/geiger_sound.dm index bc6c8850446..ba1d59061a4 100644 --- a/code/datums/components/geiger_sound.dm +++ b/code/datums/components/geiger_sound.dm @@ -3,6 +3,7 @@ var/datum/looping_sound/geiger/sound var/last_parent = null + var/wall_mounted = FALSE /datum/component/geiger_sound/Initialize(...) if (!isatom(parent)) @@ -19,7 +20,8 @@ return ..() /datum/component/geiger_sound/RegisterWithParent() - sound = new(list(parent), TRUE) + if(!wall_mounted) + sound = new(list(parent), TRUE) RegisterSignal(parent, COMSIG_IN_RANGE_OF_IRRADIATION, PROC_REF(on_pre_potential_irradiation)) @@ -76,15 +78,20 @@ var/datum/radiation_pulse_information/last_radiation_pulse var/last_insulation_to_target + var/wall_mounted = FALSE /datum/looping_sound/geiger/Destroy() last_radiation_pulse = null return ..() -/datum/looping_sound/geiger/get_sound(starttime, _mid_sounds) +/datum/looping_sound/geiger/get_sound(starttime, _mid_sounds, danger) + if(wall_mounted) //Child does all the work. + return ..(starttime, mid_sounds[danger]) + if (isnull(last_radiation_pulse)) return null - var/danger = get_perceived_radiation_danger(last_radiation_pulse, last_insulation_to_target) + danger = get_perceived_radiation_danger(last_radiation_pulse, last_insulation_to_target) + if(danger >= PERCEIVED_RADIATION_DANGER_HIGH) chance = 100 else @@ -97,3 +104,29 @@ . = ..() last_radiation_pulse = null + +/datum/component/geiger_sound/wall + wall_mounted = TRUE + +/datum/component/geiger_sound/wall/RegisterWithParent() + sound = new /datum/looping_sound/geiger/wall(list(parent), TRUE) + ..() + +//Subtype for wall mounted geiger counters, which should be quieter and not have the chance to play when radiation is low. +/datum/looping_sound/geiger/wall + wall_mounted = TRUE + +/datum/looping_sound/geiger/wall/get_sound(starttime, _mid_sounds) + if (isnull(last_radiation_pulse)) + return null + + var/danger = get_perceived_radiation_danger(last_radiation_pulse, last_insulation_to_target) + + if(danger >= PERCEIVED_RADIATION_DANGER_HIGH) + chance = 100 + volume = (danger * 5) + else + chance = 0 + volume = 0 + + return ..(starttime, mid_sounds[danger], danger) diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 1e2a2ee8845..ec1c3b4f7a7 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -14,6 +14,10 @@ matter = list(/datum/material/steel = SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.5) var/last_perceived_radiation_danger = null + ///How strong the last radiation pulse was, at the source. + var/last_radiation_strength = null + ///How much insulation we're lacking. + var/insulation_deficit = null var/scanning = FALSE @@ -40,6 +44,10 @@ . += span_suicide("Ambient radiation levels highly above average. It is ") + span_warning("unsafe ") + span_suicide("here.") if(PERCEIVED_RADIATION_DANGER_EXTREME) . += span_suicide("Ambient radiation levels reaching critical levels! It is ") + span_warning("extremely unsafe ") + span_suicide("here.") + if(last_radiation_strength) + . += span_notice("Maximum strength at source of radioactive pulse: ") + span_warning("[last_radiation_strength]") + if(insulation_deficit) + . += span_warning("Insulation deficit: [insulation_deficit]") /obj/item/geiger/update_icon() if(!scanning) @@ -101,6 +109,11 @@ SIGNAL_HANDLER last_perceived_radiation_danger = get_perceived_radiation_danger(pulse_information, insulation_to_target) + last_radiation_strength = pulse_information.strength + if(insulation_to_target > pulse_information.threshold) + insulation_deficit = round(insulation_to_target - pulse_information.threshold, 0.1) + else + insulation_deficit = null addtimer(CALLBACK(src, PROC_REF(reset_perceived_danger)), TIME_WITHOUT_RADIATION_BEFORE_RESET, TIMER_UNIQUE | TIMER_OVERRIDE) if (scanning) @@ -108,6 +121,8 @@ /obj/item/geiger/proc/reset_perceived_danger() last_perceived_radiation_danger = null + last_radiation_strength = null + insulation_deficit = null if (scanning) update_icon() @@ -153,7 +168,7 @@ /obj/item/geiger/wall/Initialize(mapload) . = ..() if(scanning) - AddComponent(/datum/component/geiger_sound) + AddComponent(/datum/component/geiger_sound/wall) /obj/item/geiger/wall/update_icon() diff --git a/code/game/objects/items/ghost_hunting/weapons.dm b/code/game/objects/items/ghost_hunting/weapons.dm index db491e6ff2a..2640f830765 100644 --- a/code/game/objects/items/ghost_hunting/weapons.dm +++ b/code/game/objects/items/ghost_hunting/weapons.dm @@ -162,6 +162,7 @@ slot_flags = SLOT_BACK preserve_item = 1 w_class = ITEMSIZE_LARGE + unacidable = TRUE var/obj/item/ghost_catcher/who_ya_gunna_call = /obj/item/ghost_catcher /obj/item/proton_pack/Initialize(mapload) @@ -173,3 +174,13 @@ if(SEND_SIGNAL(src,COMSIG_ITEM_ATTACK_SELF,user) & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE . = ..() + +/obj/item/proton_pack/MouseDrop() + if(ismob(src.loc)) + if(!CanMouseDrop(src)) + return + var/mob/M = src.loc + if(!M.unEquip(src)) + return + src.add_fingerprint(usr) + M.put_in_any_hand_if_possible(src) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 95bee850824..3397b5273ab 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -29,22 +29,6 @@ else if(activeFor == leaveBelt) GLOB.command_announcement.Announce("The [using_map.facility_type] has passed the radiation belt. Please allow for up to one minute while radiation levels dissipate, and report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") /datum/event/radiation_storm/proc/radiate() - - //This sucks. Just mutate. - /* - var/radiation_level = rand(15, 35) - for(var/z in using_map.station_levels) - var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), z) - if(epicentre) - radiation_pulse( - epicentre, - max_range = 5, - threshold = RAD_MEDIUM_INSULATION, - chance = URANIUM_IRRADIATION_CHANCE, - minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, - ) - */ - for(var/mob/living/carbon/C in GLOB.living_mob_list) if(!(C.z in using_map.station_levels) || C.isSynthetic() || isbelly(C.loc)) continue @@ -53,6 +37,13 @@ continue if(A.flag_check(RAD_SHIELDED)) continue + radiation_pulse( + get_turf(C), + max_range = 1, + threshold = RAD_LIGHT_INSULATION, + chance = URANIUM_IRRADIATION_CHANCE * 5, + strength = rand(15, 35) + ) if(ishuman(C)) var/mob/living/carbon/human/H = C var/chance = 5.0 diff --git a/icons/inventory/eyes/mob_vox.dmi b/icons/inventory/eyes/mob_vox.dmi index e82ec04a4bed9d5046110522c59434577b51ba2b..e2bf0df7bbae1435e86ebaaa1c1a1eb37e4dc1e5 100644 GIT binary patch delta 6264 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
    VI4mM#+n~ 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 K%lhuzzy1xsGM3f=