diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 2ddf8698ca5..0924648d33f 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -237,8 +237,7 @@
..(heavy)
explosion(src.loc, 0, 0, 4, 3, 0)
new /obj/effect/decal/cleanable/greenglow(get_turf(src))
- for(var/mob/living/L in view(5, src))
- L.irradiate(40)
+ radiation_pulse(get_turf(src), 2, 5, 50, 1)
//Meaty Ore
/obj/effect/meteor/meaty
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index e703f41c727..ba606e037ec 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -146,8 +146,7 @@
..()
/obj/machinery/door/airlock/uranium/proc/radiate()
- for(var/mob/living/L in range (3,src))
- L.irradiate(15)
+ radiation_pulse(get_turf(src), 3, 3, 15, 0)
return
/obj/machinery/door/airlock/plasma
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index ac8c7e541d5..531f20faa01 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -500,10 +500,6 @@
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/process()
if(..())
- for(var/mob/living/carbon/M in view(chassis))
- if(istype(M,/mob/living/carbon/human))
- M.irradiate(rad_per_cycle*3)
- else
- M.irradiate(rad_per_cycle)
+ radiation_pulse(get_turf(src), 2, 7, rad_per_cycle, 1)
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index f77c8951f4f..3e081af2025 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -98,7 +98,7 @@ effective or pretty fucking useless.
if(M)
if(intensity >= 5)
M.apply_effect(round(intensity/1.5), PARALYZE)
- M.irradiate(intensity*10)
+ M.rad_act(intensity*10)
else
user << "The radioactive microlaser is still recharging."
diff --git a/code/game/objects/items/nuke_tools.dm b/code/game/objects/items/nuke_tools.dm
index ee10b83dbc9..f8a0a093a12 100644
--- a/code/game/objects/items/nuke_tools.dm
+++ b/code/game/objects/items/nuke_tools.dm
@@ -23,8 +23,7 @@
if(cooldown < world.time - 60)
cooldown = world.time
flick("plutonium_core_pulse", src)
- for(var/mob/living/L in range(4,get_turf(src)))
- L.irradiate(40)
+ radiation_pulse(get_turf(src), 1, 4, 40, 1)
//nuke core box, for carrying the core
/obj/item/nuke_core_container
diff --git a/code/game/objects/radiation.dm b/code/game/objects/radiation.dm
new file mode 100644
index 00000000000..2498b6fe825
--- /dev/null
+++ b/code/game/objects/radiation.dm
@@ -0,0 +1,35 @@
+/proc/radiation_pulse(turf/epicenter, heavy_range, light_range, severity, log=0)
+ if(!epicenter) return
+
+ if(!istype(epicenter, /turf))
+ epicenter = get_turf(epicenter.loc)
+
+ if(log)
+ message_admins("Radiation pulse with size ([heavy_range], [light_range]) and severity [severity] in area [epicenter.loc.name] ")
+ log_game("Radiation pulse with size ([heavy_range], [light_range]) and severity [severity] in area [epicenter.loc.name] ")
+
+ if(heavy_range > light_range)
+ light_range = heavy_range
+
+ for(var/atom/T in range(light_range, epicenter))
+ var/distance = get_dist(epicenter, T)
+ if(distance < 0)
+ distance = 0
+ if(distance < heavy_range)
+ T.rad_act(severity)
+ else if(distance == heavy_range)
+ if(prob(50))
+ T.rad_act(severity)
+ else
+ T.rad_act(severity / 2)
+ else if(distance <= light_range)
+ T.rad_act(severity / 2)
+ return 1
+
+/atom/proc/rad_act(var/severity)
+ return 1
+
+/mob/living/rad_act(amount)
+ if(amount)
+ var/blocked = run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.")
+ apply_effect(amount, IRRADIATE, blocked)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index d5534842ddb..188911cc2a0 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -169,8 +169,7 @@
if(!active)
if(world.time > last_event+15)
active = 1
- for(var/mob/living/L in range(3,src))
- L.irradiate(4)
+ radiation_pulse(get_turf(src), 0, 3, 15, 1)
for(var/turf/simulated/wall/mineral/uranium/T in orange(1,src))
T.radiate()
last_event = world.time
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 8eec60f7283..f54046e7065 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -176,8 +176,7 @@
if(!active)
if(world.time > last_event+15)
active = 1
- for(var/mob/living/L in range(3,src))
- L.irradiate(12)
+ radiation_pulse(get_turf(src), 3, 3, 12, 0)
last_event = world.time
active = null
return
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index b1b1a728cf4..612aec92013 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -163,8 +163,7 @@
if(!active)
if(world.time > last_event+15)
active = 1
- for(var/mob/living/L in range(3,src))
- L.irradiate(1)
+ radiation_pulse(get_turf(src), 3, 3, 1, 0)
for(var/turf/simulated/floor/mineral/uranium/T in orange(1,src))
T.radiate()
last_event = world.time
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index be9d5945c9d..84aae77504d 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -80,8 +80,7 @@
if(!active)
if(world.time > last_event+15)
active = 1
- for(var/mob/living/L in range(3,src))
- L.irradiate(4)
+ radiation_pulse(get_turf(src), 3, 3, 4, 0)
for(var/turf/simulated/wall/mineral/uranium/T in orange(1,src))
T.radiate()
last_event = world.time
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index c83ea419df4..13c57a9a5a6 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -37,9 +37,9 @@
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
if(prob(5))
- H.irradiate(rand(100, 160))
+ H.rad_act(rand(100, 160))
else
- H.irradiate(rand(15, 75))
+ H.rad_act(rand(15, 75))
if(prob(25))
if(prob(75))
randmutb(H)
@@ -49,7 +49,7 @@
else if(istype(C, /mob/living/carbon/monkey))
var/mob/living/carbon/monkey/M = C
- M.irradiate(rand(15, 75))
+ M.rad_act(rand(15, 75))
/datum/round_event/radiation_storm/end()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2b585fa1f89..4a15c82b74d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -684,7 +684,7 @@
if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand))
step_towards(hand, src)
src << "\The [S] pulls \the [hand] from your grip!"
- irradiate(current_size * 3)
+ rad_act(current_size * 3)
if(mob_negates_gravity())
return
..()
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index cd5c473014b..95105c87bdc 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -122,7 +122,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
switch(proj_type)
if(/obj/item/projectile/energy/floramut)
if(prob(15))
- H.irradiate(rand(30,80))
+ H.rad_act(rand(30,80))
H.Weaken(5)
H.visible_message("[H] writhes in pain as \his vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.")
if(prob(80))
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index c30c3527d60..a63a44b5a03 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -293,7 +293,4 @@
if(stat || paralysis || stunned || weakened || restrained())
return 1
-/mob/living/proc/irradiate(amount)
- if(amount)
- var/blocked = run_armor_check(null, "rad", "Your clothes feel warm", "Your clothes feel warm")
- apply_effect(amount, IRRADIATE, blocked)
+//Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs.
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 8eb7af7db8f..104a437c2f2 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -350,8 +350,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
/obj/machinery/gravity_generator/main/proc/pulse_radiation()
- for(var/mob/living/L in view(7, src))
- L.irradiate(20)
+ radiation_pulse(get_turf(src), 3, 7, 20, 1)
// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged.
/obj/machinery/gravity_generator/main/proc/shake_everyone()
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index a9ff8952161..889d9a3189b 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -56,7 +56,7 @@
/obj/effect/accelerated_particle/proc/toxmob(mob/living/M)
- M.irradiate(energy*6)
+ M.rad_act(energy*6)
M.updatehealth()
return
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index b9578936e24..6223ff52e7c 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -364,13 +364,13 @@
radiation += round((energy-150)/10,1)
radiationmin = round((radiation/5),1)
for(var/mob/living/M in view(toxrange, src.loc))
- M.irradiate(rand(radiationmin,radiation))
+ M.rad_act(rand(radiationmin,radiation))
/obj/singularity/proc/combust_mobs()
for(var/mob/living/carbon/C in orange(20, src))
C.visible_message("[C]'s skin bursts into flame!", \
- "You feel an inner fire as your skin is suddenly covered in fire!")
+ "You feel an inner fire as your skin bursts into flames!")
C.adjust_fire_stacks(5)
C.IgniteMob()
return
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 9fb8bfb9d52..2d01b3cf8b3 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -119,7 +119,7 @@
var/mob/living/carbon/human/H = mob
H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
- mob.irradiate(rads)
+ mob.rad_act(rads)
explode()
@@ -181,7 +181,7 @@
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
- l.irradiate(rads)
+ l.rad_act(rads)
power -= (power/500)**3
@@ -259,7 +259,7 @@
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
- user.irradiate(150)
+ radiation_pulse(get_turf(src), 1, 1, 150, 1)
/obj/machinery/power/supermatter_shard/Bumped(atom/AM as mob|obj)
@@ -292,9 +292,8 @@
power += 200
//Some poor sod got eaten, go ahead and irradiate people nearby.
+ radiation_pulse(get_turf(src), 4, 10, 500, 1)
for(var/mob/living/L in range(10))
- var/rads = 500 * sqrt( 1 / (get_dist(L, src) + 1) )
- L.irradiate(rads)
investigate_log("has irradiated [L] after consuming [AM].", "supermatter")
if(L in view())
L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index a5752e23273..dbe0225dd79 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -90,11 +90,11 @@
switch(fail_tick)
if(0 to 200)
fail_tick += (2*(100-reliability))
- M.irradiate(40)
+ M.rad_act(40)
M << "Your [name] feels warmer."
if(201 to INFINITY)
SSobj.processing.Remove(src)
- M.irradiate(80)
+ M.rad_act(80)
crit_fail = 1
M << "Your [name]'s reactor overloads!"
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 8924a827921..bacc3ef9529 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -289,9 +289,7 @@
ejectItem()
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] malfunctions, melting [exp_on] and leaking radiation!")
- for(var/mob/living/m in oview(1, src))
- m.irradiate(25)
- investigate_log("Experimentor has irradiated [m]", "experimentor") //One entry per person so we know what was irradiated.
+ radiation_pulse(get_turf(src), 1, 1, 25, 1)
ejectItem(TRUE)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, spewing toxic waste!")
diff --git a/config/admins.txt b/config/admins.txt
index b4a042557de..e28d9df748e 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -7,7 +7,7 @@
# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn #
# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. #
###############################################################################################
-Optimumtact = Host
+Xhuis = Host
MrStonedOne = Game Master
microscopics = Game Master
Gun Hog = Game Master
diff --git a/tgstation.dme b/tgstation.dme
index 32d682bff36..5b1933f0518 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -544,6 +544,7 @@
#include "code\game\objects\explosion.dm"
#include "code\game\objects\items.dm"
#include "code\game\objects\objs.dm"
+#include "code\game\objects\radiation.dm"
#include "code\game\objects\structures.dm"
#include "code\game\objects\weapons.dm"
#include "code\game\objects\effects\aliens.dm"