mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 19:44:09 +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
@@ -8,7 +8,7 @@ SUBSYSTEM_DEF(weather)
|
||||
runlevels = RUNLEVEL_GAME
|
||||
offline_implications = "Ash storms will no longer trigger. No immediate action is needed."
|
||||
var/list/processing = list()
|
||||
var/list/eligible_zlevels = list()
|
||||
var/list/eligible_traits = list()
|
||||
var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming
|
||||
cpu_display = SS_CPUDISPLAY_LOW
|
||||
|
||||
@@ -30,14 +30,18 @@ SUBSYSTEM_DEF(weather)
|
||||
W.weather_act(L)
|
||||
|
||||
// start random weather on relevant levels
|
||||
for(var/z in eligible_zlevels)
|
||||
var/possible_weather = eligible_zlevels[z]
|
||||
var/datum/weather/W = pickweight(possible_weather)
|
||||
run_weather(W, list(text2num(z)))
|
||||
eligible_zlevels -= z
|
||||
while(length(eligible_traits))
|
||||
var/trait = eligible_traits[length(eligible_traits)]
|
||||
var/possible_weathers = eligible_traits[trait]
|
||||
var/datum/weather/W = pickweight(possible_weathers)
|
||||
var/randTime = rand(3000, 6000)
|
||||
addtimer(CALLBACK(src, PROC_REF(make_eligible), z, possible_weather), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers
|
||||
next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration)
|
||||
var/list/zlevels = levels_by_trait(trait)
|
||||
for(var/z in zlevels)
|
||||
addtimer(CALLBACK(src, PROC_REF(make_eligible), trait, possible_weathers), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers
|
||||
next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration)
|
||||
run_weather(W, zlevels)
|
||||
|
||||
eligible_traits.len--
|
||||
|
||||
/datum/controller/subsystem/weather/Initialize()
|
||||
if(!GLOB.configuration.general.enable_default_weather_events)
|
||||
@@ -46,16 +50,12 @@ SUBSYSTEM_DEF(weather)
|
||||
|
||||
for(var/V in subtypesof(/datum/weather))
|
||||
var/datum/weather/W = V
|
||||
var/probability = initial(W.probability)
|
||||
var/target_trait = initial(W.target_trait)
|
||||
|
||||
// any weather with a probability set may occur at random
|
||||
if(probability)
|
||||
for(var/z in levels_by_trait(target_trait))
|
||||
LAZYINITLIST(eligible_zlevels["[z]"])
|
||||
eligible_zlevels["[z]"][W] = probability
|
||||
if(W::probability)
|
||||
LAZYINITLIST(eligible_traits[W::target_trait])
|
||||
eligible_traits[W::target_trait][W] = W::probability
|
||||
|
||||
/datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels)
|
||||
/datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type)
|
||||
if(istext(weather_datum_type))
|
||||
for(var/V in subtypesof(/datum/weather))
|
||||
var/datum/weather/W = V
|
||||
@@ -65,19 +65,14 @@ SUBSYSTEM_DEF(weather)
|
||||
if(!ispath(weather_datum_type, /datum/weather))
|
||||
CRASH("run_weather called with invalid weather_datum_type: [weather_datum_type || "null"]")
|
||||
|
||||
if(isnull(z_levels))
|
||||
z_levels = levels_by_trait(initial(weather_datum_type.target_trait))
|
||||
else if(isnum(z_levels))
|
||||
z_levels = list(z_levels)
|
||||
else if(!islist(z_levels))
|
||||
CRASH("run_weather called with invalid z_levels: [z_levels || "null"]")
|
||||
|
||||
var/datum/weather/W = new weather_datum_type(z_levels)
|
||||
var/list/zlevels = levels_by_trait(weather_datum_type::target_trait)
|
||||
var/datum/weather/W = new weather_datum_type(zlevels)
|
||||
W.telegraph()
|
||||
|
||||
/datum/controller/subsystem/weather/proc/make_eligible(z, possible_weather)
|
||||
eligible_zlevels[z] = possible_weather
|
||||
next_hit_by_zlevel["[z]"] = null
|
||||
/datum/controller/subsystem/weather/proc/make_eligible(trait, list/possible_weathers)
|
||||
eligible_traits[trait] = possible_weathers
|
||||
for(var/zlevel in levels_by_trait(trait))
|
||||
next_hit_by_zlevel["[zlevel]"] = null
|
||||
|
||||
/datum/controller/subsystem/weather/proc/get_weather(z, area/active_area)
|
||||
var/datum/weather/A
|
||||
|
||||
@@ -101,25 +101,7 @@ SUBSYSTEM_DEF(mapping)
|
||||
// Load the station
|
||||
loadStation()
|
||||
|
||||
if(GLOB.configuration.ruins.enable_space)
|
||||
generate_space_zlevels()
|
||||
if(GLOB.configuration.ruins.enable_lavaland)
|
||||
generate_lavaland_zlevels()
|
||||
|
||||
// Setup the Z-level linkage
|
||||
GLOB.space_manager.do_transition_setup()
|
||||
|
||||
// Seed space ruins
|
||||
if(GLOB.configuration.ruins.enable_ruins)
|
||||
place_lavaland_ruins()
|
||||
place_space_ruins()
|
||||
else
|
||||
log_startup_progress("Skipping space ruins...")
|
||||
|
||||
if(GLOB.configuration.ruins.enable_lavaland)
|
||||
// Perform procedural generation for lavaland rivers and caves, which
|
||||
// happens after ruin placement.
|
||||
procgen_lavaland()
|
||||
generate_zlevels()
|
||||
|
||||
var/empty_z_traits = list(REACHABLE_BY_CREW, REACHABLE_SPACE_ONLY)
|
||||
#ifdef GAME_TESTS
|
||||
@@ -194,6 +176,24 @@ SUBSYSTEM_DEF(mapping)
|
||||
if(HAS_TRAIT(SSstation, STATION_TRAIT_HANGOVER))
|
||||
generate_themed_messes(list(/obj/effect/spawner/themed_mess/party))
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/generate_zlevels()
|
||||
generate_space_zlevels()
|
||||
generate_lavaland_zlevels()
|
||||
|
||||
// Setup the Z-level linkage
|
||||
GLOB.space_manager.do_transition_setup()
|
||||
|
||||
// Seed ruins
|
||||
if(GLOB.configuration.ruins.enable_ruins)
|
||||
place_lavaland_ruins()
|
||||
place_space_ruins()
|
||||
else
|
||||
log_startup_progress("Skipping z-level content...")
|
||||
|
||||
// Perform procedural generation for lavaland rivers and caves, which
|
||||
// happens after ruin placement.
|
||||
procgen_lavaland()
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/seed_space_salvage(space_z_levels)
|
||||
log_startup_progress("Seeding space salvage...")
|
||||
var/space_salvage_timer = start_watch()
|
||||
@@ -249,17 +249,42 @@ SUBSYSTEM_DEF(mapping)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/generate_space_zlevels()
|
||||
var/zlevel_count = rand(GLOB.configuration.ruins.minimum_space_zlevels, GLOB.configuration.ruins.maximum_space_zlevels)
|
||||
if(zlevel_count == 0)
|
||||
if(!GLOB.configuration.ruins.enable_space || zlevel_count == 0)
|
||||
log_startup_progress("Skipping space levels...")
|
||||
return
|
||||
|
||||
var/watch = start_watch()
|
||||
log_startup_progress("Adding space levels...")
|
||||
for(var/i in 1 to zlevel_count)
|
||||
GLOB.space_manager.add_new_zlevel("Ruin Area #[i]", linkage = CROSSLINKED, traits = list(REACHABLE_BY_CREW, SPAWN_RUINS, REACHABLE_SPACE_ONLY))
|
||||
GLOB.space_manager.add_new_zlevel(
|
||||
"Ruin Area #[i]",
|
||||
linkage = CROSSLINKED,
|
||||
traits = list(REACHABLE_BY_CREW, SPAWN_RUINS, REACHABLE_SPACE_ONLY),
|
||||
transition_tag = TRANSITION_TAG_SPACE
|
||||
)
|
||||
CHECK_TICK
|
||||
|
||||
log_startup_progress("Added space levels in [stop_watch(watch)]s.")
|
||||
log_startup_progress("Added [zlevel_count] space levels in [stop_watch(watch)]s.")
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/generate_lavaland_zlevels()
|
||||
var/zlevel_count = rand(GLOB.configuration.ruins.minimum_lavaland_zlevels, GLOB.configuration.ruins.maximum_lavaland_zlevels)
|
||||
if(!GLOB.configuration.ruins.enable_lavaland || zlevel_count == 0)
|
||||
log_startup_progress("Skipping lavaland levels...")
|
||||
return
|
||||
|
||||
log_startup_progress("Loading lavaland...")
|
||||
var/watch = start_watch()
|
||||
for(var/i in 1 to zlevel_count)
|
||||
var/lavaland_zlevel = GLOB.space_manager.add_new_zlevel(
|
||||
"LAVALAND[i]",
|
||||
linkage = CROSSLINKED,
|
||||
traits = list(ORE_LEVEL, REACHABLE_BY_CREW, STATION_CONTACT, HAS_WEATHER, AI_OK),
|
||||
transition_tag = TRANSITION_TAG_LAVALAND,
|
||||
level_type = /datum/space_level/lavaland
|
||||
)
|
||||
GLOB.maploader.load_map(file("_maps/map_files/generic/lavaland_baselayer.dmm"), z_offset = lavaland_zlevel)
|
||||
CHECK_TICK
|
||||
log_startup_progress("Added [zlevel_count] lavaland levels in [stop_watch(watch)]s")
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/place_lavaland_ruins()
|
||||
log_startup_progress("Placing lavaland ruins...")
|
||||
@@ -295,7 +320,12 @@ SUBSYSTEM_DEF(mapping)
|
||||
var/watch = start_watch()
|
||||
log_startup_progress("Loading [map_datum.fluff_name]...")
|
||||
// This should always be Z2, but you never know
|
||||
var/map_z_level = GLOB.space_manager.add_new_zlevel(MAIN_STATION, linkage = CROSSLINKED, traits = list(STATION_LEVEL, STATION_CONTACT, REACHABLE_BY_CREW, REACHABLE_SPACE_ONLY, AI_OK))
|
||||
var/map_z_level = GLOB.space_manager.add_new_zlevel(
|
||||
MAIN_STATION,
|
||||
linkage = CROSSLINKED,
|
||||
traits = list(STATION_LEVEL, STATION_CONTACT, REACHABLE_BY_CREW, REACHABLE_SPACE_ONLY, AI_OK),
|
||||
transition_tag = TRANSITION_TAG_SPACE
|
||||
)
|
||||
GLOB.maploader.load_map(wrap_file(map_datum.map_path), z_offset = map_z_level)
|
||||
log_startup_progress("Loaded [map_datum.fluff_name] in [stop_watch(watch)]s")
|
||||
|
||||
@@ -309,22 +339,14 @@ SUBSYSTEM_DEF(mapping)
|
||||
query_set_map.Execute(async = FALSE) // This happens during a time of intense server lag, so should be non-async
|
||||
qdel(query_set_map)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/generate_lavaland_zlevels()
|
||||
log_startup_progress("Loading Lavaland...")
|
||||
var/watch = start_watch()
|
||||
var/lavaland_z_level = GLOB.space_manager.add_new_zlevel(MINING, linkage = SELFLOOPING, traits = list(ORE_LEVEL, REACHABLE_BY_CREW, STATION_CONTACT, HAS_WEATHER, AI_OK))
|
||||
GLOB.maploader.load_map(file("_maps/map_files/generic/Lavaland.dmm"), z_offset = lavaland_z_level)
|
||||
CHECK_TICK
|
||||
log_startup_progress("Added lavaland levels in [stop_watch(watch)]s")
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/procgen_lavaland()
|
||||
var/watch = start_watch()
|
||||
var/theme_watch = start_watch()
|
||||
log_startup_progress("Loading lavaland themes...")
|
||||
if(lavaland_theme)
|
||||
lavaland_theme.setup()
|
||||
if(caves_theme)
|
||||
caves_theme.setup()
|
||||
log_startup_progress("Loaded lavaland themes in [stop_watch(watch)]s")
|
||||
log_startup_progress("Loaded lavaland themes in [stop_watch(theme_watch)]s")
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/make_maint_all_access()
|
||||
for(var/area/station/maintenance/A in existing_station_areas)
|
||||
|
||||
Reference in New Issue
Block a user