diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_1.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_1.dmm deleted file mode 100644 index b3a1d6baffe..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_1.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/clockwork, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/clockwork/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_2.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_2.dmm deleted file mode 100644 index 60b50b4d189..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_2.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/engine/cult/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_3.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_3.dmm deleted file mode 100644 index 2d3360cc580..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_3.dmm +++ /dev/null @@ -1,73 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/stone_tile/surrounding, -/obj/structure/stone_tile/center, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"g" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"h" = ( -/obj/structure/stone_tile/slab, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"m" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"o" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/burnt, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -h -a -c -"} -(2,1,1) = {" -c -c -m -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -o -c -c -"} -(5,1,1) = {" -c -a -g -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_4.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_4.dmm deleted file mode 100644 index 272dfcd1246..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_4.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"o" = ( -/turf/simulated/floor/indestructible/hierophant/two, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -o -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_5.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_5.dmm deleted file mode 100644 index 954adedd9c4..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_5.dmm +++ /dev/null @@ -1,50 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/mineral/wood/nonmetal, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"v" = ( -/obj/effect/landmark/damageturf, -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -v -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -v -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_6.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_6.dmm deleted file mode 100644 index 2cfe9bd7446..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_6.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/structure/lattice/catwalk/mining, -/obj/structure/marker_beacon/dock_marker/collision, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/lattice/catwalk/mining, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_1.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_1.dmm deleted file mode 100644 index dca66633eba..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_1.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/clockwork, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/clockwork/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -a -c -c -c -a -"} -(3,1,1) = {" -b -b -b -b -b -"} -(4,1,1) = {" -a -c -c -c -a -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_2.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_2.dmm deleted file mode 100644 index 02fd1e0a69f..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_2.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/engine/cult/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -a -c -c -c -a -"} -(3,1,1) = {" -b -b -b -b -b -"} -(4,1,1) = {" -a -c -c -c -a -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_3.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_3.dmm deleted file mode 100644 index 8fbfe6ba32e..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_3.dmm +++ /dev/null @@ -1,83 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/stone_tile/slab, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"w" = ( -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding/cracked, -/obj/structure/stone_tile/slab/cracked{ - dir = 10 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"I" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"M" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 5 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"R" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -a -c -c -c -a -"} -(3,1,1) = {" -b -I -w -R -M -"} -(4,1,1) = {" -a -c -c -c -a -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_4.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_4.dmm deleted file mode 100644 index 7c187f4aeec..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_4.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/floor/indestructible/hierophant/two, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"y" = ( -/turf/simulated/wall/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -y -c -c -c -y -"} -(3,1,1) = {" -a -a -b -a -a -"} -(4,1,1) = {" -y -c -c -c -y -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_5.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_5.dmm deleted file mode 100644 index 588567999bf..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_5.dmm +++ /dev/null @@ -1,50 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/effect/landmark/damageturf, -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"y" = ( -/turf/simulated/wall/mineral/wood, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -y -c -c -c -y -"} -(3,1,1) = {" -b -a -b -a -b -"} -(4,1,1) = {" -y -c -c -c -y -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_6.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_6.dmm deleted file mode 100644 index ae47effe5fc..00000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_6.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/structure/lattice/catwalk/mining, -/obj/structure/marker_beacon/dock_marker, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/lattice/catwalk/mining, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -b -c -c -c -b -"} -(3,1,1) = {" -b -a -b -a -b -"} -(4,1,1) = {" -b -c -c -c -b -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 5ba007f94e2..b42f5f9b6e8 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -145,6 +145,7 @@ #define BLESSED_TILE (1<<0) #define NO_LAVA_GEN (1<<1) //Blocks lava rivers being generated on the turf #define NO_RUINS (1<<2) +#define LAVA_BRIDGE (1<<3) //! This turf has already been reserved for a lavaland bridge placement. //ORGAN TYPE FLAGS #define AFFECT_ROBOTIC_ORGAN 1 diff --git a/code/_globalvars/mapping_vars.dm b/code/_globalvars/mapping_vars.dm index cff1c4251b6..dc095a33d16 100644 --- a/code/_globalvars/mapping_vars.dm +++ b/code/_globalvars/mapping_vars.dm @@ -46,5 +46,3 @@ GLOBAL_LIST_EMPTY(space_ruins_templates) GLOBAL_LIST_EMPTY(lava_ruins_templates) GLOBAL_LIST_EMPTY(shelter_templates) GLOBAL_LIST_EMPTY(shuttle_templates) -GLOBAL_LIST_EMPTY(bridge_horizontal_templates) -GLOBAL_LIST_EMPTY(bridge_vertical_templates) diff --git a/code/controllers/subsystem/non_firing/SSlate_mapping.dm b/code/controllers/subsystem/non_firing/SSlate_mapping.dm index b3e66541577..eec96be19f9 100644 --- a/code/controllers/subsystem/non_firing/SSlate_mapping.dm +++ b/code/controllers/subsystem/non_firing/SSlate_mapping.dm @@ -28,16 +28,3 @@ SUBSYSTEM_DEF(late_mapping) QDEL_LIST_CONTENTS(maze_generators) var/duration = stop_watch(watch) log_startup_progress("Generated [mgcount] mazes in [duration]s") - - if(length(bridge_spawners)) - var/watch = start_watch() - log_startup_progress("Spawning bridges...") - - for(var/i in bridge_spawners) - var/obj/effect/spawner/bridge/BS = i - BS.generate_bridge() - - var/list/bscount = length(bridge_spawners) // Keeping track of this here because we wipe it next line down - QDEL_LIST_CONTENTS(bridge_spawners) - var/duration = stop_watch(watch) - log_startup_progress("Spawned [bscount] bridges in [duration]s") diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index 59fb398fe6c..ff159e7d63c 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -121,7 +121,6 @@ preloadRuinTemplates() preloadShelterTemplates() preloadShuttleTemplates() - preloadBridgeTemplates() preloadEventTemplates() /proc/preloadRuinTemplates() @@ -169,22 +168,6 @@ GLOB.shuttle_templates[S.shuttle_id] = S GLOB.map_templates[S.shuttle_id] = S -/proc/preloadBridgeTemplates() - for(var/item in subtypesof(/datum/map_template/ruin/bridge/horizontal)) - var/datum/map_template/ruin/bridge/horizontal/horizontal_type = item - if(!(initial(horizontal_type.suffix))) - continue - var/datum/map_template/ruin/bridge/horizontal/S = new horizontal_type() - GLOB.bridge_horizontal_templates[S.suffix] = S - GLOB.map_templates[S.suffix] = S - for(var/item in subtypesof(/datum/map_template/ruin/bridge/vertical)) - var/datum/map_template/ruin/bridge/horizontal/vertical_type = item - if(!(initial(vertical_type.suffix))) - continue - var/datum/map_template/ruin/bridge/vertical/V = new vertical_type() - GLOB.bridge_vertical_templates[V.suffix] = V - GLOB.map_templates[V.suffix] = V - /proc/preloadEventTemplates() for(var/item in subtypesof(/datum/map_template/event)) var/datum/map_template/event/event_type = item diff --git a/code/datums/ruins/bridges/bridges.dm b/code/datums/ruins/bridges/bridges.dm index 6d5770419a3..dac4f8c7ad9 100644 --- a/code/datums/ruins/bridges/bridges.dm +++ b/code/datums/ruins/bridges/bridges.dm @@ -1,87 +1,217 @@ -/datum/map_template/ruin/bridge - prefix = "_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/" - ci_exclude = /datum/map_template/ruin/bridge +#define LONG_BRIDGE_THEME_CULT "cult" +#define LONG_BRIDGE_THEME_HIERO "hiero" +#define LONG_BRIDGE_THEME_CLOCKWORK "clockwork" +#define LONG_BRIDGE_THEME_STONE "stone" +#define LONG_BRIDGE_THEME_WOOD "wood" +#define LONG_BRIDGE_THEME_CATWALK "catwalk" -/datum/map_template/ruin/bridge/horizontal - ci_exclude = /datum/map_template/ruin/bridge/horizontal +/** + * A spawner for dynamic bridges, largely with hardcoded expectations to be + * operating on Lavaland. + * + * It does this by starting at its spawn point, placed by a + * [/datum/river_spawner] during generation, and walking in each direction + * "forwards" and "backwards" until it reaches the maximum possible length of + * the bridge, or a tile that doesn't appear to be a valid "passage" + * (essentially a tile that doesn't have lava on both sides and thus wouldn't + * look good or make an effective bridge). If it manages to do this and find two + * tiles that work as the start and end of the bridge, it places the paths, + * pillars, and "cleans up" the tiles contiguous to its entrance and exit turfs, + * removing any lava if present. + * + * It attempts this first in the vertical direction, and then the horizontal. So + * "fowards" and "backwards" can mean NORTH/SOUTH or EAST/WEST depending on the + * direction it's attempting. + * + * There are several bridge "themes" implemented in `make_walkway()` and + * `make_pillar()`, and more can be added if desired. + */ +/obj/effect/spawner/dynamic_bridge + var/max_length = 8 + var/min_length = 4 + var/bridge_theme = LONG_BRIDGE_THEME_CULT + var/list/forwards_backwards + var/list/side_to_side -/datum/map_template/ruin/bridge/horizontal/one - name = "Horizontal Bridge One" - suffix = "lavaland_bridge_horizontal_1.dmm" - -/datum/map_template/ruin/bridge/horizontal/two - name = "Horizontal Bridge Two" - suffix = "lavaland_bridge_horizontal_2.dmm" - -/datum/map_template/ruin/bridge/horizontal/three - name = "Horizontal Bridge Three" - suffix = "lavaland_bridge_horizontal_3.dmm" - -/datum/map_template/ruin/bridge/horizontal/four - name = "Horizontal Bridge Four" - suffix = "lavaland_bridge_horizontal_4.dmm" - -/datum/map_template/ruin/bridge/horizontal/five - name = "Horizontal Bridge Five" - suffix = "lavaland_bridge_horizontal_5.dmm" - -/datum/map_template/ruin/bridge/horizontal/six - name = "Horizontal Bridge Six" - suffix = "lavaland_bridge_horizontal_6.dmm" - -/datum/map_template/ruin/bridge/vertical - ci_exclude = /datum/map_template/ruin/bridge/vertical - -/datum/map_template/ruin/bridge/vertical/one - name = "Vertical Bridge One" - suffix = "lavaland_bridge_vertical_1.dmm" - -/datum/map_template/ruin/bridge/vertical/two - name = "Vertical Bridge Two" - suffix = "lavaland_bridge_vertical_2.dmm" - -/datum/map_template/ruin/bridge/vertical/three - name = "Vertical Bridge Three" - suffix = "lavaland_bridge_vertical_3.dmm" - -/datum/map_template/ruin/bridge/vertical/four - name = "Vertical Bridge Four" - suffix = "lavaland_bridge_vertical_4.dmm" - -/datum/map_template/ruin/bridge/vertical/five - name = "Vertical Bridge Five" - suffix = "lavaland_bridge_vertical_5.dmm" - -/datum/map_template/ruin/bridge/vertical/six - name = "Vertical Bridge Six" - suffix = "lavaland_bridge_vertical_6.dmm" - -/obj/effect/spawner/bridge - name = "Bridge spawner" - var/datum/map_template/ruin/bridge/template - -/obj/effect/spawner/bridge/Initialize(mapload) +/obj/effect/spawner/dynamic_bridge/Initialize(mapload) . = ..() - SSlate_mapping.bridge_spawners += src + bridge_theme = pick( + LONG_BRIDGE_THEME_CULT, + LONG_BRIDGE_THEME_HIERO, + LONG_BRIDGE_THEME_CLOCKWORK, + LONG_BRIDGE_THEME_STONE, + LONG_BRIDGE_THEME_WOOD, + LONG_BRIDGE_THEME_CATWALK, + ) + return INITIALIZE_HINT_LATELOAD -/obj/effect/spawner/bridge/Destroy() - SSlate_mapping.bridge_spawners -= src - return ..() +/obj/effect/spawner/dynamic_bridge/LateInitialize() + forwards_backwards = list(NORTH, SOUTH) + side_to_side = list(EAST, WEST) + if(!attempt_bridge()) + forwards_backwards = list(EAST, WEST) + side_to_side = list(NORTH, SOUTH) + attempt_bridge() -/obj/effect/spawner/bridge/proc/generate_bridge() - var/turf/east = locate(x + 3, y, z) - var/turf/west = locate(x - 3, y, z) - var/turf/north = locate(x, y + 3, z) - var/turf/south = locate(x, y - 3, z) - var/turf/e1 = locate(x + 1, y, z) - var/turf/w1 = locate(x - 1, y, z) - var/turf/n1 = locate(x, y + 1, z) - var/turf/s1 = locate(x, y - 1, z) + qdel(src) +/// Returns whether the passed in turf is a valid "landing". A valid landing is +/// a tile that hasn't been reserved by another bridge, and has a non-lava tile +/// leading directly to it. +/obj/effect/spawner/dynamic_bridge/proc/valid_landing(turf/T, direction) + if(T.flags & LAVA_BRIDGE || T.flags & NO_LAVA_GEN) + return FALSE - if((ismineralturf(east) || istype(east, /turf/simulated/floor/plating/asteroid)) && (ismineralturf(west) || istype(west, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(n1) || istype(n1, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(s1) || istype(s1, /turf/simulated/floor/plating/asteroid))) - template = GLOB.bridge_horizontal_templates[pick("lavaland_bridge_horizontal_1.dmm", "lavaland_bridge_horizontal_2.dmm", "lavaland_bridge_horizontal_3.dmm", "lavaland_bridge_horizontal_4.dmm", "lavaland_bridge_horizontal_5.dmm", "lavaland_bridge_horizontal_6.dmm")] - template.load(loc, centered = TRUE) - else if((ismineralturf(north) || istype(north, /turf/simulated/floor/plating/asteroid)) && (ismineralturf(south) || istype(south, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(e1) || istype(e1, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(w1) || istype(w1, /turf/simulated/floor/plating/asteroid))) - template = GLOB.bridge_vertical_templates[pick("lavaland_bridge_vertical_1.dmm", "lavaland_bridge_vertical_2.dmm", "lavaland_bridge_vertical_3.dmm", "lavaland_bridge_vertical_4.dmm", "lavaland_bridge_vertical_5.dmm", "lavaland_bridge_vertical_6.dmm")] - template.load(loc, centered = TRUE) + var/turf/end = get_step(T, direction) + if(end.flags & LAVA_BRIDGE || !(ismineralturf(end) || istype(end, /turf/simulated/floor/plating/asteroid))) + return FALSE + + return TRUE + +/// Returns whether the passed in turf is a valid "passage". A valid passage is +/// a lava tile that has lava on both sides of it. Invalid passage tiles do not +/// look good as bridge walkways and defeat the purpose of there is floor right +/// next to it. +/obj/effect/spawner/dynamic_bridge/proc/valid_passage(turf/T) + if(T.flags & LAVA_BRIDGE) + return FALSE + if(!istype(T, /turf/simulated/floor/lava/mapping_lava)) + return FALSE + if(!istype(get_step(T, side_to_side[1]), /turf/simulated/floor/lava/mapping_lava)) + return FALSE + if(!istype(get_step(T, side_to_side[2]), /turf/simulated/floor/lava/mapping_lava)) + return FALSE + + return TRUE + +/obj/effect/spawner/dynamic_bridge/proc/make_pillar(turf/T) + for(var/obj/structure/spawner/S in T) + qdel(S) + for(var/mob/living/M in T) + qdel(M) + for(var/obj/structure/flora/F in T) + qdel(F) + + switch(bridge_theme) + if(LONG_BRIDGE_THEME_CULT) + T.ChangeTurf(/turf/simulated/wall/cult) + if(LONG_BRIDGE_THEME_HIERO) + T.ChangeTurf(/turf/simulated/wall/indestructible/hierophant) + if(LONG_BRIDGE_THEME_CLOCKWORK) + T.ChangeTurf(/turf/simulated/wall/clockwork) + if(LONG_BRIDGE_THEME_STONE) + T.ChangeTurf(/turf/simulated/wall/cult) + if(LONG_BRIDGE_THEME_WOOD) + T.ChangeTurf(/turf/simulated/wall/mineral/wood/nonmetal) + if(LONG_BRIDGE_THEME_CATWALK) + new /obj/structure/lattice/catwalk/mining(T) + new /obj/structure/marker_beacon/dock_marker/collision(T) + + T.flags |= LAVA_BRIDGE + +/obj/effect/spawner/dynamic_bridge/proc/make_walkway(turf/T) + for(var/obj/structure/spawner/S in T) + qdel(S) + for(var/mob/living/M in T) + qdel(M) + for(var/obj/structure/flora/F in T) + qdel(F) + + switch(bridge_theme) + if(LONG_BRIDGE_THEME_CULT) + T.ChangeTurf(/turf/simulated/floor/engine/cult/lavaland_air) + if(LONG_BRIDGE_THEME_HIERO) + T.ChangeTurf(/turf/simulated/floor/indestructible/hierophant) + if(LONG_BRIDGE_THEME_CLOCKWORK) + T.ChangeTurf(/turf/simulated/floor/clockwork/lavaland_air) + if(LONG_BRIDGE_THEME_STONE) + // Stone tiles are different sizes and shapes so these are + // "safe-looking" arrangements + switch(rand(1, 5)) + if(1) + new /obj/structure/stone_tile/block(T) + var/obj/structure/stone_tile/block/cracked/C = new(T) + C.dir = NORTH + if(2) + new /obj/structure/stone_tile/slab(T) + if(3) + new /obj/structure/stone_tile/surrounding(T) + new /obj/structure/stone_tile/center(T) + if(4) + new /obj/structure/stone_tile/slab/cracked(T) + if(5) + new /obj/structure/stone_tile/burnt(T) + var/obj/structure/stone_tile/surrounding_tile/ST = new(T) + ST.dir = WEST + var/obj/structure/stone_tile/block/B = new(T) + B.dir = NORTH + if(LONG_BRIDGE_THEME_WOOD) + T.ChangeTurf(/turf/simulated/floor/wood/lavaland_air) + if(prob(20)) + new /obj/effect/landmark/damageturf(T) + if(LONG_BRIDGE_THEME_CATWALK) + new /obj/structure/lattice/catwalk/mining(T) + + T.flags |= LAVA_BRIDGE + +/// Make a tile safe for player passage, for use at the bridge entrance and exits +/obj/effect/spawner/dynamic_bridge/proc/cleanup_edge(turf/T) + if(istype(T, /turf/simulated/floor/lava/mapping_lava)) + T.ChangeTurf(/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface) + T.icon_state = "basalt" // hate + +/obj/effect/spawner/dynamic_bridge/proc/attempt_bridge() + var/count = 1 + var/walk_dir = forwards_backwards[1] + var/turf/forward_step = get_turf(src) + var/turf/backward_step = get_turf(src) + var/turf/forward_goal + var/turf/backward_goal + var/bad_passage = FALSE + + while(count <= max_length && !(forward_goal && backward_goal) && !bad_passage) + if(walk_dir == forwards_backwards[1]) + if(!forward_goal) + forward_step = get_step(forward_step, walk_dir) + if(valid_landing(forward_step, walk_dir)) + forward_goal = forward_step + else if(!valid_passage(forward_step)) + bad_passage = TRUE + count++ + walk_dir = forwards_backwards[2] + else + if(!backward_goal) + backward_step = get_step(backward_step, walk_dir) + if(valid_landing(backward_step, walk_dir)) + backward_goal = backward_step + else if(!valid_passage(backward_step)) + bad_passage = TRUE + count++ + walk_dir = forwards_backwards[1] + + if(!bad_passage && count >= min_length && forward_goal && backward_goal) + for(var/turf/T in get_line(forward_goal, backward_goal)) + make_walkway(T) + for(var/turf/T in list( + get_step(forward_goal, side_to_side[1]), + get_step(forward_goal, side_to_side[2]), + get_step(backward_goal, side_to_side[1]), + get_step(backward_goal, side_to_side[2]))) + make_pillar(T) + for(var/turf/T in get_line( + get_step(get_step(forward_goal, side_to_side[1]), forwards_backwards[1]), + get_step(get_step(forward_goal, side_to_side[2]), forwards_backwards[1]))) + cleanup_edge(T) + for(var/turf/T in get_line( + get_step(get_step(backward_goal, side_to_side[1]), forwards_backwards[2]), + get_step(get_step(backward_goal, side_to_side[2]), forwards_backwards[2]))) + cleanup_edge(T) + + return TRUE + +#undef LONG_BRIDGE_THEME_CULT +#undef LONG_BRIDGE_THEME_HIERO +#undef LONG_BRIDGE_THEME_CLOCKWORK +#undef LONG_BRIDGE_THEME_STONE +#undef LONG_BRIDGE_THEME_WOOD +#undef LONG_BRIDGE_THEME_CATWALK diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm index 384f75a953f..ef8c45d74f8 100644 --- a/code/game/turfs/simulated/river.dm +++ b/code/game/turfs/simulated/river.dm @@ -107,7 +107,7 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets) else var/turf/river_turf = cur_turf.ChangeTurf(river_turf_type, ignore_air = TRUE) if(prob(1)) - new /obj/effect/spawner/bridge(river_turf) + new /obj/effect/spawner/dynamic_bridge(river_turf) spread_turf(river_turf, spread_prob, spread_prob_loss, whitelist_area_type) for(var/WP in river_nodes) @@ -135,7 +135,7 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets) if(!istype(T, start_turf.type) && T.ChangeTurf(start_turf.type, ignore_air = TRUE) && prob(probability)) spread_turf(T, probability - prob_loss, prob_loss, whitelisted_area) if(prob(1)) - new /obj/effect/spawner/bridge(T) + new /obj/effect/spawner/dynamic_bridge(T) for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed var/turf/T = F @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets) else if(istype(T, whitelist_turf_type) && !istype(T, start_turf.type)) T.ChangeTurf(shoreline_turf_type, ignore_air = TRUE) if(prob(1)) - new /obj/effect/spawner/bridge(T) + new /obj/effect/spawner/dynamic_bridge(T) #undef RIVER_MAX_X #undef RIVER_MAX_Y