From 84eb15f9cc5e8d4b66e70955bf234e3bf323002c Mon Sep 17 00:00:00 2001 From: Atermonera Date: Wed, 29 Apr 2020 13:51:20 -0700 Subject: [PATCH 1/2] Merge pull request #7041 from VOREStation/vplk-disposal-consts Slightly clean disposal pipe construction code. --- code/__defines/construction.dm | 22 +++ code/game/machinery/pipe/pipe_dispenser.dm | 93 +++-------- code/game/machinery/pipe/pipe_recipes.dm | 51 +++++- .../recycling/disposal-construction.dm | 151 ++++++++++-------- 4 files changed, 180 insertions(+), 137 deletions(-) diff --git a/code/__defines/construction.dm b/code/__defines/construction.dm index 5c0d6404477..0ab4103e4d6 100644 --- a/code/__defines/construction.dm +++ b/code/__defines/construction.dm @@ -63,6 +63,28 @@ #define PIPING_DEFAULT_LAYER_ONLY 4 //can only exist at PIPING_LAYER_DEFAULT #define PIPING_CARDINAL_AUTONORMALIZE 8 //north/south east/west doesn't matter, auto normalize on build. +// Disposals Construction +// Future: Eliminate these type codes by adding disposals equivilent of pipe_state. +#define DISPOSAL_PIPE_STRAIGHT 0 +#define DISPOSAL_PIPE_CORNER 1 +#define DISPOSAL_PIPE_JUNCTION 2 +#define DISPOSAL_PIPE_JUNCTION_FLIPPED 3 +#define DISPOSAL_PIPE_JUNCTION_Y 4 +#define DISPOSAL_PIPE_TRUNK 5 +#define DISPOSAL_PIPE_BIN 6 +#define DISPOSAL_PIPE_OUTLET 7 +#define DISPOSAL_PIPE_CHUTE 8 +#define DISPOSAL_PIPE_SORTER 9 +#define DISPOSAL_PIPE_SORTER_FLIPPED 10 +#define DISPOSAL_PIPE_UPWARD 11 +#define DISPOSAL_PIPE_DOWNWARD 12 +#define DISPOSAL_PIPE_TAGGER 13 +#define DISPOSAL_PIPE_TAGGER_PARTIAL 14 + +#define DISPOSAL_SORT_NORMAL 0 +#define DISPOSAL_SORT_WILDCARD 1 +#define DISPOSAL_SORT_UNTAGGED 2 + // Macro for easy use of boilerplate code for searching for a valid node connection. #define STANDARD_ATMOS_CHOOSE_NODE(node_num, direction) \ for(var/obj/machinery/atmospherics/target in get_step(src, direction)) { \ diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index e1aab7bf3c9..4c4d3ce914e 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -140,92 +140,39 @@ Nah qdel(pipe) -/obj/machinery/pipedispenser/disposal/attack_hand(user as mob) - if(..()) - return +/obj/machinery/pipedispenser/disposal/interact(mob/user) + user.set_machine(src) -///// Z-Level stuff - var/dat = {"Disposal Pipes

-Pipe
-Bent Pipe
-Junction
-Y-Junction
-Trunk
-Bin
-Outlet
-Chute
-Upwards
-Downwards
-Sorting
-Sorting (Wildcard)
-Sorting (Untagged)
-Tagger
-Tagger (Partial)
-"} -///// Z-Level stuff - - user << browse("[src][dat]", "window=pipedispenser") + var/list/lines = list() + for(var/category in disposal_pipe_recipes) + lines += "[category]:
" + for(var/datum/pipe_recipe/PI in disposal_pipe_recipes[category]) + lines += PI.Render(src) + var/dat = lines.Join() + var/datum/browser/popup = new(user, "pipedispenser", name, 300, 500, src) + popup.set_content("[dat]") + popup.open() return -// 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk - - /obj/machinery/pipedispenser/disposal/Topic(href, href_list) - if(..()) + if(href_list["makepipe"] || href_list["setlayer"] || href_list["makemeter"]) // Asking the disposal machine to do atmos stuff? + return // That's a no no. + if((. = ..())) return - usr.set_machine(src) - src.add_fingerprint(usr) if(href_list["dmake"]) if(unwrenched || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=pipedispenser") return if(!wait) - var/p_type = text2num(href_list["dmake"]) - var/obj/structure/disposalconstruct/C = new (src.loc) - switch(p_type) - if(0) - C.ptype = 0 - if(1) - C.ptype = 1 - if(2) - C.ptype = 2 - if(3) - C.ptype = 4 - if(4) - C.ptype = 5 - if(5) - C.ptype = 6 - C.density = 1 - if(6) - C.ptype = 7 - C.density = 1 - if(7) - C.ptype = 8 - C.density = 1 - if(8) - C.ptype = 9 - C.subtype = 0 - if(9) - C.ptype = 9 - C.subtype = 1 - if(10) - C.ptype = 9 - C.subtype = 2 - if(11) - C.ptype = 13 - if(12) - C.ptype = 14 -///// Z-Level stuff - if(21) - C.ptype = 11 - if(22) - C.ptype = 12 -///// Z-Level stuff + var/ptype = text2num(href_list["dmake"]) + var/pdir = (href_list["dir"] ? text2num(href_list["dir"]) : NORTH) + var/psub = (href_list["sort"] ? text2num(href_list["sort"]) : 0) + var/obj/structure/disposalconstruct/C = new (src.loc, ptype, pdir, 0, psub) + C.add_fingerprint(usr) C.update() wait = 1 - spawn(15) - wait = 0 + VARSET_IN(src, wait, FALSE, 15) return // adding a pipe dispensers that spawn unhooked from the ground diff --git a/code/game/machinery/pipe/pipe_recipes.dm b/code/game/machinery/pipe/pipe_recipes.dm index aee12f749c3..0bf8f10105e 100644 --- a/code/game/machinery/pipe/pipe_recipes.dm +++ b/code/game/machinery/pipe/pipe_recipes.dm @@ -3,6 +3,7 @@ // var/global/list/atmos_pipe_recipes = null +var/global/list/disposal_pipe_recipes = null /hook/startup/proc/init_pipe_recipes() global.atmos_pipe_recipes = list( @@ -48,16 +49,38 @@ var/global/list/atmos_pipe_recipes = null new /datum/pipe_recipe/pipe("Pipe", /obj/machinery/atmospherics/pipe/simple/insulated), ) ) + global.disposal_pipe_recipes = list( + "Disposal Pipes" = list( + new /datum/pipe_recipe/disposal("Pipe", DISPOSAL_PIPE_STRAIGHT, "conpipe-s", PIPE_STRAIGHT), + new /datum/pipe_recipe/disposal("Bent Pipe", DISPOSAL_PIPE_CORNER, "conpipe-c"), + new /datum/pipe_recipe/disposal("Junction", DISPOSAL_PIPE_JUNCTION, "conpipe-j1", PIPE_TRIN_M), + new /datum/pipe_recipe/disposal("Y-Junction", DISPOSAL_PIPE_JUNCTION_Y, "conpipe-y"), + new /datum/pipe_recipe/disposal("Sort Junction", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, DISPOSAL_SORT_NORMAL), + new /datum/pipe_recipe/disposal("Sort Junction (Wildcard)", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, DISPOSAL_SORT_WILDCARD), + new /datum/pipe_recipe/disposal("Sort Junction (Untagged)", DISPOSAL_PIPE_SORTER, "conpipe-j1s", PIPE_TRIN_M, DISPOSAL_SORT_UNTAGGED), + new /datum/pipe_recipe/disposal("Tagger", DISPOSAL_PIPE_TAGGER, "pipe-tagger", PIPE_STRAIGHT), + new /datum/pipe_recipe/disposal("Tagger (Partial)", DISPOSAL_PIPE_TAGGER_PARTIAL, "pipe-tagger-partial", PIPE_STRAIGHT), + new /datum/pipe_recipe/disposal("Trunk", DISPOSAL_PIPE_TRUNK, "conpipe-t"), + new /datum/pipe_recipe/disposal("Upwards", DISPOSAL_PIPE_UPWARD, "pipe-u"), + new /datum/pipe_recipe/disposal("Downwards", DISPOSAL_PIPE_DOWNWARD, "pipe-d"), + new /datum/pipe_recipe/disposal("Bin", DISPOSAL_PIPE_BIN, "disposal", PIPE_ONEDIR), + new /datum/pipe_recipe/disposal("Outlet", DISPOSAL_PIPE_OUTLET, "outlet"), + new /datum/pipe_recipe/disposal("Chute", DISPOSAL_PIPE_CHUTE, "intake"), + ) + ) return TRUE // // New method of handling pipe construction. Instead of numeric constants and a giant switch statement of doom // every pipe type has a datum instance which describes its name, placement rules and construction method, dispensing etc. // The advantages are obvious, mostly in simplifying the code of the dispenser, and the ability to add new pipes without hassle. +// icon_state and icon_state_m must be from among those available from the dmi files included in /datum/asset/iconsheet/pipes // /datum/pipe_recipe var/name = "Abstract Pipe (fixme)" // Recipe name - var/dirtype // If using an RPD, this tells more about what previews to show. + var/icon_state = null // This tells the RPD what kind of pipe icon to render for the preview. + var/icon_state_m = null // This stores the mirrored version of the regular state (if available). + var/dirtype // If using an RPD, this tells more about what previews to show. // Render an HTML link to select this pipe type. Returns text. /datum/pipe_recipe/proc/Render(dispenser) @@ -78,7 +101,10 @@ var/global/list/atmos_pipe_recipes = null name = label pipe_type = path construction_type = initial(path.construction_type) + icon_state = initial(path.pipe_state) dirtype = initial(construction_type.dispenser_class) + if (dirtype == PIPE_TRIN_M) + icon_state_m = "[icon_state]m" // Render an HTML link to select this pipe type /datum/pipe_recipe/pipe/Render(dispenser) @@ -98,9 +124,32 @@ var/global/list/atmos_pipe_recipes = null // /datum/pipe_recipe/meter dirtype = PIPE_ONEDIR + icon_state = "meter" /datum/pipe_recipe/meter/New(label) name = label /datum/pipe_recipe/meter/Params() return "makemeter=1" + +// +// Subtype for disposal pipes +// +/datum/pipe_recipe/disposal + var/pipe_type // pipe_type is one of the DISPOSAL_PIPE_ ptype constants. + var/subtype // subtype is one of the DISPOSAL_SORT_ constants. + +/datum/pipe_recipe/disposal/New(var/label, var/ptype, var/state, dt=PIPE_DIRECTIONAL, var/sort=0) + name = label + icon_state = state + pipe_type = ptype + dirtype = dt + subtype = sort + if (dirtype == PIPE_TRIN_M) + icon_state_m = replacetext(state, "j1", "j2") + +/datum/pipe_recipe/disposal/Params() + var/param = "dmake=[pipe_type]" + if (subtype) + param += "&sort=[subtype]" + return param diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 1743ee4c691..e9d4e4227db 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -14,71 +14,95 @@ level = 2 var/sortType = "" var/ptype = 0 - // 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk, 6=disposal bin, 7=outlet, 8=inlet 9=pipe-j1s 10=pipe-j2s var/subtype = 0 var/dpdir = 0 // directions as disposalpipe var/base_state = "pipe-s" - // update iconstate and dpdir due to dir and type +/obj/structure/disposalconstruct/New(var/newturf, var/newtype, var/newdir, var/flipped, var/newsubtype) + ..(newturf) + ptype = newtype + dir = newdir + // Disposals handle "bent"/"corner" strangely, handle this specially. + if(ptype == DISPOSAL_PIPE_STRAIGHT && dir in cornerdirs) + ptype = DISPOSAL_PIPE_CORNER + switch(dir) + if(NORTHWEST) + dir = WEST + if(NORTHEAST) + dir = NORTH + if(SOUTHWEST) + dir = SOUTH + if(SOUTHEAST) + dir = EAST + + switch(ptype) + if(DISPOSAL_PIPE_BIN, DISPOSAL_PIPE_OUTLET, DISPOSAL_PIPE_CHUTE) + density = 1 + if(DISPOSAL_PIPE_SORTER, DISPOSAL_PIPE_SORTER_FLIPPED) + subtype = newsubtype + + if(flipped) + do_a_flip() + else + update() // do_a_flip() calls update anyway, so, lazy way of catching unupdated pipe! + +// update iconstate and dpdir due to dir and type /obj/structure/disposalconstruct/proc/update() var/flip = turn(dir, 180) var/left = turn(dir, 90) var/right = turn(dir, -90) switch(ptype) - if(0) + if(DISPOSAL_PIPE_STRAIGHT) base_state = "pipe-s" dpdir = dir | flip - if(1) + if(DISPOSAL_PIPE_CORNER) base_state = "pipe-c" dpdir = dir | right - if(2) + if(DISPOSAL_PIPE_JUNCTION) base_state = "pipe-j1" dpdir = dir | right | flip - if(3) + if(DISPOSAL_PIPE_JUNCTION_FLIPPED) base_state = "pipe-j2" dpdir = dir | left | flip - if(4) + if(DISPOSAL_PIPE_JUNCTION_Y) base_state = "pipe-y" dpdir = dir | left | right - if(5) + if(DISPOSAL_PIPE_TRUNK) base_state = "pipe-t" dpdir = dir // disposal bin has only one dir, thus we don't need to care about setting it - if(6) + if(DISPOSAL_PIPE_BIN) if(anchored) base_state = "disposal" else base_state = "condisposal" - if(7) + if(DISPOSAL_PIPE_OUTLET) base_state = "outlet" dpdir = dir - if(8) + if(DISPOSAL_PIPE_CHUTE) base_state = "intake" dpdir = dir - if(9) + if(DISPOSAL_PIPE_SORTER) base_state = "pipe-j1s" dpdir = dir | right | flip - if(10) + if(DISPOSAL_PIPE_SORTER_FLIPPED) base_state = "pipe-j2s" dpdir = dir | left | flip -///// Z-Level stuff - if(11) + if(DISPOSAL_PIPE_UPWARD) base_state = "pipe-u" dpdir = dir - if(12) + if(DISPOSAL_PIPE_DOWNWARD) base_state = "pipe-d" dpdir = dir - if(13) + if(DISPOSAL_PIPE_TAGGER) base_state = "pipe-tagger" dpdir = dir | flip - if(14) + if(DISPOSAL_PIPE_TAGGER_PARTIAL) base_state = "pipe-tagger-partial" dpdir = dir | flip - -///// Z-Level stuff - if(!(ptype in list(6, 7, 8, 11, 12, 13, 14))) + if(!(ptype in list(DISPOSAL_PIPE_BIN, DISPOSAL_PIPE_OUTLET, DISPOSAL_PIPE_CHUTE, DISPOSAL_PIPE_UPWARD, DISPOSAL_PIPE_DOWNWARD, DISPOSAL_PIPE_TAGGER, DISPOSAL_PIPE_TAGGER_PARTIAL))) icon_state = "con[base_state]" else icon_state = base_state @@ -123,58 +147,59 @@ to_chat(usr, "You must unfasten the pipe before flipping it.") return - set_dir(turn(dir, 180)) + do_a_flip() + +/obj/structure/disposalconstruct/proc/do_a_flip() switch(ptype) - if(2) - ptype = 3 - if(3) - ptype = 2 - if(9) - ptype = 10 - if(10) - ptype = 9 + if(DISPOSAL_PIPE_JUNCTION) + ptype = DISPOSAL_PIPE_JUNCTION_FLIPPED + if(DISPOSAL_PIPE_JUNCTION_FLIPPED) + ptype = DISPOSAL_PIPE_JUNCTION + if(DISPOSAL_PIPE_SORTER) + ptype = DISPOSAL_PIPE_SORTER_FLIPPED + if(DISPOSAL_PIPE_SORTER_FLIPPED) + ptype = DISPOSAL_PIPE_SORTER update() // returns the type path of disposalpipe corresponding to this item dtype /obj/structure/disposalconstruct/proc/dpipetype() switch(ptype) - if(0,1) + if(DISPOSAL_PIPE_STRAIGHT,DISPOSAL_PIPE_CORNER) return /obj/structure/disposalpipe/segment - if(2,3,4) + if(DISPOSAL_PIPE_JUNCTION,DISPOSAL_PIPE_JUNCTION_FLIPPED,DISPOSAL_PIPE_JUNCTION_Y) return /obj/structure/disposalpipe/junction - if(5) + if(DISPOSAL_PIPE_TRUNK) return /obj/structure/disposalpipe/trunk - if(6) + if(DISPOSAL_PIPE_BIN) return /obj/machinery/disposal - if(7) + if(DISPOSAL_PIPE_OUTLET) return /obj/structure/disposaloutlet - if(8) + if(DISPOSAL_PIPE_CHUTE) return /obj/machinery/disposal/deliveryChute - if(9) + if(DISPOSAL_PIPE_SORTER) switch(subtype) - if(0) + if(DISPOSAL_SORT_NORMAL) return /obj/structure/disposalpipe/sortjunction - if(1) + if(DISPOSAL_SORT_WILDCARD) return /obj/structure/disposalpipe/sortjunction/wildcard - if(2) + if(DISPOSAL_SORT_UNTAGGED) return /obj/structure/disposalpipe/sortjunction/untagged - if(10) + if(DISPOSAL_PIPE_SORTER_FLIPPED) switch(subtype) - if(0) + if(DISPOSAL_SORT_NORMAL) return /obj/structure/disposalpipe/sortjunction/flipped - if(1) + if(DISPOSAL_SORT_WILDCARD) return /obj/structure/disposalpipe/sortjunction/wildcard/flipped - if(2) + if(DISPOSAL_SORT_UNTAGGED) return /obj/structure/disposalpipe/sortjunction/untagged/flipped -///// Z-Level stuff - if(11) + if(DISPOSAL_PIPE_UPWARD) return /obj/structure/disposalpipe/up - if(12) + if(DISPOSAL_PIPE_DOWNWARD) return /obj/structure/disposalpipe/down - if(13) + if(DISPOSAL_PIPE_TAGGER) return /obj/structure/disposalpipe/tagger - if(14) + if(DISPOSAL_PIPE_TAGGER_PARTIAL) return /obj/structure/disposalpipe/tagger/partial return @@ -188,25 +213,25 @@ var/ispipe = 0 // Indicates if we should change the level of this pipe src.add_fingerprint(user) switch(ptype) - if(6) + if(DISPOSAL_PIPE_BIN) nicetype = "disposal bin" - if(7) + if(DISPOSAL_PIPE_OUTLET) nicetype = "disposal outlet" - if(8) + if(DISPOSAL_PIPE_CHUTE) nicetype = "delivery chute" - if(9, 10) + if(DISPOSAL_PIPE_SORTER, DISPOSAL_PIPE_SORTER_FLIPPED) switch(subtype) - if(0) + if(DISPOSAL_SORT_NORMAL) nicetype = "sorting pipe" - if(1) + if(DISPOSAL_SORT_WILDCARD) nicetype = "wildcard sorting pipe" - if(2) + if(DISPOSAL_SORT_UNTAGGED) nicetype = "untagged sorting pipe" ispipe = 1 - if(13) + if(DISPOSAL_PIPE_TAGGER) nicetype = "tagging pipe" ispipe = 1 - if(14) + if(DISPOSAL_PIPE_TAGGER_PARTIAL) nicetype = "partial tagging pipe" ispipe = 1 else @@ -231,7 +256,7 @@ density = 1 to_chat(user, "You detach the [nicetype] from the underfloor.") else - if(ptype>=6 && ptype <= 8) // Disposal or outlet + if(ptype == DISPOSAL_PIPE_BIN || ptype == DISPOSAL_PIPE_OUTLET || ptype == DISPOSAL_PIPE_CHUTE) // Disposal or outlet if(CP) // There's something there if(!istype(CP,/obj/structure/disposalpipe/trunk)) to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.") @@ -281,26 +306,26 @@ P.updateicon() //Needs some special treatment ;) - if(ptype==9 || ptype==10) + if(ptype==DISPOSAL_PIPE_SORTER || ptype==DISPOSAL_PIPE_SORTER_FLIPPED) var/obj/structure/disposalpipe/sortjunction/SortP = P SortP.sortType = sortType SortP.updatedir() SortP.updatedesc() SortP.updatename() - else if(ptype==6) // Disposal bin + else if(ptype==DISPOSAL_PIPE_BIN) var/obj/machinery/disposal/P = new /obj/machinery/disposal(src.loc) src.transfer_fingerprints_to(P) P.mode = 0 // start with pump off - else if(ptype==7) // Disposal outlet + else if(ptype==DISPOSAL_PIPE_OUTLET) var/obj/structure/disposaloutlet/P = new /obj/structure/disposaloutlet(src.loc) src.transfer_fingerprints_to(P) P.set_dir(dir) var/obj/structure/disposalpipe/trunk/Trunk = CP Trunk.linked = P - else if(ptype==8) // Disposal outlet + else if(ptype==DISPOSAL_PIPE_CHUTE) var/obj/machinery/disposal/deliveryChute/P = new /obj/machinery/disposal/deliveryChute(src.loc) src.transfer_fingerprints_to(P) P.set_dir(dir)