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
+4
View File
@@ -160,6 +160,10 @@
min_ambience_cooldown = 70 SECONDS
max_ambience_cooldown = 220 SECONDS
/area/lavaland/surface/gulag_rock
name = "Lavaland Wastes"
outdoors = TRUE
/area/lavaland/surface/outdoors
name = "Lavaland Wastes"
outdoors = TRUE
+1
View File
@@ -33,6 +33,7 @@
return
/turf/simulated/floor/lava/Entered(atom/movable/AM)
..()
if(burn_stuff(AM))
START_PROCESSING(SSprocessing, src)
+7 -5
View File
@@ -50,14 +50,16 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets)
while(num_spawned < nodes && length(possible_locs))
// Random chance of pulling a pre-mapped river waypoint instead.
if(length(GLOB.river_waypoint_presets) && prob(50))
var/obj/effect/landmark/river_waypoint/waypoint = pick_n_take(GLOB.river_waypoint_presets)
river_nodes += waypoint
num_spawned++
var/obj/effect/landmark/river_waypoint/waypoint = pick(GLOB.river_waypoint_presets)
if(waypoint.z == target_z)
river_nodes += waypoint
num_spawned++
GLOB.river_waypoint_presets -= waypoint
else
var/turf/T = pick(possible_locs)
var/turf/T = pick_n_take(possible_locs)
var/area/A = get_area(T)
if(!istype(A, whitelist_area_type) || (T.flags & NO_LAVA_GEN))
possible_locs -= T
continue
else
river_nodes += new /obj/effect/landmark/river_waypoint(T)
num_spawned++
+2 -70
View File
@@ -13,10 +13,6 @@
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
intact = FALSE
var/destination_z
var/destination_x
var/destination_y
atmos_mode = ATMOS_MODE_SPACE
/turf/space/Initialize(mapload)
@@ -51,14 +47,14 @@
return INITIALIZE_HINT_NORMAL
/turf/space/BeforeChange()
/turf/BeforeChange()
..()
var/datum/space_level/S = GLOB.space_manager.get_zlev(z)
S.remove_from_transit(src)
if(light_sources) // Turn off starlight, if present
set_light(0)
/turf/space/AfterChange(ignore_air, keep_cabling = FALSE)
/turf/AfterChange(ignore_air, keep_cabling = FALSE)
..()
var/datum/space_level/S = GLOB.space_manager.get_zlev(z)
S.add_to_transit(src)
@@ -124,42 +120,6 @@
if((!(A) || !(src in A.locs)))
return
if(destination_z && destination_x && destination_y && !A.pulledby && !HAS_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING) && !HAS_TRAIT(A, TRAIT_NO_EDGE_TRANSITIONS))
var/tx = destination_x
var/ty = destination_y
var/turf/DT = locate(tx, ty, destination_z)
var/itercount = 0
while(DT.density || istype(DT.loc, /area/shuttle)) // Extend towards the center of the map, trying to look for a better place to arrive
if(itercount++ >= 100)
stack_trace("SPACE Z-TRANSIT ERROR: Could not find a safe place to land [A] within 100 iterations.")
break
if(tx < 128)
tx++
else
tx--
if(ty < 128)
ty++
else
ty--
DT = locate(tx, ty, destination_z)
ADD_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT) // roundstart because its robust and won't be removed by someone being an idiot
A.forceMove(DT)
REMOVE_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT)
itercount = 0
var/atom/movable/current_pull = A.pulling
while(current_pull)
if(itercount > 100)
stack_trace("SPACE Z-TRANSIT ERROR: [A] encountered a possible infinite loop while traveling through z-levels.")
break
var/turf/target_turf = get_step(current_pull.pulledby.loc, REVERSE_DIR(current_pull.pulledby.dir)) || current_pull.pulledby.loc
ADD_TRAIT(current_pull, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT)
current_pull.forceMove(target_turf)
REMOVE_TRAIT(current_pull, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT)
current_pull = current_pull.pulling
itercount++
/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj)
var/cur_x
var/cur_y
@@ -277,34 +237,6 @@
return 1
return 0
/turf/space/proc/set_transition_north(dest_z)
destination_x = x
destination_y = TRANSITION_BORDER_SOUTH + 1
destination_z = dest_z
/turf/space/proc/set_transition_south(dest_z)
destination_x = x
destination_y = TRANSITION_BORDER_NORTH - 1
destination_z = dest_z
/turf/space/proc/set_transition_east(dest_z)
destination_x = TRANSITION_BORDER_WEST + 1
destination_y = y
destination_z = dest_z
/turf/space/proc/set_transition_west(dest_z)
destination_x = TRANSITION_BORDER_EAST - 1
destination_y = y
destination_z = dest_z
/turf/space/proc/remove_transitions()
destination_z = initial(destination_z)
/turf/space/attack_ghost(mob/dead/observer/user)
if(destination_z)
var/turf/T = locate(destination_x, destination_y, destination_z)
user.forceMove(T)
/turf/space/acid_act(acidpwr, acid_volume)
return 0
+79 -4
View File
@@ -90,6 +90,12 @@
var/list/milla_data = null
new_attack_chain = TRUE
/// The destination x-coordinate that atoms entering this turf will be automatically moved to.
var/destination_x
/// The destination y-coordinate that atoms entering this turf will be automatically moved to.
var/destination_y
/// The destination z-level that atoms entering this turf will be automatically moved to.
var/destination_z
/turf/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
@@ -226,18 +232,59 @@
return FALSE
return TRUE
/turf/Entered(atom/movable/M, atom/OL, ignoreRest = FALSE)
/turf/Entered(atom/movable/A, atom/OL, ignoreRest = FALSE)
..()
if(ismob(M))
var/mob/O = M
if(ismob(A))
var/mob/O = A
if(!O.lastarea)
O.lastarea = get_area(O.loc)
// If an opaque movable atom moves around we need to potentially update visibility.
if(M.opacity)
if(A.opacity)
has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case.
reconsider_lights()
if((!(A) || !(src in A.locs)))
return
if(destination_z && destination_x && destination_y && !A.pulledby && !HAS_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING) && !HAS_TRAIT(A, TRAIT_NO_EDGE_TRANSITIONS))
var/tx = destination_x
var/ty = destination_y
var/turf/DT = locate(tx, ty, destination_z)
var/itercount = 0
while(DT.density || istype(DT.loc, /area/shuttle)) // Extend towards the center of the map, trying to look for a better place to arrive
if(itercount++ >= 100)
stack_trace("SPACE Z-TRANSIT ERROR: Could not find a safe place to land [A] within 100 iterations.")
break
if(tx < 128)
tx++
else
tx--
if(ty < 128)
ty++
else
ty--
DT = locate(tx, ty, destination_z)
ADD_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT) // roundstart because its robust and won't be removed by someone being an idiot
A.forceMove(DT)
REMOVE_TRAIT(A, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT)
itercount = 0
var/atom/movable/current_pull = A.pulling
while(current_pull)
if(itercount > 100)
stack_trace("SPACE Z-TRANSIT ERROR: [A] encountered a possible infinite loop while traveling through z-levels.")
break
var/turf/target_turf = get_step(current_pull.pulledby.loc, REVERSE_DIR(current_pull.pulledby.dir)) || current_pull.pulledby.loc
ADD_TRAIT(current_pull, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT)
current_pull.forceMove(target_turf)
REMOVE_TRAIT(current_pull, TRAIT_CURRENTLY_Z_MOVING, ROUNDSTART_TRAIT)
current_pull = current_pull.pulling
itercount++
return TRUE
/turf/proc/levelupdate()
for(var/obj/O in src)
if(O.level == 1 && O.initialized) // Only do this if the object has initialized
@@ -792,6 +839,34 @@
/turf/_clear_signal_refs()
return
/turf/proc/set_transition_north(dest_z)
destination_x = x
destination_y = TRANSITION_BORDER_SOUTH + 1
destination_z = dest_z
/turf/proc/set_transition_south(dest_z)
destination_x = x
destination_y = TRANSITION_BORDER_NORTH - 1
destination_z = dest_z
/turf/proc/set_transition_east(dest_z)
destination_x = TRANSITION_BORDER_WEST + 1
destination_y = y
destination_z = dest_z
/turf/proc/set_transition_west(dest_z)
destination_x = TRANSITION_BORDER_EAST - 1
destination_y = y
destination_z = dest_z
/turf/proc/remove_transitions()
destination_z = initial(destination_z)
/turf/attack_ghost(mob/dead/observer/user)
if(destination_z)
var/turf/T = locate(destination_x, destination_y, destination_z)
user.forceMove(T)
/// Returns whether it is safe for an atom to move across this turf
/// TODO: Things like lava will need to have more specialized code
/// but that can wait for when we port basic mobs that may actually