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
-1
View File
@@ -39,7 +39,6 @@
#define CENTCOMM "CentComm"
#define TELECOMMS "Telecomms Satellite"
#define DERELICT "Derelicted Station"
#define MINING "Lavaland"
#define EMPTY_AREA "Empty Area"
#define EMPTY_AREA_2 "Empty Area 2"
#define EMPTY_AREA_3 "Empty Area 3"
+1 -1
View File
@@ -1,5 +1,5 @@
#include "map_files\generic\centcomm.dmm"
#define CC_TRANSITION_CONFIG DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC))
#define CC_TRANSITION_CONFIG DECLARE_LEVEL(CENTCOMM, UNAFFECTED, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC))
#ifdef CIMAP
#include "ci_map_testing.dm"
#endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,4 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/simulated/mineral/volcanic/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored)
"ag" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -497,84 +494,84 @@ QX
QX
QX
yZ
aa
aa
aa
aa
aa
aa
aa
aa
BC
BC
BC
BC
BC
BC
BC
BC
QX
aa
BC
QX
aa
aa
aa
aa
aa
aa
BC
BC
BC
BC
BC
BC
QX
QX
QX
"}
(2,1,1) = {"
QX
aa
BC
yZ
yZ
yZ
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
BC
BC
BC
BC
BC
BC
BC
BC
BC
BC
BC
BC
BC
QX
aa
aa
aa
aa
aa
BC
BC
BC
BC
BC
"}
(3,1,1) = {"
QX
aa
aa
BC
BC
yZ
yZ
aa
BC
yZ
yZ
yZ
aa
BC
yZ
yZ
yZ
yZ
aa
aa
aa
aa
aa
aa
aa
aa
aa
BC
BC
BC
BC
BC
BC
BC
BC
BC
QX
"}
(4,1,1) = {"
aa
aa
aa
aa
BC
BC
BC
BC
yZ
BC
yZ
@@ -590,16 +587,16 @@ yZ
yZ
yZ
yZ
aa
BC
yZ
aa
aa
aa
BC
BC
BC
"}
(5,1,1) = {"
aa
BC
QX
aa
BC
yZ
yZ
yZ
@@ -619,13 +616,13 @@ yZ
yZ
yZ
yZ
aa
aa
BC
BC
"}
(6,1,1) = {"
aa
aa
aa
BC
BC
BC
yZ
yZ
no
@@ -644,14 +641,14 @@ no
no
yZ
yZ
aa
aa
aa
BC
BC
BC
"}
(7,1,1) = {"
aa
aa
aa
BC
BC
BC
yZ
no
no
@@ -670,13 +667,13 @@ no
no
no
yZ
aa
aa
aa
BC
BC
BC
"}
(8,1,1) = {"
aa
aa
BC
BC
yZ
yZ
no
@@ -696,13 +693,13 @@ vt
AG
no
yZ
aa
aa
aa
BC
BC
BC
"}
(9,1,1) = {"
aa
aa
BC
BC
yZ
yZ
no
@@ -723,13 +720,13 @@ AG
no
yZ
yZ
aa
BC
QX
"}
(10,1,1) = {"
QX
aa
aa
BC
BC
yZ
no
Pg
@@ -754,8 +751,8 @@ yZ
"}
(11,1,1) = {"
QX
aa
aa
BC
BC
yZ
no
Pg
@@ -776,12 +773,12 @@ no
yZ
yZ
yZ
aa
BC
"}
(12,1,1) = {"
QX
aa
aa
BC
BC
yZ
no
no
@@ -801,12 +798,12 @@ no
no
yZ
yZ
aa
aa
BC
BC
"}
(13,1,1) = {"
aa
aa
BC
BC
yZ
yZ
Nj
@@ -826,14 +823,14 @@ no
no
Nj
yZ
aa
aa
aa
BC
BC
BC
"}
(14,1,1) = {"
aa
aa
aa
BC
BC
BC
yZ
yZ
no
@@ -852,15 +849,15 @@ Nj
no
yZ
yZ
aa
aa
aa
BC
BC
BC
"}
(15,1,1) = {"
aa
aa
aa
aa
BC
BC
BC
BC
yZ
al
yc
@@ -879,12 +876,12 @@ ja
yZ
yZ
yZ
aa
aa
BC
BC
"}
(16,1,1) = {"
aa
aa
BC
BC
yZ
yZ
yZ
@@ -904,14 +901,14 @@ no
no
yZ
yZ
aa
aa
BC
BC
QX
"}
(17,1,1) = {"
QX
aa
aa
BC
BC
yZ
no
no
@@ -931,12 +928,12 @@ no
no
yZ
yZ
aa
aa
BC
BC
"}
(18,1,1) = {"
aa
aa
BC
BC
yZ
yZ
no
@@ -958,11 +955,11 @@ no
yZ
yZ
yZ
aa
BC
"}
(19,1,1) = {"
aa
aa
BC
BC
yZ
yZ
no
@@ -983,11 +980,11 @@ iV
no
yZ
yZ
aa
aa
BC
BC
"}
(20,1,1) = {"
aa
BC
yZ
yZ
yZ
@@ -1009,8 +1006,8 @@ ga
no
yZ
yZ
aa
aa
BC
BC
"}
(21,1,1) = {"
yZ
@@ -1036,12 +1033,12 @@ no
yZ
yZ
yZ
aa
BC
"}
(22,1,1) = {"
QX
yZ
aa
BC
yZ
no
MB
@@ -1061,12 +1058,12 @@ uO
no
yZ
yZ
aa
aa
BC
BC
"}
(23,1,1) = {"
aa
aa
BC
BC
yZ
yZ
no
@@ -1088,11 +1085,11 @@ no
yZ
yZ
yZ
aa
BC
"}
(24,1,1) = {"
QX
aa
BC
yZ
yZ
no
@@ -1113,12 +1110,12 @@ no
no
yZ
yZ
aa
BC
QX
"}
(25,1,1) = {"
aa
aa
BC
BC
yZ
yZ
Nj
@@ -1139,13 +1136,13 @@ no
Nj
yZ
yZ
aa
aa
BC
BC
"}
(26,1,1) = {"
aa
aa
aa
BC
BC
BC
yZ
yZ
no
@@ -1166,13 +1163,13 @@ yZ
yZ
yZ
yZ
aa
BC
"}
(27,1,1) = {"
aa
aa
aa
aa
BC
BC
BC
BC
yZ
yZ
yZ
@@ -1190,14 +1187,14 @@ yc
ja
yZ
yZ
aa
aa
aa
BC
BC
BC
"}
(28,1,1) = {"
aa
BC
QX
aa
BC
yZ
yZ
yZ
@@ -1216,14 +1213,14 @@ yZ
yZ
yZ
yZ
aa
aa
BC
BC
QX
"}
(29,1,1) = {"
aa
aa
aa
BC
BC
BC
BC
BC
yZ
@@ -1242,14 +1239,14 @@ yZ
yZ
BC
yZ
aa
aa
aa
BC
BC
BC
"}
(30,1,1) = {"
QX
QX
aa
BC
BC
BC
yZ
@@ -1268,14 +1265,14 @@ yZ
yZ
yZ
BC
aa
aa
aa
BC
BC
BC
"}
(31,1,1) = {"
QX
aa
aa
BC
BC
BC
BC
yZ
@@ -1294,12 +1291,12 @@ BC
BC
yZ
BC
aa
BC
QX
aa
BC
"}
(32,1,1) = {"
aa
BC
QX
QX
BC
@@ -1320,13 +1317,13 @@ yZ
BC
BC
QX
aa
aa
BC
BC
QX
"}
(33,1,1) = {"
QX
aa
BC
BC
BC
BC
@@ -1346,9 +1343,9 @@ BC
BC
BC
BC
aa
aa
aa
BC
BC
BC
"}
(34,1,1) = {"
QX
@@ -0,0 +1,173 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/lavaland/surface/outdoors/unexplored/danger)
"b" = (
/obj/effect/mapping_helpers/no_lava,
/obj/structure/lightable/torch/lava_bridge,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored/danger)
"d" = (
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored/danger)
"Z" = (
/obj/effect/mapping_helpers/no_lava,
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored/danger)
(1,1,1) = {"
a
a
Z
Z
Z
Z
Z
a
a
"}
(2,1,1) = {"
a
a
a
Z
Z
Z
a
a
a
"}
(3,1,1) = {"
d
a
a
d
d
d
a
a
d
"}
(4,1,1) = {"
a
a
a
b
d
b
a
a
a
"}
(5,1,1) = {"
a
a
a
d
d
d
a
a
a
"}
(6,1,1) = {"
a
a
a
d
d
d
d
a
a
"}
(7,1,1) = {"
a
a
Z
d
d
d
Z
a
a
"}
(8,1,1) = {"
a
a
a
d
d
d
a
a
a
"}
(9,1,1) = {"
a
a
a
b
d
b
d
a
a
"}
(10,1,1) = {"
a
a
d
d
d
d
d
a
d
"}
(11,1,1) = {"
a
a
a
Z
Z
Z
a
a
a
"}
(12,1,1) = {"
a
a
a
Z
Z
Z
a
a
a
"}
(13,1,1) = {"
d
a
a
Z
Z
Z
a
a
a
"}
(14,1,1) = {"
a
a
Z
Z
Z
Z
Z
a
a
"}
@@ -0,0 +1,163 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/lavaland/surface/outdoors/unexplored/danger)
"h" = (
/obj/effect/mapping_helpers/no_lava,
/obj/structure/lightable/torch/lava_bridge,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored/danger)
"A" = (
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored/danger)
"Q" = (
/obj/effect/mapping_helpers/no_lava,
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored/danger)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
A
a
a
a
a
a
a
a
a
A
a
a
"}
(3,1,1) = {"
Q
a
a
a
a
a
A
a
A
A
a
a
a
Q
"}
(4,1,1) = {"
Q
Q
A
A
A
h
A
A
A
h
Q
A
Q
Q
"}
(5,1,1) = {"
A
Q
A
Q
A
A
A
A
A
A
A
A
Q
Q
"}
(6,1,1) = {"
Q
Q
A
A
A
h
A
A
A
h
Q
A
Q
Q
"}
(7,1,1) = {"
Q
a
a
a
A
A
A
A
a
a
a
a
a
Q
"}
(8,1,1) = {"
a
A
a
A
a
a
a
a
a
a
A
a
a
a
"}
(9,1,1) = {"
a
a
a
a
a
a
a
a
A
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
+3
View File
@@ -10,3 +10,6 @@
#define TRANSITION_BORDER_SOUTH TRANSITIONEDGE
#define TRANSITION_BORDER_EAST (world.maxx - TRANSITIONEDGE - 1)
#define TRANSITION_BORDER_WEST TRANSITIONEDGE
#define TRANSITION_TAG_SPACE "SPACE"
#define TRANSITION_TAG_LAVALAND "LAVALAND"
+1
View File
@@ -47,3 +47,4 @@ 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(lavaland_zlvl_bridge_templates)
@@ -10,6 +10,10 @@
var/minimum_space_zlevels = 2
/// Maximum number of extra space zlevels to generate
var/maximum_space_zlevels = 4
/// Minimum number of extra lavaland zlevels to generate
var/minimum_lavaland_zlevels = 2
/// Maximum number of extra lavaland zlevels to generate
var/maximum_lavaland_zlevels = 2
/// List of all active space ruins
var/list/active_space_ruins = list()
/// List of all active lavaland ruins
@@ -19,9 +23,9 @@
/// Maximum budget for space ruins
var/space_ruin_budget_max = 1000
/// Minimum budget for lavaland ruins
var/lavaland_ruin_budget_min = 175
var/lavaland_ruin_budget_min = 350
/// Maximum budget for lavaland ruins
var/lavaland_ruin_budget_max = 325
var/lavaland_ruin_budget_max = 500
/datum/configuration_section/ruin_configuration/load_data(list/data)
// Use the load wrappers here. That way the default isnt made 'null' if you comment out the config line
@@ -30,6 +34,8 @@
CONFIG_LOAD_BOOL(enable_ruins, data["enable_ruins"])
CONFIG_LOAD_NUM(minimum_space_zlevels, data["minimum_space_zlevels"])
CONFIG_LOAD_NUM(maximum_space_zlevels, data["maximum_space_zlevels"])
CONFIG_LOAD_NUM(minimum_lavaland_zlevels, data["minimum_lavaland_zlevels"])
CONFIG_LOAD_NUM(maximum_lavaland_zlevels, data["maximum_lavaland_zlevels"])
CONFIG_LOAD_LIST(active_space_ruins, data["active_space_ruins"])
CONFIG_LOAD_LIST(active_lava_ruins, data["active_lava_ruins"])
CONFIG_LOAD_NUM(space_ruin_budget_min, data["space_ruin_budget_min"])
+22 -27
View File
@@ -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)
+18
View File
@@ -133,6 +133,7 @@
preloadRuinTemplates()
preloadShelterTemplates()
preloadShuttleTemplates()
preloadBridgeTemplates()
preloadEventTemplates()
/proc/preloadRuinTemplates()
@@ -180,6 +181,23 @@
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/lavaland/zlvl_bridge/vertical))
var/datum/map_template/ruin/lavaland/zlvl_bridge/vertical/vertical_type = item
if(!(initial(vertical_type.suffix)))
continue
var/datum/map_template/ruin/lavaland/zlvl_bridge/vertical/V = new vertical_type()
GLOB.lavaland_zlvl_bridge_templates[V.suffix] = V
GLOB.map_templates[V.suffix] = V
for(var/item in subtypesof(/datum/map_template/ruin/lavaland/zlvl_bridge/horizontal))
var/datum/map_template/ruin/lavaland/zlvl_bridge/horizontal/horizontal_type = item
if(!(initial(horizontal_type.suffix)))
continue
var/datum/map_template/ruin/lavaland/zlvl_bridge/horizontal/V = new horizontal_type()
GLOB.lavaland_zlvl_bridge_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
+36
View File
@@ -70,6 +70,19 @@
if(end.flags & LAVA_BRIDGE || !(ismineralturf(end) || istype(end, /turf/simulated/floor/plating/asteroid)))
return FALSE
var/area/A = get_area(end)
if(istype(A, /area/lavaland/surface/gulag_rock))
return FALSE
if(istype(A, /area/lavaland/surface/outdoors/outpost))
return FALSE
if(istype(A, /area/mine/outpost))
return FALSE
if(istype(A, /area/shuttle))
return FALSE
return TRUE
/// Returns whether the passed in turf is a valid "passage". A valid passage is
@@ -85,6 +98,9 @@
return FALSE
if(!istype(get_step(T, side_to_side[2]), /turf/simulated/floor/lava/mapping_lava))
return FALSE
var/area/A = get_area(T)
if(istype(A, /area/lavaland/surface/gulag_rock))
return FALSE
return TRUE
@@ -280,6 +296,26 @@
return current_turf.x <= 2
return TRUE
/datum/map_template/ruin/lavaland/zlvl_bridge
prefix = "_maps/map_files/RandomRuins/LavaRuins/zlvl_bridges/"
ci_exclude = /datum/map_template/ruin/lavaland/zlvl_bridge
/datum/map_template/ruin/lavaland/zlvl_bridge/vertical
ci_exclude = /datum/map_template/ruin/lavaland/zlvl_bridge/vertical
/datum/map_template/ruin/lavaland/zlvl_bridge/vertical/one
name = "Vertical Bridge One"
suffix = "lavaland_zlvl_bridge_vertical_1.dmm"
ci_exclude = /datum/map_template/ruin/lavaland/zlvl_bridge/vertical/one
/datum/map_template/ruin/lavaland/zlvl_bridge/horizontal
ci_exclude = /datum/map_template/ruin/lavaland/zlvl_bridge/horizontal
/datum/map_template/ruin/lavaland/zlvl_bridge/horizontal/one
name = "Horizontal Bridge One"
suffix = "lavaland_zlvl_bridge_horizontal_1.dmm"
ci_exclude = /datum/map_template/ruin/lavaland/zlvl_bridge/horizontal/one
#undef LONG_BRIDGE_THEME_CULT
#undef LONG_BRIDGE_THEME_HIERO
#undef LONG_BRIDGE_THEME_CLOCKWORK
+16
View File
@@ -238,3 +238,19 @@
description = "A passenger shuttle crashsite of indeterminate origin."
suffix = "lavaland_surface_shuttlecrash.dmm"
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/nt
name = "Nanotrasen Mining Complex"
id = "gulag"
description = "Nanotrasen's sturdy planetside mining station and labor camp."
suffix = "lavaland_surface_nt.dmm"
allow_duplicates = FALSE
always_place = TRUE
/datum/map_template/ruin/lavaland/legiongate
name = "Necropolis Gate"
id = "legiongate"
description = "At the heart of the city of the dead is a horror, so vile, and so powerful, that not even death can claim it."
suffix = "lavaland_surface_legiongate.dmm"
allow_duplicates = FALSE
always_place = TRUE
+41 -40
View File
@@ -16,6 +16,7 @@
/datum/ruin_placement/proc/try_to_place(zlist_or_zlevel, area_whitelist)
var/list/z_levels = islist(zlist_or_zlevel) ? zlist_or_zlevel : list(zlist_or_zlevel)
shuffle_inplace(z_levels)
// Our goal is to maximize padding, so we'll perform some number of attempts
// on one z-level, then the next, until we reach some limit, then reduce the
@@ -28,6 +29,8 @@
for(var/z_level in z_levels)
var/placement_tries = PLACEMENT_TRIES
while(placement_tries > 0)
CHECK_TICK
placement_tries--
var/turf/central_turf = locate(
@@ -72,7 +75,9 @@
for(var/obj/structure/flora/ash/plant in T)
qdel(plant)
ruin.load(central_turf, centered = TRUE)
var/loaded = ruin.load(central_turf, centered = TRUE)
if(!loaded)
stack_trace("ruin [ruin.suffix] failed to load at [COORD(central_turf)] after valid bounds check")
for(var/turf/T in ruin.get_affected_turfs(central_turf, centered = TRUE)) // Just flag the actual ruin turfs!
T.flags |= NO_RUINS
new /obj/effect/landmark/ruin(central_turf, ruin)
@@ -116,66 +121,62 @@
var/list/ruins = templates.Copy()
var/list/forced_ruins = list() //These go first on the z level associated (same random one by default)
var/list/ruins_availible = list() //we can try these in the current pass
var/forced_z //If set we won't pick z level and use this one instead.
var/list/forced_ruins = list() // ruins we are required to place
var/list/ruins_available = list() // ruins we will attempt to place based on budget
//Set up the starting ruin list
// Set up the starting ruin lists
for(var/key in ruins)
var/datum/map_template/ruin/R = ruins[key]
if(R.get_cost() > ruin_budget) //Why would you do that
continue
if(R.always_place)
forced_ruins[R] = -1
forced_ruins += R
continue
if(R.unpickable)
continue
ruins_availible[R] = R.placement_weight
if(R.get_cost() > ruin_budget) // Why would you do that
continue
ruins_available[R] = R.placement_weight
while(ruin_budget > 0 && (length(ruins_availible) || length(forced_ruins)))
var/datum/map_template/ruin/current_pick
var/forced = FALSE
if(length(forced_ruins)) //We have something we need to load right now, so just pick it
for(var/ruin in forced_ruins)
current_pick = ruin
if(forced_ruins[ruin] > 0) //Load into designated z
forced_z = forced_ruins[ruin]
forced = TRUE
break
else //Otherwise just pick random one
current_pick = pickweight(ruins_availible)
while(length(forced_ruins))
var/datum/map_template/ruin/ruin = forced_ruins[length(forced_ruins)]
var/datum/ruin_placement/placement = new(ruin, base_padding_ = base_padding)
var/placement_success = placement.try_to_place(z_levels, area_whitelist)
if(placement_success)
// this may push us into the negative but always_place means always_place
ruin_budget -= ruin.get_cost()
else
stack_trace("failed to place required ruin [ruin.suffix]")
forced_ruins.len--
CHECK_TICK
while(ruin_budget > 0 && length(ruins_available))
var/datum/map_template/ruin/current_pick = pickweight(ruins_available)
var/datum/ruin_placement/placement = new(current_pick, base_padding_ = base_padding)
var/placement_success = placement.try_to_place(forced_z ? forced_z : z_levels, area_whitelist)
//That's done remove from priority even if it failed
if(forced)
//TODO : handle forced ruins with multiple variants
forced_ruins -= current_pick
forced = FALSE
var/placement_success = placement.try_to_place(z_levels, area_whitelist)
if(placement_success)
ruin_budget -= current_pick.get_cost()
if(!current_pick.allow_duplicates)
for(var/datum/map_template/ruin/R in ruins_availible)
for(var/datum/map_template/ruin/R in ruins_available)
if(R.id == current_pick.id)
ruins_availible -= R
ruins_available -= R
if(current_pick.never_spawn_with)
for(var/blacklisted_type in current_pick.never_spawn_with)
for(var/possible_exclusion in ruins_availible)
for(var/possible_exclusion in ruins_available)
if(istype(possible_exclusion,blacklisted_type))
ruins_availible -= possible_exclusion
ruins_available -= possible_exclusion
else
for(var/datum/map_template/ruin/R in ruins_availible)
for(var/datum/map_template/ruin/R in ruins_available)
if(R.id == current_pick.id)
ruins_availible -= R
log_world("Failed to place [current_pick.name] ruin.")
ruins_available -= R
stack_trace("failed to place ruin [current_pick.suffix]")
forced_z = 0
//Update the availible list
for(var/datum/map_template/ruin/R in ruins_availible)
//Update the available list
for(var/datum/map_template/ruin/R in ruins_available)
if(R.get_cost() > ruin_budget)
ruins_availible -= R
ruins_available -= R
CHECK_TICK
log_world("Ruin loader finished with [ruin_budget] left to spend.")
+10 -3
View File
@@ -39,7 +39,8 @@
var/list/outside_areas = list()
var/list/eligible_areas = list()
for(var/z in impacted_z_levels)
eligible_areas += GLOB.space_manager.areas_in_z["[z]"]
if("[z]" in GLOB.space_manager.areas_in_z)
eligible_areas += GLOB.space_manager.areas_in_z["[z]"]
// Don't play storm audio to shuttles that are not at lavaland
var/miningShuttleDocked = is_shuttle_docked("mining", "mining_away")
@@ -54,12 +55,13 @@
if(!golemShuttleOnPlanet)
eligible_areas -= get_areas(/area/shuttle/freegolem)
for(var/i in 1 to length(eligible_areas))
var/area/place = eligible_areas[i]
while(length(eligible_areas))
var/area/place = eligible_areas[length(eligible_areas)]
if(place.outdoors)
outside_areas += place
else
inside_areas += place
eligible_areas.len--
sound_ao.output_atoms = outside_areas
sound_ai.output_atoms = inside_areas
@@ -90,6 +92,11 @@
sound_wo.stop()
sound_wi.stop()
/datum/weather/ash_storm/generate_area_list()
. = ..()
// I'm a lazy fuck and it's either this or refactor procgen again
impacted_areas |= get_areas(/area/lavaland/surface/gulag_rock)
/datum/weather/ash_storm/telegraph()
. = ..()
update_eligible_areas()
+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
+12 -2
View File
@@ -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]")
+12 -2
View File
@@ -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
+13 -11
View File
@@ -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))
+78 -8
View File
@@ -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)
+1 -1
View File
@@ -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
+3 -2
View File
@@ -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
+5 -5
View File
@@ -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
+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
+13 -1
View File
@@ -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
+23 -9
View File
@@ -613,14 +613,18 @@ enable_ruins = true
minimum_space_zlevels = 2
# Maximum number of extra space zlevels to generate
maximum_space_zlevels = 4
# Minimum number of extra lavaland zlevels to generate
minimum_lavaland_zlevels = 2
# Maximum number of extra lavaland zlevels to generate
maximum_lavaland_zlevels = 2
# Minimum space ruin budget.
space_ruin_budget_min = 750
# Maximum space ruin budget.
space_ruin_budget_max = 1000
# Minimum lavaland ruin budget.
lavaland_ruin_budget_min = 175
lavaland_ruin_budget_min = 350
# Maximum lavaland ruin budget.
lavaland_ruin_budget_max = 325
lavaland_ruin_budget_max = 500
# List of all space ruins that can generate in the world
# Commenting something out in here DISABLES IT FROM SPAWNING
active_space_ruins = [
@@ -682,24 +686,34 @@ active_space_ruins = [
# List of all ruins that can generate on lavaland
# Commenting something out in here DISABLES IT FROM SPAWNING
active_lava_ruins = [
##BIODOMES
## Core Gameplay Ruins
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_nt.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_legiongate.dmm",
## BIODOMES
"_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_winter.dmm", ##RESPAWN
"_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_winter.dmm",
## RESPAWN
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker_siege.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_eden.dmm", ##SIN
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_eden.dmm",
## SIN
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_envy.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm", # Greed blacklisted on production because its reward (dice) has a 1/20 chance of making you a wizard
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm",
# Greed blacklisted on production because its reward (dice) has a 1/20 chance of making you a wizard
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_greed.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_pride.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm", ##MEGAFAUNA
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm",
## MEGAFAUNA
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm", # Re-removed 7/24/2020, I ran a month-long test of hierophant Jun-Jul and the staff was still too strong. https://github.com/ParadiseSS13/Paradise/pull/13542
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm", ##MISC
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm",
# Re-removed 7/24/2020, I ran a month-long test of hierophant Jun-Jul and the staff was still too strong. https://github.com/ParadiseSS13/Paradise/pull/13542
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm",
## MISC
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_althland_excavation.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_althland_facility.dmm",
"_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_althland_minebot_factory.dmm",
+4
View File
@@ -2,6 +2,10 @@
enable_lavaland = false
enable_space = false
enable_ruins = false
minimum_space_zlevels = 0
maximum_space_zlevels = 0
minimum_lavaland_zlevels = 0
maximum_lavaland_zlevels = 0
[redis_configuration]
enabled = false
+45 -43
View File
@@ -93,9 +93,9 @@ some extra dependencies.
1. Download the latest release from <https://github.com/ParadiseSS13/rust-g>
2. Run the following command:
```sh
apt-get install libssl-dev:i386 pkg-config:i386 zlib1g-dev:i386
```
```sh
apt-get install libssl-dev:i386 pkg-config:i386 zlib1g-dev:i386
```
3. After installing these packages, rust-g should be able to build and function
as intended. Build instructions are on the rust-g GitHub. We assume that if
@@ -103,9 +103,9 @@ some extra dependencies.
4. Once you've built rust-g, you can build MILLA similarly. Change into the
`milla/` directory and run:
```sh
cargo build --release --target=i686-unknown-linux-gnu
```
```sh
cargo build --release --target=i686-unknown-linux-gnu
```
## Cloning the Repository
@@ -113,17 +113,17 @@ Cloning the Paradise repository only has to be done once.
1. Visit the [repository][] and press the _Fork_ button in the upper right corner.
![](./images/fork_repository.png)
![](./images/fork_repository.png)
[repository]: https://github.com/ParadiseSS13/Paradise
2. Launch Visual Studio Code. Select the Source Control panel on the sidebar,
and click _Clone Repository_.
![](./images/vsc_clone_repository.png)
![](./images/vsc_clone_repository.png)
If thats not there, you can press `Ctrl`+`Shift`+`P` to open the command
palette, then type `Git: Clone` and then press `Enter`.
If thats not there, you can press `Ctrl`+`Shift`+`P` to open the command
palette, then type `Git: Clone` and then press `Enter`.
3. Paste the URL of the repository you created in the last step. It should look
like this: `https://github.com/YOURNAME/Paradise`. Then, select a folder to
@@ -178,13 +178,13 @@ the output of blackbox entries.
computer, so there's no need to worry about starting it manually.
2. Open HeidiSQL (comes with MariaDB) and connect it to the database. Click on
*New* to create a new session, check *prompt for credentials* and leave the
_New_ to create a new session, check _prompt for credentials_ and leave the
rest as default.
3. Click *Save*, then click open and enter in `root` for the username and the
3. Click _Save_, then click open and enter in `root` for the username and the
password you set up during the installation.
4. Select the database you just created and then select *File -> Load SQL File*,
4. Select the database you just created and then select _File -> Load SQL File_,
and open the `paradise_schema.sql` file found in the `SQL/` directory of the
game.
@@ -194,16 +194,16 @@ the output of blackbox entries.
6. Refresh the panel on the left by right clicking it and ensure there's a new
database called `paradise_gamedb` created.
7. Create a new user account for the server by going to *Tools -> User Manager*.
7. Create a new user account for the server by going to _Tools -> User Manager_.
'From Host' should be `127.0.0.1`, not `localhost` if hosted locally.
Otherwise, use the IP of the game server. For permissions, do not give it any
global permissions. Instead click *Add Object*, select the database you
created for the server, click *OK*, then give it `SELECT`, `DELETE`,
global permissions. Instead click _Add Object_, select the database you
created for the server, click _OK_, then give it `SELECT`, `DELETE`,
`INSERT`, and `UPDATE` permissions on that database.
8. You can click the arrow on the password field to get a randomly generated
password of certain lengths. copy the password before saving as it will be
cleared the moment you hit *Save*.
cleared the moment you hit _Save_.
9. Open the file `config/config.toml` in your text editor (such as VS Code)
scroll down to the `[database_configuration]` section. You should've copied
@@ -211,20 +211,20 @@ the output of blackbox entries.
10. Make sure that these settings are changed:
- `sql_enabled` is set to `true`.
- `sql_version` to the correct version. By starting the server with a
mismatched version here and all the other settings set up, the chat box
will tell you the current version in red text, between the messages for
all the subsystems initializing. Set this to the current version.
- `sql_address` is set to `"127.0.0.1"`. (Replace with the database server's
IP if not hosted locally)
- `sql_port` is set to whatever port was selected during the MariaDB
install, usually `3306`.
- `sql_database` is set to the name of your database, usually
`"paradise_gamedb"`.
- `sql_username` is set to the 'User name' of the user you created above.
- `sql_password` is set to the randomly generated 'Password' of the user you
created above.
- `sql_enabled` is set to `true`.
- `sql_version` to the correct version. By starting the server with a
mismatched version here and all the other settings set up, the chat box
will tell you the current version in red text, between the messages for
all the subsystems initializing. Set this to the current version.
- `sql_address` is set to `"127.0.0.1"`. (Replace with the database server's
IP if not hosted locally)
- `sql_port` is set to whatever port was selected during the MariaDB
install, usually `3306`.
- `sql_database` is set to the name of your database, usually
`"paradise_gamedb"`.
- `sql_username` is set to the 'User name' of the user you created above.
- `sql_password` is set to the randomly generated 'Password' of the user you
created above.
The database is now set up for death logging, population logging, polls,
library, privacy poll, connection logging and player logging. There are two more
@@ -246,16 +246,16 @@ the database.
To enable database based administration:
- Open `\config\config.toml` and scroll to the `[admin_configuration]`
section.
- Set `use_database_admins` to `true`.
- Add a database entry for the first administrator (likely yourself).
- Done! Note that anyone set in the `admin_assignments` list will no
longer be counted.
- If your database ever dies, your server will revert to the old admin
system, so it is a good idea to have `admin_assignments` and
`admin_ranks` set up with some admins too, just so that the loss of
the database doesn't completely destroy everything.
- Open `\config\config.toml` and scroll to the `[admin_configuration]`
section.
- Set `use_database_admins` to `true`.
- Add a database entry for the first administrator (likely yourself).
- Done! Note that anyone set in the `admin_assignments` list will no
longer be counted.
- If your database ever dies, your server will revert to the old admin
system, so it is a good idea to have `admin_assignments` and
`admin_ranks` set up with some admins too, just so that the loss of
the database doesn't completely destroy everything.
## Working with `config.toml`
@@ -290,8 +290,10 @@ can change these settings under `ruin_configuration`:
- `enable_space`: Whether to load space sectors.
- `enable_space_ruins`: despite its name, this controls whether ruins are
spawned for both space _and_ Lavaland.
- `minimum_space_zlevels` and `minimum_space_zlevels` control the number of
space z-levels generated. If you don't need any, set both to `0`.
- `minimum_space_zlevels`/`maximum_space_zlevels` and
`minimum_lavaland_zlevels`/`maximum_lavaland_zlevels` control the number of
z-levels generated for space and Lavaland, respectively. If you don't need
any, set both to `0`.
### Enabling or disabling station traits
+6
View File
@@ -167,6 +167,12 @@ const Signals = (properties, context) => {
{Math.floor(signal.distance) + 'm'}
</Box>
)}
{signal.due !== undefined && (
<Box>
<Icon name={'arrow-up'} rotation={signal.due} />
&nbsp;--
</Box>
)}
</Table.Cell>
<Table.Cell verticalAlign="middle" pr="0.25rem" collapsing>
{vectorText(signal.position)}
File diff suppressed because one or more lines are too long