mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 15:45:25 +01:00
Enable multi-sector lavaland. (#28358)
* Enable multi-sector lavaland. * fix exclude ci paths * remove old lavaland * Lewc review and other cleanups, add GPS stuff * rebuild tgui * fix ash storm no eligible areas * update test config, don't skip out on test level creation * unfuck example config * whoops * add north entrances to legion arena for easier traversal * TM config -- REVERT BEFORE MERGE * Make SSweather work on traits directly * flip order of procgen/ruin placement * fix GPS * fix budget in code * clobber prod config for lavaland ruin budget for TM * add relay to gulag * some more guards for procgen * separate relays * make gulag and base one ruin * bridge improvements * actually remove gulag map * make linter happy * harden ruin placement against failing Config changes made. Bypassing code ownership.
This commit is contained in:
committed by
GitHub
parent
f15e064bff
commit
07a22cdb64
@@ -34,8 +34,18 @@
|
||||
if(choice == "No")
|
||||
return
|
||||
|
||||
var/static/list/sectortypes = list(TRANSITION_TAG_SPACE, TRANSITION_TAG_LAVALAND)
|
||||
var/sectortype = tgui_input_list(usr, "Please select sector type", "", sectortypes)
|
||||
|
||||
if(!(sectortype in sectortypes))
|
||||
return
|
||||
|
||||
message_admins("[key_name_admin(usr)] made a space map")
|
||||
|
||||
|
||||
GLOB.space_manager.map_as_turfs(get_turf(usr))
|
||||
GLOB.space_manager.map_as_turfs(get_turf(usr), sectortype)
|
||||
log_admin("[key_name(usr)] made a space map")
|
||||
|
||||
|
||||
/proc/save_lavaland_maps()
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
GLOB.maploader.save_map(locate(1, 1, zlvl), locate(world.maxx, world.maxy, zlvl), "lavaland_[zlvl]")
|
||||
|
||||
@@ -184,14 +184,14 @@
|
||||
var/obj/O = A
|
||||
if(dangerous)
|
||||
O.fire_act(1000, 500)
|
||||
else
|
||||
else
|
||||
O.temperature_expose(exposed_temperature = 400)
|
||||
else if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(dangerous)
|
||||
L.adjust_fire_stacks(fire_stack_strength)
|
||||
L.IgniteMob()
|
||||
else
|
||||
else
|
||||
L.adjust_bodytemperature(10, 310)
|
||||
|
||||
/obj/structure/lightable/process()
|
||||
@@ -288,4 +288,14 @@
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
/obj/structure/lightable/torch/lava_bridge
|
||||
anchored = TRUE
|
||||
|
||||
/obj/structure/lightable/torch/lava_bridge/Initialize(mapload)
|
||||
. = ..()
|
||||
StartBurning()
|
||||
|
||||
/obj/structure/lightable/torch/lava_bridge/CheckOxygen()
|
||||
return TRUE // these load before SSair sets up atmos on Lavaland
|
||||
|
||||
#undef MIN_OXY_IGNITE
|
||||
|
||||
@@ -93,18 +93,18 @@ GLOBAL_LIST_INIT(caves_default_flora_spawns, list(
|
||||
|
||||
/datum/caves_theme/proc/setup()
|
||||
var/result = rustg_dbp_generate("[seed]", "[perlin_accuracy]", "[perlin_stamp_size]", "[world.maxx]", "[perlin_lower_range]", "[perlin_upper_range]")
|
||||
var/z = level_name_to_num(MINING)
|
||||
for(var/turf/T in block(1, 1, z, world.maxx, world.maxy, z))
|
||||
if(!istype(get_area(T), /area/lavaland/surface/outdoors/unexplored))
|
||||
continue
|
||||
if(!istype(T, /turf/simulated/mineral))
|
||||
continue
|
||||
var/c = result[world.maxx * (T.y - 1) + T.x]
|
||||
if(c == "1")
|
||||
T.ChangeTurf(/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface)
|
||||
on_change(T)
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
for(var/turf/T in block(1, 1, zlvl, world.maxx, world.maxy, zlvl))
|
||||
if(!istype(get_area(T), /area/lavaland/surface/outdoors/unexplored))
|
||||
continue
|
||||
if(!istype(T, /turf/simulated/mineral))
|
||||
continue
|
||||
var/c = result[world.maxx * (T.y - 1) + T.x]
|
||||
if(c == "1")
|
||||
T.ChangeTurf(/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface)
|
||||
on_change(T)
|
||||
|
||||
CHECK_TICK
|
||||
CHECK_TICK
|
||||
|
||||
/datum/caves_theme/proc/on_change(turf/T)
|
||||
if(prob(2))
|
||||
@@ -115,6 +115,8 @@ GLOBAL_LIST_INIT(caves_default_flora_spawns, list(
|
||||
/datum/caves_theme/proc/safe_replace(turf/T)
|
||||
if(T.flags & NO_LAVA_GEN)
|
||||
return FALSE
|
||||
if(istype(T, /turf/template_noop))
|
||||
return TRUE
|
||||
if(!istype(get_area(T), /area/lavaland/surface/outdoors/unexplored))
|
||||
return FALSE
|
||||
if(istype(T, /turf/simulated/floor/chasm))
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
var/turf/simulated/floor/primary_turf_type
|
||||
/// Icon state of planet present on background of station Z-level
|
||||
var/planet_icon_state
|
||||
var/list/built_bridges
|
||||
/// Icon for glass floors
|
||||
var/primary_turf_type_icon
|
||||
|
||||
@@ -14,12 +15,75 @@
|
||||
else if(!ispath(primary_turf_type))
|
||||
stack_trace("Wrong turf type `[primary_turf_type.type]` in `[type]` lavaland theme")
|
||||
|
||||
built_bridges = list()
|
||||
|
||||
/**
|
||||
* This proc should do all theme specific thing.
|
||||
* Now it only generates rivers, but it can do all stuff you desire.
|
||||
*/
|
||||
/datum/lavaland_theme/proc/setup()
|
||||
return
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
setup_multisector()
|
||||
|
||||
/datum/lavaland_theme/proc/setup_multisector()
|
||||
var/bridge_diameter = 14
|
||||
var/interval = 20
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
var/datum/space_level/level = GLOB.space_manager.get_zlev(zlvl)
|
||||
if(!built_bridges["[zlvl]"])
|
||||
built_bridges["[zlvl]"] = list()
|
||||
|
||||
for(var/d in level.neighbors)
|
||||
if(d == Z_LEVEL_SOUTH)
|
||||
var/datum/space_level/connected = level.get_connection(Z_LEVEL_SOUTH)
|
||||
if(!built_bridges["[connected.zpos]"])
|
||||
built_bridges["[connected.zpos]"] = list()
|
||||
var/left_margin = TRANSITIONEDGE + 5
|
||||
while(left_margin < world.maxx - TRANSITIONEDGE)
|
||||
if(prob(50))
|
||||
var/left_edge = rand(left_margin, left_margin + bridge_diameter)
|
||||
var/loc = locate(left_edge, bridge_diameter / 2 + 1, level.zpos)
|
||||
var/datum/map_template/ruin/lavaland/zlvl_bridge/template = GLOB.lavaland_zlvl_bridge_templates["lavaland_zlvl_bridge_vertical_1.dmm"]
|
||||
template.load(loc, centered = TRUE)
|
||||
// now make sure we line up another bridge on the linked map
|
||||
loc = locate(left_edge, world.maxy - (bridge_diameter / 2) + 1, connected.zpos)
|
||||
template.load(loc, centered = TRUE)
|
||||
|
||||
left_margin += interval
|
||||
|
||||
built_bridges["[zlvl]"]["[connected.zpos]"] = Z_LEVEL_SOUTH
|
||||
built_bridges["[connected.zpos]"]["[zlvl]"] = Z_LEVEL_NORTH
|
||||
|
||||
else if(d == Z_LEVEL_EAST)
|
||||
var/datum/space_level/connected = level.get_connection(Z_LEVEL_EAST)
|
||||
if(!built_bridges["[connected.zpos]"])
|
||||
built_bridges["[connected.zpos]"] = list()
|
||||
var/north_margin = TRANSITIONEDGE + 5
|
||||
while(north_margin < world.maxy - TRANSITIONEDGE)
|
||||
if(prob(50))
|
||||
var/north_edge = rand(north_margin, north_margin + bridge_diameter)
|
||||
var/loc = locate(bridge_diameter / 2, north_edge, level.zpos)
|
||||
var/datum/map_template/ruin/lavaland/zlvl_bridge/template = GLOB.lavaland_zlvl_bridge_templates["lavaland_zlvl_bridge_horizontal_1.dmm"]
|
||||
template.load(loc, centered = TRUE)
|
||||
// now make sure we line up another bridge on the linked map
|
||||
loc = locate(world.maxx - (bridge_diameter / 2) + 1, north_edge, connected.zpos)
|
||||
template.load(loc, centered = TRUE)
|
||||
|
||||
north_margin += interval
|
||||
|
||||
built_bridges["[zlvl]"]["[connected.zpos]"] = Z_LEVEL_EAST
|
||||
built_bridges["[connected.zpos]"]["[zlvl]"] = Z_LEVEL_WEST
|
||||
|
||||
/datum/lavaland_theme/proc/get_bridge_direction(z1, z2)
|
||||
if(z1 == z2)
|
||||
return null
|
||||
|
||||
if(("[z1]" in built_bridges) && ("[z2]" in built_bridges["[z1]"]))
|
||||
return built_bridges["[z1]"]["[z2]"]
|
||||
if(("[z2]" in built_bridges) && ("[z1]" in built_bridges["[z2]"]))
|
||||
return built_bridges["[z2]"]["[z1]"]
|
||||
|
||||
return null
|
||||
|
||||
/datum/lavaland_theme/lava
|
||||
name = "lava"
|
||||
@@ -28,8 +92,10 @@
|
||||
primary_turf_type_icon = 'icons/turf/floors/lava.dmi'
|
||||
|
||||
/datum/lavaland_theme/lava/setup()
|
||||
var/datum/river_spawner/lava_spawner = new(level_name_to_num(MINING))
|
||||
lava_spawner.generate()
|
||||
. = ..()
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
var/datum/river_spawner/lava_spawner = new(zlvl)
|
||||
lava_spawner.generate()
|
||||
|
||||
/datum/lavaland_theme/plasma
|
||||
name = "plasma"
|
||||
@@ -38,9 +104,11 @@
|
||||
primary_turf_type_icon = 'icons/turf/floors/liquidplasma.dmi'
|
||||
|
||||
/datum/lavaland_theme/plasma/setup()
|
||||
var/datum/river_spawner/spawner = new(level_name_to_num(MINING))
|
||||
spawner.generate(nodes = 2)
|
||||
spawner.generate(nodes = 2) // twice
|
||||
. = ..()
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
var/datum/river_spawner/spawner = new(zlvl)
|
||||
spawner.generate(nodes = 2)
|
||||
spawner.generate(nodes = 2) // twice
|
||||
|
||||
/datum/lavaland_theme/chasm
|
||||
name = "chasm"
|
||||
@@ -49,5 +117,7 @@
|
||||
primary_turf_type_icon = 'icons/turf/floors/Chasms.dmi'
|
||||
|
||||
/datum/lavaland_theme/chasm/setup()
|
||||
var/datum/river_spawner/spawner = new(level_name_to_num(MINING), spread_prob_ = 10, spread_prob_loss_ = 5)
|
||||
spawner.generate(nodes = 6, min_x = 50, min_y = 7, max_x = 250, max_y = 225)
|
||||
. = ..()
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
var/datum/river_spawner/spawner = new(zlvl, spread_prob_ = 10, spread_prob_loss_ = 5)
|
||||
spawner.generate(nodes = 6, min_x = 50, min_y = 7, max_x = 250, max_y = 225)
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
. = ..()
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(istype(T) && T.z == level_name_to_num(MINING))
|
||||
if(istype(T) && (T.z in levels_by_trait(ORE_LEVEL)))
|
||||
var/obj/effect/landmark/river_waypoint/waypoint = new(T)
|
||||
GLOB.river_waypoint_presets += waypoint
|
||||
|
||||
|
||||
@@ -27,8 +27,9 @@
|
||||
GLOB.navigation_computers += src
|
||||
if(access_station)
|
||||
jumpto_ports += list("nav_z[level_name_to_num(MAIN_STATION)]" = 1)
|
||||
if(access_mining && GLOB.configuration.ruins.enable_lavaland)
|
||||
jumpto_ports += list("nav_z[level_name_to_num(MINING)]" = 1)
|
||||
if(access_mining)
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
jumpto_ports += list("nav_z[zlvl]" = 1)
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/Destroy()
|
||||
GLOB.navigation_computers -= src
|
||||
|
||||
@@ -572,11 +572,11 @@
|
||||
|
||||
//update mining and labor shuttle ash storm audio
|
||||
if(mobile_port.id in list("mining", "laborcamp"))
|
||||
var/mining_zlevel = level_name_to_num(MINING)
|
||||
var/datum/weather/ash_storm/W = SSweather.get_weather(mining_zlevel, /area/lavaland/surface/outdoors)
|
||||
if(W)
|
||||
W.update_eligible_areas()
|
||||
W.update_audio()
|
||||
for(var/zlvl in levels_by_trait(ORE_LEVEL))
|
||||
var/datum/weather/ash_storm/W = SSweather.get_weather(zlvl, /area/lavaland/surface/outdoors)
|
||||
if(W)
|
||||
W.update_eligible_areas()
|
||||
W.update_audio()
|
||||
|
||||
mobile_port.unlockPortDoors(S1)
|
||||
|
||||
|
||||
@@ -72,10 +72,10 @@ GLOBAL_LIST_INIT(default_map_traits, list(CC_TRANSITION_CONFIG))
|
||||
*
|
||||
* Returns a list of zlevel numbers which can be accessed from travelling space naturally
|
||||
*/
|
||||
/proc/get_all_linked_levels_zpos()
|
||||
/proc/get_all_linked_levels_zpos(transit_tag = TRANSITION_TAG_SPACE)
|
||||
var/list/znums = list()
|
||||
for(var/i in GLOB.space_manager.z_list)
|
||||
var/datum/space_level/SL = GLOB.space_manager.z_list[i]
|
||||
if(SL.linkage == CROSSLINKED)
|
||||
if(SL.transition_tag == transit_tag && SL.linkage == CROSSLINKED)
|
||||
znums |= SL.zpos
|
||||
return znums
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
// It's UNAFFECTED by default because none of the space turfs are normally linked up
|
||||
// so we don't need to rebuild transitions if an UNAFFECTED level is requested
|
||||
var/linkage = UNAFFECTED
|
||||
var/transition_tag
|
||||
// # imaginary placements on the grid - these reflect the point it is linked to
|
||||
var/xi
|
||||
var/yi
|
||||
@@ -17,22 +18,37 @@
|
||||
var/list/transit_east = list()
|
||||
var/list/transit_west = list()
|
||||
|
||||
var/transition_border_north
|
||||
var/transition_border_east
|
||||
var/transition_border_south
|
||||
var/transition_border_west
|
||||
|
||||
// Init deferral stuff
|
||||
var/dirt_count = 0
|
||||
var/list/init_list = list()
|
||||
|
||||
/datum/space_level/New(z, level_name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT))
|
||||
/datum/space_level/New(z, level_name, transition_type = SELFLOOPING, traits = list(BLOCK_TELEPORT), transition_tag_)
|
||||
name = level_name
|
||||
zpos = z
|
||||
flags = traits
|
||||
transition_tag = transition_tag_
|
||||
|
||||
set_transition_borders()
|
||||
build_space_destination_arrays()
|
||||
set_linkage(transition_type)
|
||||
set_navbeacon()
|
||||
|
||||
/datum/space_level/proc/set_transition_borders()
|
||||
// can't set these in declaration because world.maxx/y are null for some reason
|
||||
transition_border_north = TRANSITION_BORDER_NORTH
|
||||
transition_border_east = TRANSITION_BORDER_EAST
|
||||
transition_border_south = TRANSITION_BORDER_SOUTH
|
||||
transition_border_west = TRANSITION_BORDER_WEST
|
||||
|
||||
/datum/space_level/Destroy()
|
||||
if(linkage == CROSSLINKED)
|
||||
if(GLOB.space_manager.linkage_map)
|
||||
remove_from_space_network(GLOB.space_manager.linkage_map)
|
||||
if(GLOB.space_manager.linkage_maps[transition_tag])
|
||||
remove_from_space_network(GLOB.space_manager.linkage_maps[transition_tag])
|
||||
|
||||
GLOB.space_manager.unbuilt_space_transitions -= src
|
||||
GLOB.space_manager.z_list -= "[zpos]"
|
||||
@@ -41,60 +57,60 @@
|
||||
/datum/space_level/proc/build_space_destination_arrays()
|
||||
// We skip `add_to_transit` here because we want to skip the checks in order to save time
|
||||
// Bottom border
|
||||
for(var/turf/space/S in block(locate(1,1,zpos),locate(world.maxx,TRANSITION_BORDER_SOUTH,zpos)))
|
||||
for(var/turf/S in block(locate(1,1,zpos),locate(world.maxx,transition_border_south,zpos)))
|
||||
transit_south |= S
|
||||
|
||||
// Top border
|
||||
for(var/turf/space/S in block(locate(1,world.maxy,zpos),locate(world.maxx,TRANSITION_BORDER_NORTH,zpos)))
|
||||
for(var/turf/S in block(locate(1,world.maxy,zpos),locate(world.maxx,transition_border_north,zpos)))
|
||||
transit_north |= S
|
||||
|
||||
// Left border
|
||||
for(var/turf/space/S in block(locate(1,TRANSITION_BORDER_SOUTH + 1,zpos),locate(TRANSITION_BORDER_WEST,TRANSITION_BORDER_NORTH - 1,zpos)))
|
||||
for(var/turf/S in block(locate(1, transition_border_south + 1, zpos), locate(transition_border_west, transition_border_north - 1, zpos)))
|
||||
transit_west |= S
|
||||
|
||||
// Right border
|
||||
for(var/turf/space/S in block(locate(TRANSITION_BORDER_EAST,TRANSITION_BORDER_SOUTH + 1,zpos),locate(world.maxx,TRANSITION_BORDER_NORTH - 1,zpos)))
|
||||
for(var/turf/S in block(locate(transition_border_east, transition_border_south + 1, zpos),locate(world.maxx, transition_border_north - 1, zpos)))
|
||||
transit_east |= S
|
||||
|
||||
/datum/space_level/proc/add_to_transit(turf/space/S)
|
||||
if(S.y <= TRANSITION_BORDER_SOUTH)
|
||||
/datum/space_level/proc/add_to_transit(turf/S)
|
||||
if(S.y <= transition_border_south)
|
||||
transit_south |= S
|
||||
return
|
||||
|
||||
// Top border
|
||||
if(S.y >= TRANSITION_BORDER_NORTH)
|
||||
if(S.y >= transition_border_north)
|
||||
transit_north |= S
|
||||
return
|
||||
|
||||
// Left border
|
||||
if(S.x <= TRANSITION_BORDER_WEST)
|
||||
if(S.x <= transition_border_west)
|
||||
transit_west |= S
|
||||
return
|
||||
|
||||
// Right border
|
||||
if(S.x >= TRANSITION_BORDER_EAST)
|
||||
if(S.x >= transition_border_east)
|
||||
transit_east |= S
|
||||
|
||||
/datum/space_level/proc/remove_from_transit(turf/space/S)
|
||||
if(S.y <= TRANSITION_BORDER_SOUTH)
|
||||
/datum/space_level/proc/remove_from_transit(turf/S)
|
||||
if(S.y <= transition_border_south)
|
||||
transit_south -= S
|
||||
return
|
||||
|
||||
// Top border
|
||||
if(S.y >= TRANSITION_BORDER_NORTH)
|
||||
if(S.y >= transition_border_north)
|
||||
transit_north -= S
|
||||
return
|
||||
|
||||
// Left border
|
||||
if(S.x <= TRANSITION_BORDER_WEST)
|
||||
if(S.x <= transition_border_west)
|
||||
transit_west -= S
|
||||
return
|
||||
|
||||
// Right border
|
||||
if(S.x >= TRANSITION_BORDER_EAST)
|
||||
if(S.x >= transition_border_east)
|
||||
transit_east -= S
|
||||
|
||||
/datum/space_level/proc/apply_transition(turf/space/S)
|
||||
/datum/space_level/proc/apply_transition(turf/S)
|
||||
if(src in GLOB.space_manager.unbuilt_space_transitions)
|
||||
return // Let the space manager handle this one
|
||||
switch(linkage)
|
||||
@@ -124,8 +140,8 @@
|
||||
return
|
||||
// Remove ourselves from the linkage map if we were cross-linked
|
||||
if(linkage == CROSSLINKED)
|
||||
if(GLOB.space_manager.linkage_map)
|
||||
remove_from_space_network(GLOB.space_manager.linkage_map)
|
||||
if(GLOB.space_manager.linkage_maps[transition_tag])
|
||||
remove_from_space_network(GLOB.space_manager.linkage_maps[transition_tag])
|
||||
|
||||
GLOB.space_manager.unbuilt_space_transitions |= src
|
||||
linkage = transition_type
|
||||
@@ -182,3 +198,11 @@ GLOBAL_LIST_INIT(cable_typecache, typecacheof(/obj/structure/cable))
|
||||
SSmachines.setup_template_powernets(cables)
|
||||
cables.Cut()
|
||||
log_debug("Took [stop_watch(watch)]s")
|
||||
|
||||
/datum/space_level/lavaland/set_transition_borders()
|
||||
// really no reason why these need to be so large,
|
||||
// especially since ruin placement is already constrained
|
||||
transition_border_north = (world.maxy - 4)
|
||||
transition_border_east = (world.maxx - 4)
|
||||
transition_border_south = 3
|
||||
transition_border_west = 3
|
||||
|
||||
@@ -315,33 +315,45 @@
|
||||
// Separating this from initialization gives us time in which we can add more crosslink z levels
|
||||
// before we bake in all our connections
|
||||
/datum/zlev_manager/proc/route_linkage()
|
||||
var/list/crosslinks = list()
|
||||
var/list/linkage_networks = list()
|
||||
|
||||
var/datum/space_level/D
|
||||
for(var/A in z_list)
|
||||
D = z_list[A]
|
||||
if(D.linkage == CROSSLINKED)
|
||||
linkage_networks |= D.transition_tag
|
||||
|
||||
for(var/tag in linkage_networks)
|
||||
var/list/crosslinks = list()
|
||||
for(var/A in z_list)
|
||||
D = z_list[A]
|
||||
if(D.transition_tag != tag)
|
||||
continue
|
||||
crosslinks.Add(D)
|
||||
D.reset_connections()
|
||||
|
||||
// We create an imaginary, square, grid, with dimensions that are
|
||||
// twice the number of z levels, plus one, per side
|
||||
// We create an imaginary, square, grid, with dimensions that are
|
||||
// twice the number of z levels, plus one, per side
|
||||
|
||||
// This is big enough to hold a straight line from the center to any side
|
||||
// `point_grid` is indexed as a 2 way matrix of these points
|
||||
// `grid` is a flat list of these same above points
|
||||
// This is big enough to hold a straight line from the center to any side
|
||||
// `point_grid` is indexed as a 2 way matrix of these points
|
||||
// `grid` is a flat list of these same above points
|
||||
|
||||
// Each point represents a possible z level position
|
||||
if(linkage_map)
|
||||
qdel(linkage_map)
|
||||
linkage_map = new
|
||||
// Each point represents a possible z level position
|
||||
if(linkage_maps[tag])
|
||||
qdel(linkage_maps[tag])
|
||||
|
||||
// Now, we pop entries in a random order from our list of space levels
|
||||
// and assign its connections based on the grid
|
||||
while(length(crosslinks))
|
||||
D = pick(crosslinks)
|
||||
crosslinks.Remove(D)
|
||||
// Add it to our space grid
|
||||
D.add_to_space_network(linkage_map)
|
||||
var/datum/spacewalk_grid/new_grid = new
|
||||
|
||||
// Now, we pop entries in a random order from our list of space levels
|
||||
// and assign its connections based on the grid
|
||||
while(length(crosslinks))
|
||||
D = pick(crosslinks)
|
||||
crosslinks.Remove(D)
|
||||
// Add it to our space grid
|
||||
D.add_to_space_network(new_grid)
|
||||
|
||||
linkage_maps[tag] = new_grid
|
||||
|
||||
// Used to loop through turfs in world, now just goes through each level's
|
||||
// transit turf cache
|
||||
@@ -350,7 +362,7 @@
|
||||
log_debug("Assigning space turf destinations...")
|
||||
var/datum/space_level/D
|
||||
var/datum/space_level/E
|
||||
var/turf/space/S
|
||||
var/turf/S
|
||||
var/list/levels_to_rebuild = unbuilt_space_transitions
|
||||
|
||||
if(force_all_rebuilds)
|
||||
@@ -392,6 +404,7 @@
|
||||
S = B
|
||||
E = D.get_connection(Z_LEVEL_NORTH)
|
||||
S.set_transition_north(E.zpos)
|
||||
|
||||
unbuilt_space_transitions -= D
|
||||
|
||||
log_debug("Assigning space turf destinations complete. Took [stop_watch(timer)]s.")
|
||||
@@ -402,10 +415,11 @@
|
||||
setup_space_destinations(force_all_rebuilds = TRUE)
|
||||
|
||||
// A debugging proc that expresses the map's shape as a bunch of turfs
|
||||
/datum/zlev_manager/proc/map_as_turfs(turf/center)
|
||||
/datum/zlev_manager/proc/map_as_turfs(turf/center, sector_type)
|
||||
// size is odd
|
||||
// -1, /2 to get distance from the center
|
||||
// center - radius = bottom left coordinate
|
||||
var/datum/spacewalk_grid/linkage_map = linkage_maps[sector_type]
|
||||
var/datum/point/P
|
||||
var/turf/our_spot
|
||||
var/grid_desc = ""
|
||||
@@ -415,8 +429,11 @@
|
||||
our_spot = locate(center.x + i, center.y + j, center.z)
|
||||
grid_desc = "([i],[j])"
|
||||
if(!isnull(P))
|
||||
our_spot = our_spot.ChangeTurf(/turf/simulated/floor/plating/snow)
|
||||
grid_desc += ": Z level [P.spl.zpos]. "
|
||||
if(P.spl.name == MAIN_STATION)
|
||||
our_spot = our_spot.ChangeTurf(/turf/simulated/floor/engine)
|
||||
else
|
||||
our_spot = our_spot.ChangeTurf(/turf/simulated/floor/plating/snow)
|
||||
grid_desc += ": Z level [P.spl.zpos]. Name: [P.spl.name] "
|
||||
var/datum/space_level/up = P.spl.get_connection(Z_LEVEL_NORTH)
|
||||
var/datum/space_level/down = P.spl.get_connection(Z_LEVEL_SOUTH)
|
||||
var/datum/space_level/right = P.spl.get_connection(Z_LEVEL_EAST)
|
||||
|
||||
@@ -9,7 +9,7 @@ GLOBAL_DATUM_INIT(space_manager, /datum/zlev_manager, new())
|
||||
// Levels that need their transitions rebuilt
|
||||
var/list/unbuilt_space_transitions = list()
|
||||
|
||||
var/datum/spacewalk_grid/linkage_map
|
||||
var/list/linkage_maps = list()
|
||||
var/initialized = 0
|
||||
|
||||
var/list/areas_in_z = list()
|
||||
@@ -108,7 +108,7 @@ GLOBAL_DATUM_INIT(space_manager, /datum/zlev_manager, new())
|
||||
|
||||
// Increments the max z-level by one
|
||||
// For convenience's sake returns the z-level added
|
||||
/datum/zlev_manager/proc/add_new_zlevel(name, linkage = SELFLOOPING, traits = list(BLOCK_TELEPORT))
|
||||
/datum/zlev_manager/proc/add_new_zlevel(name, linkage = SELFLOOPING, traits = list(BLOCK_TELEPORT), transition_tag, level_type = /datum/space_level)
|
||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, args)
|
||||
if(name in levels_by_name)
|
||||
throw EXCEPTION("Name already in use: [name]")
|
||||
@@ -116,7 +116,7 @@ GLOBAL_DATUM_INIT(space_manager, /datum/zlev_manager, new())
|
||||
SSai_controllers.on_max_z_changed()
|
||||
var/our_z = world.maxz
|
||||
milla_init_z(our_z)
|
||||
var/datum/space_level/S = new /datum/space_level(our_z, name, transition_type = linkage, traits = traits)
|
||||
var/datum/space_level/S = new level_type(our_z, name, transition_type = linkage, traits = traits, transition_tag_ = transition_tag)
|
||||
levels_by_name[name] = S
|
||||
z_list["[our_z]"] = S
|
||||
return our_z
|
||||
|
||||
@@ -78,6 +78,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
SStgui.update_uis(src)
|
||||
|
||||
/obj/item/gps/ui_data(mob/user)
|
||||
var/list/mining_zlevels = levels_by_trait(ORE_LEVEL)
|
||||
var/list/data = list()
|
||||
if(emped)
|
||||
data["emped"] = TRUE
|
||||
@@ -106,13 +107,24 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
var/turf/GT = get_turf(G)
|
||||
if(isnull(GT) || !G.tracking || G == src)
|
||||
continue
|
||||
if((G.local || same_z) && (GT.z != T.z))
|
||||
|
||||
// If both signals are on lavaland, we don't skip them, because we want
|
||||
// to have some indication of where lavaland sector bridges are, which
|
||||
// we do by providing a directional arrow, without distance, in the GPS UI.
|
||||
var/both_lavaland = (T.z in mining_zlevels) && (G.z in mining_zlevels)
|
||||
if((!both_lavaland) && (G.local || same_z) && (GT.z != T.z))
|
||||
continue
|
||||
|
||||
var/list/signal = list("tag" = G.gpstag, "area" = null, "position" = null)
|
||||
if(!G.emped)
|
||||
signal["area"] = get_area_name(G, TRUE)
|
||||
signal["position"] = ATOM_COORDS(GT)
|
||||
|
||||
if(both_lavaland && T.z != GT.z)
|
||||
var/bridge_direction = SSmapping.lavaland_theme.get_bridge_direction(GT.z, T.z)
|
||||
if(bridge_direction)
|
||||
signal["due"] = dir2angle(text2num(bridge_direction))
|
||||
|
||||
signals += list(signal)
|
||||
data["signals"] = signals
|
||||
|
||||
|
||||
Reference in New Issue
Block a user