mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-27 00:56:42 +01:00
Map Helpers Galore
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
//Landmarks and other helpers which speed up the mapping process and reduce the number of unique instances/subtypes of items/turf/ect
|
||||
/obj/effect/map_helper
|
||||
icon = 'icons/map/mapping_helpers.dmi'
|
||||
icon_state = ""
|
||||
var/late = FALSE
|
||||
|
||||
/obj/effect/map_helper/Initialize()
|
||||
..()
|
||||
return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL
|
||||
|
||||
/*
|
||||
|
||||
//airlock helpers
|
||||
/obj/effect/map_helper/airlock
|
||||
layer = DOOR_HELPER_LAYER
|
||||
|
||||
/obj/effect/map_helper/airlock/cyclelink_helper
|
||||
name = "airlock cyclelink helper"
|
||||
icon_state = "airlock_cyclelink_helper"
|
||||
|
||||
/obj/effect/map_helper/airlock/cyclelink_helper/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
log_mapping("[src] spawned outside of mapload!")
|
||||
return
|
||||
var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
|
||||
if(airlock)
|
||||
if(airlock.cyclelinkeddir)
|
||||
log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!")
|
||||
else
|
||||
airlock.cyclelinkeddir = dir
|
||||
else
|
||||
log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
|
||||
|
||||
|
||||
/obj/effect/map_helper/airlock/locked
|
||||
name = "airlock lock helper"
|
||||
icon_state = "airlock_locked_helper"
|
||||
|
||||
/obj/effect/map_helper/airlock/locked/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
log_mapping("[src] spawned outside of mapload!")
|
||||
return
|
||||
var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
|
||||
if(airlock)
|
||||
if(airlock.locked)
|
||||
log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!")
|
||||
else
|
||||
airlock.locked = TRUE
|
||||
else
|
||||
log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
|
||||
|
||||
/obj/effect/map_helper/airlock/unres
|
||||
name = "airlock unresctricted side helper"
|
||||
icon_state = "airlock_unres_helper"
|
||||
|
||||
/obj/effect/map_helper/airlock/unres/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
log_mapping("[src] spawned outside of mapload!")
|
||||
return
|
||||
var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc
|
||||
if(airlock)
|
||||
airlock.unres_sides ^= dir
|
||||
else
|
||||
log_mapping("[src] failed to find an airlock at [AREACOORD(src)]")
|
||||
|
||||
|
||||
//needs to do its thing before spawn_rivers() is called
|
||||
INITIALIZE_IMMEDIATE(/obj/effect/map_helper/no_lava)
|
||||
|
||||
/obj/effect/map_helper/no_lava
|
||||
icon_state = "no_lava"
|
||||
|
||||
/obj/effect/map_helper/no_lava/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
T.flags_1 |= NO_LAVA_GEN_1
|
||||
*/
|
||||
|
||||
//This helper applies components to things on the map directly.
|
||||
/obj/effect/map_helper/component_injector
|
||||
name = "Component Injector"
|
||||
late = TRUE
|
||||
var/target_type
|
||||
var/target_name
|
||||
var/component_type
|
||||
|
||||
//Late init so everything is likely ready and loaded (no warranty)
|
||||
/obj/effect/map_helper/component_injector/LateInitialize()
|
||||
if(!ispath(component_type,/datum/component))
|
||||
CRASH("Wrong component type in [type] - [component_type] is not a component")
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/atom/A in T.GetAllContents())
|
||||
if(A == src)
|
||||
continue
|
||||
if(target_name && A.name != target_name)
|
||||
continue
|
||||
if(target_type && !istype(A,target_type))
|
||||
continue
|
||||
var/cargs = build_args()
|
||||
A._AddComponent(cargs)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/effect/map_helper/component_injector/proc/build_args()
|
||||
return list(component_type)
|
||||
|
||||
/*
|
||||
/obj/effect/map_helper/component_injector/infective
|
||||
name = "Infective Injector"
|
||||
icon_state = "component_infective"
|
||||
component_type = /datum/component/infective
|
||||
var/disease_type
|
||||
|
||||
/obj/effect/map_helper/component_injector/infective/build_args()
|
||||
if(!ispath(disease_type,/datum/disease))
|
||||
CRASH("Wrong disease type passed in.")
|
||||
var/datum/disease/D = new disease_type()
|
||||
return list(component_type,D)
|
||||
*/
|
||||
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
Note that these have to be in the same /area that the controller is in for them to function.
|
||||
You still need to set the controller's "id_tag" to something unique.
|
||||
Any frequency works, it's self-setting, but it seems like people have decided 1380 for airlocks so maybe set that on the controller too.
|
||||
*/
|
||||
|
||||
/obj/effect/map_helper/airlock
|
||||
name = "use a subtype!"
|
||||
plane = 20 // I dunno just high.
|
||||
alpha = 170
|
||||
|
||||
// The controller we're wanting our device to use
|
||||
var/obj/machinery/embedded_controller/radio/my_controller
|
||||
var/my_controller_type = /obj/machinery/embedded_controller/radio/airlock
|
||||
// The device we're setting up
|
||||
var/my_device
|
||||
var/my_device_type
|
||||
// Most things have a radio tag of some sort that needs adjusting
|
||||
var/tag_addon
|
||||
|
||||
/obj/effect/map_helper/airlock/Initialize()
|
||||
..()
|
||||
my_controller = get_controller(get_area(src))
|
||||
my_device = locate(my_device_type) in get_turf(src)
|
||||
if(!my_device)
|
||||
to_world("<b><font color='red'>WARNING:</font><font color='black'>Airlock helper '[name]' couldn't find what it wanted at: X:[x] Y:[y] Z:[z]</font></b>")
|
||||
else if(!my_controller)
|
||||
to_world("<b><font color='red'>WARNING:</font><font color='black'>Airlock helper '[name]' couldn't find a controller at: X:[x] Y:[y] Z:[z]</font></b>")
|
||||
else if(!my_controller.id_tag)
|
||||
to_world("<b><font color='red'>WARNING:</font><font color='black'>Airlock helper '[name]' found a controller without an 'id_tag' set: X:[x] Y:[y] Z:[z]</font></b>")
|
||||
else
|
||||
setup()
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/map_helper/airlock/Destroy()
|
||||
my_controller = null
|
||||
my_device = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_helper/airlock/proc/get_controller(var/area/A)
|
||||
if(!A)
|
||||
return null
|
||||
|
||||
var/list/potentials = list()
|
||||
for(var/obj/O in A)
|
||||
if(istype(O, my_controller_type))
|
||||
potentials += O
|
||||
|
||||
//Couldn't find one
|
||||
if(!potentials.len)
|
||||
return null
|
||||
|
||||
//Only found one
|
||||
if(potentials.len == 1)
|
||||
return potentials[1]
|
||||
|
||||
//Gotta find closest
|
||||
var/closest = potentials[potentials.len]
|
||||
var/closest_dist = get_dist(src, closest)
|
||||
potentials.len--
|
||||
while(potentials.len)
|
||||
var/C = potentials[potentials.len]
|
||||
potentials.len--
|
||||
var/dist = get_dist(src, C)
|
||||
if(dist < closest_dist)
|
||||
closest_dist = dist
|
||||
closest = C
|
||||
|
||||
return closest
|
||||
|
||||
/obj/effect/map_helper/airlock/proc/setup()
|
||||
return // Stub for subtypes
|
||||
|
||||
|
||||
/*
|
||||
Doors
|
||||
*/
|
||||
/obj/effect/map_helper/airlock/door
|
||||
name = "use a subtype! - airlock door"
|
||||
my_device_type = /obj/machinery/door/airlock
|
||||
|
||||
/obj/effect/map_helper/airlock/door/setup()
|
||||
var/obj/machinery/door/airlock/my_airlock = my_device
|
||||
my_airlock.lock()
|
||||
my_airlock.id_tag = my_controller.id_tag + tag_addon
|
||||
my_airlock.frequency = my_controller.frequency
|
||||
my_airlock.set_frequency(my_controller.frequency)
|
||||
|
||||
/obj/effect/map_helper/airlock/door/ext_door
|
||||
name = "exterior airlock door"
|
||||
icon_state = "doorout"
|
||||
tag_addon = "_outer"
|
||||
|
||||
/obj/effect/map_helper/airlock/door/int_door
|
||||
name = "interior airlock door"
|
||||
icon_state = "doorin"
|
||||
tag_addon = "_inner"
|
||||
|
||||
/obj/effect/map_helper/airlock/door/simple
|
||||
name = "simple docking controller hatch"
|
||||
icon_state = "doorsimple"
|
||||
tag_addon = "_hatch"
|
||||
my_controller_type = /obj/machinery/embedded_controller/radio/simple_docking_controller
|
||||
|
||||
|
||||
/*
|
||||
Atmos
|
||||
*/
|
||||
/obj/effect/map_helper/airlock/atmos
|
||||
name = "use a subtype! - airlock pump"
|
||||
my_device_type = /obj/machinery/atmospherics/unary/vent_pump
|
||||
|
||||
/obj/effect/map_helper/airlock/atmos/setup()
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/my_pump = my_device
|
||||
my_pump.frequency = my_controller.frequency // Unlike doors, these set up their radios in atmos init, so they won't have gone before us.
|
||||
my_pump.id_tag = my_controller.id_tag + tag_addon
|
||||
|
||||
/obj/effect/map_helper/airlock/atmos/chamber_pump
|
||||
name = "chamber pump"
|
||||
icon_state = "pump"
|
||||
tag_addon = "_pump"
|
||||
|
||||
/obj/effect/map_helper/airlock/atmos/pump_out_internal
|
||||
name = "air dump intake"
|
||||
icon_state = "pumpdin"
|
||||
tag_addon = "_pump_out_internal"
|
||||
|
||||
/obj/effect/map_helper/airlock/atmos/pump_out_external
|
||||
name = "air dump output"
|
||||
icon_state = "pumpdout"
|
||||
tag_addon = "_pump_out_external"
|
||||
|
||||
|
||||
/*
|
||||
Sensors - did you know they function as buttons? You don't also need a button.
|
||||
*/
|
||||
/obj/effect/map_helper/airlock/sensor
|
||||
name = "use a subtype! - airlock sensor"
|
||||
my_device_type = /obj/machinery/airlock_sensor
|
||||
var/command
|
||||
|
||||
/obj/effect/map_helper/airlock/sensor/setup()
|
||||
var/obj/machinery/airlock_sensor/my_sensor = my_device
|
||||
my_sensor.id_tag = my_controller.id_tag + tag_addon
|
||||
my_sensor.frequency = my_controller.frequency
|
||||
my_sensor.set_frequency(my_controller.frequency)
|
||||
if(command)
|
||||
my_sensor.command = command
|
||||
|
||||
/obj/effect/map_helper/airlock/sensor/ext_sensor
|
||||
name = "exterior sensor"
|
||||
icon_state = "sensout"
|
||||
tag_addon = "_exterior_sensor"
|
||||
command = "cycle_exterior"
|
||||
|
||||
/obj/effect/map_helper/airlock/sensor/chamber_sensor
|
||||
name = "chamber sensor"
|
||||
icon_state = "sens"
|
||||
tag_addon = "_sensor"
|
||||
command = "cycle"
|
||||
|
||||
/obj/effect/map_helper/airlock/sensor/int_sensor
|
||||
name = "interior sensor"
|
||||
icon_state = "sensin"
|
||||
tag_addon = "_interior_sensor"
|
||||
command = "cycle_interior"
|
||||
|
||||
/*
|
||||
Buttons
|
||||
*/
|
||||
|
||||
/obj/effect/map_helper/airlock/button
|
||||
name = "use a subtype! - airlock button"
|
||||
my_device_type = /obj/machinery/access_button
|
||||
var/command
|
||||
|
||||
/obj/effect/map_helper/airlock/button/setup()
|
||||
var/obj/machinery/access_button/my_button = my_device
|
||||
my_button.master_tag = my_controller.id_tag
|
||||
my_button.frequency = my_controller.frequency
|
||||
my_button.set_frequency(my_controller.frequency)
|
||||
if(command)
|
||||
my_button.command = command
|
||||
|
||||
/obj/effect/map_helper/airlock/button/ext_button
|
||||
name = "exterior access button"
|
||||
icon_state = "buttout"
|
||||
command = "cycle_exterior"
|
||||
|
||||
/obj/effect/map_helper/airlock/button/int_button
|
||||
name = "interior access button"
|
||||
icon_state = "buttin"
|
||||
command = "cycle_interior"
|
||||
@@ -0,0 +1,82 @@
|
||||
/obj/effect/baseturf_helper //Set the baseturfs of every turf in the /area/ it is placed.
|
||||
name = "baseturf editor"
|
||||
icon = 'icons/effects/mapping_helpers.dmi'
|
||||
icon_state = ""
|
||||
|
||||
var/list/baseturf_to_replace
|
||||
var/baseturf
|
||||
|
||||
layer = POINT_LAYER
|
||||
|
||||
/obj/effect/baseturf_helper/Initialize()
|
||||
. = ..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/effect/baseturf_helper/LateInitialize()
|
||||
if(!baseturf_to_replace)
|
||||
baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom))
|
||||
else if(!length(baseturf_to_replace))
|
||||
baseturf_to_replace = list(baseturf_to_replace = TRUE)
|
||||
else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative
|
||||
var/list/formatted = list()
|
||||
for(var/i in baseturf_to_replace)
|
||||
formatted[i] = TRUE
|
||||
baseturf_to_replace = formatted
|
||||
|
||||
var/area/our_area = get_area(src)
|
||||
for(var/i in get_area_turfs(our_area, z))
|
||||
replace_baseturf(i)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing)
|
||||
var/list/baseturf_cache = thing.baseturfs
|
||||
if(length(baseturf_cache))
|
||||
for(var/i in baseturf_cache)
|
||||
if(baseturf_to_replace[i])
|
||||
baseturf_cache -= i
|
||||
if(!baseturf_cache.len)
|
||||
thing.assemble_baseturfs(baseturf)
|
||||
else
|
||||
thing.PlaceOnBottom(null, baseturf)
|
||||
else if(baseturf_to_replace[thing.baseturfs])
|
||||
thing.assemble_baseturfs(baseturf)
|
||||
else
|
||||
thing.PlaceOnBottom(null, baseturf)
|
||||
|
||||
/obj/effect/baseturf_helper/space
|
||||
name = "space baseturf editor"
|
||||
baseturf = /turf/open/space
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid
|
||||
name = "asteroid baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/airless
|
||||
name = "asteroid airless baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/airless
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/basalt
|
||||
name = "asteroid basalt baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/snow
|
||||
name = "asteroid snow baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/snow
|
||||
|
||||
/obj/effect/baseturf_helper/beach/sand
|
||||
name = "beach sand baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/beach/sand
|
||||
|
||||
/obj/effect/baseturf_helper/beach/water
|
||||
name = "water baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/beach/water
|
||||
|
||||
/obj/effect/baseturf_helper/lava
|
||||
name = "lava baseturf editor"
|
||||
baseturf = /turf/open/lava/smooth
|
||||
|
||||
/obj/effect/baseturf_helper/lava_land/surface
|
||||
name = "lavaland baseturf editor"
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
//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
|
||||
|
||||
icon = 'icons/map/mapping_helpers.dmi'
|
||||
|
||||
late = TRUE
|
||||
/// what directions we know connections are in
|
||||
var/list/network_directions = list()
|
||||
|
||||
/obj/effect/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(Debug2)
|
||||
custom_spawned = TRUE
|
||||
return INITIALIZE_HINT_NORMAL
|
||||
else
|
||||
return INITIALIZE_HINT_QDEL
|
||||
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)
|
||||
|
||||
/obj/effect/map_helper/network_builder/proc/check_duplicates()
|
||||
CRASH("Base abstract network builder tried to check duplicates.")
|
||||
|
||||
/obj/effect/map_helper/network_builder/proc/scan_directions()
|
||||
CRASH("Base abstract network builder tried to scan directions.")
|
||||
|
||||
/obj/effect/map_helper/network_builder/proc/build_network()
|
||||
CRASH("Base abstract network builder tried to build network.")
|
||||
@@ -0,0 +1,96 @@
|
||||
/* 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)
|
||||
@@ -0,0 +1,189 @@
|
||||
#define NO_KNOT 0
|
||||
#define KNOT_AUTO 1
|
||||
#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
|
||||
name = "power line autobuilder"
|
||||
icon_state = "powerlinebuilder"
|
||||
|
||||
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
|
||||
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)
|
||||
continue
|
||||
for(var/obj/structure/cable/C in T)
|
||||
if(C.d1 == turn(i, 180) || C.d2 == turn(i, 180))
|
||||
network_directions += 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))
|
||||
return
|
||||
else if(length(network_directions) == 1)
|
||||
new /obj/structure/cable(loc, cable_color, NONE, network_directions[1])
|
||||
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
|
||||
|
||||
/obj/effect/map_helper/network_builder/power_cable/proc/should_auto_knot()
|
||||
return (locate(/obj/machinery/power/terminal) in loc)
|
||||
|
||||
/obj/effect/map_helper/network_builder/power_cable/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/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"
|
||||
|
||||
/obj/effect/map_helper/network_builder/power_cable/red/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/map_helper/network_builder/power_cable/red/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// 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 NO_KNOT
|
||||
#undef KNOT_AUTO
|
||||
#undef KNOT_FORCED
|
||||
Reference in New Issue
Block a user