diff --git a/baystation12.dme b/baystation12.dme index e7a8d9fdbe..a8d0e157c5 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1369,9 +1369,11 @@ #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" #include "code\TriDimension\controller.dm" +#include "code\TriDimension\controller_presets.dm" #include "code\TriDimension\Movement.dm" #include "code\TriDimension\Pipes.dm" #include "code\TriDimension\Structures.dm" +#include "code\TriDimension\Structures_presets.dm" #include "code\TriDimension\Turfs.dm" #include "code\WorkInProgress\autopsy.dm" #include "code\WorkInProgress\buildmode.dm" diff --git a/code/TriDimension/Structures.dm b/code/TriDimension/Structures.dm index 942945e684..dd97676115 100644 --- a/code/TriDimension/Structures.dm +++ b/code/TriDimension/Structures.dm @@ -208,6 +208,8 @@ icon_state = "rampbottom" var/obj/multiz/stairs/connected var/turf/target + var/turf/target2 + var/suggest_dir // try this dir first when finding stairs; this is the direction to walk *down* the stairs New() ..() @@ -219,25 +221,16 @@ O.ChangeTurf(/turf/simulated/floor/open) spawn(1) - for(var/dir in cardinal) - var/turf/T = get_step(src.loc,dir) - for(var/obj/multiz/stairs/S in T) - if(S && S.icon_state == "rampbottom" && !S.connected) - S.dir = dir - src.dir = dir - S.connected = src - src.connected = S - src.icon_state = "ramptop" - src.density = 1 - var/turf/controllerlocation = locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up) - var/turf/above = locate(src.x, src.y, controller.up_target) - if(istype(above,/turf/space) || istype(above,/turf/simulated/floor/open)) - src.target = above + var/turf/T + if(suggest_dir) + T = get_step(src.loc,suggest_dir) + find_stair_connection(T, suggest_dir, 1) + if(!target) + for(var/dir in cardinal) + T = get_step(src.loc,dir) + find_stair_connection(T, dir) + if(target) break - if(target) - break Bumped(var/atom/movable/M) if(connected && target && istype(src, /obj/multiz/stairs) && locate(/obj/multiz/stairs) in M.loc) @@ -245,3 +238,40 @@ if(Con == src.connected) //make sure the atom enters from the approriate lower stairs tile M.Move(target) return + + proc/find_stair_connection(var/turf/T, var/dir, var/suggested=0) + for(var/obj/multiz/stairs/S in T) + if(S && S.icon_state == "rampbottom" && !S.connected) + if(!S.suggest_dir || S.suggest_dir == dir) // it doesn't have a suggested direction, or it's the same direction as we're trying, so we connect to it + initialise_stair_connection(src, S, dir) + else if(!suggested) // we're trying directions, so it could be a reverse stair (i.e. we're the bottom stair rather than the top) + var/inv_dir = 0 + switch(dir) + if(1) + inv_dir = 2 + if(2) + inv_dir = 1 + if(4) + inv_dir = 8 + if(8) + inv_dir = 4 + if(S.suggest_dir == inv_dir) + initialise_stair_connection(S, src, inv_dir) + + proc/initialise_stair_connection(var/obj/multiz/stairs/top, var/obj/multiz/stairs/bottom, var/dir) + top.dir = dir + bottom.dir = dir + top.connected = bottom + bottom.connected = top + top.icon_state = "ramptop" + top.density = 1 + var/turf/controllerlocation = locate(1, 1, top.z) + for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) + if(controller.up) + var/turf/above = locate(top.x, top.y, controller.up_target) + if(istype(above,/turf/space) || istype(above,/turf/simulated/floor/open)) + top.target = above + var/turf/above2 = locate(bottom.x, bottom.y, controller.up_target) + if(istype(above2, /turf/space) || istype(above,/turf/simulated/floor/open)) + top.target2 = above2 + return \ No newline at end of file diff --git a/code/TriDimension/Structures_presets.dm b/code/TriDimension/Structures_presets.dm new file mode 100644 index 0000000000..7a28efe211 --- /dev/null +++ b/code/TriDimension/Structures_presets.dm @@ -0,0 +1,11 @@ +/obj/multiz/stairs/north_up + suggest_dir = SOUTH + +/obj/multiz/stairs/south_up + suggest_dir = NORTH + +/obj/multiz/stairs/east_up + suggest_dir = WEST + +/obj/multiz/stairs/west_up + suggest_dir = EAST \ No newline at end of file diff --git a/code/TriDimension/Turfs.dm b/code/TriDimension/Turfs.dm index 385c590092..8992068018 100644 --- a/code/TriDimension/Turfs.dm +++ b/code/TriDimension/Turfs.dm @@ -26,8 +26,14 @@ var/soft = 0 for(var/atom/A in floorbelow.contents) if(A.density) - blocked = 1 - break + if(istype(A, /obj/structure/window)) + var/obj/structure/window/W = A + blocked = W.is_fulltile() + if(blocked) + break + else + blocked = 1 + break if(istype(A, /obj/machinery/atmospherics/pipe/zpipe/up) && istype(AM,/obj/item/pipe)) blocked = 1 break diff --git a/code/TriDimension/controller_presets.dm b/code/TriDimension/controller_presets.dm new file mode 100644 index 0000000000..f775b94e93 --- /dev/null +++ b/code/TriDimension/controller_presets.dm @@ -0,0 +1,37 @@ +/obj/effect/landmark/zcontroller/level_1_bottom + up = 1 + up_target = 2 + +/obj/effect/landmark/zcontroller/level_2_mid + up = 1 + up_target = 3 + down = 1 + down_target = 1 + +/obj/effect/landmark/zcontroller/level_3_mid + up = 1 + up_target = 4 + down = 1 + down_target = 2 + +/obj/effect/landmark/zcontroller/level_4_mid + up = 1 + up_target = 5 + down = 1 + down_target = 3 + +/obj/effect/landmark/zcontroller/level_2_top + down = 1 + down_target = 1 + +/obj/effect/landmark/zcontroller/level_3_top + down = 1 + down_target = 2 + +/obj/effect/landmark/zcontroller/level_4_top + down = 1 + down_target = 3 + +/obj/effect/landmark/zcontroller/level_5_top + down = 1 + down_target = 4 \ No newline at end of file