diff --git a/_maps/map_files/RandomRuins/SpaceRuins/debris1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/debris1.dmm
new file mode 100644
index 00000000000..af01a5bc274
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/debris1.dmm
@@ -0,0 +1,614 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/structure/disposalpipe/segment,
+/turf/space,
+/area/space)
+"c" = (
+/obj/structure/lattice,
+/obj/structure/disposalpipe/broken{
+ dir = 1
+ },
+/turf/space,
+/area/space)
+"d" = (
+/obj/structure/lattice,
+/turf/space,
+/area/template_noop)
+"e" = (
+/obj/structure/grille/broken,
+/turf/space,
+/area/space)
+"g" = (
+/obj/structure/disposalpipe/broken{
+ dir = 4
+ },
+/turf/space,
+/area/space)
+"h" = (
+/obj/structure/disposalpipe/broken{
+ dir = 8
+ },
+/obj/item/stack/cable_coil/cut,
+/turf/space,
+/area/space)
+"l" = (
+/obj/item/stack/cable_coil/cut,
+/turf/space,
+/area/space)
+"m" = (
+/obj/effect/spawner/random_spawners/grille_often,
+/turf/space,
+/area/space)
+"n" = (
+/obj/effect/spawner/random_spawners/grille_maybe,
+/turf/space,
+/area/space)
+"o" = (
+/obj/random/tool,
+/turf/space,
+/area/space)
+"p" = (
+/obj/structure/girder/displaced,
+/turf/space,
+/area/space)
+"r" = (
+/turf/space,
+/area/template_noop)
+"t" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/space,
+/area/space)
+"u" = (
+/obj/structure/door_assembly/door_assembly_sec,
+/obj/item/airlock_electronics,
+/turf/space,
+/area/space)
+"v" = (
+/obj/structure/lattice,
+/turf/space,
+/area/space)
+"x" = (
+/obj/structure/disposalpipe/junction,
+/turf/space,
+/area/space)
+"y" = (
+/turf/simulated/floor/plating/burnt,
+/area/space)
+"z" = (
+/obj/item/stack/sheet/metal,
+/turf/simulated/floor/plating,
+/area/space)
+"B" = (
+/obj/structure/lattice,
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/space)
+"C" = (
+/obj/structure/disposalpipe/broken{
+ dir = 1
+ },
+/turf/space,
+/area/space)
+"D" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0;
+ tag = ""
+ },
+/turf/simulated/floor/plating/burnt,
+/area/space)
+"E" = (
+/obj/item/stack/rods,
+/turf/space,
+/area/space)
+"F" = (
+/turf/simulated/floor/plating,
+/area/space)
+"G" = (
+/obj/random/toolbox,
+/turf/simulated/floor/plating/burnt,
+/area/space)
+"I" = (
+/obj/structure/grille/broken,
+/obj/structure/lattice,
+/turf/space,
+/area/space)
+"J" = (
+/obj/structure/disposalpipe/broken,
+/turf/space,
+/area/space)
+"K" = (
+/obj/item/shard,
+/turf/space,
+/area/space)
+"N" = (
+/obj/structure/lattice,
+/obj/structure/lattice,
+/turf/space,
+/area/space)
+"O" = (
+/obj/machinery/power/apc/worn_out{
+ pixel_y = -24
+ },
+/obj/structure/cable,
+/turf/simulated/floor/plating,
+/area/space)
+"Q" = (
+/obj/effect/decal/cleanable/shreds{
+ pixel_x = 4;
+ pixel_y = 3
+ },
+/turf/simulated/floor/plating,
+/area/space)
+"T" = (
+/obj/structure/girder,
+/turf/simulated/floor/plating/burnt,
+/area/space)
+"U" = (
+/obj/effect/spawner/random_barrier/wall_probably,
+/turf/space,
+/area/space)
+"V" = (
+/turf/simulated/wall,
+/area/space)
+"X" = (
+/turf/space,
+/area/space)
+"Y" = (
+/obj/item/shard,
+/turf/simulated/floor/plating,
+/area/space)
+"Z" = (
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/space)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+r
+r
+r
+r
+r
+r
+r
+r
+r
+d
+d
+d
+r
+r
+d
+r
+a
+a
+"}
+(3,1,1) = {"
+a
+d
+v
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+r
+a
+"}
+(4,1,1) = {"
+a
+d
+X
+m
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+v
+Z
+X
+X
+d
+a
+"}
+(5,1,1) = {"
+a
+r
+X
+g
+F
+X
+E
+I
+X
+X
+v
+X
+F
+v
+v
+X
+X
+X
+r
+a
+"}
+(6,1,1) = {"
+a
+r
+J
+x
+C
+E
+v
+F
+X
+E
+X
+v
+g
+Z
+X
+X
+F
+X
+r
+a
+"}
+(7,1,1) = {"
+a
+r
+X
+X
+y
+E
+X
+E
+Y
+X
+n
+X
+h
+E
+F
+X
+v
+X
+r
+a
+"}
+(8,1,1) = {"
+a
+r
+X
+X
+X
+B
+l
+p
+X
+X
+y
+p
+X
+X
+X
+E
+X
+X
+r
+a
+"}
+(9,1,1) = {"
+a
+r
+X
+v
+X
+o
+X
+X
+Z
+l
+X
+E
+a
+X
+X
+V
+X
+X
+r
+a
+"}
+(10,1,1) = {"
+a
+r
+X
+Z
+Q
+v
+X
+y
+v
+D
+y
+U
+X
+X
+E
+X
+X
+n
+r
+a
+"}
+(11,1,1) = {"
+a
+r
+X
+X
+I
+v
+v
+X
+v
+t
+O
+V
+X
+X
+F
+E
+Z
+X
+d
+a
+"}
+(12,1,1) = {"
+a
+r
+X
+X
+X
+X
+J
+b
+c
+v
+G
+V
+X
+E
+e
+X
+X
+X
+r
+a
+"}
+(13,1,1) = {"
+a
+r
+X
+X
+X
+V
+X
+Z
+X
+X
+X
+u
+X
+X
+X
+X
+e
+Z
+r
+a
+"}
+(14,1,1) = {"
+a
+r
+X
+X
+X
+X
+v
+X
+v
+N
+E
+E
+K
+X
+v
+o
+X
+X
+r
+a
+"}
+(15,1,1) = {"
+a
+r
+X
+E
+X
+X
+X
+X
+E
+J
+C
+X
+X
+X
+X
+X
+X
+X
+d
+a
+"}
+(16,1,1) = {"
+a
+r
+X
+X
+E
+X
+T
+X
+Z
+X
+n
+v
+X
+z
+n
+X
+Z
+X
+d
+a
+"}
+(17,1,1) = {"
+a
+r
+X
+X
+X
+X
+X
+X
+X
+X
+F
+X
+X
+X
+p
+X
+X
+X
+r
+a
+"}
+(18,1,1) = {"
+a
+r
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+X
+v
+X
+X
+X
+X
+r
+a
+"}
+(19,1,1) = {"
+a
+a
+r
+r
+r
+r
+d
+r
+d
+r
+r
+r
+r
+r
+r
+r
+r
+r
+a
+a
+"}
+(20,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/debris2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/debris2.dmm
new file mode 100644
index 00000000000..6a6cd81f32a
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/debris2.dmm
@@ -0,0 +1,631 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/simulated/floor/plating/airless,
+/area/space)
+"c" = (
+/turf/simulated/floor/plasteel/airless,
+/area/space)
+"d" = (
+/turf/simulated/wall/r_wall,
+/area/space)
+"e" = (
+/obj/item/stack/cable_coil/cut,
+/turf/space,
+/area/template_noop)
+"h" = (
+/obj/structure/girder,
+/turf/space,
+/area/template_noop)
+"j" = (
+/obj/structure/grille/broken,
+/turf/space,
+/area/space)
+"l" = (
+/obj/structure/girder,
+/turf/simulated/floor/plating,
+/area/space)
+"m" = (
+/obj/structure/grille/broken,
+/turf/template_noop,
+/area/space)
+"n" = (
+/obj/item/stack/cable_coil/cut,
+/turf/template_noop,
+/area/space)
+"o" = (
+/obj/machinery/door/airlock/command{
+ max_integrity = 40
+ },
+/turf/simulated/floor/plating/burnt,
+/area/space)
+"p" = (
+/mob/living/simple_animal/hostile/carp,
+/turf/space,
+/area/template_noop)
+"q" = (
+/obj/structure/lattice,
+/turf/space,
+/area/space)
+"s" = (
+/obj/item/stack/rods,
+/turf/space,
+/area/template_noop)
+"t" = (
+/obj/structure/door_assembly/door_assembly_com,
+/turf/space,
+/area/template_noop)
+"u" = (
+/obj/item/clothing/head/bio_hood/virology,
+/turf/space,
+/area/space)
+"w" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space)
+"x" = (
+/turf/template_noop,
+/area/space)
+"y" = (
+/obj/structure/lattice,
+/obj/structure/door_assembly/door_assembly_vault{
+ anchored = 1
+ },
+/turf/simulated/floor/plating,
+/area/space)
+"z" = (
+/obj/item/stack/rods,
+/turf/template_noop,
+/area/space)
+"A" = (
+/obj/structure/closet/crate,
+/obj/item/reagent_containers/glass/beaker/bluespace,
+/turf/simulated/floor/plasteel/airless,
+/area/space)
+"B" = (
+/obj/item/shard{
+ icon_state = "small"
+ },
+/turf/space,
+/area/space)
+"C" = (
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/template_noop)
+"D" = (
+/obj/effect/landmark/burnturf,
+/turf/simulated/floor/plating/airless,
+/area/space)
+"E" = (
+/obj/item/reagent_containers/glass/beaker/large,
+/turf/space,
+/area/template_noop)
+"F" = (
+/obj/effect/landmark/burnturf,
+/turf/simulated/floor,
+/area/space)
+"G" = (
+/obj/structure/safe,
+/obj/item/stack/sheet/mineral/bananium{
+ amount = 5
+ },
+/obj/item/stack/ore/bluespace_crystal/refined{
+ amount = 3
+ },
+/obj/item/dnainjector/comic,
+/turf/simulated/floor/plasteel/airless,
+/area/space)
+"H" = (
+/obj/structure/table,
+/obj/item/shard{
+ icon_state = "medium"
+ },
+/turf/simulated/floor/plasteel/airless,
+/area/space)
+"I" = (
+/turf/space,
+/area/template_noop)
+"J" = (
+/mob/living/simple_animal/hostile/carp,
+/turf/space,
+/area/space)
+"L" = (
+/obj/item/shard,
+/turf/space,
+/area/space)
+"M" = (
+/turf/simulated/floor,
+/area/space)
+"N" = (
+/obj/item/clothing/suit/bio_suit/virology,
+/turf/space,
+/area/space)
+"O" = (
+/obj/item/shard{
+ icon_state = "small"
+ },
+/turf/space,
+/area/template_noop)
+"P" = (
+/obj/item/reagent_containers/spray/cleaner,
+/turf/space,
+/area/space)
+"R" = (
+/obj/item/stack/sheet/metal,
+/turf/template_noop,
+/area/space)
+"S" = (
+/obj/item/reagent_containers/spray/cleaner,
+/turf/space,
+/area/template_noop)
+"T" = (
+/turf/simulated/wall,
+/area/space)
+"U" = (
+/obj/effect/landmark/burnturf,
+/turf/simulated/floor/plasteel/airless,
+/area/space)
+"V" = (
+/obj/structure/lattice,
+/turf/space,
+/area/template_noop)
+"W" = (
+/obj/effect/landmark/burnturf,
+/turf/simulated/floor/plating/burnt,
+/area/space)
+"X" = (
+/turf/space,
+/area/space)
+"Y" = (
+/obj/structure/girder/reinforced,
+/turf/simulated/floor/plating/damaged,
+/area/space)
+"Z" = (
+/obj/machinery/computer/pandemic{
+ circuit = /obj/effect/decal/cleanable/shreds
+ },
+/turf/simulated/floor/plasteel/airless,
+/area/space)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+d
+d
+d
+d
+d
+Y
+x
+S
+I
+I
+I
+I
+I
+I
+C
+I
+I
+I
+a
+"}
+(3,1,1) = {"
+a
+d
+G
+A
+U
+F
+d
+z
+T
+T
+T
+T
+o
+T
+I
+p
+O
+I
+I
+a
+"}
+(4,1,1) = {"
+a
+Y
+c
+U
+c
+U
+d
+X
+w
+M
+c
+U
+M
+T
+V
+I
+I
+I
+I
+a
+"}
+(5,1,1) = {"
+a
+Y
+M
+F
+F
+q
+d
+z
+m
+F
+M
+F
+M
+T
+I
+I
+I
+I
+I
+a
+"}
+(6,1,1) = {"
+a
+d
+d
+y
+d
+d
+Y
+X
+w
+X
+n
+X
+w
+T
+I
+I
+I
+C
+I
+a
+"}
+(7,1,1) = {"
+a
+X
+X
+X
+X
+X
+P
+J
+X
+T
+T
+T
+x
+T
+I
+I
+V
+I
+I
+a
+"}
+(8,1,1) = {"
+a
+X
+X
+X
+X
+X
+X
+X
+R
+X
+w
+X
+b
+x
+x
+I
+I
+I
+I
+a
+"}
+(9,1,1) = {"
+a
+p
+s
+T
+m
+w
+T
+R
+X
+B
+X
+w
+X
+x
+z
+I
+s
+I
+I
+a
+"}
+(10,1,1) = {"
+a
+s
+I
+T
+M
+F
+T
+X
+X
+X
+X
+X
+X
+x
+x
+I
+I
+I
+I
+a
+"}
+(11,1,1) = {"
+a
+I
+I
+T
+c
+F
+T
+X
+X
+c
+F
+b
+j
+D
+T
+I
+I
+I
+t
+a
+"}
+(12,1,1) = {"
+a
+C
+I
+T
+X
+M
+N
+s
+I
+I
+L
+q
+q
+b
+T
+I
+s
+I
+I
+a
+"}
+(13,1,1) = {"
+a
+I
+I
+l
+T
+T
+T
+I
+I
+u
+j
+W
+c
+U
+T
+I
+I
+I
+I
+a
+"}
+(14,1,1) = {"
+a
+I
+s
+p
+I
+I
+I
+I
+p
+I
+I
+c
+H
+Z
+T
+I
+I
+I
+I
+a
+"}
+(15,1,1) = {"
+a
+V
+I
+I
+s
+V
+C
+I
+I
+s
+h
+T
+T
+T
+T
+I
+I
+I
+I
+a
+"}
+(16,1,1) = {"
+a
+I
+I
+E
+I
+I
+V
+I
+O
+I
+V
+I
+I
+I
+I
+I
+C
+I
+I
+a
+"}
+(17,1,1) = {"
+a
+I
+I
+C
+I
+e
+I
+I
+I
+I
+I
+e
+I
+V
+I
+I
+I
+I
+I
+a
+"}
+(18,1,1) = {"
+a
+I
+I
+I
+I
+I
+I
+h
+I
+I
+C
+I
+I
+I
+I
+I
+I
+I
+I
+a
+"}
+(19,1,1) = {"
+a
+I
+I
+I
+I
+I
+I
+I
+I
+I
+I
+I
+I
+I
+C
+I
+I
+I
+I
+a
+"}
+(20,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/debris3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/debris3.dmm
new file mode 100644
index 00000000000..54d8725b3c4
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/debris3.dmm
@@ -0,0 +1,824 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/item/stack/rods,
+/turf/simulated/floor/plating/damaged,
+/area/template_noop)
+"c" = (
+/obj/item/trash/popcorn,
+/turf/space,
+/area/template_noop)
+"d" = (
+/obj/effect/spawner/random_spawners/wall_rusted_maybe,
+/turf/space,
+/area/template_noop)
+"e" = (
+/obj/item/poster/random_contraband,
+/turf/space,
+/area/template_noop)
+"f" = (
+/obj/structure/lattice,
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/template_noop)
+"g" = (
+/obj/item/paperplane,
+/turf/space,
+/area/template_noop)
+"h" = (
+/obj/item/trash/can,
+/turf/space,
+/area/template_noop)
+"i" = (
+/obj/item/stack/rods,
+/turf/template_noop,
+/area/template_noop)
+"k" = (
+/obj/item/shard,
+/turf/space,
+/area/template_noop)
+"l" = (
+/obj/item/stack/cable_coil{
+ amount = 10
+ },
+/turf/space,
+/area/template_noop)
+"m" = (
+/turf/simulated/wall,
+/area/template_noop)
+"n" = (
+/obj/item/stack/sheet/glass,
+/turf/space,
+/area/template_noop)
+"p" = (
+/obj/random/plushie,
+/turf/space,
+/area/template_noop)
+"q" = (
+/obj/item/stack/rods,
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/template_noop)
+"t" = (
+/obj/machinery/computer/arcade/battle,
+/turf/simulated/floor/plasteel/airless,
+/area/template_noop)
+"u" = (
+/obj/random/tool,
+/turf/space,
+/area/template_noop)
+"v" = (
+/obj/item/trash/syndi_cakes,
+/turf/space,
+/area/template_noop)
+"w" = (
+/obj/item/stack/tickets,
+/turf/space,
+/area/template_noop)
+"x" = (
+/obj/structure/bookcase/random/fiction,
+/turf/simulated/floor/plating/damaged,
+/area/template_noop)
+"y" = (
+/obj/item/storage/pill_bottle/random_meds/labelled,
+/turf/space,
+/area/template_noop)
+"z" = (
+/turf/simulated/floor/plating/damaged,
+/area/template_noop)
+"A" = (
+/turf/space,
+/area/template_noop)
+"B" = (
+/obj/item/stack/rods,
+/turf/space,
+/area/template_noop)
+"D" = (
+/obj/item/paper,
+/obj/item/paper,
+/turf/space,
+/area/template_noop)
+"F" = (
+/obj/random/tool,
+/turf/simulated/floor/plating/damaged,
+/area/template_noop)
+"G" = (
+/obj/item/poster/random_official,
+/turf/space,
+/area/template_noop)
+"H" = (
+/obj/item/stack/sheet/wood,
+/turf/space,
+/area/template_noop)
+"I" = (
+/obj/item/stack/rods,
+/obj/item/stack/rods,
+/turf/space,
+/area/template_noop)
+"J" = (
+/obj/item/trash/pistachios,
+/turf/space,
+/area/template_noop)
+"K" = (
+/obj/structure/lattice,
+/obj/structure/girder,
+/turf/space,
+/area/template_noop)
+"L" = (
+/obj/structure/girder,
+/turf/space,
+/area/template_noop)
+"M" = (
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/template_noop)
+"O" = (
+/obj/structure/girder/displaced,
+/turf/space,
+/area/template_noop)
+"S" = (
+/obj/structure/lattice,
+/turf/space,
+/area/template_noop)
+"U" = (
+/obj/item/stack/sheet/wood,
+/obj/item/stack/sheet/wood,
+/turf/space,
+/area/template_noop)
+"V" = (
+/obj/item/circuitboard/arcade,
+/turf/space,
+/area/template_noop)
+"W" = (
+/obj/item/stack/tickets,
+/obj/item/stack/tickets,
+/obj/item/stack/tickets,
+/turf/space,
+/area/template_noop)
+"Z" = (
+/obj/item/paper,
+/turf/space,
+/area/template_noop)
+
+(1,1,1) = {"
+a
+a
+a
+i
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+i
+a
+a
+a
+a
+a
+i
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+A
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+A
+B
+A
+B
+A
+A
+A
+A
+A
+A
+A
+A
+B
+B
+A
+A
+a
+a
+"}
+(5,1,1) = {"
+i
+a
+A
+A
+A
+A
+A
+w
+A
+M
+A
+A
+A
+A
+A
+A
+A
+A
+a
+i
+"}
+(6,1,1) = {"
+a
+a
+A
+A
+I
+A
+B
+A
+A
+B
+B
+M
+A
+A
+M
+A
+A
+A
+a
+a
+"}
+(7,1,1) = {"
+a
+a
+A
+A
+k
+A
+A
+O
+A
+A
+A
+A
+m
+A
+w
+A
+M
+A
+a
+a
+"}
+(8,1,1) = {"
+a
+a
+A
+B
+A
+M
+A
+A
+H
+A
+G
+n
+m
+A
+A
+B
+A
+A
+a
+a
+"}
+(9,1,1) = {"
+a
+a
+A
+A
+m
+A
+w
+A
+M
+S
+A
+A
+d
+B
+M
+A
+O
+A
+a
+a
+"}
+(10,1,1) = {"
+a
+a
+A
+w
+A
+A
+Z
+A
+W
+B
+S
+h
+M
+L
+A
+c
+A
+A
+a
+a
+"}
+(11,1,1) = {"
+a
+i
+B
+w
+A
+S
+A
+F
+A
+A
+S
+A
+Z
+A
+A
+A
+M
+A
+a
+a
+"}
+(12,1,1) = {"
+a
+a
+A
+A
+A
+A
+H
+L
+S
+m
+m
+b
+A
+A
+Z
+w
+B
+A
+i
+a
+"}
+(13,1,1) = {"
+a
+a
+A
+A
+B
+O
+A
+B
+A
+M
+A
+D
+K
+z
+S
+H
+B
+A
+a
+a
+"}
+(14,1,1) = {"
+a
+a
+A
+n
+A
+y
+f
+B
+A
+z
+B
+A
+m
+t
+A
+A
+A
+A
+a
+a
+"}
+(15,1,1) = {"
+a
+a
+A
+A
+z
+H
+A
+A
+A
+S
+A
+q
+z
+z
+A
+A
+O
+A
+a
+a
+"}
+(16,1,1) = {"
+a
+a
+A
+A
+S
+A
+S
+U
+B
+B
+A
+A
+S
+A
+M
+B
+u
+A
+a
+i
+"}
+(17,1,1) = {"
+a
+a
+A
+M
+H
+w
+Z
+B
+x
+S
+B
+S
+A
+k
+J
+A
+A
+A
+a
+a
+"}
+(18,1,1) = {"
+a
+a
+B
+A
+A
+A
+A
+A
+A
+w
+B
+z
+A
+O
+A
+M
+A
+A
+a
+a
+"}
+(19,1,1) = {"
+i
+a
+A
+A
+M
+z
+S
+w
+S
+M
+A
+m
+p
+A
+A
+B
+A
+A
+a
+a
+"}
+(20,1,1) = {"
+a
+a
+A
+B
+A
+O
+H
+v
+A
+V
+H
+A
+B
+L
+A
+M
+A
+w
+a
+a
+"}
+(21,1,1) = {"
+a
+a
+A
+A
+A
+A
+e
+M
+A
+w
+Z
+w
+B
+A
+w
+A
+A
+A
+a
+a
+"}
+(22,1,1) = {"
+a
+a
+A
+A
+M
+O
+m
+m
+L
+A
+B
+A
+A
+q
+A
+A
+A
+A
+a
+a
+"}
+(23,1,1) = {"
+a
+a
+A
+B
+k
+A
+B
+A
+B
+g
+n
+A
+O
+A
+A
+B
+B
+A
+a
+a
+"}
+(24,1,1) = {"
+a
+a
+A
+A
+A
+A
+A
+M
+A
+A
+l
+A
+w
+A
+A
+A
+A
+A
+a
+a
+"}
+(25,1,1) = {"
+a
+a
+A
+w
+B
+A
+A
+A
+A
+A
+A
+B
+A
+A
+A
+w
+A
+A
+a
+a
+"}
+(26,1,1) = {"
+a
+a
+A
+A
+A
+A
+A
+A
+B
+A
+B
+A
+A
+B
+A
+B
+A
+A
+a
+a
+"}
+(27,1,1) = {"
+a
+a
+B
+A
+w
+A
+B
+A
+w
+A
+B
+A
+A
+A
+A
+A
+A
+w
+a
+a
+"}
+(28,1,1) = {"
+a
+a
+A
+A
+A
+A
+A
+A
+A
+w
+A
+A
+A
+A
+A
+A
+A
+A
+a
+i
+"}
+(29,1,1) = {"
+i
+a
+a
+a
+a
+a
+a
+i
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(30,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+i
+a
+a
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
index 32d5ea2af1d..5607083f0a8 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
@@ -99,6 +99,12 @@
/obj/item/tank/air,
/turf/simulated/floor/plasteel,
/area/ruin/powered)
+"u" = (
+/obj/machinery/tcomms/relay/ruskie{
+ network_id = "LISTENINGOUTPOST-RELAY"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/powered)
"w" = (
/obj/machinery/light/small,
/turf/simulated/floor/plasteel,
@@ -922,7 +928,7 @@ b
f
f
f
-c
+f
f
D
m
@@ -964,7 +970,7 @@ f
f
p
Y
-f
+u
f
j
i
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm
new file mode 100644
index 00000000000..ec11a787510
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/syndiecakesfactory.dmm
@@ -0,0 +1,2284 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aM" = (
+/obj/item/stack/rods,
+/obj/item/stack/sheet/metal,
+/turf/template_noop,
+/area/space)
+"bb" = (
+/obj/structure/table/reinforced,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/stack/sheet/mineral/plasma,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"bk" = (
+/obj/structure/grille/broken,
+/turf/template_noop,
+/area/space)
+"cc" = (
+/obj/item/reagent_containers/food/snacks/syndicake,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/turf/simulated/floor/plating,
+/area/space)
+"dy" = (
+/obj/structure/lattice,
+/turf/unsimulated,
+/area/template_noop)
+"es" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"eY" = (
+/turf/simulated/floor/plating,
+/area/ruin)
+"fq" = (
+/obj/machinery/autolathe,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"fU" = (
+/obj/machinery/door/airlock/mining/glass{
+ locked = 1;
+ name = "Egg processing"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"fY" = (
+/obj/item/stack/sheet/metal,
+/turf/template_noop,
+/area/template_noop)
+"hm" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"ho" = (
+/turf/space,
+/area/ruin/space)
+"hs" = (
+/turf/unsimulated/wall/fakeglass{
+ dir = 4
+ },
+/area/ruin/unpowered)
+"iK" = (
+/obj/item/stack/sheet/metal,
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/ruin/space)
+"jf" = (
+/obj/item/trash/syndi_cakes,
+/turf/template_noop,
+/area/template_noop)
+"jv" = (
+/obj/item/stack/cable_coil/cut,
+/turf/template_noop,
+/area/space)
+"jR" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/cigarettes/cigpack_random,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"ke" = (
+/obj/structure/lattice,
+/turf/space,
+/area/ruin)
+"kh" = (
+/obj/structure/lattice,
+/obj/item/stack/rods,
+/turf/template_noop,
+/area/space)
+"ky" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/turf/simulated/wall,
+/area/ruin/unpowered)
+"ls" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space)
+"lK" = (
+/obj/machinery/power/apc/noalarm{
+ area = null;
+ dir = 8;
+ keep_preset_name = 1;
+ light_power = 0;
+ locked = 0;
+ max_integrity = 0;
+ name = "Manufacturing control room APC";
+ pixel_y = -24;
+ shorted = 1;
+ start_charge = -1
+ },
+/obj/structure/cable{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"mc" = (
+/obj/structure/grille/broken,
+/turf/space,
+/area/ruin/space)
+"mx" = (
+/obj/item/trash/syndi_cakes,
+/turf/template_noop,
+/area/space)
+"nV" = (
+/obj/machinery/conveyor/east{
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/space)
+"ob" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/ruin/unpowered)
+"om" = (
+/obj/item/reagent_containers/food/snacks/syndicake,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/turf/simulated/floor/plasteel,
+/area/space)
+"oJ" = (
+/obj/item/stack/rods,
+/turf/template_noop,
+/area/space)
+"oO" = (
+/obj/machinery/door/airlock/mining/glass{
+ name = "Nexus"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"pb" = (
+/obj/structure/lattice/catwalk,
+/turf/template_noop,
+/area/space)
+"pd" = (
+/turf/template_noop,
+/area/space)
+"pp" = (
+/turf/unsimulated,
+/area/space)
+"pR" = (
+/obj/machinery/conveyor/northeast{
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"qS" = (
+/obj/machinery/door/airlock/mining/glass{
+ name = "EVA Storage"
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0;
+ tag = ""
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"rJ" = (
+/obj/structure/lattice,
+/turf/space,
+/area/ruin/space)
+"rL" = (
+/obj/item/reagent_containers/food/snacks/syndicake,
+/turf/simulated/floor/plasteel/airless,
+/area/ruin)
+"rU" = (
+/obj/machinery/space_heater,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"sd" = (
+/turf/simulated/floor/plating,
+/area/space)
+"sN" = (
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"ub" = (
+/obj/item/stack/rods,
+/turf/space,
+/area/space)
+"uA" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/food/snacks/syndicake,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"uF" = (
+/obj/machinery/conveyor/east{
+ id = null
+ },
+/obj/machinery/gibber/autogibber,
+/obj/structure/plasticflaps{
+ canmove = 0
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"wB" = (
+/obj/item/trash/syndi_cakes,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"xT" = (
+/turf/unsimulated/floor/plating/airless,
+/area/space)
+"yU" = (
+/obj/item/stack/sheet/metal,
+/obj/item/stack/sheet/metal,
+/turf/space,
+/area/space)
+"zd" = (
+/obj/machinery/power/apc/noalarm{
+ area = null;
+ dir = 8;
+ keep_preset_name = 1;
+ locked = 0;
+ name = "EVA room APC";
+ pixel_x = -24;
+ start_charge = -1
+ },
+/obj/structure/cable{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"zo" = (
+/turf/simulated/wall,
+/area/space)
+"zt" = (
+/obj/item/stack/sheet/metal,
+/turf/template_noop,
+/area/space)
+"zF" = (
+/turf/unsimulated/wall/fakeglass{
+ dir = 8
+ },
+/area/ruin/unpowered)
+"zP" = (
+/obj/structure/rack{
+ dir = 4
+ },
+/obj/random/tool,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"zY" = (
+/obj/structure/table/reinforced,
+/obj/machinery/light,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"AH" = (
+/obj/structure/lattice,
+/obj/item/stack/sheet/metal,
+/turf/template_noop,
+/area/template_noop)
+"AJ" = (
+/obj/effect/spawner/random_spawners/wall_rusted_probably,
+/turf/simulated/wall,
+/area/space)
+"BG" = (
+/obj/machinery/door/airlock/mining/glass{
+ locked = 1;
+ name = "Manufacturing Control Room"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"BI" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Cp" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"CY" = (
+/obj/item/stack/rods,
+/turf/template_noop,
+/area/template_noop)
+"Da" = (
+/turf/space,
+/area/space)
+"Dz" = (
+/mob/living/simple_animal/pet/dog/corgi,
+/obj/machinery/conveyor/east{
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Ej" = (
+/obj/structure/closet/emcloset,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"EJ" = (
+/turf/simulated/wall,
+/area/ruin/unpowered)
+"Fw" = (
+/obj/item/stack/cable_coil/cut,
+/turf/template_noop,
+/area/template_noop)
+"FO" = (
+/obj/machinery/suit_storage_unit/syndicate,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Gm" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0;
+ tag = ""
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"GB" = (
+/mob/living/simple_animal/pet/dog/corgi,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Hx" = (
+/mob/living/simple_animal/pet/dog/corgi,
+/mob/living/simple_animal/pet/dog/corgi,
+/obj/machinery/conveyor/east{
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Hy" = (
+/turf/template_noop,
+/area/template_noop)
+"HQ" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Ic" = (
+/turf/simulated/floor/plating/burnt,
+/area/ruin)
+"Id" = (
+/obj/effect/spawner/random_spawners/oil_maybe,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"IB" = (
+/obj/structure/lattice,
+/turf/space,
+/area/ruin/unpowered)
+"JI" = (
+/obj/effect/spawner/random_spawners/syndicate/loot,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Ki" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/template_noop)
+"Kr" = (
+/obj/structure/girder,
+/turf/simulated/floor/plating,
+/area/ruin/unpowered)
+"KD" = (
+/turf/simulated/floor/plating,
+/area/ruin/unpowered)
+"KS" = (
+/turf/unsimulated/floor/plating/airless,
+/area/ruin)
+"Le" = (
+/obj/structure/cable{
+ d2 = 4;
+ icon_state = "0-4"
+ },
+/obj/machinery/power/port_gen/pacman,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Mi" = (
+/turf/unsimulated,
+/area/template_noop)
+"Mz" = (
+/turf/simulated/floor/plasteel,
+/area/ruin)
+"Nw" = (
+/obj/machinery/power/smes,
+/obj/structure/cable/blue{
+ d2 = 2;
+ icon_state = "0-2"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"NQ" = (
+/obj/structure/lattice,
+/turf/space,
+/area/space)
+"OA" = (
+/obj/structure/computerframe,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"OK" = (
+/obj/item/reagent_containers/food/snacks/syndicake,
+/turf/space,
+/area/space)
+"OU" = (
+/turf/simulated/floor/plasteel/airless,
+/area/ruin)
+"Qv" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/item/trash/syndi_cakes,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"QF" = (
+/obj/machinery/conveyor/east{
+ dir = 2;
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin)
+"QI" = (
+/obj/effect/spawner/random_spawners/wall_rusted_probably,
+/turf/simulated/wall,
+/area/ruin)
+"Ra" = (
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Rg" = (
+/obj/machinery/door/airlock/mining/glass{
+ locked = 1;
+ max_integrity = 300000;
+ name = "Corgi processing";
+ normal_integrity = 300000
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Ry" = (
+/obj/item/stack/cable_coil/random,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"RB" = (
+/mob/living/simple_animal/hostile/alien/sentinel{
+ animal_species = /mob/living/simple_animal/pet/dog;
+ attack_sound = 'sound/weapons/bite.ogg';
+ attacktext = "bites";
+ damage_coeff = list("brute" = 1, "fire" = 1, "tox" = 1, "clone" = 1, "stamina" = 1, "oxy" = 1);
+ death_sound = null;
+ deathmessage = "";
+ desc = "This is no longer a goodboy. Not anymore. He has seen too much.";
+ icon = 'icons/mob/pets.dmi';
+ icon_living = "corgi";
+ icon_state = "corgi";
+ name = "angry corgi";
+ retreat_distance = 2
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Tj" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/syndicate,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Tt" = (
+/obj/machinery/door/airlock/external,
+/turf/simulated/floor/plating,
+/area/ruin/powered)
+"TM" = (
+/obj/structure/chair/office/dark{
+ dir = 4;
+ icon_state = "officechair_dark";
+ tag = "icon-officechair_dark (EAST)"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"TT" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8";
+ tag = ""
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4";
+ tag = "90Curve"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Uq" = (
+/obj/machinery/conveyor/east{
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin)
+"UC" = (
+/obj/machinery/tcomms/relay/ruskie{
+ network_id = "SYNDICAKES-FACTORY"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"UR" = (
+/obj/item/trash/syndi_cakes,
+/turf/space,
+/area/space)
+"Vf" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Vt" = (
+/obj/machinery/conveyor/north/ccw{
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"VH" = (
+/obj/structure/lattice,
+/obj/random/tool,
+/turf/space,
+/area/space)
+"VR" = (
+/obj/structure/lattice,
+/turf/unsimulated,
+/area/space)
+"WL" = (
+/turf/space,
+/area/ruin/unpowered)
+"Xd" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ icon_state = "2-8"
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"XZ" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/dispenser/oxygen,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"YR" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"YU" = (
+/obj/structure/chair/office/dark,
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Zs" = (
+/obj/machinery/conveyor/east{
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/ruin/unpowered)
+"Zt" = (
+/obj/machinery/conveyor/east{
+ dir = 2;
+ id = null
+ },
+/turf/simulated/floor/plasteel,
+/area/space)
+
+(1,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(2,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(3,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+ob
+ob
+ob
+ob
+ob
+ob
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+Ki
+Ki
+Ki
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(4,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+Le
+Vf
+zd
+rU
+sN
+FO
+EJ
+EJ
+EJ
+pb
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(5,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+JI
+GB
+Vf
+sN
+sN
+EJ
+Ra
+sN
+Gm
+sN
+sN
+sN
+Tt
+KD
+Tt
+pb
+pb
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(6,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+sN
+Hx
+GB
+Dz
+sN
+EJ
+Nw
+hm
+TT
+Id
+sN
+Ej
+EJ
+EJ
+EJ
+pb
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(7,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+sN
+Dz
+sN
+Dz
+sN
+EJ
+UC
+sN
+Gm
+sN
+sN
+zY
+EJ
+pd
+pd
+ls
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(8,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+sN
+Zs
+sN
+Zs
+sN
+EJ
+fq
+sN
+Gm
+sN
+YU
+OA
+EJ
+pd
+pd
+ls
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(9,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+sN
+Zs
+sN
+Zs
+Id
+EJ
+sN
+GB
+Gm
+TM
+sN
+sN
+EJ
+pd
+pd
+ls
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(10,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+pR
+Vt
+Vt
+Vt
+sN
+EJ
+XZ
+BI
+Gm
+uA
+OA
+jR
+EJ
+pd
+pd
+ls
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(11,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+Zs
+EJ
+EJ
+EJ
+Rg
+EJ
+EJ
+EJ
+qS
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+EJ
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(12,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+Zs
+zF
+TM
+Qv
+lK
+EJ
+sN
+Vf
+Gm
+sN
+sN
+Ry
+Kr
+OU
+OU
+OU
+EJ
+pd
+pd
+pd
+OK
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(13,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+Zs
+hs
+Tj
+zP
+Xd
+ky
+Cp
+Cp
+es
+sN
+rJ
+rJ
+Kr
+rL
+eY
+OU
+EJ
+pd
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(14,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+Zs
+EJ
+sN
+wB
+sN
+BG
+sN
+sN
+sN
+sN
+sN
+sN
+oO
+OU
+eY
+eY
+EJ
+pd
+pd
+pd
+pd
+oJ
+Hy
+Hy
+Hy
+Hy
+Hy
+fY
+Hy
+Hy
+Hy
+Hy
+"}
+(15,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+Zs
+zF
+TM
+RB
+wB
+EJ
+IB
+sN
+sN
+sN
+sN
+sN
+EJ
+eY
+eY
+rJ
+EJ
+pd
+pd
+mx
+pd
+pd
+pd
+Hy
+fY
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(16,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+Zs
+hs
+bb
+OA
+sN
+EJ
+WL
+IB
+sN
+YR
+HQ
+HQ
+EJ
+OU
+eY
+rJ
+EJ
+zt
+oJ
+pd
+pd
+pd
+jv
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(17,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+EJ
+uF
+EJ
+EJ
+EJ
+fU
+EJ
+EJ
+EJ
+oO
+EJ
+EJ
+EJ
+EJ
+OU
+eY
+OK
+Da
+pd
+pd
+NQ
+zt
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(18,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+VR
+Uq
+OU
+OU
+KS
+KS
+Mz
+ho
+OU
+OU
+OU
+OU
+ho
+iK
+eY
+Da
+OK
+OK
+pd
+pd
+NQ
+zo
+pd
+pd
+pd
+pd
+OK
+Hy
+Hy
+fY
+Hy
+Hy
+Hy
+"}
+(19,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+pd
+rJ
+rJ
+rJ
+KS
+rJ
+KS
+rJ
+Ic
+Ic
+ub
+NQ
+OU
+eY
+NQ
+NQ
+Da
+OK
+yU
+Da
+NQ
+AJ
+pd
+OK
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(20,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+pd
+nV
+xT
+mc
+KS
+mc
+KS
+KS
+Da
+NQ
+Da
+NQ
+Da
+Da
+UR
+ub
+Da
+Da
+pd
+pd
+NQ
+NQ
+pd
+pd
+pd
+zt
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(21,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Ki
+pp
+pd
+Zt
+rJ
+Zt
+Zt
+NQ
+Ic
+Da
+Da
+Da
+Da
+OK
+Da
+Da
+OK
+OK
+Da
+pd
+NQ
+Da
+Da
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+Hy
+Ki
+Hy
+Hy
+"}
+(22,1,1) = {"
+Hy
+Hy
+CY
+Hy
+Hy
+Hy
+Hy
+pp
+pd
+pd
+zo
+pd
+zo
+zo
+NQ
+ub
+Da
+Da
+Da
+Da
+Da
+Da
+Da
+Da
+Da
+ub
+zt
+pd
+pd
+pd
+mx
+pd
+pd
+pd
+pd
+OK
+Hy
+Hy
+Hy
+Hy
+"}
+(23,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Ki
+Mi
+dy
+VR
+pd
+pd
+pd
+pd
+pd
+zt
+pd
+pd
+Ic
+OU
+OU
+Da
+NQ
+pd
+pd
+pd
+pd
+pd
+pd
+oJ
+pd
+zt
+ls
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+"}
+(24,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Ki
+Hy
+Hy
+Hy
+Ki
+Hy
+pd
+oJ
+OK
+pd
+pd
+bk
+NQ
+QF
+QF
+QF
+QF
+Da
+sd
+oJ
+pd
+pd
+pd
+cc
+VH
+pd
+pd
+pd
+pd
+pd
+pd
+ls
+Hy
+Hy
+Hy
+Hy
+"}
+(25,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+CY
+Hy
+Hy
+Hy
+Hy
+pd
+pd
+ke
+OK
+pd
+zo
+NQ
+NQ
+QI
+NQ
+NQ
+pd
+pd
+zt
+NQ
+NQ
+om
+zo
+pd
+OK
+pd
+oJ
+pd
+pd
+zt
+Hy
+Hy
+Hy
+Hy
+"}
+(26,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Ki
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+NQ
+ls
+pd
+pd
+pd
+pd
+pd
+zo
+zo
+Da
+Da
+pd
+oJ
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+"}
+(27,1,1) = {"
+Hy
+Hy
+CY
+Hy
+Hy
+Hy
+Hy
+AH
+CY
+CY
+Hy
+fY
+Hy
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+OK
+pd
+oJ
+pd
+mx
+pd
+pd
+OK
+pd
+pd
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+"}
+(28,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+pd
+NQ
+OK
+pd
+pd
+aM
+pd
+mx
+pd
+pd
+pd
+oJ
+pd
+pd
+pd
+pd
+pd
+pd
+aM
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+jf
+"}
+(29,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+CY
+Hy
+Hy
+Hy
+Hy
+CY
+Hy
+Hy
+Hy
+Fw
+Hy
+pd
+oJ
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+OK
+oJ
+pd
+kh
+pd
+pd
+pd
+pd
+pd
+pd
+Hy
+Hy
+Hy
+fY
+Hy
+Hy
+"}
+(30,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+CY
+CY
+Hy
+pd
+pd
+pd
+pd
+ls
+pd
+OK
+pd
+pd
+pd
+pd
+pd
+pd
+pd
+oJ
+zt
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(31,1,1) = {"
+Hy
+Hy
+Hy
+fY
+Hy
+Hy
+Ki
+Hy
+Hy
+Hy
+Ki
+Hy
+CY
+Hy
+Hy
+Hy
+Hy
+pd
+pd
+pd
+pd
+pd
+ls
+pd
+pd
+oJ
+pd
+pd
+aM
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(32,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+fY
+Hy
+Hy
+Hy
+Hy
+kh
+pd
+pd
+zt
+pd
+pd
+ls
+pd
+pd
+pd
+pd
+pd
+pd
+Hy
+Hy
+Fw
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(33,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+CY
+Hy
+CY
+Hy
+fY
+Hy
+Hy
+Hy
+Hy
+Hy
+jf
+Hy
+Hy
+Hy
+Hy
+pd
+pd
+pd
+pd
+pd
+NQ
+zt
+pd
+pd
+oJ
+pd
+fY
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(34,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+CY
+Hy
+Hy
+Hy
+CY
+Hy
+fY
+Hy
+CY
+Hy
+Hy
+pd
+oJ
+pd
+pd
+OK
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(35,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Ki
+Hy
+Hy
+Hy
+CY
+CY
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+pd
+pd
+ls
+pd
+pd
+pd
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+fY
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(36,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+CY
+Hy
+Hy
+Hy
+Hy
+fY
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(37,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Fw
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(38,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(39,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+jf
+Hy
+Hy
+Hy
+Hy
+fY
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
+(40,1,1) = {"
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+Hy
+"}
diff --git a/_maps/map_files/shuttles/admin_armory.dmm b/_maps/map_files/shuttles/admin_armory.dmm
new file mode 100644
index 00000000000..837f867a52b
--- /dev/null
+++ b/_maps/map_files/shuttles/admin_armory.dmm
@@ -0,0 +1,1691 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ae" = (
+/obj/structure/sign/securearea,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall4";
+ tag = "icon-swall14"
+ },
+/area/shuttle/administration)
+"al" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/table/reinforced,
+/obj/item/folder,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"aI" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/machinery/recharger,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"aP" = (
+/obj/machinery/vending/security,
+/obj/machinery/light/spot{
+ dir = 8;
+ icon_state = "tube1";
+ tag = "icon-tube1 (WEST)"
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"bi" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid,
+/obj/item/storage/firstaid/brute,
+/obj/item/storage/box/bodybags,
+/obj/item/storage/firstaid/surgery,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"bm" = (
+/obj/structure/grille,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id_tag = "adminarmoryshutters"
+ },
+/obj/structure/window/full/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"ce" = (
+/obj/machinery/autolathe/upgraded{
+ hacked = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"cl" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"cV" = (
+/obj/structure/closet/emcloset,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"de" = (
+/obj/machinery/suit_storage_unit/security/secure,
+/obj/machinery/light/spot,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"df" = (
+/obj/structure/rack,
+/obj/item/storage/box/buck{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/buck,
+/obj/structure/window/reinforced,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"dn" = (
+/obj/machinery/computer/camera_advanced/shuttle_docker/admin{
+ name = "NRV Sparta navigation computer"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"dH" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/gun/energy/gun,
+/obj/item/gun/energy/gun{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"dP" = (
+/obj/machinery/recharge_station/upgraded,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"eI" = (
+/obj/machinery/turretid/stun{
+ check_access = 0;
+ name = "Shuttle Turret Control";
+ pixel_y = 30
+ },
+/obj/machinery/computer/camera_advanced,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"eL" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"fo" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/machinery/light/spot,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"fF" = (
+/obj/machinery/light/spot{
+ dir = 4;
+ icon_state = "tube1";
+ tag = "icon-tube1 (EAST)"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"fQ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"gd" = (
+/obj/machinery/door/airlock/shuttle,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"gh" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"gj" = (
+/obj/machinery/computer/communications{
+ name = "NRV Sparta Communications Console"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"hN" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"ir" = (
+/obj/structure/closet/emcloset,
+/obj/machinery/light/spot{
+ dir = 1;
+ icon_state = "tube1";
+ tag = "icon-tube1 (NORTH)"
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"iz" = (
+/obj/machinery/porta_turret{
+ installation = /obj/item/gun/energy/gun
+ },
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"jn" = (
+/obj/machinery/door/poddoor/shutters{
+ density = 0;
+ dir = 2;
+ icon_state = "open";
+ id_tag = "Asclshutters";
+ name = "Blast Shutters";
+ opacity = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/full/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"jB" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/lockbox/mindshield,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"jU" = (
+/obj/machinery/suit_storage_unit/security/secure,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"kf" = (
+/obj/structure/sign/securearea,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall8";
+ tag = "icon-swall12"
+ },
+/area/shuttle/administration)
+"mq" = (
+/obj/structure/grille,
+/obj/machinery/door/poddoor/shutters{
+ density = 0;
+ dir = 2;
+ icon_state = "open";
+ id_tag = "Asclshutters";
+ name = "Blast Shutters";
+ opacity = 0
+ },
+/obj/structure/window/full/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"mw" = (
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"mM" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall13"
+ },
+/area/shuttle/administration)
+"nG" = (
+/obj/structure/window/full/shuttle,
+/obj/structure/grille,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"oj" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/machinery/light/spot,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"oY" = (
+/obj/structure/chair,
+/obj/machinery/light/spot{
+ dir = 1;
+ icon_state = "tube1";
+ tag = "icon-tube1 (NORTH)"
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"pa" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall11"
+ },
+/area/shuttle/administration)
+"pK" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4;
+ icon_state = "propulsion"
+ },
+/turf/simulated/shuttle/plating,
+/area/shuttle/administration)
+"pQ" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"qQ" = (
+/obj/machinery/recharger/wallcharger{
+ pixel_y = 25
+ },
+/obj/machinery/recharger/wallcharger{
+ pixel_y = 35
+ },
+/obj/machinery/light/spot{
+ dir = 1;
+ icon_state = "tube1";
+ tag = "icon-tube1 (NORTH)"
+ },
+/obj/machinery/door_control{
+ id = "adminshuttlebridge";
+ name = "Bridge Privacy Shutters";
+ pixel_x = 25;
+ req_access_txt = "19"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"rb" = (
+/obj/machinery/door/window/brigdoor/southleft{
+ req_one_access_txt = "2;19"
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"rW" = (
+/obj/structure/grille,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id_tag = "adminshuttlebridge"
+ },
+/obj/structure/window/full/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"sq" = (
+/obj/structure/table/reinforced,
+/obj/item/kitchen/knife/combat{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/kitchen/knife/combat,
+/obj/item/kitchen/knife/combat{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"tx" = (
+/obj/machinery/sleeper/upgraded{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"ua" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/machinery/door_control{
+ dir = 4;
+ id = "Asclshutters";
+ name = "External Window Shutter Control";
+ pixel_x = -5;
+ pixel_y = 35;
+ req_access_txt = "19"
+ },
+/obj/machinery/keycard_auth{
+ pixel_y = 24
+ },
+/obj/machinery/door_control{
+ id = "asclblast";
+ name = "Airlock Blast Door Control";
+ pixel_x = 5;
+ pixel_y = 35;
+ req_access = null;
+ req_access_txt = "19"
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"uz" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall4";
+ tag = "icon-swall14"
+ },
+/area/shuttle/administration)
+"uW" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 4;
+ icon_state = "heater"
+ },
+/obj/structure/window/plasmareinforced{
+ dir = 8
+ },
+/turf/simulated/shuttle/plating,
+/area/shuttle/administration)
+"uY" = (
+/obj/structure/window/reinforced,
+/obj/structure/table/reinforced,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"vk" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall_s6"
+ },
+/area/shuttle/administration)
+"vy" = (
+/obj/structure/table/reinforced,
+/obj/item/stack/sheet/metal/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"vA" = (
+/obj/machinery/light/spot{
+ dir = 1;
+ icon_state = "tube1";
+ tag = "icon-tube1 (NORTH)"
+ },
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"vW" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/storage/box/handcuffs,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"wG" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/item/clothing/suit/armor/bulletproof{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/item/clothing/head/helmet/alt,
+/obj/item/clothing/suit/armor/bulletproof{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/item/clothing/head/helmet/alt,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"wH" = (
+/obj/machinery/light/spot{
+ dir = 8;
+ icon_state = "tube1";
+ tag = "icon-tube1 (WEST)"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"wQ" = (
+/obj/machinery/door/poddoor/shutters{
+ density = 0;
+ dir = 8;
+ icon_state = "open";
+ id_tag = "Asclshutters";
+ name = "Blast Shutters";
+ opacity = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/full/shuttle,
+/turf/space,
+/area/shuttle/administration)
+"xm" = (
+/obj/structure/table/reinforced,
+/obj/item/rcd/preloaded,
+/obj/item/rcd_ammo,
+/obj/item/rcd_ammo{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/item/rcd_ammo{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"xF" = (
+/obj/structure/rack,
+/obj/item/storage/box/buck{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/buck,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"xH" = (
+/obj/machinery/door/airlock/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"xK" = (
+/obj/structure/sign/nosmoking_2,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall3";
+ tag = "icon-swall3"
+ },
+/area/shuttle/administration)
+"xQ" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/obj/machinery/light/spot{
+ dir = 1;
+ icon_state = "tube1";
+ tag = "icon-tube1 (NORTH)"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"xU" = (
+/obj/structure/table/reinforced,
+/obj/item/stack/sheet/metal/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"xZ" = (
+/turf/space,
+/area/shuttle/administration)
+"yg" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/brigdoor/eastleft{
+ name = "Armory";
+ req_access_txt = "3"
+ },
+/obj/machinery/door/window/brigdoor/westleft{
+ name = "Armory"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id_tag = "adminarmoryshutters"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"yu" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger{
+ pixel_x = -5
+ },
+/obj/machinery/recharger{
+ pixel_x = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"yF" = (
+/obj/machinery/status_display,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall3"
+ },
+/area/shuttle/administration)
+"zY" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall14"
+ },
+/area/shuttle/administration)
+"AH" = (
+/obj/machinery/light/spot,
+/obj/machinery/porta_turret{
+ installation = /obj/item/gun/energy/gun
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Bc" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/shield/riot,
+/obj/item/shield/riot{
+ pixel_x = 2;
+ pixel_y = -4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Bj" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external{
+ req_one_access_txt = "2;19"
+ },
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "asclblast";
+ name = "Blast Door";
+ opacity = 0
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Bn" = (
+/obj/machinery/door/window/brigdoor/southleft{
+ req_one_access_txt = "2;19"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Bq" = (
+/obj/structure/sign/nosmoking_2,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall1";
+ tag = "icon-swall1"
+ },
+/area/shuttle/administration)
+"BZ" = (
+/obj/machinery/light/spot,
+/obj/machinery/porta_turret{
+ installation = /obj/item/gun/energy/gun
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Cl" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/emergency{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/storage/toolbox/mechanical,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"Du" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced,
+/obj/item/gun/energy/gun,
+/obj/item/gun/energy/gun{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"DZ" = (
+/obj/machinery/light/spot,
+/obj/structure/closet/emcloset,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Eq" = (
+/obj/structure/sign/securearea,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall12"
+ },
+/area/shuttle/administration)
+"EQ" = (
+/obj/machinery/door/airlock/shuttle/glass,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"Fd" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/gun/energy/gun,
+/obj/item/gun/energy/gun{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Fo" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/gun/energy/immolator/multi{
+ pixel_y = -3
+ },
+/obj/item/gun/energy/immolator/multi,
+/obj/item/gun/energy/immolator/multi{
+ pixel_y = 3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"FF" = (
+/obj/structure/sign/poster/official/enlist,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall12"
+ },
+/area/shuttle/administration)
+"FT" = (
+/obj/structure/rack,
+/obj/item/storage/box/buck{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/storage/box/buck,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Gf" = (
+/obj/structure/sign/vacuum{
+ pixel_x = -32
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Gn" = (
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/rack,
+/obj/item/gun/projectile/shotgun/riot/buckshot{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/gun/projectile/shotgun/riot/buckshot,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Gx" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external,
+/obj/docking_port/mobile{
+ dir = 2;
+ dwidth = 9;
+ height = 18;
+ id = "admin";
+ name = "armory";
+ roundstart_move = "cc_bay_1";
+ timid = 1;
+ width = 19
+ },
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "asclblast";
+ name = "Blast Door";
+ opacity = 0
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Gy" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"Hc" = (
+/obj/machinery/porta_turret{
+ installation = /obj/item/gun/energy/gun
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"HN" = (
+/obj/structure/sign/poster/official/do_not_question,
+/obj/item/tank/emergency_oxygen/engi,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall3"
+ },
+/area/shuttle/administration)
+"Ir" = (
+/obj/machinery/computer/shuttle/admin{
+ name = "NRV Sparta shuttle console"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"IC" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall3"
+ },
+/area/shuttle/administration)
+"Jt" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Ke" = (
+/obj/machinery/door/window/brigdoor/southright{
+ req_one_access_txt = "2;19"
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"Kh" = (
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Ki" = (
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/clothing/suit/armor/bulletproof{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/structure/rack,
+/obj/item/clothing/head/helmet/alt,
+/obj/item/clothing/suit/armor/bulletproof{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/item/clothing/head/helmet/alt,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"KM" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall7"
+ },
+/area/shuttle/administration)
+"Lh" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/gun/energy/ionrifle{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/gun/energy/ionrifle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"LK" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/machinery/computer/secure_data,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"LP" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall_s9"
+ },
+/area/shuttle/administration)
+"Mi" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Mj" = (
+/obj/machinery/vending/medical,
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"Mo" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/clothing/suit/armor/bulletproof{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/item/clothing/head/helmet/alt,
+/obj/item/clothing/suit/armor/bulletproof{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/obj/item/clothing/head/helmet/alt,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"MN" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall12"
+ },
+/area/shuttle/administration)
+"MZ" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall3";
+ tag = "icon-swall3"
+ },
+/area/shuttle/administration)
+"Ni" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/rack,
+/obj/item/gun/projectile/shotgun/riot/buckshot{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/gun/projectile/shotgun/riot/buckshot,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Ns" = (
+/obj/machinery/recharger/wallcharger{
+ pixel_y = 25
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"NF" = (
+/obj/structure/sign/poster/official/here_for_your_safety,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall3";
+ tag = "icon-swall3"
+ },
+/area/shuttle/administration)
+"NQ" = (
+/obj/machinery/door/poddoor/shutters{
+ density = 0;
+ dir = 1;
+ icon_state = "open";
+ id_tag = "Asclshutters";
+ name = "Blast Shutters";
+ opacity = 0
+ },
+/obj/structure/grille,
+/obj/structure/window/full/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Op" = (
+/obj/structure/dispenser/oxygen,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Ou" = (
+/obj/machinery/autolathe/upgraded{
+ hacked = 1
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"Pe" = (
+/obj/machinery/door/window/brigdoor/southright{
+ req_one_access_txt = "2;19"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Pn" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/clothing/suit/armor/riot,
+/obj/item/clothing/suit/armor/riot{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"PL" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall_s10"
+ },
+/area/shuttle/administration)
+"PR" = (
+/obj/machinery/light/spot{
+ dir = 8;
+ tag = "icon-tube1 (WEST)"
+ },
+/obj/machinery/door_control{
+ id = "adminarmoryshutters";
+ name = "Armory Internal Shutters";
+ pixel_x = -26;
+ req_access_txt = "3"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"PS" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/gun/energy/gun/nuclear{
+ pixel_y = -3
+ },
+/obj/item/gun/energy/gun/nuclear,
+/obj/item/gun/energy/gun/nuclear{
+ pixel_y = 3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"PV" = (
+/obj/structure/rack,
+/obj/item/gun/energy/sniperrifle{
+ pixel_y = -4
+ },
+/obj/item/gun/energy/sniperrifle,
+/obj/item/gun/energy/sniperrifle{
+ pixel_y = 3
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"RM" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall8";
+ tag = "icon-swall12"
+ },
+/area/shuttle/administration)
+"TD" = (
+/obj/machinery/door/airlock/command{
+ name = "Command Center";
+ req_access = null;
+ req_access_txt = "19"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"TF" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/obj/item/storage/fancy/donut_box,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Un" = (
+/obj/structure/table/reinforced,
+/obj/item/tank/emergency_oxygen/engi{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/item/tank/emergency_oxygen/engi,
+/obj/item/tank/emergency_oxygen/engi{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/machinery/light/spot{
+ dir = 8;
+ icon_state = "tube1";
+ tag = "icon-tube1 (WEST)"
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/mask/breath{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"Ur" = (
+/obj/machinery/porta_turret{
+ installation = /obj/item/gun/energy/gun
+ },
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/administration)
+"UR" = (
+/obj/machinery/status_display,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall12"
+ },
+/area/shuttle/administration)
+"UX" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external,
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "asclblast";
+ name = "Blast Door";
+ opacity = 0
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"Vc" = (
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swall_s5"
+ },
+/area/shuttle/administration)
+"VC" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Shuttle Armory";
+ req_access_txt = "3"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"VQ" = (
+/obj/structure/rack,
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/item/gun/energy/gun/advtaser{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/item/gun/energy/gun/advtaser{
+ pixel_x = 0;
+ pixel_y = 0
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"WV" = (
+/obj/structure/table/reinforced,
+/obj/item/restraints/handcuffs{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/item/restraints/handcuffs,
+/obj/item/restraints/handcuffs{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/machinery/light/spot{
+ dir = 4;
+ icon_state = "tube1";
+ tag = "icon-tube1 (EAST)"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+"XL" = (
+/obj/structure/window/reinforced{
+ dir = 1;
+ layer = 2.9
+ },
+/obj/structure/rack,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/item/gun/projectile/shotgun/riot/buckshot{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/gun/projectile/shotgun/riot/buckshot,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
+
+(1,1,1) = {"
+vk
+MZ
+HN
+IC
+IC
+IC
+IC
+KM
+wQ
+wQ
+wQ
+wQ
+KM
+IC
+IC
+IC
+IC
+Vc
+"}
+(2,1,1) = {"
+MN
+Un
+xm
+Mj
+aP
+dP
+tx
+MN
+eI
+Ir
+dn
+gj
+MN
+vA
+cl
+cl
+DZ
+Eq
+"}
+(3,1,1) = {"
+MN
+Ns
+mw
+mw
+mw
+mw
+mw
+MN
+ua
+gh
+gh
+gh
+FF
+Op
+Kh
+Kh
+Kh
+Bj
+"}
+(4,1,1) = {"
+MN
+Ns
+mw
+mw
+mw
+mw
+Gy
+MN
+qQ
+Kh
+Kh
+Kh
+UR
+Jt
+Kh
+Kh
+Kh
+Bj
+"}
+(5,1,1) = {"
+MN
+Ns
+mw
+mw
+mw
+mw
+fo
+zY
+MZ
+TD
+rW
+rW
+pa
+MZ
+xH
+nG
+nG
+Eq
+"}
+(6,1,1) = {"
+MN
+bi
+Cl
+vy
+Ou
+mw
+mw
+MN
+cV
+Kh
+Kh
+Kh
+Bn
+Gf
+Kh
+Mi
+Mi
+MN
+"}
+(7,1,1) = {"
+zY
+nG
+nG
+nG
+nG
+gd
+nG
+MN
+xQ
+Kh
+hN
+Kh
+Pe
+Kh
+Kh
+Kh
+oj
+MN
+"}
+(8,1,1) = {"
+RM
+oY
+mw
+mw
+mw
+mw
+Ur
+kf
+vW
+al
+aI
+LK
+TF
+Kh
+Kh
+Kh
+fQ
+mq
+"}
+(9,1,1) = {"
+UX
+mw
+mw
+mw
+mw
+mw
+mw
+EQ
+mw
+mw
+mw
+mw
+rb
+Kh
+Kh
+Kh
+fQ
+jn
+"}
+(10,1,1) = {"
+Gx
+mw
+mw
+mw
+mw
+mw
+mw
+EQ
+mw
+mw
+mw
+mw
+Ke
+Kh
+Kh
+Kh
+Kh
+jn
+"}
+(11,1,1) = {"
+uz
+oY
+mw
+mw
+mw
+mw
+Hc
+ae
+ir
+pQ
+pQ
+pQ
+uY
+Kh
+Kh
+Kh
+BZ
+MN
+"}
+(12,1,1) = {"
+zY
+MZ
+Bq
+yg
+VC
+yg
+yF
+pa
+bm
+bm
+bm
+MZ
+MZ
+xK
+VC
+NF
+MZ
+mM
+"}
+(13,1,1) = {"
+MN
+Kh
+wH
+eL
+Kh
+eL
+Kh
+PR
+PV
+PS
+Fo
+wH
+VQ
+Bc
+Kh
+Kh
+AH
+MN
+"}
+(14,1,1) = {"
+NQ
+Kh
+dH
+Ni
+Kh
+FT
+Mo
+Kh
+Kh
+Kh
+Kh
+Kh
+Lh
+Pn
+Kh
+Kh
+Kh
+mq
+"}
+(15,1,1) = {"
+NQ
+Kh
+Du
+Gn
+Kh
+df
+wG
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+mq
+"}
+(16,1,1) = {"
+NQ
+Kh
+Fd
+XL
+Kh
+xF
+Ki
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+Kh
+mq
+"}
+(17,1,1) = {"
+MN
+fF
+Kh
+Kh
+fF
+Kh
+Kh
+fF
+iz
+yu
+sq
+WV
+xU
+ce
+jB
+jU
+de
+MN
+"}
+(18,1,1) = {"
+PL
+KM
+uW
+uW
+KM
+IC
+IC
+KM
+uW
+uW
+KM
+IC
+IC
+KM
+uW
+uW
+KM
+LP
+"}
+(19,1,1) = {"
+xZ
+PL
+pK
+pK
+LP
+xZ
+xZ
+PL
+pK
+pK
+LP
+xZ
+xZ
+PL
+pK
+pK
+LP
+xZ
+"}
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index 66ffca0aef5..5725a7a8e9b 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -128,66 +128,56 @@
/obj/machinery/atmospherics/unary/vent_pump/process_atmos()
..()
- if((stat & (NOPOWER|BROKEN)))
- return 0
+ if(stat & (NOPOWER|BROKEN))
+ return FALSE
if(!node)
- on = 0
+ on = FALSE
//broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0
if(!on)
- return 0
+ return FALSE
if(welded)
if(air_contents.return_pressure() >= weld_burst_pressure && prob(5)) //the weld is on but the cover is welded shut, can it withstand the internal pressure?
visible_message("The welded cover of [src] bursts open!")
- for(var/mob/M in range(1, src))
+ for(var/mob/living/M in range(1))
unsafe_pressure_release(M, air_contents.return_pressure()) //let's send everyone flying
welded = FALSE
update_icon()
- return 0
+ return FALSE
var/datum/gas_mixture/environment = loc.return_air()
var/environment_pressure = environment.return_pressure()
-
if(pump_direction) //internal -> external
var/pressure_delta = 10000
-
- if(pressure_checks&1)
+ if(pressure_checks & 1)
pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure))
- if(pressure_checks&2)
+ if(pressure_checks & 2)
pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound))
- if(pressure_delta > 0.5)
- if(air_contents.temperature > 0)
- var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
-
- var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
-
- loc.assume_air(removed)
- air_update_turf()
-
- parent.update = 1
+ if(pressure_delta > 0.5 && air_contents.temperature > 0)
+ var/transfer_moles = pressure_delta * environment.volume / (air_contents.temperature * R_IDEAL_GAS_EQUATION)
+ var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
+ loc.assume_air(removed)
+ air_update_turf()
+ parent.update = TRUE
else //external -> internal
var/pressure_delta = 10000
- if(pressure_checks&1)
+ if(pressure_checks & 1)
pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound))
- if(pressure_checks&2)
+ if(pressure_checks & 2)
pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure()))
- if(pressure_delta > 0.5)
- if(environment.temperature > 0)
- var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
+ if(pressure_delta > 0.5 && environment.temperature > 0)
+ var/transfer_moles = pressure_delta * air_contents.volume / (environment.temperature * R_IDEAL_GAS_EQUATION)
+ var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
+ if(isnull(removed)) //in space
+ return
+ air_contents.merge(removed)
+ air_update_turf()
+ parent.update = TRUE
- var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
- if(isnull(removed)) //in space
- return
-
- air_contents.merge(removed)
- air_update_turf()
-
- parent.update = 1
-
- return 1
+ return TRUE
//Radio remote control
@@ -386,11 +376,11 @@
if(I.use_tool(src, user, 20, volume = I.tool_volume))
if(!welded)
welded = TRUE
- visible_message("[user] welds [src] shut!",\
+ user.visible_message("[user] welds [src] shut!",\
"You weld [src] shut!")
else
welded = FALSE
- visible_message("[user] unwelds [src]!",\
+ user.visible_message("[user] unwelds [src]!",\
"You unweld [src]!")
update_icon()
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index ed06dd68ce6..bbd5e760d2f 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -404,10 +404,10 @@
if(I.use_tool(src, user, 20, volume = I.tool_volume))
if(!welded)
welded = TRUE
- visible_message("[user] welds [src] shut!",\
+ user.visible_message("[user] welds [src] shut!",\
"You weld [src] shut!")
else
welded = FALSE
- visible_message("[user] unwelds [src]!",\
+ user.visible_message("[user] unwelds [src]!",\
"You unweld [src]!")
update_icon()
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index ad5e5df7583..af087eb6082 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -69,9 +69,6 @@
#define ZONE_ACTIVE 1
#define ZONE_SLEEPING 0
-#define shuttle_time_in_station 1800 // 3 minutes in the station
-#define shuttle_time_to_arrive 6000 // 10 minutes to arrive
-
#define EVENT_LEVEL_MUNDANE 1
#define EVENT_LEVEL_MODERATE 2
#define EVENT_LEVEL_MAJOR 3
@@ -265,8 +262,6 @@
#define TRIGGER_GUARD_NONE 0
#define TRIGGER_GUARD_NORMAL 1
-#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (istype(I, /client) ? I : (istype(I, /datum/mind) ? I:current?:client : null)))
-
// Macro to get the current elapsed round time, rather than total world runtime
#define ROUND_TIME (SSticker.round_start_time ? (world.time - SSticker.round_start_time) : 0)
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index c9763e4836c..9c115bed86f 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -22,16 +22,9 @@
// these define the time taken for the shuttle to get to SS13
// and the time before it leaves again
-#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle departs centcom and cannot be recalled
-#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station after arriving
-#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station
-#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure.
-
-//Ferry shuttle processing status
-#define IDLE_STATE 0
-#define WAIT_LAUNCH 1
-#define WAIT_ARRIVE 2
-#define WAIT_FINISH 3
+#define SHUTTLE_CALLTIME 6000 //10 minutes = 6000 deciseconds - time taken for emergency shuttle to reach the station when called (in deciseconds)
+#define SHUTTLE_DOCKTIME 1800 //3 minutes = 1800 deciseconds - time taken for emergency shuttle to leave again once it has docked (in deciseconds)
+#define SHUTTLE_ESCAPETIME 1200 //2 minutes = 1200 deciseconds - time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds)
//shuttle mode defines
#define SHUTTLE_IGNITING 0
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 153eca7f373..fd7031409d8 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -80,8 +80,7 @@
#define INIT_ORDER_NANOMOB -23
#define INIT_ORDER_SQUEAK -40
#define INIT_ORDER_PATH -50
-#define INIT_ORDER_PERSISTENCE -95
-#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
+#define INIT_ORDER_PERSISTENCE -95
// Subsystem fire priority, from lowest to highest priority
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
@@ -113,7 +112,6 @@
#define FIRE_PRIORITY_MOBS 100
#define FIRE_PRIORITY_NANOUI 110
#define FIRE_PRIORITY_TICKER 200
-#define FIRE_PRIORITY_CHAT 400
#define FIRE_PRIORITY_OVERLAYS 500
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 47650177283..034e8851c18 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -615,5 +615,3 @@ proc/checkhtml(var/t)
text = replacetext(text, "
", "\[cell\]")
text = replacetext(text, " ", "\[logo\]")
return text
-
-#define string2charlist(string) (splittext(string, regex("(\\x0A|.)")) - splittext(string, ""))
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
index a291120fb85..67df5eb3013 100644
--- a/code/_onclick/hud/ghost.dm
+++ b/code/_onclick/hud/ghost.dm
@@ -81,6 +81,9 @@
/obj/screen/ghost/respawn_pai/Click()
var/mob/dead/observer/G = usr
+ if(!GLOB.paiController.check_recruit(G))
+ to_chat(G, "You are not eligible to become a pAI.")
+ return
GLOB.paiController.recruitWindow(G)
/datum/hud/ghost
diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm
index d628124e052..6c9e95f457e 100644
--- a/code/_onclick/hud/guardian.dm
+++ b/code/_onclick/hud/guardian.dm
@@ -13,7 +13,7 @@
using.icon_state = mymob.a_intent
static_inventory += using
action_intent = using
-
+
using = new /obj/screen/guardian/Manifest()
using.screen_loc = ui_rhand
static_inventory += using
@@ -49,8 +49,8 @@
/obj/screen/guardian/Manifest/Click()
if(isguardian(usr))
var/mob/living/simple_animal/hostile/guardian/G = usr
- G.Manifest()
-
+ if(G.loc == G.summoner)
+ G.Manifest()
/obj/screen/guardian/Recall
icon_state = "recall"
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
deleted file mode 100644
index 4eb468a0952..00000000000
--- a/code/controllers/subsystem/chat.dm
+++ /dev/null
@@ -1,67 +0,0 @@
-SUBSYSTEM_DEF(chat)
- name = "Chat"
- flags = SS_TICKER|SS_NO_INIT
- wait = 1
- priority = FIRE_PRIORITY_CHAT
- init_order = INIT_ORDER_CHAT
- offline_implications = "Chat messages will no longer be cleanly queued. No immediate action is needed."
-
- var/list/payload = list()
-
-
-/datum/controller/subsystem/chat/fire()
- for(var/i in payload)
- var/client/C = i
- if(C)
- C << output(payload[C], "browseroutput:output")
- payload -= C
-
- if(MC_TICK_CHECK)
- return
-
-
-/datum/controller/subsystem/chat/proc/queue(target, message, flag)
- if(!target || !message)
- return
-
- if(!istext(message))
- stack_trace("to_chat called with invalid input type")
- return
-
- if(target == world)
- target = GLOB.clients
-
- //Some macros remain in the string even after parsing and fuck up the eventual output
- message = replacetext(message, "\improper", "")
- message = replacetext(message, "\proper", "")
- message += " "
-
-
- //url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
- //Do the double-encoding here to save nanoseconds
- var/twiceEncoded = url_encode(url_encode(message))
-
- if(islist(target))
- for(var/I in target)
- var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
-
- if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
- continue
-
- if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
- C.chatOutput.messageQueue += message
- continue
-
- payload[C] += twiceEncoded
-
- else
- var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible
-
- if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
- return
-
- if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
- C.chatOutput.messageQueue += message
- return
-
- payload[C] += twiceEncoded
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index 247d71d05b8..08fa7709320 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -14,9 +14,9 @@ SUBSYSTEM_DEF(shuttle)
//emergency shuttle stuff
var/obj/docking_port/mobile/emergency/emergency
var/obj/docking_port/mobile/emergency/backup/backup_shuttle
- var/emergencyCallTime = 6000 //time taken for emergency shuttle to reach the station when called (in deciseconds)
- var/emergencyDockTime = 1800 //time taken for emergency shuttle to leave again once it has docked (in deciseconds)
- var/emergencyEscapeTime = 1200 //time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds)
+ var/emergencyCallTime = SHUTTLE_CALLTIME //time taken for emergency shuttle to reach the station when called (in deciseconds)
+ var/emergencyDockTime = SHUTTLE_DOCKTIME //time taken for emergency shuttle to leave again once it has docked (in deciseconds)
+ var/emergencyEscapeTime = SHUTTLE_ESCAPETIME //time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds)
var/emergency_sec_level_time = 0 // time sec level was last raised to red or higher
var/area/emergencyLastCallLoc
var/emergencyNoEscape
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 799a12f4db9..3541be89983 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -248,3 +248,29 @@
allow_duplicates = FALSE // I dont even want to think about what happens if you have 2 shuttles with the same ID. Likely scary stuff.
always_place = TRUE // Its designed to make exploring other space ruins more accessible
cost = 0 // Force spawned so shouldnt have a cost
+
+/datum/map_template/ruin/space/syndiecakesfactory
+ id = "Syndiecakes Factory"
+ suffix = "syndiecakesfactory.dmm"
+ name = "Syndicakes Factory"
+ description = "Syndicate used to get funds selling corgi cakes produced here. Was it hit by meteors or by a Nanotrasen comando?"
+ allow_duplicates = FALSE
+ cost = 2 //telecomms + multiple mobs
+
+/datum/map_template/ruin/space/debris1
+ id = "debris1"
+ suffix = "debris1.dmm"
+ name = "Debris field 1"
+ description = "A bunch of metal chunks, wires and space waste"
+
+/datum/map_template/ruin/space/debris2
+ id = "debris2"
+ suffix = "debris2.dmm"
+ name = "Debris field 2"
+ description = "A bunch of metal chunks, wires and space waste that used to be some kind of secure storage facility"
+
+/datum/map_template/ruin/space/debris3
+ id = "debris3"
+ suffix = "debris3.dmm"
+ name = "Debris field 3"
+ description = "A bunch of metal chunks, wires and space waste. It used to be an arcade."
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 4d6310041e5..dacc08dee31 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -133,3 +133,8 @@
suffix = "admin"
name = "NTV Argos"
description = "Default Admin ship. An older ship used for special operations."
+
+/datum/map_template/shuttle/admin/armory
+ suffix = "armory"
+ name = "NRV Sparta"
+ description = "Armory Shuttle, with plenty of guns to hand out and some general supplies."
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 4814e27380b..8a172bb85b1 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -1725,8 +1725,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
U.purchase_log += "[bicon(C)]"
for(var/item in bought_items)
- new item(C)
- U.purchase_log += "[bicon(item)]"
+ var/obj/purchased = new item(C)
+ U.purchase_log += "[bicon(purchased)]"
log_game("[key_name(usr)] purchased a surplus crate with [jointext(itemlog, ", ")]")
/datum/uplink_item/bundles_TC/telecrystal
diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm
index 8b8a86009b9..a887959db48 100644
--- a/code/game/dna/genes/disabilities.dm
+++ b/code/game/dna/genes/disabilities.dm
@@ -249,14 +249,13 @@
block = GLOB.wingdingsblock
/datum/dna/gene/disability/wingdings/OnSay(mob/M, message)
- var/list/chars = string2charlist(message)
var/garbled_message = ""
- for(var/C in chars)
- if(C in GLOB.alphabet_uppercase)
+ for(var/i in 1 to length(message))
+ if(message[i] in GLOB.alphabet_uppercase)
garbled_message += pick(GLOB.alphabet_uppercase)
- else if(C in GLOB.alphabet)
+ else if(message[i] in GLOB.alphabet)
garbled_message += pick(GLOB.alphabet)
else
- garbled_message += C
+ garbled_message += message[i]
message = garbled_message
return message
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index 9c33ffaaca5..b3b4000bbf1 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -370,16 +370,11 @@ GLOBAL_LIST_EMPTY(sting_paths)
mind.changeling.purchasedpowers += path
path.on_purchase(src)
else //for respec
- var/datum/action/changeling/hivemind_upload/S1 = new
+ var/datum/action/changeling/hivemind_pick/S1 = new
if(!mind.changeling.has_sting(S1))
mind.changeling.purchasedpowers+=S1
S1.Grant(src)
- var/datum/action/changeling/hivemind_download/S2 = new
- if(!mind.changeling.has_sting(S2))
- mind.changeling.purchasedpowers+=S2
- S2.Grant(src)
-
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
mind.changeling.absorbed_dna |= C.dna.Clone()
mind.changeling.trim_dna()
diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm
index 98336608da4..18a5477fd3f 100644
--- a/code/game/gamemodes/changeling/powers/hivemind.dm
+++ b/code/game/gamemodes/changeling/powers/hivemind.dm
@@ -12,27 +12,36 @@
var/datum/changeling/changeling=user.mind.changeling
changeling.changeling_speak = 1
to_chat(user, "Use say \":g message\" to communicate with the other changelings.")
- var/datum/action/changeling/hivemind_upload/S1 = new
+ var/datum/action/changeling/hivemind_pick/S1 = new
if(!changeling.has_sting(S1))
changeling.purchasedpowers+=S1
S1.Grant(user)
- var/datum/action/changeling/hivemind_download/S2 = new
- if(!changeling.has_sting(S2))
- S2.Grant(user)
- changeling.purchasedpowers+=S2
return
// HIVE MIND UPLOAD/DOWNLOAD DNA
GLOBAL_LIST_EMPTY(hivemind_bank)
-/datum/action/changeling/hivemind_upload
+/datum/action/changeling/hivemind_pick
name = "Hive Channel DNA"
- desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it. Costs 10 chemicals."
- button_icon_state = "hivemind_channel"
+ desc = "Allows us to upload or absorb DNA in the airwaves. Does not count towards absorb objectives. Costs 10 chemicals."
+ button_icon_state = "hive_absorb"
chemical_cost = 10
dna_cost = -1
-/datum/action/changeling/hivemind_upload/sting_action(var/mob/user)
+/datum/action/changeling/hivemind_pick/sting_action(mob/user)
+ var/datum/changeling/changeling = user.mind.changeling
+ var/channel_pick = alert("Upload or Absorb DNA?", "Channel Select", "Upload", "Absorb")
+
+ if(channel_pick == "Upload")
+ dna_upload(user)
+ if(channel_pick == "Absorb")
+ if(changeling.using_stale_dna(user))//If our current DNA is the stalest, we gotta ditch it.
+ to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.")
+ return
+ else
+ dna_absorb(user)
+
+/datum/action/changeling/proc/dna_upload(mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna))
@@ -56,23 +65,7 @@ GLOBAL_LIST_EMPTY(hivemind_bank)
feedback_add_details("changeling_powers","HU")
return 1
-/datum/action/changeling/hivemind_download
- name = "Hive Absorb DNA"
- desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives. Costs 10 chemicals."
- button_icon_state = "hive_absorb"
- chemical_cost = 10
- dna_cost = -1
-
-/datum/action/changeling/hivemind_download/can_sting(var/mob/living/carbon/user)
- if(!..())
- return
- var/datum/changeling/changeling = user.mind.changeling
- if(changeling.using_stale_dna(user))//If our current DNA is the stalest, we gotta ditch it.
- to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.")
- return
- return 1
-
-/datum/action/changeling/hivemind_download/sting_action(var/mob/user)
+/datum/action/changeling/proc/dna_absorb(mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
for(var/datum/dna/DNA in GLOB.hivemind_bank)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index f1f3bc1c72c..a68e4c1e9ca 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -177,26 +177,37 @@
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/special_overlays()
return mutable_appearance('icons/effects/cult_effects.dmi', shield_state, MOB_LAYER + 0.01)
-/obj/item/clothing/suit/hooded/cultrobes/berserker
+/obj/item/clothing/suit/hooded/cultrobes/flagellant_robe
name = "flagellant's robes"
desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
- icon_state = "hardsuit-berserker"
- item_state = "hardsuit-berserker"
+ icon_state = "flagellantrobe"
+ item_state = "flagellantrobe"
flags_inv = HIDEJUMPSUIT
allowed = list(/obj/item/tome,/obj/item/melee/cultblade)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list("melee" = -45, "bullet" = -45, "laser" = -45,"energy" = -45, "bomb" = -45, "bio" = -45, "rad" = -45, "fire" = 0, "acid" = 0)
slowdown = -1
- hoodtype = /obj/item/clothing/head/hooded/berserkerhood
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Drask" = 'icons/mob/species/drask/suit.dmi',
+ "Grey" = 'icons/mob/species/grey/suit.dmi'
+ )
+ hoodtype = /obj/item/clothing/head/hooded/flagellant_hood
-/obj/item/clothing/head/hooded/berserkerhood
+/obj/item/clothing/head/hooded/flagellant_hood
name = "flagellant's robes"
desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
- icon_state = "culthood"
+ icon_state = "flagellanthood"
+ item_state = "flagellanthood"
flags_inv = HIDEFACE
flags_cover = HEADCOVERSEYES
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Drask" = 'icons/mob/species/drask/head.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/whetstone/cult
name = "eldritch whetstone"
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 0e96dd92062..c06913c1abe 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -120,7 +120,7 @@
selection_prompt = "You study the schematics etched on the forge..."
selection_title = "Forge"
creation_message = "You work the forge as dark knowledge guides your hands, creating %ITEM%!"
- choosable_items = list("Shielded Robe" = /obj/item/clothing/suit/hooded/cultrobes/cult_shield, "Flagellant's Robe" = /obj/item/clothing/suit/hooded/cultrobes/berserker, \
+ choosable_items = list("Shielded Robe" = /obj/item/clothing/suit/hooded/cultrobes/cult_shield, "Flagellant's Robe" = /obj/item/clothing/suit/hooded/cultrobes/flagellant_robe, \
"Cultist Hardsuit" = /obj/item/storage/box/cult)
/obj/structure/cult/functional/forge/New()
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 492d128e222..af0dfb5e6e3 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -1,5 +1,5 @@
/obj/item/paper/talisman
- icon = 'icons/obj/paper.dmi'
+ icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paper_talisman"
var/cultist_name = "talisman"
var/cultist_desc = "A basic talisman. It serves no purpose."
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 526a2c01083..feff3be1f05 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -781,3 +781,17 @@
if(AI.eyeobj)
AI.eyeobj.relay_speech = TRUE
+/datum/AI_Module/large/cameracrack
+ module_name = "Core Camera Cracker"
+ mod_pick_name = "cameracrack"
+ description = "By shortcirucuting the camera network chip, it overheats, preventing the camera console from using your internal camera."
+ cost = 10
+ one_purchase = TRUE
+ upgrade = TRUE
+ unlock_text = "Network chip short circuited. Internal camera disconected from network. Minimal damage to other internal components."
+ unlock_sound = 'sound/items/wirecutter.ogg'
+
+/datum/AI_Module/large/cameracrack/upgrade(mob/living/silicon/ai/AI)
+ if(AI.builtInCamera)
+ QDEL_NULL(AI.builtInCamera)
+
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 7af7751ff2c..d7a49e40d4b 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -187,24 +187,24 @@
icon_state = "scrubber:0"
/obj/machinery/portable_atmospherics/scrubber/huge/attackby(var/obj/item/W as obj, var/mob/user as mob, params)
- if(istype(W, /obj/item/wrench))
- if(stationary)
- to_chat(user, "The bolts are too tight for you to unscrew!")
- return
- if(on)
- to_chat(user, "Turn it off first!")
- return
-
- anchored = !anchored
- playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
- return
-
if((istype(W, /obj/item/analyzer)) && get_dist(user, src) <= 1)
atmosanalyzer_scan(air_contents, user)
return
return ..()
+/obj/machinery/portable_atmospherics/scrubber/huge/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(stationary)
+ to_chat(user, "The bolts are too tight for you to unscrew!")
+ return
+ if(on)
+ to_chat(user, "Turn it off first!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ to_chat(user, "You [anchored ? "wrench" : "unwrench"] [src].")
+
/obj/machinery/portable_atmospherics/scrubber/huge/stationary
name = "Stationary Air Scrubber"
stationary = 1
diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm
index 05c7552aacc..c3531c7f674 100644
--- a/code/game/machinery/tcomms/_base.dm
+++ b/code/game/machinery/tcomms/_base.dm
@@ -106,23 +106,37 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
/**
- * Start of Ion Anomalie Event
+ * Start of Ion Anomaly Event
*
- * Proc to easily start an Ion Anomalie's effects, and update the icon
+ * Proc to easily start an Ion Anomaly's effects, and update the icon
*/
/obj/machinery/tcomms/proc/start_ion()
ion = TRUE
update_icon()
/**
- * End of Ion Anomalie Event
+ * End of Ion Anomaly Event
*
- * Proc to easily stop an Ion Anomalie's effects, and update the icon
+ * Proc to easily stop an Ion Anomaly's effects, and update the icon
*/
/obj/machinery/tcomms/proc/end_ion()
ion = FALSE
update_icon()
+/**
+ * Z-Level transit change helper
+ *
+ * Proc to make sure you cant have two of these active on a Z-level at once. It also makes sure to update the linkage
+ */
+/obj/machinery/tcomms/onTransitZ(old_z, new_z)
+ . = ..()
+ if(active)
+ active = FALSE
+ // This needs a timer because otherwise its on the shuttle Z and the message is missed
+ addtimer(CALLBACK(src, /atom.proc/visible_message, "Radio equipment on [src] has been overloaded by heavy bluespace interference. Please restart the machine."), 5)
+ update_icon()
+
+
/**
* Logging helper
*
diff --git a/code/game/machinery/tcomms/core.dm b/code/game/machinery/tcomms/core.dm
index 46cd0e6df71..622ce2e2b9f 100644
--- a/code/game/machinery/tcomms/core.dm
+++ b/code/game/machinery/tcomms/core.dm
@@ -14,6 +14,8 @@
name = "Telecommunications Core"
desc = "A large rack full of communications equipment. Looks important."
icon_state = "core"
+ // This starts as off so you cant make cores as hot spares
+ active = FALSE
/// The NTTC config for this device
var/datum/nttc_configuration/nttc = new()
/// List of all reachable devices
@@ -35,6 +37,11 @@
link_password = GenerateKey()
reachable_zlevels |= loc.z
component_parts += new /obj/item/circuitboard/tcomms/core(null)
+ if(check_power_on())
+ active = TRUE
+ else
+ visible_message("Error: Another core is already active in this sector. Power-up cancelled due to radio interference.")
+ update_icon()
/**
* Destructor for the core.
@@ -121,6 +128,38 @@
reachable_zlevels |= R.loc.z
+/**
+ * Z-Level transit change helper
+ *
+ * Handles parent call of disabling the machine if it changes Z-level, but also rebuilds the list of reachable levels
+ */
+/obj/machinery/tcomms/core/onTransitZ(old_z, new_z)
+ . = ..()
+ refresh_zlevels()
+
+/**
+ * Power-on checker
+ *
+ * Checks the z-level to see if an existing core is already powered on, and deny this one turning on if there is one. Returns TRUE if it can power on, or FALSE if it cannot
+ */
+/obj/machinery/tcomms/core/proc/check_power_on()
+ // Cancel if we are already on
+ if(active)
+ return TRUE
+
+ for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
+ // Make sure we dont check ourselves
+ if(C == src)
+ continue
+ // We dont care about ones on other zlevels
+ if(!atoms_share_level(C, src))
+ continue
+ // If another core is active, return FALSE
+ if(C.active)
+ return FALSE
+ // If we got here there isnt an active core on this Z-level. So return true
+ return TRUE
+
//////////////
// UI STUFF //
//////////////
@@ -198,8 +237,11 @@
if(ui_tab == UI_TAB_CONFIG)
// All the toggle on/offs go here
if(href_list["toggle_active"])
- active = !active
- update_icon()
+ if(check_power_on())
+ active = !active
+ update_icon()
+ else
+ to_chat(usr, "Error: Another core is already active in this sector. Power-up cancelled due to radio interference.")
// NTTC Toggles
if(href_list["nttc_toggle_jobs"])
nttc.toggle_jobs = !nttc.toggle_jobs
diff --git a/code/game/machinery/tcomms/relay.dm b/code/game/machinery/tcomms/relay.dm
index b2faf9ce0cd..bf5e6e21a9c 100644
--- a/code/game/machinery/tcomms/relay.dm
+++ b/code/game/machinery/tcomms/relay.dm
@@ -9,6 +9,8 @@
name = "Telecommunications Relay"
desc = "A large device with several radio antennas on it."
icon_state = "relay"
+ // This starts as off so you cant make cores as hot spares
+ active = FALSE
/// The host core for this relay
var/obj/machinery/tcomms/core/linked_core
/// ID of the hub to auto link to
@@ -26,6 +28,11 @@
/obj/machinery/tcomms/relay/Initialize(mapload)
. = ..()
component_parts += new /obj/item/circuitboard/tcomms/relay(null)
+ if(check_power_on())
+ active = TRUE
+ else
+ visible_message("Error: Another relay is already active in this sector. Power-up cancelled due to radio interference.")
+ update_icon()
if(mapload && autolink_id)
return INITIALIZE_HINT_LATELOAD
@@ -51,6 +58,40 @@
// Only ONE of these with one ID should exist per world
break
+/**
+ * Z-Level transit change helper
+ *
+ * Handles parent call of disabling the machine if it changes Z-level, but also rebuilds the list of reachable levels on the linked core
+ */
+/obj/machinery/tcomms/relay/onTransitZ(old_z, new_z)
+ . = ..()
+ if(linked_core)
+ linked_core.refresh_zlevels()
+
+
+/**
+ * Power-on checker
+ *
+ * Checks the z-level to see if an existing relay is already powered on, and deny this one turning on if there is one. Returns TRUE if it can power on, or FALSE if it cannot
+ */
+/obj/machinery/tcomms/relay/proc/check_power_on()
+ // Cancel if we are already on
+ if(active)
+ return TRUE
+
+ for(var/obj/machinery/tcomms/relay/R in GLOB.tcomms_machines)
+ // Make sure we dont check ourselves
+ if(R == src)
+ continue
+ // We dont care about ones on other zlevels
+ if(!atoms_share_level(R, src))
+ continue
+ // If another relay is active, return FALSE
+ if(R.active)
+ return FALSE
+ // If we got here there isnt an active relay on this Z-level. So return TRUE
+ return TRUE
+
/**
* Proc to link the relay to the core.
*
@@ -83,9 +124,9 @@
* Proc which ensures the host core has its zlevels updated (icons are updated by parent call)
*/
/obj/machinery/tcomms/relay/power_change()
- ..()
- if(linked_core)
- linked_core.refresh_zlevels()
+ ..()
+ if(linked_core)
+ linked_core.refresh_zlevels()
//////////////
// UI STUFF //
@@ -127,10 +168,13 @@
// All the toggle on/offs go here
if(href_list["toggle_active"])
- active = !active
- update_icon()
- if(linked_core)
- linked_core.refresh_zlevels()
+ if(check_power_on())
+ active = !active
+ update_icon()
+ if(linked_core)
+ linked_core.refresh_zlevels()
+ else
+ to_chat(usr, "Error: Another relay is already active in this sector. Power-up cancelled due to radio interference.")
// Set network ID
if(href_list["network_id"])
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 69f70207452..9a24edb4da3 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -331,6 +331,8 @@
else
occupant.clear_alert("mechaport")
if(leg_overload_mode)
+ log_message("Leg Overload damage.")
+ take_damage(1, BRUTE, FALSE, FALSE)
if(obj_integrity < max_integrity - max_integrity / 3)
leg_overload_mode = FALSE
step_in = initial(step_in)
@@ -502,7 +504,7 @@
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
else
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT))
- if(. >= 5 || prob(33))
+ if((. >= 5 || prob(33)) && !(. == 1 && leg_overload_mode)) //If it takes 1 damage and leg_overload_mode is true, do not say TAKING DAMAGE! to the user several times a second.
occupant_message("Taking damage!")
log_message("Took [damage_amount] points of damage. Damage type: [damage_type]")
@@ -540,7 +542,7 @@
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
playsound(loc, 'sound/weapons/tap.ogg', 40, 1, -1)
- user.visible_message("[user] hits [name]. Nothing happens", "You hit [name] with no visible effect.")
+ user.visible_message("[user] hits [name]. Nothing happens", "You hit [name] with no visible effect.")
log_message("Attack by hand/paw. Attacker - [user].")
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index eeb484b9f50..ce52e260bca 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -11,7 +11,7 @@
slot_flags = SLOT_BELT | SLOT_EARS
attack_verb = list("attacked", "coloured")
toolspeed = 1
- var/colour = "#FF0000" //RGB
+ var/colour = COLOR_RED
var/drawtype = "rune"
var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid","arrowleft","arrowright","arrowup","arrowdown","chicken","hailcrab","brokenheart","peace","scribble","scribble2","scribble3","skrek","squish","tunnelsnake","yip","youaredead")
var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
@@ -123,54 +123,54 @@
/obj/item/toy/crayon/red
icon_state = "crayonred"
- colour = "#DA0000"
+ colour = COLOR_RED
colourName = "red"
/obj/item/toy/crayon/orange
icon_state = "crayonorange"
- colour = "#FF9300"
+ colour = COLOR_ORANGE
colourName = "orange"
/obj/item/toy/crayon/yellow
icon_state = "crayonyellow"
- colour = "#FFF200"
+ colour = COLOR_YELLOW
colourName = "yellow"
/obj/item/toy/crayon/green
icon_state = "crayongreen"
- colour = "#A8E61D"
+ colour = COLOR_GREEN
colourName = "green"
/obj/item/toy/crayon/blue
icon_state = "crayonblue"
- colour = "#00B7EF"
+ colour = COLOR_BLUE
colourName = "blue"
/obj/item/toy/crayon/purple
icon_state = "crayonpurple"
- colour = "#DA00FF"
+ colour = COLOR_PURPLE
colourName = "purple"
/obj/item/toy/crayon/random/New()
icon_state = pick(list("crayonred", "crayonorange", "crayonyellow", "crayongreen", "crayonblue", "crayonpurple"))
switch(icon_state)
if("crayonred")
- colour = "#DA0000"
+ colour = COLOR_RED
colourName = "red"
if("crayonorange")
- colour = "#FF9300"
+ colour = COLOR_ORANGE
colourName = "orange"
if("crayonyellow")
- colour = "#FFF200"
+ colour = COLOR_YELLOW
colourName = "yellow"
if("crayongreen")
- colour = "#A8E61D"
+ colour =COLOR_GREEN
colourName = "green"
if("crayonblue")
- colour = "#00B7EF"
+ colour = COLOR_BLUE
colourName = "blue"
if("crayonpurple")
- colour = "#DA00FF"
+ colour = COLOR_PURPLE
colourName = "purple"
..()
@@ -197,10 +197,10 @@
if(!Adjacent(usr) || usr.incapacitated())
return
if(href_list["color"])
- if(colour != "#FFFFFF")
- colour = "#FFFFFF"
+ if(colour != COLOR_WHITE)
+ colour = COLOR_WHITE
else
- colour = "#000000"
+ colour = COLOR_BLACK
update_window(usr)
else
..()
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index b497bc518b0..f18c862f878 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -325,7 +325,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
// If we were to send to a channel we don't have, drop it.
return RADIO_CONNECTION_FAIL
-/obj/item/radio/talk_into(mob/living/M as mob, list/message_pieces, channel, var/verb = "says")
+/obj/item/radio/talk_into(mob/living/M as mob, list/message_pieces, channel, verbage = "says")
if(!on)
return 0 // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
@@ -428,6 +428,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
tcm.connection = connection
tcm.vname = M.voice_name
tcm.sender = M
+ tcm.verbage = verbage
// Now put that through the stuff
var/handled = FALSE
if(connection)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index f20a2cc5875..43697ac4776 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -72,7 +72,7 @@ REAGENT SCANNER
var/turf/U = O.loc
if(U && U.intact)
O.invisibility = 101
- O.alpha = 255
+ O.alpha = 255
for(var/mob/living/M in T.contents)
var/oldalpha = M.alpha
if(M.alpha < 255 && istype(M))
diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm
index 14bb468e049..f33e504a3e6 100644
--- a/code/game/objects/items/flag.dm
+++ b/code/game/objects/items/flag.dm
@@ -251,6 +251,7 @@
message_admins("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] (JMP).")
log_game("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
investigate_log("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).", INVESTIGATE_BOMB)
+ burn()
else
return ..()
@@ -267,8 +268,16 @@
/obj/item/flag/chameleon/burn()
if(boobytrap)
- boobytrap.prime()
- ..()
+ fire_act()
+ addtimer(CALLBACK(src, .proc/prime_boobytrap), boobytrap.det_time)
+ else
+ ..()
+
+/obj/item/flag/chameleon/proc/prime_boobytrap()
+ boobytrap.forceMove(get_turf(loc))
+ boobytrap.prime()
+ boobytrap = null
+ burn()
/obj/item/flag/chameleon/updateFlagIcon()
icon_state = updated_icon_state
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 75e1c6a710d..4fef7b9f6d5 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -472,7 +472,8 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("cane mould", /obj/item/kitchen/mould/cane, 1, on_floor = 1), \
new /datum/stack_recipe("cash mould", /obj/item/kitchen/mould/cash, 1, on_floor = 1), \
new /datum/stack_recipe("coin mould", /obj/item/kitchen/mould/coin, 1, on_floor = 1), \
- new /datum/stack_recipe("sucker mould", /obj/item/kitchen/mould/loli, 1, on_floor = 1)))
+ new /datum/stack_recipe("sucker mould", /obj/item/kitchen/mould/loli, 1, on_floor = 1), \
+ new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 5, on_floor = 1)))
/obj/item/stack/sheet/plastic
name = "plastic"
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index d3d61233f97..cd1b91388d7 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -35,7 +35,7 @@
desc = "A translucent balloon. There's nothing in it."
icon = 'icons/obj/toy.dmi'
icon_state = "waterballoon-e"
- item_state = "balloon-empty"
+ item_state = "waterballoon-e"
/obj/item/toy/balloon/New()
..()
@@ -99,10 +99,10 @@
/obj/item/toy/balloon/update_icon()
if(src.reagents.total_volume >= 1)
icon_state = "waterballoon"
- item_state = "balloon"
+ item_state = "waterballoon"
else
icon_state = "waterballoon-e"
- item_state = "balloon-empty"
+ item_state = "waterballoon-e"
/obj/item/toy/syndicateballoon
name = "syndicate balloon"
diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm
index 4bddaf551ea..e3c145e790b 100644
--- a/code/game/objects/items/weapons/garrote.dm
+++ b/code/game/objects/items/weapons/garrote.dm
@@ -104,7 +104,7 @@
playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1)
M.visible_message("[U] comes from behind and begins garroting [M] with the [src]!", \
- "[U]\ begins garroting you with the [src]![improvised ? "" : " You are unable to speak!"]", \
+ "[U] begins garroting you with the [src]![improvised ? "" : " You are unable to speak!"]", \
"You hear struggling and wire strain against flesh!")
return
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index 6dd07485f5b..53061e5fa61 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -19,7 +19,7 @@
/obj/item/grenade/smokebomb/prime()
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
- src.smoke.set_up(10, 0, usr.loc)
+ smoke.set_up(10, 0)
spawn(0)
src.smoke.start()
sleep(10)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 1f73e5c7062..69b4abbe10d 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -126,13 +126,15 @@
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
..()
-/obj/item/restraints/handcuffs/cable/proc/cable_color(var/colorC)
- if(colorC)
- if(colorC == "rainbow")
- colorC = color_rainbow()
- color = colorC
- else
+/obj/item/restraints/handcuffs/cable/proc/cable_color(colorC)
+ if(!colorC)
color = COLOR_RED
+ else if(colorC == "rainbow")
+ color = color_rainbow()
+ else if(colorC == "orange") //byond only knows 16 colors by name, and orange isn't one of them
+ color = COLOR_ORANGE
+ else
+ color = colorC
/obj/item/restraints/handcuffs/cable/proc/color_rainbow()
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 6d5a192c641..121782b2e8e 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -380,12 +380,13 @@
w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT
materials = list(MAT_METAL=3000)
+ cant_hold = list(/obj/item/disk/nuclear) // Prevents some cheesing
-/obj/item/storage/bag/tray/attack(mob/living/M as mob, mob/living/user as mob)
+/obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user)
..()
// Drop all the things. All of them.
var/list/obj/item/oldContents = contents.Copy()
- quick_empty()
+ drop_inventory(user)
// Make each item scatter a bit
for(var/obj/item/I in oldContents)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index da0094bb2ef..9ef94a861a0 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -846,7 +846,7 @@
desc = "A small box of Almost But Not Quite Plasma Premium Matches."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "matchbox"
- item_state = "zippo"
+ item_state = "matchbox"
storage_slots = 10
w_class = WEIGHT_CLASS_TINY
max_w_class = WEIGHT_CLASS_TINY
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 37f568fa51a..f86ebb2f69d 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -226,14 +226,14 @@
name = "\improper DromedaryCo packet"
desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\""
icon_state = "Dpacket"
- item_state = "cigpacket"
+ item_state = "Dpacket"
/obj/item/storage/fancy/cigarettes/syndicate
name = "\improper Syndicate Cigarettes"
desc = "A packet of six evil-looking cigarettes, A label on the packaging reads, \"Donk Co\""
icon_state = "robustpacket"
- item_state = "cigpacket"
+ item_state = "robustpacket"
/obj/item/storage/fancy/cigarettes/syndicate/New()
..()
@@ -244,14 +244,14 @@
name = "cigarette packet"
desc = "An obscure brand of cigarettes."
icon_state = "syndiepacket"
- item_state = "cigpacket"
+ item_state = "syndiepacket"
cigarette_type = /obj/item/clothing/mask/cigarette/syndicate
/obj/item/storage/fancy/cigarettes/cigpack_med
name = "Medical Marijuana Packet"
desc = "A prescription packet containing six marijuana cigarettes."
icon_state = "medpacket"
- item_state = "cigpacket"
+ item_state = "medpacket"
cigarette_type = /obj/item/clothing/mask/cigarette/medical_marijuana
@@ -259,46 +259,46 @@
name = "\improper Uplift Smooth packet"
desc = "Your favorite brand, now menthol flavored."
icon_state = "upliftpacket"
- item_state = "cigpacket"
+ item_state = "upliftpacket"
cigarette_type = /obj/item/clothing/mask/cigarette/menthol
/obj/item/storage/fancy/cigarettes/cigpack_robust
name = "\improper Robust packet"
desc = "Smoked by the robust."
icon_state = "robustpacket"
- item_state = "cigpacket"
+ item_state = "robustpacket"
/obj/item/storage/fancy/cigarettes/cigpack_robustgold
name = "\improper Robust Gold packet"
desc = "Smoked by the truly robust."
icon_state = "robustgpacket"
- item_state = "cigpacket"
+ item_state = "robustgpacket"
cigarette_type = /obj/item/clothing/mask/cigarette/robustgold
/obj/item/storage/fancy/cigarettes/cigpack_carp
name = "\improper Carp Classic packet"
desc = "Since 2313."
icon_state = "carppacket"
- item_state = "cigpacket"
+ item_state = "carppacket"
/obj/item/storage/fancy/cigarettes/cigpack_midori
name = "\improper Midori Tabako packet"
desc = "You can't understand the runes, but the packet smells funny."
icon_state = "midoripacket"
- item_state = "cigpacket"
+ item_state = "midoripacket"
/obj/item/storage/fancy/cigarettes/cigpack_shadyjims
name ="\improper Shady Jim's Super Slims"
desc = "Is your weight slowing you down? Having trouble running away from gravitational singularities? Can't stop stuffing your mouth? Smoke Shady Jim's Super Slims and watch all that fat burn away. Guaranteed results!"
icon_state = "shadyjimpacket"
- item_state = "cigpacket"
+ item_state = "shadyjimpacket"
cigarette_type = /obj/item/clothing/mask/cigarette/shadyjims
/obj/item/storage/fancy/cigarettes/cigpack_random
name ="\improper Embellished Enigma packet"
desc = "For the true connoisseur of exotic flavors."
icon_state = "shadyjimpacket"
- item_state = "cigpacket"
+ item_state = "shadyjimpacket"
cigarette_type = /obj/item/clothing/mask/cigarette/random
/obj/item/storage/fancy/rollingpapers
@@ -307,6 +307,7 @@
w_class = WEIGHT_CLASS_TINY
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cig_paper_pack"
+ item_state = "cig_paper_pack"
storage_slots = 10
icon_type = "rolling paper"
can_hold = list(/obj/item/rollingpaper)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 16bd6f4caa8..49b6c6a11ea 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -438,8 +438,11 @@
if((!ishuman(usr) && (src.loc != usr)) || usr.stat || usr.restrained())
return
+ drop_inventory(usr)
+
+/obj/item/storage/proc/drop_inventory(user)
var/turf/T = get_turf(src)
- hide_from(usr)
+ hide_from(user)
for(var/obj/item/I in contents)
remove_from_storage(I, T)
CHECK_TICK
@@ -499,10 +502,9 @@
/obj/item/storage/attack_self(mob/user)
- //Clicking on itself will empty it, if it has the verb to do that.
- if(user.is_in_active_hand(src))
- if(verbs.Find(/obj/item/storage/verb/quick_empty))
- quick_empty()
+ //Clicking on itself will empty it, if allow_quick_empty is TRUE
+ if(allow_quick_empty && user.is_in_active_hand(src))
+ drop_inventory(user)
//Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area).
//Returns -1 if the atom was not found on container.
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 763717dc270..7a648aa74e4 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -69,6 +69,11 @@
/obj/structure/closet/secure_closet/closed_item_click(mob/user)
togglelock(user)
+/obj/structure/closet/secure_closet/AltClick(mob/user)
+ ..()
+ if(Adjacent(user))
+ togglelock(user)
+
/obj/structure/closet/secure_closet/emag_act(mob/user)
if(!broken)
broken = TRUE
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 4531613610e..0c0a7f5e4dd 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -56,27 +56,20 @@
/obj/structure/dresser/crowbar_act(mob/user, obj/item/I)
. = TRUE
- if(!I.tool_start_check(src, user, 0))
+ if(!I.use_tool(src, user, 0))
return
TOOL_ATTEMPT_DISMANTLE_MESSAGE
if(I.use_tool(src, user, 50, volume = I.tool_volume))
TOOL_DISMANTLE_SUCCESS_MESSAGE
-
+ deconstruct(disassembled = TRUE)
/obj/structure/dresser/wrench_act(mob/user, obj/item/I)
. = TRUE
- if(!I.use_tool(src, user, 0, volume = I.tool_volume))
- return
- if(anchored)
- WRENCH_UNANCHOR_MESSAGE
- anchored = FALSE
- else
- if(!isfloorturf(loc))
- user.visible_message("A floor must be present to secure [src]!")
- return
- WRENCH_ANCHOR_MESSAGE
- anchored = TRUE
+ default_unfasten_wrench(user, I, time = 20)
-/obj/structure/dresser/deconstruct(disassembled = TRUE)
- new /obj/item/stack/sheet/wood(drop_location(), 30)
- qdel(src)
+obj/structure/dresser/deconstruct(disassembled = FALSE)
+ var/mat_drop = 15
+ if(disassembled)
+ mat_drop = 30
+ new /obj/item/stack/sheet/wood(drop_location(), mat_drop)
+ ..()
diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm
index d0bcd07f92f..4742a2c3c0c 100644
--- a/code/game/objects/structures/loom.dm
+++ b/code/game/objects/structures/loom.dm
@@ -11,12 +11,30 @@
anchored = TRUE
/obj/structure/loom/attackby(obj/item/I, mob/user)
- if(default_unfasten_wrench(user, I, 5))
- return
if(weave(I, user))
return
return ..()
+/obj/structure/loom/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ deconstruct(disassembled = TRUE)
+
+/obj/structure/loom/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I, time = 20)
+
+/obj/structure/loom/deconstruct(disassembled = FALSE)
+ var/mat_drop = 5
+ if(disassembled)
+ mat_drop = 10
+ new /obj/item/stack/sheet/wood(drop_location(), mat_drop)
+ ..()
+
///Handles the weaving.
/obj/structure/loom/proc/weave(obj/item/stack/sheet/cotton/W, mob/user)
if(!istype(W))
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index ba5258004a0..5a8a122be21 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -292,12 +292,12 @@
/obj/structure/sign/directions/engineering
name = "\improper Engineering Department"
- desc = "A direction sign, pointing out which way the Engineering department is."
+ desc = "A direction sign, pointing out which way the Engineering Department is."
icon_state = "direction_eng"
/obj/structure/sign/directions/security
name = "\improper Security Department"
- desc = "A direction sign, pointing out which way the Security department is."
+ desc = "A direction sign, pointing out which way the Security Department is."
icon_state = "direction_sec"
/obj/structure/sign/directions/medical
@@ -307,12 +307,12 @@
/obj/structure/sign/directions/evac
name = "\improper Escape Arm"
- desc = "A direction sign, pointing out which way escape shuttle dock is."
+ desc = "A direction sign, pointing out which way Escape Shuttle Dock is."
icon_state = "direction_evac"
/obj/structure/sign/directions/cargo
name = "\improper Cargo Department"
- desc = "A direction sign, pointing out which way the Cargo department is."
+ desc = "A direction sign, pointing out which way the Cargo Department is."
icon_state = "direction_supply"
/obj/structure/sign/explosives
diff --git a/code/game/world.dm b/code/game/world.dm
index 02c613e9ac8..c279fa24b54 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -340,6 +340,8 @@ GLOBAL_VAR_INIT(world_topic_spam_protect_time, world.timeofday)
#endif
for(var/client/C in GLOB.clients)
+ var/secs_before_auto_reconnect = 10 // TODO: make it higher if server is due for an update @AffectedArc07
+ C << output(list2params(list(secs_before_auto_reconnect)), "browseroutput:reboot")
if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
C << link("byond://[config.server]")
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 24bef5398a8..bdcd27c24e3 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -11,7 +11,8 @@
resistance_flags = NONE
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Grey" = 'icons/mob/species/grey/suit.dmi'
)
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index a0d6823fe80..aae3b84a3c5 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -357,7 +357,7 @@
if(!fail_msg)
to_chat(usr, "[TR.name] constructed.")
if(TR.alert_admins_on_craft)
- message_admins("[usr.ckey] has created a [TR.name] at [ADMIN_COORDJMP(usr)]")
+ message_admins("[key_name_admin(usr)] has created a [TR.name] at [ADMIN_COORDJMP(usr)]")
else
to_chat(usr, "Construction failed[fail_msg]")
busy = FALSE
diff --git a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
index d5d114fb43f..7b3349e4c2d 100644
--- a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
@@ -7,6 +7,7 @@
materials = list(MAT_GLASS=100)
var/light_intensity = 2
light_color = LIGHT_COLOR_LIGHTBLUE
+ resistance_flags = FLAMMABLE
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change()
if(!isShotFlammable() && (resistance_flags & ON_FIRE))
@@ -30,6 +31,7 @@
overlays += filling
name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future.
if(resistance_flags & ON_FIRE)
+ cut_overlay(GLOB.fire_overlay, TRUE)
overlays += "shotglass_fire"
name = "flaming [name]"
else
diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm
index 382e2f39022..a9f0ab3d684 100644
--- a/code/modules/food_and_drinks/food/foods/meat.dm
+++ b/code/modules/food_and_drinks/food/foods/meat.dm
@@ -30,7 +30,7 @@
name = "-meat"
var/subjectname = ""
var/subjectjob = null
- tastes = list("tender meat" = 1)
+ tastes = list("salty meat" = 1)
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct
name = "meat product"
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 612146e579a..5a73313601a 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -198,10 +198,17 @@
return
return ..()
+/obj/structure/beebox/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ deconstruct(disassembled = TRUE)
+
/obj/structure/beebox/wrench_act(mob/user, obj/item/I)
. = TRUE
- if(!I.tool_use_check(user, 0))
- return
default_unfasten_wrench(user, I, time = 20)
/obj/structure/beebox/attack_hand(mob/user)
@@ -261,15 +268,18 @@
visible_message("[user] removes the queen from the apiary.")
queen_bee = null
-/obj/structure/beebox/deconstruct(disassembled = TRUE)
- new /obj/item/stack/sheet/wood(loc, 20)
+/obj/structure/beebox/deconstruct(disassembled = FALSE)
+ var/mat_drop = 20
+ if(disassembled)
+ mat_drop = 40
+ new /obj/item/stack/sheet/wood(loc, mat_drop)
for(var/mob/living/simple_animal/hostile/poison/bees/B in bees)
if(B.loc == src)
B.forceMove(drop_location())
for(var/obj/item/honey_frame/HF in honey_frames)
HF.forceMove(drop_location())
honey_frames -= HF
- qdel(src)
+ ..()
/obj/structure/beebox/unwrenched
anchored = FALSE
diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm
index f194c48e019..5031ac71373 100644
--- a/code/modules/hydroponics/fermenting_barrel.dm
+++ b/code/modules/hydroponics/fermenting_barrel.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/objects.dmi'
icon_state = "barrel"
density = TRUE
- anchored = FALSE
+ anchored = TRUE
container_type = DRAINABLE | AMOUNT_VISIBLE
pressure_resistance = 2 * ONE_ATMOSPHERE
max_integrity = 300
@@ -65,6 +65,26 @@
to_chat(user, "You close [src], letting you draw from its tap.")
update_icon()
+/obj/structure/fermenting_barrel/crowbar_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ deconstruct(disassembled = TRUE)
+
+/obj/structure/fermenting_barrel/wrench_act(mob/living/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I, time = 20)
+
+/obj/structure/fermenting_barrel/deconstruct(disassembled = FALSE)
+ var/mat_drop = 15
+ if(disassembled)
+ mat_drop = 30
+ new /obj/item/stack/sheet/wood(drop_location(), mat_drop)
+ ..()
+
/obj/structure/fermenting_barrel/update_icon()
if(open)
icon_state = "barrel_open"
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 2f5627e8413..4d003753876 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -1,20 +1,10 @@
-/mob/dead/observer/say(var/message)
+/mob/dead/observer/say(message)
message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
if(!message)
return
- log_ghostsay(message, src)
-
- if(src.client)
- if(src.client.prefs.muted & MUTE_DEADCHAT)
- to_chat(src, "You cannot talk in deadchat (muted).")
- return
-
- if(src.client.handle_spam_prevention(message,MUTE_DEADCHAT))
- return
-
- . = src.say_dead(message)
+ return say_dead(message)
/mob/dead/observer/emote(act, type, message, force)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 410c485f15e..2514ce68b06 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -171,7 +171,14 @@
to_chat(src, heard)
-/mob/proc/hear_holopad_talk(list/message_pieces, var/verb = "says", var/mob/speaker = null)
+/mob/proc/hear_holopad_talk(list/message_pieces, verb = "says", mob/speaker = null)
+ if(sleeping || stat == UNCONSCIOUS)
+ hear_sleep(multilingual_to_message(message_pieces))
+ return
+
+ if(!can_hear())
+ return
+
var/message = combine_message(message_pieces, verb, speaker)
var/name = speaker.name
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index a46268daf50..50d9b6d5fd5 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -186,7 +186,7 @@
if(prob(80))
new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]"
else
- new_name += ..(gender,1)
+ new_name += " [..(gender,1)]"
return new_name
/datum/language/vulpkanin
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 6141ad02f9f..c7798a51a08 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -572,41 +572,34 @@ emp_act
if(M.a_intent == INTENT_HARM)
if(w_uniform)
w_uniform.add_fingerprint(M)
- var/damage = rand(15, 30)
+ var/damage = prob(90) ? 20 : 0
if(!damage)
- playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
+ playsound(loc, 'sound/weapons/slashmiss.ogg', 50, TRUE, -1)
visible_message("[M] has lunged at [src]!")
return 0
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_selected))
- var/armor_block = run_armor_check(affecting, "melee")
+ var/armor_block = run_armor_check(affecting, "melee", armour_penetration = 10)
- playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
+ playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1)
visible_message("[M] has slashed at [src]!", \
"[M] has slashed at [src]!")
apply_damage(damage, BRUTE, affecting, armor_block)
- if(damage >= 25)
- visible_message("[M] has wounded [src]!", \
- "[M] has wounded [src]!")
- apply_effect(4, WEAKEN, armor_block)
- add_attack_logs(M, src, "Alien attacked")
+ add_attack_logs(M, src, "Alien attacked")
updatehealth("alien attack")
- if(M.a_intent == INTENT_DISARM)
- if(prob(80))
+ if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead.
+ var/obj/item/I = get_active_hand()
+ if(I && unEquip(I))
+ playsound(loc, 'sound/weapons/slash.ogg', 25, TRUE, -1)
+ visible_message("[M] disarms [src]!", "[M] disarms you!", "You hear aggressive shuffling!")
+ to_chat(M, "You disarm [src]!")
+ else
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_selected))
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
apply_effect(5, WEAKEN, run_armor_check(affecting, "melee"))
add_attack_logs(M, src, "Alien tackled")
visible_message("[M] has tackled down [src]!")
- else
- if(prob(99)) //this looks fucking stupid but it was previously 'var/randn = rand(1, 100); if(randn <= 99)'
- playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- drop_item()
- visible_message("[M] disarmed [src]!")
- else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
- visible_message("[M] has tried to disarm [src]!")
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm
index a8639a1a948..2ce011c7159 100644
--- a/code/modules/mob/living/carbon/human/species/diona.dm
+++ b/code/modules/mob/living/carbon/human/species/diona.dm
@@ -74,6 +74,10 @@
..()
H.gender = NEUTER
+/datum/species/diona/on_species_loss(mob/living/carbon/human/H)
+ . = ..()
+ H.clear_alert("nolight")
+
/datum/species/diona/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == "glyphosate" || R.id == "atrazine")
H.adjustToxLoss(3) //Deal aditional damage
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d4546f4f6bc..e944e692887 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -351,8 +351,6 @@ proc/get_radio_key_from_channel(var/channel)
return
if(stat)
- if(stat == DEAD)
- return say_dead(message_pieces)
return
if(is_muzzled())
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 7f6ed094dce..670088fd0bc 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -173,19 +173,19 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
add_language("Galactic Common", 1)
add_language("Sol Common", 1)
add_language("Tradeband", 1)
- add_language("Neo-Russkiya", 0)
- add_language("Gutter", 0)
- add_language("Sinta'unathi", 0)
- add_language("Siik'tajr", 0)
- add_language("Canilunzt", 0)
- add_language("Skrellian", 0)
- add_language("Vox-pidgin", 0)
- add_language("Orluum", 0)
- add_language("Rootspeak", 0)
+ add_language("Neo-Russkiya", 1)
+ add_language("Gutter", 1)
+ add_language("Sinta'unathi", 1)
+ add_language("Siik'tajr", 1)
+ add_language("Canilunzt", 1)
+ add_language("Skrellian", 1)
+ add_language("Vox-pidgin", 1)
+ add_language("Orluum", 1)
+ add_language("Rootspeak", 1)
add_language("Trinary", 1)
- add_language("Chittin", 0)
- add_language("Bubblish", 0)
- add_language("Clownish", 0)
+ add_language("Chittin", 1)
+ add_language("Bubblish", 1)
+ add_language("Clownish", 1)
if(!safety)//Only used by AIize() to successfully spawn an AI.
if(!B)//If there is no player/brain inside.
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index db95f18c210..0a4e4cee898 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -563,6 +563,10 @@
var/obj/item/holder/H = ..()
if(!istype(H))
return
+ if(stat == DEAD)
+ H.icon = 'icons/mob/pai.dmi'
+ H.icon_state = "[chassis]_dead"
+ return
if(resting)
icon_state = "[chassis]"
resting = 0
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 72d9b210712..65847c3a9b1 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -53,7 +53,7 @@
emote("deathgasp", force = TRUE)
if(module)
- module.handle_death(gibbed)
+ module.handle_death(src, gibbed)
// Only execute the below if we successfully died
. = ..(gibbed)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f240f086db8..55abedd1a74 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -59,7 +59,6 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/ear_protection = 0
var/damage_protection = 0
var/emp_protection = FALSE
- var/xeno_disarm_chance = 85
var/list/force_modules = list()
var/allow_rename = TRUE
@@ -1353,7 +1352,6 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
eye_protection = 2 // Immunity to flashes and the visual part of flashbangs
ear_protection = 1 // Immunity to the audio part of flashbangs
damage_protection = 10 // Reduce all incoming damage by this number
- xeno_disarm_chance = 20
allow_rename = FALSE
modtype = "Commando"
faction = list("nanotrasen")
@@ -1425,7 +1423,6 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
damage_protection = 5 // Reduce all incoming damage by this number
eprefix = "Gamma"
magpulse = 1
- xeno_disarm_chance = 40
/mob/living/silicon/robot/destroyer
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index 8445a399582..84eb782833b 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -2,19 +2,17 @@
if(M.a_intent == INTENT_DISARM)
if(!lying)
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
- if(prob(xeno_disarm_chance))
- Stun(7)
- step(src, get_dir(M,src))
- spawn(5)
- step(src, get_dir(M,src))
- add_attack_logs(M, src, "Alien pushed over")
- playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
- visible_message("[M] has forced back [src]!",\
- "[M] has forced back [src]!")
+ var/obj/item/I = get_active_hand()
+ if(I)
+ uneq_active()
+ visible_message("[M] disarmed [src]!", "[M] has disabled [src]'s active module!")
+ add_attack_logs(M, src, "alien disarmed")
else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- visible_message("[M] took a swipe at [src]!",\
- "[M] took a swipe at [src]!")
+ Stun(2)
+ step(src, get_dir(M,src))
+ add_attack_logs(M, src, "Alien pushed over")
+ visible_message("[M] forces back [src]!", "[M] forces back [src]!")
+ playsound(loc, 'sound/weapons/pierce.ogg', 50, TRUE, -1)
else
..()
return
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 8e8c67693c5..ff967354131 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -114,7 +114,7 @@
/obj/item/robot_module/proc/handle_custom_removal(component_id, mob/living/user, obj/item/W)
return FALSE
-/obj/item/robot_module/proc/handle_death(gibbed)
+/obj/item/robot_module/proc/handle_death(mob/living/silicon/robot/R, gibbed)
return
/obj/item/robot_module/standard
@@ -255,7 +255,7 @@
fix_modules()
-/obj/item/robot_module/engineering/handle_death()
+/obj/item/robot_module/engineering/handle_death(mob/living/silicon/robot/R, gibbed)
var/obj/item/gripper/G = locate(/obj/item/gripper) in modules
if(G)
G.drop_gripped_item(silent = TRUE)
@@ -368,6 +368,11 @@
R.add_language("Clownish",1)
R.add_language("Neo-Russkiya", 1)
+/obj/item/robot_module/butler/handle_death(mob/living/silicon/robot/R, gibbed)
+ var/obj/item/storage/bag/tray/cyborg/T = locate(/obj/item/storage/bag/tray/cyborg) in modules
+ if(istype(T))
+ T.drop_inventory(R)
+
/obj/item/robot_module/miner
name = "miner robot module"
@@ -623,7 +628,7 @@
..()
-/obj/item/robot_module/drone/handle_death()
+/obj/item/robot_module/drone/handle_death(mob/living/silicon/robot/R, gibbed)
var/obj/item/gripper/G = locate(/obj/item/gripper) in modules
if(G)
G.drop_gripped_item(silent = TRUE)
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index e720400abd5..6ac5f8cded2 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -3,11 +3,10 @@
/mob/living/silicon/attack_alien(mob/living/carbon/alien/humanoid/M)
if(..()) //if harm or disarm intent
- var/damage = rand(10, 20)
+ var/damage = 20
if(prob(90))
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- visible_message("[M] has slashed at [src]!", \
- "[M] has slashed at [src]!")
+ visible_message("[M] has slashed at [src]!", "[M] has slashed at [src]!")
if(prob(8))
flash_eyes(affect_silicon = 1)
add_attack_logs(M, src, "Alien attacked")
@@ -64,6 +63,6 @@
else
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
playsound(loc, 'sound/effects/bang.ogg', 10, 1)
- visible_message("[M] punches [src], but doesn't leave a dent.", \
- "[M] punches [src], but doesn't leave a dent.!")
+ visible_message("[M] punches [src], but doesn't leave a dent.", \
+ "[M] punches [src], but doesn't leave a dent.")
return FALSE
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index b42f3275997..28fff50a124 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -42,13 +42,18 @@
/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M)
if(..()) //if harm or disarm intent.
- var/damage = rand(15, 30)
- visible_message("[M] has slashed at [src]!", \
- "[M] has slashed at [src]!")
- playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
- add_attack_logs(M, src, "Alien attacked")
- attack_threshold_check(damage)
- return
+ if(M.a_intent == INTENT_DISARM)
+ playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1)
+ visible_message("[M] [response_disarm] [name]!", "[M] [response_disarm] you!")
+ add_attack_logs(M, src, "Alien disarmed")
+ else
+ var/damage = rand(15, 30)
+ visible_message("[M] has slashed at [src]!", \
+ "[M] has slashed at [src]!")
+ playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
+ add_attack_logs(M, src, "Alien attacked")
+ attack_threshold_check(damage)
+ return TRUE
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L)
if(..()) //successful larva bite
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 41032185c3b..7a26de718b6 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -44,18 +44,27 @@
usr.emote(message)
-/mob/proc/say_dead(var/message)
- if(!(client && client.holder))
- if(!config.dsay_allowed)
- to_chat(src, "Deadchat is globally muted.")
+/mob/proc/say_dead(message)
+ if(client)
+ if(!client.holder)
+ if(!config.dsay_allowed)
+ to_chat(src, "Deadchat is globally muted.")
+ return
+
+ if(client.prefs.muted & MUTE_DEADCHAT)
+ to_chat(src, "You cannot talk in deadchat (muted).")
return
- if(client && !(client.prefs.toggles & CHAT_DEAD))
- to_chat(usr, "You have deadchat muted.")
- return
+ if(!(client.prefs.toggles & CHAT_DEAD))
+ to_chat(src, "You have deadchat muted.")
+ return
+
+ if(client.handle_spam_prevention(message, MUTE_DEADCHAT))
+ return
say_dead_direct("[pick("complains", "moans", "whines", "laments", "blubbers", "salts")], \"[message]\"", src)
create_log(DEADCHAT_LOG, message)
+ log_ghostsay(message, src)
/mob/proc/say_understands(var/mob/other, var/datum/language/speaking = null)
if(stat == DEAD)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index b6c65d979cf..992020e7090 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -229,14 +229,15 @@ By design, d1 is the smallest direction and d2 is the highest
if(current_size >= STAGE_FIVE)
deconstruct()
-obj/structure/cable/proc/cable_color(var/colorC)
- if(colorC)
- if(colorC == "rainbow")
- color = color_rainbow()
- else
- color = colorC
+obj/structure/cable/proc/cable_color(colorC)
+ if(!colorC)
+ color = COLOR_RED
+ else if(colorC == "rainbow")
+ color = color_rainbow()
+ else if(colorC == "orange") //byond only knows 16 colors by name, and orange isn't one of them
+ color = COLOR_ORANGE
else
- color = "#DD0000"
+ color = colorC
/obj/structure/cable/proc/color_rainbow()
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
@@ -845,13 +846,15 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
..()
-/obj/item/stack/cable_coil/proc/cable_color(var/colorC)
- if(colorC)
- if(colorC == "rainbow")
- colorC = color_rainbow()
- color = colorC
- else
+/obj/item/stack/cable_coil/proc/cable_color(colorC)
+ if(!colorC)
color = COLOR_RED
+ else if(colorC == "rainbow")
+ color = color_rainbow()
+ else if(colorC == "orange") //byond only knows 16 colors by name, and orange isn't one of them
+ color = COLOR_ORANGE
+ else
+ color = colorC
/obj/item/stack/cable_coil/proc/color_rainbow()
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 8cb48f8e36a..c59e5890331 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -133,6 +133,9 @@
/obj/item/ammo_box/magazine/internal/shot/riot/short
max_ammo = 3
+/obj/item/ammo_box/magazine/internal/shot/riot/buckshot
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
/obj/item/ammo_box/magazine/internal/grenadelauncher
name = "grenade launcher internal magazine"
ammo_type = /obj/item/ammo_casing/a40mm
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 25db1f10dcb..ca4499c8832 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -95,6 +95,7 @@
if(!user.unEquip(A))
return
to_chat(user, "You screw [S] onto [src].")
+ playsound(src, 'sound/items/screwdriver.ogg', 40, 1)
suppressed = A
S.oldsound = fire_sound
S.initial_w_class = w_class
@@ -120,6 +121,7 @@
..()
return
to_chat(user, "You unscrew [suppressed] from [src].")
+ playsound(src, 'sound/items/screwdriver.ogg', 40, 1)
user.put_in_hands(suppressed)
fire_sound = S.oldsound
w_class = S.initial_w_class
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 17a55722d2c..6c11fda5fd7 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -197,6 +197,8 @@
..()
post_sawoff()
+/obj/item/gun/projectile/shotgun/riot/buckshot //comes pre-loaded with buckshot rather than rubber
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/riot/buckshot
///////////////////////
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index b843b2d17a2..e813597c4d8 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -543,6 +543,14 @@
build_path = /obj/item/assembly/health
category = list("initial", "Medical")
+/datum/design/stethoscope
+ name = "Stethoscope"
+ id = "stethoscope"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500)
+ build_path = /obj/item/clothing/accessory/stethoscope
+ category = list("initial", "Medical")
+
/datum/design/timer
name = "Timer"
id = "timer"
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index a1ea27b0592..75e64a43215 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -751,7 +751,7 @@
category = list("Exosuit Equipment")
/datum/design/mech_mining_scanner
- name = "Exosuit Engineering Equipement (Mining Scanner)"
+ name = "Exosuit Engineering Equipment (Mining Scanner)"
id = "mech_mscanner"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/mecha_equipment/mining_scanner
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index caa273594de..43cc010ac1c 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -291,8 +291,7 @@
for(var/turf/T in oview(1, src))
if(!T.density)
if(prob(EFFECT_PROB_VERYHIGH))
- var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
- reagentdecal.reagents.add_reagent("radium", 7)
+ new /obj/effect/decal/cleanable/greenglow(T)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
var/savedName = "[exp_on]"
ejectItem(TRUE)
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index db801fa5d0f..033cd9fdf94 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -7,7 +7,7 @@
#define VAULT_NOBREATH "Lung Enhancement"
#define VAULT_FIREPROOF "Thermal Regulation"
#define VAULT_STUNTIME "Neural Repathing"
-#define VAULT_ARMOUR "Bone Reinforcement"
+#define VAULT_ARMOUR "Hardened Skin"
#define VAULT_SPEED "Leg Muscle Stimulus"
#define VAULT_QUICK "Arm Muscle Stimulus"
diff --git a/goon/browserassets/css/browserOutput-dark.css b/goon/browserassets/css/browserOutput-dark.css
index 8c177840a1b..529827ad369 100644
--- a/goon/browserassets/css/browserOutput-dark.css
+++ b/goon/browserassets/css/browserOutput-dark.css
@@ -401,6 +401,10 @@ h1.alert, h2.alert {color: #FFF;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: #6685f5; font-weight: bold;}
+.rebooting {background: #2979AF; color: white; padding: 5px;}
+.rebooting a {color: white !important; text-decoration-color: white !important;}
+#reconnectTimer {font-weight: bold;}
+
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
index 0d7d987b0e7..31da7aa96f5 100644
--- a/goon/browserassets/css/browserOutput.css
+++ b/goon/browserassets/css/browserOutput.css
@@ -400,6 +400,10 @@ h1.alert, h2.alert {color: #000000;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: blue; font-weight: bold;}
+.rebooting {background: #2979AF; color: white; padding: 5px;}
+.rebooting a {color: white !important; text-decoration-color: white !important;}
+#reconnectTimer {font-weight: bold;}
+
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js
index 3cac81ca8e2..414a5d644b6 100644
--- a/goon/browserassets/js/browserOutput.js
+++ b/goon/browserassets/js/browserOutput.js
@@ -69,10 +69,13 @@ var opts = {
'macros': {},
// Emoji toggle
- 'enableEmoji': true
+ 'enableEmoji': true,
+
+ // Reboot message stuff
+ 'rebootIntervalHandler': null
};
-var regexHasError = false; //variable to check if regex has excepted
+var regexHasError = false; //variable to check if regex has excepted
function outerHTML(el) {
var wrap = document.createElement('div');
@@ -97,10 +100,10 @@ if (typeof String.prototype.trim !== 'function') {
if (!String.prototype.includes) {
String.prototype.includes = function(search, start) {
'use strict';
-
+
if (search instanceof RegExp) {
throw TypeError('first argument must not be a RegExp');
- }
+ }
if (start === undefined) { start = 0; }
return this.indexOf(search, start) !== -1;
};
@@ -124,7 +127,7 @@ function byondDecode(message) {
// The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b.
// Marvelous.
message = message.replace(/\+/g, "%20");
- try {
+ try {
// This is a workaround for the above not always working when BYOND's shitty url encoding breaks.
// Basically, sometimes BYOND's double encoding trick just arbitrarily produces something that makes decodeURIComponent
// throw an "Invalid Encoding URI" URIError... the simplest way to work around this is to just ignore it and use unescape instead
@@ -217,10 +220,10 @@ function highlightTerms(el) {
ind = next_tag;
}
}
-
+
element.innerHTML = s;
}
-
+
for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term
if(opts.highlightTerms[i]) {
if(!opts.highlightRegexEnable){
@@ -573,6 +576,34 @@ function toggleWasd(state) {
opts.wasd = (state == 'on' ? true : false);
}
+function reboot(timeRaw) {
+ var timeLeftSecs = parseInt(timeRaw);
+ const intervalSecs = 1; // tick every 1 second
+
+ rebootFinished();
+ internalOutput('', 'internal');
+
+ opts.rebootIntervalHandler = setInterval(function() {
+ timeLeftSecs -= intervalSecs;
+ if (timeLeftSecs <= 0) {
+ $("#reconnectTimer").text('Reconnecting...');
+ window.location.href = 'byond://winset?command=.reconnect';
+ clearInterval(opts.rebootIntervalHandler)
+ opts.rebootIntervalHandler = null;
+ } else {
+ $("#reconnectTimer").text('Reconnect (' + timeLeftSecs + ')');
+ }
+ }, intervalSecs * 1000);
+}
+
+function rebootFinished() {
+ if (opts.rebootIntervalHandler != null) {
+ clearInterval(opts.rebootIntervalHandler)
+ }
+ $(" Reconnected automatically!").insertBefore("#reconnectTimer");
+ $("#reconnectTimer").remove();
+}
+
/*****************************************
*
* MAKE MACRO DICTIONARY
@@ -652,7 +683,7 @@ $(function() {
'shideSpam': getCookie('hidespam'),
'darkChat': getCookie('darkChat'),
};
-
+
if (savedConfig.sfontSize) {
$messages.css('font-size', savedConfig.sfontSize);
internalOutput('Loaded font size setting of: '+savedConfig.sfontSize+'', 'internal');
@@ -1010,18 +1041,18 @@ $(function() {
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
-
+
// synchronous requests are depricated in modern browsers
- xmlHttp.open('GET', 'browserOutput.css', true);
+ xmlHttp.open('GET', 'browserOutput.css', true);
xmlHttp.onload = function (e) {
if (xmlHttp.status === 200) { // request successful
-
+
// Generate Log
var saved = '';
saved += $messages.html();
saved = saved.replace(/&/g, '&');
saved = saved.replace(/Chat Log \
'+
@@ -1031,7 +1062,7 @@ $(function() {
openWindow('Style Doc Retrieve Error: '+xmlHttp.statusText);
}
}
-
+
// timeout and request errors
xmlHttp.timeout = 300;
xmlHttp.ontimeout = function (e) {
diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm
index 74c9d844728..b073bece409 100644
--- a/goon/code/datums/browserOutput.dm
+++ b/goon/code/datums/browserOutput.dm
@@ -109,6 +109,7 @@ var/list/chatResources = list(
loaded = TRUE
winset(owner, "browseroutput", "is-disabled=false")
+ owner << output(null, "browseroutput:rebootFinished")
if(owner.holder)
loadAdmin()
for(var/message in messageQueue)
@@ -245,8 +246,8 @@ var/list/chatResources = list(
var/to_chat_filename
var/to_chat_line
var/to_chat_src
-// Call using macro: to_chat(target, message, flag)
-/proc/to_chat_immediate(target, message, flag)
+
+/proc/to_chat(target, message, flag)
if(!is_valid_tochat_message(message) || !is_valid_tochat_target(target))
target << message
@@ -304,17 +305,4 @@ var/to_chat_src
target << output(output_message, "browseroutput:output")
-/proc/to_chat(target, message, flag)
- /*
- If any of the following conditions are met, do NOT use SSchat. These conditions include:
- - Is the MC still initializing?
- - Has SSchat initialized?
- - Has SSchat been offlined due to MC crashes?
- If any of these are met, use the old chat system, otherwise people wont see messages
- */
- if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized || SSchat?.flags & SS_NO_FIRE)
- to_chat_immediate(target, message, flag)
- return
- SSchat.queue(target, message, flag)
-
#undef MAX_COOKIE_LENGTH
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 5200ad72e5a..1bd516110e5 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index a378d2e5b04..b2f1bfa90c6 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 0a8847d7e4a..a7772c3ebf4 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/species/drask/head.dmi b/icons/mob/species/drask/head.dmi
index b9f0604c960..f0c888e9f68 100644
Binary files a/icons/mob/species/drask/head.dmi and b/icons/mob/species/drask/head.dmi differ
diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi
index d75a28f2bee..cef6dbdf836 100644
Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ
diff --git a/icons/mob/species/grey/head.dmi b/icons/mob/species/grey/head.dmi
index 4ff783bbb74..c059a3bff9d 100644
Binary files a/icons/mob/species/grey/head.dmi and b/icons/mob/species/grey/head.dmi differ
diff --git a/icons/mob/species/grey/mask.dmi b/icons/mob/species/grey/mask.dmi
index cbbd722ae69..348a39c0f03 100644
Binary files a/icons/mob/species/grey/mask.dmi and b/icons/mob/species/grey/mask.dmi differ
diff --git a/icons/mob/species/grey/suit.dmi b/icons/mob/species/grey/suit.dmi
index 3070f6627ea..c22c9daf3dd 100644
Binary files a/icons/mob/species/grey/suit.dmi and b/icons/mob/species/grey/suit.dmi differ
diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi
index c956187ffa1..7a74f930598 100644
Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index ef05daf5115..e54cdb52d0f 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index 6c4b2b43f6a..fb5d153d30d 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 827b67b4332..4161227ac79 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 26c2a7ea734..12a0a371a94 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/atmospherics/blue_pipe_tank.dmi b/icons/obj/atmospherics/blue_pipe_tank.dmi
deleted file mode 100644
index 3d2ee4c9d69..00000000000
Binary files a/icons/obj/atmospherics/blue_pipe_tank.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/digital_valve.dmi b/icons/obj/atmospherics/digital_valve.dmi
deleted file mode 100644
index 136523b7223..00000000000
Binary files a/icons/obj/atmospherics/digital_valve.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/dp_vent_pump.dmi b/icons/obj/atmospherics/dp_vent_pump.dmi
deleted file mode 100644
index 86dae2cf435..00000000000
Binary files a/icons/obj/atmospherics/dp_vent_pump.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/filter.dmi b/icons/obj/atmospherics/filter.dmi
deleted file mode 100644
index 99afb55d22b..00000000000
Binary files a/icons/obj/atmospherics/filter.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/mainspipe.dmi b/icons/obj/atmospherics/mainspipe.dmi
deleted file mode 100644
index df6c2bc0d3a..00000000000
Binary files a/icons/obj/atmospherics/mainspipe.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/n2o_pipe_tank.dmi b/icons/obj/atmospherics/n2o_pipe_tank.dmi
deleted file mode 100644
index 40efbd9f15d..00000000000
Binary files a/icons/obj/atmospherics/n2o_pipe_tank.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/omni_devices.dmi b/icons/obj/atmospherics/omni_devices.dmi
deleted file mode 100644
index 44497310026..00000000000
Binary files a/icons/obj/atmospherics/omni_devices.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/orange_pipe_tank.dmi b/icons/obj/atmospherics/orange_pipe_tank.dmi
deleted file mode 100644
index cc9442b8033..00000000000
Binary files a/icons/obj/atmospherics/orange_pipe_tank.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/passive_gate.dmi b/icons/obj/atmospherics/passive_gate.dmi
deleted file mode 100644
index 42e8c9dc74f..00000000000
Binary files a/icons/obj/atmospherics/passive_gate.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/pipe_manifold.dmi b/icons/obj/atmospherics/pipe_manifold.dmi
deleted file mode 100644
index 1e6f5750d1b..00000000000
Binary files a/icons/obj/atmospherics/pipe_manifold.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/pipe_tank.dmi b/icons/obj/atmospherics/pipe_tank.dmi
deleted file mode 100644
index 72310a2657d..00000000000
Binary files a/icons/obj/atmospherics/pipe_tank.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/pipe_vent.dmi b/icons/obj/atmospherics/pipe_vent.dmi
deleted file mode 100644
index e40f5946cf8..00000000000
Binary files a/icons/obj/atmospherics/pipe_vent.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/portables_connector.dmi b/icons/obj/atmospherics/portables_connector.dmi
deleted file mode 100644
index c651b959990..00000000000
Binary files a/icons/obj/atmospherics/portables_connector.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/pump.dmi b/icons/obj/atmospherics/pump.dmi
deleted file mode 100644
index e44a21991ba..00000000000
Binary files a/icons/obj/atmospherics/pump.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/red_orange_pipe_tank.dmi b/icons/obj/atmospherics/red_orange_pipe_tank.dmi
deleted file mode 100644
index 1770c46312a..00000000000
Binary files a/icons/obj/atmospherics/red_orange_pipe_tank.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/red_pipe_tank.dmi b/icons/obj/atmospherics/red_pipe_tank.dmi
deleted file mode 100644
index 3fedc659e03..00000000000
Binary files a/icons/obj/atmospherics/red_pipe_tank.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/relief_valve.dmi b/icons/obj/atmospherics/relief_valve.dmi
deleted file mode 100644
index 485bf792b19..00000000000
Binary files a/icons/obj/atmospherics/relief_valve.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/valve.dmi b/icons/obj/atmospherics/valve.dmi
deleted file mode 100644
index 9ce45199bd7..00000000000
Binary files a/icons/obj/atmospherics/valve.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/vent_pump.dmi b/icons/obj/atmospherics/vent_pump.dmi
deleted file mode 100644
index 6b1f57baa44..00000000000
Binary files a/icons/obj/atmospherics/vent_pump.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/vent_scrubber.dmi b/icons/obj/atmospherics/vent_scrubber.dmi
deleted file mode 100644
index 7133072cd79..00000000000
Binary files a/icons/obj/atmospherics/vent_scrubber.dmi and /dev/null differ
diff --git a/icons/obj/atmospherics/volume_pump.dmi b/icons/obj/atmospherics/volume_pump.dmi
deleted file mode 100644
index e3ff3cf9854..00000000000
Binary files a/icons/obj/atmospherics/volume_pump.dmi and /dev/null differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 1847e985d89..3f66fa90cd6 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi
index a0133e5b383..97710ac4805 100644
Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index c9ebceba369..30f34f01b4f 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index acb6af50d18..62fc0a6120c 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index 7351c8c7483..35ce076db6c 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index a82f3fa10a2..e30f3e44392 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/paper.dmi b/icons/obj/paper.dmi
deleted file mode 100644
index 55781076833..00000000000
Binary files a/icons/obj/paper.dmi and /dev/null differ
diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi
index 60eb897b2b1..51e9b66ee30 100644
Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ
diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi
index 2a47e6817bb..c30eb425dda 100644
Binary files a/icons/obj/recycling.dmi and b/icons/obj/recycling.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 1ef7016307d..c51d2903b14 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 5e88b673231..0f53fc613ba 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -215,7 +215,6 @@
#include "code\controllers\subsystem\assets.dm"
#include "code\controllers\subsystem\atoms.dm"
#include "code\controllers\subsystem\changelog.dm"
-#include "code\controllers\subsystem\chat.dm"
#include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\fires.dm"
#include "code\controllers\subsystem\garbage.dm"
diff --git a/sound/music/thunderdome.ogg b/sound/music/thunderdome.ogg
index 26b18df5e05..82780e416d4 100644
Binary files a/sound/music/thunderdome.ogg and b/sound/music/thunderdome.ogg differ
|