From c5b95ff5d0174642c58d1a5c37364a0722f57070 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 18:22:43 -0700 Subject: [PATCH 01/14] Mapping helpers --- .../_mapping_helpers.dm} | 87 ----- .../mapping/mapping_helpers/baseturf.dm | 82 +++++ .../network_builder/_network_builder.dm | 38 ++ .../network_builder/atmos_pipe.dm | 159 ++++++++ .../network_builder/power_cables.dm | 97 +++++ code/modules/mapping/ruins.dm | 342 +++++++++--------- .../space_management/space_reservation.dm | 170 ++++----- icons/effects/mapping_helpers.dmi | Bin 5656 -> 6544 bytes tgstation.dme | 16 +- 9 files changed, 642 insertions(+), 349 deletions(-) rename code/modules/mapping/{mapping_helpers.dm => mapping_helpers/_mapping_helpers.dm} (59%) create mode 100644 code/modules/mapping/mapping_helpers/baseturf.dm create mode 100644 code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm create mode 100644 code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm create mode 100644 code/modules/mapping/mapping_helpers/network_builder/power_cables.dm diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm similarity index 59% rename from code/modules/mapping/mapping_helpers.dm rename to code/modules/mapping/mapping_helpers/_mapping_helpers.dm index a7f84fd71f..99184b1c3e 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers/_mapping_helpers.dm @@ -1,90 +1,4 @@ //Landmarks and other helpers which speed up the mapping process and reduce the number of unique instances/subtypes of items/turf/ect - - - -/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 - - /obj/effect/mapping_helpers icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" @@ -94,7 +8,6 @@ ..() return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL - //airlock helpers /obj/effect/mapping_helpers/airlock layer = DOOR_HELPER_LAYER diff --git a/code/modules/mapping/mapping_helpers/baseturf.dm b/code/modules/mapping/mapping_helpers/baseturf.dm new file mode 100644 index 0000000000..f4bd0d7c7f --- /dev/null +++ b/code/modules/mapping/mapping_helpers/baseturf.dm @@ -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 + diff --git a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm new file mode 100644 index 0000000000..b5cd470a32 --- /dev/null +++ b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm @@ -0,0 +1,38 @@ +//Builds networks like power cables/atmos lines/etc +//Just a holder parent type for now.. +/obj/effect/network_builder + /// set var to true to not del on lateload + var/custom_spawned = FALSE + + /// what directions we know connections are in + var/list/network_directions + +/obj/effect/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 + 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/network_builder/LateInitialize() + scan_directions() + build_network() + if(!custom_spawned) + qdel(src) + +/obj/effect/network_builder/proc/check_duplicates() + CRASH("Base abstract network builder tried to check duplicates.") + +/obj/effect/network_builder/proc/scan_directions() + CRASH("Base abstract network builder tried to scan directions.") + +/obj/effect/network_builder/proc/build_network() + CRASH("Base abstract network builder tried to build network.") diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm new file mode 100644 index 0000000000..1183ec0434 --- /dev/null +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -0,0 +1,159 @@ +#define NO_KNOT 0 +#define KNOT_AUTO 1 +#define KNOT_FORCED 2 + +/* 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/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/network_builder/atmos_pipe/check_duplicates() + for(var/obj/effect/network_builder/atmos_pipe/other in loc) + 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.pipe_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/network_builder/atmos_pipe/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/found = FALSE + for(var/obj/effect/network_builder/atmos_pipe/other in T) + if(other.pipe_layer == pipe_layer) + network_directions += i + LAZYADD(other.network_directions, turn(i, 180)) + found = TRUE + break + if(found) + continue + for(var/obj/machinery/atmospherics/A in T) + if((A.pipe_layer == pipe_layer) && (A.initialize_directions & i)) + network_directions += i + break + return network_directions + +/// Directions should only ever have cardinals. +/obj/effect/network_builder/atmos_pipe/build_network(list/directions = pipe_directions) + if(!length(directions) <= 1) + return + var/obj/machinery/atmospherics/pipe/built + switch(length(directions)) + if(2) //straight pipe + built = new /obj/machinery/atmospherics/simple(loc) + built.setDir(directions[1] | directions[2]) + if(3) //manifold + var/list/missing = directions ^ GLOB.cardinal + 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, piping_layer) + +/obj/item/pipe/wrench_act(mob/living/user, obj/item/wrench/W) + if(!isturf(loc)) + return TRUE + + add_fingerprint(user) + + var/obj/machinery/atmospherics/fakeA = pipe_type + var/flags = initial(fakeA.pipe_flags) + for(var/obj/machinery/atmospherics/M in loc) + if((M.pipe_flags & flags & PIPING_ONE_PER_TURF)) //Only one dense/requires density object per tile, eg connectors/cryo/heater/coolers. + to_chat(user, "Something is hogging the tile!") + return TRUE + if((M.piping_layer != piping_layer) && !((M.pipe_flags | flags) & PIPING_ALL_LAYER)) //don't continue if either pipe goes across all layers + continue + if(M.GetInitDirections() & SSair.get_init_dirs(pipe_type, fixed_dir())) // matches at least one direction on either type of pipe + to_chat(user, "There is already a pipe at that location!") + return TRUE + // no conflicts found + + var/obj/machinery/atmospherics/A = new pipe_type(loc) + build_pipe(A) + A.on_construction(color, piping_layer) + transfer_fingerprints_to(A) + + W.play_tool_sound(src) + user.visible_message( \ + "[user] fastens \the [src].", \ + "You fasten \the [src].", \ + "You hear ratcheting.") + + qdel(src) + +/obj/item/pipe/proc/build_pipe(obj/machinery/atmospherics/A) + A.setDir(fixed_dir()) + A.SetInitDirections() + + if(pipename) + A.name = pipename + if(A.on) + // Certain pre-mapped subtypes are on by default, we want to preserve + // every other aspect of these subtypes (name, pre-set filters, etc.) + // but they shouldn't turn on automatically when wrenched. + A.on = FALSE + +/obj/effect/network_builder/atmos_pipe/proc/spawn_wires(list/directions) + if(!length(directions)) + return + else if(length(directions) == 1) + var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) + if(knot) + var/dir = directions[1] + new /obj/structure/cable(loc, cable_color, NONE, directions[1]) + else + if(knot == KNOT_FORCED) + for(var/d in directions) + new /obj/structure/cable(loc, cable_color, NONE, d) + else + var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) + var/dirs = length(directions) + for(var/i in dirs) + var/li = i - 1 + if(li < 1) + li = dirs + li + new /obj/structure/cable(loc, cable_color, directions[i], directions[li]) + if(knot) + new /obj/structure/cable(loc, cable_color, NONE, directions[i]) + knot = FALSE + +/obj/effect/network_builder/atmos_pipe/distro + name = "distro line autobuilder" + piping_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/network_builder/atmos_pipe/scrubbers + name = "scrubbers line autobuilder" + piping_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) diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm new file mode 100644 index 0000000000..db89454349 --- /dev/null +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -0,0 +1,97 @@ +#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/network_builder/power_cable + name = "power line autobuilder" + icon_state = "powerlinebuilder" + + /// Whether or not we forcefully make a knot + var/knot = NO_KNOT + + /// cable color as from GLOB.cable_colors + var/cable_color = "red" + + color = "ff0000" + +/obj/effect/network_builder/power_cable/check_duplicates() + return (locate(/obj/structure/cable) in loc) || (locate(/obj/effect/network_builder/power_cable) in loc) + +/// 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/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/network_builder/power_cable/other = locate() in T + if(other) + network_directions += i + LAZYADD(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/network_builder/power_cable/build_network(list/directions = network_directions) + if(!length(directions)) + return + else if(length(directions) == 1) + var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) + if(knot) + var/dir = directions[1] + new /obj/structure/cable(loc, cable_color, NONE, directions[1]) + else + if(knot == KNOT_FORCED) + for(var/d in directions) + new /obj/structure/cable(loc, cable_color, NONE, d) + else + var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) + var/dirs = length(directions) + for(var/i in dirs) + var/li = i - 1 + if(li < 1) + li = dirs + li + new /obj/structure/cable(loc, cable_color, directions[i], directions[li]) + if(knot) + new /obj/structure/cable(loc, cable_color, NONE, directions[i]) + knot = FALSE + +/obj/effect/network_builder/power_cable/proc/should_auto_knot() + return (locate(/obj/machinery/terminal) in loc) + +/obj/effect/network_buidler/power_cable/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +#define AUTODEF_COLOR(hex, enum) \ +/obj/effect/network_builder/power_cable/##enum \ + color = #hex \ + cable_color = #enum \ +/obj/effect/network_builder/power_cable/knot/##enum \ + color = #hex \ + cable_color = #enum \ +/obj/effect/network_builder/power_cable/auto/##enum \ + color = #hex \ + cable_color = #enum + +AUTODEF_COLOR("#ff0000", "red") +AUTODEF_COLOR("#ffffff", "white") +AUTODEF_COLOR("#00ffff", "cyan") +AUTODEF_COLOR("#ff8000", "orange") +AUTODEF_COLOR("#ff3cc8", "pink") +AUTODEF_COLOR("#1919c8", "blue") +AUTODEF_COLOR("#00aa00", "green") +AUTODEF_COLOR("#ffff00", "yellow") + +#undef AUTODEF_COLOR diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 9c578badb1..d88c7543f0 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -1,171 +1,171 @@ -/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) - var/sanity = forced_turf ? 1 : PLACEMENT_TRIES - if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) - return place_on_isolated_level(z) - while(sanity > 0) - sanity-- - var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) - var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) - var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) - var/valid = TRUE - - for(var/turf/check in get_affected_turfs(central_turf,1)) - var/area/new_area = get_area(check) - if(!(istype(new_area, allowed_areas)) || check.flags_1 & NO_RUINS_1) - valid = FALSE - break - - if(!valid) - continue - - testing("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])") - - for(var/i in get_affected_turfs(central_turf, 1)) - var/turf/T = i - for(var/mob/living/simple_animal/monster in T) - qdel(monster) - for(var/obj/structure/flora/ash/plant in T) - qdel(plant) - - load(central_turf,centered = TRUE) - loaded++ - - for(var/turf/T in get_affected_turfs(central_turf, 1)) - T.flags_1 |= NO_RUINS_1 - - new /obj/effect/landmark/ruin(central_turf, src) - return central_turf - -/datum/map_template/ruin/proc/place_on_isolated_level(z) - var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. - if(!reservation) - return - var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) - load(placement) - loaded++ - for(var/turf/T in get_affected_turfs(placement)) - T.flags_1 |= NO_RUINS_1 - var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z) - new /obj/effect/landmark/ruin(center, src) - return center - -/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) - if(!z_levels || !z_levels.len) - WARNING("No Z levels provided - Not generating ruins") - return - - for(var/zl in z_levels) - var/turf/T = locate(1, 1, zl) - if(!T) - WARNING("Z level [zl] does not exist - Not generating ruins") - return - - var/list/ruins = potentialRuins.Copy() - - var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. - var/list/ruins_availible = list() //we can try these in the current pass - - //Set up the starting ruin list - for(var/key in ruins) - var/datum/map_template/ruin/R = ruins[key] - if(R.cost > budget) //Why would you do that - continue - if(R.always_place) - forced_ruins[R] = -1 - if(R.unpickable) - continue - ruins_availible[R] = R.placement_weight - - while(budget > 0 && (ruins_availible.len || forced_ruins.len)) - var/datum/map_template/ruin/current_pick - var/forced = FALSE - var/forced_z //If set we won't pick z level and use this one instead. - var/forced_turf //If set we place the ruin centered on the given turf - if(forced_ruins.len) //We have something we need to load right now, so just pick it - for(var/ruin in forced_ruins) - current_pick = ruin - if(isturf(forced_ruins[ruin])) - var/turf/T = forced_ruins[ruin] - forced_z = T.z //In case of chained ruins - forced_turf = T - else if(forced_ruins[ruin] > 0) //Load into designated z - forced_z = forced_ruins[ruin] - forced = TRUE - break - else //Otherwise just pick random one - current_pick = pickweight(ruins_availible) - - var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf - var/failed_to_place = TRUE - var/target_z = 0 - var/turf/placed_turf //Where the ruin ended up if we succeeded - outer: - while(placement_tries > 0) - placement_tries-- - target_z = pick(z_levels) - if(forced_z) - target_z = forced_z - if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists. - for(var/v in current_pick.always_spawn_with) - if(current_pick.always_spawn_with[v] == PLACE_BELOW) - var/turf/T = locate(1,1,target_z) - if(!SSmapping.get_turf_below(T)) - if(forced_z) - continue outer - else - break outer - - placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) - if(!placed_turf) - continue - else - failed_to_place = FALSE - break - - //That's done remove from priority even if it failed - if(forced) - //TODO : handle forced ruins with multiple variants - forced_ruins -= current_pick - forced = FALSE - - if(failed_to_place) - for(var/datum/map_template/ruin/R in ruins_availible) - if(R.id == current_pick.id) - ruins_availible -= R - log_world("Failed to place [current_pick.name] ruin.") - else - budget -= current_pick.cost - if(!current_pick.allow_duplicates) - for(var/datum/map_template/ruin/R in ruins_availible) - if(R.id == current_pick.id) - ruins_availible -= R - if(current_pick.never_spawn_with) - for(var/blacklisted_type in current_pick.never_spawn_with) - for(var/possible_exclusion in ruins_availible) - if(istype(possible_exclusion,blacklisted_type)) - ruins_availible -= possible_exclusion - if(current_pick.always_spawn_with) - for(var/v in current_pick.always_spawn_with) - for(var/ruin_name in SSmapping.ruins_templates) //Because we might want to add space templates as linked of lava templates. - var/datum/map_template/ruin/linked = SSmapping.ruins_templates[ruin_name] //why are these assoc, very annoying. - if(istype(linked,v)) - switch(current_pick.always_spawn_with[v]) - if(PLACE_SAME_Z) - forced_ruins[linked] = target_z //I guess you might want a chain somehow - if(PLACE_LAVA_RUIN) - forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) - if(PLACE_SPACE_RUIN) - forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) - if(PLACE_DEFAULT) - forced_ruins[linked] = -1 - if(PLACE_BELOW) - forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) - if(PLACE_ISOLATED) - forced_ruins[linked] = SSmapping.get_isolated_ruin_z() - - //Update the availible list - for(var/datum/map_template/ruin/R in ruins_availible) - if(R.cost > budget) - ruins_availible -= R - - log_world("Ruin loader finished with [budget] left to spend.") +/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) + var/sanity = forced_turf ? 1 : PLACEMENT_TRIES + if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) + return place_on_isolated_level(z) + while(sanity > 0) + sanity-- + var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) + var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) + var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) + var/valid = TRUE + + for(var/turf/check in get_affected_turfs(central_turf,1)) + var/area/new_area = get_area(check) + if(!(istype(new_area, allowed_areas)) || check.flags_1 & NO_RUINS_1) + valid = FALSE + break + + if(!valid) + continue + + testing("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])") + + for(var/i in get_affected_turfs(central_turf, 1)) + var/turf/T = i + for(var/mob/living/simple_animal/monster in T) + qdel(monster) + for(var/obj/structure/flora/ash/plant in T) + qdel(plant) + + load(central_turf,centered = TRUE) + loaded++ + + for(var/turf/T in get_affected_turfs(central_turf, 1)) + T.flags_1 |= NO_RUINS_1 + + new /obj/effect/landmark/ruin(central_turf, src) + return central_turf + +/datum/map_template/ruin/proc/place_on_isolated_level(z) + var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. + if(!reservation) + return + var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) + load(placement) + loaded++ + for(var/turf/T in get_affected_turfs(placement)) + T.flags_1 |= NO_RUINS_1 + var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z) + new /obj/effect/landmark/ruin(center, src) + return center + +/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) + if(!z_levels || !z_levels.len) + WARNING("No Z levels provided - Not generating ruins") + return + + for(var/zl in z_levels) + var/turf/T = locate(1, 1, zl) + if(!T) + WARNING("Z level [zl] does not exist - Not generating ruins") + return + + var/list/ruins = potentialRuins.Copy() + + var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. + var/list/ruins_availible = list() //we can try these in the current pass + + //Set up the starting ruin list + for(var/key in ruins) + var/datum/map_template/ruin/R = ruins[key] + if(R.cost > budget) //Why would you do that + continue + if(R.always_place) + forced_ruins[R] = -1 + if(R.unpickable) + continue + ruins_availible[R] = R.placement_weight + + while(budget > 0 && (ruins_availible.len || forced_ruins.len)) + var/datum/map_template/ruin/current_pick + var/forced = FALSE + var/forced_z //If set we won't pick z level and use this one instead. + var/forced_turf //If set we place the ruin centered on the given turf + if(forced_ruins.len) //We have something we need to load right now, so just pick it + for(var/ruin in forced_ruins) + current_pick = ruin + if(isturf(forced_ruins[ruin])) + var/turf/T = forced_ruins[ruin] + forced_z = T.z //In case of chained ruins + forced_turf = T + else if(forced_ruins[ruin] > 0) //Load into designated z + forced_z = forced_ruins[ruin] + forced = TRUE + break + else //Otherwise just pick random one + current_pick = pickweight(ruins_availible) + + var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf + var/failed_to_place = TRUE + var/target_z = 0 + var/turf/placed_turf //Where the ruin ended up if we succeeded + outer: + while(placement_tries > 0) + placement_tries-- + target_z = pick(z_levels) + if(forced_z) + target_z = forced_z + if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists. + for(var/v in current_pick.always_spawn_with) + if(current_pick.always_spawn_with[v] == PLACE_BELOW) + var/turf/T = locate(1,1,target_z) + if(!SSmapping.get_turf_below(T)) + if(forced_z) + continue outer + else + break outer + + placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) + if(!placed_turf) + continue + else + failed_to_place = FALSE + break + + //That's done remove from priority even if it failed + if(forced) + //TODO : handle forced ruins with multiple variants + forced_ruins -= current_pick + forced = FALSE + + if(failed_to_place) + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.id == current_pick.id) + ruins_availible -= R + log_world("Failed to place [current_pick.name] ruin.") + else + budget -= current_pick.cost + if(!current_pick.allow_duplicates) + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.id == current_pick.id) + ruins_availible -= R + if(current_pick.never_spawn_with) + for(var/blacklisted_type in current_pick.never_spawn_with) + for(var/possible_exclusion in ruins_availible) + if(istype(possible_exclusion,blacklisted_type)) + ruins_availible -= possible_exclusion + if(current_pick.always_spawn_with) + for(var/v in current_pick.always_spawn_with) + for(var/ruin_name in SSmapping.ruins_templates) //Because we might want to add space templates as linked of lava templates. + var/datum/map_template/ruin/linked = SSmapping.ruins_templates[ruin_name] //why are these assoc, very annoying. + if(istype(linked,v)) + switch(current_pick.always_spawn_with[v]) + if(PLACE_SAME_Z) + forced_ruins[linked] = target_z //I guess you might want a chain somehow + if(PLACE_LAVA_RUIN) + forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) + if(PLACE_SPACE_RUIN) + forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) + if(PLACE_DEFAULT) + forced_ruins[linked] = -1 + if(PLACE_BELOW) + forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + if(PLACE_ISOLATED) + forced_ruins[linked] = SSmapping.get_isolated_ruin_z() + + //Update the availible list + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.cost > budget) + ruins_availible -= R + + log_world("Ruin loader finished with [budget] left to spend.") diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index b514796bc5..43fe69d633 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -1,85 +1,85 @@ - -//Yes, they can only be rectangular. -//Yes, I'm sorry. -/datum/turf_reservation - var/list/reserved_turfs = list() - var/width = 0 - var/height = 0 - var/bottom_left_coords[3] - var/top_right_coords[3] - var/wipe_reservation_on_release = TRUE - var/turf_type = /turf/open/space - var/borderturf - -/datum/turf_reservation/transit - turf_type = /turf/open/space/transit - borderturf = /turf/open/space/transit/border - -/datum/turf_reservation/proc/Release() - var/v = reserved_turfs.Copy() - for(var/i in reserved_turfs) - reserved_turfs -= i - SSmapping.used_turfs -= i - SSmapping.reserve_turfs(v) - -/datum/turf_reservation/transit/Release() - for(var/turf/open/space/transit/T in reserved_turfs) - for(var/atom/movable/AM in T) - T.throw_atom(AM) - . = ..() - -/datum/turf_reservation/proc/Reserve(width, height, zlevel) - if(width > world.maxx || height > world.maxy || width < 1 || height < 1) - return FALSE - var/list/avail = SSmapping.unused_turfs["[zlevel]"] - var/turf/BL - var/turf/TR - var/list/turf/final = list() - var/passing = FALSE - for(var/i in avail) - CHECK_TICK - BL = i - if(!(BL.flags_1 & UNUSED_RESERVATION_TURF_1)) - continue - if(BL.x + width > world.maxx || BL.y + height > world.maxy) - continue - TR = locate(BL.x + width - 1, BL.y + height - 1, BL.z) - if(!(TR.flags_1 & UNUSED_RESERVATION_TURF_1)) - continue - final = block(BL, TR) - if(!final) - continue - passing = TRUE - for(var/I in final) - var/turf/checking = I - if(!(checking.flags_1 & UNUSED_RESERVATION_TURF_1)) - passing = FALSE - break - if(!passing) - continue - break - if(!passing || !istype(BL) || !istype(TR)) - return FALSE - bottom_left_coords = list(BL.x, BL.y, BL.z) - top_right_coords = list(TR.x, TR.y, TR.z) - for(var/i in final) - var/turf/T = i - reserved_turfs |= T - T.flags_1 &= ~UNUSED_RESERVATION_TURF_1 - SSmapping.unused_turfs["[T.z]"] -= T - SSmapping.used_turfs[T] = src - if(borderturf && (T.x == BL.x || T.x == TR.x || T.y == BL.y || T.y == TR.y)) - T.ChangeTurf(borderturf, borderturf) - else - T.ChangeTurf(turf_type, turf_type) - src.width = width - src.height = height - return TRUE - -/datum/turf_reservation/New() - LAZYADD(SSmapping.turf_reservations, src) - -/datum/turf_reservation/Destroy() - Release() - LAZYREMOVE(SSmapping.turf_reservations, src) - return ..() + +//Yes, they can only be rectangular. +//Yes, I'm sorry. +/datum/turf_reservation + var/list/reserved_turfs = list() + var/width = 0 + var/height = 0 + var/bottom_left_coords[3] + var/top_right_coords[3] + var/wipe_reservation_on_release = TRUE + var/turf_type = /turf/open/space + var/borderturf + +/datum/turf_reservation/transit + turf_type = /turf/open/space/transit + borderturf = /turf/open/space/transit/border + +/datum/turf_reservation/proc/Release() + var/v = reserved_turfs.Copy() + for(var/i in reserved_turfs) + reserved_turfs -= i + SSmapping.used_turfs -= i + SSmapping.reserve_turfs(v) + +/datum/turf_reservation/transit/Release() + for(var/turf/open/space/transit/T in reserved_turfs) + for(var/atom/movable/AM in T) + T.throw_atom(AM) + . = ..() + +/datum/turf_reservation/proc/Reserve(width, height, zlevel) + if(width > world.maxx || height > world.maxy || width < 1 || height < 1) + return FALSE + var/list/avail = SSmapping.unused_turfs["[zlevel]"] + var/turf/BL + var/turf/TR + var/list/turf/final = list() + var/passing = FALSE + for(var/i in avail) + CHECK_TICK + BL = i + if(!(BL.flags_1 & UNUSED_RESERVATION_TURF_1)) + continue + if(BL.x + width > world.maxx || BL.y + height > world.maxy) + continue + TR = locate(BL.x + width - 1, BL.y + height - 1, BL.z) + if(!(TR.flags_1 & UNUSED_RESERVATION_TURF_1)) + continue + final = block(BL, TR) + if(!final) + continue + passing = TRUE + for(var/I in final) + var/turf/checking = I + if(!(checking.flags_1 & UNUSED_RESERVATION_TURF_1)) + passing = FALSE + break + if(!passing) + continue + break + if(!passing || !istype(BL) || !istype(TR)) + return FALSE + bottom_left_coords = list(BL.x, BL.y, BL.z) + top_right_coords = list(TR.x, TR.y, TR.z) + for(var/i in final) + var/turf/T = i + reserved_turfs |= T + T.flags_1 &= ~UNUSED_RESERVATION_TURF_1 + SSmapping.unused_turfs["[T.z]"] -= T + SSmapping.used_turfs[T] = src + if(borderturf && (T.x == BL.x || T.x == TR.x || T.y == BL.y || T.y == TR.y)) + T.ChangeTurf(borderturf, borderturf) + else + T.ChangeTurf(turf_type, turf_type) + src.width = width + src.height = height + return TRUE + +/datum/turf_reservation/New() + LAZYADD(SSmapping.turf_reservations, src) + +/datum/turf_reservation/Destroy() + Release() + LAZYREMOVE(SSmapping.turf_reservations, src) + return ..() diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index dec83046b9112f1bcfbca17c0d6ac10a6e24ba62..037c1aa66090af6a10b89c422b3e00be0c0da471 100644 GIT binary patch literal 6544 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 KA*5W>CggvOG2$2i literal 5656 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 N-d$s@QVoaD{{gL08sGo` diff --git a/tgstation.dme b/tgstation.dme index 994c6af817..36bc39d902 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -800,11 +800,11 @@ #include "code\game\objects\effects\decals\decal.dm" #include "code\game\objects\effects\decals\misc.dm" #include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\cleanable\aliens.dm" -#include "code\game\objects\effects\decals\cleanable\gibs.dm" -#include "code\game\objects\effects\decals\cleanable\humans.dm" -#include "code\game\objects\effects\decals\cleanable\misc.dm" -#include "code\game\objects\effects\decals\cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\gibs.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" #include "code\game\objects\effects\decals\turfdecal\dirt.dm" #include "code\game\objects\effects\decals\turfdecal\markings.dm" #include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm" @@ -2010,11 +2010,15 @@ #include "code\modules\lighting\lighting_turf.dm" #include "code\modules\mapping\dmm_suite.dm" #include "code\modules\mapping\map_template.dm" -#include "code\modules\mapping\mapping_helpers.dm" #include "code\modules\mapping\preloader.dm" #include "code\modules\mapping\reader.dm" #include "code\modules\mapping\ruins.dm" #include "code\modules\mapping\verify.dm" +#include "code\modules\mapping\mapping_helpers\_mapping_helpers.dm" +#include "code\modules\mapping\mapping_helpers\baseturf.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\_network_builder.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\atmos_pipe.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\power_cables.dm" #include "code\modules\mapping\space_management\multiz_helpers.dm" #include "code\modules\mapping\space_management\space_level.dm" #include "code\modules\mapping\space_management\space_reservation.dm" From 8f7460ff96da7cd6a4e465e674b419985ade634c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 18:24:13 -0700 Subject: [PATCH 02/14] definemania --- .../network_builder/power_cables.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index db89454349..930506c96f 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -85,13 +85,13 @@ color = #hex \ cable_color = #enum -AUTODEF_COLOR("#ff0000", "red") -AUTODEF_COLOR("#ffffff", "white") -AUTODEF_COLOR("#00ffff", "cyan") -AUTODEF_COLOR("#ff8000", "orange") -AUTODEF_COLOR("#ff3cc8", "pink") -AUTODEF_COLOR("#1919c8", "blue") -AUTODEF_COLOR("#00aa00", "green") -AUTODEF_COLOR("#ffff00", "yellow") +AUTODEF_COLOR("#ff0000", red) +AUTODEF_COLOR("#ffffff", white) +AUTODEF_COLOR("#00ffff", cyan) +AUTODEF_COLOR("#ff8000", orange) +AUTODEF_COLOR("#ff3cc8", pink) +AUTODEF_COLOR("#1919c8", blue) +AUTODEF_COLOR("#00aa00", green) +AUTODEF_COLOR("#ffff00", yellow) #undef AUTODEF_COLOR From 2a4e2204c584cac6a5ea146be0364210fe76d5fd Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 18:29:45 -0700 Subject: [PATCH 03/14] no definemania then.. --- .../network_builder/power_cables.dm | 120 +++++++++++++++--- 1 file changed, 101 insertions(+), 19 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index 930506c96f..a01d345f05 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -74,24 +74,106 @@ icon_state = "powerlinebuilderauto" knot = KNOT_AUTO -#define AUTODEF_COLOR(hex, enum) \ -/obj/effect/network_builder/power_cable/##enum \ - color = #hex \ - cable_color = #enum \ -/obj/effect/network_builder/power_cable/knot/##enum \ - color = #hex \ - cable_color = #enum \ -/obj/effect/network_builder/power_cable/auto/##enum \ - color = #hex \ - cable_color = #enum +// Red +/obj/effect/network_builder/power_cable/red + color = "#ff0000" + cable_color = "red" -AUTODEF_COLOR("#ff0000", red) -AUTODEF_COLOR("#ffffff", white) -AUTODEF_COLOR("#00ffff", cyan) -AUTODEF_COLOR("#ff8000", orange) -AUTODEF_COLOR("#ff3cc8", pink) -AUTODEF_COLOR("#1919c8", blue) -AUTODEF_COLOR("#00aa00", green) -AUTODEF_COLOR("#ffff00", yellow) +/obj/effect/network_builder/power_cable/red/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED -#undef AUTODEF_COLOR +/obj/effect/network_builder/power_cable/red/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// White +/obj/effect/network_builder/power_cable/white + color = "#ffffff" + cable_color = "white" + +/obj/effect/network_builder/power_cable/white/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/white/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Cyan +/obj/effect/network_builder/power_cable/cyan + color = "#00ffff" + cable_color = "cyan" + +/obj/effect/network_builder/power_cable/cyan/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/cyan/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Orange +/obj/effect/network_builder/power_cable/orange + color = "#ff8000" + cable_color = "orange" + +/obj/effect/network_builder/power_cable/orange/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/orange/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Pink +/obj/effect/network_builder/power_cable/pink + color = "#ff3cc8" + cable_color = "pink" + +/obj/effect/network_builder/power_cable/pink/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/pink/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Blue +/obj/effect/network_builder/power_cable/blue + color = "#1919c8" + cable_color = "blue" + +/obj/effect/network_builder/power_cable/blue/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/blue/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Green +/obj/effect/network_builder/power_cable/green + color = "#00aa00" + cable_color = "green" + +/obj/effect/network_builder/power_cable/green/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/green/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO + +// Yellow +/obj/effect/network_builder/power_cable/yellow + color = "#ffff00" + cable_color = "yellow" + +/obj/effect/network_builder/power_cable/yellow/knot + icon_state = "powerlinebuilderknot" + knot = KNOT_FORCED + +/obj/effect/network_builder/power_cable/yellow/auto + icon_state = "powerlinebuilderauto" + knot = KNOT_AUTO \ No newline at end of file From 6c2c9008c09df4f4ab79e71454fbca0af995ee83 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 18:30:48 -0700 Subject: [PATCH 04/14] more dmemania --- tgstation.dme | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index 7d64b2ce7f..bcdf92e752 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -800,11 +800,11 @@ #include "code\game\objects\effects\decals\decal.dm" #include "code\game\objects\effects\decals\misc.dm" #include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\cleanable\aliens.dm" -#include "code\game\objects\effects\decals\cleanable\gibs.dm" -#include "code\game\objects\effects\decals\cleanable\humans.dm" -#include "code\game\objects\effects\decals\cleanable\misc.dm" -#include "code\game\objects\effects\decals\cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\gibs.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" #include "code\game\objects\effects\decals\turfdecal\dirt.dm" #include "code\game\objects\effects\decals\turfdecal\markings.dm" #include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm" @@ -2012,11 +2012,15 @@ #include "code\modules\lighting\lighting_turf.dm" #include "code\modules\mapping\dmm_suite.dm" #include "code\modules\mapping\map_template.dm" -#include "code\modules\mapping\mapping_helpers.dm" #include "code\modules\mapping\preloader.dm" #include "code\modules\mapping\reader.dm" #include "code\modules\mapping\ruins.dm" #include "code\modules\mapping\verify.dm" +#include "code\modules\mapping\mapping_helpers\_mapping_helpers.dm" +#include "code\modules\mapping\mapping_helpers\baseturf.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\_network_builder.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\atmos_pipe.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\power_cables.dm" #include "code\modules\mapping\space_management\multiz_helpers.dm" #include "code\modules\mapping\space_management\space_level.dm" #include "code\modules\mapping\space_management\space_reservation.dm" From e8d8d32a3306af98be0626a95c6135fe96105e64 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 18:34:16 -0700 Subject: [PATCH 05/14] ree --- .../network_builder/atmos_pipe.dm | 68 ------------------- .../network_builder/power_cables.dm | 10 +-- 2 files changed, 5 insertions(+), 73 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 1183ec0434..15097faedd 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -74,74 +74,6 @@ built.SetInitDirections() built.on_construction(pipe_color, piping_layer) -/obj/item/pipe/wrench_act(mob/living/user, obj/item/wrench/W) - if(!isturf(loc)) - return TRUE - - add_fingerprint(user) - - var/obj/machinery/atmospherics/fakeA = pipe_type - var/flags = initial(fakeA.pipe_flags) - for(var/obj/machinery/atmospherics/M in loc) - if((M.pipe_flags & flags & PIPING_ONE_PER_TURF)) //Only one dense/requires density object per tile, eg connectors/cryo/heater/coolers. - to_chat(user, "Something is hogging the tile!") - return TRUE - if((M.piping_layer != piping_layer) && !((M.pipe_flags | flags) & PIPING_ALL_LAYER)) //don't continue if either pipe goes across all layers - continue - if(M.GetInitDirections() & SSair.get_init_dirs(pipe_type, fixed_dir())) // matches at least one direction on either type of pipe - to_chat(user, "There is already a pipe at that location!") - return TRUE - // no conflicts found - - var/obj/machinery/atmospherics/A = new pipe_type(loc) - build_pipe(A) - A.on_construction(color, piping_layer) - transfer_fingerprints_to(A) - - W.play_tool_sound(src) - user.visible_message( \ - "[user] fastens \the [src].", \ - "You fasten \the [src].", \ - "You hear ratcheting.") - - qdel(src) - -/obj/item/pipe/proc/build_pipe(obj/machinery/atmospherics/A) - A.setDir(fixed_dir()) - A.SetInitDirections() - - if(pipename) - A.name = pipename - if(A.on) - // Certain pre-mapped subtypes are on by default, we want to preserve - // every other aspect of these subtypes (name, pre-set filters, etc.) - // but they shouldn't turn on automatically when wrenched. - A.on = FALSE - -/obj/effect/network_builder/atmos_pipe/proc/spawn_wires(list/directions) - if(!length(directions)) - return - else if(length(directions) == 1) - var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) - if(knot) - var/dir = directions[1] - new /obj/structure/cable(loc, cable_color, NONE, directions[1]) - else - if(knot == KNOT_FORCED) - for(var/d in directions) - new /obj/structure/cable(loc, cable_color, NONE, d) - else - var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) - var/dirs = length(directions) - for(var/i in dirs) - var/li = i - 1 - if(li < 1) - li = dirs + li - new /obj/structure/cable(loc, cable_color, directions[i], directions[li]) - if(knot) - new /obj/structure/cable(loc, cable_color, NONE, directions[i]) - knot = FALSE - /obj/effect/network_builder/atmos_pipe/distro name = "distro line autobuilder" piping_layer = PIPING_LAYER_MIN diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index a01d345f05..48b458aef4 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -43,8 +43,8 @@ if(!length(directions)) return else if(length(directions) == 1) - var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) - if(knot) + var/do_knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) + if(do_knot) var/dir = directions[1] new /obj/structure/cable(loc, cable_color, NONE, directions[1]) else @@ -52,16 +52,16 @@ for(var/d in directions) new /obj/structure/cable(loc, cable_color, NONE, d) else - var/knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) + var/do_knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) var/dirs = length(directions) for(var/i in dirs) var/li = i - 1 if(li < 1) li = dirs + li new /obj/structure/cable(loc, cable_color, directions[i], directions[li]) - if(knot) + if(do_knot) new /obj/structure/cable(loc, cable_color, NONE, directions[i]) - knot = FALSE + do_knot = FALSE /obj/effect/network_builder/power_cable/proc/should_auto_knot() return (locate(/obj/machinery/terminal) in loc) From c710c332e404143ac6f7878e128e5f0433519ec3 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 18:37:09 -0700 Subject: [PATCH 06/14] compile --- .../network_builder/atmos_pipe.dm | 16 ++++++++-------- .../network_builder/power_cables.dm | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 15097faedd..8366cad4d9 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -27,14 +27,14 @@ for(var/obj/machinery/atmospherics/A in loc) if(A.pipe_flags & PIPING_ALL_LAYER) return A - if(A.pipe_layer == pipe_layer) + 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/network_builder/atmos_pipe/scan_directions() var/turf/T - for(var/i in GLOB.cardinal) + 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) @@ -50,7 +50,7 @@ if(found) continue for(var/obj/machinery/atmospherics/A in T) - if((A.pipe_layer == pipe_layer) && (A.initialize_directions & i)) + if((A.piping_layer == pipe_layer) && (A.initialize_directions & i)) network_directions += i break return network_directions @@ -65,18 +65,18 @@ built = new /obj/machinery/atmospherics/simple(loc) built.setDir(directions[1] | directions[2]) if(3) //manifold - var/list/missing = directions ^ GLOB.cardinal + var/list/missing = 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, piping_layer) + built.SetInitDirections() + built.on_construction(pipe_color, piping_layer) /obj/effect/network_builder/atmos_pipe/distro name = "distro line autobuilder" - piping_layer = PIPING_LAYER_MIN + pipe_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X pixel_y = -PIPING_LAYER_P_Y pipe_color = rgb(130,43,255) @@ -84,7 +84,7 @@ /obj/effect/network_builder/atmos_pipe/scrubbers name = "scrubbers line autobuilder" - piping_layer = PIPING_LAYER_MAX + pipe_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y pipe_color = rgb(255,0,0) diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index 48b458aef4..66162446f1 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -7,13 +7,14 @@ 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" - color = "ff0000" /obj/effect/network_builder/power_cable/check_duplicates() return (locate(/obj/structure/cable) in loc) || (locate(/obj/effect/network_builder/power_cable) in loc) From b42de8d4572a5483193790cdd24b0535b12684ed Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 18:49:29 -0700 Subject: [PATCH 07/14] compile --- .../mapping/mapping_helpers/network_builder/atmos_pipe.dm | 6 +++--- .../mapping_helpers/network_builder/power_cables.dm | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 8366cad4d9..3c7bcc3bb0 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -56,13 +56,13 @@ return network_directions /// Directions should only ever have cardinals. -/obj/effect/network_builder/atmos_pipe/build_network(list/directions = pipe_directions) +/obj/effect/network_builder/atmos_pipe/build_network(list/directions = network_directions) if(!length(directions) <= 1) return var/obj/machinery/atmospherics/pipe/built switch(length(directions)) if(2) //straight pipe - built = new /obj/machinery/atmospherics/simple(loc) + built = new /obj/machinery/atmospherics/pipe/simple(loc) built.setDir(directions[1] | directions[2]) if(3) //manifold var/list/missing = directions ^ GLOB.cardinals @@ -72,7 +72,7 @@ if(4) //4 way manifold built = new /obj/machinery/atmospherics/pipe/manifold4w(loc) built.SetInitDirections() - built.on_construction(pipe_color, piping_layer) + built.on_construction(pipe_color, pipe_layer) /obj/effect/network_builder/atmos_pipe/distro name = "distro line autobuilder" diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index 66162446f1..f6da49c255 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -22,7 +22,7 @@ /// 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/network_builder/power_cable/scan_directions() var/turf/T - for(var/i in GLOB.cardinal) + 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) @@ -46,7 +46,6 @@ else if(length(directions) == 1) var/do_knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) if(do_knot) - var/dir = directions[1] new /obj/structure/cable(loc, cable_color, NONE, directions[1]) else if(knot == KNOT_FORCED) @@ -65,9 +64,9 @@ do_knot = FALSE /obj/effect/network_builder/power_cable/proc/should_auto_knot() - return (locate(/obj/machinery/terminal) in loc) + return (locate(/obj/machinery/power/terminal) in loc) -/obj/effect/network_buidler/power_cable/knot +/obj/effect/network_builder/power_cable/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED From 4f665930ccbb9834e5e612f77b7dbeaf2d359b5f Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 19:32:38 -0700 Subject: [PATCH 08/14] a a --- .../network_builder/_network_builder.dm | 14 ++-- .../network_builder/atmos_pipe.dm | 18 +++-- .../network_builder/power_cables.dm | 72 ++++++++++-------- icons/effects/mapping_helpers.dmi | Bin 6544 -> 6878 bytes tgstation.dme | 11 +-- 5 files changed, 63 insertions(+), 52 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm index b5cd470a32..585e05bd57 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm @@ -1,13 +1,15 @@ //Builds networks like power cables/atmos lines/etc //Just a holder parent type for now.. -/obj/effect/network_builder +/obj/effect/mapping_helpers/network_builder /// set var to true to not del on lateload var/custom_spawned = FALSE + icon = 'icons/effects/mapping_helpers.dmi' + /// what directions we know connections are in var/list/network_directions -/obj/effect/network_builder/Initialize(mapload) +/obj/effect/mapping_helpers/network_builder/Initialize(mapload) . = ..() var/conflict = check_duplicates() if(conflict) @@ -22,17 +24,17 @@ 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/network_builder/LateInitialize() +/obj/effect/mapping_helpers/network_builder/LateInitialize() scan_directions() build_network() if(!custom_spawned) qdel(src) -/obj/effect/network_builder/proc/check_duplicates() +/obj/effect/mapping_helpers/network_builder/proc/check_duplicates() CRASH("Base abstract network builder tried to check duplicates.") -/obj/effect/network_builder/proc/scan_directions() +/obj/effect/mapping_helpers/network_builder/proc/scan_directions() CRASH("Base abstract network builder tried to scan directions.") -/obj/effect/network_builder/proc/build_network() +/obj/effect/mapping_helpers/network_builder/proc/build_network() CRASH("Base abstract network builder tried to build network.") diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 3c7bcc3bb0..0c39e517b3 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -5,7 +5,7 @@ /* 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/network_builder/atmos_pipe +/obj/effect/mapping_helpers/network_builder/atmos_pipe name = "atmos pipe autobuilder" icon_state = "atmospipebuilder" @@ -20,8 +20,10 @@ color = null -/obj/effect/network_builder/atmos_pipe/check_duplicates() - for(var/obj/effect/network_builder/atmos_pipe/other in loc) +/obj/effect/mapping_helpers/network_builder/atmos_pipe/check_duplicates() + for(var/obj/effect/mapping_helpers/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) @@ -32,7 +34,7 @@ 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/network_builder/atmos_pipe/scan_directions() +/obj/effect/mapping_helpers/network_builder/atmos_pipe/scan_directions() var/turf/T for(var/i in GLOB.cardinals) if(i in network_directions) @@ -41,7 +43,7 @@ if(!T) continue var/found = FALSE - for(var/obj/effect/network_builder/atmos_pipe/other in T) + for(var/obj/effect/mapping_helpers/network_builder/atmos_pipe/other in T) if(other.pipe_layer == pipe_layer) network_directions += i LAZYADD(other.network_directions, turn(i, 180)) @@ -56,7 +58,7 @@ return network_directions /// Directions should only ever have cardinals. -/obj/effect/network_builder/atmos_pipe/build_network(list/directions = network_directions) +/obj/effect/mapping_helpers/network_builder/atmos_pipe/build_network(list/directions = network_directions) if(!length(directions) <= 1) return var/obj/machinery/atmospherics/pipe/built @@ -74,7 +76,7 @@ built.SetInitDirections() built.on_construction(pipe_color, pipe_layer) -/obj/effect/network_builder/atmos_pipe/distro +/obj/effect/mapping_helpers/network_builder/atmos_pipe/distro name = "distro line autobuilder" pipe_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -82,7 +84,7 @@ pipe_color = rgb(130,43,255) color = rgb(130,43,255) -/obj/effect/network_builder/atmos_pipe/scrubbers +/obj/effect/mapping_helpers/network_builder/atmos_pipe/scrubbers name = "scrubbers line autobuilder" pipe_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index f6da49c255..419004468a 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -3,7 +3,7 @@ #define KNOT_FORCED 2 /// Automatically links on init to power cables and other cable builder helpers. Only supports cardinals. -/obj/effect/network_builder/power_cable +/obj/effect/mapping_helpers/network_builder/power_cable name = "power line autobuilder" icon_state = "powerlinebuilder" @@ -16,11 +16,17 @@ var/cable_color = "red" -/obj/effect/network_builder/power_cable/check_duplicates() - return (locate(/obj/structure/cable) in loc) || (locate(/obj/effect/network_builder/power_cable) in loc) +/obj/effect/mapping_helpers/network_builder/power_cable/check_duplicates() + var/obj/structure/cable/C = locate() in loc + if(C) + return C + for(var/obj/effect/mapping_helpers/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/network_builder/power_cable/scan_directions() +/obj/effect/mapping_helpers/network_builder/power_cable/scan_directions() var/turf/T for(var/i in GLOB.cardinals) if(i in network_directions) @@ -28,7 +34,7 @@ T = get_step(loc, i) if(!T) continue - var/obj/effect/network_builder/power_cable/other = locate() in T + var/obj/effect/mapping_helpers/network_builder/power_cable/other = locate() in T if(other) network_directions += i LAZYADD(other.network_directions, turn(i, 180)) @@ -40,7 +46,7 @@ return network_directions /// Directions should only ever have cardinals. -/obj/effect/network_builder/power_cable/build_network(list/directions = network_directions) +/obj/effect/mapping_helpers/network_builder/power_cable/build_network(list/directions = network_directions) if(!length(directions)) return else if(length(directions) == 1) @@ -63,117 +69,117 @@ new /obj/structure/cable(loc, cable_color, NONE, directions[i]) do_knot = FALSE -/obj/effect/network_builder/power_cable/proc/should_auto_knot() +/obj/effect/mapping_helpers/network_builder/power_cable/proc/should_auto_knot() return (locate(/obj/machinery/power/terminal) in loc) -/obj/effect/network_builder/power_cable/knot +/obj/effect/mapping_helpers/network_builder/power_cable/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/auto +/obj/effect/mapping_helpers/network_builder/power_cable/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // Red -/obj/effect/network_builder/power_cable/red +/obj/effect/mapping_helpers/network_builder/power_cable/red color = "#ff0000" cable_color = "red" -/obj/effect/network_builder/power_cable/red/knot +/obj/effect/mapping_helpers/network_builder/power_cable/red/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/red/auto +/obj/effect/mapping_helpers/network_builder/power_cable/red/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // White -/obj/effect/network_builder/power_cable/white +/obj/effect/mapping_helpers/network_builder/power_cable/white color = "#ffffff" cable_color = "white" -/obj/effect/network_builder/power_cable/white/knot +/obj/effect/mapping_helpers/network_builder/power_cable/white/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/white/auto +/obj/effect/mapping_helpers/network_builder/power_cable/white/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // Cyan -/obj/effect/network_builder/power_cable/cyan +/obj/effect/mapping_helpers/network_builder/power_cable/cyan color = "#00ffff" cable_color = "cyan" -/obj/effect/network_builder/power_cable/cyan/knot +/obj/effect/mapping_helpers/network_builder/power_cable/cyan/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/cyan/auto +/obj/effect/mapping_helpers/network_builder/power_cable/cyan/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // Orange -/obj/effect/network_builder/power_cable/orange +/obj/effect/mapping_helpers/network_builder/power_cable/orange color = "#ff8000" cable_color = "orange" -/obj/effect/network_builder/power_cable/orange/knot +/obj/effect/mapping_helpers/network_builder/power_cable/orange/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/orange/auto +/obj/effect/mapping_helpers/network_builder/power_cable/orange/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // Pink -/obj/effect/network_builder/power_cable/pink +/obj/effect/mapping_helpers/network_builder/power_cable/pink color = "#ff3cc8" cable_color = "pink" -/obj/effect/network_builder/power_cable/pink/knot +/obj/effect/mapping_helpers/network_builder/power_cable/pink/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/pink/auto +/obj/effect/mapping_helpers/network_builder/power_cable/pink/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // Blue -/obj/effect/network_builder/power_cable/blue +/obj/effect/mapping_helpers/network_builder/power_cable/blue color = "#1919c8" cable_color = "blue" -/obj/effect/network_builder/power_cable/blue/knot +/obj/effect/mapping_helpers/network_builder/power_cable/blue/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/blue/auto +/obj/effect/mapping_helpers/network_builder/power_cable/blue/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // Green -/obj/effect/network_builder/power_cable/green +/obj/effect/mapping_helpers/network_builder/power_cable/green color = "#00aa00" cable_color = "green" -/obj/effect/network_builder/power_cable/green/knot +/obj/effect/mapping_helpers/network_builder/power_cable/green/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/green/auto +/obj/effect/mapping_helpers/network_builder/power_cable/green/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO // Yellow -/obj/effect/network_builder/power_cable/yellow +/obj/effect/mapping_helpers/network_builder/power_cable/yellow color = "#ffff00" cable_color = "yellow" -/obj/effect/network_builder/power_cable/yellow/knot +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/knot icon_state = "powerlinebuilderknot" knot = KNOT_FORCED -/obj/effect/network_builder/power_cable/yellow/auto +/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto icon_state = "powerlinebuilderauto" knot = KNOT_AUTO \ No newline at end of file diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index 037c1aa66090af6a10b89c422b3e00be0c0da471..e3cc3865b27fcc3771a19dabe0f40c2bba6a0e17 100644 GIT binary patch delta 6652 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 delta 6316 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 vqhKjS77!&a;+6aBUQbU? Date: Wed, 15 Jan 2020 19:36:20 -0700 Subject: [PATCH 09/14] oh it's a list --- .../mapping_helpers/network_builder/_network_builder.dm | 2 +- .../mapping/mapping_helpers/network_builder/atmos_pipe.dm | 2 +- .../mapping/mapping_helpers/network_builder/power_cables.dm | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm index 585e05bd57..097856fd43 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm @@ -7,7 +7,7 @@ icon = 'icons/effects/mapping_helpers.dmi' /// what directions we know connections are in - var/list/network_directions + var/list/network_directions = list() /obj/effect/mapping_helpers/network_builder/Initialize(mapload) . = ..() diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 0c39e517b3..9f30698982 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -46,7 +46,7 @@ for(var/obj/effect/mapping_helpers/network_builder/atmos_pipe/other in T) if(other.pipe_layer == pipe_layer) network_directions += i - LAZYADD(other.network_directions, turn(i, 180)) + other.network_directions += turn(i, 180) found = TRUE break if(found) diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index 419004468a..fecf39b81b 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -15,7 +15,6 @@ /// cable color as from GLOB.cable_colors var/cable_color = "red" - /obj/effect/mapping_helpers/network_builder/power_cable/check_duplicates() var/obj/structure/cable/C = locate() in loc if(C) @@ -37,7 +36,7 @@ var/obj/effect/mapping_helpers/network_builder/power_cable/other = locate() in T if(other) network_directions += i - LAZYADD(other.network_directions, turn(i, 180)) + 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)) From 925dc0185e09344c925fb4c33e73892dfab84b65 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 19:36:56 -0700 Subject: [PATCH 10/14] dme --- tgstation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 318e06c2e4..b2f6d0bb2a 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -14,7 +14,6 @@ // BEGIN_INCLUDE #include "_maps\_basemap.dm" -#include "_maps\boxstation.dm" #include "code\_compile_options.dm" #include "code\world.dm" #include "code\__DEFINES\__513_compatibility.dm" From 512b11215426b4bf850466b8efe167d5cd791b71 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 20:45:05 -0700 Subject: [PATCH 11/14] happythink --- .../network_builder/_network_builder.dm | 3 ++ .../network_builder/atmos_pipe.dm | 11 +++---- .../network_builder/power_cables.dm | 29 ++++++++++--------- code/modules/power/cable.dm | 14 +++++---- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm index 097856fd43..78a835cffa 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/_network_builder.dm @@ -6,11 +6,13 @@ icon = 'icons/effects/mapping_helpers.dmi' + late = TRUE /// what directions we know connections are in var/list/network_directions = list() /obj/effect/mapping_helpers/network_builder/Initialize(mapload) . = ..() + to_chat(world, "DEBUG: Initializing [COORD(src)]") var/conflict = check_duplicates() if(conflict) stack_trace("WARNING: [type] network building helper found check_duplicates() conflict [conflict] in its location.!") @@ -25,6 +27,7 @@ /// 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/mapping_helpers/network_builder/LateInitialize() + to_chat(world, "DEBUG: LateInitializing [COORD(src)]") scan_directions() build_network() if(!custom_spawned) diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 9f30698982..5926fd6760 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -58,16 +58,16 @@ return network_directions /// Directions should only ever have cardinals. -/obj/effect/mapping_helpers/network_builder/atmos_pipe/build_network(list/directions = network_directions) - if(!length(directions) <= 1) +/obj/effect/mapping_helpers/network_builder/atmos_pipe/build_network() + if(length(network_directions) <= 1) return var/obj/machinery/atmospherics/pipe/built - switch(length(directions)) + switch(length(network_directions)) if(2) //straight pipe built = new /obj/machinery/atmospherics/pipe/simple(loc) - built.setDir(directions[1] | directions[2]) + built.setDir(network_directions[1] | network_directions[2]) if(3) //manifold - var/list/missing = directions ^ GLOB.cardinals + var/list/missing = network_directions ^ GLOB.cardinals missing = missing[1] built = new /obj/machinery/atmospherics/pipe/manifold(loc) built.setDir(missing) @@ -75,6 +75,7 @@ built = new /obj/machinery/atmospherics/pipe/manifold4w(loc) built.SetInitDirections() built.on_construction(pipe_color, pipe_layer) + built.hide(!visible_pipes) /obj/effect/mapping_helpers/network_builder/atmos_pipe/distro name = "distro line autobuilder" diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index fecf39b81b..d483a885ea 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -45,27 +45,28 @@ return network_directions /// Directions should only ever have cardinals. -/obj/effect/mapping_helpers/network_builder/power_cable/build_network(list/directions = network_directions) - if(!length(directions)) +/obj/effect/mapping_helpers/network_builder/power_cable/build_network() + if(!length(network_directions)) return - else if(length(directions) == 1) - var/do_knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot()) - if(do_knot) - new /obj/structure/cable(loc, cable_color, NONE, directions[1]) + 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 directions) + 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(directions) - for(var/i in dirs) - var/li = i - 1 - if(li < 1) - li = dirs + li - new /obj/structure/cable(loc, cable_color, directions[i], directions[li]) + var/dirs = length(network_directions) + for(var/i in 1 to dirs) + 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, directions[i]) + new /obj/structure/cable(loc, cable_color, NONE, network_directions[i]) do_knot = FALSE /obj/effect/mapping_helpers/network_builder/power_cable/proc/should_auto_knot() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index b1c2d225ee..cee9a17ebf 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -79,13 +79,17 @@ By design, d1 is the smallest direction and d2 is the highest color = "#ffffff" // the power cable object -/obj/structure/cable/Initialize(mapload, param_color) +/obj/structure/cable/Initialize(mapload, param_color, _d1, _d2) . = ..() - // ensure d1 & d2 reflect the icon_state for entering and exiting cable - var/dash = findtext(icon_state, "-") - d1 = text2num( copytext( icon_state, 1, dash ) ) - d2 = text2num( copytext( icon_state, dash+1 ) ) + if(isnull(_d1) || isnull(_d2)) + // ensure d1 & d2 reflect the icon_state for entering and exiting cable + var/dash = findtext(icon_state, "-") + d1 = text2num( copytext( icon_state, 1, dash ) ) + d2 = text2num( copytext( icon_state, dash+1 ) ) + else + d1 = _d1 + d2 = _d2 var/turf/T = get_turf(src) // hide if turf is not intact if(level==1) From 327c1e04e0717f152339f3411cc29c609c3ecf36 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 22:00:08 -0700 Subject: [PATCH 12/14] s --- .../atmospherics/machinery/pipes/simple.dm | 46 +++++++++---------- .../network_builder/atmos_pipe.dm | 10 +++- .../network_builder/power_cables.dm | 2 +- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm index dbe67a1594..7cab3c23dc 100644 --- a/code/modules/atmospherics/machinery/pipes/simple.dm +++ b/code/modules/atmospherics/machinery/pipes/simple.dm @@ -35,7 +35,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/general/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/general/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -58,7 +58,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/scrubbers name="scrubbers pipe" pipe_color=rgb(255,0,0) @@ -77,7 +77,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden level = PIPE_HIDDEN_LEVEL @@ -90,7 +90,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/supply name="air supply pipe" pipe_color=rgb(0,0,255) @@ -99,7 +99,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/supply/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/supply/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -122,7 +122,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/supplymain name="main air supply pipe" pipe_color=rgb(130,43,255) @@ -141,7 +141,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/supplymain/hidden level = PIPE_HIDDEN_LEVEL @@ -154,7 +154,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/yellow pipe_color=rgb(255,198,0) color=rgb(255,198,0) @@ -172,7 +172,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/yellow/hidden level = PIPE_HIDDEN_LEVEL @@ -185,7 +185,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/cyan pipe_color=rgb(0,255,249) color=rgb(0,255,249) @@ -193,7 +193,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/cyan/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/cyan/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -206,7 +206,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/cyan/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -224,7 +224,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/green/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/green/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -237,7 +237,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/green/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/simple/green/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -255,7 +255,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/orange/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/orange/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -268,7 +268,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/orange/hidden level = PIPE_HIDDEN_LEVEL - + /obj/machinery/atmospherics/pipe/simple/orange/hidden/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -286,7 +286,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/purple/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/purple/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -309,7 +309,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/dark pipe_color=rgb(69,69,69) color=rgb(69,69,69) @@ -317,7 +317,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/dark/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/dark/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -340,7 +340,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/violet pipe_color=rgb(64,0,128) color=rgb(64,0,128) @@ -348,7 +348,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/violet/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/violet/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X @@ -371,7 +371,7 @@ The regular pipe you see everywhere, including bent ones. piping_layer = PIPING_LAYER_MAX pixel_x = PIPING_LAYER_P_X pixel_y = PIPING_LAYER_P_Y - + /obj/machinery/atmospherics/pipe/simple/brown pipe_color=rgb(178,100,56) color=rgb(178,100,56) @@ -379,7 +379,7 @@ The regular pipe you see everywhere, including bent ones. /obj/machinery/atmospherics/pipe/simple/brown/visible level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER - + /obj/machinery/atmospherics/pipe/simple/brown/visible/layer1 piping_layer = PIPING_LAYER_MIN pixel_x = -PIPING_LAYER_P_X diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 5926fd6760..8dc7043aea 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -52,7 +52,7 @@ if(found) continue for(var/obj/machinery/atmospherics/A in T) - if((A.piping_layer == pipe_layer) && (A.initialize_directions & i)) + if((A.piping_layer == pipe_layer) && (A.initialize_directions & turn(i, 180))) network_directions += i break return network_directions @@ -65,7 +65,13 @@ switch(length(network_directions)) if(2) //straight pipe built = new /obj/machinery/atmospherics/pipe/simple(loc) - built.setDir(network_directions[1] | network_directions[2]) + 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] diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index d483a885ea..e26f1d314c 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -57,7 +57,7 @@ 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) + 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] From 88d6c1a1665dc2e5c04c37feb69c2303ce516796 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 15 Jan 2020 22:02:07 -0700 Subject: [PATCH 13/14] OKFINE --- .../mapping/mapping_helpers/network_builder/atmos_pipe.dm | 4 ---- .../mapping/mapping_helpers/network_builder/power_cables.dm | 6 +++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm index 8dc7043aea..1983bab3b6 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/atmos_pipe.dm @@ -1,7 +1,3 @@ -#define NO_KNOT 0 -#define KNOT_AUTO 1 -#define KNOT_FORCED 2 - /* 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. */ diff --git a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm index e26f1d314c..5385045618 100644 --- a/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm +++ b/code/modules/mapping/mapping_helpers/network_builder/power_cables.dm @@ -182,4 +182,8 @@ /obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto icon_state = "powerlinebuilderauto" - knot = KNOT_AUTO \ No newline at end of file + knot = KNOT_AUTO + +#undef NO_KNOT +#undef KNOT_AUTO +#undef KNOT_FORCED From 3c2e6a959da964469882862edeb7abcb6e22e8d2 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 17 Jan 2020 14:25:29 -0700 Subject: [PATCH 14/14] whitespace renormalize --- code/modules/mapping/ruins.dm | 342 +++++++++--------- .../space_management/space_reservation.dm | 170 ++++----- 2 files changed, 256 insertions(+), 256 deletions(-) diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index d88c7543f0..9c578badb1 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -1,171 +1,171 @@ -/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) - var/sanity = forced_turf ? 1 : PLACEMENT_TRIES - if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) - return place_on_isolated_level(z) - while(sanity > 0) - sanity-- - var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) - var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) - var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) - var/valid = TRUE - - for(var/turf/check in get_affected_turfs(central_turf,1)) - var/area/new_area = get_area(check) - if(!(istype(new_area, allowed_areas)) || check.flags_1 & NO_RUINS_1) - valid = FALSE - break - - if(!valid) - continue - - testing("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])") - - for(var/i in get_affected_turfs(central_turf, 1)) - var/turf/T = i - for(var/mob/living/simple_animal/monster in T) - qdel(monster) - for(var/obj/structure/flora/ash/plant in T) - qdel(plant) - - load(central_turf,centered = TRUE) - loaded++ - - for(var/turf/T in get_affected_turfs(central_turf, 1)) - T.flags_1 |= NO_RUINS_1 - - new /obj/effect/landmark/ruin(central_turf, src) - return central_turf - -/datum/map_template/ruin/proc/place_on_isolated_level(z) - var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. - if(!reservation) - return - var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) - load(placement) - loaded++ - for(var/turf/T in get_affected_turfs(placement)) - T.flags_1 |= NO_RUINS_1 - var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z) - new /obj/effect/landmark/ruin(center, src) - return center - -/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) - if(!z_levels || !z_levels.len) - WARNING("No Z levels provided - Not generating ruins") - return - - for(var/zl in z_levels) - var/turf/T = locate(1, 1, zl) - if(!T) - WARNING("Z level [zl] does not exist - Not generating ruins") - return - - var/list/ruins = potentialRuins.Copy() - - var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. - var/list/ruins_availible = list() //we can try these in the current pass - - //Set up the starting ruin list - for(var/key in ruins) - var/datum/map_template/ruin/R = ruins[key] - if(R.cost > budget) //Why would you do that - continue - if(R.always_place) - forced_ruins[R] = -1 - if(R.unpickable) - continue - ruins_availible[R] = R.placement_weight - - while(budget > 0 && (ruins_availible.len || forced_ruins.len)) - var/datum/map_template/ruin/current_pick - var/forced = FALSE - var/forced_z //If set we won't pick z level and use this one instead. - var/forced_turf //If set we place the ruin centered on the given turf - if(forced_ruins.len) //We have something we need to load right now, so just pick it - for(var/ruin in forced_ruins) - current_pick = ruin - if(isturf(forced_ruins[ruin])) - var/turf/T = forced_ruins[ruin] - forced_z = T.z //In case of chained ruins - forced_turf = T - else if(forced_ruins[ruin] > 0) //Load into designated z - forced_z = forced_ruins[ruin] - forced = TRUE - break - else //Otherwise just pick random one - current_pick = pickweight(ruins_availible) - - var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf - var/failed_to_place = TRUE - var/target_z = 0 - var/turf/placed_turf //Where the ruin ended up if we succeeded - outer: - while(placement_tries > 0) - placement_tries-- - target_z = pick(z_levels) - if(forced_z) - target_z = forced_z - if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists. - for(var/v in current_pick.always_spawn_with) - if(current_pick.always_spawn_with[v] == PLACE_BELOW) - var/turf/T = locate(1,1,target_z) - if(!SSmapping.get_turf_below(T)) - if(forced_z) - continue outer - else - break outer - - placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) - if(!placed_turf) - continue - else - failed_to_place = FALSE - break - - //That's done remove from priority even if it failed - if(forced) - //TODO : handle forced ruins with multiple variants - forced_ruins -= current_pick - forced = FALSE - - if(failed_to_place) - for(var/datum/map_template/ruin/R in ruins_availible) - if(R.id == current_pick.id) - ruins_availible -= R - log_world("Failed to place [current_pick.name] ruin.") - else - budget -= current_pick.cost - if(!current_pick.allow_duplicates) - for(var/datum/map_template/ruin/R in ruins_availible) - if(R.id == current_pick.id) - ruins_availible -= R - if(current_pick.never_spawn_with) - for(var/blacklisted_type in current_pick.never_spawn_with) - for(var/possible_exclusion in ruins_availible) - if(istype(possible_exclusion,blacklisted_type)) - ruins_availible -= possible_exclusion - if(current_pick.always_spawn_with) - for(var/v in current_pick.always_spawn_with) - for(var/ruin_name in SSmapping.ruins_templates) //Because we might want to add space templates as linked of lava templates. - var/datum/map_template/ruin/linked = SSmapping.ruins_templates[ruin_name] //why are these assoc, very annoying. - if(istype(linked,v)) - switch(current_pick.always_spawn_with[v]) - if(PLACE_SAME_Z) - forced_ruins[linked] = target_z //I guess you might want a chain somehow - if(PLACE_LAVA_RUIN) - forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) - if(PLACE_SPACE_RUIN) - forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) - if(PLACE_DEFAULT) - forced_ruins[linked] = -1 - if(PLACE_BELOW) - forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) - if(PLACE_ISOLATED) - forced_ruins[linked] = SSmapping.get_isolated_ruin_z() - - //Update the availible list - for(var/datum/map_template/ruin/R in ruins_availible) - if(R.cost > budget) - ruins_availible -= R - - log_world("Ruin loader finished with [budget] left to spend.") +/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) + var/sanity = forced_turf ? 1 : PLACEMENT_TRIES + if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) + return place_on_isolated_level(z) + while(sanity > 0) + sanity-- + var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) + var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) + var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) + var/valid = TRUE + + for(var/turf/check in get_affected_turfs(central_turf,1)) + var/area/new_area = get_area(check) + if(!(istype(new_area, allowed_areas)) || check.flags_1 & NO_RUINS_1) + valid = FALSE + break + + if(!valid) + continue + + testing("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])") + + for(var/i in get_affected_turfs(central_turf, 1)) + var/turf/T = i + for(var/mob/living/simple_animal/monster in T) + qdel(monster) + for(var/obj/structure/flora/ash/plant in T) + qdel(plant) + + load(central_turf,centered = TRUE) + loaded++ + + for(var/turf/T in get_affected_turfs(central_turf, 1)) + T.flags_1 |= NO_RUINS_1 + + new /obj/effect/landmark/ruin(central_turf, src) + return central_turf + +/datum/map_template/ruin/proc/place_on_isolated_level(z) + var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. + if(!reservation) + return + var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) + load(placement) + loaded++ + for(var/turf/T in get_affected_turfs(placement)) + T.flags_1 |= NO_RUINS_1 + var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z) + new /obj/effect/landmark/ruin(center, src) + return center + +/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) + if(!z_levels || !z_levels.len) + WARNING("No Z levels provided - Not generating ruins") + return + + for(var/zl in z_levels) + var/turf/T = locate(1, 1, zl) + if(!T) + WARNING("Z level [zl] does not exist - Not generating ruins") + return + + var/list/ruins = potentialRuins.Copy() + + var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. + var/list/ruins_availible = list() //we can try these in the current pass + + //Set up the starting ruin list + for(var/key in ruins) + var/datum/map_template/ruin/R = ruins[key] + if(R.cost > budget) //Why would you do that + continue + if(R.always_place) + forced_ruins[R] = -1 + if(R.unpickable) + continue + ruins_availible[R] = R.placement_weight + + while(budget > 0 && (ruins_availible.len || forced_ruins.len)) + var/datum/map_template/ruin/current_pick + var/forced = FALSE + var/forced_z //If set we won't pick z level and use this one instead. + var/forced_turf //If set we place the ruin centered on the given turf + if(forced_ruins.len) //We have something we need to load right now, so just pick it + for(var/ruin in forced_ruins) + current_pick = ruin + if(isturf(forced_ruins[ruin])) + var/turf/T = forced_ruins[ruin] + forced_z = T.z //In case of chained ruins + forced_turf = T + else if(forced_ruins[ruin] > 0) //Load into designated z + forced_z = forced_ruins[ruin] + forced = TRUE + break + else //Otherwise just pick random one + current_pick = pickweight(ruins_availible) + + var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf + var/failed_to_place = TRUE + var/target_z = 0 + var/turf/placed_turf //Where the ruin ended up if we succeeded + outer: + while(placement_tries > 0) + placement_tries-- + target_z = pick(z_levels) + if(forced_z) + target_z = forced_z + if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists. + for(var/v in current_pick.always_spawn_with) + if(current_pick.always_spawn_with[v] == PLACE_BELOW) + var/turf/T = locate(1,1,target_z) + if(!SSmapping.get_turf_below(T)) + if(forced_z) + continue outer + else + break outer + + placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) + if(!placed_turf) + continue + else + failed_to_place = FALSE + break + + //That's done remove from priority even if it failed + if(forced) + //TODO : handle forced ruins with multiple variants + forced_ruins -= current_pick + forced = FALSE + + if(failed_to_place) + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.id == current_pick.id) + ruins_availible -= R + log_world("Failed to place [current_pick.name] ruin.") + else + budget -= current_pick.cost + if(!current_pick.allow_duplicates) + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.id == current_pick.id) + ruins_availible -= R + if(current_pick.never_spawn_with) + for(var/blacklisted_type in current_pick.never_spawn_with) + for(var/possible_exclusion in ruins_availible) + if(istype(possible_exclusion,blacklisted_type)) + ruins_availible -= possible_exclusion + if(current_pick.always_spawn_with) + for(var/v in current_pick.always_spawn_with) + for(var/ruin_name in SSmapping.ruins_templates) //Because we might want to add space templates as linked of lava templates. + var/datum/map_template/ruin/linked = SSmapping.ruins_templates[ruin_name] //why are these assoc, very annoying. + if(istype(linked,v)) + switch(current_pick.always_spawn_with[v]) + if(PLACE_SAME_Z) + forced_ruins[linked] = target_z //I guess you might want a chain somehow + if(PLACE_LAVA_RUIN) + forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) + if(PLACE_SPACE_RUIN) + forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) + if(PLACE_DEFAULT) + forced_ruins[linked] = -1 + if(PLACE_BELOW) + forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + if(PLACE_ISOLATED) + forced_ruins[linked] = SSmapping.get_isolated_ruin_z() + + //Update the availible list + for(var/datum/map_template/ruin/R in ruins_availible) + if(R.cost > budget) + ruins_availible -= R + + log_world("Ruin loader finished with [budget] left to spend.") diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 43fe69d633..b514796bc5 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -1,85 +1,85 @@ - -//Yes, they can only be rectangular. -//Yes, I'm sorry. -/datum/turf_reservation - var/list/reserved_turfs = list() - var/width = 0 - var/height = 0 - var/bottom_left_coords[3] - var/top_right_coords[3] - var/wipe_reservation_on_release = TRUE - var/turf_type = /turf/open/space - var/borderturf - -/datum/turf_reservation/transit - turf_type = /turf/open/space/transit - borderturf = /turf/open/space/transit/border - -/datum/turf_reservation/proc/Release() - var/v = reserved_turfs.Copy() - for(var/i in reserved_turfs) - reserved_turfs -= i - SSmapping.used_turfs -= i - SSmapping.reserve_turfs(v) - -/datum/turf_reservation/transit/Release() - for(var/turf/open/space/transit/T in reserved_turfs) - for(var/atom/movable/AM in T) - T.throw_atom(AM) - . = ..() - -/datum/turf_reservation/proc/Reserve(width, height, zlevel) - if(width > world.maxx || height > world.maxy || width < 1 || height < 1) - return FALSE - var/list/avail = SSmapping.unused_turfs["[zlevel]"] - var/turf/BL - var/turf/TR - var/list/turf/final = list() - var/passing = FALSE - for(var/i in avail) - CHECK_TICK - BL = i - if(!(BL.flags_1 & UNUSED_RESERVATION_TURF_1)) - continue - if(BL.x + width > world.maxx || BL.y + height > world.maxy) - continue - TR = locate(BL.x + width - 1, BL.y + height - 1, BL.z) - if(!(TR.flags_1 & UNUSED_RESERVATION_TURF_1)) - continue - final = block(BL, TR) - if(!final) - continue - passing = TRUE - for(var/I in final) - var/turf/checking = I - if(!(checking.flags_1 & UNUSED_RESERVATION_TURF_1)) - passing = FALSE - break - if(!passing) - continue - break - if(!passing || !istype(BL) || !istype(TR)) - return FALSE - bottom_left_coords = list(BL.x, BL.y, BL.z) - top_right_coords = list(TR.x, TR.y, TR.z) - for(var/i in final) - var/turf/T = i - reserved_turfs |= T - T.flags_1 &= ~UNUSED_RESERVATION_TURF_1 - SSmapping.unused_turfs["[T.z]"] -= T - SSmapping.used_turfs[T] = src - if(borderturf && (T.x == BL.x || T.x == TR.x || T.y == BL.y || T.y == TR.y)) - T.ChangeTurf(borderturf, borderturf) - else - T.ChangeTurf(turf_type, turf_type) - src.width = width - src.height = height - return TRUE - -/datum/turf_reservation/New() - LAZYADD(SSmapping.turf_reservations, src) - -/datum/turf_reservation/Destroy() - Release() - LAZYREMOVE(SSmapping.turf_reservations, src) - return ..() + +//Yes, they can only be rectangular. +//Yes, I'm sorry. +/datum/turf_reservation + var/list/reserved_turfs = list() + var/width = 0 + var/height = 0 + var/bottom_left_coords[3] + var/top_right_coords[3] + var/wipe_reservation_on_release = TRUE + var/turf_type = /turf/open/space + var/borderturf + +/datum/turf_reservation/transit + turf_type = /turf/open/space/transit + borderturf = /turf/open/space/transit/border + +/datum/turf_reservation/proc/Release() + var/v = reserved_turfs.Copy() + for(var/i in reserved_turfs) + reserved_turfs -= i + SSmapping.used_turfs -= i + SSmapping.reserve_turfs(v) + +/datum/turf_reservation/transit/Release() + for(var/turf/open/space/transit/T in reserved_turfs) + for(var/atom/movable/AM in T) + T.throw_atom(AM) + . = ..() + +/datum/turf_reservation/proc/Reserve(width, height, zlevel) + if(width > world.maxx || height > world.maxy || width < 1 || height < 1) + return FALSE + var/list/avail = SSmapping.unused_turfs["[zlevel]"] + var/turf/BL + var/turf/TR + var/list/turf/final = list() + var/passing = FALSE + for(var/i in avail) + CHECK_TICK + BL = i + if(!(BL.flags_1 & UNUSED_RESERVATION_TURF_1)) + continue + if(BL.x + width > world.maxx || BL.y + height > world.maxy) + continue + TR = locate(BL.x + width - 1, BL.y + height - 1, BL.z) + if(!(TR.flags_1 & UNUSED_RESERVATION_TURF_1)) + continue + final = block(BL, TR) + if(!final) + continue + passing = TRUE + for(var/I in final) + var/turf/checking = I + if(!(checking.flags_1 & UNUSED_RESERVATION_TURF_1)) + passing = FALSE + break + if(!passing) + continue + break + if(!passing || !istype(BL) || !istype(TR)) + return FALSE + bottom_left_coords = list(BL.x, BL.y, BL.z) + top_right_coords = list(TR.x, TR.y, TR.z) + for(var/i in final) + var/turf/T = i + reserved_turfs |= T + T.flags_1 &= ~UNUSED_RESERVATION_TURF_1 + SSmapping.unused_turfs["[T.z]"] -= T + SSmapping.used_turfs[T] = src + if(borderturf && (T.x == BL.x || T.x == TR.x || T.y == BL.y || T.y == TR.y)) + T.ChangeTurf(borderturf, borderturf) + else + T.ChangeTurf(turf_type, turf_type) + src.width = width + src.height = height + return TRUE + +/datum/turf_reservation/New() + LAZYADD(SSmapping.turf_reservations, src) + +/datum/turf_reservation/Destroy() + Release() + LAZYREMOVE(SSmapping.turf_reservations, src) + return ..()