adds/fixes mapping helpers for: windows, power lines (#3992)

* wacky

* Wacky

* pani

* t

* all that

* fixes

* coggers!

* that

* fix

* regex

* regex

* okay

* okay

Co-authored-by: fake_vm_user <fake_vm_user>
This commit is contained in:
silicons
2022-05-12 15:25:49 -07:00
committed by GitHub
co-authored by fake_vm_user <fake_vm_user>
parent 98e27bf172
commit 12fc0e8adf
46 changed files with 934 additions and 897 deletions
@@ -1,41 +1,57 @@
//Builds networks like power cables/atmos lines/etc
//Just a holder parent type for now..
/obj/effect/map_helper/network_builder
/// set var to true to not del on lateload
var/custom_spawned = FALSE
// Builds networks like power cables/atmos lines/etc
// Just a holder parent type for now..
/atom/movable/map_helper/network_builder
icon = 'icons/mapping/helpers/mapping_helpers.dmi'
late = TRUE
/// what directions we know connections are in
var/list/network_directions = list()
invisibility = INVISIBILITY_MAXIMUM
/// what directions we know connections are in. flag. uses X_BIT defines!
var/network_directions
/// adminspawned
var/adminspawned = FALSE
/// our base type
var/base_type
/obj/effect/map_helper/network_builder/Initialize(mapload)
/atom/movable/map_helper/network_builder/Initialize(mapload)
. = ..()
var/conflict = check_duplicates()
if(conflict)
stack_trace("WARNING: [type] network building helper found check_duplicates() conflict [conflict] in its location.!")
return INITIALIZE_HINT_QDEL
if(!mapload)
if(GLOB.Debug2)
custom_spawned = TRUE
return INITIALIZE_HINT_NORMAL
else
return INITIALIZE_HINT_QDEL
/// if it isn't adminspawned i am going to come find you
/// don't anyone dare use this in non mapping contexts
/// "teardown and rebuild" behavior is garbage, don't use it.
adminspawned = TRUE
rebuild()
return INITIALIZE_HINT_NORMAL
var/conflict = length(duplicates())
if(conflict)
stack_trace("WARNING: [type] network building helper found check_duplicates() conflicts [english_list(conflict)] in its location.!")
return INITIALIZE_HINT_QDEL
network_directions = scan()
return INITIALIZE_HINT_LATELOAD
/// How this works: On LateInitialize, detect all directions that this should be applicable to, and do what it needs to do, and then inform all network builders in said directions that it's been around since it won't be around afterwards.
/obj/effect/map_helper/network_builder/LateInitialize()
scan_directions()
build_network()
if(!custom_spawned)
qdel(src)
/atom/movable/map_helper/network_builder/LateInitialize()
build()
qdel(src)
/obj/effect/map_helper/network_builder/proc/check_duplicates()
/atom/movable/map_helper/network_builder/proc/duplicates()
CRASH("Base abstract network builder tried to check duplicates.")
/obj/effect/map_helper/network_builder/proc/scan_directions()
/atom/movable/map_helper/network_builder/proc/scan()
CRASH("Base abstract network builder tried to scan directions.")
/obj/effect/map_helper/network_builder/proc/build_network()
/atom/movable/map_helper/network_builder/proc/build()
CRASH("Base abstract network builder tried to build network.")
/atom/movable/map_helper/network_builder/proc/teardown()
for(var/atom/movable/AM as anything in duplicates())
ASSERT(istype(AM))
qdel(AM)
/atom/movable/map_helper/network_builder/proc/rebuild(propagate = TRUE)
teardown()
if(propagate)
for(var/d in GLOB.cardinal)
var/atom/movable/map_helper/network_builder/NB = locate(base_type) in get_step(src, d)
if(NB)
NB.rebuild(FALSE)
network_directions = scan()
build()
@@ -1,96 +0,0 @@
/* Automatically places pipes on init based on any pipes connecting to it and adjacent helpers. Only supports cardinals.
* Conflicts with ANY PIPE ON ITS LAYER, as well as atmos network build helpers on the same layer, as well as any pipe on all layers. Do those manually.
*/
/obj/effect/map_helper/network_builder/atmos_pipe
name = "atmos pipe autobuilder"
icon_state = "atmospipebuilder"
/// Layer to put our pipes on
var/pipe_layer = PIPING_LAYER_DEFAULT
/// Color to set our pipes to
var/pipe_color
/// Whether or not pipes we make are visible
var/visible_pipes = FALSE
color = null
/obj/effect/map_helper/network_builder/atmos_pipe/check_duplicates()
for(var/obj/effect/map_helper/network_builder/atmos_pipe/other in loc)
if(other == src)
continue
if(other.pipe_layer == pipe_layer)
return other
for(var/obj/machinery/atmospherics/A in loc)
if(A.pipe_flags & PIPING_ALL_LAYER)
return A
if(A.piping_layer == pipe_layer)
return A
return FALSE
/// Scans directions, sets network_directions to have every direction that we can link to. If there's another power cable builder detected, make sure they know we're here by adding us to their cable directions list before we're deleted.
/obj/effect/map_helper/network_builder/atmos_pipe/scan_directions()
var/turf/T
for(var/i in GLOB.cardinals)
if(i in network_directions)
continue //we're already set, that means another builder set us.
T = get_step(loc, i)
if(!T)
continue
var/found = FALSE
for(var/obj/effect/map_helper/network_builder/atmos_pipe/other in T)
if(other.pipe_layer == pipe_layer)
network_directions += i
other.network_directions += turn(i, 180)
found = TRUE
break
if(found)
continue
for(var/obj/machinery/atmospherics/A in T)
if((A.piping_layer == pipe_layer) && (A.initialize_directions & turn(i, 180)))
network_directions += i
break
return network_directions
/// Directions should only ever have cardinals.
/obj/effect/map_helper/network_builder/atmos_pipe/build_network()
if(length(network_directions) <= 1)
return
var/obj/machinery/atmospherics/pipe/built
switch(length(network_directions))
if(2) //straight pipe
built = new /obj/machinery/atmospherics/pipe/simple(loc)
var/d1 = network_directions[1]
var/d2 = network_directions[2]
var/combined = d1 | d2
if(combined in GLOB.diagonals)
built.setDir(combined)
else
built.setDir(d1)
if(3) //manifold
var/list/missing = network_directions ^ GLOB.cardinals
missing = missing[1]
built = new /obj/machinery/atmospherics/pipe/manifold(loc)
built.setDir(missing)
if(4) //4 way manifold
built = new /obj/machinery/atmospherics/pipe/manifold4w(loc)
built.SetInitDirections()
built.on_construction(pipe_color, pipe_layer)
built.hide(!visible_pipes)
/obj/effect/map_helper/network_builder/atmos_pipe/distro
name = "distro line autobuilder"
pipe_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
pixel_y = -PIPING_LAYER_P_Y
pipe_color = rgb(130,43,255)
color = rgb(130,43,255)
/obj/effect/map_helper/network_builder/atmos_pipe/scrubbers
name = "scrubbers line autobuilder"
pipe_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
pipe_color = rgb(255,0,0)
color = rgb(255,0,0)
@@ -3,186 +3,110 @@
#define KNOT_FORCED 2
/// Automatically links on init to power cables and other cable builder helpers. Only supports cardinals.
/obj/effect/map_helper/network_builder/power_cable
/atom/movable/map_helper/network_builder/power_cable
name = "power line autobuilder"
icon_state = "powerlinebuilder"
base_type = /atom/movable/map_helper/network_builder/power_cable
color = "#ff0000"
/// Whether or not we forcefully make a knot
var/knot = NO_KNOT
/// cable color as from GLOB.cable_colors
var/cable_color = "red"
/obj/effect/map_helper/network_builder/power_cable/check_duplicates()
var/obj/structure/cable/C = locate() in loc
if(C)
return C
for(var/obj/effect/map_helper/network_builder/power_cable/other in loc)
if(other == src)
continue
return other
/// Scans directions, sets network_directions to have every direction that we can link to. If there's another power cable builder detected, make sure they know we're here by adding us to their cable directions list before we're deleted.
/obj/effect/map_helper/network_builder/power_cable/scan_directions()
var/turf/T
/atom/movable/map_helper/network_builder/power_cable/duplicates()
. = list()
for(var/atom/movable/map_helper/network_builder/power_cable/B in loc)
if(B == src)
continue
. += B
for(var/obj/structure/cable/C in loc)
. += C
/atom/movable/map_helper/network_builder/power_cable/scan()
. = NONE
for(var/i in GLOB.cardinal)
if(i in network_directions)
continue //we're already set, that means another builder set us.
T = get_step(loc, i)
if(!T)
continue
var/obj/effect/map_helper/network_builder/power_cable/other = locate() in T
if(other)
network_directions += i
other.network_directions += turn(i, 180)
var/turf/T = get_step(src, i)
if(locate(base_type) in T)
. |= i
continue
var/opp = turn(i, 180)
for(var/obj/structure/cable/C in T)
if(C.d1 == turn(i, 180) || C.d2 == turn(i, 180))
network_directions += i
if(C.d1 == opp || C.d2 == opp)
. |= i
continue
return network_directions
/// Directions should only ever have cardinals.
/obj/effect/map_helper/network_builder/power_cable/build_network()
if(!length(network_directions))
/atom/movable/map_helper/network_builder/power_cable/build()
if(!network_directions)
return
else if(length(network_directions) == 1)
new /obj/structure/cable(loc, cable_color, NONE, network_directions[1])
var/knot = KNOT_FORCED || (KNOT_AUTO && detect_knot())
if(knot)
for(var/i in GLOB.cardinal)
if(!(network_directions & i))
continue
new /obj/structure/cable(loc, capitalize(cable_color), 0, i, TRUE)
else
if(knot == KNOT_FORCED)
for(var/d in network_directions)
new /obj/structure/cable(loc, cable_color, NONE, d)
else
var/do_knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot())
var/dirs = length(network_directions)
for(var/i in 1 to dirs - 1)
var/li = (i == 1)? dirs : (i - 1)
var/d1 = network_directions[i]
var/d2 = network_directions[li]
if(d1 > d2) //this is ugly please help me
d1 = network_directions[li]
d2 = network_directions[i]
new /obj/structure/cable(loc, cable_color, d1, d2)
if(do_knot)
new /obj/structure/cable(loc, cable_color, NONE, network_directions[i])
do_knot = FALSE
var/last
for(var/i in GLOB.cardinal)
if(!(network_directions & i))
continue
if(isnull(last))
last = i
continue
new /obj/structure/cable(loc, capitalize(cable_color), last, i, TRUE)
last = i
/obj/effect/map_helper/network_builder/power_cable/proc/should_auto_knot()
return (locate(/obj/machinery/power/terminal) in loc)
/atom/movable/map_helper/network_builder/power_cable/proc/detect_knot()
return (locate(/obj/machinery/power)) in src
/obj/effect/map_helper/network_builder/power_cable/knot
/atom/movable/map_helper/network_builder/power_cable/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/auto
/atom/movable/map_helper/network_builder/power_cable/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
// Red
/obj/effect/map_helper/network_builder/power_cable/red
color = "#ff0000"
cable_color = "red"
#define WORK_HARDER_NOT_SMARTER \
WORK_SMARTER_NOT_HARDER("Red", COLOR_RED) \
WORK_SMARTER_NOT_HARDER("White", COLOR_WHITE) \
WORK_SMARTER_NOT_HARDER("Silver", COLOR_SILVER) \
WORK_SMARTER_NOT_HARDER("Gray", COLOR_GRAY) \
WORK_SMARTER_NOT_HARDER("Black", COLOR_BLACK) \
WORK_SMARTER_NOT_HARDER("Maroon", COLOR_MAROON) \
WORK_SMARTER_NOT_HARDER("Yellow", COLOR_YELLOW) \
WORK_SMARTER_NOT_HARDER("Olive", COLOR_OLIVE) \
WORK_SMARTER_NOT_HARDER("Lime", COLOR_LIME) \
WORK_SMARTER_NOT_HARDER("Green", COLOR_GREEN) \
WORK_SMARTER_NOT_HARDER("Cyan", COLOR_CYAN) \
WORK_SMARTER_NOT_HARDER("Teal", COLOR_TEAL) \
WORK_SMARTER_NOT_HARDER("Blue", COLOR_BLUE) \
WORK_SMARTER_NOT_HARDER("Navy", COLOR_NAVY) \
WORK_SMARTER_NOT_HARDER("Pink", COLOR_PINK) \
WORK_SMARTER_NOT_HARDER("Purple", COLOR_PURPLE) \
WORK_SMARTER_NOT_HARDER("Orange", COLOR_ORANGE) \
WORK_SMARTER_NOT_HARDER("Beige", COLOR_BEIGE) \
WORK_SMARTER_NOT_HARDER("Brown", COLOR_BROWN)
/obj/effect/map_helper/network_builder/power_cable/red/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
#define WORK_SMARTER_NOT_HARDER(c, v) \
/atom/movable/map_helper/network_builder/power_cable{ \
color = v; \
cable_color = c; \
} \
/atom/movable/map_helper/network_builder/power_cable/auto{ \
color = v; \
cable_color = c; \
} \
/atom/movable/map_helper/network_builder/power_cable/knot{ \
color = v; \
cable_color = c; \
}
/obj/effect/map_helper/network_builder/power_cable/red/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
WORK_HARDER_NOT_SMARTER // LMAO!
// White
/obj/effect/map_helper/network_builder/power_cable/white
color = "#ffffff"
cable_color = "white"
/obj/effect/map_helper/network_builder/power_cable/white/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/white/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
// Cyan
/obj/effect/map_helper/network_builder/power_cable/cyan
color = "#00ffff"
cable_color = "cyan"
/obj/effect/map_helper/network_builder/power_cable/cyan/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/cyan/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
// Orange
/obj/effect/map_helper/network_builder/power_cable/orange
color = "#ff8000"
cable_color = "orange"
/obj/effect/map_helper/network_builder/power_cable/orange/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/orange/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
// Pink
/obj/effect/map_helper/network_builder/power_cable/pink
color = "#ff3cc8"
cable_color = "pink"
/obj/effect/map_helper/network_builder/power_cable/pink/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/pink/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
// Blue
/obj/effect/map_helper/network_builder/power_cable/blue
color = "#1919c8"
cable_color = "blue"
/obj/effect/map_helper/network_builder/power_cable/blue/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/blue/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
// Green
/obj/effect/map_helper/network_builder/power_cable/green
color = "#00aa00"
cable_color = "green"
/obj/effect/map_helper/network_builder/power_cable/green/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/green/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
// Yellow
/obj/effect/map_helper/network_builder/power_cable/yellow
color = "#ffff00"
cable_color = "yellow"
/obj/effect/map_helper/network_builder/power_cable/yellow/knot
icon_state = "powerlinebuilderknot"
knot = KNOT_FORCED
/obj/effect/map_helper/network_builder/power_cable/yellow/auto
icon_state = "powerlinebuilderauto"
knot = KNOT_AUTO
#undef WORK_HARDER_NOT_SMARTER
#undef WORK_SMARTER_NOT_HARDER
#undef NO_KNOT
#undef KNOT_AUTO