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

|
||||

|
||||
|
||||
[repository]: https://github.com/ParadiseSS13/Paradise
|
||||
|
||||
2. Launch Visual Studio Code. Select the Source Control panel on the sidebar,
|
||||
and click _Clone Repository_.
|
||||
|
||||

|
||||

|
||||
|
||||
If that’s not there, you can press `Ctrl`+`Shift`+`P` to open the command
|
||||
palette, then type `Git: Clone` and then press `Enter`.
|
||||
If that’s 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
|
||||
|
||||
|
||||
@@ -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} />
|
||||
--
|
||||
</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
Reference in New Issue
Block a user