diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 1ab2b6c4ec2..cb52b56edb8 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -673,7 +673,7 @@ steam.start() -- spawns the effect
for(var/mob/living/carbon/human/R in get_turf(src))
if(R.internal != null && usr.wear_mask && (R.wear_mask.flags & AIRTIGHT) && R.wear_suit != null && !istype(R.wear_suit, /obj/item/clothing/suit/storage/labcoat) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket && !istype(R.wear_suit, /obj/item/clothing/suit/armor)))
else
- R.burn_skin(0.75)
+ R.adjustFireLoss(0.75)
if(R.coughedtime != 1)
R.coughedtime = 1
R.emote("gasp")
@@ -687,7 +687,7 @@ steam.start() -- spawns the effect
if(istype(R, /mob/living/carbon/human))
if(R.internal != null && usr.wear_mask && (R.wear_mask.flags & AIRTIGHT) && R.wear_suit != null && !istype(R.wear_suit, /obj/item/clothing/suit/storage/labcoat) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket && !istype(R.wear_suit, /obj/item/clothing/suit/armor)))
return
- R.burn_skin(0.75)
+ R.adjustFireLoss(0.75)
if(R.coughedtime != 1)
R.coughedtime = 1
R.emote("gasp")
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index f5ab3cb14aa..7719f9b547d 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -77,13 +77,10 @@
s.start()
visible_message("The electric chair went off!", "You hear a deep sharp shock!")
if(buckled_mob)
- buckled_mob.burn_skin(90)
+ buckled_mob.electrocute_act(110, src, 1)
to_chat(buckled_mob, "You feel a deep shock course through your body!")
- sleep(1)
- buckled_mob.burn_skin(90)
- sleep(5)
- buckled_mob.burn_skin(max(rand(5,20),rand(5,20),rand(5,20)))
-
+ spawn(1)
+ buckled_mob.electrocute_act(110, src, 1)
A.power_light = light
A.updateicon()
return
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index e7eedea85e3..2c930080edc 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -1371,19 +1371,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes")
return
- for(var/obj/machinery/power/emitter/E in world)
+ for(var/obj/machinery/power/emitter/E in machines)
if(E.anchored)
E.active = 1
- for(var/obj/machinery/field/generator/F in world)
- if(F.anchored)
- F.Varedit_start = 1
+ for(var/obj/machinery/field/generator/F in machines)
+ if(F.active == 0)
+ F.active = 1
+ F.state = 2
+ F.power = 250
+ F.anchored = 1
+ F.warming_up = 3
+ F.start_fields()
+ F.update_icon()
+
spawn(30)
- for(var/obj/machinery/the_singularitygen/G in world)
+ for(var/obj/machinery/the_singularitygen/G in machines)
if(G.anchored)
var/obj/singularity/S = new /obj/singularity(get_turf(G), 50)
- spawn(0)
- qdel(G)
+// qdel(G)
S.energy = 1750
S.current_size = 7
S.icon = 'icons/effects/224x224.dmi'
@@ -1397,7 +1403,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
//S.dissipate_track = 0
//S.dissipate_strength = 10
- for(var/obj/machinery/power/rad_collector/Rad in world)
+ for(var/obj/machinery/power/rad_collector/Rad in machines)
if(Rad.anchored)
if(!Rad.P)
var/obj/item/weapon/tank/plasma/Plasma = new/obj/item/weapon/tank/plasma(Rad)
@@ -1409,7 +1415,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!Rad.active)
Rad.toggle_power()
- for(var/obj/machinery/power/smes/SMES in world)
+ for(var/obj/machinery/power/smes/SMES in machines)
if(SMES.anchored)
SMES.input_attempt = 1
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index c67879f0457..60c26dc4a50 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -92,22 +92,6 @@
/mob/living/proc/calculate_affecting_pressure(var/pressure)
return 0
-
-//sort of a legacy burn method for /electrocute, /shock, and the e_chair
-/mob/living/proc/burn_skin(burn_amount)
- if(istype(src, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
- var/divided_damage = (burn_amount)/(H.organs.len)
- var/extradam = 0 //added to when organ is at max dam
- for(var/obj/item/organ/external/affecting in H.organs)
- if(!affecting) continue
- if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn
- H.UpdateDamageIcon()
- H.updatehealth()
- return 1
- else if(istype(src, /mob/living/silicon/ai))
- return 0
-
/mob/living/proc/adjustBodyTemp(actual, desired, incrementboost)
var/temperature = actual
var/difference = abs(actual-desired) //get difference
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index e4704dff26a..751fda95fab 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -15,10 +15,8 @@
var/obj/machinery/field/generator/FG2 = null
/obj/machinery/field/containment/Destroy()
- if(FG1 && !FG1.clean_up)
- FG1.cleanup()
- if(FG2 && !FG2.clean_up)
- FG2.cleanup()
+ FG1.fields -= src
+ FG2.fields -= src
return ..()
/obj/machinery/field/containment/attack_hand(mob/user)
@@ -67,35 +65,26 @@
/obj/machinery/field
var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second.
-/obj/machinery/field/CanPass(mob/mover, turf/target, height=0)
+/obj/machinery/field/CanPass(atom/movable/mover, turf/target, height=0)
+ if(hasShocked)
+ return 0
if(isliving(mover)) // Don't let mobs through
shock_field(mover)
return 0
- return ..()
-
-/obj/machinery/field/CanPass(obj/mover, turf/target, height=0)
- if((istype(mover, /obj/machinery) && !istype(mover, /obj/singularity)) || \
- istype(mover, /obj/structure) || \
- istype(mover, /obj/mecha))
+ if(istype(mover, /obj/machinery) || istype(mover, /obj/structure) || istype(mover, /obj/mecha))
bump_field(mover)
return 0
return ..()
/obj/machinery/field/proc/shock_field(mob/living/user)
- if(hasShocked)
- return 0
if(isliving(user))
- hasShocked = 1
var/shock_damage = min(rand(30,40),rand(30,40))
if(iscarbon(user))
var/stun = min(shock_damage, 15)
user.Stun(stun)
user.Weaken(10)
- user.burn_skin(shock_damage)
- user.visible_message("[user.name] was shocked by the [src.name]!", \
- "You feel a powerful shock course through your body, sending you flying!", \
- "You hear a heavy electrical crack.")
+ user.electrocute_act(shock_damage, src, 1)
else if(issilicon(user))
if(prob(20))
@@ -108,13 +97,14 @@
user.updatehealth()
bump_field(user)
- spawn(5)
- hasShocked = 0
- return
-
/obj/machinery/field/proc/bump_field(atom/movable/AM as mob|obj)
+ if(hasShocked)
+ return 0
+ hasShocked = 1
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, AM.loc)
s.start()
var/atom/target = get_edge_target_turf(AM, get_dir(src, get_step_away(AM, src)))
AM.throw_at(target, 200, 4)
+ spawn(5)
+ hasShocked = 0
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index ed4d7bbc537..d55e240bdf6 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -13,6 +13,15 @@ field_generator power level display
*/
#define field_generator_max_power 250
+
+#define FG_UNSECURED 0
+#define FG_SECURED 1
+#define FG_WELDED 2
+
+#define FG_OFFLINE 0
+#define FG_CHARGING 1
+#define FG_ONLINE 2
+
/obj/machinery/field/generator
name = "Field Generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
@@ -22,134 +31,109 @@ field_generator power level display
density = 1
use_power = 0
var/const/num_power_levels = 6 // Total number of power level icon has
- var/Varedit_start = 0
- var/Varpower = 0
- var/active = 0
+ var/power_level = 0
+ var/active = FG_OFFLINE
var/power = 20 // Current amount of power
- var/state = 0
+ var/state = FG_UNSECURED
var/warming_up = 0
var/list/obj/machinery/field/containment/fields
var/list/obj/machinery/field/generator/connected_gens
var/clean_up = 0
-
/obj/machinery/field/generator/update_icon()
overlays.Cut()
if(warming_up)
overlays += "+a[warming_up]"
if(fields.len)
overlays += "+on"
- // Power level indicator
- // Scale % power to % num_power_levels and truncate value
- var/level = round(num_power_levels * power / field_generator_max_power)
- // Clamp between 0 and num_power_levels for out of range power values
- level = Clamp(level, 0, num_power_levels)
- if(level)
- overlays += "+p[level]"
-
- return
+ if(power_level)
+ overlays += "+p[power_level]"
/obj/machinery/field/generator/New()
..()
fields = list()
connected_gens = list()
- return
/obj/machinery/field/generator/process()
- if(Varedit_start == 1)
- if(active == 0)
- active = 1
- state = 2
- power = field_generator_max_power
- anchored = 1
- warming_up = 3
- start_fields()
- update_icon()
- Varedit_start = 0
-
- if(src.active == 2)
+ if(active == FG_ONLINE)
calc_power()
- update_icon()
- return
-
/obj/machinery/field/generator/attack_hand(mob/user)
- if(state == 2)
+ if(state == FG_WELDED)
if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on
- if(src.active >= 1)
- to_chat(user, "You are unable to turn off the [src.name] once it is online!")
+ if(active >= FG_CHARGING)
+ to_chat(user, "You are unable to turn off the [name] once it is online!")
return 1
else
- user.visible_message("[user.name] turns on the [src.name].", \
- "You turn on the [src.name].", \
+ user.visible_message("[user.name] turns on the [name].", \
+ "You turn on the [name].", \
"You hear heavy droning.")
turn_on()
investigate_log("activated by [user.key].","singulo")
- src.add_fingerprint(user)
+ add_fingerprint(user)
else
- to_chat(user, "The [src] needs to be firmly secured to the floor first!")
- return
+ to_chat(user, "[src] needs to be firmly secured to the floor first!")
/obj/machinery/field/generator/attackby(obj/item/W, mob/user, params)
if(active)
- to_chat(user, "The [src] needs to be off!")
+ to_chat(user, "[src] needs to be off!")
return
else if(istype(W, /obj/item/weapon/wrench))
switch(state)
- if(0)
+ if(FG_UNSECURED)
if(isinspace()) return
- state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secures [src.name] to the floor.", \
+ state = FG_SECURED
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] secures [name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear ratchet.")
- src.anchored = 1
- if(1)
- state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
+ anchored = 1
+ if(FG_SECURED)
+ state = FG_UNSECURED
+ playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ user.visible_message("[user.name] unsecures [name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet.")
- src.anchored = 0
- if(2)
- to_chat(user, "The [src.name] needs to be unwelded from the floor!")
- return
+ anchored = 0
+ if(FG_WELDED)
+ to_chat(user, "The [name] needs to be unwelded from the floor!")
+
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
switch(state)
- if(0)
- to_chat(user, "The [src.name] needs to be wrenched to the floor!")
- return
- if(1)
+ if(FG_UNSECURED)
+ to_chat(user, "The [name] needs to be wrenched to the floor!")
+
+ if(FG_SECURED)
if(WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld the [name] to the floor.", \
"You start to weld \the [src] to the floor...", \
"You hear welding.")
if(do_after(user,20, target = src))
- if(!src || !WT.isOn()) return
- state = 2
+ if(!src || !WT.isOn())
+ return
+ state = FG_WELDED
to_chat(user, "You weld the field generator to the floor.")
- else
- return
- if(2)
+
+ if(FG_WELDED)
if(WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
+ playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
"You start to cut \the [src] free from the floor...", \
"You hear welding.")
if(do_after(user,20, target = src))
- if(!src || !WT.isOn()) return
- state = 1
+ if(!src || !WT.isOn())
+ return
+ state = FG_SECURED
to_chat(user, "You cut \the [src] free from the floor.")
- else
- return
+
else
- ..()
+ return ..()
/obj/machinery/field/generator/emp_act()
@@ -164,30 +148,35 @@ field_generator power level display
/obj/machinery/field/generator/bullet_act(obj/item/projectile/Proj)
if(Proj.flag != "bullet")
- power += Proj.damage
- update_icon()
+ power = min(power + Proj.damage, field_generator_max_power)
+ check_power_level()
return 0
/obj/machinery/field/generator/Destroy()
- src.cleanup()
+ cleanup()
return ..()
+/obj/machinery/field/generator/proc/check_power_level()
+ var/new_level = round(num_power_levels * power / field_generator_max_power)
+ if(new_level != power_level)
+ power_level = new_level
+ update_icon()
/obj/machinery/field/generator/proc/turn_off()
- active = 0
+ active = FG_OFFLINE
spawn(1)
- src.cleanup()
- while(warming_up>0 && !active)
+ cleanup()
+ while(warming_up > 0 && !active)
sleep(50)
warming_up--
update_icon()
/obj/machinery/field/generator/proc/turn_on()
- active = 1
+ active = FG_CHARGING
spawn(1)
- while(warming_up<3 && active)
+ while(warming_up < 3 && active)
sleep(50)
warming_up++
update_icon()
@@ -196,44 +185,35 @@ field_generator power level display
/obj/machinery/field/generator/proc/calc_power()
- if(Varpower)
- return 1
+ var/power_draw = 2 + fields.len
- update_icon()
- if(src.power > field_generator_max_power)
- src.power = field_generator_max_power
-
- var/power_draw = 2
- for(var/obj/machinery/field/containment/F in fields)
- if(isnull(F))
- continue
- power_draw++
- if(draw_power(round(power_draw/2,1)))
+ if(draw_power(round(power_draw/2, 1)))
+ check_power_level()
return 1
else
- visible_message("The [src.name] shuts down!", "You hear something shutting down.")
+ visible_message("The [name] shuts down!", "You hear something shutting down.")
turn_off()
investigate_log("ran out of power and deactivated","singulo")
- src.power = 0
+ power = 0
+ check_power_level()
return 0
//This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport
/obj/machinery/field/generator/proc/draw_power(draw = 0, failsafe = 0, obj/machinery/field/generator/G = null, obj/machinery/field/generator/last = null)
- if(Varpower)
- return 1
- if((G && G == src) || (failsafe >= 8))//Loopin, set fail
+ if((G && (G == src)) || (failsafe >= 8))//Loopin, set fail
return 0
else
failsafe++
- if(src.power >= draw)//We have enough power
- src.power -= draw
+
+ if(power >= draw)//We have enough power
+ power -= draw
return 1
+
else//Need more power
- draw -= src.power
- src.power = 0
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if(isnull(FG))
- continue
+ draw -= power
+ power = 0
+ for(var/CG in connected_gens)
+ var/obj/machinery/field/generator/FG = CG
if(FG == last)//We just asked you
continue
if(G)//Another gen is askin for power and we dont have it
@@ -249,7 +229,7 @@ field_generator power level display
/obj/machinery/field/generator/proc/start_fields()
- if(!src.state == 2 || !anchored)
+ if(state != FG_WELDED || !anchored)
turn_off()
return
spawn(1)
@@ -260,82 +240,73 @@ field_generator power level display
setup_field(4)
spawn(4)
setup_field(8)
- src.active = 2
+ spawn(5)
+ active = FG_ONLINE
/obj/machinery/field/generator/proc/setup_field(NSEW)
- var/turf/T = src.loc
- var/obj/machinery/field/generator/G
+ var/turf/T = loc
+ if(!istype(T))
+ return 0
+
+ var/obj/machinery/field/generator/G = null
var/steps = 0
if(!NSEW)//Make sure its ran right
- return
- for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
+ return 0
+ for(var/dist in 0 to 7) // checks out to 8 tiles away for another generator
T = get_step(T, NSEW)
if(T.density)//We cant shoot a field though this
return 0
- for(var/atom/A in T.contents)
- if(ismob(A))
- continue
- if(!istype(A,/obj/machinery/field/generator))
- if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density))
- return 0
- steps += 1
+
G = locate(/obj/machinery/field/generator) in T
- if(!isnull(G))
+ if(G)
steps -= 1
if(!G.active)
return 0
break
- if(isnull(G))
- return
- T = src.loc
- for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
+
+ for(var/TC in T.contents)
+ var/atom/A = TC
+ if(ismob(A))
+ continue
+ if(A.density)
+ return 0
+
+ steps++
+
+ if(!G)
+ return 0
+
+ T = loc
+ for(var/dist in 0 to steps) // creates each field tile
var/field_dir = get_dir(T,get_step(G.loc, NSEW))
T = get_step(T, NSEW)
if(!locate(/obj/machinery/field/containment) in T)
var/obj/machinery/field/containment/CF = new/obj/machinery/field/containment()
CF.set_master(src,G)
- fields += CF
- G.fields += CF
CF.loc = T
CF.dir = field_dir
- for(var/mob/living/L in CF.loc)
+ fields += CF
+ G.fields += CF
+ for(var/mob/living/L in T)
CF.Crossed(L)
- var/listcheck = 0
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if(isnull(FG))
- continue
- if(FG == G)
- listcheck = 1
- break
- if(!listcheck)
- connected_gens.Add(G)
- listcheck = 0
- for(var/obj/machinery/field/generator/FG2 in G.connected_gens)
- if(isnull(FG2))
- continue
- if(FG2 == src)
- listcheck = 1
- break
- if(!listcheck)
- G.connected_gens.Add(src)
+
+ connected_gens |= G
+ G.connected_gens |= src
+ update_icon()
/obj/machinery/field/generator/proc/cleanup()
clean_up = 1
- for(var/obj/machinery/field/containment/F in fields)
- if(isnull(F))
- continue
+ for(var/F in fields)
qdel(F)
- fields = list()
- for(var/obj/machinery/field/generator/FG in connected_gens)
- if(isnull(FG))
- continue
- FG.connected_gens.Remove(src)
+
+ for(var/CG in connected_gens)
+ var/obj/machinery/field/generator/FG = CG
+ FG.connected_gens -= src
if(!FG.clean_up)//Makes the other gens clean up as well
FG.cleanup()
- connected_gens.Remove(FG)
- connected_gens = list()
+ connected_gens -= FG
clean_up = 0
update_icon()
@@ -359,3 +330,11 @@ field_generator power level display
/obj/machinery/field/generator/bump_field(atom/movable/AM as mob|obj)
if(fields.len)
..()
+
+#undef FG_UNSECURED
+#undef FG_SECURED
+#undef FG_WELDED
+
+#undef FG_OFFLINE
+#undef FG_CHARGING
+#undef FG_ONLINE
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index e13e84de488..2fa6facdab0 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -149,17 +149,18 @@
dissipate_delay = 10
dissipate_track = 0
dissipate_strength = 1
- if(STAGE_TWO)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them
- current_size = STAGE_TWO
- icon = 'icons/effects/96x96.dmi'
- icon_state = "singularity_s3"
- pixel_x = -32
- pixel_y = -32
- grav_pull = 6
- consume_range = 1
- dissipate_delay = 5
- dissipate_track = 0
- dissipate_strength = 5
+ if(STAGE_TWO)
+ if((check_turfs_in(1,1))&&(check_turfs_in(2,1))&&(check_turfs_in(4,1))&&(check_turfs_in(8,1)))
+ current_size = STAGE_TWO
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "singularity_s3"
+ pixel_x = -32
+ pixel_y = -32
+ grav_pull = 6
+ consume_range = 1
+ dissipate_delay = 5
+ dissipate_track = 0
+ dissipate_strength = 5
if(STAGE_THREE)
if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2)))
current_size = STAGE_THREE
@@ -238,22 +239,22 @@
/obj/singularity/proc/eat()
set background = BACKGROUND_ENABLED
- for(var/tile in spiral_range_turfs(grav_pull, src, 1))
+ for(var/tile in spiral_range_turfs(grav_pull, src))
var/turf/T = tile
- if(!T)
+ if(!T || !isturf(loc))
continue
if(get_dist(T, src) > consume_range)
T.singularity_pull(src, current_size)
else
consume(T)
for(var/thing in T)
- var/atom/movable/X = thing
- if(get_dist(X, src) > consume_range)
- X.singularity_pull(src, current_size)
- else
- consume(X)
+ if(isturf(loc) && thing != src)
+ var/atom/movable/X = thing
+ if(get_dist(X, src) > consume_range)
+ X.singularity_pull(src, current_size)
+ else
+ consume(X)
CHECK_TICK
- return
/obj/singularity/proc/consume(var/atom/A)
var/gain = A.singularity_act(current_size)