From 2b3f7584411ccaefc5a425bad94a5558b33a555b Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Wed, 8 Apr 2026 09:28:18 -0700 Subject: [PATCH] [MIRROR] Some more radiation fixes (#12648) Co-authored-by: Cameron Lennox --- 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 bc6c885044..ba1d59061a 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 1e2a2ee884..ec1c3b4f7a 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 db491e6ff2..2640f83076 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 0e6508efad..006159345f 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") //CHOMPEdit: Restored original message /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=