mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-23 02:06:55 +01:00
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:
co-authored by
fake_vm_user <fake_vm_user>
parent
98e27bf172
commit
12fc0e8adf
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user