diff --git a/code/game/gamemodes/cult/cultify/turf.dm b/code/game/gamemodes/cult/cultify/turf.dm
index c29bd7b15b6..aed1a75890a 100644
--- a/code/game/gamemodes/cult/cultify/turf.dm
+++ b/code/game/gamemodes/cult/cultify/turf.dm
@@ -27,6 +27,9 @@
/turf/unsimulated/beach/cultify()
return
+/turf/simulated/open/cultify()
+ return
+
/turf/unsimulated/floor/cultify()
cultify_floor()
@@ -37,6 +40,8 @@
if((icon_state != "cult")&&(icon_state != "cult-narsie"))
icon = 'icons/turf/flooring/cult.dmi'
icon_state = "cult"
+ pixel_x = 0
+ pixel_y = 0
if(istype(src,/turf/simulated/floor))
var/turf/simulated/floor/F = src
F.set_flooring(get_flooring_data(/decl/flooring/reinforced/cult))
diff --git a/code/game/gamemodes/cult/narsie.dm b/code/game/gamemodes/cult/narsie.dm
index 4371ff4b2aa..a916129d8cf 100644
--- a/code/game/gamemodes/cult/narsie.dm
+++ b/code/game/gamemodes/cult/narsie.dm
@@ -108,7 +108,15 @@ var/global/list/narsie_list = list()
movement_dir = force_move
if(target && prob(60))
- movement_dir = get_dir(src,target)
+ movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
+ if(target.z < z)
+ visible_message("\The [src] descends ominously.")
+ zMove(DOWN)
+ visible_message("\The [src] appears from on high.")
+ else if(target.z > z)
+ visible_message("\The [src] ascends ominously.")
+ zMove(UP)
+ visible_message("\The [src] claws its way up from below.")
spawn(0)
step(src, movement_dir)
@@ -126,7 +134,16 @@ var/global/list/narsie_list = list()
movement_dir = force_move
if(target && prob(60))
- movement_dir = get_dir(src,target)
+ movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
+ if(target.z < z)
+ visible_message("\The [src] descends ominously.")
+ zMove(DOWN)
+ visible_message("\The [src] appears from on high.")
+ else if(target.z > z)
+ visible_message("\The [src] ascends ominously.")
+ zMove(UP)
+ visible_message("\The [src] claws its way up from below.")
+
spawn(0)
step(src, movement_dir)
narsiefloor(get_turf(loc))
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
index 0e4d2b4f197..9b214e97354 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
@@ -34,13 +34,20 @@
var/pdir = pick(avail_dirs)
avail_dirs -= pdir
var/turf/T = get_step(src, pdir)
+ var/turf/A = GetAbove(T)
+ var/turf/B = GetBelow(T)
// EXPAND
if(!istype(T,type))
// Do pretty fadeout animation for 1s.
new /obj/effect/overlay/bluespacify(T)
addtimer(CALLBACK(src, .proc/after_tick, T), 10)
-
+ if(A && !istype(A,type))
+ new /obj/effect/overlay/bluespacify(A)
+ addtimer(CALLBACK(src, .proc/after_tick, A), 10)
+ if(B && !istype(B,type))
+ new /obj/effect/overlay/bluespacify(B)
+ addtimer(CALLBACK(src, .proc/after_tick, B), 10)
if((spawned & (NORTH|SOUTH|EAST|WEST)) == (NORTH|SOUTH|EAST|WEST))
STOP_PROCESSING(SScalamity, src)
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index 342676d7540..1d7ce2725b6 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -27,7 +27,7 @@
if(N == /turf/space)
var/turf/below = GetBelow(src)
if(istype(below) && !istype(below,/turf/space))
- N = below.density ? /turf/simulated/floor/airless : /turf/simulated/open
+ N = /turf/simulated/open
var/obj/fire/old_fire = fire
var/old_baseturf = baseturf
@@ -36,12 +36,12 @@
changing_turf = TRUE
- if(connections)
+ if(connections)
connections.erase_all()
cut_overlays()
underlays.Cut()
-
+
// So we call destroy.
qdel(src)
@@ -63,7 +63,7 @@
W.baseturf = old_baseturf
W.post_change()
-
+
. = W
queue_smooth(src)
@@ -102,7 +102,7 @@
if (dir != other.dir)
other.set_dir(dir)
-
+
other.icon = icon
other.icon_state = icon_state
other.underlays = underlays.Copy()
@@ -114,7 +114,7 @@
other.priority_overlays = priority_overlays
other.overlays = overlays.Copy()
-
+
/turf/simulated/copy_turf(turf/simulated/other, ignore_air = FALSE)
. = ..()
diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm
index 23774d526ed..dae21030860 100644
--- a/code/modules/power/singularity/act.dm
+++ b/code/modules/power/singularity/act.dm
@@ -100,14 +100,25 @@
explosion(src.loc,(dist),(dist*2),(dist*4))
return 1000
-/turf/singularity_act(S, current_size)
+/turf/singularity_act(S, current_size, var/go_down = 1, var/go_up = 1)
if(!is_plating())
for(var/obj/O in contents)
if(O.level != 1)
continue
if(O.invisibility == 101)
O.singularity_act(src, current_size)
- ChangeTurf(get_base_turf_by_area(src))
+ if(go_up && current_size >= STAGE_FIVE)
+ if(HasAbove(src.z))
+ var/turf/A = GetAbove(src)
+ A.singularity_act(S, current_size, 0, 1)
+ if(go_down && current_size >= STAGE_FIVE)
+ if(HasBelow(src.z))
+ var/turf/B = GetBelow(src)
+ B.singularity_act(S, current_size, 1, 0)
+ if(istype(src,/turf/simulated/mineral))
+ var/turf/simulated/mineral/M = src
+ M.GetDrilled()
+ ChangeTurf(/turf/space)
return 2
/turf/simulated/wall/singularity_pull(S, current_size)
@@ -128,6 +139,9 @@
/turf/space/singularity_act()
return
+/turf/simulated/open/singularity_act()
+ return
+
/*******************
* Nar-Sie Act/Pull *
*******************/
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 7b696750d3f..08a3eeaad62 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -8,7 +8,7 @@
anchored = 1
density = 1
layer = 6
- light_range = 6
+ light_power = -100 //eats all light
unacidable = 1 //Don't comment this out.
var/current_size = 1
@@ -23,7 +23,7 @@
var/grav_pull = 4 //How many tiles out do we pull?
var/consume_range = 0 //How many tiles out do we eat.
var/event_chance = 15 //Prob for event each tick.
- var/target = null //Its target. Moves towards the target if it has one.
+ var/atom/target = null //Its target. Moves towards the target if it has one.
var/last_failed_movement = 0 //Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing.
var/last_warning
@@ -80,6 +80,9 @@
eat()
dissipate()
check_energy()
+ light_range = current_size-2
+ if(light_range < 0)
+ light_range = 0
if (current_size >= STAGE_THREE)
move()
@@ -299,6 +302,14 @@
if(target && prob(60))
movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
+ if(target.z < z)
+ visible_message("\The [src] gravitates downwards.")
+ zMove(DOWN)
+ visible_message("\The [src] appears from above.")
+ else if(target.z > z)
+ visible_message("\The [src] gravitates upwards.")
+ zMove(UP)
+ visible_message("\The [src] appears from below.")
if(current_size >= 9)//The superlarge one does not care about things in its way
spawn(0)
@@ -312,7 +323,12 @@
step(src, movement_dir)
return 1
else
- last_failed_movement = movement_dir
+ if(current_size >= STAGE_FIVE)
+ var/z_dir = pick(UP,DOWN)
+ if(!zMove(z_dir))
+ last_failed_movement = movement_dir
+ else
+ last_failed_movement = movement_dir
return 0
/obj/singularity/proc/check_turfs_in(var/direction = 0, var/step = 0)
@@ -493,3 +509,11 @@
spawn(0)
qdel(src)
return gain
+
+/obj/singularity/can_fall()
+ return FALSE
+
+/obj/singularity/proc/zMove(direction)
+ var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
+ if(destination)
+ forceMove(destination)
\ No newline at end of file