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:
warriorstar-orion
2025-04-08 06:18:46 -07:00
committed by GitHub
parent f15e064bff
commit 07a22cdb64
41 changed files with 104558 additions and 492 deletions
@@ -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
+44 -20
View File
@@ -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