diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6f97d58eddf3..5652bd39f35f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -22,7 +22,7 @@ jobs:
run: |
bash tools/ci/install_build_deps.sh
bash tools/ci/install_dreamchecker.sh
- - uses: actions/setup-python@v4
+ - uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
@@ -121,7 +121,7 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- - uses: actions/setup-python@v4
+ - uses: actions/setup-python@v5
with:
python-version: '3.8.2' # Script was made for 3.8.2
architecture: 'x86' # This MUST be x86
diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm
index 706c03d5c47e..1ec95e5fb41d 100644
--- a/_maps/map_files/generic/Lavaland.dmm
+++ b/_maps/map_files/generic/Lavaland.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
-/turf/simulated/wall/indestructible/boss,
+/turf/simulated/wall/boss,
/area/lavaland/surface/outdoors)
"ab" = (
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
@@ -22,12 +22,14 @@
/obj/structure/stone_tile/block/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"af" = (
/obj/structure/necropolis_gate/legion_gate,
/obj/structure/necropolis_arch,
/obj/structure/stone_tile/slab,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/indestructible/boss,
/area/lavaland/surface/outdoors)
"ag" = (
@@ -41,6 +43,7 @@
/obj/structure/stone_tile{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ah" = (
@@ -54,6 +57,7 @@
/obj/structure/stone_tile{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ai" = (
@@ -370,6 +374,17 @@
},
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
+"bc" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"be" = (
/obj/structure/table,
/obj/item/paper_bin{
@@ -1025,10 +1040,12 @@
/area/mine/outpost/hallway/east)
"cu" = (
/obj/item/pickaxe,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cv" = (
/obj/structure/ore_box,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"cw" = (
@@ -1435,6 +1452,16 @@
},
/turf/simulated/floor/plating,
/area/mine/outpost/quartermaster)
+"dr" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"ds" = (
/obj/machinery/light/small{
dir = 8
@@ -2543,6 +2570,13 @@
icon_state = "darkfull"
},
/area/mine/outpost/storage)
+"ft" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"fu" = (
/obj/effect/turf_decal/delivery,
/obj/effect/spawner/random_spawners/cobweb_right_rare,
@@ -2768,21 +2802,10 @@
"fQ" = (
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored/danger)
-"fR" = (
-/turf/simulated/mineral/random/high_chance/volcanic,
-/area/lavaland/surface/outdoors/unexplored)
"fS" = (
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/unexplored)
-"fT" = (
-/obj/structure/stone_tile/block{
- dir = 8
- },
-/obj/structure/stone_tile/block{
- dir = 4
- },
-/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"fU" = (
/obj/machinery/door/airlock/titanium{
id_tag = "s_docking_airlock";
@@ -2973,10 +2996,6 @@
},
/turf/simulated/floor/plasteel,
/area/mine/outpost/mechbay)
-"go" = (
-/obj/structure/stone_tile/block,
-/turf/simulated/floor/plating/lava/smooth/mapping_lava,
-/area/lavaland/surface/outdoors)
"gp" = (
/obj/machinery/door/airlock/maintenance{
name = "Central Hallway Maintence"
@@ -3007,6 +3026,7 @@
/obj/structure/stone_tile{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"gs" = (
@@ -3020,6 +3040,7 @@
dir = 4
},
/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"gt" = (
@@ -3082,6 +3103,7 @@
/obj/structure/stone_tile/cracked{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"gB" = (
@@ -3094,6 +3116,7 @@
/obj/structure/stone_tile{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"gC" = (
@@ -3135,6 +3158,7 @@
dir = 8
},
/obj/structure/stone_tile/cracked,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"gH" = (
@@ -3198,12 +3222,6 @@
icon_state = "tranquillite"
},
/area/mine/outpost/cafeteria)
-"gM" = (
-/obj/structure/stone_tile/block{
- dir = 4
- },
-/turf/simulated/floor/plating/lava/smooth/mapping_lava,
-/area/lavaland/surface/outdoors)
"gN" = (
/obj/machinery/hologram/holopad,
/obj/structure/cable{
@@ -3216,12 +3234,6 @@
dir = 8
},
/area/mine/outpost/medbay)
-"gO" = (
-/obj/structure/stone_tile/block{
- dir = 8
- },
-/turf/simulated/floor/plating/lava/smooth/mapping_lava,
-/area/lavaland/surface/outdoors)
"gP" = (
/obj/structure/stone_tile/slab,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
@@ -3231,6 +3243,7 @@
/obj/structure/stone_tile/block{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"hf" = (
@@ -3263,10 +3276,10 @@
},
/turf/simulated/floor/mineral/titanium,
/area/shuttle/siberia)
-"hs" = (
-/obj/structure/stone_tile/block{
- dir = 1
- },
+"hm" = (
+/obj/structure/stone_tile/slab/burnt,
+/obj/structure/stone_tile/slab,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"hv" = (
@@ -3301,6 +3314,12 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
+"hB" = (
+/obj/structure/stone_tile/center,
+/obj/structure/stone_tile/surrounding,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"hC" = (
/obj/structure/railing{
dir = 1
@@ -3308,6 +3327,14 @@
/obj/structure/lattice/catwalk/mining,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"hF" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"hH" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -3316,6 +3343,7 @@
/obj/structure/stone_tile{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"hJ" = (
@@ -3347,6 +3375,11 @@
},
/turf/simulated/floor/carpet,
/area/mine/outpost/quartermaster)
+"hZ" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"ic" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/unary/vent_scrubber/on,
@@ -3387,6 +3420,11 @@
icon_state = "darkfull"
},
/area/mine/outpost/airlock)
+"il" = (
+/obj/structure/stone_tile/slab/cracked,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"im" = (
/obj/structure/grille/broken,
/obj/structure/sign/poster/random{
@@ -3442,6 +3480,7 @@
dir = 1
},
/obj/structure/stone_tile/block/cracked,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"iK" = (
@@ -3514,6 +3553,7 @@
/obj/structure/stone_tile{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ji" = (
@@ -3545,6 +3585,7 @@
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"jl" = (
@@ -3558,6 +3599,7 @@
dir = 8
},
/obj/structure/stone_tile/center/cracked,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"jm" = (
@@ -3571,6 +3613,7 @@
/obj/structure/stone_tile{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"jn" = (
@@ -3622,6 +3665,21 @@
},
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"jC" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"jD" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"jF" = (
/obj/structure/stone_tile/surrounding_tile,
/obj/structure/stone_tile/surrounding_tile{
@@ -3631,6 +3689,7 @@
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"jH" = (
@@ -3642,6 +3701,7 @@
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"jJ" = (
@@ -3673,6 +3733,7 @@
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"jN" = (
@@ -3684,6 +3745,7 @@
},
/obj/structure/stone_tile/surrounding_tile,
/obj/structure/stone_tile/center/cracked,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"jP" = (
@@ -3722,6 +3784,7 @@
/area/mine/outpost/airlock)
"kg" = (
/obj/structure/fluff/drake_statue,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"kj" = (
@@ -3731,10 +3794,12 @@
/obj/structure/stone_tile/block/cracked{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"kl" = (
/obj/structure/fluff/drake_statue/falling,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"km" = (
@@ -3753,6 +3818,7 @@
dir = 1
},
/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"kt" = (
@@ -3762,6 +3828,10 @@
/obj/structure/lattice/catwalk/mining,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"kw" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/mineral/random/high_chance/volcanic,
+/area/lavaland/surface/outdoors)
"ky" = (
/obj/structure/stone_tile/cracked{
dir = 4
@@ -3784,6 +3854,7 @@
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"kD" = (
@@ -3797,6 +3868,7 @@
dir = 8
},
/obj/structure/stone_tile/center,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"kH" = (
@@ -3808,6 +3880,7 @@
dir = 4
},
/obj/structure/stone_tile/center/cracked,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"kI" = (
@@ -3824,6 +3897,7 @@
dir = 1
},
/obj/structure/stone_tile/center,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"kM" = (
@@ -3838,10 +3912,6 @@
},
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"kR" = (
-/obj/structure/stone_tile/slab/cracked,
-/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"kS" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station,
@@ -3850,6 +3920,16 @@
},
/turf/simulated/floor/plasteel,
/area/mine/outpost/mechbay)
+"kT" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"le" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -3858,6 +3938,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"lf" = (
@@ -3871,6 +3952,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"lh" = (
@@ -3886,6 +3968,7 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ll" = (
@@ -3913,6 +3996,8 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
+/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)
"lq" = (
@@ -3920,6 +4005,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"lr" = (
@@ -3927,6 +4013,8 @@
/obj/structure/stone_tile/block{
dir = 8
},
+/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)
"ls" = (
@@ -3942,6 +4030,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"lv" = (
@@ -3952,6 +4041,7 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"lw" = (
@@ -3971,6 +4061,7 @@
/obj/structure/stone_tile/block{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"lB" = (
@@ -3989,6 +4080,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"lE" = (
@@ -3998,6 +4090,7 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"lF" = (
@@ -4010,6 +4103,7 @@
/obj/structure/stone_tile{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"lG" = (
@@ -4017,6 +4111,7 @@
dir = 1
},
/obj/structure/stone_tile/block,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"lH" = (
@@ -4063,24 +4158,16 @@
/obj/structure/stone_tile/cracked{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"lQ" = (
/obj/structure/stone_tile/surrounding/cracked{
dir = 6
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
-"lR" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 8
- },
-/obj/structure/stone_tile/cracked,
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"lS" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
@@ -4091,6 +4178,7 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"lT" = (
@@ -4107,6 +4195,7 @@
/obj/structure/stone_tile/block/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"lZ" = (
@@ -4116,6 +4205,7 @@
/obj/structure/stone_tile/cracked{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"ma" = (
@@ -4125,6 +4215,7 @@
/obj/structure/stone_tile/block{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mb" = (
@@ -4135,8 +4226,18 @@
/obj/structure/stone_tile/block{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
+"md" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/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)
"mi" = (
/obj/machinery/computer/security{
dir = 4;
@@ -4159,6 +4260,7 @@
/obj/structure/stone_tile/block{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ml" = (
@@ -4166,6 +4268,7 @@
dir = 8
},
/obj/structure/stone_tile/cracked,
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/lava/smooth/mapping_lava,
/area/lavaland/surface/outdoors)
"mn" = (
@@ -4173,6 +4276,7 @@
/obj/structure/stone_tile/block{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mp" = (
@@ -4287,13 +4391,6 @@
},
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"mE" = (
-/obj/structure/stone_tile/block,
-/obj/structure/stone_tile{
- dir = 4
- },
-/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"mF" = (
/obj/structure/stone_tile/block/cracked,
/obj/structure/stone_tile{
@@ -4302,6 +4399,7 @@
/obj/structure/stone_tile{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mG" = (
@@ -4311,6 +4409,7 @@
/obj/structure/stone_tile/cracked{
dir = 8
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mH" = (
@@ -4330,6 +4429,7 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mJ" = (
@@ -4358,6 +4458,7 @@
/obj/structure/stone_tile/cracked{
dir = 4
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mM" = (
@@ -4372,6 +4473,7 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mO" = (
@@ -4381,6 +4483,7 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
+/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mP" = (
@@ -4528,6 +4631,14 @@
},
/turf/simulated/floor/indestructible/boss,
/area/lavaland/surface/outdoors)
+"nr" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"nw" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/cable{
@@ -4541,6 +4652,16 @@
icon_state = "tranquillite"
},
/area/mine/outpost/cafeteria)
+"nB" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"nI" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/lattice/catwalk/mining,
@@ -4652,6 +4773,13 @@
},
/turf/simulated/floor/plating,
/area/mine/outpost/production)
+"or" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"ox" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
@@ -4747,6 +4875,16 @@
},
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"pn" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"pq" = (
/turf/simulated/floor/mineral/titanium,
/area/shuttle/siberia)
@@ -4812,10 +4950,28 @@
icon_state = "darkpurplecorners"
},
/area/mine/outpost/hallway/west)
+"pT" = (
+/obj/structure/stone_tile/slab,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"qb" = (
/obj/structure/girder,
/turf/simulated/floor/plating,
/area/mine/outpost/maintenance/south)
+"qk" = (
+/obj/structure/stone_tile/slab/burnt,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"qo" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"qv" = (
/obj/structure/table/reinforced,
/turf/simulated/floor/plasteel{
@@ -4893,6 +5049,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"rb" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"rd" = (
/obj/structure/closet/secure_closet/brig/gulag,
/obj/effect/decal/cleanable/dirt,
@@ -4981,6 +5144,13 @@
/obj/effect/baseturf_helper/asteroid/basalt,
/turf/simulated/floor/mineral/titanium,
/area/shuttle/mining)
+"rP" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"rS" = (
/obj/structure/cable{
d1 = 4;
@@ -4992,6 +5162,21 @@
icon_state = "brown"
},
/area/mine/laborcamp)
+"rW" = (
+/obj/structure/stone_tile/slab,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"sg" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"sk" = (
/obj/machinery/door/firedoor,
/obj/effect/spawner/window/reinforced/grilled,
@@ -5090,10 +5275,35 @@
icon_state = "darkfull"
},
/area/mine/outpost/hallway/west)
+"sW" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"ta" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"tb" = (
/obj/effect/spawner/window/shuttle,
/turf/simulated/floor/plating,
/area/shuttle/mining)
+"td" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"tj" = (
/obj/effect/decal/cleanable/ash,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
@@ -5255,6 +5465,11 @@
icon_state = "darkyellowcorners"
},
/area/mine/outpost/hallway/west)
+"ux" = (
+/obj/structure/stone_tile/block,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"uB" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 8
@@ -5288,6 +5503,16 @@
},
/turf/simulated/floor/plating,
/area/mine/outpost/airlock)
+"uR" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"uT" = (
/turf/simulated/floor/plating,
/area/mine/outpost/maintenance/south)
@@ -5363,6 +5588,14 @@
/obj/effect/turf_decal/stripes/line,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"vo" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"vq" = (
/obj/structure/disposalpipe/segment/corner{
dir = 1
@@ -5517,6 +5750,13 @@
/obj/structure/lattice/catwalk/mining,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"wd" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"we" = (
/obj/structure/mopbucket/full,
/obj/item/mop,
@@ -5553,6 +5793,13 @@
/obj/effect/turf_decal/delivery/hollow,
/turf/simulated/floor/plating,
/area/mine/outpost/cafeteria)
+"wr" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"wy" = (
/obj/effect/spawner/random_spawners/dirt_maybe,
/obj/structure/sign/fire{
@@ -5560,6 +5807,12 @@
},
/turf/simulated/floor/plating,
/area/mine/outpost/maintenance/south)
+"wA" = (
+/obj/structure/stone_tile/slab/burnt,
+/obj/structure/stone_tile/slab/cracked,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"wD" = (
/obj/effect/decal/remains/human,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
@@ -5642,6 +5895,11 @@
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/floor/plating/lavaland_air,
/area/shuttle/siberia)
+"xE" = (
+/obj/structure/stone_tile/cracked,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"xG" = (
/obj/structure/disposalpipe/segment{
dir = 8
@@ -5654,6 +5912,20 @@
icon_state = "darkpurplecorners"
},
/area/mine/outpost/hallway/west)
+"xJ" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
+"xN" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/mineral/random/volcanic,
+/area/lavaland/surface/outdoors/unexplored/danger)
"xP" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -5688,6 +5960,11 @@
/obj/effect/spawner/random_spawners/cobweb_left_rare,
/turf/simulated/floor/plating,
/area/mine/outpost/maintenance/south)
+"ya" = (
+/obj/effect/mapping_helpers/no_lava,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/wall/boss,
+/area/lavaland/surface/outdoors)
"yb" = (
/obj/structure/table/glass,
/obj/machinery/firealarm{
@@ -5765,6 +6042,9 @@
icon_state = "darkfull"
},
/area/mine/outpost/engineering)
+"ys" = (
+/turf/simulated/wall/boss,
+/area/lavaland/surface/outdoors/unexplored/danger)
"yw" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -5823,6 +6103,14 @@
/obj/effect/decal/cleanable/spiderling_remains,
/turf/simulated/floor/plating,
/area/mine/outpost/maintenance/south)
+"yW" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/block,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"yY" = (
/obj/machinery/suit_storage_unit/lavaland,
/obj/structure/extinguisher_cabinet{
@@ -5953,6 +6241,11 @@
icon_state = "darkyellowcorners"
},
/area/mine/outpost/hallway/east)
+"zW" = (
+/obj/structure/stone_tile/slab/burnt,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"zY" = (
/obj/structure/chair{
dir = 1
@@ -5965,6 +6258,16 @@
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
+"zZ" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Ab" = (
/obj/machinery/light_switch{
name = "custom placement";
@@ -6014,6 +6317,10 @@
},
/turf/simulated/floor/plasteel/dark,
/area/mine/outpost/comms)
+"Ao" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/wall/indestructible/boss/see_through,
+/area/lavaland/surface/outdoors)
"At" = (
/obj/effect/spawner/random_spawners/dirt_maybe,
/obj/structure/cable{
@@ -6095,6 +6402,14 @@
icon_state = "darkfull"
},
/area/mine/outpost/lockers)
+"AW" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"AY" = (
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/mineral/volcanic/lava_land_surface,
@@ -6172,12 +6487,33 @@
/obj/effect/spawner/random_spawners/wall_rusted_maybe,
/turf/simulated/wall,
/area/mine/outpost/hallway/east)
+"BL" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
+"BM" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"BP" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/siberia)
+"BX" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/wall/boss,
+/area/lavaland/surface/outdoors/unexplored/danger)
"BY" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/marker_beacon/dock_marker,
@@ -6202,6 +6538,16 @@
"Cf" = (
/turf/simulated/floor/mineral/titanium,
/area/shuttle/mining)
+"Ci" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Cl" = (
/obj/structure/table/reinforced,
/obj/item/clothing/head/that,
@@ -6326,6 +6672,13 @@
/obj/structure/closet/crate,
/turf/simulated/floor/mineral/titanium,
/area/shuttle/siberia)
+"CS" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"CT" = (
/obj/effect/spawner/window,
/turf/simulated/floor/plating,
@@ -6467,6 +6820,13 @@
icon_state = "darkfull"
},
/area/mine/outpost/hallway/west)
+"DR" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"DT" = (
/obj/machinery/computer/shuttle/labor/one_way,
/obj/effect/decal/cleanable/cobweb,
@@ -6547,6 +6907,19 @@
},
/turf/simulated/floor/plating,
/area/mine/outpost/quartermaster)
+"Eq" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Ez" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
@@ -6602,6 +6975,14 @@
/obj/item/toy/figure/crew/miner,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"EQ" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Fa" = (
/obj/structure/table,
/obj/item/lighter/random,
@@ -6656,6 +7037,14 @@
icon_state = "wood-broken7"
},
/area/mine/laborcamp)
+"Fv" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Fw" = (
/obj/structure/cable{
d1 = 1;
@@ -6687,6 +7076,14 @@
icon_state = "tranquillite"
},
/area/mine/outpost/cafeteria)
+"FF" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/block/burnt{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"FH" = (
/obj/structure/cable,
/obj/effect/spawner/random_spawners/dirt_maybe,
@@ -6697,6 +7094,14 @@
},
/turf/simulated/floor/plating,
/area/mine/outpost/maintenance/east)
+"FL" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/block,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"FO" = (
/obj/structure/rack,
/obj/item/storage/bag/ore,
@@ -6743,6 +7148,10 @@
},
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"Gb" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/mineral/random/high_chance/volcanic,
+/area/lavaland/surface/outdoors/unexplored/danger)
"Gl" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
@@ -6785,6 +7194,14 @@
/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/mine/outpost/maintenance/south)
+"Gu" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Gw" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 1
@@ -6807,6 +7224,13 @@
icon_state = "darkfull"
},
/area/mine/outpost/hallway/west)
+"GC" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"GD" = (
/obj/structure/sign/poster/contraband/lusty_xenomorph,
/turf/simulated/wall,
@@ -6833,6 +7257,16 @@
icon_state = "darkyellowcorners"
},
/area/mine/outpost/hallway/east)
+"GO" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"He" = (
/obj/machinery/door/airlock/mining/glass{
name = "Hallway"
@@ -6878,6 +7312,16 @@
icon_state = "brown"
},
/area/mine/laborcamp)
+"HE" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"HH" = (
/obj/structure/cable{
d1 = 4;
@@ -6999,6 +7443,16 @@
icon_state = "darkfull"
},
/area/mine/outpost/lockers)
+"IQ" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"IR" = (
/obj/structure/shuttle/engine/heater,
/obj/structure/window/reinforced{
@@ -7007,6 +7461,11 @@
},
/turf/simulated/floor/plating/lavaland_air,
/area/shuttle/siberia)
+"IZ" = (
+/obj/structure/stone_tile/block,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Jb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 5
@@ -7221,6 +7680,14 @@
/obj/structure/lattice/catwalk/mining,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"KB" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"KD" = (
/obj/effect/spawner/random_spawners/fungus_maybe,
/turf/simulated/wall,
@@ -7427,6 +7894,16 @@
icon_state = "darkyellowcorners"
},
/area/mine/outpost/hallway/west)
+"MS" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Nb" = (
/obj/structure/cable{
d1 = 4;
@@ -7532,6 +8009,14 @@
icon_state = "darkgreencorners"
},
/area/mine/outpost/custodial)
+"NA" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"ND" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -7565,6 +8050,11 @@
icon_state = "tranquillite"
},
/area/mine/outpost/cafeteria)
+"NI" = (
+/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)
"NK" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/spawner/random_spawners/dirt_maybe,
@@ -7754,6 +8244,13 @@
icon_state = "darkfull"
},
/area/mine/outpost/engineering)
+"Pi" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"Pp" = (
/obj/machinery/atmospherics/pipe/simple/visible/universal,
/obj/structure/railing/cap{
@@ -7795,6 +8292,11 @@
icon_state = "darkfull"
},
/area/mine/outpost/hallway/east)
+"PF" = (
+/obj/structure/stone_tile/slab/cracked,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"PG" = (
/obj/machinery/door/firedoor,
/obj/structure/cable{
@@ -7905,6 +8407,10 @@
/obj/effect/spawner/random_spawners/fungus_maybe,
/turf/simulated/wall,
/area/mine/outpost/custodial)
+"QO" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/mineral/ancient/lava_land_surface_hard,
+/area/lavaland/surface/outdoors/unexplored/danger)
"QR" = (
/obj/structure/cable{
d1 = 1;
@@ -7955,6 +8461,10 @@
icon_state = "brown"
},
/area/mine/laborcamp)
+"Rl" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/wall/boss,
+/area/lavaland/surface/outdoors)
"Rs" = (
/obj/structure/closet/crate/trashcart,
/obj/item/trash/liquidfood,
@@ -7979,6 +8489,12 @@
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"RJ" = (
+/obj/structure/stone_tile/slab/burnt,
+/obj/structure/stone_tile/slab,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"RR" = (
/obj/structure/firelock_frame,
/turf/simulated/floor/plating,
@@ -8016,6 +8532,16 @@
},
/turf/simulated/floor/mineral/titanium/blue,
/area/shuttle/mining)
+"Sd" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"Sh" = (
/obj/effect/spawner/random_spawners/wall_rusted_maybe,
/obj/effect/spawner/random_spawners/wall_rusted_maybe,
@@ -8107,6 +8633,11 @@
/obj/effect/spawner/random_spawners/wall_rusted_maybe,
/turf/simulated/wall,
/area/mine/outpost/cafeteria)
+"SS" = (
+/obj/structure/stone_tile/center,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"ST" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/poddoor/shutters{
@@ -8153,6 +8684,11 @@
icon_state = "darkfull"
},
/area/mine/outpost/storage)
+"Ti" = (
+/obj/structure/stone_tile/surrounding_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Tk" = (
/obj/machinery/camera{
c_tag = "Labor Camp Bedroom 1";
@@ -8284,6 +8820,14 @@
/obj/effect/spawner/random_spawners/dirt_maybe,
/turf/simulated/floor/catwalk,
/area/mine/outpost/engineering)
+"Ur" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"Uy" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
@@ -8322,6 +8866,14 @@
icon_state = "darkfull"
},
/area/mine/outpost/airlock)
+"UU" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/lava/smooth/mapping_lava,
+/area/lavaland/surface/outdoors)
"Ve" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -8363,6 +8915,21 @@
},
/turf/simulated/floor/catwalk,
/area/mine/outpost/engineering)
+"Vm" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"Vq" = (
+/obj/structure/stone_tile,
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Vt" = (
/obj/machinery/camera{
c_tag = "Labor Camp Central";
@@ -8514,6 +9081,13 @@
icon_state = "darkfull"
},
/area/mine/outpost/hallway/west)
+"VU" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"VV" = (
/obj/machinery/firealarm{
dir = 8;
@@ -8687,6 +9261,16 @@
dir = 8
},
/area/mine/outpost/medbay)
+"Xc" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Xd" = (
/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,
@@ -8716,6 +9300,14 @@
icon_state = "tranquillite"
},
/area/mine/outpost/cafeteria)
+"Xl" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Xq" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -8756,6 +9348,13 @@
icon_state = "tranquillite"
},
/area/mine/outpost/cafeteria)
+"XE" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"XF" = (
/obj/machinery/economy/vending/wallmed{
pixel_x = 28
@@ -8983,6 +9582,12 @@
/obj/effect/spawner/random_spawners/wall_rusted_maybe,
/turf/simulated/wall,
/area/mine/outpost/maintenance/south)
+"Zj" = (
+/obj/structure/stone_tile/slab,
+/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)
"Zk" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
@@ -8996,6 +9601,13 @@
},
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
+"Zs" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Zu" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing{
@@ -9050,6 +9662,9 @@
/obj/item/cigbutt,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/outpost/catwalk)
+"ZY" = (
+/turf/simulated/mineral/ancient/lava_land_surface_hard,
+/area/lavaland/surface/outdoors/unexplored/danger)
"ZZ" = (
/obj/effect/decal/cleanable/fungus,
/turf/simulated/wall,
@@ -22854,17 +23469,17 @@ ak
ak
ak
ak
+am
+am
+am
+am
+am
ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+am
+am
am
am
am
@@ -23125,9 +23740,9 @@ ak
ak
ak
ak
-ak
-ak
-ak
+am
+am
+am
am
am
am
@@ -23384,10 +23999,10 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
+am
+am
+am
+am
am
am
am
@@ -23642,10 +24257,10 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
+am
+am
+am
+am
am
am
am
@@ -23900,10 +24515,10 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
+am
+am
+am
+am
am
am
am
@@ -24158,9 +24773,9 @@ ak
ak
ak
ak
-ak
-ak
-ak
+am
+am
+am
am
am
am
@@ -24415,9 +25030,9 @@ ak
ak
ak
ak
-ak
-ak
-ak
+am
+am
+am
am
am
am
@@ -24672,9 +25287,9 @@ ak
ak
ak
ak
-ak
-ak
-ak
+am
+am
+am
am
am
am
@@ -24929,9 +25544,9 @@ ak
ak
ak
ak
-ak
-ak
-ak
+am
+am
+am
am
am
am
@@ -25186,9 +25801,9 @@ ak
ak
ak
ak
-ak
-ak
-ak
+am
+am
+am
am
am
am
@@ -25443,9 +26058,9 @@ ak
ak
ak
ak
-ak
-ak
-ak
+am
+am
+am
am
am
am
@@ -25700,8 +26315,8 @@ ak
ak
ak
ak
-ak
-ak
+am
+am
am
am
am
@@ -26468,7 +27083,7 @@ ak
ak
ak
ak
-ak
+am
am
am
am
@@ -26522,7 +27137,7 @@ aj
aj
aj
aj
-ab
+aj
aj
aj
aj
@@ -26778,15 +27393,15 @@ vP
vP
vP
vP
-vP
-vP
-vP
-vP
-vP
-vP
-vP
-vP
-vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(70,1,1) = {"
aa
@@ -27035,15 +27650,15 @@ vP
vP
vP
vP
-vP
-vP
-vP
-vP
-vP
-vP
-vP
-vP
-vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(71,1,1) = {"
aa
@@ -27288,19 +27903,19 @@ vP
vP
vP
vP
-Ly
-vP
-vP
-vP
-vP
-vP
-vP
-vP
-vP
vP
vP
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(72,1,1) = {"
aa
@@ -27494,7 +28109,7 @@ ak
ak
ak
ak
-ak
+am
am
am
am
@@ -27549,15 +28164,15 @@ vP
vP
vP
vP
-vP
-Ly
-vP
-vP
-Ly
-vP
-vP
-vP
-vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(73,1,1) = {"
aa
@@ -27801,20 +28416,20 @@ vP
Ly
vP
vP
-Ly
-vP
-Ly
-vP
vP
vP
-Ly
-Ly
-vP
-vP
-Ly
vP
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(74,1,1) = {"
aa
@@ -28059,19 +28674,19 @@ vP
vP
vP
vP
-Ly
-Ly
-vP
-Ly
vP
vP
-Ly
-Ly
-Ly
-Ly
-vP
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(75,1,1) = {"
aa
@@ -28309,13 +28924,7 @@ Ly
Ly
Ly
Ly
-vP
-Ly
-Ly
Ly
-vP
-vP
-vP
Ly
Ly
Ly
@@ -28323,12 +28932,18 @@ vP
vP
vP
Ly
-Ly
-Ly
vP
-Ly
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(76,1,1) = {"
aa
@@ -28563,17 +29178,6 @@ WH
WH
WH
WH
-WH
-Ly
-Ly
-vP
-Ly
-Ly
-Ly
-vP
-vP
-Ly
-Ly
Ly
Ly
Ly
@@ -28581,11 +29185,22 @@ Ly
Ly
Ly
Ly
+vP
+vP
Ly
vP
vP
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(77,1,1) = {"
aa
@@ -28823,16 +29438,245 @@ WH
WH
Ly
Ly
-vP
Ly
Ly
Ly
Ly
Ly
+Ly
+WH
+vP
vP
+vP
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+"}
+(78,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+ab
+ab
+ab
+ab
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+am
+am
+am
+am
+am
+am
+am
+am
+am
+ai
+ai
+ai
+ab
+ab
+ab
+ab
+Ly
+WH
+WH
Ly
Ly
Ly
+WH
+WH
+WH
+Ly
Ly
Ly
Ly
@@ -28840,11 +29684,39 @@ Ly
Ly
Ly
Ly
+Ly
+WH
+WH
+WH
+WH
vP
+vP
+vP
+Ly
+Ly
+Ly
Ly
+Ly
+Ly
+Ly
+WH
+Ly
+WH
+vP
+vP
+vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
-(78,1,1) = {"
+(79,1,1) = {"
aa
aa
aa
@@ -28857,9 +29729,9 @@ aa
aa
aa
ab
-ab
-ab
-ab
+ad
+ad
+ad
ab
ab
ab
@@ -28873,7 +29745,7 @@ aj
aj
aj
aj
-aj
+ab
ab
ab
ab
@@ -29046,37 +29918,21 @@ am
am
am
ai
-ai
-ai
ab
ab
ab
ab
-Ly
-WH
-WH
-Ly
-Ly
-Ly
-WH
-WH
-WH
-Ly
-Ly
-Ly
-Ly
+ab
+ab
Ly
Ly
Ly
+NI
Ly
Ly
WH
WH
WH
-WH
-vP
-vP
-vP
Ly
Ly
Ly
@@ -29089,6 +29945,10 @@ Ly
Ly
Ly
Ly
+vP
+vP
+vP
+vP
Ly
Ly
Ly
@@ -29096,12 +29956,24 @@ Ly
Ly
Ly
Ly
+WH
+WH
+ka
vP
Ly
+Ly
vP
-vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
-(79,1,1) = {"
+(80,1,1) = {"
aa
aa
aa
@@ -29115,9 +29987,9 @@ aa
aa
ab
ad
-ad
-ad
-ab
+ai
+ai
+ai
ab
ab
aj
@@ -29129,7 +30001,7 @@ aj
aj
aj
aj
-aj
+ab
ab
ab
ab
@@ -29302,9 +30174,9 @@ am
am
am
am
+am
+ai
ai
-ab
-ab
ab
ab
ab
@@ -29326,39 +30198,39 @@ Ly
Ly
Ly
Ly
-Ly
-Ly
-Ly
-Ly
vP
vP
vP
vP
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
+vP
+vP
+vP
+vP
vP
Ly
Ly
Ly
Ly
Ly
+WH
+ka
+ka
+ka
+WH
Ly
-Ly
-vP
-Ly
-vP
-vP
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
-(80,1,1) = {"
+(81,1,1) = {"
aa
aa
aa
@@ -29375,7 +30247,7 @@ ad
ai
ai
ai
-ab
+ad
ab
aj
aj
@@ -29561,7 +30433,7 @@ am
am
am
ai
-ai
+ab
ab
ab
ab
@@ -29582,7 +30454,7 @@ Ly
Ly
Ly
Ly
-Ly
+vP
vP
vP
vP
@@ -29598,24 +30470,24 @@ Ly
Ly
Ly
Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-vP
-vP
-Ly
-vP
+WH
+ka
+ka
+ka
+WH
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
-(81,1,1) = {"
+(82,1,1) = {"
aa
aa
aa
@@ -29628,7 +30500,7 @@ aa
aa
aa
ab
-ad
+ab
ai
ai
ai
@@ -29645,7 +30517,7 @@ aj
aj
ab
ab
-ab
+aj
ab
ab
ab
@@ -29817,13 +30689,12 @@ am
am
am
am
+am
+ai
+ai
ai
ab
ab
-ab
-ab
-ab
-Ly
Ly
Ly
Ly
@@ -29839,9 +30710,11 @@ Ly
Ly
Ly
Ly
-vP
-vP
-vP
+Ly
+Ly
+Ly
+Ly
+Ly
vP
vP
vP
@@ -29850,29 +30723,28 @@ vP
vP
vP
Ly
+WH
+WH
Ly
Ly
+WH
+ka
+ka
+ka
+WH
Ly
Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-vP
-vP
-vP
-Ly
-vP
-vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
-(82,1,1) = {"
+(83,1,1) = {"
aa
aa
aa
@@ -29886,10 +30758,10 @@ aa
aa
ab
ab
-ai
-ai
-ai
+ab
+ad
ad
+ix
ab
aj
aj
@@ -29898,11 +30770,11 @@ aj
aj
aj
aj
-aj
-aj
ab
+aj
ab
aj
+aj
ab
ab
ab
@@ -30064,6 +30936,9 @@ ak
ak
ak
ak
+ak
+am
+am
am
am
am
@@ -30075,11 +30950,8 @@ am
am
am
am
-ai
-ai
ai
ab
-ab
Ly
Ly
Ly
@@ -30087,8 +30959,6 @@ Ly
Ly
WH
WH
-WH
-Ly
Ly
Ly
Ly
@@ -30099,37 +30969,39 @@ Ly
Ly
Ly
Ly
+WH
+WH
+WH
+WH
Ly
vP
vP
vP
vP
-vP
-vP
-vP
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
Ly
Ly
Ly
+WH
Ly
Ly
Ly
+WH
+ka
+ka
+ka
+WH
vP
-vP
-vP
-vP
-vP
-vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
-(83,1,1) = {"
+(84,1,1) = {"
aa
aa
aa
@@ -30144,11 +31016,10 @@ aa
ab
ab
ab
-ad
-ad
-ix
ab
-aj
+ab
+ab
+ab
aj
aj
aj
@@ -30156,10 +31027,11 @@ aj
aj
aj
ab
-aj
ab
aj
aj
+aj
+aj
ab
ab
ab
@@ -30246,6 +31118,17 @@ ak
ak
ak
ak
+al
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
+ak
ak
ak
ak
@@ -30311,17 +31194,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
am
am
am
@@ -30355,38 +31227,38 @@ Ly
Ly
Ly
WH
+ka
+ka
+ka
WH
-WH
-WH
-Ly
-vP
vP
vP
vP
Ly
+WH
+WH
+WH
+WH
Ly
Ly
Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-Ly
-vP
-vP
-vP
+WH
+ka
+ka
+WH
vP
vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
-(84,1,1) = {"
+(85,1,1) = {"
aa
aa
aa
@@ -30503,7 +31375,6 @@ ak
ak
ak
ak
-al
ak
ak
ak
@@ -30579,8 +31450,8 @@ ak
ak
ak
ak
-am
-am
+ak
+ak
am
am
am
@@ -30595,55 +31466,56 @@ am
ai
ab
ab
-ab
-ab
-ab
-ab
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-ai
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+WH
+vP
+vP
+Ly
+WH
+ka
+ka
+WH
+cu
+Ly
+Ly
+Ly
+WH
+ka
+ka
+WH
+vP
+vP
+aj
+aj
aj
aj
aj
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aj
-ab
aj
aj
aj
"}
-(85,1,1) = {"
+(86,1,1) = {"
aa
aa
aa
@@ -30671,264 +31543,7 @@ aj
ab
ab
aj
-aj
-aj
-aj
-ab
-ab
-ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-ai
-aj
-aj
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-aj
-aj
-ab
-"}
-(86,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-ab
-ab
-aj
-ab
+ab
aj
aj
ab
@@ -31108,51 +31723,51 @@ am
ai
ab
ab
-ab
-ab
-ab
-ab
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-ai
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+WH
+vP
+WH
+WH
+ka
+ka
+ka
+WH
+cv
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+WH
+vP
+aj
+aj
+aj
+aj
aj
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aj
-ab
aj
aj
aj
@@ -31365,50 +31980,50 @@ am
am
ai
ab
-ab
-ab
-ab
-ab
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-ab
-ab
-ab
-ai
-am
-ai
-ai
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+Ly
+Ly
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+WH
+ka
+WH
+WH
+WH
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+kw
+ka
+ka
+ka
+ka
+WH
+vP
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -31622,50 +32237,50 @@ am
am
am
ai
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+WH
+ka
+WH
+WH
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+WH
+ka
+ka
+ka
+ka
+WH
+Ly
+vP
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-ai
-ai
-am
-ai
-ai
-ab
-ai
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -31879,52 +32494,52 @@ am
am
am
am
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-ai
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
aj
-ab
aj
aj
"}
@@ -32136,50 +32751,50 @@ am
am
am
ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+vP
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -32393,53 +33008,53 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
"}
(92,1,1) = {"
@@ -32650,54 +33265,54 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(93,1,1) = {"
aa
@@ -32907,54 +33522,54 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-ai
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(94,1,1) = {"
aa
@@ -33164,52 +33779,52 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -33421,54 +34036,54 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
ab
+aj
+aj
ab
aj
aj
aj
+aj
+aj
"}
(96,1,1) = {"
aa
@@ -33678,54 +34293,54 @@ am
am
am
am
-ai
-ab
-ab
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+WH
aj
ab
-ab
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(97,1,1) = {"
aa
@@ -33935,51 +34550,51 @@ am
am
am
ai
-ab
-ab
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+Ly
+Ly
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -34192,52 +34807,52 @@ am
am
am
ai
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
ab
-ab
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -34297,6 +34912,7 @@ ak
ak
ak
ak
+ZY
ak
ak
ak
@@ -34308,6 +34924,7 @@ ak
ak
ak
ak
+ZY
ak
ak
ak
@@ -34437,10 +35054,6 @@ ak
ak
ak
ak
-ak
-ak
-am
-am
am
am
am
@@ -34448,52 +35061,54 @@ am
am
am
am
-ai
-ab
-ab
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-am
-ai
-ai
-ai
-ai
-ab
-ab
-ai
-ai
-ai
am
am
ai
-ai
-ad
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+WH
+WH
+WH
+WH
+Ly
+Ly
+WH
+WH
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+WH
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -34552,8 +35167,23 @@ ak
ak
ak
ak
+ZY
ak
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
ak
+ZY
ak
ak
ak
@@ -34681,23 +35311,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
am
am
am
@@ -34705,53 +35318,55 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ai
-ab
-ab
-ai
-am
-am
-am
am
am
ai
-ab
-ab
-ab
-ab
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -34807,27 +35422,27 @@ ak
ak
ak
ak
+ZY
ak
+ZY
+ZY
+ZY
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+ZY
+ZY
+ZY
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
ak
ak
ak
@@ -34963,52 +35578,52 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ai
-ai
-ab
-ai
-am
-am
-ai
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+Ly
+WH
+ka
+ka
+WH
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+ka
+ka
+WH
+ka
+ka
+ka
+WH
+Ly
+WH
+WH
+ka
+ka
+ka
+ka
+WH
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -35063,6 +35678,29 @@ ak
ak
ak
ak
+ZY
+ZY
+ZY
+ZY
+BX
+BX
+BX
+vP
+BX
+BX
+vP
+vP
+vP
+BX
+BX
+vP
+BX
+BX
+BX
+ZY
+ZY
+ZY
+ZY
ak
ak
ak
@@ -35187,31 +35825,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
am
am
am
@@ -35221,51 +35834,53 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ai
am
-ai
-am
-am
-ai
-cu
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+WH
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+Ly
+WH
+WH
+Ly
+WH
+ka
+WH
+Ly
+Ly
+Ly
+WH
+Ly
+WH
+WH
+WH
+WH
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -35321,6 +35936,27 @@ ak
ak
ak
ak
+ZY
+BX
+BX
+BX
+vP
+BX
+vP
+vP
+vP
+vP
+vP
+vP
+vP
+vP
+vP
+BX
+vP
+BX
+BX
+BX
+ZY
ak
ak
ak
@@ -35446,29 +36082,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
am
am
am
@@ -35477,51 +36090,53 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
am
am
-ai
-cv
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+WH
+Ly
+WH
+Ly
+WH
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -35576,6 +36191,31 @@ ak
ak
ak
ak
+ZY
+ZY
+ZY
+BX
+BX
+vP
+pT
+Ur
+BX
+BX
+vP
+vP
+vP
+vP
+vP
+BX
+BX
+qo
+il
+vP
+BX
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -35699,32 +36339,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
am
am
am
@@ -35734,53 +36348,54 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ai
-am
-am
-am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
-ab
aj
"}
(105,1,1) = {"
@@ -35834,6 +36449,29 @@ ak
ak
ak
ak
+ZY
+BX
+BX
+vP
+NA
+vP
+ux
+vP
+Ly
+qk
+Ly
+Ly
+Ly
+rW
+Ly
+vP
+CS
+vP
+pn
+vP
+BX
+BX
+ZY
ak
ak
ak
@@ -35958,30 +36596,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
am
am
am
@@ -35992,51 +36606,52 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ai
-am
-ai
-ai
-ai
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+WH
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+ka
+WH
+WH
+WH
+Ly
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -36089,6 +36704,33 @@ ak
ak
ak
ak
+ZY
+ZY
+ZY
+BX
+vP
+il
+vP
+NA
+rP
+Ly
+Ly
+ft
+Ly
+Ly
+Ly
+IZ
+Ly
+Ly
+Vq
+pn
+vP
+pT
+vP
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -36211,91 +36853,64 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
am
am
am
am
am
-ai
-ab
-ab
-ab
-ai
-am
-am
-am
-am
-am
-am
-am
-ai
-ai
-ab
-ab
-ai
am
am
am
am
am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+WH
+Ly
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+WH
+Ly
+Ly
+WH
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
-ab
-ab
"}
(107,1,1) = {"
aa
@@ -36347,6 +36962,31 @@ ak
ak
ak
ak
+ZY
+BX
+BX
+BX
+xJ
+Pi
+VU
+nr
+Ly
+Ly
+Vq
+Ly
+Ly
+Ly
+rP
+Ly
+Ly
+nB
+sW
+Pi
+dr
+BX
+BX
+BX
+ZY
ak
ak
ak
@@ -36470,32 +37110,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
am
am
am
@@ -36506,50 +37120,51 @@ am
am
am
am
-ai
-ab
-ai
+ka
+WH
+Ly
+WH
fS
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ai
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+WH
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -36604,31 +37219,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+vP
+vP
+BX
+vP
+Ly
+Ly
+nr
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+nB
+Ly
+Ly
+vP
+BX
+vP
+vP
+BX
+ZY
ak
ak
ak
@@ -36762,54 +37377,54 @@ am
am
am
am
-am
-am
-ai
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+WH
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
ab
aj
aj
aj
+aj
+aj
+aj
+aj
"}
(109,1,1) = {"
aa
@@ -36861,6 +37476,31 @@ ak
ak
ak
ak
+ZY
+BX
+Rl
+vP
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+vP
+BX
+BX
+ZY
ak
ak
ak
@@ -36985,32 +37625,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
am
am
am
@@ -37020,51 +37634,52 @@ am
am
am
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -37118,6 +37733,31 @@ ak
ak
ak
ak
+ZY
+BX
+Rl
+Ly
+Ly
+rW
+GC
+Vq
+Ly
+Ly
+Xc
+Ly
+Ly
+Ly
+hF
+Ly
+Ly
+rP
+GC
+PF
+Ly
+Ly
+BX
+BX
+ZY
ak
ak
ak
@@ -37242,35 +37882,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
am
am
am
@@ -37300,30 +37911,34 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
ab
aj
aj
+aj
+aj
+aj
+aj
"}
(111,1,1) = {"
aa
@@ -37375,6 +37990,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+VU
+IZ
+Ly
+ft
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -37499,33 +38139,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
am
am
am
@@ -37555,30 +38168,32 @@ am
am
am
am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
"}
@@ -37632,6 +38247,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Zs
+GC
+GC
+GC
+GC
+GC
+GC
+GC
+rb
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -37757,33 +38397,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
am
am
am
@@ -37812,32 +38425,34 @@ am
am
am
am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
"}
(113,1,1) = {"
aa
@@ -37889,6 +38504,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+GC
+GC
+zZ
+jC
+jC
+jC
+Ly
+Ly
+Ly
+Ly
+Ly
+jC
+jC
+jC
+zZ
+GC
+GC
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -38014,36 +38654,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
am
am
am
@@ -38072,29 +38682,34 @@ am
am
am
am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
aj
-ab
-ab
-ab
-ab
"}
(114,1,1) = {"
aa
@@ -38146,6 +38761,31 @@ ak
ak
ak
ak
+ZY
+BX
+GO
+jC
+Ly
+Ly
+Ly
+Ly
+Ly
+GC
+Vq
+Ly
+Vq
+Ly
+rP
+GC
+Ly
+Ly
+Ly
+Ly
+Ly
+jC
+KB
+BX
+ZY
ak
ak
ak
@@ -38272,35 +38912,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
am
am
am
@@ -38328,28 +38939,32 @@ am
am
am
am
-am
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
aj
aj
-ab
aj
aj
"}
@@ -38403,6 +39018,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+rW
+Ly
+sW
+Ly
+Ly
+IZ
+Ly
+ft
+sW
+IZ
+Ly
+ft
+Ly
+Ly
+VU
+Ly
+rW
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -38530,34 +39170,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
am
am
am
@@ -38584,26 +39196,29 @@ am
am
am
am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -38660,6 +39275,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+rP
+Ly
+Ly
+Ly
+FL
+GC
+Ti
+Ly
+ft
+VU
+IZ
+Ly
+or
+GC
+Ci
+Ly
+Ly
+Ly
+Vq
+Ly
+BX
+ZY
ak
ak
ak
@@ -38788,33 +39428,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
am
am
am
@@ -38840,30 +39453,32 @@ am
am
am
am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
aj
aj
-ab
aj
aj
"}
@@ -38917,31 +39532,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+Ly
+Ly
+Ly
+VU
+Ly
+Ly
+Ly
+Ly
+Ly
+ft
+sW
+IZ
+Ly
+Ly
+Ly
+Ly
+Ly
+sW
+Ly
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -39089,36 +39704,36 @@ ak
ak
ak
ak
+ak
am
am
am
am
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -39174,31 +39789,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+sW
+GC
+Ly
+ft
+Ly
+SS
+ft
+sW
+Ly
+ft
+VU
+IZ
+Ly
+VU
+IZ
+SS
+Ly
+IZ
+Ly
+GC
+VU
+BX
+ZY
ak
ak
ak
@@ -39348,34 +39963,34 @@ ak
ak
ak
ak
+ak
am
am
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
+aj
+aj
+aj
+aj
aj
aj
aj
@@ -39431,31 +40046,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+Ly
+Ly
+jC
+Vq
+FL
+Ly
+Ly
+IZ
+Ly
+Ly
+sW
+Ly
+Ly
+ft
+Ly
+Ly
+Ci
+rP
+jC
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -39606,37 +40221,37 @@ ak
ak
ak
ak
+ak
am
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
ab
aj
aj
aj
aj
+aj
+aj
+aj
+aj
"}
(120,1,1) = {"
aa
@@ -39688,31 +40303,32 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+Ly
+Ly
+Ly
+MS
+Ly
+jC
+GC
+Vq
+Ly
+VU
+Ly
+sW
+Ly
+rP
+GC
+jC
+Ly
+AW
+Ly
+Ly
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -39865,31 +40481,30 @@ ak
ak
ak
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ai
-ai
-ab
-ab
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+aj
aj
ab
-ab
+aj
+aj
aj
aj
aj
@@ -39911,7 +40526,7 @@ ae
jg
gB
gB
-js
+BM
ab
ab
ab
@@ -39944,6 +40559,34 @@ ak
ak
ak
ak
+ZY
+ZY
+BX
+Ly
+Ly
+jC
+Ly
+Ly
+Ly
+ft
+Ly
+IQ
+Ly
+SS
+Ly
+td
+Ly
+IZ
+Ly
+Ly
+Ly
+jC
+Ly
+Ly
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -40094,59 +40737,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
-am
-am
-am
-am
am
-am
-am
-am
-am
-am
-am
-ai
-ai
-ab
-ab
-ab
-ab
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
+aj
aj
aj
-ab
aj
aj
aj
@@ -40169,7 +40784,7 @@ gr
gs
gr
gr
-kR
+PF
ab
ab
ab
@@ -40201,6 +40816,33 @@ ak
ak
ak
ak
+ZY
+ZY
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+IZ
+Ly
+Ly
+IZ
+Ly
+ft
+Ly
+Ly
+ft
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -40352,55 +40994,28 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
am
-ai
-ab
-ab
-ab
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
aj
aj
aj
@@ -40424,10 +41039,10 @@ aa
gR
ag
jF
-gM
+Pi
kB
jm
-ix
+hZ
ab
jS
aj
@@ -40457,35 +41072,34 @@ al
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+ZY
+ZY
+BX
+Ly
+sW
+Ly
+GC
+GC
+Ly
+Ci
+VU
+rP
+Ly
+Ly
+Ly
+Vq
+sW
+hF
+Ly
+GC
+GC
+Ly
+VU
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -40638,29 +41252,30 @@ ak
ak
ak
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
-ab
-ab
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
+aj
aj
aj
-ab
aj
aj
aj
@@ -40678,15 +41293,15 @@ aa
aa
aa
aa
-aa
+Rl
gG
-go
+ux
kg
-hs
+CS
gr
hH
-ab
-ab
+Ly
+Ly
aj
ly
aj
@@ -40698,50 +41313,50 @@ aj
ls
aj
aj
-jx
-jS
-iy
-al
-ak
-al
-jq
-ab
-kN
-ab
-ab
-jx
-ab
-ab
+sW
+wr
+xE
+Gb
+xN
+Gb
+Vq
+Ly
+XE
+Ly
+Ly
+sW
+Ly
+Ly
mN
-al
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+Gb
+QO
+ys
+ys
+BX
+GC
+GC
+jC
+Ly
+nB
+Vq
+rP
+Ly
+VU
+Ly
+SS
+Ly
+sW
+Ly
+Vq
+rP
+nr
+Ly
+jC
+GC
+GC
+BX
+ZY
+ZY
ak
ak
ak
@@ -40893,32 +41508,32 @@ ak
ak
ak
ak
-ak
-ak
-am
-am
-am
-am
-am
-am
-am
am
-am
-am
-am
-am
-am
-am
-am
-ai
-ab
+ka
+ka
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+aj
+aj
aj
aj
-ab
aj
aj
-ab
-ab
aj
aj
aj
@@ -40935,15 +41550,15 @@ nc
aa
aa
fV
-fV
+Ao
gr
jH
-gO
+DR
kD
ag
le
-aa
-aa
+Rl
+Rl
ls
aj
aj
@@ -40955,22 +41570,50 @@ aj
aj
aj
lI
-aa
-aa
-jS
-ab
-ab
-ja
-ab
-jx
-ab
-jq
-ab
-kN
-ab
-ab
-ab
+Rl
+Rl
+wr
+Ly
+Ly
+VU
+Ly
+sW
+Ly
+Vq
+Ly
+XE
+Ly
+Ly
+Ly
mO
+Ly
+rP
+rW
+FF
+FF
+FF
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Fv
+Zs
+GC
+rb
+vo
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -41122,60 +41765,32 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
-am
am
-am
-am
-am
-am
-am
-am
-am
-am
-aj
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
aj
aj
aj
aj
aj
aj
-ab
aj
aj
aj
@@ -41192,75 +41807,71 @@ ne
aa
aa
fV
-fV
+Ao
jk
gr
gr
gr
gr
gs
-aa
-lp
+ya
lp
+Eq
lz
-lp
+Eq
lF
-lp
+Eq
lP
lS
-lp
+Eq
lZ
lS
lS
-lp
-aa
-mE
-ab
-ab
-ab
-ab
-kN
-ab
-ab
-ab
-ab
-ab
-jS
-ab
-ab
-al
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+Eq
+Rl
+hF
+Ly
+Ly
+Ly
+Ly
+XE
+Ly
+Ly
+Ly
+Ly
+Ly
+wr
+Ly
+Ly
+Ly
+Ly
+rW
+FF
+FF
+FF
+Vq
+Fv
+Zs
+vo
+rP
+Ly
+Zs
+Ti
+Ly
+or
+rb
+Ly
+Vq
+Xl
+rb
+vo
+rP
+Ly
+sW
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -41412,23 +42023,27 @@ ak
ak
ak
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-aj
+ka
+WH
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
aj
aj
-ab
aj
aj
aj
@@ -41451,13 +42066,13 @@ ac
ac
af
lg
-fT
+HE
kj
-fT
-fT
+HE
+HE
lg
-gP
-lq
+Zj
+md
lu
lq
lD
@@ -41470,56 +42085,52 @@ ma
lq
mk
mn
-kR
+PF
mF
-ab
+Ly
mG
-ab
-ja
-ab
-jx
-ab
-ab
-kN
-ab
-ab
-jq
-jR
-ab
-ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+Ly
+VU
+Ly
+sW
+Ly
+Ly
+XE
+Ly
+Ly
+Vq
+wd
+rP
+Ly
+rW
+FF
+FF
+FF
+Ly
+Zs
+PF
+Ti
+Ly
+SS
+ft
+Ly
+hB
+Ly
+IZ
+SS
+Ly
+or
+PF
+rb
+Ly
+Ly
+rW
+BX
+ZY
+ZY
+ZY
+ZY
+ZY
ak
ak
ak
@@ -41669,21 +42280,25 @@ ak
ak
ak
am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-aj
-aj
+ka
+ka
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
aj
aj
aj
@@ -41706,76 +42321,71 @@ ng
aa
aa
fV
-fV
+Ao
jl
gr
ah
gG
gs
gy
-aa
+ya
lr
lv
lv
lE
lv
lE
-lR
+bc
lv
lv
mb
-lR
+bc
ml
-lR
-aa
-it
-ab
-ab
-jx
-jR
-ab
-ab
-ab
+bc
+Rl
+IZ
+Ly
+Ly
+sW
+wd
+Ly
+Ly
+Ly
mL
-al
-iY
-ab
-ab
-jQ
-ab
-jx
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+Gb
+Gu
+Ly
+Ly
+rP
+Ly
+Ly
+rW
+FF
+FF
+FF
+VU
+Xc
+Ti
+hF
+sW
+Ly
+or
+rb
+Ly
+Zs
+Ti
+Ly
+VU
+Ci
+or
+hF
+sW
+Ly
+rP
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -41791,6 +42401,7 @@ ak
ak
ak
ak
+al
ak
ak
ak
@@ -41926,23 +42537,27 @@ ak
ak
ak
ak
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-aj
-aj
-aj
-aj
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+vP
+ab
+ab
aj
aj
aj
@@ -41963,15 +42578,15 @@ id
aa
aa
fV
-fV
+Ao
jm
jL
-gM
+Pi
kH
gr
hH
-aa
-aa
+Rl
+Rl
lw
aj
aj
@@ -41983,54 +42598,50 @@ aj
aj
lw
aj
-aa
-aa
-jq
-ab
-ab
-ab
-jQ
-ab
+Rl
+Rl
+Vq
+Ly
+Ly
+Ly
+rP
+Ly
mI
-ab
-ab
-al
-al
-ab
-ab
-ab
-ab
-ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+Ly
+Ly
+Gb
+Gb
+Ly
+Ly
+Ly
+Ly
+rP
+rW
+FF
+FF
+FF
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Xc
+or
+jC
+Ti
+hF
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -42048,7 +42659,6 @@ ak
ak
ak
ak
-al
ak
ak
ak
@@ -42184,20 +42794,25 @@ ak
ak
ak
ak
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-fR
-aj
-aj
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+vP
aj
aj
aj
@@ -42220,15 +42835,15 @@ aa
aa
aa
aa
-aa
+Rl
gr
-go
+ux
kl
-hs
+CS
gG
lj
-ab
-ab
+Ly
+Ly
aj
aj
mv
@@ -42240,56 +42855,50 @@ aj
lI
aj
aj
-kN
-jq
-jS
-jx
-jS
-ab
-ab
-ab
-ab
-ab
-ab
-jR
-ak
-jS
-kN
-ab
-ab
-jR
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-al
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+XE
+Vq
+wr
+sW
+wr
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+wd
+xN
+wr
+XE
+Ly
+Ly
+ys
+ys
+BX
+jC
+jC
+GC
+Ly
+EQ
+VU
+sW
+Ly
+Vq
+Ly
+SS
+Ly
+rP
+Ly
+VU
+sW
+kT
+Ly
+GC
+jC
+jC
+BX
+ZY
+ZY
ak
ak
ak
@@ -42442,23 +43051,29 @@ ak
ak
ak
ak
-am
-am
-am
-am
-am
-am
-am
-am
-am
-am
-fS
-aj
+ka
+ka
+ka
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+vP
aj
aj
aj
aj
-ab
aj
aj
aj
@@ -42480,10 +43095,10 @@ aa
gR
ah
jN
-gO
+DR
kJ
gr
-it
+IZ
ab
ab
aj
@@ -42514,79 +43129,33 @@ al
ab
ab
mP
-al
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+ZY
+BX
+Ly
+rP
+Ly
+jC
+jC
+Ly
+Fv
+Vq
+sW
+Ly
+Ly
+Ly
+VU
+rP
+vo
+Ly
+jC
+jC
+Ly
+Vq
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -42701,61 +43270,6 @@ ak
ak
ak
ak
-am
-am
-am
-am
-am
-am
-am
-am
-fS
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-"}
-(132,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-gR
-gr
-gr
-gr
-jm
-gP
-ab
-ab
-ab
-aj
-aj
-aj
-aj
-aj
-aj
-ab
-mB
-aj
-aj
-aj
-ab
-ja
ak
ak
ak
@@ -42794,6 +43308,69 @@ ak
ak
ak
ak
+xN
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+vP
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+"}
+(132,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+gR
+gr
+gr
+gr
+jm
+rW
+ab
+ab
+ab
+aj
+aj
+aj
+aj
+aj
+aj
+ab
+mB
+aj
+aj
+aj
+ab
+ja
ak
ak
ak
@@ -42807,6 +43384,35 @@ ak
ak
ak
ak
+al
+ZY
+ZY
+ZY
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+IZ
+Ly
+Ly
+IZ
+Ly
+ft
+Ly
+Ly
+ft
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -42959,16 +43565,25 @@ ak
ak
ak
ak
-am
-am
-am
-am
-am
-am
-am
-am
-fS
-aj
+xN
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
aj
aj
aj
@@ -42995,7 +43610,7 @@ ae
gr
jm
ko
-iu
+jC
ab
ab
ab
@@ -43028,6 +43643,34 @@ ak
ak
ak
ak
+ZY
+ZY
+BX
+Ly
+Ly
+GC
+Ly
+Ly
+Ly
+ft
+Ly
+MS
+Ly
+SS
+Ly
+AW
+Ly
+IZ
+Ly
+Ly
+Ly
+GC
+Ly
+Ly
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -43179,53 +43822,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
-am
-am
-fS
-aj
+xN
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
aj
aj
aj
@@ -43286,6 +43901,32 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+Ly
+IQ
+Ly
+GC
+jC
+VU
+Ly
+Vq
+Ly
+rP
+Ly
+sW
+jC
+GC
+Ly
+td
+Ly
+Ly
+Ly
+BX
+ZY
+ZY
ak
ak
ak
@@ -43438,54 +44079,28 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-am
-am
-am
-am
-am
-fS
-aj
+ka
+ka
+ka
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
ab
aj
-ab
+aj
aj
aj
aj
@@ -43543,6 +44158,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+GC
+VU
+yW
+Ly
+Ly
+IZ
+Ly
+Ly
+rP
+Ly
+Ly
+ft
+Ly
+Ly
+Xl
+sW
+GC
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -43696,50 +44336,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-fQ
-aj
-aj
+ka
+ka
+WH
+Ly
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+vP
aj
aj
aj
@@ -43800,6 +44415,31 @@ ak
ak
ak
ak
+ZY
+BX
+rP
+jC
+Ly
+ft
+Ly
+SS
+ft
+rP
+Ly
+ft
+VU
+IZ
+Ly
+Vq
+IZ
+SS
+Ly
+IZ
+Ly
+jC
+Vq
+BX
+ZY
ak
ak
ak
@@ -43953,50 +44593,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-fQ
-aj
-aj
+ka
+ka
+WH
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+vP
aj
aj
aj
@@ -44057,6 +44672,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+Ly
+Vq
+Ly
+Ly
+Ly
+Ly
+Ly
+ft
+sW
+IZ
+Ly
+Ly
+Ly
+Ly
+Ly
+rP
+Ly
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -44210,50 +44850,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-fQ
-aj
-aj
+ka
+ka
+ka
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+vP
+vP
aj
aj
aj
@@ -44314,6 +44929,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+sW
+Ly
+Ly
+Ly
+vo
+jC
+rb
+Ly
+ft
+VU
+IZ
+Ly
+Zs
+jC
+Xl
+Ly
+Ly
+Ly
+VU
+Ly
+BX
+ZY
ak
ak
ak
@@ -44467,50 +45107,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+ka
+ka
+ka
+ka
+WH
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+vP
+vP
aj
aj
aj
@@ -44571,6 +45186,31 @@ ak
ak
ak
ak
+ZY
+BX
+rb
+Ly
+rW
+Ly
+rP
+Ly
+Ly
+IZ
+Ly
+ft
+sW
+IZ
+Ly
+ft
+Ly
+Ly
+Vq
+Ly
+rW
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -44724,50 +45364,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+xN
+ka
+ka
+ka
+WH
+Ly
+WH
+Ly
+WH
+Ly
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+vP
+vP
aj
aj
aj
@@ -44828,6 +45443,31 @@ ak
ak
ak
ak
+ZY
+BX
+uR
+GC
+Ly
+Ly
+Ly
+Ly
+Ly
+jC
+VU
+Ly
+VU
+Ly
+sW
+jC
+Ly
+Ly
+Ly
+Ly
+Ly
+GC
+Vm
+BX
+ZY
ak
ak
ak
@@ -44981,50 +45621,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+xN
+ka
+ka
+ka
+ka
+WH
+WH
+Ly
+WH
+WH
+Ly
+Ly
+Ly
+Ly
+WH
+WH
+vP
+vP
aj
aj
aj
@@ -45085,6 +45700,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+jC
+jC
+HE
+GC
+GC
+GC
+Ly
+Ly
+Ly
+Ly
+Ly
+GC
+GC
+GC
+HE
+jC
+jC
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -45238,50 +45878,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+xN
+xN
+xN
+ka
+ka
+ka
+ka
+WH
+ka
+WH
+Ly
+WH
+Ly
+Ly
+Ly
+WH
+vP
+vP
aj
aj
aj
@@ -45342,6 +45957,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+or
+jC
+jC
+jC
+jC
+jC
+jC
+jC
+Ti
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -45495,50 +46135,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+xN
+xN
+xN
+xN
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+ka
+WH
+WH
+Ly
+Ly
+vP
+vP
aj
aj
aj
@@ -45599,6 +46214,31 @@ ak
ak
ak
ak
+ZY
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+IZ
+Ly
+ft
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+ZY
ak
ak
ak
@@ -45752,50 +46392,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+WH
+WH
+vP
+vP
aj
aj
aj
@@ -45856,6 +46471,31 @@ ak
ak
ak
ak
+ZY
+BX
+BX
+Ly
+Ly
+qk
+jC
+VU
+Ly
+Ly
+Fv
+Ly
+Ly
+Ly
+vo
+Ly
+Ly
+sW
+jC
+wA
+Ly
+Ly
+BX
+BX
+ZY
ak
ak
ak
@@ -46009,50 +46649,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+ka
+ka
+ka
+ka
+ka
+ka
+ka
+vP
+vP
aj
aj
aj
@@ -46113,6 +46728,31 @@ ak
ak
ak
ak
+ZY
+BX
+BX
+vP
+BX
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+BX
+vP
+BX
+BX
+ZY
ak
ak
ak
@@ -46266,50 +46906,25 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-aj
-aj
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+xN
+ka
+ka
+ka
+vP
+vP
aj
aj
aj
@@ -46370,31 +46985,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+vP
+vP
+BX
+vP
+Ly
+Ly
+kT
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+Ly
+nr
+Ly
+Ly
+vP
+BX
+vP
+vP
+BX
+ZY
ak
ak
ak
@@ -46627,31 +47242,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+BX
+BX
+ta
+DR
+Vq
+kT
+Ly
+Ly
+VU
+Ly
+Ly
+Ly
+sW
+Ly
+Ly
+nr
+rP
+DR
+Sd
+BX
+BX
+BX
+ZY
ak
ak
ak
@@ -46883,33 +47498,33 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+ZY
+ZY
+BX
+vP
+il
+vP
+BL
+sW
+Ly
+Ly
+ft
+Ly
+Ly
+Ly
+IZ
+Ly
+Ly
+VU
+NA
+vP
+zW
+vP
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -47142,29 +47757,29 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+BX
+vP
+BL
+vP
+ux
+vP
+Ly
+PF
+Ly
+Ly
+Ly
+qk
+Ly
+vP
+CS
+vP
+UU
+vP
+BX
+BX
+ZY
ak
ak
ak
@@ -47398,31 +48013,31 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+ZY
+ZY
+BX
+BX
+vP
+RJ
+jD
+BX
+BX
+vP
+vP
+vP
+vP
+vP
+BX
+BX
+sg
+hm
+vP
+BX
+BX
+ZY
+ZY
+ZY
ak
ak
ak
@@ -47657,27 +48272,27 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+BX
+BX
+BX
+vP
+BX
+vP
+vP
+vP
+vP
+vP
+vP
+vP
+vP
+vP
+BX
+vP
+BX
+BX
+BX
+ZY
ak
ak
ak
@@ -47914,28 +48529,28 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
+ZY
+ZY
+BX
+BX
+BX
+vP
+BX
+BX
+vP
+vP
+vP
+BX
+BX
+vP
+BX
+BX
+BX
+ZY
+ZY
+ZY
+ZY
ak
ak
ak
@@ -48171,8 +48786,27 @@ ak
ak
ak
ak
+ZY
ak
+ZY
+ZY
+ZY
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+BX
+ZY
+ZY
+ZY
ak
+ZY
ak
ak
ak
@@ -48182,26 +48816,7 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+al
ak
ak
ak
@@ -48430,23 +49045,23 @@ ak
ak
ak
ak
+ZY
ak
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ZY
ak
ak
ak
@@ -48689,6 +49304,7 @@ ak
ak
ak
ak
+ZY
ak
ak
ak
@@ -48700,8 +49316,7 @@ ak
ak
ak
ak
-ak
-ak
+ZY
ak
ak
ak
@@ -49232,7 +49847,7 @@ ak
ak
ak
ak
-al
+ak
ak
ak
ak
@@ -51966,7 +52581,7 @@ aj
aj
ab
aj
-ab
+aj
aj
aj
aj
diff --git a/code/__DEFINES/color_defines.dm b/code/__DEFINES/color_defines.dm
index 28d9d3ff75d8..2f8c847c66ee 100644
--- a/code/__DEFINES/color_defines.dm
+++ b/code/__DEFINES/color_defines.dm
@@ -86,6 +86,8 @@
#define COLOR_DIAMOND "#d8d4ea"
#define COLOR_ANCIENT_ROCK "#575757"
#define COLOR_COLD_ANCIENT_ROCK "#575764"
+#define COLOR_HARD_ROCK "#363636"
+#define COLOR_FLOOR_HARD_ROCK "#bdbdbd"
#define COLOR_HEALING_GREEN "#375637"
//Color defines used by the assembly detailer.
diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index 4337fa0f2070..532d3a10336e 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -253,6 +253,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///An item that is oiled. If sprayed with water, it's slowdown reverts to normal.
#define TRAIT_OIL_SLICKED "oil_slicked"
+///An item that can be pointed at mobs, while on non-help intent.
+#define TRAIT_CAN_POINT_WITH "can_point_with"
+
//
// common trait sources
#define TRAIT_GENERIC "generic"
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 43afefb691ac..e8f2ba579252 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -46,98 +46,99 @@
else if(dx < 0)
. += 360
-//Returns location. Returns null if no location was found.
-/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = TRUE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0)
-/*
-Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no).
-Random error in tile placement x, error in tile placement y, and block offset.
-Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc.
-Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive.
-Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something.
-*/
-
- var/dirx = 0//Generic location finding variable.
+// Returns location. Returns null if no location was found.
+/proc/get_teleport_loc(turf/location, mob/target, distance = 1, density = TRUE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0)
+ /*
+ Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no).
+ Random error in tile placement x, error in tile placement y, and block offset.
+ Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc.
+ Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive.
+ Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something.
+ */
+
+ var/dirx = 0 // Generic location finding variable.
var/diry = 0
- var/xoffset = 0//Generic counter for offset location.
+ var/xoffset = 0 // Generic counter for offset location.
var/yoffset = 0
- var/b1xerror = 0//Generic placing for point A in box. The lower left.
+ var/b1xerror = 0 // Generic placing for point A in box. The lower left.
var/b1yerror = 0
- var/b2xerror = 0//Generic placing for point B in box. The upper right.
+ var/b2xerror = 0 // Generic placing for point B in box. The upper right.
var/b2yerror = 0
- errorx = abs(errorx)//Error should never be negative.
+ errorx = abs(errorx) // Error should never be negative.
errory = abs(errory)
- //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes.
-
- switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot.
- //Directs on what values need modifying.
- if(1)//North
- diry+=distance
- yoffset+=eoffsety
- xoffset+=eoffsetx
- b1xerror-=errorx
- b1yerror-=errory
- b2xerror+=errorx
- b2yerror+=errory
- if(2)//South
- diry-=distance
- yoffset-=eoffsety
- xoffset+=eoffsetx
- b1xerror-=errorx
- b1yerror-=errory
- b2xerror+=errorx
- b2yerror+=errory
- if(4)//East
- dirx+=distance
- yoffset+=eoffsetx//Flipped.
- xoffset+=eoffsety
- b1xerror-=errory//Flipped.
- b1yerror-=errorx
- b2xerror+=errory
- b2yerror+=errorx
- if(8)//West
- dirx-=distance
- yoffset-=eoffsetx//Flipped.
- xoffset+=eoffsety
- b1xerror-=errory//Flipped.
- b1yerror-=errorx
- b2xerror+=errory
- b2yerror+=errorx
-
- var/turf/destination=locate(location.x+dirx,location.y+diry,location.z)
-
- if(destination)//If there is a destination.
- if(errorx||errory)//If errorx or y were specified.
- var/destination_list[] = list()//To add turfs to list.
- //destination_list = new()
- /*This will draw a block around the target turf, given what the error is.
- Specifying the values above will basically draw a different sort of block.
- If the values are the same, it will be a square. If they are different, it will be a rectengle.
- In either case, it will center based on offset. Offset is position from center.
- Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport,
- the offset should remain positioned in relation to destination.*/
-
- var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center.
-
- //Now to find a box from center location and make that our destination.
- for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z)))
- if(density&&T.density) continue//If density was specified.
- if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map.
- if(T.y>world.maxy || T.y<1) continue
- destination_list += T
- if(destination_list.len)
- destination = pick(destination_list)
- else return
-
- else//Same deal here.
- if(density&&destination.density) return
- if(destination.x>world.maxx || destination.x<1) return
- if(destination.y>world.maxy || destination.y<1) return
- else return
-
- return destination
+
+ switch(target.dir) // This can be done through equations but switch is the simpler method. And works fast to boot.
+ // Directs on what values need modifying.
+ if(NORTH)
+ diry += distance
+ yoffset += eoffsety
+ xoffset += eoffsetx
+ b1xerror -= errorx
+ b1yerror -= errory
+ b2xerror += errorx
+ b2yerror += errory
+ if(SOUTH)
+ diry -= distance
+ yoffset -= eoffsety
+ xoffset += eoffsetx
+ b1xerror -= errorx
+ b1yerror -= errory
+ b2xerror += errorx
+ b2yerror += errory
+ if(EAST)
+ dirx += distance
+ yoffset += eoffsetx // Flipped.
+ xoffset += eoffsety
+ b1xerror -= errory // Flipped.
+ b1yerror -= errorx
+ b2xerror += errory
+ b2yerror += errorx
+ if(WEST)
+ dirx -= distance
+ yoffset -= eoffsetx // Flipped.
+ xoffset += eoffsety
+ b1xerror -= errory // Flipped.
+ b1yerror -= errorx
+ b2xerror += errory
+ b2yerror += errorx
+
+ var/turf/destination = locate(location.x + dirx, location.y + diry, location.z)
+
+ if(!destination)
+ return
+
+ if(!errorx && !errory)
+ if(density && destination.density)
+ return
+ if(destination.x > world.maxx || destination.x < 1 || destination.y > world.maxy || destination.y < 1)
+ return
+ return destination
+
+ var/list/destination_list = list()
+
+ /*
+ This will draw a block around the target turf, given what the error is.
+ Specifying `errorx` and `errory` will basically draw a different sort of block.
+ If the values are the same, it will be a square. If they are different, it will be a rectengle.
+ In either case, it will center based on offset. Offset is position from center.
+ Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport,
+ the offset should remain positioned in relation to destination.
+ */
+ var/turf/center = locate((destination.x + xoffset), (destination.y + yoffset), location.z) // So now, find the new center.
+
+ // Now to find a box from center location and make that our destination.
+ for(var/turf/T in block(locate(center.x + b1xerror, center.y + b1yerror, location.z), locate(center.x + b2xerror, center.y + b2yerror, location.z)))
+ if(density && T.density)
+ continue
+ if(T.x > world.maxx || T.x < 1 || T.y > world.maxy || T.y < 1)
+ continue // Don't want them to teleport off the map.
+ destination_list += T
+ if(!length(destination_list))
+ return
+ return pick(destination_list)
/proc/is_in_teleport_proof_area(atom/O)
@@ -301,7 +302,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave.
/proc/freeborg()
- var/select = null
+ var/select
var/list/borgs = list()
for(var/mob/living/silicon/robot/A in GLOB.player_list)
if(A.stat == 2 || A.connected_ai || A.scrambledcodes || isdrone(A))
@@ -309,7 +310,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/name = "[A.real_name] ([A.modtype] [A.braintype])"
borgs[name] = A
- if(borgs.len)
+ if(length(borgs))
select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs
return borgs[select]
@@ -337,7 +338,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/select_active_ai(mob/user)
var/list/ais = active_ais()
- if(ais.len)
+ if(length(ais))
if(user) . = input(usr,"AI signals detected:", "AI selection") in ais
else . = pick(ais)
return .
@@ -599,7 +600,7 @@ Returns 1 if the chain up to the area contains the given typepath
for(var/atom/part in contents)
toReturn += part
- if(part.contents.len && searchDepth)
+ if(length(part.contents) && searchDepth)
toReturn += part.GetAllContents(searchDepth - 1)
return toReturn
@@ -660,7 +661,7 @@ Returns 1 if the chain up to the area contains the given typepath
var/dir_alt2 = turn(base_dir, -90)
var/turf/turf_last1 = temp
var/turf/turf_last2 = temp
- var/free_tile = null
+ var/free_tile
var/breakpoint = 0
while(!free_tile && breakpoint < 10)
@@ -705,7 +706,7 @@ Returns 1 if the chain up to the area contains the given typepath
var/area/areatemp = areatype
areatype = areatemp.type
- var/list/areas = new/list()
+ var/list/areas = list()
for(var/area/N in world)
if(istype(N, areatype)) areas += N
return areas
@@ -719,7 +720,7 @@ Returns 1 if the chain up to the area contains the given typepath
var/area/areatemp = areatype
areatype = areatemp.type
- var/list/turfs = new/list()
+ var/list/turfs = list()
for(var/area/N in world)
if(istype(N, areatype))
for(var/turf/T in N) turfs += T
@@ -734,7 +735,7 @@ Returns 1 if the chain up to the area contains the given typepath
var/area/areatemp = areatype
areatype = areatemp.type
- var/list/atoms = new/list()
+ var/list/atoms = list()
for(var/area/N in world)
if(istype(N, areatype))
for(var/atom/A in N)
@@ -742,11 +743,11 @@ Returns 1 if the chain up to the area contains the given typepath
return atoms
/datum/coords //Simple datum for storing coordinates.
- var/x_pos = null
- var/y_pos = null
- var/z_pos = null
+ var/x_pos
+ var/y_pos
+ var/z_pos
-/area/proc/move_contents_to(area/A, turftoleave=null, direction = null)
+/area/proc/move_contents_to(area/A, turf_to_leave, direction)
//Takes: Area. Optional: turf type to leave behind.
//Returns: Nothing.
//Notes: Attempts to move the contents of one area to another area.
@@ -770,7 +771,7 @@ Returns 1 if the chain up to the area contains the given typepath
if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x
if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y
- var/list/refined_src = new/list()
+ var/list/refined_src = list()
for(var/turf/T in turfs_src)
refined_src += T
refined_src[T] = new/datum/coords
@@ -778,7 +779,7 @@ Returns 1 if the chain up to the area contains the given typepath
C.x_pos = (T.x - src_min_x)
C.y_pos = (T.y - src_min_y)
- var/list/refined_trg = new/list()
+ var/list/refined_trg = list()
for(var/turf/T in turfs_trg)
refined_trg += T
refined_trg[T] = new/datum/coords
@@ -786,8 +787,8 @@ Returns 1 if the chain up to the area contains the given typepath
C.x_pos = (T.x - trg_min_x)
C.y_pos = (T.y - trg_min_y)
- var/list/fromupdate = new/list()
- var/list/toupdate = new/list()
+ var/list/from_update = list()
+ var/list/to_update = list()
moving:
for(var/turf/T in refined_src)
@@ -803,19 +804,17 @@ Returns 1 if the chain up to the area contains the given typepath
var/turf/X = B.ChangeTurf(T.type)
X.dir = old_dir1
X.icon_state = old_icon_state1
- X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
+ X.icon = old_icon1 // Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
// Give the new turf our air, if simulated
if(issimulatedturf(X) && issimulatedturf(T))
var/turf/simulated/sim = X
sim.copy_air_with_tile(T)
-
- /* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */
+ // Quick visual fix for some weird shuttle corner artefacts when on transit space tiles
if(direction && findtext(X.icon_state, "swall_s"))
-
// Spawn a new shuttle corner object
- var/obj/corner = new()
+ var/obj/corner = new
corner.loc = X
corner.density = TRUE
corner.anchored = TRUE
@@ -834,35 +833,31 @@ Returns 1 if the chain up to the area contains the given typepath
X.icon = nextturf.icon
X.icon_state = nextturf.icon_state
-
for(var/obj/O in T)
-
// Reset the shuttle corners
if(O.tag == "delete me")
X.icon = 'icons/turf/shuttle.dmi'
- X.icon_state = replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state
+ X.icon_state = replacetext(O.icon_state, "_f", "_s") // Revert the turf to the old icon_state
X.name = "wall"
- qdel(O) // prevents multiple shuttle corners from stacking
+ qdel(O) // Prevents multiple shuttle corners from stacking
continue
- if(!isobj(O)) continue
+
+ if(QDELETED(O))
+ continue
+
O.loc.Exited(O)
- O.setLoc(X,teleported=1)
+ O.setLoc(X)
O.loc.Entered(O)
+
for(var/mob/M in T)
if(!M.move_on_shuttle)
continue
M.loc = X
-// var/area/AR = X.loc
+ to_update += X
-// if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn
-// X.opacity = !X.opacity
-// X.set_opacity(!X.opacity)
-
- toupdate += X
-
- if(turftoleave)
- fromupdate += T.ChangeTurf(turftoleave)
+ if(turf_to_leave)
+ from_update += T.ChangeTurf(turf_to_leave)
else
T.ChangeTurf(T.baseturf)
@@ -870,51 +865,49 @@ Returns 1 if the chain up to the area contains the given typepath
refined_trg -= B
continue moving
- if(toupdate.len)
- for(var/turf/simulated/T1 in toupdate)
+ if(length(to_update))
+ for(var/turf/simulated/T1 in to_update)
SSair.remove_from_active(T1)
T1.CalculateAdjacentTurfs()
- SSair.add_to_active(T1,1)
+ SSair.add_to_active(T1, TRUE)
- if(fromupdate.len)
- for(var/turf/simulated/T2 in fromupdate)
+ if(length(from_update))
+ for(var/turf/simulated/T2 in from_update)
SSair.remove_from_active(T2)
T2.CalculateAdjacentTurfs()
- SSair.add_to_active(T2,1)
+ SSair.add_to_active(T2, TRUE)
-
-
-/proc/DuplicateObject(obj/original, perfectcopy = 0 , sameloc = 0, atom/newloc = null)
+/proc/DuplicateObject(obj/original, perfectcopy = 0, sameloc = 0, atom/newloc)
if(!original)
- return null
+ return
- var/obj/O = null
+ var/obj/O
if(sameloc)
- O=new original.type(original.loc)
+ O = new original.type(original.loc)
else
- O=new original.type(newloc)
+ O = new original.type(newloc)
if(perfectcopy)
- if((O) && (original))
- var/static/list/forbidden_vars = list("type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group", "comp_lookup", "datum_components")
+ if(O && original)
+ var/static/list/forbidden_vars = list("type", "loc", "locs", "vars", "parent", "parent_type", "verbs", "ckey", "key", "power_supply", "contents", "reagents", "stat", "x", "y", "z", "group", "comp_lookup", "datum_components")
for(var/V in original.vars - forbidden_vars)
- if(istype(original.vars[V],/list))
+ if(islist(original.vars[V]))
var/list/L = original.vars[V]
O.vars[V] = L.Copy()
- else if(istype(original.vars[V],/datum))
- continue // this would reference the original's object, that will break when it is used or deleted.
+ else if(istype(original.vars[V], /datum))
+ continue // This would reference the original's object, that will break when it is used or deleted.
else
O.vars[V] = original.vars[V]
if(istype(O))
O.update_icon()
return O
-/area/proc/copy_contents_to(area/A , platingRequired = 0, perfect_copy = TRUE)
+/area/proc/copy_contents_to(area/A, platingRequired = FALSE, perfect_copy = TRUE)
//Takes: Area. Optional: If it should copy to areas that don't have plating
- //Returns: Nothing.
+ //Returns: List containing copied objects or `FALSE` if source/target area are null.
//Notes: Attempts to move the contents of one area to another area.
// Movement based on lower left corner. Tiles that do not fit
// into the new area will not be moved.
@@ -941,7 +934,7 @@ Returns 1 if the chain up to the area contains the given typepath
if(T.y < trg_min_y || !trg_min_y)
trg_min_y = T.y
- var/list/refined_src = new/list()
+ var/list/refined_src = list()
for(var/turf/T in turfs_src)
refined_src += T
refined_src[T] = new/datum/coords
@@ -949,7 +942,7 @@ Returns 1 if the chain up to the area contains the given typepath
C.x_pos = (T.x - src_min_x)
C.y_pos = (T.y - src_min_y)
- var/list/refined_trg = new/list()
+ var/list/refined_trg = list()
for(var/turf/T in turfs_trg)
refined_trg += T
refined_trg[T] = new/datum/coords
@@ -957,87 +950,59 @@ Returns 1 if the chain up to the area contains the given typepath
C.x_pos = (T.x - trg_min_x)
C.y_pos = (T.y - trg_min_y)
- var/list/toupdate = new/list()
-
- var/copiedobjs = list()
-
+ var/list/to_update = list()
+ var/list/copied_objects = list()
moving:
for(var/turf/T in refined_src)
var/datum/coords/C_src = refined_src[T]
+
for(var/turf/B in refined_trg)
var/datum/coords/C_trg = refined_trg[B]
+
if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos)
+ if(platingRequired && isspaceturf(B))
+ continue moving
var/old_dir1 = T.dir
var/old_icon_state1 = T.icon_state
var/old_icon1 = T.icon
- if(platingRequired)
- if(isspaceturf(B))
- continue moving
var/turf/X = new T.type(B)
X.dir = old_dir1
X.icon_state = old_icon_state1
- X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
+ X.icon = old_icon1 // Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
- var/list/objs = new/list()
- var/list/newobjs = new/list()
- var/list/mobs = new/list()
- var/list/newmobs = new/list()
+ var/list/newobjs = list()
+ var/list/newmobs = list()
for(var/obj/O in T)
-
- if(!isobj(O))
- continue
-
- objs += O
-
-
- for(var/obj/O in objs)
- newobjs += DuplicateObject(O , perfect_copy)
-
-
- for(var/obj/O in newobjs)
- O.loc = X
+ newobjs += DuplicateObject(O, perfect_copy, FALSE, X)
for(var/mob/M in T)
-
if(!M.move_on_shuttle)
continue
- mobs += M
-
- for(var/mob/M in mobs)
- newmobs += DuplicateObject(M , 1)
-
- for(var/mob/M in newmobs)
- M.loc = X
-
- copiedobjs += newobjs
- copiedobjs += newmobs
-
+ newmobs += DuplicateObject(M, TRUE, FALSE, X)
+ copied_objects += newobjs
+ copied_objects += newmobs
for(var/V in T.vars)
- if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","destination_z", "destination_x", "destination_y","contents", "luminosity", "group")))
+ if(!(V in list("type", "loc", "locs", "vars", "parent", "parent_type", "verbs", "ckey", "key", "x", "y", "z", "destination_z", "destination_x", "destination_y", "contents", "luminosity", "group")))
X.vars[V] = T.vars[V]
- toupdate += X
+ to_update += X
refined_src -= T
refined_trg -= B
continue moving
-
-
- if(toupdate.len)
- for(var/turf/simulated/T1 in toupdate)
+ if(length(to_update))
+ for(var/turf/simulated/T1 in to_update)
T1.CalculateAdjacentTurfs()
SSair.add_to_active(T1,1)
-
- return copiedobjs
-
+ return copied_objects
/proc/get_cardinal_dir(atom/A, atom/B)
@@ -1251,7 +1216,7 @@ Standard way to write links -Sayu
*/
/proc/topic_link(datum/D, arglist, content)
- if(istype(arglist,/list))
+ if(islist(arglist))
arglist = list2params(arglist)
return "[content]"
@@ -1336,9 +1301,9 @@ Standard way to write links -Sayu
var/list/processing_list = list(src)
var/list/processed = list()
- var/atom/found = null
+ var/atom/found
- while(processing_list.len && found==null)
+ while(length(processing_list) && isnull(found))
var/atom/A = processing_list[1]
if(istype(A, typepath))
found = A
@@ -1644,11 +1609,11 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
if(!isnull(value) && value != "")
matches = filter_fancy_list(matches, value)
- if(matches.len == 0)
+ if(!length(matches))
return
var/chosen
- if(matches.len == 1)
+ if(length(matches) == 1)
chosen = matches[1]
else
chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches
@@ -1778,7 +1743,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/filter_fancy_list(list/L, filter as text)
- var/list/matches = new
+ var/list/matches = list()
for(var/key in L)
var/value = L[key]
if(findtext("[key]", filter) || findtext("[value]", filter))
@@ -1882,7 +1847,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
return living_players
/proc/make_bit_triplet()
- var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9)
+ var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9)
var/result = 0
for(var/i = 0, i < 3, i++)
var/num = pick(num_sample)
@@ -2074,7 +2039,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
* * url - URL to GET
*/
/proc/HTTPGet(url)
- var/datum/http_request/req = new()
+ var/datum/http_request/req = new
req.prepare(RUSTG_HTTP_METHOD_GET, url)
req.begin_async()
diff --git a/code/datums/components/proximity_monitor.dm b/code/datums/components/proximity_monitor.dm
index a24313d35752..e4a3112f8606 100644
--- a/code/datums/components/proximity_monitor.dm
+++ b/code/datums/components/proximity_monitor.dm
@@ -248,172 +248,6 @@
var/obj/checker = proximity_checkers[index++]
checker.loc = T
-
-/**
- * # Advanced Proximity Monitor
- *
- * This component functions similar to the basic version, however it has some extra features:
- *
- * First of all, if the field radius is more than 1 tile, you have the option to make a distinction between inner proximity checkers, versus ones along the edge.
- * You can specifiy which type of [/obj/effect/abstract/proximity_checker] objects you want to use for both inner, and edge checkers.
- *
- * Secondly, the advanced proximity monitor has the ability to use processing (the `process` proc). This is optional however.
- * Each proximity checker object can process itself or other things on it's turf as needed. It's up to you on how you want to use it.
- * Inner and edge checkers can process thing seperately. You can turn off processing for field checkers and have only edge checkers process, and vice versa.
- */
-/datum/component/proximity_monitor/advanced
- name = "Advanced energy field"
- field_checker_type = /obj/effect/abstract/proximity_checker/advanced/inner_field
- /// The type of checker object that should be used for the field edges.
- var/edge_checker_type = /obj/effect/abstract/proximity_checker/advanced/edge_field
- /// Make a distinction between edge checkers and field checkers seperately.
- var/uses_edge_checkers = FALSE
- /// Do any of the proximity_checker objects need to process things sitting on their tile?
- var/requires_processing = FALSE
- /// Should the main field checkers process things on their tile?
- var/process_field_checkers = FALSE
- /// Should the edge field checkers process things on their tile?
- var/process_edge_checkers = FALSE
- /// A list of proximity_checkers in the inner field. Excludes checkers on the edge of the field.
- var/list/field_checkers
- /// A list of proximity_checkers on the edge of the field.
- var/list/edge_checkers
-
-/datum/component/proximity_monitor/advanced/Initialize(_radius = 1, _always_active = FALSE)
- . = ..()
- if(requires_processing)
- START_PROCESSING(SSfields, src)
-
-/datum/component/proximity_monitor/advanced/Destroy(force, silent)
- STOP_PROCESSING(SSfields, src)
- QDEL_LIST_CONTENTS(field_checkers)
- QDEL_LIST_CONTENTS(edge_checkers)
- return ..()
-
-/datum/component/proximity_monitor/advanced/create_prox_checkers()
- if(!uses_edge_checkers)
- ..() // We don't need to make a distinction between field and edge checkers, use the parent.
- if(process_field_checkers)
- field_checkers = proximity_checkers.Copy() // Still allows for field checkers to use processing.
- return
-
- LAZYINITLIST(proximity_checkers)
- LAZYINITLIST(field_checkers)
- LAZYINITLIST(edge_checkers)
-
- var/turf/parent_turf = get_turf(parent)
- for(var/T in RANGE_TURFS(radius, parent_turf))
- if(get_dist(T, parent_turf) == radius)
- edge_checkers += create_single_prox_checker(T, edge_checker_type)
- continue
- field_checkers += create_single_prox_checker(T)
-
-/datum/component/proximity_monitor/advanced/recenter_prox_checkers()
- if(!uses_edge_checkers)
- return ..() // We don't need to make a distinction between field and edge checkers, use the parent.
-
- var/turf/parent_turf = get_turf(parent)
- var/inner_index = 1
- var/edge_index = 1
-
- for(var/T in RANGE_TURFS(radius, parent_turf))
- var/obj/checker
- if(get_dist(T, parent_turf) == radius) // If it's at this distance, it's on the edge of the field.
- checker = edge_checkers[edge_index++]
- checker.loc = T
- continue
- checker = field_checkers[inner_index++]
- checker.loc = T
-
-/datum/component/proximity_monitor/advanced/process()
- if(process_field_checkers)
- for(var/checker in field_checkers)
- process_inner_checker(checker)
- if(process_edge_checkers)
- for(var/checker in field_checkers)
- process_edge_checker(checker)
-
-/**
- * Base proc. All processing-related actions associated with inner proximity checkers should go here.
- *
- * Arguments:
- * * obj/effect/abstract/proximity_checker/advanced/inner_field/F - the proximity checker to process
- */
-/datum/component/proximity_monitor/advanced/proc/process_inner_checker(obj/effect/abstract/proximity_checker/advanced/inner_field/F)
- return
-
-/**
- * Base proc. All processing-related actions associated with edge proximity checkers should go here.
- *
- * Arguments:
- * * obj/effect/abstract/proximity_checker/advanced/edge_field/F - the proximity checker to process
- */
-/datum/component/proximity_monitor/advanced/proc/process_edge_checker(obj/effect/abstract/proximity_checker/advanced/edge_field/F)
- return
-
-/**
- * Base proc. Checks if `AM` can pass the inner field checker.
- *
- * Arguments:
- * * atom/movable/AM - the atom trying to pass the inner field checker object
- * * obj/effect/abstract/proximity_checker/advanced/inner_field/F - the proximity checker object `AM` is trying to pass
- * * turf/entering - the turf `AM` is entering from
- */
-/datum/component/proximity_monitor/advanced/proc/inner_field_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/inner_field/F, turf/entering)
- return TRUE
-
-/**
- * Base proc. Called when something crosses an inner field checker.
- *
- * Arguments:
- * * atom/movable/AM - the atom crossing the inner field checker object
- * * obj/effect/abstract/proximity_checker/advanced/inner_field/F - the proximity checker object `AM` getting crossed
- */
-/datum/component/proximity_monitor/advanced/proc/inner_field_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/inner_field/F)
- return TRUE
-
-/**
- * Base proc. Called when something uncrosses an inner field checker.
- *
- * Arguments:
- * * atom/movable/AM - the atom uncrossing the inner field checker object
- * * obj/effect/abstract/proximity_checker/advanced/inner_field/F - the proximity checker object `AM` getting uncrossed
- */
-/datum/component/proximity_monitor/advanced/proc/inner_field_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/inner_field/F)
- return TRUE
-
-/**
- * Base proc. Checks if `AM` can pass the edge field checker.
- *
- * Arguments:
- * * atom/movable/AM - the atom trying to pass the edge field checker object
- * * obj/effect/abstract/proximity_checker/advanced/edge_field/F - the proximity checker object `AM` is trying to pass
- * * turf/entering - the turf `AM` is entering from
- */
-/datum/component/proximity_monitor/advanced/proc/edge_field_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/edge_field/F, turf/entering)
- return TRUE
-
-/**
- * Base proc. Called when something crosses an edge field checker.
- *
- * Arguments:
- * * atom/movable/AM - the atom crossing the edge field checker object
- * * obj/effect/abstract/proximity_checker/advanced/edge_field/F - the proximity checker object `AM` getting crossed
- */
-/datum/component/proximity_monitor/advanced/proc/edge_field_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/edge_field/F)
- return TRUE
-
-/**
- * Base proc. Called when something uncrosses an edge field checker.
- *
- * Arguments:
- * * atom/movable/AM - the atom uncrossing the edge field checker object
- * * obj/effect/abstract/proximity_checker/advanced/edge_field/F - the proximity checker object `AM` getting uncrossed
- */
-/datum/component/proximity_monitor/advanced/proc/edge_field_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/edge_field/F)
- return TRUE
-
-
/**
* # Basic Proximity Checker
*
@@ -452,70 +286,3 @@
. = ..()
if(active && AM != monitor.hasprox_receiver && !(AM in monitor.nested_receiver_locs))
monitor.hasprox_receiver.HasProximity(AM)
-
-/**
- * # Advanced Proximity Checker
- *
- * Like basic proximity checkers, these objects can also detect proximity.
- * However these are meant for when you need to have some additional (more advanced) behavior on top of what basic proximity checkers can do.
- */
-/obj/effect/abstract/proximity_checker/advanced
- name = "advanced proximity checker"
- /// `hasprox_receivers`s advanced proximity monitor component.
- var/datum/component/proximity_monitor/advanced/advanced_monitor
-
-/obj/effect/abstract/proximity_checker/advanced/Initialize(mapload, datum/component/proximity_monitor/advanced/P, _always_active)
- advanced_monitor = P
- return ..()
-
-/obj/effect/abstract/proximity_checker/advanced/Destroy()
- advanced_monitor = null
- return ..()
-
-/**
- * # Inner Field Proximity Checker
- *
- * An advanced proximity checker object which sits on the the inner tiles of a field.
- */
-/obj/effect/abstract/proximity_checker/advanced/inner_field
- name = "inner field"
-
-/obj/effect/abstract/proximity_checker/advanced/inner_field/Destroy()
- advanced_monitor.field_checkers -= src
- return ..()
-
-/obj/effect/abstract/proximity_checker/advanced/inner_field/Crossed(atom/movable/AM, oldloc)
- . = ..()
- return advanced_monitor.inner_field_crossed(AM, src)
-
-/obj/effect/abstract/proximity_checker/advanced/inner_field/Uncrossed(atom/movable/AM, oldloc)
- . = ..()
- return advanced_monitor.inner_field_uncrossed(AM, src)
-
-/obj/effect/abstract/proximity_checker/advanced/inner_field/CanPass(atom/movable/mover, turf/target, height)
- . = ..()
- return advanced_monitor.inner_field_canpass(mover, src, target)
-
-/**
- * # Edge Field Proximity Checker
- *
- * An advanced proximity checker object which sits on the outer edge tiles of a field.
- */
-/obj/effect/abstract/proximity_checker/advanced/edge_field
- name = "edge field"
-
-/obj/effect/abstract/proximity_checker/advanced/edge_field/Destroy()
- advanced_monitor.edge_checkers -= src
- return ..()
-
-/obj/effect/abstract/proximity_checker/advanced/edge_field/Crossed(atom/movable/AM, oldloc)
- . = ..()
- return advanced_monitor.edge_field_crossed(AM, src)
-
-/obj/effect/abstract/proximity_checker/advanced/edge_field/Uncrossed(atom/movable/AM)
- . = ..()
- return advanced_monitor.edge_field_uncrossed(AM, src)
-
-/obj/effect/abstract/proximity_checker/advanced/edge_field/CanPass(atom/movable/mover, turf/target, height)
- . = ..()
- return advanced_monitor.edge_field_canpass(mover, src, target)
diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
index be263c915b8f..b882d6dec2c7 100644
--- a/code/datums/spells/lichdom.dm
+++ b/code/datums/spells/lichdom.dm
@@ -10,10 +10,10 @@
level_max = 0 //cannot be improved
cooldown_min = 10
- var/obj/marked_item
+ var/marked_item_uid
var/mob/living/current_body
var/resurrections = 0
- var/existence_stops_round_end = 0
+ var/existence_stops_round_end = FALSE
action_icon_state = "skeleton"
@@ -30,106 +30,148 @@
return ..()
/obj/effect/proc_holder/spell/lichdom/cast(list/targets, mob/user = usr)
- if(!GLOB.configuration.gamemode.disable_certain_round_early_end)
- existence_stops_round_end = TRUE
- GLOB.configuration.gamemode.disable_certain_round_early_end = TRUE
-
for(var/mob/M in targets)
- var/list/hand_items = list()
- if(iscarbon(M))
- hand_items = list(M.get_active_hand(), M.get_inactive_hand())
-
- if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry
- marked_item = null
- return
-
- if(stat_allowed) //Death is not my end!
- if(M.stat == CONSCIOUS && iscarbon(M))
- to_chat(M, "You aren't dead enough to revive!")//Usually a good problem to have
-
- cooldown_handler.revert_cast()
- return
-
- if(!marked_item || QDELETED(marked_item)) //Wait nevermind
- to_chat(M, "Your phylactery is gone!")
+ if(stat_allowed)
+ attempt_revive(M)
+ else if(!marked_item_uid)
+ attempt_mark_item(M)
+
+/obj/effect/proc_holder/spell/lichdom/proc/attempt_revive(mob/user)
+ // Can only cast when unconscious/dead
+ if(user.stat == CONSCIOUS)
+ to_chat(user, "You aren't dead enough to revive!")
+ cooldown_handler.revert_cast()
+ return
+
+ // Body was destroyed
+ if(QDELETED(current_body))
+ to_chat(user, "Your body is gone!")
+ return
+
+ // Phylactery was destroyed
+ var/obj/item/marked_item = locateUID(marked_item_uid)
+ if(QDELETED(marked_item))
+ to_chat(user, "Your phylactery is gone!")
+ return
+
+ // Wrong z-level
+ var/turf/body_turf = get_turf(current_body)
+ var/turf/item_turf = get_turf(marked_item)
+ if(body_turf.z != item_turf.z)
+ to_chat(user, "Your phylactery is out of range!")
+ return
+
+ if(isobserver(user))
+ var/mob/dead/observer/O = user
+ O.reenter_corpse()
+
+ // Clean up the old body
+ if(!QDELETED(current_body))
+ if(iscarbon(current_body))
+ var/mob/living/carbon/C = current_body
+ for(var/obj/item/W in C)
+ C.unEquip(W)
+
+ // Give a hint as to where the body is
+ var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf))
+ if(wheres_wizdo)
+ current_body.visible_message("Suddenly [current_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!")
+ body_turf.Beam(item_turf, icon_state = "lichbeam", icon = 'icons/effects/effects.dmi', time = 10 + 10 * resurrections, maxdistance = INFINITY)
+
+ UnregisterSignal(current_body, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_Z_CHANGED))
+ current_body.dust()
+
+ var/stun_time = (1 + resurrections++) * 20 SECONDS
+
+ var/mob/living/carbon/human/lich = new /mob/living/carbon/human(item_turf)
+ lich.set_species(/datum/species/skeleton/lich)
+ lich.real_name = user.mind.name
+ lich.Weaken(stun_time)
+ user.mind.transfer_to(lich)
+ equip_lich(lich)
+ RegisterSignal(lich, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_Z_CHANGED), PROC_REF(check_revivability_handler))
+
+ current_body = lich
+ cooldown_handler.recharge_duration += 1 MINUTES
+ to_chat(lich, "Your bones clatter and shudder as they're pulled back into this world!")
+
+/obj/effect/proc_holder/spell/lichdom/proc/attempt_mark_item(mob/user)
+ var/obj/item/target = user.get_active_hand()
+ if(!target)
+ to_chat(user, "You must hold an item you wish to make your phylactery!")
+ return
+
+ if(target.flags & (ABSTRACT|NODROP))
+ to_chat(user, "[target] cannot be used as your phylactery!")
+ return
+
+ if(!do_after(user, 5 SECONDS, target = target))
+ to_chat(user, "Your soul snaps back to your body as you drop [target]!")
+ return
+
+ name = "RISE!"
+ desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
+ stat_allowed = UNCONSCIOUS
+ cooldown_handler.recharge_duration = 3 MINUTES
+ cooldown_handler.revert_cast()
+
+ if(action && action.button)
+ action.name = action.button.name = name
+ action.desc = action.button.desc = desc
+
+ target.name = "ensouled [target.name]"
+ target.desc += "
A terrible aura surrounds this item, its very existence is offensive to life itself..."
+ target.color = "#003300"
+ marked_item_uid = target.UID()
+
+ current_body = user.mind.current
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.set_species(/datum/species/skeleton/lich)
+ H.unEquip(H.wear_suit)
+ H.unEquip(H.head)
+ H.unEquip(H.shoes)
+ H.unEquip(H.head)
+ equip_lich(H)
+
+ RegisterSignal(target, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_Z_CHANGED), PROC_REF(check_revivability_handler))
+ RegisterSignal(current_body, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_Z_CHANGED), PROC_REF(check_revivability_handler))
+ to_chat(user, "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!")
+
+ existence_stops_round_end = TRUE
+ GLOB.configuration.gamemode.disable_certain_round_early_end = TRUE
+
+/obj/effect/proc_holder/spell/lichdom/proc/is_revive_possible()
+ var/obj/item/marked_item = locateUID(marked_item_uid)
+ if(QDELETED(marked_item))
+ return FALSE
+ if(QDELETED(current_body))
+ return FALSE
+ var/turf/body_turf = get_turf(current_body)
+ var/turf/item_turf = get_turf(marked_item)
+ if(body_turf.z != item_turf.z)
+ return FALSE
+ return TRUE
+
+/obj/effect/proc_holder/spell/lichdom/proc/check_revivability_handler()
+ SIGNAL_HANDLER
+
+ // There are other liches about, so round may still continue
+ for(var/datum/mind/M in SSticker.mode.wizards)
+ for(var/obj/effect/proc_holder/spell/lichdom/S in M.spell_list)
+ if(S == src)
+ continue
+ // Other lich can still revive
+ if(S.is_revive_possible())
return
-
- var/turf/user_turf = get_turf(M)
- var/turf/item_turf = get_turf(marked_item)
-
- if(user_turf.z != item_turf.z)
- to_chat(M, "Your phylactery is out of range!")
- return
-
- if(isobserver(M))
- var/mob/dead/observer/O = M
- O.reenter_corpse()
-
- var/mob/living/carbon/human/lich = new /mob/living/carbon/human(item_turf)
-
- lich.real_name = M.mind.name
- M.mind.transfer_to(lich)
- lich.set_species(/datum/species/skeleton/lich) // Wizard variant
- to_chat(lich, "Your bones clatter and shudder as they're pulled back into this world!")
- cooldown_handler.recharge_duration += 1 MINUTES
- var/mob/old_body = current_body
- var/turf/body_turf = get_turf(old_body)
- current_body = lich
- var/stun_time = (1 + resurrections) * 20 SECONDS
- lich.Weaken(stun_time)
- ++resurrections
- equip_lich(lich)
-
- if(old_body && old_body.loc)
- if(iscarbon(old_body))
- var/mob/living/carbon/C = old_body
- for(var/obj/item/W in C)
- C.unEquip(W)
- var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf))
- if(wheres_wizdo)
- old_body.visible_message("Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!")
- body_turf.Beam(item_turf,icon_state="lichbeam",icon='icons/effects/effects.dmi',time=10+10*resurrections,maxdistance=INFINITY)
- old_body.dust()
-
- if(!marked_item) //linking item to the spell
- message = ""
- for(var/obj/item in hand_items)
- if((ABSTRACT in item.flags) || (NODROP in item.flags))
- continue
- marked_item = item
- to_chat(M, "You begin to focus your very being into [item]...")
- break
-
- if(!marked_item)
- to_chat(M, "You must hold an item you wish to make your phylactery...")
+ // Other lich is still alive
+ if(!QDELETED(S.current_body) && S.current_body.stat != DEAD)
return
- spawn(50)
- if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger!
- to_chat(M, "Your soul snaps back to your body as you drop [marked_item]!")
- marked_item = null
- return
- name = "RISE!"
- desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away."
- cooldown_handler.recharge_duration = 3 MINUTES
- cooldown_handler.revert_cast()
- stat_allowed = UNCONSCIOUS
- marked_item.name = "Ensouled [marked_item.name]"
- marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..."
- marked_item.color = "#003300"
- to_chat(M, "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!")
- current_body = M.mind.current
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.set_species(/datum/species/skeleton/lich)
- H.unEquip(H.wear_suit)
- H.unEquip(H.head)
- H.unEquip(H.shoes)
- H.unEquip(H.head)
- equip_lich(H)
+ GLOB.configuration.gamemode.disable_certain_round_early_end = is_revive_possible()
/obj/effect/proc_holder/spell/lichdom/proc/equip_lich(mob/living/carbon/human/H)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), SLOT_HUD_OUTER_SUIT)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), SLOT_HUD_HEAD)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), SLOT_HUD_SHOES)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), SLOT_HUD_JUMPSUIT)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), SLOT_HUD_OUTER_SUIT)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), SLOT_HUD_HEAD)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), SLOT_HUD_SHOES)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), SLOT_HUD_JUMPSUIT)
diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm
index 244ee44832db..5005f9e4ffdc 100644
--- a/code/datums/uplink_items/uplink_general.dm
+++ b/code/datums/uplink_items/uplink_general.dm
@@ -231,6 +231,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/batterer
cost = 25
+/datum/uplink_item/dangerous/porta_turret
+ name = "Portable Turret"
+ desc = "A pop-up syndicate turret, shoots anyone who didn't prime the grenade. The turret cannot be moved after it's deployed."
+ reference = "MIS"
+ item = /obj/item/grenade/turret
+ cost = 20
+
// Ammunition
/datum/uplink_item/ammo
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index c1b66de25f8b..b20a4969e1de 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -97,7 +97,7 @@
qdel(B)
for(var/mob/living/simple_animal/hostile/carp/holocarp/C in linkedholodeck)
qdel(C)
- holographic_items = A.copy_contents_to(linkedholodeck, platingRequired = TRUE, perfect_copy = FALSE)
+ holographic_items = A.copy_contents_to(linkedholodeck, platingRequired = TRUE)
if(emagged)
for(var/obj/item/holo/H in linkedholodeck)
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index f62062ffd1a5..259bd3394d80 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -414,6 +414,23 @@
for(var/I in 1 to 5)
new /obj/item/grenade/barrier/dropwall(src)
+/obj/item/grenade/turret
+ name = "Pop-Up Turret grenade"
+ desc = "Inflates into a Pop-Up turret, shoots everyone on sight who wasn't the primer."
+ icon = 'icons/obj/grenade.dmi'
+ icon_state = "wallbang"
+ item_state = "flashbang"
+ var/owner_uid
+
+/obj/item/grenade/turret/attack_self(mob/user)
+ owner_uid = user.UID()
+ return ..()
+
+/obj/item/grenade/turret/prime()
+ var/obj/machinery/porta_turret/inflatable_turret/turret = new(get_turf(loc))
+ turret.owner_uid = owner_uid
+ qdel(src)
+
#undef SINGLE
#undef VERTICAL
#undef HORIZONTAL
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index e37907cb6c63..2739d7fe6f93 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -1147,3 +1147,61 @@ GLOBAL_LIST_EMPTY(turret_icons)
/obj/machinery/porta_turret/syndicate/pod/nuke_ship_interior
health = 100
+
+/obj/machinery/porta_turret/inflatable_turret
+ name = "Syndicate Pop-Up Turret"
+ desc = "Looks cheaply made on the defensive side but the gun barrel still shoots."
+ projectile = /obj/item/projectile/bullet/weakbullet3
+ eprojectile = /obj/item/projectile/bullet/weakbullet3
+ icon_state = "syndieturret0"
+ shot_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
+ eshot_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
+ health = 50
+ syndicate = TRUE
+ installation = null
+ always_up = TRUE
+ requires_power = FALSE
+ power_state = NO_POWER_USE
+ has_cover = FALSE
+ raised = TRUE
+ scan_range = 9
+
+ faction = "syndicate"
+ emp_vulnerable = FALSE
+
+ lethal = TRUE
+ lethal_is_configurable = FALSE
+ targetting_is_configurable = FALSE
+ check_arrest = FALSE
+ check_records = FALSE
+ check_weapons = FALSE
+ check_access = FALSE
+ check_anomalies = TRUE
+ check_synth = TRUE
+ ailock = TRUE
+ var/owner_uid
+ var/icon_state_initial = "syndieturret0"
+ var/icon_state_active = "syndieturret1"
+ var/icon_state_destroyed = "syndieturret2"
+
+/obj/machinery/porta_turret/inflatable_turret/assess_and_assign(atom/movable/AM, list/targets, list/secondarytargets)
+ if(AM.UID() == owner_uid)
+ return
+ . = ..()
+
+/obj/machinery/porta_turret/inflatable_turret/setup()
+ return
+
+/obj/machinery/porta_turret/inflatable_turret/update_icon_state()
+ if(stat & BROKEN)
+ icon_state = icon_state_destroyed
+ else if(enabled)
+ icon_state = icon_state_active
+ else
+ icon_state = icon_state_initial
+
+/obj/machinery/porta_turret/inflatable_turret/CanPass(atom/A)
+ return ((stat & BROKEN) || !isliving(A))
+
+/obj/machinery/porta_turret/inflatable_turret/CanPathfindPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE)
+ return ((stat & BROKEN) || !isliving(caller))
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 4eefbfe2685a..6e3243d9c6b6 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -1,3 +1,12 @@
+#define OPEN_EMPTY 1
+#define CLOSED_EMPTY 2
+#define OPEN_FULL 3
+#define CLOSED_FULL 4
+#define RUNNING 5
+//#define OPEN_BLOODY 6 is tied to an unused icon state
+#define CLOSED_BLOODY 7
+#define RUNNING_BLOODY 8
+
/obj/machinery/washing_machine
name = "washing machine"
desc = "Gets rid of those pesky bloodstains, or your money back!"
@@ -5,21 +14,42 @@
icon_state = "wm_10"
density = TRUE
anchored = TRUE
- var/state = 1
- //1 = empty, open door
- //2 = empty, closed door
- //3 = full, open door
- //4 = full, closed door
- //5 = running
- //6 = blood, open door
- //7 = blood, closed door
- //8 = blood, running
+ /// Integer ID corresponding to whether the machine can accept more items, is running, will produce gibs, etc.
+ var/state = OPEN_EMPTY
var/panel = FALSE
- //FALSE = closed
- //TRUE = open
- var/hacked = TRUE //Bleh, screw hacking, let's have it hacked by default.
- var/gibs_ready = 0
+ var/gibs_ready = FALSE
var/obj/crayon
+ /// Typecache of washable items
+ var/list/can_be_washed = list(
+ /obj/item/stack/sheet/hairlesshide,
+ /obj/item/clothing/under,
+ /obj/item/clothing/mask,
+ /obj/item/clothing/head,
+ /obj/item/clothing/gloves,
+ /obj/item/clothing/shoes,
+ /obj/item/clothing/suit,
+ /obj/item/bedsheet
+ )
+ /// Typecache of items that do not fit, overrides the whitelist
+ var/list/does_not_fit = list(
+ /obj/item/clothing/under/plasmaman,
+ /obj/item/clothing/suit/space,
+ /obj/item/clothing/suit/syndicatefake,
+ /obj/item/clothing/suit/cyborg_suit,
+ /obj/item/clothing/suit/bomb_suit,
+ /obj/item/clothing/suit/armor,
+ /obj/item/clothing/mask/gas,
+ /obj/item/clothing/mask/cigarette,
+ /obj/item/clothing/head/syndicatefake,
+ /obj/item/clothing/head/helmet,
+ /obj/item/clothing/gloves/furgloves
+ )
+
+/obj/machinery/washing_machine/Initialize(mapload)
+ . = ..()
+
+ can_be_washed = typecacheof(can_be_washed)
+ does_not_fit = typecacheof(does_not_fit)
/obj/machinery/washing_machine/examine(mob/user)
. = ..()
@@ -31,52 +61,51 @@
start(user)
/obj/machinery/washing_machine/proc/start(mob/user)
- if(state != 4)
+ if(state != CLOSED_FULL)
to_chat(user, "The washing machine cannot run in this state.")
return
- if(locate(/mob,contents))
- state = 8
+ if(locate(/mob) in src)
+ state = RUNNING_BLOODY
else
- state = 5
+ state = RUNNING
update_icon(UPDATE_ICON_STATE)
sleep(200)
- for(var/atom/A in contents)
+ for(var/atom/A in src)
A.clean_blood()
//Tanning!
- for(var/obj/item/stack/sheet/hairlesshide/HH in contents)
- var/obj/item/stack/sheet/wetleather/WL = new(src)
- WL.amount = HH.amount
+ for(var/obj/item/stack/sheet/hairlesshide/HH in src)
+ new /obj/item/stack/sheet/wetleather(src, HH.amount)
qdel(HH)
if(crayon)
var/wash_color
- if(istype(crayon,/obj/item/toy/crayon))
+ if(istype(crayon, /obj/item/toy/crayon))
var/obj/item/toy/crayon/CR = crayon
wash_color = CR.colourName
- else if(istype(crayon,/obj/item/stamp))
+ else if(istype(crayon, /obj/item/stamp))
var/obj/item/stamp/ST = crayon
wash_color = ST.item_color
if(wash_color)
- var/new_jumpsuit_icon_state = ""
- var/new_jumpsuit_item_state = ""
- var/new_jumpsuit_name = ""
- var/new_glove_icon_state = ""
- var/new_glove_item_state = ""
- var/new_glove_name = ""
- var/new_bandana_icon_state = ""
- var/new_bandana_item_state = ""
- var/new_bandana_name = ""
- var/new_shoe_icon_state = ""
- var/new_shoe_name = ""
- var/new_sheet_icon_state = ""
- var/new_sheet_name = ""
- var/new_sheet_item_state = ""
- var/new_softcap_icon_state = ""
- var/new_softcap_name = ""
+ var/new_jumpsuit_icon_state
+ var/new_jumpsuit_item_state
+ var/new_jumpsuit_name
+ var/new_glove_icon_state
+ var/new_glove_item_state
+ var/new_glove_name
+ var/new_bandana_icon_state
+ var/new_bandana_item_state
+ var/new_bandana_name
+ var/new_shoe_icon_state
+ var/new_shoe_name
+ var/new_sheet_icon_state
+ var/new_sheet_name
+ var/new_sheet_item_state
+ var/new_softcap_icon_state
+ var/new_softcap_name
var/new_desc = "The colors are a bit dodgy."
for(var/T in typesof(/obj/item/clothing/under))
var/obj/item/clothing/under/J = new T
@@ -131,7 +160,7 @@
break
qdel(H)
if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name)
- for(var/obj/item/clothing/under/J in contents)
+ for(var/obj/item/clothing/under/J in src)
if(!J.dyeable)
continue
J.item_state = new_jumpsuit_item_state
@@ -140,7 +169,7 @@
J.name = new_jumpsuit_name
J.desc = new_desc
if(new_glove_icon_state && new_glove_item_state && new_glove_name)
- for(var/obj/item/clothing/gloves/color/G in contents)
+ for(var/obj/item/clothing/gloves/color/G in src)
if(!G.dyeable)
continue
G.item_state = new_glove_item_state
@@ -150,19 +179,19 @@
if(!istype(G, /obj/item/clothing/gloves/color/black/thief))
G.desc = new_desc
if(new_shoe_icon_state && new_shoe_name)
- for(var/obj/item/clothing/shoes/S in contents)
+ for(var/obj/item/clothing/shoes/S in src)
if(!S.dyeable)
continue
- if(S.chained == 1)
- S.chained = 0
+ if(S.chained)
+ S.chained = FALSE
S.slowdown = SHOES_SLOWDOWN
- new /obj/item/restraints/handcuffs( src )
+ new /obj/item/restraints/handcuffs(src)
S.icon_state = new_shoe_icon_state
S.item_color = wash_color
S.name = new_shoe_name
S.desc = new_desc
if(new_bandana_icon_state && new_bandana_name)
- for(var/obj/item/clothing/mask/bandana/M in contents)
+ for(var/obj/item/clothing/mask/bandana/M in src)
if(!M.dyeable)
continue
M.item_state = new_bandana_item_state
@@ -171,14 +200,14 @@
M.name = new_bandana_name
M.desc = new_desc
if(new_sheet_icon_state && new_sheet_name)
- for(var/obj/item/bedsheet/B in contents)
+ for(var/obj/item/bedsheet/B in src)
B.icon_state = new_sheet_icon_state
B.item_color = wash_color
B.item_state = new_sheet_item_state
B.name = new_sheet_name
B.desc = new_desc
if(new_softcap_icon_state && new_softcap_name)
- for(var/obj/item/clothing/head/soft/H in contents)
+ for(var/obj/item/clothing/head/soft/H in src)
if(!H.dyeable)
continue
H.icon_state = new_softcap_icon_state
@@ -188,143 +217,103 @@
QDEL_NULL(crayon)
- if(locate(/mob,contents))
- state = 7
- gibs_ready = 1
+ if(locate(/mob) in src)
+ state = CLOSED_BLOODY
+ gibs_ready = TRUE
else
- state = 4
+ state = CLOSED_FULL
update_icon(UPDATE_ICON_STATE)
/obj/machinery/washing_machine/update_icon_state()
icon_state = "wm_[state][panel]"
-/obj/machinery/washing_machine/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/machinery/washing_machine/attackby(obj/item/W, mob/user, params)
if(default_unfasten_wrench(user, W))
return
- if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/stamp))
- if(state in list( 1, 3, 6))
+ if(istype(W, /obj/item/toy/crayon) || istype(W, /obj/item/stamp))
+ if(state in list(OPEN_EMPTY, OPEN_FULL))
if(!crayon)
user.drop_item()
crayon = W
- crayon.loc = src
+ crayon.forceMove(src)
update_icon(UPDATE_ICON_STATE)
else
return ..()
else
return ..()
- else if(istype(W,/obj/item/grab))
- if((state == 1) && hacked)
+ else if(istype(W, /obj/item/grab))
+ if(state == OPEN_EMPTY)
var/obj/item/grab/G = W
if(ishuman(G.assailant) && iscorgi(G.affecting))
- G.affecting.loc = src
+ G.affecting.forceMove(src)
qdel(G)
- state = 3
+ state = OPEN_FULL
update_icon(UPDATE_ICON_STATE)
else
return ..()
- else if(istype(W,/obj/item/stack/sheet/hairlesshide) || \
- istype(W,/obj/item/clothing/under) || \
- istype(W,/obj/item/clothing/mask) || \
- istype(W,/obj/item/clothing/head) || \
- istype(W,/obj/item/clothing/gloves) || \
- istype(W,/obj/item/clothing/shoes) || \
- istype(W,/obj/item/clothing/suit) || \
- istype(W,/obj/item/bedsheet))
-
- //YES, it's hardcoded... saves a var/can_be_washed for every single clothing item.
- if(istype(W,/obj/item/clothing/under/plasmaman))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/suit/space))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/suit/syndicatefake))
- to_chat(user, "This item does not fit.")
- return
-// if(istype(W,/obj/item/clothing/suit/powered))
-// to_chat(user, "This item does not fit.")
-// return
- if(istype(W,/obj/item/clothing/suit/cyborg_suit))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/suit/bomb_suit))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/suit/armor))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/mask/gas))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/mask/cigarette))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/head/syndicatefake))
- to_chat(user, "This item does not fit.")
- return
-// if(istype(W,/obj/item/clothing/head/powered))
-// to_chat(user, "This item does not fit.")
-// return
- if(istype(W,/obj/item/clothing/head/helmet))
- to_chat(user, "This item does not fit.")
- return
- if(istype(W,/obj/item/clothing/gloves/furgloves))
- to_chat(user, "This item does not fit.")
+ else if(is_type_in_typecache(W, can_be_washed))
+ if(is_type_in_typecache(W, does_not_fit))
+ to_chat(user, "This item does not fit.")
return
if(istype(W, /obj/item/clothing/gloves/color/black/krav_maga/sec))
to_chat(user, "Washing these gloves would fry the electronics!")
return
- if(W.flags & NODROP) //if "can't drop" item
- to_chat(user, "\The [W] is stuck to your hand, you cannot put it in the washing machine!")
+ if(W.flags & NODROP)
+ to_chat(user, "[W] is stuck to your hand!")
return
- if(contents.len < 5)
- if(state in list(1, 3))
+ if(length(contents) < 5)
+ if(state in list(OPEN_EMPTY, OPEN_FULL))
user.drop_item()
- W.loc = src
- state = 3
+ W.forceMove(src)
+ state = OPEN_FULL
else
- to_chat(user, "You can't put the item in right now.")
+ to_chat(user, "The door is closed!")
else
- to_chat(user, "The washing machine is full.")
+ to_chat(user, "[src] is full!")
update_icon(UPDATE_ICON_STATE)
else
return ..()
-/obj/machinery/washing_machine/attack_hand(mob/user as mob)
+/obj/machinery/washing_machine/attack_hand(mob/user)
switch(state)
- if(1)
- state = 2
- if(2)
- state = 1
- for(var/atom/movable/O in contents)
- O.loc = src.loc
- if(3)
- state = 4
- if(4)
- state = 3
- for(var/atom/movable/O in contents)
- O.loc = src.loc
+ if(OPEN_EMPTY)
+ state = CLOSED_EMPTY
+ if(CLOSED_EMPTY)
+ for(var/atom/movable/O in src)
+ O.forceMove(loc)
+ crayon = null
+ state = OPEN_EMPTY
+ if(OPEN_FULL)
+ state = CLOSED_FULL
+ if(CLOSED_FULL)
+ for(var/atom/movable/O in src)
+ O.forceMove(loc)
crayon = null
- state = 1
- if(5)
+ state = OPEN_EMPTY
+ if(RUNNING)
to_chat(user, "[src] is busy.")
- if(6)
- state = 7
- if(7)
+ if(CLOSED_BLOODY)
if(gibs_ready)
- gibs_ready = 0
- if(locate(/mob,contents))
- var/mob/M = locate(/mob,contents)
+ gibs_ready = FALSE
+ if(locate(/mob) in src)
+ var/mob/M = locate() in src
M.gib()
- for(var/atom/movable/O in contents)
- O.loc = src.loc
+ for(var/atom/movable/O in src)
+ O.forceMove(loc)
crayon = null
- state = 1
-
+ state = OPEN_EMPTY
update_icon(UPDATE_ICON_STATE)
/obj/machinery/washing_machine/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/metal(drop_location(), 2)
qdel(src)
+
+#undef OPEN_EMPTY
+#undef CLOSED_EMPTY
+#undef OPEN_FULL
+#undef CLOSED_FULL
+#undef RUNNING
+#undef CLOSED_BLOODY
+#undef RUNNING_BLOODY
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 87e325634646..bbf6725edd2e 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -141,7 +141,8 @@
if(isguardian(user) && (M.loc == user.loc || user.alpha == 60)) //Alpha is for detecting ranged guardians in scout mode
return //unmanifested guardians shouldn't be able to buckle mobs
- if(M != user && (!in_range(M, src) || !do_after(user, 1 SECONDS, target = M)))
+ // TRAIT_HANDS_BLOCKED check is necessary to prevent delay when incapacitated, but still keep a delay in combat
+ if(M != user && !HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) && (!in_range(M, src) || !do_after(user, 1 SECONDS, target = M)))
return FALSE
if(M != user && (!in_range(M, src) || !do_after(user, 1 SECONDS, target = M)))
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 5d16fd637815..0e2d8b42bec9 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -50,6 +50,7 @@
if(!reagents)
create_reagents(max_water)
reagents.add_reagent("water", max_water)
+ ADD_TRAIT(src, TRAIT_CAN_POINT_WITH, ROUNDSTART_TRAIT)
/obj/item/extinguisher/attack_self(mob/user as mob)
safety = !safety
diff --git a/code/game/turfs/simulated/floor/asteroid_floors.dm b/code/game/turfs/simulated/floor/asteroid_floors.dm
index ff25fb1ae585..5e3ca03b919d 100644
--- a/code/game/turfs/simulated/floor/asteroid_floors.dm
+++ b/code/game/turfs/simulated/floor/asteroid_floors.dm
@@ -151,6 +151,14 @@
planetary_atmos = TRUE
baseturf = /turf/simulated/floor/plating/lava/smooth/mapping_lava
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface_hard
+ oxygen = 14
+ nitrogen = 23
+ temperature = 300
+ planetary_atmos = TRUE
+ color = COLOR_FLOOR_HARD_ROCK
+ baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface
+
/turf/simulated/floor/plating/asteroid/airless
temperature = TCMB
oxygen = 0
diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm
index 79adfa0460c3..f43e36b6f810 100644
--- a/code/game/turfs/simulated/floor/lava.dm
+++ b/code/game/turfs/simulated/floor/lava.dm
@@ -121,8 +121,20 @@
new /obj/structure/lattice/lava(locate(x, y, z))
else
to_chat(user, "You need one rod to build a heatproof lattice.")
+ return
+ if(istype(C, /obj/item/stack/tile/plasteel))
+ var/obj/structure/lattice/L = locate(/obj/structure/lattice/lava, src)
+ if(!L)
+ to_chat(user, "The plating is going to need some support! Place metal rods first.")
return
-
+ var/obj/item/stack/tile/plasteel/S = C
+ if(S.use(1))
+ qdel(L)
+ playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
+ to_chat(user, "You build a floor.")
+ ChangeTurf(/turf/simulated/floor/plating, keep_icon = FALSE)
+ else
+ to_chat(user, "You need one floor tile to build a floor!")
/turf/simulated/floor/plating/lava/screwdriver_act()
return
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index e8cbb28dd80e..4d0b9a2b4180 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -235,6 +235,32 @@
return
return ..()
+/turf/simulated/mineral/ancient/lava_land_surface_hard
+ name = "hardened volcanic rock"
+ desc = "A dense volcanic rock that appears to be resistant to everything except diamond and sonic tools!"
+ mine_time = 15 SECONDS
+ color = COLOR_HARD_ROCK
+ oxygen = 14
+ nitrogen = 23
+ temperature = 300
+ turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface_hard
+ var/static/list/allowed_picks_typecache
+
+/turf/simulated/mineral/ancient/lava_land_surface_hard/Initialize(mapload)
+ . = ..()
+ allowed_picks_typecache = typecacheof(list(
+ /obj/item/pickaxe/drill/jackhammer,
+ /obj/item/pickaxe/diamond,
+ /obj/item/pickaxe/drill/cyborg/diamond,
+ /obj/item/pickaxe/drill/diamonddrill,
+ ))
+
+/turf/simulated/mineral/ancient/lava_land_surface_hard/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/pickaxe) && !(is_type_in_typecache(I, allowed_picks_typecache)))
+ to_chat(user, "Only a diamond tools or a sonic jackhammer can break this rock.")
+ return
+ return ..()
+
/turf/simulated/mineral/random/high_chance
color = COLOR_YELLOW
mineralChance = 25
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 8a04d251ab05..c08748fb8730 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -91,3 +91,21 @@
if(heated)
to_chat(M.occupant, "The wall's intense heat completely reflects your [M.name]'s attack!")
M.take_damage(20, BURN)
+
+/turf/simulated/wall/boss
+ name = "ancient wall"
+ desc = "A thick metal wall, it look very old."
+ icon = 'icons/turf/walls/boss_wall.dmi'
+ icon_state = "boss_wall-0"
+ base_icon_state = "boss_wall"
+ explosion_block = 2
+ damage_cap = 600
+ hardness = 10
+ heat_resistance = 20000
+ can_dismantle_with_welder = FALSE
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BOSS_WALLS)
+ canSmoothWith = list(SMOOTH_GROUP_BOSS_WALLS)
+ sheet_type = /obj/item/stack/sheet/runed_metal
+ sheet_amount = 1
+ girder_type = /obj/structure/girder/cult
diff --git a/code/modules/antagonists/changeling/powers/apex_predator.dm b/code/modules/antagonists/changeling/powers/apex_predator.dm
new file mode 100644
index 000000000000..e40d7207e8e7
--- /dev/null
+++ b/code/modules/antagonists/changeling/powers/apex_predator.dm
@@ -0,0 +1,25 @@
+/datum/action/changeling/apex_predator
+ name = "Apex Predator"
+ desc = "We evolve a keen intuition, allowing us to detect the anxieties of nearby lifeforms."
+ helptext = "We will be able to detect the direction and room our prey is in, as well as if they have any injuries."
+ button_icon_state = "predator"
+ dna_cost = 1
+ power_type = CHANGELING_PURCHASABLE_POWER
+ category = /datum/changeling_power_category/utility
+
+/datum/action/changeling/apex_predator/sting_action(mob/user)
+ var/list/target_by_name = list()
+ for(var/mob/living/carbon/human/possible_target as anything in GLOB.human_list)
+ if((!possible_target.mind || possible_target.z != user.z))
+ continue
+ target_by_name[possible_target.real_name] = possible_target
+
+ var/target_name = tgui_input_list(user, "Person to Locate", "Prey", target_by_name)
+ if(!target_name)
+ return
+
+ var/mob/living/carbon/human/target = target_by_name[target_name]
+ var/message = "[target_name] is in [get_area(target)], [dir2text(get_dir(user, target))] of us."
+ if(target.get_damage_amount() >= 40 || target.bleed_rate)
+ message += " They are wounded..."
+ to_chat(user, "[message]")
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index eeaf68253ef7..67b3df02b901 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -26,6 +26,10 @@
distill_reagent = "bananahonk"
tastes = list("banana" = 1)
+/obj/item/reagent_containers/food/snacks/grown/banana/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_CAN_POINT_WITH, ROUNDSTART_TRAIT)
+
/obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
user.visible_message("[user] is aiming [src] at [user.p_themselves()]! It looks like [user.p_theyre()] trying to commit suicide.")
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 4eee0af4a04c..dfa2ca1b2144 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -608,23 +608,31 @@
log_say(log_message, speaker)
speaker.create_log(SAY_LOG, log_message)
- var/message_start = "[name], [speaker.name]"
- var/message_body = "[speaker.say_quote(message)],\"[message]\""
+ var/list/message_start = list("[name], [speaker.name]") //Strings as lists lets you add blocks of text much easier
+ var/list/message_body = list("[speaker.say_quote(message)],\"[message]\"")
for(var/mob/M in GLOB.dead_mob_list)
if(!isnewplayer(M) && !isbrain(M))
- var/message_start_dead = "[name], [speaker.name] ([ghost_follow_link(speaker, ghost=M)])"
- M.show_message("[message_start_dead] [message_body]", 2)
+ var/list/message_start_dead = list("[name], [speaker.name] ([ghost_follow_link(speaker, ghost=M)])")
+ var/list/dead_message = message_start_dead + message_body
+ M.show_message(dead_message.Join(" "), 2)
for(var/mob/living/S in GLOB.alive_mob_list)
- if(drone_only && !isdrone(S))
+ if(!S.binarycheck())
continue
- else if(isAI(S))
- message_start = "[name], [speaker.name]"
- else if(!S.binarycheck())
+ else if(drone_only && !isdrone(S))
continue
-
- S.show_message("[message_start] [message_body]", 2)
+ else if(isAI(S))
+ message_start = list("[name], [speaker.name]")
+ else if(isrobot(S))
+ var/mob/living/silicon/robot/borg = S
+ if(borg.connected_ai?.name == speaker.name)
+ var/list/big_font_prefix = list("")
+ var/list/big_font_suffix = list("")
+ message_start = big_font_prefix + message_start
+ message_body = message_body + big_font_suffix
+ var/list/final_message = message_start + message_body
+ S.show_message(final_message.Join(" "), 2)
var/list/listening = hearers(1, src)
listening -= src
diff --git a/code/modules/mob/living/carbon/human/species/moth.dm b/code/modules/mob/living/carbon/human/species/moth.dm
index e4055e3bdfdd..1557f94b9ebe 100644
--- a/code/modules/mob/living/carbon/human/species/moth.dm
+++ b/code/modules/mob/living/carbon/human/species/moth.dm
@@ -12,7 +12,7 @@
inherent_factions = list("nian")
species_traits = list(NO_HAIR)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_BUG
- clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
+ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_WING | BALD | SHAVED
reagent_tag = PROCESS_ORG
dietflags = DIET_HERB
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 20f7d90f3d8b..f07f801b4b41 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -272,7 +272,7 @@
var/pointed_object = "\the [A]"
if(A.loc in src)
pointed_object += " inside [A.loc]"
- if(istype(hand_item, /obj/item/gun) && A != hand_item)
+ if(HAS_TRAIT(hand_item, TRAIT_CAN_POINT_WITH) && A != hand_item)
if(a_intent == INTENT_HELP || !ismob(A))
visible_message("[src] points to [pointed_object] with [hand_item]")
return TRUE
@@ -723,7 +723,7 @@
/mob/living/proc/resist_grab()
var/resisting = 0
if(HAS_TRAIT(src, TRAIT_IMMOBILIZED))
- return TRUE //You can't move, so you can't resist
+ return FALSE //You can't move, so you can't resist
for(var/X in grabbed_by)
var/obj/item/grab/G = X
resisting++
diff --git a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
index 764c97c97348..2610cd828c50 100644
--- a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
@@ -543,7 +543,9 @@
species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox", "Nian")
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/underwear.dmi',
- "Kidan" = 'icons/mob/clothing/species/kidan/underwear.dmi'
+ "Kidan" = 'icons/mob/clothing/species/kidan/underwear.dmi',
+ "Nian" = 'icons/mob/clothing/species/nian/underwear.dmi'
+
)
gender = NEUTER
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index aa2f0aef163f..d735eb143599 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -76,6 +76,7 @@
if(gun_light)
verbs += /obj/item/gun/proc/toggle_gunlight
build_zooming()
+ ADD_TRAIT(src, TRAIT_CAN_POINT_WITH, ROUNDSTART_TRAIT)
/obj/item/gun/Destroy()
QDEL_NULL(bayonet)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index ea31992b7d48..a87cec73c93a 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -19,6 +19,10 @@
possible_transfer_amounts = null
var/delay = CLICK_CD_RANGE * 2
+/obj/item/reagent_containers/spray/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_CAN_POINT_WITH, ROUNDSTART_TRAIT)
+
/obj/item/reagent_containers/spray/afterattack(atom/A, mob/user)
if(isstorage(A) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack) || istype(A, /obj/structure/closet) \
|| istype(A, /obj/item/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index 1fa33e6d27b2..3b4e5a1c1cb9 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -110,3 +110,13 @@
materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
build_path = /obj/item/borg/upgrade/modkit/aoe/turfs
category = list("Mining", "Cyborg Upgrade Modules")
+
+/datum/design/lavarods
+ name = "Lava-Resistant Iron Rods"
+ desc = "Treated, specialized iron rods. When exposed to the vacuum of space their coating breaks off, but they can hold up against the extreme heat of molten liquids."
+ id = "lavarod"
+ req_tech = list("materials" = 7, "engineering" = 5)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_PLASMA = 1000, MAT_TITANIUM = 1000)
+ build_path = /obj/item/stack/rods/lava
+ category = list("Mining")
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index 247d0b32dd76..07e98e9ebc97 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ
diff --git a/icons/mob/clothing/species/nian/underwear.dmi b/icons/mob/clothing/species/nian/underwear.dmi
new file mode 100644
index 000000000000..aaaf3ccc65e0
Binary files /dev/null and b/icons/mob/clothing/species/nian/underwear.dmi differ
diff --git a/paradise.dme b/paradise.dme
index c48fea192baa..78c0854ed145 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1364,6 +1364,7 @@
#include "code\modules\antagonists\changeling\datum_changeling.dm"
#include "code\modules\antagonists\changeling\evolution_menu.dm"
#include "code\modules\antagonists\changeling\powers\absorb.dm"
+#include "code\modules\antagonists\changeling\powers\apex_predator.dm"
#include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm"
#include "code\modules\antagonists\changeling\powers\become_headslug.dm"
#include "code\modules\antagonists\changeling\powers\biodegrade.dm"
diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md
index c892cb628be9..4070b5d46c36 100644
--- a/tgui/docs/component-reference.md
+++ b/tgui/docs/component-reference.md
@@ -44,12 +44,15 @@ Make sure to add new items to this list if you document new components.
- [`Table`](#table)
- [`Table.Row`](#tablerow)
- [`Table.Cell`](#tablecell)
+ - [`Table.Sortable`](#tablesortable)
- [`Tabs`](#tabs)
- [`Tabs.Tab`](#tabstab)
- [`Tooltip`](#tooltip)
- [`tgui/layouts`](#tguilayouts)
- [`Window`](#window)
- [`Window.Content`](#windowcontent)
+- [`tgui/interfaces/common`](#tguiinterfacescommon)
+ - [`RecordsTable`](#recordstable)
## General Concepts
@@ -844,6 +847,103 @@ A straight forward mapping to `
` element.
- `collapsing: boolean` - Collapses table cell to the smallest possible size,
and stops any text inside from wrapping.
+### `Table.Sortable`
+
+A managed sortable table.
+
+**Props:**
+
+- See inherited props: [Table](#table)
+- `columns: Column[]` - A list of data fields to be
+ used. The order in which columns are specified is the order in which they
+ appear in the UI.
+- `columnDefaults: UnnamedColumn` - Default values for all columns.
+ `columnDefaults.datum.children` can be used to specify the default children,
+ but will get overriden by children defined at each column.
+ `columnDefaults.datum.props` and `columnDefaults.header.props` can be used to
+ specify additional props for the datum and header respectively.
+- `data: object[]` - The data to put into the table.
+- `datumID: object => object` - A function which takes in a datum and returns
+ an id.
+- `filter: object[] => object[]` - A function applied to the data before
+ sorting the table. The `createSearch` function can be applied here.
+- `headerRowProps: object` - Props to apply to the header row.
+- `datumRowProps: object | object => object` - Props to apply to the data
+ rows. If a function is specified instead, the data associated with that row
+ is passed into it.
+- `...rest` - The rest of the props are applied on the table.
+- `children: Component[]` - Not supported. Do not use.
+
+The column types is defined as such:
+
+```ts
+interface UnnamedColumn {
+ // ? signifies optional
+ datum?: {
+ // Pass the children directly or pass a function which takes the value of
+ // the cell and returns the props. Setting this property overrides the
+ // default children.
+ children?: React.ReactNode | ((value: object) => React.ReactNode);
+ // Pass the additional props directly or pass a function which takes the
+ // value of the cell and returns the additional props.
+ props?: CellProps | ((value: object) => CellProps);
+ };
+ header?: {
+ // Additional props for the header cell.
+ props?: HeaderProps;
+ };
+}
+
+// Inherits properties from UnnamedColumn
+type Column = UnnamedColumn & {
+ id: string;
+ name: string;
+};
+```
+
+The following is an example of how to use `Table.Sortable`.
+
+```jsx
+const data = [
+ { 'account_number': 6224001, 'name': 'Command Account', 'suspended': 'Active', 'money': 7000, },
+ { 'account_number': 3099002, 'name': 'Security Account', 'suspended': 'Active', 'money': 14000, },
+ { 'account_number': 8652003, 'name': 'Science Account', 'suspended': 'Active', 'money': 7000, },
+ { 'account_number': 8422004, 'name': 'Service Account', 'suspended': 'Active', 'money': 7000, },
+ { 'account_number': 9853005, 'name': 'Supply Account', 'suspended': 'Active', 'money': 7000, },
+ { 'account_number': 1866006, 'name': 'Engineering Account', 'suspended': 'Active', 'money': 7250, },
+ { 'account_number': 3811007, 'name': 'Medical Account', 'suspended': 'Active', 'money': 7000, },
+ { 'account_number': 3945008, 'name': 'Assistant Account', 'suspended': 'Active', 'money': 4500, },
+]
+
+ datum.account_number}
+
+ datumRowProps={(datum) => ({
+ className: `AccountsUplinkTerminal__listRow--${datum.suspended}`,
+ })}
+ datumCellChildren={{
+ name: (value) => <> {value}>,
+ }}
+/>
+```
+
+In the above example, the `columns` prop defines the fields in the data that
+are used. `columns.id` is the key or the name of the property on the data,
+while `columns.name` is what the user sees on the UI. `datumID` selects which
+field in the data to use as the key for render caching. `datumID` can return
+anything, but it must be unique.
+
+`datumRowProps` applies a class to a row if the account associated with that
+row is suspended, and `datumCellChildren` prepends a wallet to the contents
+of the `name` column.
+
### `Tabs`
Tabs make it easy to explore and switch between different views.
@@ -968,3 +1068,19 @@ Can be scrollable.
- `className: string` - Applies a CSS class to the element.
- `scrollable: boolean` - Shows or hides the scrollbar.
- `children: any` - Main content of your window.
+
+## `tgui/interfaces/common`
+
+## `RecordsTable`
+
+An extension to [`Table.Sortable`](#tablesortable) which provides a search
+function and slots for buttons.
+
+**Props:**
+
+- See inherited props: [`Table.Sortable`](#tablesortable)
+- `leftButtons: Component` - Optional buttons to add left of the search box.
+- `rightButtons: Component` - Optional buttons to add right of the search box.
+- `searchPlaceholder: string` - The default text in the search box.
+
+Use a ``(or `<>`) to specify multiple buttons.
diff --git a/tgui/packages/tgui/components/DraggableControl.js b/tgui/packages/tgui/components/DraggableControl.js
index e8bfafd09a73..3a9a1931f38e 100644
--- a/tgui/packages/tgui/components/DraggableControl.js
+++ b/tgui/packages/tgui/components/DraggableControl.js
@@ -15,10 +15,11 @@ export class DraggableControl extends Component {
super(props);
this.inputRef = createRef();
this.state = {
+ originalValue: props.value,
value: props.value,
dragging: false,
editing: false,
- oldOffset: null,
+ origin: null,
suppressingFlicker: false,
};
@@ -50,8 +51,10 @@ export class DraggableControl extends Component {
document.body.style['pointer-events'] = 'none';
this.ref = e.currentTarget;
this.setState({
+ originalValue: value,
dragging: false,
value,
+ origin: getScalarScreenOffset(e, dragMatrix),
});
this.timer = setTimeout(() => {
this.setState({
@@ -82,57 +85,16 @@ export class DraggableControl extends Component {
}
this.setState((prevState) => {
const state = { ...prevState };
- const oldOffset = prevState.oldOffset;
- const offset =
- getScalarScreenOffset(e, dragMatrix) -
- this.ref.getBoundingClientRect().left -
- window.screenX;
+ const origin = prevState.origin;
+ const offset = getScalarScreenOffset(e, dragMatrix) - origin;
if (prevState.dragging) {
- if (
- oldOffset !== undefined &&
- oldOffset !== null &&
- offset !== oldOffset
- ) {
- const maxStep = maxValue / step;
- const toNearestStep =
- offset > oldOffset
- ? Math.floor // Increasing
- : Math.ceil; // Decreasing
- /* ● = step, o = oldOffset, n = offset
- * There are four cases to consider for the following code:
- * Case 1: Increasing(offset > oldOffset), moving between steps
- * ●--o--n-●
- * value should not change. Since both offsets are subject to floor,
- * they have the same nearest steps and the difference cancels out,
- * leaving value the same
- * Case 2: Decreasing(offset < oldOffset), moving between steps
- * ●--n--o-●
- * Same as Case 1 except the function is ceil not floor
- * Case 3: Increasing, offset is past step
- * ●-o-●-n-● ; ●-o-●---●-n
- * value should increase by 1, or however many steps o is behind n
- * Case 4: Decreasing, offset is behind step
- * ●-n-●-o-● ; ●-n-●---●-o
- * Same as Case 3, but decrease instead of increase
- */
- const oldStep = clamp(
- toNearestStep(oldOffset / stepPixelSize),
- 0,
- maxStep
- );
- const newStep = clamp(
- toNearestStep(offset / stepPixelSize),
- 0,
- maxStep
- );
- const stepDifference = newStep - oldStep;
- state.value = clamp(
- state.value + stepDifference * step,
- minValue,
- maxValue
- );
- }
- state.oldOffset = offset;
+ const stepDifference = Math.trunc(offset / stepPixelSize);
+ state.value = clamp(
+ Math.floor(state.originalValue / step) * step +
+ stepDifference * step,
+ minValue,
+ maxValue
+ );
} else if (Math.abs(offset) > 4) {
state.dragging = true;
}
@@ -147,9 +109,10 @@ export class DraggableControl extends Component {
clearTimeout(this.timer);
clearInterval(this.dragInterval);
this.setState({
+ originalValue: null,
dragging: false,
editing: !dragging,
- oldOffset: null,
+ origin: null,
});
document.removeEventListener('mousemove', this.handleDragMove);
document.removeEventListener('mouseup', this.handleDragEnd);
@@ -228,7 +191,14 @@ export class DraggableControl extends Component {
if (!editing) {
return;
}
- const value = clamp(e.target.value, minValue, maxValue);
+ const inputValue = parseInt(e.target.value, 10);
+ if (isNaN(inputValue) || e.target.value.match(/[^0-9]/g)) {
+ this.setState({
+ editing: false,
+ });
+ return;
+ }
+ const value = clamp(inputValue, minValue, maxValue);
this.setState({
editing: false,
value,
@@ -243,7 +213,14 @@ export class DraggableControl extends Component {
}}
onKeyDown={(e) => {
if (e.keyCode === 13) {
- const value = clamp(e.target.value, minValue, maxValue);
+ const inputValue = parseInt(e.target.value, 10);
+ if (isNaN(inputValue) || e.target.value.match(/[^0-9]/g)) {
+ this.setState({
+ editing: false,
+ });
+ return;
+ }
+ const value = clamp(inputValue, minValue, maxValue);
this.setState({
editing: false,
value,
diff --git a/tgui/packages/tgui/components/NanoMap.js b/tgui/packages/tgui/components/NanoMap.js
index cfe7ff5dace5..849b3be960b0 100644
--- a/tgui/packages/tgui/components/NanoMap.js
+++ b/tgui/packages/tgui/components/NanoMap.js
@@ -160,9 +160,9 @@ const NanoMapZoomer = (props, context) => {
v + 'x'}
value={props.zoom}
onDrag={(e, v) => props.onZoom(e, v)}
diff --git a/tgui/packages/tgui/components/Table.js b/tgui/packages/tgui/components/Table.js
index 681a795ed42c..14228caa20f5 100644
--- a/tgui/packages/tgui/components/Table.js
+++ b/tgui/packages/tgui/components/Table.js
@@ -1,5 +1,8 @@
import { classes, pureComponentHooks } from 'common/react';
-import { Box, computeBoxClassName, computeBoxProps } from './Box';
+import { computeBoxClassName, computeBoxProps } from './Box';
+import { Component } from 'inferno';
+import { Button } from './Button';
+import { Icon } from './Icon';
export const Table = (props) => {
const { className, collapsing, children, ...rest } = props;
@@ -53,7 +56,159 @@ export const TableCell = (props) => {
);
};
+const resolveFunctionalProp = (props, ...data) =>
+ props ? (props instanceof Function ? props(...data) : props) : undefined;
+class HoverableIcon extends Component {
+ constructor() {
+ super();
+ this.state = {
+ hovering: false,
+ };
+ this.handleMouseOver = (e) => {
+ this.setState({ hovering: true });
+ };
+ this.handleMouseOut = (e) => {
+ this.setState({ hovering: false });
+ };
+ }
+
+ render() {
+ const { hoverIcon, name, ...rest } = this.props;
+ const { hovering } = this.state;
+ return (
+
+ );
+ }
+}
+
+class SortableTable extends Component {
+ constructor(props) {
+ super();
+ this.state = {
+ // Allow null
+ sortId: props.sortId === undefined ? props.columns[0].id : props.sortId,
+ sortOrder: props.sortOrder ?? 1,
+ };
+ }
+
+ render() {
+ const {
+ className,
+ columnDefaults,
+ columns,
+ data,
+ datumID,
+ filter,
+ headerRowProps,
+ datumRowProps,
+ ...rest
+ } = this.props;
+ const { sortId, sortOrder } = this.state;
+
+ const columnHeaders = columns.map(
+ ({ id, name, header: { props } = {} }) => {
+ const {
+ header: { props: defaultProps },
+ } = columnDefaults;
+ return (
+
+
+
+ );
+ }
+ );
+ const dataRows = (filter ? filter(data) : data)
+ .sort((a, b) => {
+ if (sortId) {
+ const i = sortOrder ? 1 : -1;
+ return a[sortId].toString().localeCompare(b[sortId].toString()) * i;
+ } else {
+ return 0;
+ }
+ })
+ .map((datum) => {
+ let cells = columns.map(
+ ({ id, name, datum: { props, children } = {} }) => {
+ const {
+ datum: { children: defaultChildren, props: defaultProps },
+ } = columnDefaults;
+ return (
+
+ {resolveFunctionalProp(children, datum[id]) ??
+ resolveFunctionalProp(defaultChildren, datum[id]) ??
+ datum[id]}
+
+ );
+ }
+ );
+ return (
+
+ {cells}
+
+ );
+ });
+ return (
+
+
+ {columnHeaders}
+
+ {dataRows}
+
+ );
+ }
+}
+
TableCell.defaultHooks = pureComponentHooks;
Table.Row = TableRow;
Table.Cell = TableCell;
+Table.Sortable = SortableTable;
diff --git a/tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js b/tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js
index ecd2d7a397c9..b509baced50f 100644
--- a/tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js
+++ b/tgui/packages/tgui/interfaces/AccountsUplinkTerminal.js
@@ -1,9 +1,7 @@
-import { createSearch } from 'common/string';
import { Fragment } from 'inferno';
import { useBackend, useLocalState } from '../backend';
import {
Button,
- Flex,
Icon,
Input,
LabeledList,
@@ -11,11 +9,10 @@ import {
Table,
Tabs,
} from '../components';
-import { FlexItem } from '../components/Flex';
-import { TableCell } from '../components/Table';
import { Window } from '../layouts';
import { LoginInfo } from './common/LoginInfo';
import { LoginScreen } from './common/LoginScreen';
+import { RecordsTable } from './common/RecordsTable';
export const AccountsUplinkTerminal = (properties, context) => {
const { act, data } = useBackend(context);
@@ -42,7 +39,7 @@ export const AccountsUplinkTerminal = (properties, context) => {
return (
-
+
{body}
@@ -81,159 +78,95 @@ const AccountsUplinkTerminalContent = (props, context) => {
}
};
-const AccountsRecordList = (properties, context) => {
+const AccountsRecordList = (props, context) => {
const { act, data } = useBackend(context);
const { accounts } = data;
- const [searchText, setSearchText] = useLocalState(context, 'searchText', '');
- const [sortId, _setSortId] = useLocalState(context, 'sortId', 'owner_name');
- const [sortOrder, _setSortOrder] = useLocalState(context, 'sortOrder', true);
return (
-
-
-
-
-
-
- Account Holder
- Account Number
- Account Status
- Account Balance
-
- {accounts
- .filter(
- createSearch(searchText, (account) => {
- return (
- account.owner_name +
- '|' +
- account.account_number +
- '|' +
- account.suspended +
- '|' +
- account.money
- );
- })
- )
- .sort((a, b) => {
- const i = sortOrder ? 1 : -1;
- return a[sortId].localeCompare(b[sortId]) * i;
- })
- .map((account) => (
-
- act('view_account_detail', {
- account_num: account.account_number,
- })
- }
- >
-
- {account.owner_name}
-
- #{account.account_number}
- {account.suspended}
- {account.money}
-
- ))}
-
-
-
-
+ (
+ <>
+ {value}
+ >
+ ),
+ },
+ },
+ {
+ id: 'account_number',
+ name: 'Account Number',
+ datum: { children: (value) => <>#{value}> },
+ },
+ { id: 'suspended', name: 'Account Status' },
+ { id: 'money', name: 'Account Balance' },
+ ]}
+ data={accounts}
+ datumID={(datum) => datum.account_number}
+ leftButtons={
+ |