From 042c9c5994ec23e23017d9ca8883b0f106bfe204 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Sat, 18 Jan 2014 00:08:21 +0100 Subject: [PATCH 01/20] cable and disposals icons for multi-z --- icons/obj/pipes/disposal.dmi | Bin 109261 -> 113668 bytes icons/obj/power_cond_red.dmi | Bin 5227 -> 5900 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/pipes/disposal.dmi b/icons/obj/pipes/disposal.dmi index 709344a678216f59f82d00a17a73e2796f9c5db7..d96b98c8e08ef935827a3c92a956c0d6f9c36d8a 100644 GIT binary patch delta 24892 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 diff --git a/icons/obj/power_cond_red.dmi b/icons/obj/power_cond_red.dmi index 962936479ae2bd02132776639232d65373c55b67..459e99336efe633c3a2864f98ced7043a00e3688 100644 GIT binary patch literal 5900 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 From d1874bec2e4c3f24545ce1ddbe9fbbb0e18c94d2 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:10:39 +0100 Subject: [PATCH 02/20] Update Functions.dm ZAS adjustments --- code/ZAS/Functions.dm | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/code/ZAS/Functions.dm b/code/ZAS/Functions.dm index 3037e13f412..4cefd09b74c 100644 --- a/code/ZAS/Functions.dm +++ b/code/ZAS/Functions.dm @@ -11,6 +11,12 @@ proc/FloodFill(turf/simulated/start) var/list/open = list(start) //The list of tiles which have been evaulated. var/list/closed = list() +/////// Z-Level stuff + //List of all space tiles bordering the zone + var/list/list_space = list() + //List of all Z-Levels of the zone where it borders space + var/list/z_space = list() +/////// Z-Level stuff //Loop through the turfs in the open list in order to find which adjacent turfs should be added to the zone. while(open.len) @@ -67,10 +73,75 @@ proc/FloodFill(turf/simulated/start) //If it cannot connect either to the north or west, connect it! closed += O +/////// Z-Level stuff + if(istype(O,/turf/space)) + if(!(O in list_space)) + list_space += O + if(!(O.z in z_space)) + z_space += O.z + + // handle Z-level connections + var/turf/controlerlocation = locate(1, 1, T.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + // connect upwards + if(controler.up) + var/turf/above_me = locate(T.x, T.y, controler.up_target) + // add the turf above this + if(istype(above_me, /turf/simulated/floor/open) && !(above_me in open) && !(above_me in closed)) + open += above_me + + if(istype(above_me,/turf/space)) + if(!(above_me in list_space)) + list_space += above_me + if(!(above_me.z in z_space)) + z_space += above_me.z + // connect downwards + if(controler.down && istype(T, /turf/simulated/floor/open)) + var/turf/below_me = locate(T.x, T.y, controler.down_target) + // add the turf below this + if(!(below_me in open) && !(below_me in closed)) + open += below_me +/////// Z-Level stuff + //This tile is now evaluated, and can be moved to the list of evaluated tiles. open -= T closed += T +/////// Z-Level stuff + // once the zone is done, check if there is space that needs to be changed to open space + if(!open.len) + var/list/temp = list() + while(list_space.len) + var/turf/S = pick(list_space) + //check if the zone has any space borders below the evaluated space tile + //if there is some, we dont need to make open_space since the zone can vent and the zone above can vent + //through the evaluated tile + //if there is none, the zone can connect upwards to either vent from there or connect with the zone there + //also check if the turf below the space is actually part of this zone to prevent the edge tiles from transforming + var/turf/controlerloc = locate(1, 1, S.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerloc) + if(controler.down) + var/turf/below = locate(S.x, S.y, controler.down_target) + if(!((S.z - 1) in z_space) && below in closed) + open += S.ChangeTurf(/turf/simulated/floor/open) + list_space -= S + else + list_space -= S + temp += S + else + list_space -= S + temp += S + // make sure the turf is removed from the list + list_space -= S + z_space -= z_space + while(temp.len) + var/turf/S = pick(temp) + if(!(S.z in z_space)) + z_space += S.z + list_space += S + temp -= S +/////// Z-Level stuff + return closed From f58487a0e9a944059dfbf303726253f00bb6fe49 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:14:01 +0100 Subject: [PATCH 03/20] Update ZAS_Zones.dm ZAS adjustments --- code/ZAS/ZAS_Zones.dm | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/code/ZAS/ZAS_Zones.dm b/code/ZAS/ZAS_Zones.dm index 1d92062e25d..f6a3327ff23 100644 --- a/code/ZAS/ZAS_Zones.dm +++ b/code/ZAS/ZAS_Zones.dm @@ -151,6 +151,13 @@ var/list/CounterDoorDirections = list(SOUTH,EAST) //Which directions doors turfs air.group_multiplier++ T.zone = src + +///// Z-Level Stuff + // also add the tile below it if its open space + if(istype(T, /turf/simulated/floor/open)) + var/turf/simulated/floor/open/T2 = T + src.AddTurf(T2.floorbelow) +///// Z-Level Stuff else if(!unsimulated_tiles) @@ -773,6 +780,32 @@ zone/proc/Rebuild() if(adjacent_id && (!lowest_id || adjacent_id < lowest_id)) lowest_id = adjacent_id +/////// Z-Level stuff + var/turf/controlerlocation = locate(1, 1, current.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + // upwards + if(controler.up) + var/turf/simulated/adjacent = locate(current.x, current.y, controler.up_target) + + if(adjacent in turfs && istype(adjacent, /turf/simulated/floor/open)) + current_adjacents += adjacent + adjacent_id = turfs[adjacent] + + if(adjacent_id && (!lowest_id || adjacent_id < lowest_id)) + lowest_id = adjacent_id + + // downwards + if(controler.down && istype(current, /turf/simulated/floor/open)) + var/turf/simulated/adjacent = locate(current.x, current.y, controler.down_target) + + if(adjacent in turfs) + current_adjacents += adjacent + adjacent_id = turfs[adjacent] + + if(adjacent_id && (!lowest_id || adjacent_id < lowest_id)) + lowest_id = adjacent_id +/////// Z-Level stuff + if(!lowest_id) lowest_id = current_identifier++ identical_ids += lowest_id From 9d618b2a11361bb3e0617c2abe6253df61957e16 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:16:14 +0100 Subject: [PATCH 04/20] Update lattice.dm allow lattices to exist on open space --- code/game/objects/structures/lattice.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 12ce9e0b5ff..672011cef9b 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -10,7 +10,9 @@ /obj/structure/lattice/New() ..() - if(!(istype(src.loc, /turf/space))) +///// Z-Level Stuff + if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/floor/open))) +///// Z-Level Stuff del(src) for(var/obj/structure/lattice/LAT in src.loc) if(LAT != src) @@ -80,4 +82,4 @@ dir_sum += direction icon_state = "lattice[dir_sum]" - return \ No newline at end of file + return From cfcb3e65cd9d6c1bf559f31b78b468b55e8c629d Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:19:08 +0100 Subject: [PATCH 05/20] Update cable.dm cable construction --- code/modules/power/cable.dm | 107 +++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 21 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index bbcbdb9c9d9..36289dabaac 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -28,7 +28,6 @@ /obj/structure/cable/New() ..() - // ensure d1 & d2 reflect the icon_state for entering and exiting cable var/dash = findtext(icon_state, "-") @@ -37,6 +36,7 @@ d2 = text2num( copytext( icon_state, dash+1 ) ) + var/turf/T = src.loc // hide if turf is not intact if(level==1) hide(T.intact) @@ -78,6 +78,12 @@ if(istype(W, /obj/item/weapon/wirecutters)) +///// Z-Level Stuff + if(src.d1 == 12 || src.d2 == 12) + user << "\red You must cut this cable from above." + return +///// Z-Level Stuff + // if(power_switch) // user << "\red This piece of cable is tied to a power switch. Flip the switch to remove it." // return @@ -93,6 +99,17 @@ for(var/mob/O in viewers(src, null)) O.show_message("\red [user] cuts the cable.", 1) +///// Z-Level Stuff + if(src.d1 == 11 || src.d2 == 11) + var/turf/controlerlocation = locate(1, 1, z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.down) + var/turf/below = locate(src.x, src.y, controler.down_target) + for(var/obj/structure/cable/c in below) + if(c.d1 == 12 || c.d2 == 12) + c.Del() +///// Z-Level Stuff + del(src) return // not needed, but for clarity @@ -287,33 +304,75 @@ else dirn = get_dir(F, user) - for(var/obj/structure/cable/LC in F) - if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) - user << "There's already a cable at that position." - return +///// Z-Level Stuff + // check if the target is open space + if(istype(F, /turf/simulated/floor/open)) + for(var/obj/structure/cable/LC in F) + if((LC.d1 == dirn && LC.d2 == 11 ) || ( LC.d2 == dirn && LC.d1 == 11)) + user << "There's already a cable at that position." + return - var/obj/structure/cable/C = new(F) + var/turf/simulated/floor/open/temp = F + var/obj/structure/cable/C = new(F) + var/obj/structure/cable/D = new(temp.floorbelow) - C.cableColor(item_color) + C.cableColor("red") - C.d1 = 0 - C.d2 = dirn - C.add_fingerprint(user) - C.updateicon() + C.d1 = 11 + C.d2 = dirn + C.add_fingerprint(user) + C.updateicon() - C.powernet = new() - powernets += C.powernet - C.powernet.cables += C + C.powernet = new() + powernets += C.powernet + C.powernet.cables += C - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() + C.mergeConnectedNetworks(C.d2) + C.mergeConnectedNetworksOnTurf() + + D.cableColor("red") + + D.d1 = 12 + D.d2 = 0 + D.add_fingerprint(user) + D.updateicon() + + D.powernet = C.powernet + D.powernet.cables += D + + D.mergeConnectedNetworksOnTurf() + + // do the normal stuff + else +///// Z-Level Stuff + + for(var/obj/structure/cable/LC in F) + if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0)) + user << "There's already a cable at that position." + return + + var/obj/structure/cable/C = new(F) + + C.cableColor(item_color) + + C.d1 = 0 + C.d2 = dirn + C.add_fingerprint(user) + C.updateicon() + + C.powernet = new() + powernets += C.powernet + C.powernet.cables += C + + C.mergeConnectedNetworks(C.d2) + C.mergeConnectedNetworksOnTurf() - use(1) - if (C.shock(user, 50)) - if (prob(50)) //fail - new/obj/item/weapon/cable_coil(C.loc, 1, C.cable_color) - del(C) + use(1) + if (C.shock(user, 50)) + if (prob(50)) //fail + new/obj/item/weapon/cable_coil(C.loc, 1, C.cable_color) + del(C) //src.laying = 1 //last = C @@ -328,6 +387,12 @@ var/turf/T = C.loc +///// Z-Level Stuff + if(C.d1 == 12 || C.d2 == 12) + turf_place(T,user) + return +///// Z-Level Stuff + if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable return From 4bccee98ba880807ed34f7807b9fc731600b8097 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:20:22 +0100 Subject: [PATCH 06/20] Update power.dm powernet connection for z-levels --- code/modules/power/power.dm | 53 ++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 986f81d6c84..3e1a8fce269 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -112,7 +112,17 @@ // if unmarked==1, only return those with no powernet /proc/power_list(var/turf/T, var/source, var/d, var/unmarked=0) . = list() - var/fdir = (!d)? 0 : turn(d, 180) // the opposite direction to d (or 0 if d==0) + var/fdir = (!d)? 0 : turn(d, 180) + // the opposite direction to d (or 0 if d==0) +///// Z-Level Stuff + var/Zdir + if(d==11) + Zdir = 11 + else if (d==12) + Zdir = 12 + else + Zdir = 999 +///// Z-Level Stuff // world.log << "d=[d] fdir=[fdir]" for(var/AM in T) if(AM == source) continue //we don't want to return source @@ -129,7 +139,9 @@ var/obj/structure/cable/C = AM if(!unmarked || !C.powernet) - if(C.d1 == fdir || C.d2 == fdir) +///// Z-Level Stuff + if(C.d1 == fdir || C.d2 == fdir || C.d1 == Zdir || C.d2 == Zdir) +///// Z-Level Stuff . += C else if(C.d1 == turn(C.d2, 180)) . += C @@ -140,11 +152,40 @@ . = list() // this will be a list of all connected power objects var/turf/T = loc - if(d1) T = get_step(src, d1) - if(T) . += power_list(T, src, d1, 1) +///// Z-Level Stuff + if(d1) + if(d1 <= 10) + T = get_step(src, d1) + if(T) + . += power_list(T, src, d1, 1) + else if (d1 == 11 || d1 == 12) + var/turf/controlerlocation = locate(1, 1, z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.up && d1 == 12) + T = locate(src.x, src.y, controler.up_target) + if(T) + . += power_list(T, src, 11, 1) + if(controler.down && d1 == 11) + T = locate(src.x, src.y, controler.down_target) + if(T) + . += power_list(T, src, 12, 1) - T = get_step(src, d2) - if(T) . += power_list(T, src, d2, 1) + if(d2 == 11 || d2 == 12) + var/turf/controlerlocation = locate(1, 1, z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.up && d2 == 12) + T = locate(src.x, src.y, controler.up_target) + if(T) + . += power_list(T, src, 11, 1) + if(controler.down && d2 == 11) + T = locate(src.x, src.y, controler.down_target) + if(T) + . += power_list(T, src, 12, 1) + else + T = get_step(src, d2) + if(T) + . += power_list(T, src, d2, 1) +///// Z-Level Stuff return . From ca2de46bc824dbdf89ca5b86d60e58196c8a93ee Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:28:20 +0100 Subject: [PATCH 07/20] Update turf.dm preventing space being made and immediately changed to open space --- code/game/turfs/turf.dm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3a4c6b40b4c..85108e8688f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -200,6 +200,20 @@ if (!N) return +///// Z-Level Stuff ///// This makes sure that turfs are not changed to space when one side is part of a zone + if(N == /turf/space) + var/turf/controler = locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/c in controler) + if(c.down) + var/turf/below = locate(src.x, src.y, c.down_target) + if((below.zone || zone) && !istype(below, /turf/space)) // dont make open space into space, its pointless and makes people drop out of the station + var/turf/W = src.ChangeTurf(/turf/simulated/floor/open) + var/list/temp = list() + temp += W + c.add(temp,3,1) // report the new open space to the zcontroler + return W +///// Z-Level Stuff + var/old_lumcount = lighting_lumcount - initial(lighting_lumcount) if(ispath(N, /turf/simulated/floor)) @@ -337,4 +351,4 @@ if(!t.density) if(!LinkBlocked(src, t) && !TurfBlockedNonWindow(t)) L.Add(t) - return L \ No newline at end of file + return L From f653216cde52a2f266ae3d8b8bf3664ca480045f Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:29:18 +0100 Subject: [PATCH 08/20] Update construction.dm dispensing new pipes --- code/game/machinery/pipe/construction.dm | 64 ++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 1babba054e6..75049fb9095 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -23,6 +23,10 @@ Buildable meters #define PIPE_MTVALVE 18 #define PIPE_MANIFOLD4W 19 #define PIPE_CAP 20 +///// Z-Level stuff +#define PIPE_UP 21 +#define PIPE_DOWN 22 +///// Z-Level stuff /obj/item/pipe name = "pipe" @@ -84,6 +88,12 @@ Buildable meters src.pipe_type = PIPE_MANIFOLD4W else if(istype(make_from, /obj/machinery/atmospherics/pipe/cap)) src.pipe_type = PIPE_CAP +///// Z-Level stuff + else if(istype(make_from, /obj/machinery/atmospherics/pipe/up)) + src.pipe_type = PIPE_UP + else if(istype(make_from, /obj/machinery/atmospherics/pipe/down)) + src.pipe_type = PIPE_DOWN +///// Z-Level stuff else src.pipe_type = pipe_type src.dir = dir @@ -117,6 +127,10 @@ Buildable meters "t-valve", \ "4-way manifold", \ "pipe cap", \ +///// Z-Level stuff + "pipe up", \ + "pipe down", \ +///// Z-Level stuff ) name = nlist[pipe_type+1] + " fitting" var/list/islist = list( \ @@ -141,6 +155,10 @@ Buildable meters "mtvalve", \ "manifold4w", \ "cap", \ +///// Z-Level stuff + "cap", \ + "cap", \ +///// Z-Level stuff ) icon_state = islist[pipe_type + 1] @@ -213,6 +231,10 @@ Buildable meters return dir|flip|cw if(PIPE_CAP) return flip +///// Z-Level stuff + if(PIPE_UP,PIPE_DOWN) + return dir +///// Z-Level stuff return 0 /obj/item/pipe/proc/get_pdir() //endpoints for regular pipes @@ -348,7 +370,7 @@ Buildable meters if (M.node3) M.node3.initialize() M.node3.build_network() - + if(PIPE_MANIFOLD4W) //4-way manifold var/obj/machinery/atmospherics/pipe/manifold4w/M = new( src.loc ) M.dir = dir @@ -515,7 +537,7 @@ Buildable meters if (P.node2) P.node2.initialize() P.node2.build_network() - + if(PIPE_MTVALVE) //manual t-valve var/obj/machinery/atmospherics/tvalve/V = new(src.loc) V.dir = dir @@ -535,7 +557,7 @@ Buildable meters if (V.node3) V.node3.initialize() V.node3.build_network() - + if(PIPE_CAP) var/obj/machinery/atmospherics/pipe/cap/C = new(src.loc) C.dir = dir @@ -593,6 +615,40 @@ Buildable meters if (C.node) C.node.initialize() C.node.build_network() +///// Z-Level stuff + if(PIPE_UP) //volume pump + var/obj/machinery/atmospherics/pipe/up/P = new(src.loc) + P.dir = dir + P.initialize_directions = pipe_dir + if (pipename) + P.name = pipename + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() + if(PIPE_DOWN) //volume pump + var/obj/machinery/atmospherics/pipe/down/P = new(src.loc) + P.dir = dir + P.initialize_directions = pipe_dir + if (pipename) + P.name = pipename + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() +///// Z-Level stuff playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user.visible_message( \ @@ -649,4 +705,4 @@ Buildable meters #undef PIPE_VOLUME_PUMP #undef PIPE_OUTLET_INJECT #undef PIPE_MTVALVE -//#undef PIPE_MANIFOLD4W \ No newline at end of file +//#undef PIPE_MANIFOLD4W From 8592fdb9534b034e5079a2eaffb7f6cdf22be948 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:30:06 +0100 Subject: [PATCH 09/20] Update pipe_dispenser.dm dispensing new pipes --- code/game/machinery/pipe/pipe_dispenser.dm | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index e883d4d07d1..bf6233f4d47 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -13,6 +13,7 @@ /obj/machinery/pipedispenser/attack_hand(user as mob) if(..()) return +///// Z-Level stuff var/dat = {" Regular pipes:
Pipe
@@ -22,6 +23,8 @@ Pipe Cap
4-Way Manifold
Manual T-Valve
+upward Pipe
+downward Pipe
Devices:
Connector
Unary Vent
@@ -42,6 +45,7 @@ Bent Pipe
"} +///// Z-Level stuff //What number the make points to is in the define # at the top of construction.dm in same folder user << browse("[src][dat]", "window=pipedispenser") @@ -143,6 +147,7 @@ Nah if(..()) return +///// Z-Level stuff var/dat = {"Disposal Pipes

Pipe
Bent Pipe
@@ -152,7 +157,10 @@ Nah Bin
Outlet
Chute
+Upwards
+Downwards
"} +///// Z-Level stuff user << browse("[src][dat]", "window=pipedispenser") return @@ -192,6 +200,12 @@ Nah if(7) C.ptype = 8 C.density = 1 +///// Z-Level stuff + if(21) + C.ptype = 11 + if(22) + C.ptype = 12 +///// Z-Level stuff C.add_fingerprint(usr) C.update() wait = 1 @@ -203,7 +217,7 @@ Nah /obj/machinery/pipedispenser/orderable anchored = 0 unwrenched = 1 - + /obj/machinery/pipedispenser/disposal/orderable anchored = 0 - unwrenched = 1 \ No newline at end of file + unwrenched = 1 From f3240073dc2d310bf7a8b0fa7da75d9f7ecfd7cf Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:31:27 +0100 Subject: [PATCH 10/20] Update disposal.dm new disposal pipes --- code/modules/recycling/disposal.dm | 113 ++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 04eff0de6ea..ca72fdc32fb 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -873,6 +873,12 @@ C.ptype = 9 if("pipe-j2s") C.ptype = 10 +///// Z-Level stuff + if("pipe-u") + C.ptype = 11 + if("pipe-d") + C.ptype = 12 +///// Z-Level stuff src.transfer_fingerprints_to(C) C.dir = dir C.density = 0 @@ -900,8 +906,113 @@ update() return +///// Z-Level stuff +/obj/structure/disposalpipe/up + icon_state = "pipe-u" + New() + ..() + dpdir = dir + update() + return + nextdir(var/fromdir) + var/nextdir + if(fromdir == 11) + nextdir = dir + else + nextdir = 12 + return nextdir + + transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir) + H.dir = nextdir + + var/turf/T + var/obj/structure/disposalpipe/P + + if(nextdir == 12) + var/turf/controlerlocation = locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.up) + T = locate(src.x, src.y, controler.up_target) + if(!T) + H.loc = src.loc + return + else + for(var/obj/structure/disposalpipe/down/F in T) + P = F + + else + T = get_step(src.loc, H.dir) + P = H.findpipe(T) + + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) + + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null + + return P + +/obj/structure/disposalpipe/down + icon_state = "pipe-d" + + New() + ..() + dpdir = dir + update() + return + + nextdir(var/fromdir) + var/nextdir + if(fromdir == 12) + nextdir = dir + else + nextdir = 11 + return nextdir + + transfer(var/obj/structure/disposalholder/H) + var/nextdir = nextdir(H.dir) + H.dir = nextdir + + var/turf/T + var/obj/structure/disposalpipe/P + + if(nextdir == 11) + var/turf/controlerlocation = locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.down) + T = locate(src.x, src.y, controler.down_target) + if(!T) + H.loc = src.loc + return + else + for(var/obj/structure/disposalpipe/up/F in T) + P = F + + else + T = get_step(src.loc, H.dir) + P = H.findpipe(T) + + if(P) + // find other holder in next loc, if inactive merge it with current + var/obj/structure/disposalholder/H2 = locate() in P + if(H2 && !H2.active) + H.merge(H2) + + H.loc = P + else // if wasn't a pipe, then set loc to turf + H.loc = T + return null + + return P +///// Z-Level stuff //a three-way junction with dir being the dominant direction /obj/structure/disposalpipe/junction @@ -1325,7 +1436,7 @@ src.streak(dirs) -/obj/effect/decal/cleanable/blood/gibs/robot/pipe_eject(var/direction) +/obj/effect/decal/cleanable/robot_debris/gib/pipe_eject(var/direction) var/list/dirs if(direction) dirs = list( direction, turn(direction, -45), turn(direction, 45)) From 38794771516918fed4636238818204ac3cec01c6 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:32:06 +0100 Subject: [PATCH 11/20] Update disposal-construction.dm new pipe construction --- .../modules/recycling/disposal-construction.dm | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 9bf34ff6c02..d6e30c6656b 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -65,9 +65,19 @@ if(10) base_state = "pipe-j2s" dpdir = dir | left | flip +///// Z-Level stuff + if(11) + base_state = "pipe-u" + dpdir = dir + if(12) + base_state = "pipe-d" + dpdir = dir +///// Z-Level stuff - if(ptype<6 || ptype>8) +///// Z-Level stuff + if(ptype<6 || ptype>8 && !(ptype==11 || ptype==12)) +///// Z-Level stuff icon_state = "con[base_state]" else icon_state = base_state @@ -139,6 +149,12 @@ return /obj/machinery/disposal/deliveryChute if(9,10) return /obj/structure/disposalpipe/sortjunction +///// Z-Level stuff + if(11) + return /obj/structure/disposalpipe/up + if(12) + return /obj/structure/disposalpipe/down +///// Z-Level stuff return From bbe01a80e64a657d6766f554a7b71720cc433584 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:33:41 +0100 Subject: [PATCH 12/20] Update explosion.dm transfer explosions accross z-levels --- code/game/objects/explosion.dm | 45 +++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 5ba97f90053..be5ff1ef428 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -6,21 +6,9 @@ if(dx>=dy) return dx + (0.5*dy) //The longest side add half the shortest side approximates the hypotenuse else return dy + (0.5*dx) - -proc/trange(var/Dist=0,var/turf/Center=null)//alternative to range (ONLY processes turfs and thus less intensive) - if(Center==null) return - - //var/x1=((Center.x-Dist)<1 ? 1 : Center.x-Dist) - //var/y1=((Center.y-Dist)<1 ? 1 : Center.y-Dist) - //var/x2=((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist) - //var/y2=((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist) - - var/turf/x1y1 = locate(((Center.x-Dist)<1 ? 1 : Center.x-Dist),((Center.y-Dist)<1 ? 1 : Center.y-Dist),Center.z) - var/turf/x2y2 = locate(((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist),((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist),Center.z) - return block(x1y1,x2y2) - - -proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1) +///// Z-Level Stuff +proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, z_transfer = 1) +///// Z-Level Stuff src = null //so we don't abort once src is deleted spawn(0) if(config.use_recursive_explosions) @@ -28,6 +16,12 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa explosion_rec(epicenter, power) return +///// Z-Level Stuff + if(z_transfer && (devastation_range > 0 || heavy_impact_range > 0)) + //transfer the explosion in both directions + explosion_z_transfer(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range) +///// Z-Level Stuff + var/start = world.timeofday epicenter = get_turf(epicenter) if(!epicenter) return @@ -61,7 +55,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa var/y0 = epicenter.y var/z0 = epicenter.z - for(var/turf/T in trange(max(devastation_range, heavy_impact_range, light_impact_range), epicenter)) + for(var/turf/T in range(epicenter, max(devastation_range, heavy_impact_range, light_impact_range))) var/dist = cheap_pythag(T.x - x0,T.y - y0) if(dist < devastation_range) dist = 1 @@ -98,4 +92,21 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa proc/secondaryexplosion(turf/epicenter, range) for(var/turf/tile in range(range, epicenter)) - tile.ex_act(2) \ No newline at end of file + tile.ex_act(2) + +///// Z-Level Stuff +proc/explosion_z_transfer(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, up = 1, down = 1) + var/turf/controlerlocation = locate(1, 1, epicenter.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.down) + //start the child explosion, no admin log and no additional transfers + explosion(locate(epicenter.x, epicenter.y, controler.down_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 0, 0) + if(devastation_range - 2 > 0 || heavy_impact_range - 2 > 0) //only transfer further if the explosion is still big enough + explosion(locate(epicenter.x, epicenter.y, controler.down_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 0, 1) + + if(controler.up) + //start the child explosion, no admin log and no additional transfers + explosion(locate(epicenter.x, epicenter.y, controler.up_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 0, 0) + if(devastation_range - 2 > 0 || heavy_impact_range - 2 > 0) //only transfer further if the explosion is still big enough + explosion(locate(epicenter.x, epicenter.y, controler.up_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 1, 0) +///// Z-Level Stuff From d106e70b028a568c413301b91fa7368aa1ecf1b0 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:35:36 +0100 Subject: [PATCH 13/20] Create controler.dm z-level controler --- code/TriDimension/controler.dm | 263 +++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 code/TriDimension/controler.dm diff --git a/code/TriDimension/controler.dm b/code/TriDimension/controler.dm new file mode 100644 index 00000000000..59915797385 --- /dev/null +++ b/code/TriDimension/controler.dm @@ -0,0 +1,263 @@ +/obj/effect/landmark/zcontroler + name = "Z-Level Controler" + var/initialized = 0 // when set to 1, turfs will report to the controler + var/up = 0 // 1 allows up movement + var/up_target = 0 // the Z-level that is above the current one + var/down = 0 // 1 allows down movement + var/down_target = 0 // the Z-level that is below the current one + + var/list/slow = list() + var/list/normal = list() + var/list/fast = list() + + var/slow_time + var/normal_time + var/fast_time + +/obj/effect/landmark/zcontroler/New() + ..() + for (var/turf/T in world) + if (T.z == z) + fast += T + slow_time = world.time + 3000 + normal_time = world.time + 600 + fast_time = world.time + 10 + + processing_objects.Add(src) + + initialized = 1 + return 1 + +/obj/effect/landmark/zcontroler/Del() + processing_objects.Remove(src) + return + +/obj/effect/landmark/zcontroler/process() + if (world.time > fast_time) + calc(fast) + fast_time = world.time + 10 + + if (world.time > normal_time) + calc(normal) + normal_time = world.time + 600 + +/* if (world.time > slow_time) + calc(slow) + slow_time = world.time + 3000 */ + return + +/obj/effect/landmark/zcontroler/proc/add(var/list/L, var/I, var/transfer) + while (L.len) + var/turf/T = pick(L) + + L -= T + slow -= T + normal -= T + fast -= T + + if(!T || !istype(T, /turf)) + continue + + switch (I) + if(1) slow += T + if(2) normal += T + if(3) fast += T + + if(transfer > 0) + if(up) + var/turf/controler_up = locate(1, 1, up_target) + for(var/obj/effect/landmark/zcontroler/c_up in controler_up) + var/list/temp = list() + temp += locate(T.x, T.y, up_target) + c_up.add(temp, I, transfer-1) + + if(down) + var/turf/controler_down = locate(1, 1, down_target) + for(var/obj/effect/landmark/zcontroler/c_down in controler_down) + var/list/temp = list() + temp += locate(T.x, T.y, down_target) + c_down.add(temp, I, transfer-1) + return + +/turf + var/list/z_overlays = list() + +/turf/New() + ..() + + var/turf/controler = locate(1, 1, z) + for(var/obj/effect/landmark/zcontroler/c in controler) + if(c.initialized) + var/list/turf = list() + turf += src + c.add(turf,3,1) + +/turf/space/New() + ..() + + var/turf/controler = locate(1, 1, z) + for(var/obj/effect/landmark/zcontroler/c in controler) + if(c.initialized) + var/list/turf = list() + turf += src + c.add(turf,3,1) + +atom/movable/Move() //Hackish + . = ..() + + var/turf/controlerlocation = locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.up || controler.down) + var/list/temp = list() + temp += locate(src.x, src.y, src.z) + controler.add(temp,3,1) + +/obj/effect/landmark/zcontroler/proc/calc(var/list/L) + var/list/slowholder = list() + var/list/normalholder = list() + var/list/fastholder = list() + var/new_list + + while(L.len) + var/turf/T = pick(L) + new_list = 0 + + if(!T || !istype(T, /turf)) + L -= T + continue + + T.overlays -= T.z_overlays + T.z_overlays -= T.z_overlays + + if(down && (istype(T, /turf/space) || istype(T, /turf/simulated/floor/open))) + var/turf/below = locate(T.x, T.y, down_target) + if(below) + if(!(istype(below, /turf/space) || istype(below, /turf/simulated/floor/open))) + var/image/t_img = list() + new_list = 1 + + var/image/temp = image(below, dir=below.dir, layer = TURF_LAYER + 0.04) + + temp.color = rgb(127,127,127) + temp.overlays += below.overlays + t_img += temp + T.overlays += t_img + T.z_overlays += t_img + + // get objects + var/image/o_img = list() + for(var/obj/o in below) + // ingore objects that have any form of invisibility + if(o.invisibility) continue + new_list = 2 + var/image/temp2 = image(o, dir=o.dir, layer = TURF_LAYER+0.05*o.layer) + temp2.color = rgb(127,127,127) + temp2.overlays += o.overlays + o_img += temp2 + // you need to add a list to .overlays or it will not display any because space + T.overlays += o_img + T.z_overlays += o_img + + // get mobs + var/image/m_img = list() + for(var/mob/m in below) + // ingore mobs that have any form of invisibility + if(m.invisibility) continue + // only add this tile to fastprocessing if there is a living mob, not a dead one + if(istype(m, /mob/living)) new_list = 3 + var/image/temp2 = image(m, dir=m.dir, layer = TURF_LAYER+0.05*m.layer) + temp2.color = rgb(127,127,127) + temp2.overlays += m.overlays + m_img += temp2 + // you need to add a list to .overlays or it will not display any because space + T.overlays += m_img + T.z_overlays += m_img + + T.overlays -= below.z_overlays + T.z_overlays -= below.z_overlays + + // this is sadly impossible to use right now + // the overlay is always opaque to mouseclicks and thus prevents interactions with everything except the turf + /*if(up) + var/turf/above = locate(T.x, T.y, up_target) + if(above) + var/eligeable = 0 + for(var/d in cardinal) + var/turf/mT = get_step(above,d) + if(istype(mT, /turf/space) || istype(mT, /turf/simulated/floor/open)) + eligeable = 1 + /*if(mT.opacity == 0) + for(var/f in cardinal) + var/turf/nT = get_step(mT,f) + if(istype(nT, /turf/space) || istype(nT, /turf/simulated/floor/open)) + eligeable = 1*/ + if(istype(above, /turf/space) || istype(above, /turf/simulated/floor/open)) eligeable = 1 + if(eligeable == 1) + if(!(istype(above, /turf/space) || istype(above, /turf/simulated/floor/open))) + var/image/t_img = list() + if(new_list < 1) new_list = 1 + + above.overlays -= above.z_overlays + var/image/temp = image(above, dir=above.dir, layer = 5 + 0.04) + above.overlays += above.z_overlays + + temp.alpha = 100 + temp.overlays += above.overlays + temp.overlays -= above.z_overlays + t_img += temp + T.overlays += t_img + T.z_overlays += t_img + + // get objects + var/image/o_img = list() + for(var/obj/o in above) + // ingore objects that have any form of invisibility + if(o.invisibility) continue + if(new_list < 2) new_list = 2 + var/image/temp2 = image(o, dir=o.dir, layer = 5+0.05*o.layer) + temp2.alpha = 100 + temp2.overlays += o.overlays + o_img += temp2 + // you need to add a list to .overlays or it will not display any because space + T.overlays += o_img + T.z_overlays += o_img + + // get mobs + var/image/m_img = list() + for(var/mob/m in above) + // ingore mobs that have any form of invisibility + if(m.invisibility) continue + // only add this tile to fastprocessing if there is a living mob, not a dead one + if(istype(m, /mob/living) && new_list < 3) new_list = 3 + var/image/temp2 = image(m, dir=m.dir, layer = 5+0.05*m.layer) + temp2.alpha = 100 + temp2.overlays += m.overlays + m_img += temp2 + // you need to add a list to .overlays or it will not display any because space + T.overlays += m_img + T.z_overlays += m_img + + T.overlays -= above.z_overlays + T.z_overlays -= above.z_overlays*/ + + L -= T + + if(new_list == 1) + slowholder += T + if(new_list == 2) + normalholder += T + if(new_list == 3) + fastholder += T + for(var/d in cardinal) + var/turf/mT = get_step(T,d) + if(!(mT in fastholder)) + fastholder += mT + for(var/f in cardinal) + var/turf/nT = get_step(mT,f) + if(!(nT in fastholder)) + fastholder += nT + + add(slowholder,1, 0) + add(normalholder, 2, 0) + add(fastholder, 3, 0) + return From b7c502152c97f3750cf02d7adf4ba9c1239711ce Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:36:14 +0100 Subject: [PATCH 14/20] Update Movement.dm jetpack movement --- code/TriDimension/Movement.dm | 95 ++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/code/TriDimension/Movement.dm b/code/TriDimension/Movement.dm index dfb529df5b1..c8cc6cba1ce 100644 --- a/code/TriDimension/Movement.dm +++ b/code/TriDimension/Movement.dm @@ -1,49 +1,52 @@ -var/maxZ = 6 -var/minZ = 2 - -// Maybe it's best to have this hardcoded for whatever we'd add to the map, in order to avoid exploits -// (such as mining base => admin station) -// Note that this assumes the ship's top is at z=1 and bottom at z=4 -/obj/item/weapon/tank/jetpack/proc/move_z(cardinal, mob/user as mob) - if (user.z > 1) - user << "\red There is nothing of interest in that direction." - return - if(allow_thrust(0.01, user)) - switch(cardinal) - if (UP) // Going up! - if(user.z > maxZ) // If we aren't at the very top of the ship - var/turf/T = locate(user.x, user.y, user.z - 1) - // You can only jetpack up if there's space above, and you're sitting on either hull (on the exterior), or space - //if(T && istype(T, /turf/space) && (istype(user.loc, /turf/space) || istype(user.loc, /turf/space/*/hull*/))) - //check through turf contents to make sure there's nothing blocking the way - if(T && istype(T, /turf/space)) - var/blocked = 0 - for(var/atom/A in T.contents) - if(T.density) - blocked = 1 - user << "\red You bump into [T.name]." - break - if(!blocked) - user.Move(T) - else - user << "\red You bump into the ship's plating." +/obj/item/weapon/tank/jetpack/verb/moveup() + set name = "Move Upwards" + set category = "Object" + if(allow_thrust(0.01, usr)) + var/turf/controlerlocation = locate(1, 1, usr.z) + var/legal = 0 + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + legal = controler.up + if (controler.up) + var/turf/T = locate(usr.x, usr.y, controler.up_target) + if(T && (istype(T, /turf/space) || istype(T, /turf/simulated/floor/open))) + var/blocked = 0 + for(var/atom/A in T.contents) + if(A.density) + blocked = 1 + usr << "\red You bump into [A.name]." + break + if(!blocked) + usr.Move(T) + usr << "You move upwards." else - user << "\red The ship's gravity well keeps you in orbit!" // Assuming the ship starts on z level 1, you don't want to go past it + usr << "\red There is something in your way." + if (legal == 0) + usr << "There is nothing of interest in this direction." + return 1 - if (DOWN) // Going down! - if (user.z < 1) // If we aren't at the very bottom of the ship, or out in space - var/turf/T = locate(user.x, user.y, user.z + 1) - // You can only jetpack down if you're sitting on space and there's space down below, or hull - if(T && (istype(T, /turf/space) || istype(T, /turf/space/*/hull*/)) && istype(user.loc, /turf/space)) - var/blocked = 0 - for(var/atom/A in T.contents) - if(T.density) - blocked = 1 - user << "\red You bump into [T.name]." - break - if(!blocked) - user.Move(T) - else - user << "\red You bump into the ship's plating." +/obj/item/weapon/tank/jetpack/verb/movedown() + set name = "Move Downwards" + set category = "Object" + if(allow_thrust(0.01, usr)) + var/turf/controlerlocation = locate(1, 1, usr.z) + var/legal = 0 + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + legal = controler.down + if (controler.down == 1) + var/turf/T = locate(usr.x, usr.y, controler.down_target) + var/turf/S = locate(usr.x, usr.y, usr.z) + if(T && (istype(S, /turf/space) || istype(S, /turf/simulated/floor/open))) + var/blocked = 0 + for(var/atom/A in T.contents) + if(A.density) + blocked = 1 + usr << "\red You bump into [A.name]." + break + if(!blocked) + usr.Move(T) + usr << "You move downwards." else - user << "\red The ship's gravity well keeps you in orbit!" \ No newline at end of file + usr << "\red You cant move through the floor." + if (legal == 0) + usr << "There is nothing of interest in this direction." + return 1 From e9838702ff4aa500ff4ad09b8e7928b6719031d9 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:36:46 +0100 Subject: [PATCH 15/20] Update Pipes.dm add up and down pipe --- code/TriDimension/Pipes.dm | 329 +++++++++++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) diff --git a/code/TriDimension/Pipes.dm b/code/TriDimension/Pipes.dm index e69de29bb2d..16768b69119 100644 --- a/code/TriDimension/Pipes.dm +++ b/code/TriDimension/Pipes.dm @@ -0,0 +1,329 @@ +///////////////////////// +// the elusive up pipe // +///////////////////////// +obj/machinery/atmospherics/pipe/up + icon = 'code/TriDimension/multiz_pipe.dmi' + icon_state = "up" + + name = "upwards pipe" + desc = "A pipe segment to connect upwards." + + volume = 70 + + dir = SOUTH + initialize_directions = SOUTH + + var/obj/machinery/atmospherics/node1 //connection on the same Z + var/obj/machinery/atmospherics/node2 //connection on the other Z + + var/minimum_temperature_difference = 300 + var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No + + var/maximum_pressure = 70*ONE_ATMOSPHERE + var/fatigue_pressure = 55*ONE_ATMOSPHERE + alert_pressure = 55*ONE_ATMOSPHERE + + + level = 1 + +obj/machinery/atmospherics/pipe/up/New() + ..() + switch(dir) + if(SOUTH) + initialize_directions = SOUTH + if(NORTH) + initialize_directions = NORTH + if(WEST) + initialize_directions = WEST + if(EAST) + initialize_directions = EAST + if(NORTHEAST) + initialize_directions = NORTH + if(NORTHWEST) + initialize_directions = WEST + if(SOUTHEAST) + initialize_directions = EAST + if(SOUTHWEST) + initialize_directions = SOUTH + initialize() + + +obj/machinery/atmospherics/pipe/up/hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() + +obj/machinery/atmospherics/pipe/up/process() + if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle + ..() + else + . = PROCESS_KILL + +obj/machinery/atmospherics/pipe/up/check_pressure(pressure) + var/datum/gas_mixture/environment = loc.return_air() + + var/pressure_difference = pressure - environment.return_pressure() + + if(pressure_difference > maximum_pressure) + burst() + + else if(pressure_difference > fatigue_pressure) + //TODO: leak to turf, doing pfshhhhh + if(prob(5)) + burst() + + else return 1 + +obj/machinery/atmospherics/pipe/up/proc/burst() + src.visible_message("\red \bold [src] bursts!"); + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + var/datum/effect/effect/system/smoke_spread/smoke = new + smoke.set_up(1,0, src.loc, 0) + smoke.start() + del(src) + +obj/machinery/atmospherics/pipe/up/proc/normalize_dir() + if(dir==3) + dir = 1 + else if(dir==12) + dir = 4 + +obj/machinery/atmospherics/pipe/up/Del() + if(node1) + node1.disconnect(src) + if(node2) + node2.disconnect(src) + ..() + +obj/machinery/atmospherics/pipe/up/pipeline_expansion() + return list(node1, node2) + +obj/machinery/atmospherics/pipe/up/update_icon() +/* if(node1&&node2) + var/C = "" + icon_state = "intact[C][invisibility ? "-f" : "" ]" + + //var/node1_direction = get_dir(src, node1) + //var/node2_direction = get_dir(src, node2) + + //dir = node1_direction|node2_direction + + else + if(!node1&&!node2) + world << "up-pipe deleted by update_icon()" + del(src) //TODO: silent deleting looks weird + var/have_node1 = node1?1:0 + var/have_node2 = node2?1:0 + icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"*/ + + +obj/machinery/atmospherics/pipe/up/initialize() + normalize_dir() + var/node1_dir + + for(var/direction in cardinal) + if(direction&initialize_directions) + if (!node1_dir) + node1_dir = direction + + for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + + var/turf/controlerlocation = locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.up) + var/turf/above = locate(src.x, src.y, controler.up_target) + if(above) + for(var/obj/machinery/atmospherics/target in above) + if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/down)) + node2 = target + break + + + var/turf/T = src.loc // hide if turf is not intact + hide(T.intact) + update_icon() + //update_icon() + +obj/machinery/atmospherics/pipe/up/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null + + if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + del(parent) + node2 = null + + update_icon() + + return null + + +/////////////////////// +// and the down pipe // +/////////////////////// + +obj/machinery/atmospherics/pipe/down + icon = 'code/TriDimension/multiz_pipe.dmi' + icon_state = "down" + + name = "downwards pipe" + desc = "A pipe segment to connect downwards." + + volume = 70 + + dir = SOUTH + initialize_directions = SOUTH + + var/obj/machinery/atmospherics/node1 //connection on the same Z + var/obj/machinery/atmospherics/node2 //connection on the other Z + + var/minimum_temperature_difference = 300 + var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No + + var/maximum_pressure = 70*ONE_ATMOSPHERE + var/fatigue_pressure = 55*ONE_ATMOSPHERE + alert_pressure = 55*ONE_ATMOSPHERE + + + level = 1 + +obj/machinery/atmospherics/pipe/down/New() + ..() + switch(dir) + if(SOUTH) + initialize_directions = SOUTH + if(NORTH) + initialize_directions = NORTH + if(WEST) + initialize_directions = WEST + if(EAST) + initialize_directions = EAST + if(NORTHEAST) + initialize_directions = NORTH + if(NORTHWEST) + initialize_directions = WEST + if(SOUTHEAST) + initialize_directions = EAST + if(SOUTHWEST) + initialize_directions = SOUTH + initialize() + + +obj/machinery/atmospherics/pipe/down/hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() + +obj/machinery/atmospherics/pipe/down/process() + if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle + ..() + else + . = PROCESS_KILL + +obj/machinery/atmospherics/pipe/down/check_pressure(pressure) + var/datum/gas_mixture/environment = loc.return_air() + + var/pressure_difference = pressure - environment.return_pressure() + + if(pressure_difference > maximum_pressure) + burst() + + else if(pressure_difference > fatigue_pressure) + //TODO: leak to turf, doing pfshhhhh + if(prob(5)) + burst() + + else return 1 + +obj/machinery/atmospherics/pipe/down/proc/burst() + src.visible_message("\red \bold [src] bursts!"); + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + var/datum/effect/effect/system/smoke_spread/smoke = new + smoke.set_up(1,0, src.loc, 0) + smoke.start() + del(src) + +obj/machinery/atmospherics/pipe/down/proc/normalize_dir() + if(dir==3) + dir = 1 + else if(dir==12) + dir = 4 + +obj/machinery/atmospherics/pipe/down/Del() + if(node1) + node1.disconnect(src) + if(node2) + node2.disconnect(src) + ..() + +obj/machinery/atmospherics/pipe/down/pipeline_expansion() + return list(node1, node2) + +obj/machinery/atmospherics/pipe/down/update_icon() +/* + if(node1&&node2) + var/C = "" + icon_state = "intact[C][invisibility ? "-f" : "" ]" + + //var/node1_direction = get_dir(src, node1) + //var/node2_direction = get_dir(src, node2) + + //dir = node1_direction|node2_direction + + else + if(!node1&&!node2) + del(src) //TODO: silent deleting looks weird + var/have_node1 = node1?1:0 + var/have_node2 = node2?1:0 + icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"*/ + + +obj/machinery/atmospherics/pipe/down/initialize() + normalize_dir() + var/node1_dir + + for(var/direction in cardinal) + if(direction&initialize_directions) + if (!node1_dir) + node1_dir = direction + + for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + + var/turf/controlerlocation = locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.down) + var/turf/below = locate(src.x, src.y, controler.down_target) + if(below) + for(var/obj/machinery/atmospherics/target in below) + if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/up)) + node2 = target + break + + + var/turf/T = src.loc // hide if turf is not intact + hide(T.intact) + update_icon() + //update_icon() + +obj/machinery/atmospherics/pipe/down/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null + + if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + del(parent) + node2 = null + + update_icon() + + return null From 6cef89777ddb4ed387a8555f6c2a397b3276602d Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:37:22 +0100 Subject: [PATCH 16/20] Update Structures.dm stairs and ladders --- code/TriDimension/Structures.dm | 261 ++++++++++++++++++-------------- 1 file changed, 151 insertions(+), 110 deletions(-) diff --git a/code/TriDimension/Structures.dm b/code/TriDimension/Structures.dm index 85e499f7ad4..4da4de449ee 100644 --- a/code/TriDimension/Structures.dm +++ b/code/TriDimension/Structures.dm @@ -7,7 +7,6 @@ density = 0 opacity = 0 anchored = 1 - var/obj/multiz/target CanPass(obj/mover, turf/source, height, airflow) return airflow || !density @@ -17,62 +16,137 @@ name = "ladder" desc = "A Ladder. You climb up and down it." - var/top_icon_state = "ladderdown" - var/bottom_icon_state = "ladderup" + var/d_state = 1 + var/obj/multiz/target New() . = ..() - spawn(1) //Allow map to load - if(z in levels_3d) - if(!target) - var/list/adjacent_to_me = global_adjacent_z_levels["[z]"] - if("up" in adjacent_to_me) - target = locate() in locate(x,y,adjacent_to_me["up"]) - if(istype(target)) - icon_state = bottom_icon_state - else if("down" in adjacent_to_me) - target = locate() in locate(x,y,adjacent_to_me["down"]) - if(istype(target)) - icon_state = top_icon_state - else - del src - else - del src - else if("down" in adjacent_to_me) - target = locate() in locate(x,y,adjacent_to_me["down"]) - if(istype(target)) - icon_state = bottom_icon_state - else - del src - else - del src - if(target) - target.icon_state = ( icon_state == top_icon_state ? bottom_icon_state : top_icon_state) - target.target = src - else - del src + connect() + + proc/connect() + if(icon_state == "ladderdown") // the upper will connect to the lower + d_state = 1 + var/turf/controlerlocation = locate(1, 1, z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.down) + var/turf/below = locate(src.x, src.y, controler.down_target) + for(var/obj/multiz/ladder/L in below) + target = L + L.target = src + d_state = 0 + break + return + +/* ex_act(severity) + switch(severity) + if(1.0) + if(icon_state == "ladderup" && prob(10)) + Del() + if(2.0) + if(prob(50)) + Del() + if(3.0) + Del() + return*/ Del() spawn(1) - if(target) + if(target && icon_state == "ladderdown") del target return ..() attack_paw(var/mob/M) return attack_hand(M) - attackby(var/W, var/mob/M) - return attack_hand(M) + attackby(obj/item/C as obj, mob/user as mob) + (..) +// construction commented out for balance concerns +/* if (!target && istype(C, /obj/item/stack/rods)) + var/turf/controlerlocation = locate(1, 1, z) + var/found = 0 + var/obj/item/stack/rods/S = C + if(S.amount < 2) + user << "You dont have enough rods to finish the ladder." + return + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.down) + found = 1 + var/turf/below = locate(src.x, src.y, controler.down_target) + var/blocked = 0 + for(var/atom/A in below.contents) + if(A.density) + blocked = 1 + break + if(!blocked && !istype(below, /turf/simulated/wall)) + var/obj/multiz/ladder/X = new /obj/multiz/ladder(below) + S.amount = S.amount - 2 + if(S.amount == 0) S.Del() + X.icon_state = "ladderup" + connect() + user << "You finish the ladder." + else + user << "The area below is blocked." + if(!found) + user << "You cant build a ladder down there." + return + + else if (icon_state == "ladderdown" && d_state == 0 && istype(C, /obj/item/weapon/wrench)) + user << "You start loosening the anchoring bolts which secure the ladder to the frame." + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + + sleep(30) + if(!user || !C) return + + src.d_state = 1 + if(target) + var/obj/item/stack/rods/R = new /obj/item/stack/rods(target.loc) + R.amount = 2 + target.Del() + + user << "You remove the bolts anchoring the ladder." + return + + else if (icon_state == "ladderdown" && d_state == 1 && istype(C, /obj/item/weapon/weldingtool) ) + var/obj/item/weapon/weldingtool/WT = C + if( WT.remove_fuel(0,user) ) + + user << "You begin to remove the ladder." + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + + sleep(60) + if(!user || !WT || !WT.isOn()) return + + var/obj/item/stack/sheet/metal/S = new /obj/item/stack/sheet/metal( src ) + S.amount = 2 + user << "You remove the ladder and close the hole." + Del() + else + user << "You need more welding fuel to complete this task." + return + + else + src.attack_hand(user) + return*/ + src.attack_hand(user) + return attack_hand(var/mob/M) if(!target || !istype(target.loc, /turf)) - del src - var/list/adjacent_to_me = global_adjacent_z_levels["[z]"] - M.visible_message("\blue \The [M] climbs [target.z == adjacent_to_me["up"] ? "up" : "down"] \the [src]!", "You climb [target.z == adjacent_to_me["up"] ? "up" : "down"] \the [src]!", "You hear some grunting, and clanging of a metal ladder being used.") - M.Move(target.loc) + M << "The ladder is incomplete and cant be climbed." + else + var/turf/T = target.loc + var/blocked = 0 + for(var/atom/A in T.contents) + if(A.density) + blocked = 1 + break + if(blocked || istype(T, /turf/simulated/wall)) + M << "Something is blocking the ladder." + else + M.visible_message("\blue \The [M] climbs [src.icon_state == "ladderup" ? "up" : "down"] \the [src]!", "You climb [src.icon_state == "ladderup" ? "up" : "down"] \the [src]!", "You hear some grunting, and clanging of a metal ladder being used.") + M.Move(target.loc) - - hatch +/* hatch icon_state = "hatchdown" name = "hatch" desc = "A hatch. You climb down it, and it will automatically seal against pressure loss behind you." @@ -125,81 +199,48 @@ spawn(7) top_hatch.icon_state = top_icon_state bottom_hatch.overlays -= red_overlay - active = 0 + active = 0*/ /obj/multiz/stairs name = "Stairs" desc = "Stairs. You walk up and down them." - icon_state = "ramptop" - var/top_icon_state = "ramptop" - var/bottom_icon_state = "rampbottom" + icon_state = "rampbottom" + var/obj/multiz/stairs/connected + var/turf/target - active - density = 1 + New() + ..() + var/turf/cl= locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/c in cl) + if(c.up) + var/turf/O = locate(src.x, src.y, c.up_target) + if(istype(O, /turf/space)) + O.ChangeTurf(/turf/simulated/floor/open) - - New() - . = ..() - spawn(1) - if(z in levels_3d) - if(!target) - var/list/adjacent_to_me = global_adjacent_z_levels["[z]"] - if("up" in adjacent_to_me) - target = locate() in locate(x,y,adjacent_to_me["up"]) - if(istype(target)) - icon_state = bottom_icon_state - else if("down" in adjacent_to_me) - target = locate() in locate(x,y,adjacent_to_me["down"]) - if(istype(target)) - icon_state = top_icon_state - else - del src - else - del src - else if("down" in adjacent_to_me) - target = locate() in locate(x,y,adjacent_to_me["down"]) - if(istype(target)) - icon_state = bottom_icon_state - else - del src - else - del src - if(target) - target.icon_state = ( icon_state == top_icon_state ? bottom_icon_state : top_icon_state) - target.target = src - var/obj/multiz/stairs/lead_in = locate() in get_step(src, reverse_direction(dir)) - if(lead_in) - lead_in.icon_state = ( icon_state == top_icon_state ? bottom_icon_state : top_icon_state) - else - del src - - - Del() - spawn(1) + 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/controlerlocation = locate(1, 1, src.z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + if(controler.up) + var/turf/above = locate(src.x, src.y, controler.up_target) + if(istype(above,/turf/space) || istype(above,/turf/simulated/floor/open)) + src.target = above + break if(target) - del target - return ..() - + break Bumped(var/atom/movable/M) - if(target.z > z && istype(src, /obj/multiz/stairs/active) && !locate(/obj/multiz/stairs) in M.loc) - return //If on bottom, only let them go up stairs if they've moved to the entry tile first. - //If it's the top, they can fall down just fine. - - if(!target || !istype(target.loc, /turf)) - del src - - if(ismob(M) && M:client) - M:client.moving = 1 - M.Move(target.loc) - if (ismob(M) && M:client) - M:client.moving = 0 - - Click() - if(!istype(usr,/mob/dead/observer)) - return ..() - if(!target || !istype(target.loc, /turf)) - del src - usr.client.moving = 1 - usr.Move(target.loc) - usr.client.moving = 0 \ No newline at end of file + if(connected && target && istype(src, /obj/multiz/stairs) && locate(/obj/multiz/stairs) in M.loc) + var/obj/multiz/stairs/Con = locate(/obj/multiz/stairs) in M.loc + if(Con == src.connected) //make sure the atom enters from the approriate lower stairs tile + M.Move(target) + return From ac1f334919be255cd990f5eb1b9cab8d8fb33ca5 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 00:37:52 +0100 Subject: [PATCH 17/20] Update Turfs.dm open space --- code/TriDimension/Turfs.dm | 167 +++++++++++++++++++++---------------- 1 file changed, 93 insertions(+), 74 deletions(-) diff --git a/code/TriDimension/Turfs.dm b/code/TriDimension/Turfs.dm index 1e49e4dc80e..3a1b6b58df3 100644 --- a/code/TriDimension/Turfs.dm +++ b/code/TriDimension/Turfs.dm @@ -1,27 +1,3 @@ -atom/movable/var/list/adjacent_z_levels -atom/movable/var/archived_z_level - -atom/movable/Move() //Hackish - - if(adjacent_z_levels && adjacent_z_levels["up"]) - var/turf/above_me = locate(x,y,adjacent_z_levels["up"]) - if(istype(above_me, /turf/simulated/floor/open)) - above_me:RemoveImage(src) - - . = ..() - - if(archived_z_level != z) - archived_z_level = z - if(z in levels_3d) - adjacent_z_levels = global_adjacent_z_levels["[z]"] - else - adjacent_z_levels = null - - if(adjacent_z_levels && adjacent_z_levels["up"]) - var/turf/above_me = locate(x,y,adjacent_z_levels["up"]) - if(istype(above_me, /turf/simulated/floor/open)) - above_me:AddImage(src) - /turf/simulated/floor/open name = "open space" intact = 0 @@ -31,66 +7,109 @@ atom/movable/Move() //Hackish var/icon/darkoverlays = null var/turf/floorbelow var/list/overlay_references - mouse_opacity = 2 New() ..() - spawn(1) - if(!(z in levels_3d)) - ReplaceWithSpace() - var/list/adjacent_to_me = global_adjacent_z_levels["[z]"] - if(!("down" in adjacent_to_me)) - ReplaceWithSpace() - - floorbelow = locate(x, y, adjacent_to_me["down"]) - if(floorbelow) - if(!istype(floorbelow,/turf)) - del src - else if(floorbelow.density) - ReplaceWithPlating() - else - set_up() - else - ReplaceWithSpace() - + getbelow() + return Enter(var/atom/movable/AM) if (..()) //TODO make this check if gravity is active (future use) - Sukasa spawn(1) + // only fall down in defined areas (read: areas with artificial gravitiy) + if(!floorbelow) //make sure that there is actually something below + if(!getbelow()) + return if(AM) - AM.Move(floorbelow) - if (istype(AM, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - var/damage = rand(5,15) - H.apply_damage(2*damage, BRUTE, "head") - H.apply_damage(2*damage, BRUTE, "chest") - H.apply_damage(0.5*damage, BRUTE, "l_leg") - H.apply_damage(0.5*damage, BRUTE, "r_leg") - H.apply_damage(0.5*damage, BRUTE, "l_arm") - H.apply_damage(0.5*damage, BRUTE, "r_arm") - H:weakened = max(H:weakened,2) - H:updatehealth() + var/area/areacheck = get_area(src) + var/blocked = 0 + var/soft = 0 + for(var/atom/A in floorbelow.contents) + if(A.density) + blocked = 1 + break + if(istype(A, /obj/machinery/atmospherics/pipe/up) && istype(AM,/obj/item/pipe)) + blocked = 1 + break + if(istype(A, /obj/structure/disposalpipe/up) && istype(AM,/obj/item/pipe)) + blocked = 1 + break + if(istype(A, /obj/multiz/stairs)) + soft = 1 + //dont break here, since we still need to be sure that it isnt blocked + + if (soft || (!blocked && !(areacheck.name == "Space"))) + AM.Move(floorbelow) + if (!soft && istype(AM, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + var/damage = 5 + H.apply_damage(min(rand(-damage,damage),0), BRUTE, "head") + H.apply_damage(min(rand(-damage,damage),0), BRUTE, "chest") + H.apply_damage(min(rand(-damage,damage),0), BRUTE, "l_leg") + H.apply_damage(min(rand(-damage,damage),0), BRUTE, "r_leg") + H.apply_damage(min(rand(-damage,damage),0), BRUTE, "l_arm") + H.apply_damage(min(rand(-damage,damage),0), BRUTE, "r_arm") + H:weakened = max(H:weakened,2) + H:updatehealth() return ..() - attackby() - return //nothing +/turf/simulated/floor/open/proc/getbelow() + var/turf/controlerlocation = locate(1, 1, z) + for(var/obj/effect/landmark/zcontroler/controler in controlerlocation) + // check if there is something to draw below + if(!controler.down) + src.ChangeTurf(/turf/space) + return 0 + else + floorbelow = locate(src.x, src.y, controler.down_target) + return 1 + return 1 - proc/set_up() //Update the overlays to make the openspace turf show what's down a level - if(!overlay_references) - overlay_references = list() - if(!floorbelow) return - overlays += floorbelow - for(var/obj/o in floorbelow) - var/image/o_img = image(o, dir=o.dir, layer = TURF_LAYER+0.05*o.layer) - overlays += o_img - overlay_references[o] = o_img +// override to make sure nothing is hidden +/turf/simulated/floor/open/levelupdate() + for(var/obj/O in src) + if(O.level == 1) + O.hide(0) - proc/AddImage(var/atom/movable/o) - var/o_img = image(o, dir=o.dir, layer = TURF_LAYER+0.05*o.layer) - overlays += o_img - overlay_references[o] = o_img +//overwrite the attackby of space to transform it to openspace if necessary +/turf/space/attackby(obj/item/C as obj, mob/user as mob) + if (istype(C, /obj/item/weapon/cable_coil)) + var/turf/simulated/floor/open/W = src.ChangeTurf(/turf/simulated/floor/open) + W.attackby(C, user) + return + ..() - proc/RemoveImage(var/atom/movable/o) - var/o_img = overlay_references[o] - overlays -= o_img - overlay_references -= o \ No newline at end of file +/turf/simulated/floor/open/ex_act(severity) + // cant destroy empty space with an ordinary bomb + return + +/turf/simulated/floor/open/attackby(obj/item/C as obj, mob/user as mob) + (..) + if (istype(C, /obj/item/weapon/cable_coil)) + var/obj/item/weapon/cable_coil/cable = C + cable.turf_place(src, user) + return + + if (istype(C, /obj/item/stack/rods)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + return + var/obj/item/stack/rods/R = C + user << "\blue Constructing support lattice ..." + playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) + ReplaceWithLattice() + R.use(1) + return + + if (istype(C, /obj/item/stack/tile/plasteel)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + var/obj/item/stack/tile/plasteel/S = C + del(L) + playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) + S.build(src) + S.use(1) + return + else + user << "\red The plating is going to need some support." + return From 1f9716d1f28a8fda1cec5f0661c69ee76d2bb687 Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 01:10:18 +0100 Subject: [PATCH 18/20] Update disposal.dm --- code/modules/recycling/disposal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index ca72fdc32fb..69b9a7dae47 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1436,7 +1436,7 @@ src.streak(dirs) -/obj/effect/decal/cleanable/robot_debris/gib/pipe_eject(var/direction) +/obj/effect/decal/cleanable/blood/gibs/robot/pipe_eject(var/direction) var/list/dirs if(direction) dirs = list( direction, turn(direction, -45), turn(direction, 45)) From 908003d42065b8c97f4086138858a6833bd8596f Mon Sep 17 00:00:00 2001 From: LBraindead Date: Sat, 18 Jan 2014 09:29:53 +0100 Subject: [PATCH 19/20] Update baystation12.dme make my files actually compile properly --- baystation12.dme | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/baystation12.dme b/baystation12.dme index b1f4bfbe2d6..0a7b3a47959 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1277,6 +1277,11 @@ #include "code\modules\virus2\helpers.dm" #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" +#include "code\TriDimension\controler.dm" +#include "code\TriDimension\Movement.dm" +#include "code\TriDimension\Pipes.dm" +#include "code\TriDimension\Structures.dm" +#include "code\TriDimension\Turfs.dm" #include "code\WorkInProgress\autopsy.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" From d5eb58d8d69a4abea9501c905783320fdbf60e85 Mon Sep 17 00:00:00 2001 From: LordBraindead Date: Sun, 19 Jan 2014 12:00:22 +0100 Subject: [PATCH 20/20] generalized the z-level atmospipes --- code/TriDimension/Pipes.dm | 212 ++++------------------- code/TriDimension/Turfs.dm | 2 +- code/game/machinery/pipe/construction.dm | 8 +- 3 files changed, 42 insertions(+), 180 deletions(-) diff --git a/code/TriDimension/Pipes.dm b/code/TriDimension/Pipes.dm index 16768b69119..779e2e49088 100644 --- a/code/TriDimension/Pipes.dm +++ b/code/TriDimension/Pipes.dm @@ -1,7 +1,7 @@ -///////////////////////// -// the elusive up pipe // -///////////////////////// -obj/machinery/atmospherics/pipe/up +//////////////////////////// +// parent class for pipes // +//////////////////////////// +obj/machinery/atmospherics/pipe/zpipe icon = 'code/TriDimension/multiz_pipe.dmi' icon_state = "up" @@ -26,7 +26,7 @@ obj/machinery/atmospherics/pipe/up level = 1 -obj/machinery/atmospherics/pipe/up/New() +obj/machinery/atmospherics/pipe/zpipe/New() ..() switch(dir) if(SOUTH) @@ -48,7 +48,7 @@ obj/machinery/atmospherics/pipe/up/New() initialize() -obj/machinery/atmospherics/pipe/up/hide(var/i) +obj/machinery/atmospherics/pipe/zpipe/hide(var/i) if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() @@ -59,7 +59,7 @@ obj/machinery/atmospherics/pipe/up/process() else . = PROCESS_KILL -obj/machinery/atmospherics/pipe/up/check_pressure(pressure) +obj/machinery/atmospherics/pipe/zpipe/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() var/pressure_difference = pressure - environment.return_pressure() @@ -74,7 +74,7 @@ obj/machinery/atmospherics/pipe/up/check_pressure(pressure) else return 1 -obj/machinery/atmospherics/pipe/up/proc/burst() +obj/machinery/atmospherics/pipe/zpipe/proc/burst() src.visible_message("\red \bold [src] bursts!"); playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) var/datum/effect/effect/system/smoke_spread/smoke = new @@ -82,42 +82,48 @@ obj/machinery/atmospherics/pipe/up/proc/burst() smoke.start() del(src) -obj/machinery/atmospherics/pipe/up/proc/normalize_dir() +obj/machinery/atmospherics/pipe/zpipe/proc/normalize_dir() if(dir==3) dir = 1 else if(dir==12) dir = 4 -obj/machinery/atmospherics/pipe/up/Del() +obj/machinery/atmospherics/pipe/zpipe/Del() if(node1) node1.disconnect(src) if(node2) node2.disconnect(src) ..() -obj/machinery/atmospherics/pipe/up/pipeline_expansion() +obj/machinery/atmospherics/pipe/zpipe/pipeline_expansion() return list(node1, node2) -obj/machinery/atmospherics/pipe/up/update_icon() -/* if(node1&&node2) - var/C = "" - icon_state = "intact[C][invisibility ? "-f" : "" ]" +obj/machinery/atmospherics/pipe/zpipe/update_icon() + return - //var/node1_direction = get_dir(src, node1) - //var/node2_direction = get_dir(src, node2) +obj/machinery/atmospherics/pipe/zpipe/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null - //dir = node1_direction|node2_direction + if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + del(parent) + node2 = null - else - if(!node1&&!node2) - world << "up-pipe deleted by update_icon()" - del(src) //TODO: silent deleting looks weird - var/have_node1 = node1?1:0 - var/have_node2 = node2?1:0 - icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"*/ + return null +///////////////////////// +// the elusive up pipe // +///////////////////////// +obj/machinery/atmospherics/pipe/zpipe/up + icon = 'code/TriDimension/multiz_pipe.dmi' + icon_state = "up" + name = "upwards pipe" + desc = "A pipe segment to connect upwards." -obj/machinery/atmospherics/pipe/up/initialize() +obj/machinery/atmospherics/pipe/zpipe/up/initialize() normalize_dir() var/node1_dir @@ -137,153 +143,26 @@ obj/machinery/atmospherics/pipe/up/initialize() var/turf/above = locate(src.x, src.y, controler.up_target) if(above) for(var/obj/machinery/atmospherics/target in above) - if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/down)) + if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/zpipe/down)) node2 = target break var/turf/T = src.loc // hide if turf is not intact hide(T.intact) - update_icon() - //update_icon() - -obj/machinery/atmospherics/pipe/up/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) - node2 = null - - update_icon() - - return null - /////////////////////// // and the down pipe // /////////////////////// -obj/machinery/atmospherics/pipe/down +obj/machinery/atmospherics/pipe/zpipe/down icon = 'code/TriDimension/multiz_pipe.dmi' icon_state = "down" name = "downwards pipe" desc = "A pipe segment to connect downwards." - volume = 70 - - dir = SOUTH - initialize_directions = SOUTH - - var/obj/machinery/atmospherics/node1 //connection on the same Z - var/obj/machinery/atmospherics/node2 //connection on the other Z - - var/minimum_temperature_difference = 300 - var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No - - var/maximum_pressure = 70*ONE_ATMOSPHERE - var/fatigue_pressure = 55*ONE_ATMOSPHERE - alert_pressure = 55*ONE_ATMOSPHERE - - - level = 1 - -obj/machinery/atmospherics/pipe/down/New() - ..() - switch(dir) - if(SOUTH) - initialize_directions = SOUTH - if(NORTH) - initialize_directions = NORTH - if(WEST) - initialize_directions = WEST - if(EAST) - initialize_directions = EAST - if(NORTHEAST) - initialize_directions = NORTH - if(NORTHWEST) - initialize_directions = WEST - if(SOUTHEAST) - initialize_directions = EAST - if(SOUTHWEST) - initialize_directions = SOUTH - initialize() - - -obj/machinery/atmospherics/pipe/down/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - -obj/machinery/atmospherics/pipe/down/process() - if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle - ..() - else - . = PROCESS_KILL - -obj/machinery/atmospherics/pipe/down/check_pressure(pressure) - var/datum/gas_mixture/environment = loc.return_air() - - var/pressure_difference = pressure - environment.return_pressure() - - if(pressure_difference > maximum_pressure) - burst() - - else if(pressure_difference > fatigue_pressure) - //TODO: leak to turf, doing pfshhhhh - if(prob(5)) - burst() - - else return 1 - -obj/machinery/atmospherics/pipe/down/proc/burst() - src.visible_message("\red \bold [src] bursts!"); - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - var/datum/effect/effect/system/smoke_spread/smoke = new - smoke.set_up(1,0, src.loc, 0) - smoke.start() - del(src) - -obj/machinery/atmospherics/pipe/down/proc/normalize_dir() - if(dir==3) - dir = 1 - else if(dir==12) - dir = 4 - -obj/machinery/atmospherics/pipe/down/Del() - if(node1) - node1.disconnect(src) - if(node2) - node2.disconnect(src) - ..() - -obj/machinery/atmospherics/pipe/down/pipeline_expansion() - return list(node1, node2) - -obj/machinery/atmospherics/pipe/down/update_icon() -/* - if(node1&&node2) - var/C = "" - icon_state = "intact[C][invisibility ? "-f" : "" ]" - - //var/node1_direction = get_dir(src, node1) - //var/node2_direction = get_dir(src, node2) - - //dir = node1_direction|node2_direction - - else - if(!node1&&!node2) - del(src) //TODO: silent deleting looks weird - var/have_node1 = node1?1:0 - var/have_node2 = node2?1:0 - icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"*/ - - -obj/machinery/atmospherics/pipe/down/initialize() +obj/machinery/atmospherics/pipe/zpipe/down/initialize() normalize_dir() var/node1_dir @@ -303,27 +182,10 @@ obj/machinery/atmospherics/pipe/down/initialize() var/turf/below = locate(src.x, src.y, controler.down_target) if(below) for(var/obj/machinery/atmospherics/target in below) - if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/up)) + if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/zpipe/up)) node2 = target break var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - update_icon() - //update_icon() - -obj/machinery/atmospherics/pipe/down/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) - node2 = null - - update_icon() - - return null + hide(T.intact) \ No newline at end of file diff --git a/code/TriDimension/Turfs.dm b/code/TriDimension/Turfs.dm index 3a1b6b58df3..2f99b6fd415 100644 --- a/code/TriDimension/Turfs.dm +++ b/code/TriDimension/Turfs.dm @@ -28,7 +28,7 @@ if(A.density) blocked = 1 break - if(istype(A, /obj/machinery/atmospherics/pipe/up) && istype(AM,/obj/item/pipe)) + if(istype(A, /obj/machinery/atmospherics/pipe/zpipe/up) && istype(AM,/obj/item/pipe)) blocked = 1 break if(istype(A, /obj/structure/disposalpipe/up) && istype(AM,/obj/item/pipe)) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 75049fb9095..72aa31ccee0 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -89,9 +89,9 @@ Buildable meters else if(istype(make_from, /obj/machinery/atmospherics/pipe/cap)) src.pipe_type = PIPE_CAP ///// Z-Level stuff - else if(istype(make_from, /obj/machinery/atmospherics/pipe/up)) + else if(istype(make_from, /obj/machinery/atmospherics/pipe/zpipe/up)) src.pipe_type = PIPE_UP - else if(istype(make_from, /obj/machinery/atmospherics/pipe/down)) + else if(istype(make_from, /obj/machinery/atmospherics/pipe/zpipe/down)) src.pipe_type = PIPE_DOWN ///// Z-Level stuff else @@ -617,7 +617,7 @@ Buildable meters C.node.build_network() ///// Z-Level stuff if(PIPE_UP) //volume pump - var/obj/machinery/atmospherics/pipe/up/P = new(src.loc) + var/obj/machinery/atmospherics/pipe/zpipe/up/P = new(src.loc) P.dir = dir P.initialize_directions = pipe_dir if (pipename) @@ -633,7 +633,7 @@ Buildable meters P.node2.initialize() P.node2.build_network() if(PIPE_DOWN) //volume pump - var/obj/machinery/atmospherics/pipe/down/P = new(src.loc) + var/obj/machinery/atmospherics/pipe/zpipe/down/P = new(src.loc) P.dir = dir P.initialize_directions = pipe_dir if (pipename)