diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index f8f55f0e126..5713eb56957 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -60,58 +60,6 @@
var/blacklisted_lights = list(/obj/item/flashlight/flare, /obj/item/flashlight/slime)
action_icon_state = "veil"
-/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishItem(var/obj/item/I) //WARNING NOT SUFFICIENT TO EXTINGUISH AN ITEM HELD BY A MOB
- if(istype(I, /obj/item/flashlight))
- var/obj/item/flashlight/F = I
- if(F.on)
- if(is_type_in_list(I, blacklisted_lights))
- I.visible_message("[I] dims slightly before scattering the shadows around it.")
- return
- F.on = 0
- F.update_brightness()
- else if(istype(I, /obj/item/pda))
- var/obj/item/pda/P = I
- var/datum/data/pda/utility/flashlight/FL = P.find_program(/datum/data/pda/utility/flashlight)
- if(FL && FL.fon)
- FL.start()
- else if(istype(I, /obj/item/clothing/head/helmet/space/hardsuit))
- var/obj/item/clothing/head/helmet/space/hardsuit/R = I
- if(R.on)
- R.toggle_light()
- R.visible_message("[R]'s light fades and turns off.")
- else if(istype(I, /obj/item/clothing/head/helmet/space/eva/plasmaman))
- var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = I
- if(P.on)
- P.toggle_light()
- P.visible_message("[P]'s light fades and turns off.")
- else if(istype(I, /obj/item/gun))
- var/obj/item/gun/G = I
- if(G.gun_light)
- var/obj/item/flashlight/F = G.gun_light
- if(F.on)
- G.toggle_gunlight()
- G.visible_message("[G]'s light fades and turns off.")
- else if(istype(I, /obj/item/clothing/head/hardhat)) //There really needs to be a better way to handle this.
- var/obj/item/clothing/head/hardhat/hhat = I
- if(hhat.on)
- hhat.on = 0
- hhat.set_light(0)
- hhat.icon_state = "hardhat0_[hhat.item_color]"
- hhat.item_state = "hardhat0_[hhat.item_color]"
- hhat.visible_message("[hhat]'s light fades and turns off.")
- return I.light_range
-
-/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishMob(mob/living/L)
- for(var/obj/item/F in L)
- if(F.light_range > 0)
- extinguishItem(F)
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- var/obj/item/organ/internal/lantern/O = H.get_int_organ(/obj/item/organ/internal/lantern)
- if(O && O.glowing)
- O.toggle_biolum(1)
- H.visible_message("[H] is engulfed in shadows and fades into the darkness.", "A sense of dread washes over you as you suddenly dim dark.")
-
/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets, mob/user = usr)
if(!shadowling_check(user))
charge_counter = charge_max
@@ -121,23 +69,8 @@
G.visible_message("\The [G] withers away!")
qdel(G)
for(var/turf/T in targets)
- for(var/obj/item/F in T.contents)
- extinguishItem(F)
- for(var/obj/machinery/floodlight/F in T.contents)
- F.on = 0
- F.set_light(0)
- for(var/obj/machinery/light/L in T.contents)
- L.on = 0
- L.visible_message("[L] flickers and falls dark.")
- L.update(0)
- for(var/obj/machinery/computer/C in T.contents)
- C.set_light(0)
- C.visible_message("[C] grows dim, its screen barely readable.")
- for(var/mob/living/H in T.contents)
- extinguishMob(H)
- for(var/mob/living/silicon/robot/borg in T.contents)
- borg.update_headlamp(1, charge_max)
-
+ for(var/atom/A in T.contents)
+ A.extinguish_light()
/obj/effect/proc_holder/spell/targeted/shadow_walk
name = "Shadow Walk"
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index cfddc393875..325d2fe4b78 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -68,6 +68,10 @@
set_broken()
density = 0
+/obj/machinery/computer/extinguish_light()
+ set_light(0)
+ visible_message("[src] grows dim, its screen barely readable.")
+
/obj/machinery/computer/update_icon()
overlays.Cut()
if(stat & NOPOWER)
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index 8ac57a5cec6..150d8bebd0b 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -117,3 +117,7 @@
cell = W
to_chat(user, "You insert the power cell.")
updateicon()
+
+/obj/machinery/floodlight/extinguish_light()
+ on = 0
+ set_light(0)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index fb1956a56e9..79f65907c5b 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -83,6 +83,11 @@
else
return ..()
+/obj/item/flashlight/extinguish_light()
+ if(on)
+ on = 0
+ update_brightness()
+
/obj/item/flashlight/pen
name = "penlight"
desc = "A pen-sized light, used by medical staff."
@@ -211,6 +216,9 @@ obj/item/flashlight/lamp/bananalamp
src.damtype = "fire"
processing_objects += src
+/obj/item/flashlight/flare/extinguish_light()
+ visible_message("[src] dims slightly before scattering the shadows around it.")
+
/obj/item/flashlight/flare/torch
name = "torch"
desc = "A torch fashioned from some leaves and a log."
@@ -242,6 +250,9 @@ obj/item/flashlight/lamp/bananalamp
/obj/item/flashlight/slime/attack_self(mob/user)
return //Bio-luminescence does not toggle.
+/obj/item/flashlight/slime/extinguish_light()
+ visible_message("[src] dims slightly before scattering the shadows around it.")
+
/obj/item/flashlight/emp
origin_tech = "magnets=3;syndicate=1"
@@ -299,4 +310,4 @@ obj/item/flashlight/lamp/bananalamp
anchored = TRUE
var/range = null
unacidable = TRUE
- burn_state = LAVA_PROOF
\ No newline at end of file
+ burn_state = LAVA_PROOF
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index ae694f8edf2..95137650612 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -26,6 +26,13 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/clothing/head/hardhat/extinguish_light()
+ if(on)
+ on = 0
+ set_light(0)
+ icon_state = "hardhat0_[item_color]"
+ item_state = "hardhat0_[item_color]"
+ visible_message("[src]'s light fades and turns off.")
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange"
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 75614d56312..2cf2ba5536e 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -57,6 +57,11 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/clothing/head/helmet/space/hardsuit/extinguish_light()
+ if(on)
+ toggle_light()
+ visible_message("[src]'s light fades and turns off.")
+
/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot)
if(slot == slot_head)
return 1
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 23f99ec24c2..d7ac977f929 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -102,6 +102,11 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/clothing/head/helmet/space/eva/plasmaman/extinguish_light()
+ if(on)
+ toggle_light()
+ visible_message("[src]'s light fades and turns off.")
+
// ENGINEERING
/obj/item/clothing/suit/space/eva/plasmaman/atmostech
name = "plasmaman atmospheric suit"
diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm
index 075e3e47a20..646fe0ba15d 100644
--- a/code/modules/lighting/lighting_atom.dm
+++ b/code/modules/lighting/lighting_atom.dm
@@ -40,6 +40,9 @@
else
light = new /datum/light_source(src, .)
+/atom/proc/extinguish_light()
+ return
+
/atom/Destroy()
if(light)
light.destroy()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1cf1a8bb942..a4d2dfba09a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -2014,4 +2014,13 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/proc/special_post_clone_handling()
if(mind && mind.assigned_role == "Cluwne") //HUNKE your suffering never stops
- makeCluwne()
\ No newline at end of file
+ makeCluwne()
+
+/mob/living/carbon/human/extinguish_light()
+ // Parent function handles stuff the human may be holding
+ ..()
+
+ var/obj/item/organ/internal/lantern/O = get_int_organ(/obj/item/organ/internal/lantern)
+ if(O && O.glowing)
+ O.toggle_biolum(1)
+ visible_message("[src] is engulfed in shadows and fades into the darkness.", "A sense of dread washes over you as you suddenly dim dark.")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index ee23633f4b6..54b40f5564e 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -996,3 +996,8 @@
return
to_chat(src, "You can taste [english_list(final_taste_list)].")
+
+/mob/living/extinguish_light()
+ for(var/atom/A in src)
+ if(A.light_range > 0)
+ A.extinguish_light()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 755b874667a..0e96fae2e22 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1433,6 +1433,10 @@ var/list/robot_verbs_default = list(
disable_component("comms", 160)
if(2)
disable_component("comms", 60)
+
+/mob/living/silicon/robot/extinguish_light()
+ update_headlamp(1, 150)
+
/mob/living/silicon/robot/rejuvenate()
..()
var/brute = 1000
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index 38422a89528..7d40dcc184b 100755
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -511,3 +511,8 @@ var/global/list/obj/item/pda/PDAs = list()
/obj/item/pda/process()
if(current_app)
current_app.program_process()
+
+/obj/item/pda/extinguish_light()
+ var/datum/data/pda/utility/flashlight/FL = find_program(/datum/data/pda/utility/flashlight)
+ if(FL && FL.fon)
+ FL.start()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index df12267015f..c911a5ceb8e 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -159,7 +159,6 @@
var/nightshift_light_power = 0.45
var/nightshift_light_color = "#FFDDCC"
-
// the smaller bulb light fixture
/obj/machinery/light/small
@@ -733,3 +732,8 @@
if(limb)
limb.droplimb(0, DROPLIMB_BURN)
return FIRELOSS
+
+/obj/machinery/light/extinguish_light()
+ on = 0
+ visible_message("[src] flickers and falls dark.")
+ update(0)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 165e75f1875..f940f51714d 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -303,6 +303,11 @@ obj/item/gun/proc/newshot()
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/gun/extinguish_light()
+ if(gun_light.on)
+ toggle_gunlight()
+ visible_message("[src]'s light fades and turns off.")
+
/obj/item/gun/pickup(mob/user)
..()
if(azoom)