diff --git a/code/game/gamemodes/cult/narsie.dm b/code/game/gamemodes/cult/narsie.dm
index 68f6d4682d2..a21c43362ee 100644
--- a/code/game/gamemodes/cult/narsie.dm
+++ b/code/game/gamemodes/cult/narsie.dm
@@ -24,6 +24,9 @@ var/global/list/narsie_list = list()
narsie_list.Remove(src)
..()
+/obj/machinery/singularity/narsie/singularity_act()//elder gods don't give a shit about black holes
+ return()
+
/obj/machinery/singularity/narsie/large
name = "Nar-Sie"
icon = 'icons/obj/narsie.dmi'
diff --git a/code/modules/projectiles/projectile/gravitywell.dm b/code/modules/projectiles/projectile/gravitywell.dm
new file mode 100644
index 00000000000..5cbc86d9acc
--- /dev/null
+++ b/code/modules/projectiles/projectile/gravitywell.dm
@@ -0,0 +1,168 @@
+/obj/item/projectile/gravitywell
+ name = "gravity impulse"
+ icon = 'icons/obj/projectiles_experimental.dmi'
+ icon_state = "gravitywell"
+ damage = 0
+ nodamage = 1
+ phase_type = PROJREACT_WALLS|PROJREACT_WINDOWS|PROJREACT_OBJS|PROJREACT_MOBS|PROJREACT_MOBS|PROJREACT_BLOB
+ penetration = -1
+
+/obj/item/projectile/gravitywell/bresenham_step(var/distA, var/distB, var/dA, var/dB)
+ if(..())
+ return 2
+ else
+ return 0
+
+/obj/item/projectile/gravitywell/Bump(atom/A as mob|obj|turf|area)
+ if(loc == target)
+ spawnGravityWell()
+
+ if(isliving(A))
+ var/mob/living/M = A
+ M.Weaken(5)
+
+ forceMove(get_step(loc,dir))
+
+ if(loc == target)
+ spawnGravityWell()
+
+
+/obj/item/projectile/gravitywell/proc/spawnGravityWell()
+ kill_count = 0
+ log_admin("\[[time_stamp()]\] [key_name(firer)] has created a gravity well at ([loc.x],[loc.y],[loc.z])")
+ message_admins("\[[time_stamp()]\] [key_name(firer)] has created a gravity well at (([loc.x],[loc.y],[loc.z]))", 1)
+
+ new/obj/effect/overlay/gravitywell(loc)
+ bullet_die()
+
+
+/obj/item/projectile/gravitywell/bump_original_check()//so players can aim at floors
+ if(!bumped)
+ if(loc == get_turf(original))
+ if(!(original in permutated))
+ Bump(original)
+
+/obj/item/projectile/gravitywell/cultify()
+ return
+
+/obj/item/projectile/gravitywell/singularity_act()
+ return
+
+/obj/effect/overlay/gravitywell
+ name = "gravity well"
+ icon = 'icons/effects/160x160.dmi'
+ icon_state = "gravitywell_shadow"
+ pixel_x = -64
+ pixel_y = -64
+ unacidable = 1
+ density = 0
+ layer = 2.1
+ anchored = 1
+ alpha = 255
+ mouse_opacity = 0
+ var/size = 2
+ var/xp = 6
+ var/xlevel = 4
+ var/obj/effect/overlay/gravitygrid/GG = null
+
+/obj/effect/overlay/gravitywell/New()
+ ..()
+ GG = new(loc)
+ playsound(loc, 'sound/weapons/emp.ogg', 75, 1)
+ animate(GG, alpha = 255, time = 10, easing = SINE_EASING)
+ spawn()
+ Pulse()
+ overlays += image(icon,"gravitywell_shadow",2.1)
+
+/obj/effect/overlay/gravitywell/Destroy()
+ if(GG)
+ qdel(GG)
+ ..()
+
+/obj/effect/overlay/gravitywell/proc/Pulse()
+ xp--
+ if(xp <= 0)
+ xp = 6
+ xlevel--
+ if(xlevel <= -4)
+ empulse(loc,size,size+2)
+ if(locate(/obj/machinery/the_singularitygen/) in loc)
+ new/obj/machinery/singularity(loc)//How evil can one man be?
+ qdel(src)
+ return
+ else if(xlevel > 0)
+ size++
+ if(GG)
+ GG.LevelUp()
+ src.transform *= (size*2+1)/((size-1)*2+1)
+
+ var/outter_size = round(size+1)
+ for(var/atom/A in range(src,outter_size))
+ var/dist = get_dist_euclidian(src,A)
+ var/pull_force = size/max(1,round(dist))
+ if(istype(A,/atom/movable) && (size >= 4) && (get_dist(src,A) == 1))
+ A.singularity_pull(src, (pull_force * 3), 1)
+ var/atom/movable/AM = A
+ AM.forceMove(loc)//KATAMARI DAMACYYyyYYyyYY
+ else if(get_dist(src,A) >= 1)
+ if(dist <= size)
+ A.singularity_pull(src, (pull_force * 3), 1)
+ if(istype(A,/mob/living))
+ var/mob/living/M = A
+ M.take_overall_damage(5,0)
+ M << "The [src]'s tidal force rips your skin!"
+
+ for(var/mob/living/L in loc)//standing right in the center of the gravity well means double damage
+ if((L.stat == DEAD) && prob(5))
+ L.gib()
+ L.take_overall_damage(3,0)//less brute damage in the center, but the radiations caused by singularity_pull make up for it.
+ L << "The [src]'s tidal force is crushing you!"
+
+ sleep(10)
+ Pulse()
+
+/obj/effect/overlay/gravitygrid
+ name = "gravity well"
+ icon = 'icons/effects/160x160.dmi'
+ icon_state = "gravitywell_white"
+ pixel_x = -64
+ pixel_y = -64
+ unacidable = 1
+ density = 0
+ layer = 30
+ anchored = 1
+ color = "green"
+ alpha = 0
+ mouse_opacity = 0
+ var/obj/effect/overlay/gravitygrid/GG = null
+ var/size = 5
+
+/obj/effect/overlay/gravitygrid/Destroy()
+ if(GG)
+ qdel(GG)//NO RE
+ ..()
+
+/obj/effect/overlay/gravitygrid/proc/LevelUp()
+ if(!GG)
+ GG = new(loc)
+ GG.layer = layer-1
+ GG.size = size+2
+ GG.alpha = 255
+ GG.transform *= size/5
+
+ var/matrix/M = matrix()
+ M.Scale((size/5)*(GG.size/size),(size/5)*(GG.size/size))
+ animate(GG, transform = M, time = 10)
+ else
+ GG.LevelUp()
+
+ var/newcolor = null
+ switch(color)
+ if("#00c000")
+ newcolor = "#ffa500"
+ if("#ffa500")
+ newcolor = "#ff0000"
+ else
+ newcolor = "#800080"
+
+ animate(src, color = newcolor, time = 10)
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index c5550988f6e..1fc4a14e90a 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -279,166 +279,3 @@ obj/item/projectile/kinetic/New()
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original)
-
-/obj/item/projectile/gravitywell
- name = "gravity impulse"
- icon = 'icons/obj/projectiles_experimental.dmi'
- icon_state = "gravitywell"
- damage = 0
- nodamage = 1
- phase_type = PROJREACT_WALLS|PROJREACT_WINDOWS|PROJREACT_OBJS|PROJREACT_MOBS|PROJREACT_MOBS|PROJREACT_BLOB
- penetration = -1
-
-/obj/item/projectile/gravitywell/bresenham_step(var/distA, var/distB, var/dA, var/dB)
- if(..())
- return 2
- else
- return 0
-
-/obj/item/projectile/gravitywell/Bump(atom/A as mob|obj|turf|area)
- if(loc == target)
- spawnGravityWell()
-
- if(isliving(A))
- var/mob/living/M = A
- M.Weaken(5)
-
- forceMove(get_step(loc,dir))
-
- if(loc == target)
- spawnGravityWell()
-
-
-/obj/item/projectile/gravitywell/proc/spawnGravityWell()
- kill_count = 0
- log_admin("\[[time_stamp()]\] [key_name(firer)] has created a gravity well at ([loc.x],[loc.y],[loc.z])")
- message_admins("\[[time_stamp()]\] [key_name(firer)] has created a gravity well at (([loc.x],[loc.y],[loc.z]))", 1)
-
- new/obj/effect/overlay/gravitywell(loc)
- bullet_die()
-
-
-/obj/item/projectile/gravitywell/bump_original_check()//so players can aim at floors
- if(!bumped)
- if(loc == get_turf(original))
- if(!(original in permutated))
- Bump(original)
-
-/obj/effect/overlay/gravitywell
- name = "gravity well"
- icon = 'icons/effects/160x160.dmi'
- icon_state = "gravitywell_shadow"
- pixel_x = -64
- pixel_y = -64
- unacidable = 1
- density = 0
- layer = 2.1
- anchored = 1
- alpha = 255
- mouse_opacity = 0
- var/size = 2
- var/xp = 6
- var/xlevel = 4
- var/obj/effect/overlay/gravitygrid/GG = null
-
-/obj/effect/overlay/gravitywell/New()
- ..()
- GG = new(loc)
- playsound(loc, 'sound/weapons/emp.ogg', 75, 1)
- animate(GG, alpha = 255, time = 10, easing = SINE_EASING)
- spawn()
- Pulse()
- overlays += image(icon,"gravitywell_shadow",2.1)
-
-/obj/effect/overlay/gravitywell/Destroy()
- if(GG)
- qdel(GG)
- ..()
-
-/obj/effect/overlay/gravitywell/proc/Pulse()
- xp--
- if(xp <= 0)
- xp = 6
- xlevel--
- if(xlevel <= -4)
- empulse(loc,size,size+2)
- if(locate(/obj/machinery/the_singularitygen/) in loc)
- new/obj/machinery/singularity(loc)//How evil can one man be?
- qdel(src)
- return
- else if(xlevel > 0)
- size++
- if(GG)
- GG.LevelUp()
- src.transform *= (size*2+1)/((size-1)*2+1)
-
- var/outter_size = round(size+1)
- for(var/atom/A in range(src,outter_size))
- var/dist = get_dist_euclidian(src,A)
- var/pull_force = size/max(1,round(dist))
- if(istype(A,/atom/movable) && (size >= 4) && (get_dist(src,A) <= 1))
- A.singularity_pull(src, (pull_force * 3), 1)
- var/atom/movable/AM = A
- AM.forceMove(loc)//KATAMARI DAMACYYyyYYyyYY
- else
- if(dist <= size)
- A.singularity_pull(src, (pull_force * 3), 1)
- if(istype(A,/mob/living))
- var/mob/living/M = A
- M.take_overall_damage(5,0)
- M << "The [src]'s tidal force rips your skin!"
-
- for(var/mob/living/L in loc)//standing right in the center of the gravity well means double damage
- if((L.stat == DEAD) && prob(5))
- L.gib()
- L.take_overall_damage(3,0)//less brute damage in the center, but the radiations caused by singularity_pull make up for it.
- L << "The [src]'s tidal force is crushing you!"
-
- sleep(10)
- Pulse()
-
-/obj/effect/overlay/gravitygrid
- name = "gravity well"
- icon = 'icons/effects/160x160.dmi'
- icon_state = "gravitywell_white"
- pixel_x = -64
- pixel_y = -64
- unacidable = 1
- density = 0
- layer = 30
- anchored = 1
- color = "green"
- alpha = 0
- mouse_opacity = 0
- var/obj/effect/overlay/gravitygrid/GG = null
- var/size = 5
-
-/obj/effect/overlay/gravitygrid/Destroy()
- if(GG)
- qdel(GG)//NO RE
- ..()
-
-/obj/effect/overlay/gravitygrid/proc/LevelUp()
- if(!GG)
- GG = new(loc)
- GG.layer = layer-1
- GG.size = size+2
- GG.alpha = 255
- GG.transform *= size/5
-
- var/matrix/M = matrix()
- M.Scale((size/5)*(GG.size/size),(size/5)*(GG.size/size))
- animate(GG, transform = M, time = 10)
- else
- GG.LevelUp()
-
- var/newcolor = null
- switch(color)
- if("#00c000")
- newcolor = "#ffa500"
- if("#ffa500")
- newcolor = "#ff0000"
- else
- newcolor = "#800080"
-
- animate(src, color = newcolor, time = 10)
diff --git a/vgstation13.dme b/vgstation13.dme
index b1918cab58e..0af59dd1c27 100644
--- a/vgstation13.dme
+++ b/vgstation13.dme
@@ -1501,6 +1501,7 @@
#include "code\modules\projectiles\projectile\energy.dm"
#include "code\modules\projectiles\projectile\flare.dm"
#include "code\modules\projectiles\projectile\force.dm"
+#include "code\modules\projectiles\projectile\gravitywell.dm"
#include "code\modules\projectiles\projectile\hookshot.dm"
#include "code\modules\projectiles\projectile\ricochet.dm"
#include "code\modules\projectiles\projectile\rocket.dm"